{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "accelerator": "GPU", "colab": { "name": "jw300_bpe_en-yo_masakhane.ipynb", "provenance": [], "collapsed_sections": [ "l929HimrxS0a", "YkuK3B4p2AkN", "epeCydmCyS8X", "AaE77Tcppex9" ], "toc_visible": true, "include_colab_link": true }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.6" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Igc5itf-xMGj" }, "source": [ "# Masakhane - Machine Translation for African Languages (Using JoeyNMT)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "x4fXCKCf36IK" }, "source": [ "## Note before beginning:\n", "### - The idea is that you should be able to make minimal changes to this in order to get SOME result for your own translation corpus. \n", "\n", "### - The tl;dr: Go to the **\"TODO\"** comments which will tell you what to update to get up and running\n", "\n", "### - If you actually want to have a clue what you're doing, read the text and peek at the links\n", "\n", "### - With 100 epochs, it should take around 7 hours to run in Google Colab\n", "\n", "### - Once you've gotten a result for your language, please attach and email your notebook that generated it to masakhanetranslation@gmail.com\n", "\n", "### - If you care enough and get a chance, doing a brief background on your language would be amazing. See examples in [(Martinus, 2019)](https://arxiv.org/abs/1906.05685)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "l929HimrxS0a" }, "source": [ "## Retrieve your data & make a parallel corpus\n", "\n", "If you are wanting to use the JW300 data referenced on the Masakhane website or in our GitHub repo, you can use `opus-tools` to convert the data into a convenient format. `opus_read` from that package provides a convenient tool for reading the native aligned XML files and to convert them to TMX format. The tool can also be used to fetch relevant files from OPUS on the fly and to filter the data as necessary. [Read the documentation](https://pypi.org/project/opustools-pkg/) for more details.\n", "\n", "Once you have your corpus files in TMX format (an xml structure which will include the sentences in your target language and your source language in a single file), we recommend reading them into a pandas dataframe. Thankfully, Jade wrote a silly `tmx2dataframe` package which converts your tmx file to a pandas dataframe. " ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "oGRmDELn7Az0", "outputId": "7f9bd5a1-f017-4b5b-f315-639a1fb54e92", "colab": { "base_uri": "https://localhost:8080/", "height": 129 } }, "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n", "\n", "Enter your authorization code:\n", "··········\n", "Mounted at /content/drive\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "Cn3tgQLzUxwn", "colab": {} }, "source": [ "# TODO: Set your source and target languages. Keep in mind, these traditionally use language codes as found here:\n", "# These will also become the suffix's of all vocab and corpus files used throughout\n", "import os\n", "source_language = \"en\"\n", "target_language = \"yo\" \n", "lc = False # If True, lowercase the data.\n", "seed = 42 # Random seed for shuffling.\n", "tag = \"baseline\" # Give a unique name to your folder - this is to ensure you don't rewrite any models you've already submitted\n", "\n", "os.environ[\"src\"] = source_language # Sets them in bash as well, since we often use bash scripts\n", "os.environ[\"tgt\"] = target_language\n", "os.environ[\"tag\"] = tag\n", "\n", "# This will save it to a folder in our gdrive instead!\n", "!mkdir -p \"/content/drive/My Drive/masakhane/$src-$tgt-$tag\"\n", "os.environ[\"gdrive_path\"] = \"/content/drive/My Drive/masakhane/%s-%s-%s\" % (source_language, target_language, tag)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "kBSgJHEw7Nvx", "outputId": "c197ebd4-9ed6-4cae-c2c0-a051fe2ae942", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "!echo $gdrive_path" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "/content/drive/My Drive/masakhane/en-yo-baseline\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "gA75Fs9ys8Y9", "outputId": "41241592-c4fb-4e0f-d7c5-422c49a989d2", "colab": { "base_uri": "https://localhost:8080/", "height": 129 } }, "source": [ "# Install opus-tools\n", "! pip install opustools-pkg" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Collecting opustools-pkg\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/6c/9f/e829a0cceccc603450cd18e1ff80807b6237a88d9a8df2c0bb320796e900/opustools_pkg-0.0.52-py3-none-any.whl (80kB)\n", "\u001b[K |████████████████████████████████| 81kB 2.4MB/s \n", "\u001b[?25hInstalling collected packages: opustools-pkg\n", "Successfully installed opustools-pkg-0.0.52\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "xq-tDZVks7ZD", "outputId": "e443b65e-995c-4887-dadf-797b3b096fa9", "colab": { "base_uri": "https://localhost:8080/", "height": 239 } }, "source": [ "# Downloading our corpus\n", "! opus_read -d JW300 -s $src -t $tgt -wm moses -w jw300.$src jw300.$tgt -q\n", "\n", "# extract the corpus file\n", "! gunzip JW300_latest_xml_$src-$tgt.xml.gz" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "\n", "Alignment file /proj/nlpl/data/OPUS/JW300/latest/xml/en-yo.xml.gz not found. The following files are available for downloading:\n", "\n", " 4 MB https://object.pouta.csc.fi/OPUS-JW300/v1/xml/en-yo.xml.gz\n", " 263 MB https://object.pouta.csc.fi/OPUS-JW300/v1/xml/en.zip\n", " 58 MB https://object.pouta.csc.fi/OPUS-JW300/v1/xml/yo.zip\n", "\n", " 325 MB Total size\n", "./JW300_latest_xml_en-yo.xml.gz ... 100% of 4 MB\n", "./JW300_latest_xml_en.zip ... 100% of 263 MB\n", "./JW300_latest_xml_yo.zip ... 100% of 58 MB\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "n48GDRnP8y2G", "colab_type": "code", "outputId": "908a7bdf-fb18-47e4-990c-10010818eabb", "colab": { "base_uri": "https://localhost:8080/", "height": 643 } }, "source": [ "# Download the global test set.\n", "! wget https://raw.githubusercontent.com/juliakreutzer/masakhane/master/jw300_utils/test/test.en-any.en\n", " \n", "# And the specific test set for this language pair.\n", "os.environ[\"trg\"] = target_language \n", "os.environ[\"src\"] = source_language \n", "\n", "! wget https://raw.githubusercontent.com/juliakreutzer/masakhane/master/jw300_utils/test/test.en-$trg.en \n", "! mv test.en-$trg.en test.en\n", "! wget https://raw.githubusercontent.com/juliakreutzer/masakhane/master/jw300_utils/test/test.en-$trg.$trg \n", "! mv test.en-$trg.$trg test.$trg" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "--2019-11-22 15:59:22-- https://raw.githubusercontent.com/juliakreutzer/masakhane/master/jw300_utils/test/test.en-any.en\n", "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 277791 (271K) [text/plain]\n", "Saving to: ‘test.en-any.en’\n", "\n", "\rtest.en-any.en 0%[ ] 0 --.-KB/s \rtest.en-any.en 100%[===================>] 271.28K --.-KB/s in 0.05s \n", "\n", "2019-11-22 15:59:22 (5.00 MB/s) - ‘test.en-any.en’ saved [277791/277791]\n", "\n", "--2019-11-22 15:59:27-- https://raw.githubusercontent.com/juliakreutzer/masakhane/master/jw300_utils/test/test.en-yo.en\n", "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 201994 (197K) [text/plain]\n", "Saving to: ‘test.en-yo.en’\n", "\n", "test.en-yo.en 100%[===================>] 197.26K --.-KB/s in 0.04s \n", "\n", "2019-11-22 15:59:27 (5.13 MB/s) - ‘test.en-yo.en’ saved [201994/201994]\n", "\n", "--2019-11-22 15:59:35-- https://raw.githubusercontent.com/juliakreutzer/masakhane/master/jw300_utils/test/test.en-yo.yo\n", "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\n", "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 280073 (274K) [text/plain]\n", "Saving to: ‘test.en-yo.yo’\n", "\n", "test.en-yo.yo 100%[===================>] 273.51K --.-KB/s in 0.05s \n", "\n", "2019-11-22 15:59:35 (5.40 MB/s) - ‘test.en-yo.yo’ saved [280073/280073]\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "NqDG-CI28y2L", "colab_type": "code", "outputId": "6c3ee1ea-c323-4979-dae2-f68d35d8a158", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "# Read the test data to filter from train and dev splits.\n", "# Store english portion in set for quick filtering checks.\n", "en_test_sents = set()\n", "filter_test_sents = \"test.en-yo.en\"\n", "j = 0\n", "with open(filter_test_sents) as f:\n", " for line in f:\n", " en_test_sents.add(line.strip())\n", " j += 1\n", "print('Loaded {} global test sentences to filter from the training/dev data.'.format(j))" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Loaded 3571 global test sentences to filter from the training/dev data.\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "3CNdwLBCfSIl", "outputId": "5acbb803-632c-492e-acb0-cfa91faaeee3", "colab": { "base_uri": "https://localhost:8080/", "height": 162 } }, "source": [ "import pandas as pd\n", "\n", "# TMX file to dataframe\n", "source_file = 'jw300.' + source_language\n", "target_file = 'jw300.' + target_language\n", "\n", "source = []\n", "target = []\n", "skip_lines = [] # Collect the line numbers of the source portion to skip the same lines for the target portion.\n", "with open(source_file) as f:\n", " for i, line in enumerate(f):\n", " # Skip sentences that are contained in the test set.\n", " if line.strip() not in en_test_sents:\n", " source.append(line.strip())\n", " else:\n", " skip_lines.append(i) \n", "with open(target_file) as f:\n", " for j, line in enumerate(f):\n", " # Only add to corpus if corresponding source was not skipped.\n", " if j not in skip_lines:\n", " target.append(line.strip())\n", " \n", "print('Loaded data and skipped {}/{} lines since contained in test set.'.format(len(skip_lines), i))\n", " \n", "df = pd.DataFrame(zip(source, target), columns=['source_sentence', 'target_sentence'])\n", "# if you get TypeError: data argument can't be an iterator is because of your zip version run this below\n", "#df = pd.DataFrame(list(zip(source, target)), columns=['source_sentence', 'target_sentence'])\n", "df.head(3)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Loaded data and skipped 5663/474986 lines since contained in test set.\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
source_sentencetarget_sentence
0Using Ladders — Do You Make These Safety Checks ?Lílo Àkàbà — Ǹjẹ́ O Máa Ń Ṣe Àyẹ̀wò Wọ̀nyí Tó...
1By Awake !Látọwọ́ akọ̀ròyìn Jí !
2correspondent in Irelandní Ireland
\n", "
" ], "text/plain": [ " source_sentence target_sentence\n", "0 Using Ladders — Do You Make These Safety Checks ? Lílo Àkàbà — Ǹjẹ́ O Máa Ń Ṣe Àyẹ̀wò Wọ̀nyí Tó...\n", "1 By Awake ! Látọwọ́ akọ̀ròyìn Jí !\n", "2 correspondent in Ireland ní Ireland" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "YkuK3B4p2AkN" }, "source": [ "## Pre-processing and export\n", "\n", "It is generally a good idea to remove duplicate translations and conflicting translations from the corpus. In practice, these public corpora include some number of these that need to be cleaned.\n", "\n", "In addition we will split our data into dev/test/train and export to the filesystem." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "M_2ouEOH1_1q", "outputId": "ab58d54e-30ce-4856-c2f6-4e7071cb5a3c", "colab": { "base_uri": "https://localhost:8080/", "height": 221 } }, "source": [ "# drop duplicate translations\n", "df_pp = df.drop_duplicates()\n", "\n", "# drop conflicting translations\n", "df_pp.drop_duplicates(subset='source_sentence', inplace=True)\n", "df_pp.drop_duplicates(subset='target_sentence', inplace=True)\n", "\n", "# Shuffle the data to remove bias in dev set selection.\n", "df_pp = df_pp.sample(frac=1, random_state=seed).reset_index(drop=True)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " after removing the cwd from sys.path.\n", "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:5: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " \"\"\"\n" ], "name": "stderr" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "hxxBOCA-xXhy", "outputId": "812dd26c-d971-403f-c0c8-360fb40b272a", "colab": { "base_uri": "https://localhost:8080/", "height": 882 } }, "source": [ "# This section does the split between train/dev for the parallel corpora then saves them as separate files\n", "# We use 1000 dev test and the given test set.\n", "import csv\n", "\n", "# Do the split between dev/train and create parallel corpora\n", "num_dev_patterns = 1000\n", "\n", "# Optional: lower case the corpora - this will make it easier to generalize, but without proper casing.\n", "if lc: # Julia: making lowercasing optional\n", " df_pp[\"source_sentence\"] = df_pp[\"source_sentence\"].str.lower()\n", " df_pp[\"target_sentence\"] = df_pp[\"target_sentence\"].str.lower()\n", "\n", "# Julia: test sets are already generated\n", "dev = df_pp.tail(num_dev_patterns) # Herman: Error in original\n", "stripped = df_pp.drop(df_pp.tail(num_dev_patterns).index)\n", "\n", "with open(\"train.\"+source_language, \"w\") as src_file, open(\"train.\"+target_language, \"w\") as trg_file:\n", " for index, row in stripped.iterrows():\n", " src_file.write(row[\"source_sentence\"]+\"\\n\")\n", " trg_file.write(row[\"target_sentence\"]+\"\\n\")\n", " \n", "with open(\"dev.\"+source_language, \"w\") as src_file, open(\"dev.\"+target_language, \"w\") as trg_file:\n", " for index, row in dev.iterrows():\n", " src_file.write(row[\"source_sentence\"]+\"\\n\")\n", " trg_file.write(row[\"target_sentence\"]+\"\\n\")\n", "\n", "#stripped[[\"source_sentence\"]].to_csv(\"train.\"+source_language, header=False, index=False) # Herman: Added `header=False` everywhere\n", "#stripped[[\"target_sentence\"]].to_csv(\"train.\"+target_language, header=False, index=False) # Julia: Problematic handling of quotation marks.\n", "\n", "#dev[[\"source_sentence\"]].to_csv(\"dev.\"+source_language, header=False, index=False)\n", "#dev[[\"target_sentence\"]].to_csv(\"dev.\"+target_language, header=False, index=False)\n", "\n", "\n", "# Doublecheck the format below. There should be no extra quotation marks or weird characters.\n", "! head train.*\n", "! head dev.*" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "==> train.en <==\n", "TRAIN YOUR CHILDREN : “ I teach my children to check the expiration date of any packaged food items , such as snacks , before they buy them . ” ​ — Ruth , Nigeria\n", "When she replied that she was , he explained that he and his mother were trying to assist his sister with a school report on Canadians .\n", "Through the prophet Zephaniah , Jehovah answers : “ That day is a day of fury , a day of distress and of anguish , a day of storm and of desolation , a day of darkness and of gloominess , a day of clouds and of thick gloom . ”\n", "We do not require that people simply do as we tell them , but we give them convincing reasons to obey Christ’s command .\n", "Still , Jehovah can annihilate any rebel in the lake of fire , denying him any hope of a resurrection .\n", "Lucaris was arrested , and on July 27 , 1638 , he was taken on board a small boat as if for banishment .\n", "Yes , Jehovah remembered their faithful course .\n", "□ To appear tough\n", "During the ensuing confrontation , we Witnesses had to make our position clear to the agitated rebels and also explain our stand to the military guards .\n", "( See opening image . ) ( c ) Why should this Bible account about Samuel be of special interest to elders today ?\n", "\n", "==> train.yo <==\n", "KỌ́ ÀWỌN ỌMỌ RẸ : “ Mo kọ́ àwọn ọmọ mi pé kí wọ́n tó ra oúnjẹ bí ìpápánu , tó wà nínú agolo , ike , bébà , tàbí ọ̀rá , kí wọ́n máa yẹ ara oúnjẹ náà wò kí wọ́n lè mọ déètì tó máa bà jẹ́ . ” — Ruth , Nàìjíríà\n", "Nígbà tó sọ fún ọ̀dọ́kùnrin náà pé Kánádà lòun ti wá , ọ̀dọ́kùnrin náà sọ fún un pé òun àti màmá òun fẹ́ ran àbúrò òun obìnrin kan lọ́wọ́ láti kó ọ̀rọ̀ kan jọ nípa àwọn ará Kánádà , èyí tó fẹ́ mu lọ sílé ìwé .\n", "Jèhófà gbẹnu wòlíì Sefanáyà sọ ìdí rẹ̀ fún wa , ó ní : “ Ọjọ́ yẹn jẹ́ ọjọ́ ìbínú kíkan , ọjọ́ wàhálà àti làásìgbò , ọjọ́ ìjì àti ìsọdahoro , ọjọ́ òkùnkùn àti ìṣúdùdù , ọjọ́ àwọsánmà àti ìṣúdùdù tí ó nípọn . ”\n", "A ò fẹ́ káwọn èèyàn wulẹ̀ ṣe ohun tá a sọ fún wọn nìkan , àmọ́ à tún ń fún wọn ní ẹ̀rí tó dájú nípa ìdí tó fi yẹ kí wọ́n ṣègbọràn sí àṣẹ Kristi .\n", "Síbẹ̀ , Jèhófà lè pa ọlọ̀tẹ̀ èyíkéyìí run nípa sísọ ọ sínú adágún iná , tó túmọ̀ sí pé onítọ̀hún máa kú láìsí ìrètí kankan láti tún jíǹde .\n", "Ní wọ́n bá fi ọlọ́pàá mú Lucaris , nígbà tó sì di July 27 , 1638 , wọ́n fi ọkọ̀ ojú omi wà á lọ bí ẹni pé wọ́n fẹ́ gbé e lọ sí ilẹ̀ mìíràn .\n", "Bẹ́ẹ̀ ni o , Jèhófà kò gbàgbé ìṣòtítọ́ wọn .\n", "□ Kí wọ́n má bàa fojú ọ̀dẹ̀ wò mí\n", "Lákòókò tí àríyànjiyàn náà ń lọ lọ́wọ́ , àwa Ẹlẹ́rìí jẹ́ káwọn ọlọ̀tẹ̀ tínú ń bí yìí mọ̀ pé a ò lọ́wọ́ sí nǹkan tí wọ́n ń ṣe , a sì tún ṣàlàyé irú ẹni tá a jẹ́ fáwọn ológun tó ń ṣọ́ ọgbà ẹ̀wọ̀n náà .\n", "( Wo àwòrán tó wà níbẹ̀rẹ̀ àpilẹ̀kọ yìí . ) ( d ) Kí nìdí tó fi yẹ kí àwọn alàgbà lóde òní fún àkọsílẹ̀ Bíbélì yìí nípa Sámúẹ́lì láfiyèsí àrà ọ̀tọ̀ ?\n", "==> dev.en <==\n", "Now I had to find a legitimate line of work .\n", "Do I value material things more than my relationship with Jehovah and with people ?\n", "He has far more experience and stamina than you do , but he patiently walks near you .\n", "According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "Why is rendering proper honor to elders a concern ?\n", "Jeremiah would rather be alone than be corrupted by bad companions .\n", "In years gone by , we believed that Jehovah became displeased with his people because they did not have a zealous share in the preaching work during World War I .\n", "Rather , they need to use a translation of the Bible in their own language .\n", "On a more personal level , showing honor to those to whom it is due keeps us from becoming self - centered .\n", "Of course , some would argue that the bombing of those cities prevented many deaths that would have occurred had the war continued by conventional means .\n", "\n", "==> dev.yo <==\n", "Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "Kí nìdí tí kò fi yẹ ká máa gbé àwọn alàgbà gẹ̀gẹ̀ ju bó ṣe yẹ lọ ?\n", "Jeremáyà gbà kóun dá wà ju pé káwọn ọ̀rẹ́ burúkú wá kéèràn ran òun .\n", "Láwọn ọdún mélòó kan sẹ́yìn , a gbà pé inú Jèhófà ò dùn sáwọn èèyàn rẹ̀ torí pé wọn ò fìtara wàásù lásìkò Ogun Àgbáyé Kìíní .\n", "Àfi kí wọ́n ka Bíbélì tí wọ́n tú sí èdè wọn .\n", "Tó bá ti mọ́ wa lára láti máa bọlá fáwọn míì , a ò ní máa ro tara wa nìkan .\n", "Lóòótọ́ , àwọn kan lè sọ pé rírun tí wọ́n fi bọ́ǹbù run ìlú méjèèjì mú kí iye èèyàn tí ì bá kú ká ní wọn ò lo àwọn bọ́ǹbù runlérùnnà dín kù .\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "zXbSRu0VwlKq", "colab_type": "code", "outputId": "ae407dd9-d4ef-4275-f129-43d2cefe6ad5", "colab": { "base_uri": "https://localhost:8080/", "height": 127 } }, "source": [ "! cat train.en | wc -l\n", "! cat train.yo | wc -l\n", "! cat dev.en | wc -l\n", "! cat dev.yo | wc -l\n", "! cat test.en | wc -l\n", "! cat test.yo | wc -l" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "417331\n", "417331\n", "1000\n", "1000\n", "2665\n", "2665\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "epeCydmCyS8X" }, "source": [ "\n", "\n", "---\n", "\n", "\n", "## Installation of JoeyNMT\n", "\n", "JoeyNMT is a simple, minimalist NMT package which is useful for learning and teaching. Check out the documentation for JoeyNMT [here](https://joeynmt.readthedocs.io) " ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "iBRMm4kMxZ8L", "outputId": "73a7d978-f924-4c8f-adfe-5d8820d844ab", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 } }, "source": [ "# Install JoeyNMT\n", "! git clone https://github.com/joeynmt/joeynmt.git\n", "! cd joeynmt; pip3 install ." ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Cloning into 'joeynmt'...\n", "remote: Enumerating objects: 2184, done.\u001b[K\n", "remote: Total 2184 (delta 0), reused 0 (delta 0), pack-reused 2184\u001b[K\n", "Receiving objects: 100% (2184/2184), 2.58 MiB | 5.88 MiB/s, done.\n", "Resolving deltas: 100% (1521/1521), done.\n", "Processing /content/joeynmt\n", "Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (0.16.0)\n", "Requirement already satisfied: pillow in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (4.3.0)\n", "Requirement already satisfied: numpy<2.0,>=1.14.5 in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (1.17.4)\n", "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (41.6.0)\n", "Requirement already satisfied: torch>=1.1 in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (1.3.1)\n", "Requirement already satisfied: tensorflow>=1.14 in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (1.15.0)\n", "Requirement already satisfied: torchtext in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (0.3.1)\n", "Collecting sacrebleu>=1.3.6\n", " Downloading https://files.pythonhosted.org/packages/0e/e5/93d252182f7cbd4b59bb3ec5797e2ce33cfd6f5aadaf327db170cf4b7887/sacrebleu-1.4.2-py3-none-any.whl\n", "Collecting subword-nmt\n", " Downloading https://files.pythonhosted.org/packages/26/08/58267cb3ac00f5f895457777ed9e0d106dbb5e6388fa7923d8663b04b849/subword_nmt-0.3.6-py2.py3-none-any.whl\n", "Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (3.1.1)\n", "Requirement already satisfied: seaborn in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (0.9.0)\n", "Collecting pyyaml>=5.1\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/e3/e8/b3212641ee2718d556df0f23f78de8303f068fe29cdaa7a91018849582fe/PyYAML-5.1.2.tar.gz (265kB)\n", "\u001b[K |████████████████████████████████| 266kB 13.8MB/s \n", "\u001b[?25hCollecting pylint\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/e9/59/43fc36c5ee316bb9aeb7cf5329cdbdca89e5749c34d5602753827c0aa2dc/pylint-2.4.4-py3-none-any.whl (302kB)\n", "\u001b[K |████████████████████████████████| 307kB 67.3MB/s \n", "\u001b[?25hRequirement already satisfied: six==1.12 in /usr/local/lib/python3.6/dist-packages (from joeynmt==0.0.1) (1.12.0)\n", "Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from pillow->joeynmt==0.0.1) (0.46)\n", "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (1.15.0)\n", "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (1.1.0)\n", "Requirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (3.10.0)\n", "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (0.33.6)\n", "Requirement already satisfied: tensorboard<1.16.0,>=1.15.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (1.15.0)\n", "Requirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (0.1.8)\n", "Requirement already satisfied: gast==0.2.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (0.2.2)\n", "Requirement already satisfied: keras-applications>=1.0.8 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (1.0.8)\n", "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (3.1.0)\n", "Requirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (0.8.1)\n", "Requirement already satisfied: tensorflow-estimator==1.15.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (1.15.1)\n", "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (1.1.0)\n", "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (0.8.0)\n", "Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow>=1.14->joeynmt==0.0.1) (1.11.2)\n", "Requirement already satisfied: tqdm in /usr/local/lib/python3.6/dist-packages (from torchtext->joeynmt==0.0.1) (4.28.1)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from torchtext->joeynmt==0.0.1) (2.21.0)\n", "Requirement already satisfied: typing in /usr/local/lib/python3.6/dist-packages (from sacrebleu>=1.3.6->joeynmt==0.0.1) (3.6.6)\n", "Collecting portalocker\n", " Downloading https://files.pythonhosted.org/packages/91/db/7bc703c0760df726839e0699b7f78a4d8217fdc9c7fcb1b51b39c5a22a4e/portalocker-1.5.2-py2.py3-none-any.whl\n", "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->joeynmt==0.0.1) (2.6.1)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->joeynmt==0.0.1) (1.1.0)\n", "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->joeynmt==0.0.1) (2.4.5)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->joeynmt==0.0.1) (0.10.0)\n", "Requirement already satisfied: pandas>=0.15.2 in /usr/local/lib/python3.6/dist-packages (from seaborn->joeynmt==0.0.1) (0.25.3)\n", "Requirement already satisfied: scipy>=0.14.0 in /usr/local/lib/python3.6/dist-packages (from seaborn->joeynmt==0.0.1) (1.3.2)\n", "Collecting isort<5,>=4.2.5\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/e5/b0/c121fd1fa3419ea9bfd55c7f9c4fedfec5143208d8c7ad3ce3db6c623c21/isort-4.3.21-py2.py3-none-any.whl (42kB)\n", "\u001b[K |████████████████████████████████| 51kB 9.2MB/s \n", "\u001b[?25hCollecting mccabe<0.7,>=0.6\n", " Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n", "Collecting astroid<2.4,>=2.3.0\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/ad/ae/86734823047962e7b8c8529186a1ac4a7ca19aaf1aa0c7713c022ef593fd/astroid-2.3.3-py3-none-any.whl (205kB)\n", "\u001b[K |████████████████████████████████| 215kB 64.3MB/s \n", "\u001b[?25hRequirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.16.0,>=1.15.0->tensorflow>=1.14->joeynmt==0.0.1) (0.16.0)\n", "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.16.0,>=1.15.0->tensorflow>=1.14->joeynmt==0.0.1) (3.1.1)\n", "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.8->tensorflow>=1.14->joeynmt==0.0.1) (2.8.0)\n", "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->torchtext->joeynmt==0.0.1) (3.0.4)\n", "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->torchtext->joeynmt==0.0.1) (2.8)\n", "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->torchtext->joeynmt==0.0.1) (1.24.3)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->torchtext->joeynmt==0.0.1) (2019.9.11)\n", "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.15.2->seaborn->joeynmt==0.0.1) (2018.9)\n", "Collecting typed-ast<1.5,>=1.4.0; implementation_name == \"cpython\" and python_version < \"3.8\"\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/31/d3/9d1802c161626d0278bafb1ffb32f76b9d01e123881bbf9d91e8ccf28e18/typed_ast-1.4.0-cp36-cp36m-manylinux1_x86_64.whl (736kB)\n", "\u001b[K |████████████████████████████████| 737kB 58.7MB/s \n", "\u001b[?25hCollecting lazy-object-proxy==1.4.*\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/0b/dd/b1e3407e9e6913cf178e506cd0dee818e58694d9a5cd1984e3f6a8b9a10f/lazy_object_proxy-1.4.3-cp36-cp36m-manylinux1_x86_64.whl (55kB)\n", "\u001b[K |████████████████████████████████| 61kB 10.0MB/s \n", "\u001b[?25hBuilding wheels for collected packages: joeynmt, pyyaml\n", " Building wheel for joeynmt (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for joeynmt: filename=joeynmt-0.0.1-cp36-none-any.whl size=71902 sha256=053d12f8a219f539a02d8a790dc6fc8704bf01c6961e8712962b79d41e1bdf71\n", " Stored in directory: /tmp/pip-ephem-wheel-cache-p7f89u8p/wheels/db/01/db/751cc9f3e7f6faec127c43644ba250a3ea7ad200594aeda70a\n", " Building wheel for pyyaml (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for pyyaml: filename=PyYAML-5.1.2-cp36-cp36m-linux_x86_64.whl size=44104 sha256=67d43268890192be5f554cfd57d47db3210a2eaf08d0df735adc4d2e0e4620b2\n", " Stored in directory: /root/.cache/pip/wheels/d9/45/dd/65f0b38450c47cf7e5312883deb97d065e030c5cca0a365030\n", "Successfully built joeynmt pyyaml\n", "Installing collected packages: portalocker, sacrebleu, subword-nmt, pyyaml, isort, mccabe, typed-ast, lazy-object-proxy, astroid, pylint, joeynmt\n", " Found existing installation: PyYAML 3.13\n", " Uninstalling PyYAML-3.13:\n", " Successfully uninstalled PyYAML-3.13\n", "Successfully installed astroid-2.3.3 isort-4.3.21 joeynmt-0.0.1 lazy-object-proxy-1.4.3 mccabe-0.6.1 portalocker-1.5.2 pylint-2.4.4 pyyaml-5.1.2 sacrebleu-1.4.2 subword-nmt-0.3.6 typed-ast-1.4.0\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "AaE77Tcppex9" }, "source": [ "# Preprocessing the Data into Subword BPE Tokens\n", "\n", "- One of the most powerful improvements for agglutinative languages (a feature of most Bantu languages) is using BPE tokenization [ (Sennrich, 2015) ](https://arxiv.org/abs/1508.07909).\n", "\n", "- It was also shown that by optimizing the umber of BPE codes we significantly improve results for low-resourced languages [(Sennrich, 2019)](https://www.aclweb.org/anthology/P19-1021) [(Martinus, 2019)](https://arxiv.org/abs/1906.05685)\n", "\n", "- Below we have the scripts for doing BPE tokenization of our data. We use 4000 tokens as recommended by [(Sennrich, 2019)](https://www.aclweb.org/anthology/P19-1021). You do not need to change anything. Simply running the below will be suitable. " ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "H-TyjtmXB1mL", "outputId": "a69ce9dd-8968-4f4d-de0e-d4c54c30289f", "colab": { "base_uri": "https://localhost:8080/", "height": 439 } }, "source": [ "# One of the huge boosts in NMT performance was to use a different method of tokenizing. \n", "# Usually, NMT would tokenize by words. However, using a method called BPE gave amazing boosts to performance\n", "\n", "# Do subword NMT\n", "from os import path\n", "os.environ[\"src\"] = source_language # Sets them in bash as well, since we often use bash scripts\n", "os.environ[\"tgt\"] = target_language\n", "\n", "# Learn BPEs on the training data.\n", "os.environ[\"data_path\"] = path.join(\"joeynmt\", \"data\", source_language + target_language) # Herman! \n", "! subword-nmt learn-joint-bpe-and-vocab --input train.$src train.$tgt -s 4000 -o bpe.codes.4000 --write-vocabulary vocab.$src vocab.$tgt\n", "\n", "# Apply BPE splits to the development and test data.\n", "! subword-nmt apply-bpe -c bpe.codes.4000 --vocabulary vocab.$src < train.$src > train.bpe.$src\n", "! subword-nmt apply-bpe -c bpe.codes.4000 --vocabulary vocab.$tgt < train.$tgt > train.bpe.$tgt\n", "\n", "! subword-nmt apply-bpe -c bpe.codes.4000 --vocabulary vocab.$src < dev.$src > dev.bpe.$src\n", "! subword-nmt apply-bpe -c bpe.codes.4000 --vocabulary vocab.$tgt < dev.$tgt > dev.bpe.$tgt\n", "! subword-nmt apply-bpe -c bpe.codes.4000 --vocabulary vocab.$src < test.$src > test.bpe.$src\n", "! subword-nmt apply-bpe -c bpe.codes.4000 --vocabulary vocab.$tgt < test.$tgt > test.bpe.$tgt\n", "\n", "# Create directory, move everyone we care about to the correct location\n", "! mkdir -p $data_path\n", "! cp train.* $data_path\n", "! cp test.* $data_path\n", "! cp dev.* $data_path\n", "! cp bpe.codes.4000 $data_path\n", "! ls $data_path\n", "\n", "# Also move everything we care about to a mounted location in google drive (relevant if running in colab) at gdrive_path\n", "! cp train.* \"$gdrive_path\"\n", "! cp test.* \"$gdrive_path\"\n", "! cp dev.* \"$gdrive_path\"\n", "! cp bpe.codes.4000 \"$gdrive_path\"\n", "! ls \"$gdrive_path\"\n", "\n", "# Create that vocab using build_vocab\n", "! sudo chmod 777 joeynmt/scripts/build_vocab.py\n", "! joeynmt/scripts/build_vocab.py joeynmt/data/$src$tgt/train.bpe.$src joeynmt/data/$src$tgt/train.bpe.$tgt --output_path joeynmt/data/$src$tgt/vocab.txt\n", "\n", "# Some output\n", "! echo \"BPE Yoruba Sentences\"\n", "! tail -n 5 test.bpe.$tgt\n", "! echo \"Combined BPE Vocab\"\n", "! tail -n 10 joeynmt/data/$src$tgt/vocab.txt # Herman" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "bpe.codes.4000\tdev.en\t test.bpe.yo test.yo\t train.en\n", "dev.bpe.en\tdev.yo\t test.en\t train.bpe.en train.yo\n", "dev.bpe.yo\ttest.bpe.en test.en-any.en train.bpe.yo\n", "bpe.codes.4000\tdev.en\t test.bpe.yo test.yo\t train.en\n", "dev.bpe.en\tdev.yo\t test.en\t train.bpe.en train.yo\n", "dev.bpe.yo\ttest.bpe.en test.en-any.en train.bpe.yo\n", "BPE Yoruba Sentences\n", "A@@ p@@ at@@ a ńlá ti ìgbàgbọ́ ( Wo ìpín@@ rọ̀ 12 - 14 )\n", "À@@ ṣí@@ borí ìgb@@ àlà ( Wo ìpín@@ rọ̀ 15 - 18 )\n", "Mo ti rí i pé àwọn èèyàn máa ń fẹ́ gb@@ ọ́@@ rọ̀ wa tí wọ́n bá rí i pé a lóye Bíbélì dáadáa , a sì fẹ́ ran àwọn lọ́wọ́ . ”\n", "I@@ dà ẹ̀mí ( Wo ìpín@@ rọ̀ 19 - 20 )\n", "Ó dájú pé lọ́@@ lá ìt@@ ì@@ lẹ́yìn Jèhófà , a máa dúró gb@@ ọ@@ in - in , Èṣù ò sì ní rí wa gbé ṣe .\n", "Combined BPE Vocab\n", "̃\n", "bítì\n", "ʺ\n", "ô\n", "×\n", "Isra@@\n", "œ@@\n", "ş\n", "ỵ\n", "Jóò@@\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "IlMitUHR8Qy-", "outputId": "e1ebeaa3-cb12-4134-fc52-b1c5e26ca7bb", "colab": { "base_uri": "https://localhost:8080/", "height": 72 } }, "source": [ "# Also move everything we care about to a mounted location in google drive (relevant if running in colab) at gdrive_path\n", "! cp train.* \"$gdrive_path\"\n", "! cp test.* \"$gdrive_path\"\n", "! cp dev.* \"$gdrive_path\"\n", "! cp bpe.codes.4000 \"$gdrive_path\"\n", "! ls \"$gdrive_path\"" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "bpe.codes.4000\tdev.en\t test.bpe.yo test.yo\t train.en\n", "dev.bpe.en\tdev.yo\t test.en\t train.bpe.en train.yo\n", "dev.bpe.yo\ttest.bpe.en test.en-any.en train.bpe.yo\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Ixmzi60WsUZ8" }, "source": [ "# Creating the JoeyNMT Config\n", "\n", "JoeyNMT requires a yaml config. We provide a template below. We've also set a number of defaults with it, that you may play with!\n", "\n", "- We used Transformer architecture \n", "- We set our dropout to reasonably high: 0.3 (recommended in [(Sennrich, 2019)](https://www.aclweb.org/anthology/P19-1021))\n", "\n", "Things worth playing with:\n", "- The batch size (also recommended to change for low-resourced languages)\n", "- The number of epochs (we've set it at 30 just so it runs in about an hour, for testing purposes)\n", "- The decoder options (beam_size, alpha)\n", "- Evaluation metrics (BLEU versus Crhf4)" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "PIs1lY2hxMsl", "colab": {} }, "source": [ "# This creates the config file for our JoeyNMT system. It might seem overwhelming so we've provided a couple of useful parameters you'll need to update\n", "# (You can of course play with all the parameters if you'd like!)\n", "\n", "name = '%s%s' % (source_language, target_language)\n", "gdrive_path = os.environ[\"gdrive_path\"]\n", "\n", "# Create the config\n", "config = \"\"\"\n", "name: \"{name}_transformer\"\n", "\n", "data:\n", " src: \"{source_language}\"\n", " trg: \"{target_language}\"\n", " train: \"data/{name}/train.bpe\"\n", " dev: \"data/{name}/dev.bpe\"\n", " test: \"data/{name}/test.bpe\"\n", " level: \"bpe\"\n", " lowercase: False\n", " max_sent_length: 100\n", " src_vocab: \"data/{name}/vocab.txt\"\n", " trg_vocab: \"data/{name}/vocab.txt\"\n", "\n", "testing:\n", " beam_size: 5\n", " alpha: 1.0\n", "\n", "training:\n", " #load_model: \"{gdrive_path}/models/{name}_transformer/1.ckpt\" # if uncommented, load a pre-trained model from this checkpoint\n", " random_seed: 42\n", " optimizer: \"adam\"\n", " normalization: \"tokens\"\n", " adam_betas: [0.9, 0.999] \n", " scheduling: \"plateau\" # TODO: try switching from plateau to Noam scheduling\n", " patience: 5 # For plateau: decrease learning rate by decrease_factor if validation score has not improved for this many validation rounds.\n", " learning_rate_factor: 0.5 # factor for Noam scheduler (used with Transformer)\n", " learning_rate_warmup: 1000 # warmup steps for Noam scheduler (used with Transformer)\n", " decrease_factor: 0.7\n", " loss: \"crossentropy\"\n", " learning_rate: 0.0003\n", " learning_rate_min: 0.00000001\n", " weight_decay: 0.0\n", " label_smoothing: 0.1\n", " batch_size: 4096\n", " batch_type: \"token\"\n", " eval_batch_size: 3600\n", " eval_batch_type: \"token\"\n", " batch_multiplier: 1\n", " early_stopping_metric: \"ppl\"\n", " epochs: 30 # TODO: Decrease for when playing around and checking of working. Around 30 is sufficient to check if its working at all\n", " validation_freq: 1000 # TODO: Set to at least once per epoch.\n", " logging_freq: 100\n", " eval_metric: \"bleu\"\n", " model_dir: \"models/{name}_transformer\"\n", " overwrite: False # TODO: Set to True if you want to overwrite possibly existing models. \n", " shuffle: True\n", " use_cuda: True\n", " max_output_length: 100\n", " print_valid_sents: [0, 1, 2, 3]\n", " keep_last_ckpts: 3\n", "\n", "model:\n", " initializer: \"xavier\"\n", " bias_initializer: \"zeros\"\n", " init_gain: 1.0\n", " embed_initializer: \"xavier\"\n", " embed_init_gain: 1.0\n", " tied_embeddings: True\n", " tied_softmax: True\n", " encoder:\n", " type: \"transformer\"\n", " num_layers: 6\n", " num_heads: 4 # TODO: Increase to 8 for larger data.\n", " embeddings:\n", " embedding_dim: 256 # TODO: Increase to 512 for larger data.\n", " scale: True\n", " dropout: 0.2\n", " # typically ff_size = 4 x hidden_size\n", " hidden_size: 256 # TODO: Increase to 512 for larger data.\n", " ff_size: 1024 # TODO: Increase to 2048 for larger data.\n", " dropout: 0.3\n", " decoder:\n", " type: \"transformer\"\n", " num_layers: 6\n", " num_heads: 4 # TODO: Increase to 8 for larger data.\n", " embeddings:\n", " embedding_dim: 256 # TODO: Increase to 512 for larger data.\n", " scale: True\n", " dropout: 0.2\n", " # typically ff_size = 4 x hidden_size\n", " hidden_size: 256 # TODO: Increase to 512 for larger data.\n", " ff_size: 1024 # TODO: Increase to 2048 for larger data.\n", " dropout: 0.3\n", "\"\"\".format(name=name, gdrive_path=os.environ[\"gdrive_path\"], source_language=source_language, target_language=target_language)\n", "with open(\"joeynmt/configs/transformer_{name}.yaml\".format(name=name),'w') as f:\n", " f.write(config)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "pIifxE3Qzuvs" }, "source": [ "# Train the Model\n", "\n", "This single line of joeynmt runs the training using the config we made above" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "6ZBPFwT94WpI", "outputId": "bf038be0-a915-422e-d692-b321921ce618", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 } }, "source": [ "# Train the model\n", "# You can press Ctrl-C to stop. And then run the next cell to save your checkpoints! \n", "!cd joeynmt; python3 -m joeynmt train configs/transformer_$src$tgt.yaml" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "2019-11-22 16:06:15,821 Hello! This is Joey-NMT.\n", "2019-11-22 16:06:17,248 Total params: 12188416\n", "2019-11-22 16:06:17,250 Trainable parameters: ['decoder.layer_norm.bias', 'decoder.layer_norm.weight', 'decoder.layers.0.dec_layer_norm.bias', 'decoder.layers.0.dec_layer_norm.weight', 'decoder.layers.0.feed_forward.layer_norm.bias', 'decoder.layers.0.feed_forward.layer_norm.weight', 'decoder.layers.0.feed_forward.pwff_layer.0.bias', 'decoder.layers.0.feed_forward.pwff_layer.0.weight', 'decoder.layers.0.feed_forward.pwff_layer.3.bias', 'decoder.layers.0.feed_forward.pwff_layer.3.weight', 'decoder.layers.0.src_trg_att.k_layer.bias', 'decoder.layers.0.src_trg_att.k_layer.weight', 'decoder.layers.0.src_trg_att.output_layer.bias', 'decoder.layers.0.src_trg_att.output_layer.weight', 'decoder.layers.0.src_trg_att.q_layer.bias', 'decoder.layers.0.src_trg_att.q_layer.weight', 'decoder.layers.0.src_trg_att.v_layer.bias', 'decoder.layers.0.src_trg_att.v_layer.weight', 'decoder.layers.0.trg_trg_att.k_layer.bias', 'decoder.layers.0.trg_trg_att.k_layer.weight', 'decoder.layers.0.trg_trg_att.output_layer.bias', 'decoder.layers.0.trg_trg_att.output_layer.weight', 'decoder.layers.0.trg_trg_att.q_layer.bias', 'decoder.layers.0.trg_trg_att.q_layer.weight', 'decoder.layers.0.trg_trg_att.v_layer.bias', 'decoder.layers.0.trg_trg_att.v_layer.weight', 'decoder.layers.0.x_layer_norm.bias', 'decoder.layers.0.x_layer_norm.weight', 'decoder.layers.1.dec_layer_norm.bias', 'decoder.layers.1.dec_layer_norm.weight', 'decoder.layers.1.feed_forward.layer_norm.bias', 'decoder.layers.1.feed_forward.layer_norm.weight', 'decoder.layers.1.feed_forward.pwff_layer.0.bias', 'decoder.layers.1.feed_forward.pwff_layer.0.weight', 'decoder.layers.1.feed_forward.pwff_layer.3.bias', 'decoder.layers.1.feed_forward.pwff_layer.3.weight', 'decoder.layers.1.src_trg_att.k_layer.bias', 'decoder.layers.1.src_trg_att.k_layer.weight', 'decoder.layers.1.src_trg_att.output_layer.bias', 'decoder.layers.1.src_trg_att.output_layer.weight', 'decoder.layers.1.src_trg_att.q_layer.bias', 'decoder.layers.1.src_trg_att.q_layer.weight', 'decoder.layers.1.src_trg_att.v_layer.bias', 'decoder.layers.1.src_trg_att.v_layer.weight', 'decoder.layers.1.trg_trg_att.k_layer.bias', 'decoder.layers.1.trg_trg_att.k_layer.weight', 'decoder.layers.1.trg_trg_att.output_layer.bias', 'decoder.layers.1.trg_trg_att.output_layer.weight', 'decoder.layers.1.trg_trg_att.q_layer.bias', 'decoder.layers.1.trg_trg_att.q_layer.weight', 'decoder.layers.1.trg_trg_att.v_layer.bias', 'decoder.layers.1.trg_trg_att.v_layer.weight', 'decoder.layers.1.x_layer_norm.bias', 'decoder.layers.1.x_layer_norm.weight', 'decoder.layers.2.dec_layer_norm.bias', 'decoder.layers.2.dec_layer_norm.weight', 'decoder.layers.2.feed_forward.layer_norm.bias', 'decoder.layers.2.feed_forward.layer_norm.weight', 'decoder.layers.2.feed_forward.pwff_layer.0.bias', 'decoder.layers.2.feed_forward.pwff_layer.0.weight', 'decoder.layers.2.feed_forward.pwff_layer.3.bias', 'decoder.layers.2.feed_forward.pwff_layer.3.weight', 'decoder.layers.2.src_trg_att.k_layer.bias', 'decoder.layers.2.src_trg_att.k_layer.weight', 'decoder.layers.2.src_trg_att.output_layer.bias', 'decoder.layers.2.src_trg_att.output_layer.weight', 'decoder.layers.2.src_trg_att.q_layer.bias', 'decoder.layers.2.src_trg_att.q_layer.weight', 'decoder.layers.2.src_trg_att.v_layer.bias', 'decoder.layers.2.src_trg_att.v_layer.weight', 'decoder.layers.2.trg_trg_att.k_layer.bias', 'decoder.layers.2.trg_trg_att.k_layer.weight', 'decoder.layers.2.trg_trg_att.output_layer.bias', 'decoder.layers.2.trg_trg_att.output_layer.weight', 'decoder.layers.2.trg_trg_att.q_layer.bias', 'decoder.layers.2.trg_trg_att.q_layer.weight', 'decoder.layers.2.trg_trg_att.v_layer.bias', 'decoder.layers.2.trg_trg_att.v_layer.weight', 'decoder.layers.2.x_layer_norm.bias', 'decoder.layers.2.x_layer_norm.weight', 'decoder.layers.3.dec_layer_norm.bias', 'decoder.layers.3.dec_layer_norm.weight', 'decoder.layers.3.feed_forward.layer_norm.bias', 'decoder.layers.3.feed_forward.layer_norm.weight', 'decoder.layers.3.feed_forward.pwff_layer.0.bias', 'decoder.layers.3.feed_forward.pwff_layer.0.weight', 'decoder.layers.3.feed_forward.pwff_layer.3.bias', 'decoder.layers.3.feed_forward.pwff_layer.3.weight', 'decoder.layers.3.src_trg_att.k_layer.bias', 'decoder.layers.3.src_trg_att.k_layer.weight', 'decoder.layers.3.src_trg_att.output_layer.bias', 'decoder.layers.3.src_trg_att.output_layer.weight', 'decoder.layers.3.src_trg_att.q_layer.bias', 'decoder.layers.3.src_trg_att.q_layer.weight', 'decoder.layers.3.src_trg_att.v_layer.bias', 'decoder.layers.3.src_trg_att.v_layer.weight', 'decoder.layers.3.trg_trg_att.k_layer.bias', 'decoder.layers.3.trg_trg_att.k_layer.weight', 'decoder.layers.3.trg_trg_att.output_layer.bias', 'decoder.layers.3.trg_trg_att.output_layer.weight', 'decoder.layers.3.trg_trg_att.q_layer.bias', 'decoder.layers.3.trg_trg_att.q_layer.weight', 'decoder.layers.3.trg_trg_att.v_layer.bias', 'decoder.layers.3.trg_trg_att.v_layer.weight', 'decoder.layers.3.x_layer_norm.bias', 'decoder.layers.3.x_layer_norm.weight', 'decoder.layers.4.dec_layer_norm.bias', 'decoder.layers.4.dec_layer_norm.weight', 'decoder.layers.4.feed_forward.layer_norm.bias', 'decoder.layers.4.feed_forward.layer_norm.weight', 'decoder.layers.4.feed_forward.pwff_layer.0.bias', 'decoder.layers.4.feed_forward.pwff_layer.0.weight', 'decoder.layers.4.feed_forward.pwff_layer.3.bias', 'decoder.layers.4.feed_forward.pwff_layer.3.weight', 'decoder.layers.4.src_trg_att.k_layer.bias', 'decoder.layers.4.src_trg_att.k_layer.weight', 'decoder.layers.4.src_trg_att.output_layer.bias', 'decoder.layers.4.src_trg_att.output_layer.weight', 'decoder.layers.4.src_trg_att.q_layer.bias', 'decoder.layers.4.src_trg_att.q_layer.weight', 'decoder.layers.4.src_trg_att.v_layer.bias', 'decoder.layers.4.src_trg_att.v_layer.weight', 'decoder.layers.4.trg_trg_att.k_layer.bias', 'decoder.layers.4.trg_trg_att.k_layer.weight', 'decoder.layers.4.trg_trg_att.output_layer.bias', 'decoder.layers.4.trg_trg_att.output_layer.weight', 'decoder.layers.4.trg_trg_att.q_layer.bias', 'decoder.layers.4.trg_trg_att.q_layer.weight', 'decoder.layers.4.trg_trg_att.v_layer.bias', 'decoder.layers.4.trg_trg_att.v_layer.weight', 'decoder.layers.4.x_layer_norm.bias', 'decoder.layers.4.x_layer_norm.weight', 'decoder.layers.5.dec_layer_norm.bias', 'decoder.layers.5.dec_layer_norm.weight', 'decoder.layers.5.feed_forward.layer_norm.bias', 'decoder.layers.5.feed_forward.layer_norm.weight', 'decoder.layers.5.feed_forward.pwff_layer.0.bias', 'decoder.layers.5.feed_forward.pwff_layer.0.weight', 'decoder.layers.5.feed_forward.pwff_layer.3.bias', 'decoder.layers.5.feed_forward.pwff_layer.3.weight', 'decoder.layers.5.src_trg_att.k_layer.bias', 'decoder.layers.5.src_trg_att.k_layer.weight', 'decoder.layers.5.src_trg_att.output_layer.bias', 'decoder.layers.5.src_trg_att.output_layer.weight', 'decoder.layers.5.src_trg_att.q_layer.bias', 'decoder.layers.5.src_trg_att.q_layer.weight', 'decoder.layers.5.src_trg_att.v_layer.bias', 'decoder.layers.5.src_trg_att.v_layer.weight', 'decoder.layers.5.trg_trg_att.k_layer.bias', 'decoder.layers.5.trg_trg_att.k_layer.weight', 'decoder.layers.5.trg_trg_att.output_layer.bias', 'decoder.layers.5.trg_trg_att.output_layer.weight', 'decoder.layers.5.trg_trg_att.q_layer.bias', 'decoder.layers.5.trg_trg_att.q_layer.weight', 'decoder.layers.5.trg_trg_att.v_layer.bias', 'decoder.layers.5.trg_trg_att.v_layer.weight', 'decoder.layers.5.x_layer_norm.bias', 'decoder.layers.5.x_layer_norm.weight', 'encoder.layer_norm.bias', 'encoder.layer_norm.weight', 'encoder.layers.0.feed_forward.layer_norm.bias', 'encoder.layers.0.feed_forward.layer_norm.weight', 'encoder.layers.0.feed_forward.pwff_layer.0.bias', 'encoder.layers.0.feed_forward.pwff_layer.0.weight', 'encoder.layers.0.feed_forward.pwff_layer.3.bias', 'encoder.layers.0.feed_forward.pwff_layer.3.weight', 'encoder.layers.0.layer_norm.bias', 'encoder.layers.0.layer_norm.weight', 'encoder.layers.0.src_src_att.k_layer.bias', 'encoder.layers.0.src_src_att.k_layer.weight', 'encoder.layers.0.src_src_att.output_layer.bias', 'encoder.layers.0.src_src_att.output_layer.weight', 'encoder.layers.0.src_src_att.q_layer.bias', 'encoder.layers.0.src_src_att.q_layer.weight', 'encoder.layers.0.src_src_att.v_layer.bias', 'encoder.layers.0.src_src_att.v_layer.weight', 'encoder.layers.1.feed_forward.layer_norm.bias', 'encoder.layers.1.feed_forward.layer_norm.weight', 'encoder.layers.1.feed_forward.pwff_layer.0.bias', 'encoder.layers.1.feed_forward.pwff_layer.0.weight', 'encoder.layers.1.feed_forward.pwff_layer.3.bias', 'encoder.layers.1.feed_forward.pwff_layer.3.weight', 'encoder.layers.1.layer_norm.bias', 'encoder.layers.1.layer_norm.weight', 'encoder.layers.1.src_src_att.k_layer.bias', 'encoder.layers.1.src_src_att.k_layer.weight', 'encoder.layers.1.src_src_att.output_layer.bias', 'encoder.layers.1.src_src_att.output_layer.weight', 'encoder.layers.1.src_src_att.q_layer.bias', 'encoder.layers.1.src_src_att.q_layer.weight', 'encoder.layers.1.src_src_att.v_layer.bias', 'encoder.layers.1.src_src_att.v_layer.weight', 'encoder.layers.2.feed_forward.layer_norm.bias', 'encoder.layers.2.feed_forward.layer_norm.weight', 'encoder.layers.2.feed_forward.pwff_layer.0.bias', 'encoder.layers.2.feed_forward.pwff_layer.0.weight', 'encoder.layers.2.feed_forward.pwff_layer.3.bias', 'encoder.layers.2.feed_forward.pwff_layer.3.weight', 'encoder.layers.2.layer_norm.bias', 'encoder.layers.2.layer_norm.weight', 'encoder.layers.2.src_src_att.k_layer.bias', 'encoder.layers.2.src_src_att.k_layer.weight', 'encoder.layers.2.src_src_att.output_layer.bias', 'encoder.layers.2.src_src_att.output_layer.weight', 'encoder.layers.2.src_src_att.q_layer.bias', 'encoder.layers.2.src_src_att.q_layer.weight', 'encoder.layers.2.src_src_att.v_layer.bias', 'encoder.layers.2.src_src_att.v_layer.weight', 'encoder.layers.3.feed_forward.layer_norm.bias', 'encoder.layers.3.feed_forward.layer_norm.weight', 'encoder.layers.3.feed_forward.pwff_layer.0.bias', 'encoder.layers.3.feed_forward.pwff_layer.0.weight', 'encoder.layers.3.feed_forward.pwff_layer.3.bias', 'encoder.layers.3.feed_forward.pwff_layer.3.weight', 'encoder.layers.3.layer_norm.bias', 'encoder.layers.3.layer_norm.weight', 'encoder.layers.3.src_src_att.k_layer.bias', 'encoder.layers.3.src_src_att.k_layer.weight', 'encoder.layers.3.src_src_att.output_layer.bias', 'encoder.layers.3.src_src_att.output_layer.weight', 'encoder.layers.3.src_src_att.q_layer.bias', 'encoder.layers.3.src_src_att.q_layer.weight', 'encoder.layers.3.src_src_att.v_layer.bias', 'encoder.layers.3.src_src_att.v_layer.weight', 'encoder.layers.4.feed_forward.layer_norm.bias', 'encoder.layers.4.feed_forward.layer_norm.weight', 'encoder.layers.4.feed_forward.pwff_layer.0.bias', 'encoder.layers.4.feed_forward.pwff_layer.0.weight', 'encoder.layers.4.feed_forward.pwff_layer.3.bias', 'encoder.layers.4.feed_forward.pwff_layer.3.weight', 'encoder.layers.4.layer_norm.bias', 'encoder.layers.4.layer_norm.weight', 'encoder.layers.4.src_src_att.k_layer.bias', 'encoder.layers.4.src_src_att.k_layer.weight', 'encoder.layers.4.src_src_att.output_layer.bias', 'encoder.layers.4.src_src_att.output_layer.weight', 'encoder.layers.4.src_src_att.q_layer.bias', 'encoder.layers.4.src_src_att.q_layer.weight', 'encoder.layers.4.src_src_att.v_layer.bias', 'encoder.layers.4.src_src_att.v_layer.weight', 'encoder.layers.5.feed_forward.layer_norm.bias', 'encoder.layers.5.feed_forward.layer_norm.weight', 'encoder.layers.5.feed_forward.pwff_layer.0.bias', 'encoder.layers.5.feed_forward.pwff_layer.0.weight', 'encoder.layers.5.feed_forward.pwff_layer.3.bias', 'encoder.layers.5.feed_forward.pwff_layer.3.weight', 'encoder.layers.5.layer_norm.bias', 'encoder.layers.5.layer_norm.weight', 'encoder.layers.5.src_src_att.k_layer.bias', 'encoder.layers.5.src_src_att.k_layer.weight', 'encoder.layers.5.src_src_att.output_layer.bias', 'encoder.layers.5.src_src_att.output_layer.weight', 'encoder.layers.5.src_src_att.q_layer.bias', 'encoder.layers.5.src_src_att.q_layer.weight', 'encoder.layers.5.src_src_att.v_layer.bias', 'encoder.layers.5.src_src_att.v_layer.weight', 'src_embed.lut.weight']\n", "2019-11-22 16:06:23,782 cfg.name : enyo_transformer\n", "2019-11-22 16:06:23,782 cfg.data.src : en\n", "2019-11-22 16:06:23,782 cfg.data.trg : yo\n", "2019-11-22 16:06:23,782 cfg.data.train : data/enyo/train.bpe\n", "2019-11-22 16:06:23,782 cfg.data.dev : data/enyo/dev.bpe\n", "2019-11-22 16:06:23,782 cfg.data.test : data/enyo/test.bpe\n", "2019-11-22 16:06:23,782 cfg.data.level : bpe\n", "2019-11-22 16:06:23,782 cfg.data.lowercase : False\n", "2019-11-22 16:06:23,783 cfg.data.max_sent_length : 100\n", "2019-11-22 16:06:23,783 cfg.data.src_vocab : data/enyo/vocab.txt\n", "2019-11-22 16:06:23,783 cfg.data.trg_vocab : data/enyo/vocab.txt\n", "2019-11-22 16:06:23,783 cfg.testing.beam_size : 5\n", "2019-11-22 16:06:23,783 cfg.testing.alpha : 1.0\n", "2019-11-22 16:06:23,783 cfg.training.random_seed : 42\n", "2019-11-22 16:06:23,783 cfg.training.optimizer : adam\n", "2019-11-22 16:06:23,783 cfg.training.normalization : tokens\n", "2019-11-22 16:06:23,784 cfg.training.adam_betas : [0.9, 0.999]\n", "2019-11-22 16:06:23,784 cfg.training.scheduling : plateau\n", "2019-11-22 16:06:23,784 cfg.training.patience : 5\n", "2019-11-22 16:06:23,784 cfg.training.learning_rate_factor : 0.5\n", "2019-11-22 16:06:23,784 cfg.training.learning_rate_warmup : 1000\n", "2019-11-22 16:06:23,784 cfg.training.decrease_factor : 0.7\n", "2019-11-22 16:06:23,784 cfg.training.loss : crossentropy\n", "2019-11-22 16:06:23,784 cfg.training.learning_rate : 0.0003\n", "2019-11-22 16:06:23,784 cfg.training.learning_rate_min : 1e-08\n", "2019-11-22 16:06:23,785 cfg.training.weight_decay : 0.0\n", "2019-11-22 16:06:23,785 cfg.training.label_smoothing : 0.1\n", "2019-11-22 16:06:23,785 cfg.training.batch_size : 4096\n", "2019-11-22 16:06:23,785 cfg.training.batch_type : token\n", "2019-11-22 16:06:23,785 cfg.training.eval_batch_size : 3600\n", "2019-11-22 16:06:23,785 cfg.training.eval_batch_type : token\n", "2019-11-22 16:06:23,785 cfg.training.batch_multiplier : 1\n", "2019-11-22 16:06:23,785 cfg.training.early_stopping_metric : ppl\n", "2019-11-22 16:06:23,785 cfg.training.epochs : 30\n", "2019-11-22 16:06:23,786 cfg.training.validation_freq : 1000\n", "2019-11-22 16:06:23,786 cfg.training.logging_freq : 100\n", "2019-11-22 16:06:23,786 cfg.training.eval_metric : bleu\n", "2019-11-22 16:06:23,786 cfg.training.model_dir : models/enyo_transformer\n", "2019-11-22 16:06:23,786 cfg.training.overwrite : False\n", "2019-11-22 16:06:23,786 cfg.training.shuffle : True\n", "2019-11-22 16:06:23,786 cfg.training.use_cuda : True\n", "2019-11-22 16:06:23,786 cfg.training.max_output_length : 100\n", "2019-11-22 16:06:23,786 cfg.training.print_valid_sents : [0, 1, 2, 3]\n", "2019-11-22 16:06:23,787 cfg.training.keep_last_ckpts : 3\n", "2019-11-22 16:06:23,787 cfg.model.initializer : xavier\n", "2019-11-22 16:06:23,787 cfg.model.bias_initializer : zeros\n", "2019-11-22 16:06:23,787 cfg.model.init_gain : 1.0\n", "2019-11-22 16:06:23,787 cfg.model.embed_initializer : xavier\n", "2019-11-22 16:06:23,787 cfg.model.embed_init_gain : 1.0\n", "2019-11-22 16:06:23,787 cfg.model.tied_embeddings : True\n", "2019-11-22 16:06:23,787 cfg.model.tied_softmax : True\n", "2019-11-22 16:06:23,788 cfg.model.encoder.type : transformer\n", "2019-11-22 16:06:23,788 cfg.model.encoder.num_layers : 6\n", "2019-11-22 16:06:23,788 cfg.model.encoder.num_heads : 4\n", "2019-11-22 16:06:23,788 cfg.model.encoder.embeddings.embedding_dim : 256\n", "2019-11-22 16:06:23,788 cfg.model.encoder.embeddings.scale : True\n", "2019-11-22 16:06:23,788 cfg.model.encoder.embeddings.dropout : 0.2\n", "2019-11-22 16:06:23,788 cfg.model.encoder.hidden_size : 256\n", "2019-11-22 16:06:23,789 cfg.model.encoder.ff_size : 1024\n", "2019-11-22 16:06:23,789 cfg.model.encoder.dropout : 0.3\n", "2019-11-22 16:06:23,789 cfg.model.decoder.type : transformer\n", "2019-11-22 16:06:23,789 cfg.model.decoder.num_layers : 6\n", "2019-11-22 16:06:23,789 cfg.model.decoder.num_heads : 4\n", "2019-11-22 16:06:23,789 cfg.model.decoder.embeddings.embedding_dim : 256\n", "2019-11-22 16:06:23,789 cfg.model.decoder.embeddings.scale : True\n", "2019-11-22 16:06:23,789 cfg.model.decoder.embeddings.dropout : 0.2\n", "2019-11-22 16:06:23,790 cfg.model.decoder.hidden_size : 256\n", "2019-11-22 16:06:23,790 cfg.model.decoder.ff_size : 1024\n", "2019-11-22 16:06:23,790 cfg.model.decoder.dropout : 0.3\n", "2019-11-22 16:06:23,790 Data set sizes: \n", "\ttrain 416012,\n", "\tvalid 1000,\n", "\ttest 2662\n", "2019-11-22 16:06:23,790 First training example:\n", "\t[SRC] T@@ R@@ A@@ IN Y@@ O@@ U@@ R C@@ H@@ I@@ L@@ D@@ R@@ E@@ N : “ I teach my children to ch@@ ec@@ k the exp@@ ir@@ ation d@@ ate of any p@@ ack@@ aged food it@@ em@@ s , such as s@@ n@@ ac@@ ks , before they bu@@ y them . ” ​ — Ru@@ th , N@@ ig@@ er@@ ia\n", "\t[TRG] K@@ Ọ́ ÀWỌN Ọ@@ M@@ Ọ R@@ Ẹ : “ Mo kọ́ àwọn ọmọ mi pé kí wọ́n tó ra oúnjẹ bí ìp@@ á@@ p@@ án@@ u , tó wà nínú ag@@ ol@@ o , i@@ ke , bé@@ bà , tàbí ọ̀r@@ á , kí wọ́n máa yẹ ara oúnjẹ náà wò kí wọ́n lè mọ dé@@ è@@ tì tó máa bà jẹ́ . ” — Ru@@ th , N@@ àì@@ jí@@ ríà\n", "2019-11-22 16:06:23,790 First 10 words (src): (0) (1) (2) (3) (4) , (5) . (6) the (7) tó (8) a (9) to\n", "2019-11-22 16:06:23,791 First 10 words (trg): (0) (1) (2) (3) (4) , (5) . (6) the (7) tó (8) a (9) to\n", "2019-11-22 16:06:23,791 Number of Src words (types): 4407\n", "2019-11-22 16:06:23,791 Number of Trg words (types): 4407\n", "2019-11-22 16:06:23,792 Model(\n", "\tencoder=TransformerEncoder(num_layers=6, num_heads=4),\n", "\tdecoder=TransformerDecoder(num_layers=6, num_heads=4),\n", "\tsrc_embed=Embeddings(embedding_dim=256, vocab_size=4407),\n", "\ttrg_embed=Embeddings(embedding_dim=256, vocab_size=4407))\n", "2019-11-22 16:06:23,797 EPOCH 1\n", "2019-11-22 16:06:39,586 Epoch 1 Step: 100 Batch Loss: 5.483174 Tokens per Sec: 14772, Lr: 0.000300\n", "2019-11-22 16:06:54,463 Epoch 1 Step: 200 Batch Loss: 5.384668 Tokens per Sec: 15635, Lr: 0.000300\n", "2019-11-22 16:07:08,873 Epoch 1 Step: 300 Batch Loss: 5.160937 Tokens per Sec: 15689, Lr: 0.000300\n", "2019-11-22 16:07:23,678 Epoch 1 Step: 400 Batch Loss: 5.024878 Tokens per Sec: 15620, Lr: 0.000300\n", "2019-11-22 16:07:38,706 Epoch 1 Step: 500 Batch Loss: 4.548909 Tokens per Sec: 15370, Lr: 0.000300\n", "2019-11-22 16:07:53,679 Epoch 1 Step: 600 Batch Loss: 4.512361 Tokens per Sec: 15542, Lr: 0.000300\n", "2019-11-22 16:08:08,506 Epoch 1 Step: 700 Batch Loss: 4.394421 Tokens per Sec: 15498, Lr: 0.000300\n", "2019-11-22 16:08:23,355 Epoch 1 Step: 800 Batch Loss: 4.180431 Tokens per Sec: 15322, Lr: 0.000300\n", "2019-11-22 16:08:38,162 Epoch 1 Step: 900 Batch Loss: 4.291477 Tokens per Sec: 15986, Lr: 0.000300\n", "2019-11-22 16:08:53,242 Epoch 1 Step: 1000 Batch Loss: 3.777082 Tokens per Sec: 15503, Lr: 0.000300\n", "2019-11-22 16:09:32,908 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:09:32,909 Saving new checkpoint.\n", "2019-11-22 16:09:33,198 Example #0\n", "2019-11-22 16:09:33,198 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:09:33,198 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:09:33,199 \tHypothesis: Ó jẹ́ pé àwọn èèyàn máa ń ṣe àwọn èèyàn tó ń ṣe .\n", "2019-11-22 16:09:33,199 Example #1\n", "2019-11-22 16:09:33,200 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:09:33,200 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:09:33,200 \tHypothesis: Kí ni àwọn èèyàn ṣe ń ṣe pàtàkì tó ń ṣe ?\n", "2019-11-22 16:09:33,200 Example #2\n", "2019-11-22 16:09:33,200 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:09:33,200 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:09:33,201 \tHypothesis: Àmọ́ , ó sì máa ń ṣe ohun tó ń ṣe bẹ́ẹ̀ , ó sì máa ń ṣe ohun tó ń ṣe bẹ́ẹ̀ .\n", "2019-11-22 16:09:33,201 Example #3\n", "2019-11-22 16:09:33,201 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:09:33,201 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:09:33,201 \tHypothesis: Ó sọ pé : “ Àwọn tó ń ṣe àwọn ọmọ rẹ̀ , ó sì ń sọ pé : “ Àwọn tó ń ṣe àwọn ọmọ rẹ̀ , ó sì ń ṣe ohun tí wọ́n ń ṣe ń ṣe ohun tí wọ́n ń ṣe ń ṣe àwọn ọmọ wọn . ”\n", "2019-11-22 16:09:33,202 Validation result (greedy) at epoch 1, step 1000: bleu: 1.93, loss: 118670.2266, ppl: 53.3363, duration: 39.9599s\n", "2019-11-22 16:09:47,811 Epoch 1 Step: 1100 Batch Loss: 4.032354 Tokens per Sec: 15764, Lr: 0.000300\n", "2019-11-22 16:10:02,103 Epoch 1 Step: 1200 Batch Loss: 4.113523 Tokens per Sec: 16457, Lr: 0.000300\n", "2019-11-22 16:10:16,836 Epoch 1 Step: 1300 Batch Loss: 4.087981 Tokens per Sec: 15800, Lr: 0.000300\n", "2019-11-22 16:10:31,317 Epoch 1 Step: 1400 Batch Loss: 3.724727 Tokens per Sec: 15873, Lr: 0.000300\n", "2019-11-22 16:10:45,960 Epoch 1 Step: 1500 Batch Loss: 3.455151 Tokens per Sec: 15912, Lr: 0.000300\n", "2019-11-22 16:11:00,758 Epoch 1 Step: 1600 Batch Loss: 3.770970 Tokens per Sec: 16011, Lr: 0.000300\n", "2019-11-22 16:11:14,995 Epoch 1 Step: 1700 Batch Loss: 3.994917 Tokens per Sec: 16772, Lr: 0.000300\n", "2019-11-22 16:11:29,438 Epoch 1 Step: 1800 Batch Loss: 3.531697 Tokens per Sec: 16233, Lr: 0.000300\n", "2019-11-22 16:11:43,758 Epoch 1 Step: 1900 Batch Loss: 3.584638 Tokens per Sec: 16075, Lr: 0.000300\n", "2019-11-22 16:11:58,301 Epoch 1 Step: 2000 Batch Loss: 3.613946 Tokens per Sec: 16134, Lr: 0.000300\n", "2019-11-22 16:12:37,285 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:12:37,285 Saving new checkpoint.\n", "2019-11-22 16:12:37,551 Example #0\n", "2019-11-22 16:12:37,551 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:12:37,551 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:12:37,551 \tHypothesis: Mo wá rí i pé mo máa ń ṣe ohun tó ń ṣe .\n", "2019-11-22 16:12:37,551 Example #1\n", "2019-11-22 16:12:37,552 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:12:37,552 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:12:37,552 \tHypothesis: Mo máa ń ronú nípa àwọn òbí mi , kí n sì máa ṣe iṣẹ́ òjíṣẹ́ rẹ ?\n", "2019-11-22 16:12:37,552 Example #2\n", "2019-11-22 16:12:37,552 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:12:37,552 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:12:37,552 \tHypothesis: Ó sì tún jẹ́ pé ó máa ń ṣe ohun tó o bá ń ṣe , ó sì ń ṣe ohun tó o bá fẹ́ kó o ṣe .\n", "2019-11-22 16:12:37,552 Example #3\n", "2019-11-22 16:12:37,552 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:12:37,552 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:12:37,553 \tHypothesis: Àwọn Kristẹni tó wà ní Ìhìn Rere ní Ìhìn Rere , ó sì sọ pé : “ Ìhìn Rere àti àwọn ará Róòmù , ” ìyẹn ni wọ́n ń ṣe ohun tó ń ṣe .\n", "2019-11-22 16:12:37,553 Validation result (greedy) at epoch 1, step 2000: bleu: 3.59, loss: 101726.1016, ppl: 30.2297, duration: 39.2517s\n", "2019-11-22 16:12:52,737 Epoch 1 Step: 2100 Batch Loss: 3.693974 Tokens per Sec: 14964, Lr: 0.000300\n", "2019-11-22 16:13:07,757 Epoch 1 Step: 2200 Batch Loss: 3.633796 Tokens per Sec: 15105, Lr: 0.000300\n", "2019-11-22 16:13:22,625 Epoch 1 Step: 2300 Batch Loss: 3.173765 Tokens per Sec: 15746, Lr: 0.000300\n", "2019-11-22 16:13:37,376 Epoch 1 Step: 2400 Batch Loss: 3.278105 Tokens per Sec: 15702, Lr: 0.000300\n", "2019-11-22 16:13:52,534 Epoch 1 Step: 2500 Batch Loss: 3.264217 Tokens per Sec: 15338, Lr: 0.000300\n", "2019-11-22 16:14:07,479 Epoch 1 Step: 2600 Batch Loss: 3.153985 Tokens per Sec: 15491, Lr: 0.000300\n", "2019-11-22 16:14:22,635 Epoch 1 Step: 2700 Batch Loss: 3.219813 Tokens per Sec: 15252, Lr: 0.000300\n", "2019-11-22 16:14:37,729 Epoch 1 Step: 2800 Batch Loss: 2.927532 Tokens per Sec: 15244, Lr: 0.000300\n", "2019-11-22 16:14:52,573 Epoch 1 Step: 2900 Batch Loss: 3.439932 Tokens per Sec: 15745, Lr: 0.000300\n", "2019-11-22 16:15:07,271 Epoch 1 Step: 3000 Batch Loss: 3.382114 Tokens per Sec: 15867, Lr: 0.000300\n", "2019-11-22 16:15:46,550 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:15:46,550 Saving new checkpoint.\n", "2019-11-22 16:15:46,836 Example #0\n", "2019-11-22 16:15:46,837 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:15:46,837 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:15:46,837 \tHypothesis: Mo ti ń ṣe iṣẹ́ ìwàásù mi .\n", "2019-11-22 16:15:46,837 Example #1\n", "2019-11-22 16:15:46,837 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:15:46,838 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:15:46,838 \tHypothesis: Ṣé mo lè máa ń ṣe àwọn nǹkan tó ń ṣe fún Jèhófà àti pé kí n máa ṣe àwọn èèyàn tó ń ṣe àwọn èèyàn tó ń ṣe ?\n", "2019-11-22 16:15:46,838 Example #2\n", "2019-11-22 16:15:46,838 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:15:46,838 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:15:46,838 \tHypothesis: Ó máa ń ṣe ohun tó o bá ń ṣe , àmọ́ ó máa ń ṣe ẹ́ , àmọ́ ó máa ń ṣe é ní ìsàánu .\n", "2019-11-22 16:15:46,838 Example #3\n", "2019-11-22 16:15:46,839 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:15:46,839 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:15:46,839 \tHypothesis: Gẹ́gẹ́ bí Ìhìn Rere Tuntun àti Ìhìn Rere Tuntun , “ Ìhìn Rere ” àti “ àwọn ará Áfíríkà , ” ó sì máa ń fi hàn pé “ àwọn èèyàn ń ṣọ̀tọ̀ọ́ , ” tàbí “ kò ní ìbámu pẹ̀lú àwọn ohun tí ó bá ń ṣe . ”\n", "2019-11-22 16:15:46,839 Validation result (greedy) at epoch 1, step 3000: bleu: 4.24, loss: 92624.0781, ppl: 22.2828, duration: 39.5677s\n", "2019-11-22 16:16:01,835 Epoch 1 Step: 3100 Batch Loss: 2.990839 Tokens per Sec: 15624, Lr: 0.000300\n", "2019-11-22 16:16:17,102 Epoch 1 Step: 3200 Batch Loss: 3.222040 Tokens per Sec: 15113, Lr: 0.000300\n", "2019-11-22 16:16:31,994 Epoch 1 Step: 3300 Batch Loss: 3.377145 Tokens per Sec: 15505, Lr: 0.000300\n", "2019-11-22 16:16:46,911 Epoch 1 Step: 3400 Batch Loss: 3.000561 Tokens per Sec: 15211, Lr: 0.000300\n", "2019-11-22 16:17:01,651 Epoch 1 Step: 3500 Batch Loss: 2.924978 Tokens per Sec: 15690, Lr: 0.000300\n", "2019-11-22 16:17:16,427 Epoch 1 Step: 3600 Batch Loss: 2.835496 Tokens per Sec: 15325, Lr: 0.000300\n", "2019-11-22 16:17:31,561 Epoch 1 Step: 3700 Batch Loss: 3.211789 Tokens per Sec: 15528, Lr: 0.000300\n", "2019-11-22 16:17:46,325 Epoch 1 Step: 3800 Batch Loss: 2.902820 Tokens per Sec: 15805, Lr: 0.000300\n", "2019-11-22 16:18:00,844 Epoch 1 Step: 3900 Batch Loss: 3.275065 Tokens per Sec: 16014, Lr: 0.000300\n", "2019-11-22 16:18:15,626 Epoch 1 Step: 4000 Batch Loss: 3.044702 Tokens per Sec: 15627, Lr: 0.000300\n", "2019-11-22 16:18:55,680 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:18:55,680 Saving new checkpoint.\n", "2019-11-22 16:18:56,022 Example #0\n", "2019-11-22 16:18:56,023 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:18:56,023 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:18:56,023 \tHypothesis: Mo ti ń ṣe mí bíi pé mo ti ń ṣe iṣẹ́ ìwàásù .\n", "2019-11-22 16:18:56,023 Example #1\n", "2019-11-22 16:18:56,023 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:18:56,023 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:18:56,023 \tHypothesis: Ǹjẹ́ mo lè rí i pé Jèhófà ń ràn mí lọ́wọ́ láti máa bá àwọn èèyàn nìṣó ?\n", "2019-11-22 16:18:56,023 Example #2\n", "2019-11-22 16:18:56,024 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:18:56,024 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:18:56,024 \tHypothesis: Ó sì ń rí i pé ó ń ṣe ohun tó o bá ń ṣe , àmọ́ ó máa ń ṣe ẹ́ bíi pé o ti ń ṣe é .\n", "2019-11-22 16:18:56,024 Example #3\n", "2019-11-22 16:18:56,024 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:18:56,024 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:18:56,024 \tHypothesis: Gẹ́gẹ́ bí Hálíà ṣe ń lo èdè Tuuuuuuuuugi àti Ìhìn Rere , ìyẹn “ àwọn ohun tí ó tọ́ , ” ìyẹn ni pé , “ kò ní jẹ́ kí àwọn nǹkan kan wà nínú ìwà rere , kí ó sì máa ṣe bẹ́ẹ̀ . ”\n", "2019-11-22 16:18:56,024 Validation result (greedy) at epoch 1, step 4000: bleu: 5.88, loss: 85983.9062, ppl: 17.8375, duration: 40.3978s\n", "2019-11-22 16:19:10,793 Epoch 1 Step: 4100 Batch Loss: 3.079458 Tokens per Sec: 15613, Lr: 0.000300\n", "2019-11-22 16:19:26,197 Epoch 1 Step: 4200 Batch Loss: 3.088419 Tokens per Sec: 15213, Lr: 0.000300\n", "2019-11-22 16:19:41,332 Epoch 1 Step: 4300 Batch Loss: 3.002864 Tokens per Sec: 14891, Lr: 0.000300\n", "2019-11-22 16:19:56,359 Epoch 1 Step: 4400 Batch Loss: 2.775147 Tokens per Sec: 15379, Lr: 0.000300\n", "2019-11-22 16:20:10,929 Epoch 1 Step: 4500 Batch Loss: 2.784145 Tokens per Sec: 16198, Lr: 0.000300\n", "2019-11-22 16:20:25,851 Epoch 1 Step: 4600 Batch Loss: 2.822312 Tokens per Sec: 15178, Lr: 0.000300\n", "2019-11-22 16:20:40,508 Epoch 1 Step: 4700 Batch Loss: 3.065781 Tokens per Sec: 15561, Lr: 0.000300\n", "2019-11-22 16:20:55,393 Epoch 1 Step: 4800 Batch Loss: 2.942403 Tokens per Sec: 15098, Lr: 0.000300\n", "2019-11-22 16:21:10,690 Epoch 1 Step: 4900 Batch Loss: 2.595446 Tokens per Sec: 15022, Lr: 0.000300\n", "2019-11-22 16:21:26,031 Epoch 1 Step: 5000 Batch Loss: 3.132049 Tokens per Sec: 15051, Lr: 0.000300\n", "2019-11-22 16:22:06,081 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:22:06,081 Saving new checkpoint.\n", "2019-11-22 16:22:06,401 Example #0\n", "2019-11-22 16:22:06,402 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:22:06,402 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:22:06,402 \tHypothesis: Mo ti rí i pé mo ti ń ṣe iṣẹ́ ìwàásù .\n", "2019-11-22 16:22:06,402 Example #1\n", "2019-11-22 16:22:06,403 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:22:06,403 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:22:06,403 \tHypothesis: Ṣé mo lè ní àjọṣe tó dára pẹ̀lú Jèhófà àti ìdílé mi àti ìdílé mi ?\n", "2019-11-22 16:22:06,403 Example #2\n", "2019-11-22 16:22:06,403 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:22:06,403 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:22:06,403 \tHypothesis: Ó ti rí i pé ó ti ń ṣe ẹ́ bíi pé o ò ní máa ṣe ohun tó o bá ń ṣe , àmọ́ ó máa ń ṣe ẹ́ bíi pé o ò ní máa ṣe é .\n", "2019-11-22 16:22:06,403 Example #3\n", "2019-11-22 16:22:06,404 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:22:06,404 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:22:06,404 \tHypothesis: Gẹ́gẹ́ bí Hánà ṣe sọ , àwọn ìwé Hébérù àti èdè Gíríìkì tó wà nínú ìwé Hébérù , “ Ìhìn Rere ” túmọ̀ sí “ agbára , ” ìyẹn ni pé , “ agbára tí ó dára jù lọ , ” ìyẹn ni pé ó ń ṣọ́ra fún un .\n", "2019-11-22 16:22:06,404 Validation result (greedy) at epoch 1, step 5000: bleu: 7.73, loss: 81594.3516, ppl: 15.3976, duration: 40.3730s\n", "2019-11-22 16:22:21,431 Epoch 1 Step: 5100 Batch Loss: 3.153083 Tokens per Sec: 15329, Lr: 0.000300\n", "2019-11-22 16:22:36,764 Epoch 1 Step: 5200 Batch Loss: 3.196169 Tokens per Sec: 14933, Lr: 0.000300\n", "2019-11-22 16:22:46,591 Epoch 1: total training loss 18681.57\n", "2019-11-22 16:22:46,591 EPOCH 2\n", "2019-11-22 16:22:52,041 Epoch 2 Step: 5300 Batch Loss: 2.934874 Tokens per Sec: 14215, Lr: 0.000300\n", "2019-11-22 16:23:06,880 Epoch 2 Step: 5400 Batch Loss: 2.834458 Tokens per Sec: 15267, Lr: 0.000300\n", "2019-11-22 16:23:21,910 Epoch 2 Step: 5500 Batch Loss: 2.768697 Tokens per Sec: 15485, Lr: 0.000300\n", "2019-11-22 16:23:36,812 Epoch 2 Step: 5600 Batch Loss: 2.983477 Tokens per Sec: 15695, Lr: 0.000300\n", "2019-11-22 16:23:52,114 Epoch 2 Step: 5700 Batch Loss: 2.658939 Tokens per Sec: 15158, Lr: 0.000300\n", "2019-11-22 16:24:06,771 Epoch 2 Step: 5800 Batch Loss: 2.746840 Tokens per Sec: 16137, Lr: 0.000300\n", "2019-11-22 16:24:21,847 Epoch 2 Step: 5900 Batch Loss: 2.744625 Tokens per Sec: 15769, Lr: 0.000300\n", "2019-11-22 16:24:37,082 Epoch 2 Step: 6000 Batch Loss: 2.578235 Tokens per Sec: 15935, Lr: 0.000300\n", "2019-11-22 16:25:16,414 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:25:16,414 Saving new checkpoint.\n", "2019-11-22 16:25:16,762 Example #0\n", "2019-11-22 16:25:16,762 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:25:16,762 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:25:16,762 \tHypothesis: Ní báyìí , mo rí i pé iṣẹ́ ìwàásù ni mo ti ń ṣe .\n", "2019-11-22 16:25:16,762 Example #1\n", "2019-11-22 16:25:16,763 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:25:16,763 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:25:16,763 \tHypothesis: Ǹjẹ́ mo máa ń fi àwọn nǹkan tó wà nínú ìdílé mi ṣe pàtàkì ju àjọṣe mi pẹ̀lú Jèhófà lọ ?\n", "2019-11-22 16:25:16,763 Example #2\n", "2019-11-22 16:25:16,763 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:25:16,763 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:25:16,763 \tHypothesis: Ó ti pẹ́ tó fi máa ń ṣe é , ó sì máa ń mú kó o máa rìn .\n", "2019-11-22 16:25:16,764 Example #3\n", "2019-11-22 16:25:16,764 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:25:16,764 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:25:16,764 \tHypothesis: Gẹ́gẹ́ bí Hánà ṣe sọ , àwọn ìwé Ìhìn Rere àti èdè Gẹ̀ẹ́sì , wọ́n sì sọ pé “ ń fi ìfẹ́kúfẹ̀ẹ́ hàn , ” ìyẹn ni pé , “ kò sí ohun tí ó dára , ” ìyẹn ni pé ó máa ń mú kí wọ́n máa ṣe .\n", "2019-11-22 16:25:16,764 Validation result (greedy) at epoch 2, step 6000: bleu: 9.06, loss: 77926.6172, ppl: 13.6168, duration: 39.6815s\n", "2019-11-22 16:25:32,290 Epoch 2 Step: 6100 Batch Loss: 2.801325 Tokens per Sec: 14981, Lr: 0.000300\n", "2019-11-22 16:25:47,055 Epoch 2 Step: 6200 Batch Loss: 2.705616 Tokens per Sec: 15888, Lr: 0.000300\n", "2019-11-22 16:26:01,786 Epoch 2 Step: 6300 Batch Loss: 2.956112 Tokens per Sec: 15382, Lr: 0.000300\n", "2019-11-22 16:26:16,797 Epoch 2 Step: 6400 Batch Loss: 3.003462 Tokens per Sec: 15514, Lr: 0.000300\n", "2019-11-22 16:26:31,971 Epoch 2 Step: 6500 Batch Loss: 2.930943 Tokens per Sec: 15249, Lr: 0.000300\n", "2019-11-22 16:26:46,694 Epoch 2 Step: 6600 Batch Loss: 2.840460 Tokens per Sec: 15530, Lr: 0.000300\n", "2019-11-22 16:27:01,715 Epoch 2 Step: 6700 Batch Loss: 2.762493 Tokens per Sec: 14666, Lr: 0.000300\n", "2019-11-22 16:27:16,370 Epoch 2 Step: 6800 Batch Loss: 2.802269 Tokens per Sec: 15616, Lr: 0.000300\n", "2019-11-22 16:27:31,199 Epoch 2 Step: 6900 Batch Loss: 2.506195 Tokens per Sec: 15557, Lr: 0.000300\n", "2019-11-22 16:27:46,065 Epoch 2 Step: 7000 Batch Loss: 2.880762 Tokens per Sec: 15607, Lr: 0.000300\n", "2019-11-22 16:28:25,243 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:28:25,243 Saving new checkpoint.\n", "2019-11-22 16:28:25,542 Example #0\n", "2019-11-22 16:28:25,542 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:28:25,542 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:28:25,543 \tHypothesis: Ní báyìí , mo rí i pé iṣẹ́ ìwàásù ni mo ti ń ṣe .\n", "2019-11-22 16:28:25,543 Example #1\n", "2019-11-22 16:28:25,543 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:28:25,543 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:28:25,543 \tHypothesis: Ǹjẹ́ mo máa ń ṣe àwọn nǹkan tó ń mú kí àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn mi ?\n", "2019-11-22 16:28:25,543 Example #2\n", "2019-11-22 16:28:25,544 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:28:25,544 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:28:25,544 \tHypothesis: Ó ti wá rí i pé ó ti ń ṣe ẹ́ bíi pé ó ń mú sùúrù , àmọ́ ó ń mú kó o máa rìn .\n", "2019-11-22 16:28:25,544 Example #3\n", "2019-11-22 16:28:25,544 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:28:25,545 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:28:25,545 \tHypothesis: Gẹ́gẹ́ bí Hesekáyà ṣe sọ , àwọn ìwé Hébérù àti Sípéènì , “ Ìtàn , ” ìyẹn “ ìwà ìbàjẹ́ , ìwà ìbàjẹ́ , ìwà ìbàjẹ́ , ìwà ìbàjẹ́ , ìwà ìbàjẹ́ . ”\n", "2019-11-22 16:28:25,545 Validation result (greedy) at epoch 2, step 7000: bleu: 10.16, loss: 75571.2031, ppl: 12.5834, duration: 39.4800s\n", "2019-11-22 16:28:40,788 Epoch 2 Step: 7100 Batch Loss: 2.737092 Tokens per Sec: 14928, Lr: 0.000300\n", "2019-11-22 16:28:56,251 Epoch 2 Step: 7200 Batch Loss: 2.838581 Tokens per Sec: 14884, Lr: 0.000300\n", "2019-11-22 16:29:11,570 Epoch 2 Step: 7300 Batch Loss: 3.137136 Tokens per Sec: 14830, Lr: 0.000300\n", "2019-11-22 16:29:26,636 Epoch 2 Step: 7400 Batch Loss: 2.596214 Tokens per Sec: 15649, Lr: 0.000300\n", "2019-11-22 16:29:41,398 Epoch 2 Step: 7500 Batch Loss: 2.701864 Tokens per Sec: 15631, Lr: 0.000300\n", "2019-11-22 16:29:56,307 Epoch 2 Step: 7600 Batch Loss: 2.799935 Tokens per Sec: 15746, Lr: 0.000300\n", "2019-11-22 16:30:11,314 Epoch 2 Step: 7700 Batch Loss: 2.699701 Tokens per Sec: 15144, Lr: 0.000300\n", "2019-11-22 16:30:26,358 Epoch 2 Step: 7800 Batch Loss: 2.831128 Tokens per Sec: 15571, Lr: 0.000300\n", "2019-11-22 16:30:41,327 Epoch 2 Step: 7900 Batch Loss: 2.641254 Tokens per Sec: 15196, Lr: 0.000300\n", "2019-11-22 16:30:56,305 Epoch 2 Step: 8000 Batch Loss: 2.233185 Tokens per Sec: 15454, Lr: 0.000300\n", "2019-11-22 16:31:36,342 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:31:36,342 Saving new checkpoint.\n", "2019-11-22 16:31:36,673 Example #0\n", "2019-11-22 16:31:36,673 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:31:36,673 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:31:36,673 \tHypothesis: Ní báyìí , mo ti rí i pé mo ti ń ṣiṣẹ́ .\n", "2019-11-22 16:31:36,674 Example #1\n", "2019-11-22 16:31:36,674 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:31:36,674 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:31:36,676 \tHypothesis: Ṣé mo máa ń rí àwọn nǹkan tó dára jù lọ láàárín àwọn èèyàn àti Jèhófà ?\n", "2019-11-22 16:31:36,676 Example #2\n", "2019-11-22 16:31:36,676 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:31:36,677 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:31:36,677 \tHypothesis: Ó ti pẹ́ jù lọ , ó sì ti ń ṣe ẹ́ bíi pé ó ti ń rìn , àmọ́ ó máa ń rìn .\n", "2019-11-22 16:31:36,677 Example #3\n", "2019-11-22 16:31:36,677 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:31:36,677 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:31:36,677 \tHypothesis: Gẹ́gẹ́ bí Hábákúkù ṣe sọ , àwọn ìwé Hébérù àti Tẹsalóníkà , “ Ìdánilójú , ” ó túmọ̀ sí “ ìparun , ” “ ìwà ìbàjẹ́ , ” ìyẹn ni pé , “ kò sí ohun tí ó burú jù lọ . ”\n", "2019-11-22 16:31:36,678 Validation result (greedy) at epoch 2, step 8000: bleu: 10.70, loss: 72887.0469, ppl: 11.5010, duration: 40.3719s\n", "2019-11-22 16:31:51,817 Epoch 2 Step: 8100 Batch Loss: 2.633041 Tokens per Sec: 15148, Lr: 0.000300\n", "2019-11-22 16:32:06,780 Epoch 2 Step: 8200 Batch Loss: 2.682076 Tokens per Sec: 15543, Lr: 0.000300\n", "2019-11-22 16:32:21,560 Epoch 2 Step: 8300 Batch Loss: 2.455299 Tokens per Sec: 15998, Lr: 0.000300\n", "2019-11-22 16:32:36,260 Epoch 2 Step: 8400 Batch Loss: 2.397240 Tokens per Sec: 15812, Lr: 0.000300\n", "2019-11-22 16:32:51,172 Epoch 2 Step: 8500 Batch Loss: 2.773240 Tokens per Sec: 15416, Lr: 0.000300\n", "2019-11-22 16:33:06,061 Epoch 2 Step: 8600 Batch Loss: 2.662823 Tokens per Sec: 15526, Lr: 0.000300\n", "2019-11-22 16:33:21,005 Epoch 2 Step: 8700 Batch Loss: 2.235956 Tokens per Sec: 15093, Lr: 0.000300\n", "2019-11-22 16:33:36,158 Epoch 2 Step: 8800 Batch Loss: 2.408374 Tokens per Sec: 15288, Lr: 0.000300\n", "2019-11-22 16:33:50,950 Epoch 2 Step: 8900 Batch Loss: 2.536799 Tokens per Sec: 15567, Lr: 0.000300\n", "2019-11-22 16:34:05,899 Epoch 2 Step: 9000 Batch Loss: 2.587103 Tokens per Sec: 15875, Lr: 0.000300\n", "2019-11-22 16:34:45,934 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:34:45,934 Saving new checkpoint.\n", "2019-11-22 16:34:46,236 Example #0\n", "2019-11-22 16:34:46,237 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:34:46,237 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:34:46,237 \tHypothesis: Mo ti rí i pé iṣẹ́ tí mo ní láti ṣe .\n", "2019-11-22 16:34:46,237 Example #1\n", "2019-11-22 16:34:46,237 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:34:46,238 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:34:46,238 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tó dára jù lọ tí mo ní àjọṣe àárín Jèhófà àti àwọn èèyàn ?\n", "2019-11-22 16:34:46,238 Example #2\n", "2019-11-22 16:34:46,238 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:34:46,238 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:34:46,238 \tHypothesis: Ó ti ń ṣe ẹ́ láǹfààní gan - an , àmọ́ ó ti ń bá ọ lọ , àmọ́ ó ń bá ọ lọ .\n", "2019-11-22 16:34:46,239 Example #3\n", "2019-11-22 16:34:46,239 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:34:46,239 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:34:46,239 \tHypothesis: Gẹ́gẹ́ bí Hábákúkù ṣe sọ , àwọn ìwé Hébérù àti Tẹsalóníkà , “ àwọn ohun tí ó tọ́ , ” túmọ̀ sí “ ìwà àìtọ́ , ” ìyẹn ni pé ó máa ń ṣe é .\n", "2019-11-22 16:34:46,239 Validation result (greedy) at epoch 2, step 9000: bleu: 12.06, loss: 70520.1562, ppl: 10.6240, duration: 40.3404s\n", "2019-11-22 16:35:01,130 Epoch 2 Step: 9100 Batch Loss: 2.576260 Tokens per Sec: 15280, Lr: 0.000300\n", "2019-11-22 16:35:15,939 Epoch 2 Step: 9200 Batch Loss: 2.597720 Tokens per Sec: 15546, Lr: 0.000300\n", "2019-11-22 16:35:31,122 Epoch 2 Step: 9300 Batch Loss: 2.783104 Tokens per Sec: 15303, Lr: 0.000300\n", "2019-11-22 16:35:46,330 Epoch 2 Step: 9400 Batch Loss: 2.572397 Tokens per Sec: 15032, Lr: 0.000300\n", "2019-11-22 16:36:01,184 Epoch 2 Step: 9500 Batch Loss: 2.412329 Tokens per Sec: 15437, Lr: 0.000300\n", "2019-11-22 16:36:15,866 Epoch 2 Step: 9600 Batch Loss: 2.795498 Tokens per Sec: 15821, Lr: 0.000300\n", "2019-11-22 16:36:30,737 Epoch 2 Step: 9700 Batch Loss: 2.391747 Tokens per Sec: 15594, Lr: 0.000300\n", "2019-11-22 16:36:45,530 Epoch 2 Step: 9800 Batch Loss: 2.561591 Tokens per Sec: 15619, Lr: 0.000300\n", "2019-11-22 16:36:59,738 Epoch 2 Step: 9900 Batch Loss: 2.615490 Tokens per Sec: 15757, Lr: 0.000300\n", "2019-11-22 16:37:14,142 Epoch 2 Step: 10000 Batch Loss: 2.293008 Tokens per Sec: 15880, Lr: 0.000300\n", "2019-11-22 16:37:52,644 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:37:52,644 Saving new checkpoint.\n", "2019-11-22 16:37:52,976 Example #0\n", "2019-11-22 16:37:52,976 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:37:52,976 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:37:52,977 \tHypothesis: Mo ti wá rí i pé mo ti ń ṣiṣẹ́ .\n", "2019-11-22 16:37:52,977 Example #1\n", "2019-11-22 16:37:52,977 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:37:52,977 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:37:52,977 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tó dára ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 16:37:52,977 Example #2\n", "2019-11-22 16:37:52,977 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:37:52,977 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:37:52,977 \tHypothesis: Ó ti rí i pé ó ti ń ṣe ẹ́ bíi pé o ti ń rìn , àmọ́ ó ń rìn ní àkókò tó o ti ń rìn .\n", "2019-11-22 16:37:52,977 Example #3\n", "2019-11-22 16:37:52,978 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:37:52,978 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:37:52,978 \tHypothesis: Gẹ́gẹ́ bí Hardddon ṣe sọ , àwọn ìwé Hébérù àti Chile , tí wọ́n ń sọ èdè Hébérù , “ ìparun , ìwà àìmọ́ , àti ìbàjẹ́ , nítorí pé ó ń mú kí ìwà àìmọ́ , . ”\n", "2019-11-22 16:37:52,978 Validation result (greedy) at epoch 2, step 10000: bleu: 13.46, loss: 68731.2344, ppl: 10.0059, duration: 38.8356s\n", "2019-11-22 16:38:07,648 Epoch 2 Step: 10100 Batch Loss: 2.438921 Tokens per Sec: 15915, Lr: 0.000300\n", "2019-11-22 16:38:21,945 Epoch 2 Step: 10200 Batch Loss: 2.423634 Tokens per Sec: 16119, Lr: 0.000300\n", "2019-11-22 16:38:36,502 Epoch 2 Step: 10300 Batch Loss: 2.092521 Tokens per Sec: 16121, Lr: 0.000300\n", "2019-11-22 16:38:50,804 Epoch 2 Step: 10400 Batch Loss: 2.535171 Tokens per Sec: 16153, Lr: 0.000300\n", "2019-11-22 16:39:05,155 Epoch 2 Step: 10500 Batch Loss: 2.533068 Tokens per Sec: 16044, Lr: 0.000300\n", "2019-11-22 16:39:11,020 Epoch 2: total training loss 13829.00\n", "2019-11-22 16:39:11,020 EPOCH 3\n", "2019-11-22 16:39:20,268 Epoch 3 Step: 10600 Batch Loss: 2.487754 Tokens per Sec: 15235, Lr: 0.000300\n", "2019-11-22 16:39:34,922 Epoch 3 Step: 10700 Batch Loss: 2.393024 Tokens per Sec: 15663, Lr: 0.000300\n", "2019-11-22 16:39:49,071 Epoch 3 Step: 10800 Batch Loss: 2.624763 Tokens per Sec: 16445, Lr: 0.000300\n", "2019-11-22 16:40:03,280 Epoch 3 Step: 10900 Batch Loss: 2.186471 Tokens per Sec: 16478, Lr: 0.000300\n", "2019-11-22 16:40:17,921 Epoch 3 Step: 11000 Batch Loss: 2.607311 Tokens per Sec: 15514, Lr: 0.000300\n", "2019-11-22 16:40:55,810 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:40:55,810 Saving new checkpoint.\n", "2019-11-22 16:40:56,123 Example #0\n", "2019-11-22 16:40:56,123 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:40:56,123 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:40:56,124 \tHypothesis: Mo ti wá rí i pé ó yẹ kí n máa ṣe iṣẹ́ náà .\n", "2019-11-22 16:40:56,124 Example #1\n", "2019-11-22 16:40:56,124 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:40:56,124 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:40:56,124 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tó pọ̀ jù lọ tí mo ní pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:40:56,124 Example #2\n", "2019-11-22 16:40:56,125 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:40:56,125 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:40:56,125 \tHypothesis: Ó ti wá rí i pé ó ti ń ṣe ọ́ láǹfààní ju bó ṣe ń rìn lọ , àmọ́ ó ń bá ọ lọ .\n", "2019-11-22 16:40:56,125 Example #3\n", "2019-11-22 16:40:56,126 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:40:56,126 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:40:56,126 \tHypothesis: Gẹ́gẹ́ bí Harkklyny ṣe sọ , Chale àti Chales Cales , sọ pé , “ ó túmọ̀ sí pé ìwà ọ̀daràn , ó sì ń mú kí ìwà ibi wà láàyè títí láé . ”\n", "2019-11-22 16:40:56,126 Validation result (greedy) at epoch 3, step 11000: bleu: 14.99, loss: 66989.6719, ppl: 9.4386, duration: 38.2042s\n", "2019-11-22 16:41:10,730 Epoch 3 Step: 11100 Batch Loss: 2.630874 Tokens per Sec: 15690, Lr: 0.000300\n", "2019-11-22 16:41:24,855 Epoch 3 Step: 11200 Batch Loss: 2.338481 Tokens per Sec: 16711, Lr: 0.000300\n", "2019-11-22 16:41:39,157 Epoch 3 Step: 11300 Batch Loss: 2.478298 Tokens per Sec: 16304, Lr: 0.000300\n", "2019-11-22 16:41:53,738 Epoch 3 Step: 11400 Batch Loss: 2.016553 Tokens per Sec: 15969, Lr: 0.000300\n", "2019-11-22 16:42:08,076 Epoch 3 Step: 11500 Batch Loss: 2.456271 Tokens per Sec: 15970, Lr: 0.000300\n", "2019-11-22 16:42:22,599 Epoch 3 Step: 11600 Batch Loss: 2.414648 Tokens per Sec: 16160, Lr: 0.000300\n", "2019-11-22 16:42:36,806 Epoch 3 Step: 11700 Batch Loss: 2.464240 Tokens per Sec: 16026, Lr: 0.000300\n", "2019-11-22 16:42:51,045 Epoch 3 Step: 11800 Batch Loss: 2.443316 Tokens per Sec: 16563, Lr: 0.000300\n", "2019-11-22 16:43:05,410 Epoch 3 Step: 11900 Batch Loss: 2.614837 Tokens per Sec: 16213, Lr: 0.000300\n", "2019-11-22 16:43:19,587 Epoch 3 Step: 12000 Batch Loss: 2.460474 Tokens per Sec: 16350, Lr: 0.000300\n", "2019-11-22 16:43:57,508 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:43:57,508 Saving new checkpoint.\n", "2019-11-22 16:43:57,832 Example #0\n", "2019-11-22 16:43:57,832 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:43:57,832 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:43:57,832 \tHypothesis: Ní báyìí , mo ti rí iṣẹ́ tí mo ń ṣe .\n", "2019-11-22 16:43:57,832 Example #1\n", "2019-11-22 16:43:57,833 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:43:57,833 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:43:57,833 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tó dára ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 16:43:57,833 Example #2\n", "2019-11-22 16:43:57,833 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:43:57,833 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:43:57,833 \tHypothesis: Ó ti pẹ́ tó báyìí , ó sì ti ń ṣe ẹ́ bíi pé ó ń rìn ní àkókò tó o ti ń rìn .\n", "2019-11-22 16:43:57,834 Example #3\n", "2019-11-22 16:43:57,834 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:43:57,834 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:43:57,834 \tHypothesis: Gẹ́gẹ́ bí Harkyny ṣe sọ , àwọn tó kọ Bíbélì àti Chale Dictionary , sọ pé “ ìwà àìmọ́ , ìwà àìmọ́ , ìwà ìbàjẹ́ , ìwà àìmọ́ , àti ìwà àìmọ́ . ”\n", "2019-11-22 16:43:57,834 Validation result (greedy) at epoch 3, step 12000: bleu: 15.42, loss: 65198.9609, ppl: 8.8889, duration: 38.2467s\n", "2019-11-22 16:44:11,975 Epoch 3 Step: 12100 Batch Loss: 2.391483 Tokens per Sec: 16465, Lr: 0.000300\n", "2019-11-22 16:44:26,198 Epoch 3 Step: 12200 Batch Loss: 2.420940 Tokens per Sec: 16318, Lr: 0.000300\n", "2019-11-22 16:44:40,801 Epoch 3 Step: 12300 Batch Loss: 2.248370 Tokens per Sec: 15628, Lr: 0.000300\n", "2019-11-22 16:44:54,798 Epoch 3 Step: 12400 Batch Loss: 2.395171 Tokens per Sec: 16411, Lr: 0.000300\n", "2019-11-22 16:45:08,881 Epoch 3 Step: 12500 Batch Loss: 2.297088 Tokens per Sec: 16860, Lr: 0.000300\n", "2019-11-22 16:45:22,975 Epoch 3 Step: 12600 Batch Loss: 2.560110 Tokens per Sec: 16566, Lr: 0.000300\n", "2019-11-22 16:45:37,356 Epoch 3 Step: 12700 Batch Loss: 2.408369 Tokens per Sec: 15762, Lr: 0.000300\n", "2019-11-22 16:45:51,755 Epoch 3 Step: 12800 Batch Loss: 2.145536 Tokens per Sec: 15732, Lr: 0.000300\n", "2019-11-22 16:46:06,256 Epoch 3 Step: 12900 Batch Loss: 2.323804 Tokens per Sec: 15759, Lr: 0.000300\n", "2019-11-22 16:46:20,563 Epoch 3 Step: 13000 Batch Loss: 2.290988 Tokens per Sec: 16423, Lr: 0.000300\n", "2019-11-22 16:46:58,025 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:46:58,025 Saving new checkpoint.\n", "2019-11-22 16:46:58,317 Example #0\n", "2019-11-22 16:46:58,318 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:46:58,318 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:46:58,318 \tHypothesis: Mo ti wá rí i pé mo ti wá ń ṣe iṣẹ́ tí mo bá ń ṣe .\n", "2019-11-22 16:46:58,318 Example #1\n", "2019-11-22 16:46:58,318 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:46:58,318 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:46:58,319 \tHypothesis: Ṣé mo máa ń fi àwọn nǹkan tara mi ṣe ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 16:46:58,319 Example #2\n", "2019-11-22 16:46:58,319 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:46:58,319 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:46:58,319 \tHypothesis: Ó ti wá rí ọ̀pọ̀ ìrírí tó o ní , àmọ́ ó ń fi sùúrù rìn .\n", "2019-11-22 16:46:58,319 Example #3\n", "2019-11-22 16:46:58,319 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:46:58,320 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:46:58,320 \tHypothesis: Gẹ́gẹ́ bí Harkavyn ṣe sọ , àwọn Akẹ́kọ̀ọ́ Hébérù àti Chale Dictionary , sọ pé “ àwọn ìwà ìbàjẹ́ , ìwà ìbàjẹ́ , ìwà àìtọ́ , ìwà ìbàjẹ́ , àìní , àti ìbàjẹ́ . ”\n", "2019-11-22 16:46:58,320 Validation result (greedy) at epoch 3, step 13000: bleu: 15.99, loss: 64029.3438, ppl: 8.5473, duration: 37.7564s\n", "2019-11-22 16:47:12,745 Epoch 3 Step: 13100 Batch Loss: 2.058292 Tokens per Sec: 16105, Lr: 0.000300\n", "2019-11-22 16:47:27,367 Epoch 3 Step: 13200 Batch Loss: 2.261260 Tokens per Sec: 15739, Lr: 0.000300\n", "2019-11-22 16:47:41,446 Epoch 3 Step: 13300 Batch Loss: 2.003877 Tokens per Sec: 16529, Lr: 0.000300\n", "2019-11-22 16:47:55,839 Epoch 3 Step: 13400 Batch Loss: 2.189800 Tokens per Sec: 16297, Lr: 0.000300\n", "2019-11-22 16:48:09,983 Epoch 3 Step: 13500 Batch Loss: 2.304092 Tokens per Sec: 16350, Lr: 0.000300\n", "2019-11-22 16:48:24,258 Epoch 3 Step: 13600 Batch Loss: 2.377033 Tokens per Sec: 16285, Lr: 0.000300\n", "2019-11-22 16:48:38,401 Epoch 3 Step: 13700 Batch Loss: 2.446944 Tokens per Sec: 16275, Lr: 0.000300\n", "2019-11-22 16:48:52,867 Epoch 3 Step: 13800 Batch Loss: 2.197855 Tokens per Sec: 16223, Lr: 0.000300\n", "2019-11-22 16:49:06,980 Epoch 3 Step: 13900 Batch Loss: 2.252550 Tokens per Sec: 16395, Lr: 0.000300\n", "2019-11-22 16:49:20,918 Epoch 3 Step: 14000 Batch Loss: 2.319916 Tokens per Sec: 16558, Lr: 0.000300\n", "2019-11-22 16:49:59,042 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:49:59,042 Saving new checkpoint.\n", "2019-11-22 16:49:59,316 Example #0\n", "2019-11-22 16:49:59,316 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:49:59,316 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:49:59,316 \tHypothesis: Ní báyìí , mo ti rí i pé mo ti ń lọ sí ilé iṣẹ́ .\n", "2019-11-22 16:49:59,316 Example #1\n", "2019-11-22 16:49:59,316 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:49:59,317 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:49:59,317 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara mi ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:49:59,317 Example #2\n", "2019-11-22 16:49:59,317 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:49:59,317 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:49:59,317 \tHypothesis: Ó ti rí i pé ó ti rí nǹkan kan tó o fẹ́ ṣe , àmọ́ ó ń bá a lọ ní sùúrù .\n", "2019-11-22 16:49:59,317 Example #3\n", "2019-11-22 16:49:59,318 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:49:59,318 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:49:59,318 \tHypothesis: Gẹ́gẹ́ bí Harkyny ṣe sọ , àwọn Akẹ́kọ̀ọ́ Hébérù àti Chale Dictionary , sọ pé “ ìparun , ìwà àìtọ́ , ìwà ọ̀daràn , àti ìwà ọ̀daràn , ” nítorí pé ó jẹ́ pé kò sí ohun tó ń ṣẹlẹ̀ .\n", "2019-11-22 16:49:59,318 Validation result (greedy) at epoch 3, step 14000: bleu: 16.75, loss: 62586.9922, ppl: 8.1440, duration: 38.3999s\n", "2019-11-22 16:50:14,047 Epoch 3 Step: 14100 Batch Loss: 1.845708 Tokens per Sec: 15507, Lr: 0.000300\n", "2019-11-22 16:50:28,847 Epoch 3 Step: 14200 Batch Loss: 2.173684 Tokens per Sec: 16007, Lr: 0.000300\n", "2019-11-22 16:50:43,457 Epoch 3 Step: 14300 Batch Loss: 2.262026 Tokens per Sec: 15764, Lr: 0.000300\n", "2019-11-22 16:50:58,538 Epoch 3 Step: 14400 Batch Loss: 2.363027 Tokens per Sec: 15197, Lr: 0.000300\n", "2019-11-22 16:51:13,060 Epoch 3 Step: 14500 Batch Loss: 2.238927 Tokens per Sec: 15793, Lr: 0.000300\n", "2019-11-22 16:51:27,823 Epoch 3 Step: 14600 Batch Loss: 2.282763 Tokens per Sec: 15888, Lr: 0.000300\n", "2019-11-22 16:51:42,273 Epoch 3 Step: 14700 Batch Loss: 2.043972 Tokens per Sec: 15806, Lr: 0.000300\n", "2019-11-22 16:51:57,350 Epoch 3 Step: 14800 Batch Loss: 2.541391 Tokens per Sec: 15014, Lr: 0.000300\n", "2019-11-22 16:52:11,894 Epoch 3 Step: 14900 Batch Loss: 2.387366 Tokens per Sec: 15769, Lr: 0.000300\n", "2019-11-22 16:52:26,707 Epoch 3 Step: 15000 Batch Loss: 2.312251 Tokens per Sec: 15424, Lr: 0.000300\n", "2019-11-22 16:53:05,588 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:53:05,588 Saving new checkpoint.\n", "2019-11-22 16:53:05,887 Example #0\n", "2019-11-22 16:53:05,887 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:53:05,887 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:53:05,887 \tHypothesis: Ní báyìí , mo ti rí iṣẹ́ tó ń bójú tó iṣẹ́ .\n", "2019-11-22 16:53:05,888 Example #1\n", "2019-11-22 16:53:05,888 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:53:05,888 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:53:05,888 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara tí mo ní pẹ̀lú Jèhófà àtàwọn èèyàn mi ?\n", "2019-11-22 16:53:05,888 Example #2\n", "2019-11-22 16:53:05,889 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:53:05,889 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:53:05,889 \tHypothesis: Ó ti rí i pé ó ti rí i pé o ò ní pẹ́ tó o fi ń ṣe nǹkan , àmọ́ ó máa ń sùúrù kó o tó lọ .\n", "2019-11-22 16:53:05,889 Example #3\n", "2019-11-22 16:53:05,890 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:53:05,890 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:53:05,890 \tHypothesis: Gẹ́gẹ́ bí Harkavyn ṣe sọ , àwọn Akẹ́kọ̀ọ́ Hébérù àti Chale Dictionary Dictionary , sọ pé , “ Ìwà àìlófin , ìwà ìbàjẹ́ , àti ìwà àìmọ́ , títí láé . ”\n", "2019-11-22 16:53:05,890 Validation result (greedy) at epoch 3, step 15000: bleu: 17.37, loss: 61204.4492, ppl: 7.7753, duration: 39.1829s\n", "2019-11-22 16:53:20,888 Epoch 3 Step: 15100 Batch Loss: 2.405198 Tokens per Sec: 15531, Lr: 0.000300\n", "2019-11-22 16:53:35,941 Epoch 3 Step: 15200 Batch Loss: 2.310397 Tokens per Sec: 15582, Lr: 0.000300\n", "2019-11-22 16:53:51,092 Epoch 3 Step: 15300 Batch Loss: 2.357188 Tokens per Sec: 15323, Lr: 0.000300\n", "2019-11-22 16:54:05,780 Epoch 3 Step: 15400 Batch Loss: 2.033425 Tokens per Sec: 15928, Lr: 0.000300\n", "2019-11-22 16:54:20,527 Epoch 3 Step: 15500 Batch Loss: 2.353705 Tokens per Sec: 15222, Lr: 0.000300\n", "2019-11-22 16:54:35,023 Epoch 3 Step: 15600 Batch Loss: 2.133700 Tokens per Sec: 16204, Lr: 0.000300\n", "2019-11-22 16:54:49,157 Epoch 3 Step: 15700 Batch Loss: 2.527703 Tokens per Sec: 16335, Lr: 0.000300\n", "2019-11-22 16:55:03,214 Epoch 3 Step: 15800 Batch Loss: 2.204245 Tokens per Sec: 16141, Lr: 0.000300\n", "2019-11-22 16:55:04,078 Epoch 3: total training loss 12204.58\n", "2019-11-22 16:55:04,078 EPOCH 4\n", "2019-11-22 16:55:17,986 Epoch 4 Step: 15900 Batch Loss: 1.976784 Tokens per Sec: 15653, Lr: 0.000300\n", "2019-11-22 16:55:32,523 Epoch 4 Step: 16000 Batch Loss: 2.094082 Tokens per Sec: 16166, Lr: 0.000300\n", "2019-11-22 16:56:10,301 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:56:10,302 Saving new checkpoint.\n", "2019-11-22 16:56:10,602 Example #0\n", "2019-11-22 16:56:10,602 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:56:10,602 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:56:10,602 \tHypothesis: Ní báyìí , mo ti wá àwọn iṣẹ́ tí mò ń ṣe .\n", "2019-11-22 16:56:10,602 Example #1\n", "2019-11-22 16:56:10,603 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:56:10,603 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:56:10,603 \tHypothesis: Ǹjẹ́ mo máa ń mọyì ohun tí mo ní ju àjọṣe mi pẹ̀lú Jèhófà lọ ?\n", "2019-11-22 16:56:10,603 Example #2\n", "2019-11-22 16:56:10,603 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:56:10,603 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:56:10,604 \tHypothesis: Ó ti rí ọ̀pọ̀ ìrírí tó o ní , àmọ́ ó máa ń sùúrù kó o tó lọ sítòsí rẹ .\n", "2019-11-22 16:56:10,604 Example #3\n", "2019-11-22 16:56:10,604 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:56:10,604 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:56:10,604 \tHypothesis: Gẹ́gẹ́ bí Harkavyn ṣe sọ , àwọn Akẹ́kọ̀ọ́ Hébérù àti Chaldee Dictionary , ní “ ìfọwọ́sowọ́pọ̀ , ìwà ìbàjẹ́ , ìwà àìmọ́ , àti ìwà àìmọ́ , nítorí pé ó jẹ́ ohun tó ń ṣẹlẹ̀ . ”\n", "2019-11-22 16:56:10,604 Validation result (greedy) at epoch 4, step 16000: bleu: 18.15, loss: 60541.4727, ppl: 7.6045, duration: 38.0813s\n", "2019-11-22 16:56:25,264 Epoch 4 Step: 16100 Batch Loss: 2.151122 Tokens per Sec: 15643, Lr: 0.000300\n", "2019-11-22 16:56:39,597 Epoch 4 Step: 16200 Batch Loss: 2.266272 Tokens per Sec: 16119, Lr: 0.000300\n", "2019-11-22 16:56:54,079 Epoch 4 Step: 16300 Batch Loss: 2.280350 Tokens per Sec: 15473, Lr: 0.000300\n", "2019-11-22 16:57:08,670 Epoch 4 Step: 16400 Batch Loss: 2.070152 Tokens per Sec: 15853, Lr: 0.000300\n", "2019-11-22 16:57:23,250 Epoch 4 Step: 16500 Batch Loss: 2.088913 Tokens per Sec: 16015, Lr: 0.000300\n", "2019-11-22 16:57:37,831 Epoch 4 Step: 16600 Batch Loss: 2.224169 Tokens per Sec: 15903, Lr: 0.000300\n", "2019-11-22 16:57:52,109 Epoch 4 Step: 16700 Batch Loss: 2.067971 Tokens per Sec: 16616, Lr: 0.000300\n", "2019-11-22 16:58:06,770 Epoch 4 Step: 16800 Batch Loss: 2.314521 Tokens per Sec: 16130, Lr: 0.000300\n", "2019-11-22 16:58:21,109 Epoch 4 Step: 16900 Batch Loss: 2.282928 Tokens per Sec: 15985, Lr: 0.000300\n", "2019-11-22 16:58:35,518 Epoch 4 Step: 17000 Batch Loss: 2.125155 Tokens per Sec: 16141, Lr: 0.000300\n", "2019-11-22 16:59:13,124 Hooray! New best validation result [ppl]!\n", "2019-11-22 16:59:13,125 Saving new checkpoint.\n", "2019-11-22 16:59:13,402 Example #0\n", "2019-11-22 16:59:13,403 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 16:59:13,403 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 16:59:13,403 \tHypothesis: Ní báyìí , mo ti wá rí iṣẹ́ kan tó ń ṣe .\n", "2019-11-22 16:59:13,403 Example #1\n", "2019-11-22 16:59:13,403 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 16:59:13,403 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 16:59:13,404 \tHypothesis: Ǹjẹ́ mo máa ń mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 16:59:13,404 Example #2\n", "2019-11-22 16:59:13,404 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 16:59:13,404 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 16:59:13,404 \tHypothesis: Ó ti wá rí i pé ó ti rí i ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn sún mọ́lé .\n", "2019-11-22 16:59:13,404 Example #3\n", "2019-11-22 16:59:13,404 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 16:59:13,404 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 16:59:13,405 \tHypothesis: Gẹ́gẹ́ bí Harkavyn Studindi àti Chaldee Dictionary ṣe sọ , “ ẹ̀tanú , ìwà àìmọ́ , àti ìwà àìmọ́ , nítorí pé ó jẹ́ ohun tó ń ṣẹlẹ̀ sí wa . ”\n", "2019-11-22 16:59:13,405 Validation result (greedy) at epoch 4, step 17000: bleu: 18.51, loss: 59254.3672, ppl: 7.2834, duration: 37.8867s\n", "2019-11-22 16:59:27,777 Epoch 4 Step: 17100 Batch Loss: 2.047765 Tokens per Sec: 16173, Lr: 0.000300\n", "2019-11-22 16:59:42,005 Epoch 4 Step: 17200 Batch Loss: 2.214471 Tokens per Sec: 16232, Lr: 0.000300\n", "2019-11-22 16:59:56,409 Epoch 4 Step: 17300 Batch Loss: 2.200597 Tokens per Sec: 16359, Lr: 0.000300\n", "2019-11-22 17:00:10,488 Epoch 4 Step: 17400 Batch Loss: 2.297376 Tokens per Sec: 16487, Lr: 0.000300\n", "2019-11-22 17:00:25,043 Epoch 4 Step: 17500 Batch Loss: 2.071434 Tokens per Sec: 15590, Lr: 0.000300\n", "2019-11-22 17:00:39,671 Epoch 4 Step: 17600 Batch Loss: 2.145045 Tokens per Sec: 16069, Lr: 0.000300\n", "2019-11-22 17:00:54,027 Epoch 4 Step: 17700 Batch Loss: 2.233044 Tokens per Sec: 15813, Lr: 0.000300\n", "2019-11-22 17:01:08,386 Epoch 4 Step: 17800 Batch Loss: 2.689964 Tokens per Sec: 15720, Lr: 0.000300\n", "2019-11-22 17:01:22,675 Epoch 4 Step: 17900 Batch Loss: 1.821698 Tokens per Sec: 16026, Lr: 0.000300\n", "2019-11-22 17:01:37,235 Epoch 4 Step: 18000 Batch Loss: 2.388352 Tokens per Sec: 15858, Lr: 0.000300\n", "2019-11-22 17:02:14,946 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:02:14,946 Saving new checkpoint.\n", "2019-11-22 17:02:15,281 Example #0\n", "2019-11-22 17:02:15,281 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:02:15,281 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:02:15,281 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tí mò ń ṣe kò bójú mu .\n", "2019-11-22 17:02:15,281 Example #1\n", "2019-11-22 17:02:15,281 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:02:15,281 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:02:15,282 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:02:15,282 Example #2\n", "2019-11-22 17:02:15,282 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:02:15,282 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:02:15,282 \tHypothesis: Ó ti ní ìrírí tó pọ̀ jù lọ , ó sì ń ṣe ẹ́ bíi pé ó ń rìn jìnnà sí yín .\n", "2019-11-22 17:02:15,282 Example #3\n", "2019-11-22 17:02:15,282 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:02:15,282 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:02:15,283 \tHypothesis: Gẹ́gẹ́ bí ìwé Harkavy’s of the Hébérù àti Chaldee Dictionary ṣe sọ , “ ìfòyemọ̀ , ìdààmú , ìdààmú , ìdààmú , ìdààmú , fún ìdààmú ọkàn , nítorí pé ó ṣeé ṣe fún àwọn tó ń ṣeni láǹfààní . ”\n", "2019-11-22 17:02:15,283 Validation result (greedy) at epoch 4, step 18000: bleu: 18.70, loss: 58617.0312, ppl: 7.1295, duration: 38.0476s\n", "2019-11-22 17:02:29,763 Epoch 4 Step: 18100 Batch Loss: 2.044858 Tokens per Sec: 15710, Lr: 0.000300\n", "2019-11-22 17:02:44,076 Epoch 4 Step: 18200 Batch Loss: 1.931839 Tokens per Sec: 16427, Lr: 0.000300\n", "2019-11-22 17:02:58,636 Epoch 4 Step: 18300 Batch Loss: 1.845923 Tokens per Sec: 15965, Lr: 0.000300\n", "2019-11-22 17:03:13,237 Epoch 4 Step: 18400 Batch Loss: 1.973657 Tokens per Sec: 16231, Lr: 0.000300\n", "2019-11-22 17:03:27,346 Epoch 4 Step: 18500 Batch Loss: 2.119123 Tokens per Sec: 15819, Lr: 0.000300\n", "2019-11-22 17:03:41,602 Epoch 4 Step: 18600 Batch Loss: 2.181378 Tokens per Sec: 16807, Lr: 0.000300\n", "2019-11-22 17:03:55,936 Epoch 4 Step: 18700 Batch Loss: 2.062544 Tokens per Sec: 15574, Lr: 0.000300\n", "2019-11-22 17:04:10,023 Epoch 4 Step: 18800 Batch Loss: 1.895693 Tokens per Sec: 16445, Lr: 0.000300\n", "2019-11-22 17:04:24,367 Epoch 4 Step: 18900 Batch Loss: 1.921040 Tokens per Sec: 15969, Lr: 0.000300\n", "2019-11-22 17:04:38,416 Epoch 4 Step: 19000 Batch Loss: 2.229419 Tokens per Sec: 16640, Lr: 0.000300\n", "2019-11-22 17:05:16,063 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:05:16,063 Saving new checkpoint.\n", "2019-11-22 17:05:16,342 Example #0\n", "2019-11-22 17:05:16,343 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:05:16,343 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:05:16,343 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó ń ṣe .\n", "2019-11-22 17:05:16,343 Example #1\n", "2019-11-22 17:05:16,343 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:05:16,343 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:05:16,343 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:05:16,343 Example #2\n", "2019-11-22 17:05:16,344 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:05:16,344 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:05:16,344 \tHypothesis: Ó ti rí i pé ó ti rí i pé o ò ní pẹ́ tó , àmọ́ ó ń fi sùúrù rìn níwájú rẹ .\n", "2019-11-22 17:05:16,344 Example #3\n", "2019-11-22 17:05:16,344 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:05:16,344 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:05:16,344 \tHypothesis: Gẹ́gẹ́ bí Harkavyavy’s of the Hébérù àti Chaldee Dictionary ṣe sọ , “ ìfòyemọ̀ , ìwà àìmọ́ , ìdààmú , ìdààmú , ìdààmú , títí láé . ”\n", "2019-11-22 17:05:16,344 Validation result (greedy) at epoch 4, step 19000: bleu: 19.14, loss: 57843.5820, ppl: 6.9471, duration: 37.9280s\n", "2019-11-22 17:05:30,530 Epoch 4 Step: 19100 Batch Loss: 2.399912 Tokens per Sec: 16450, Lr: 0.000300\n", "2019-11-22 17:05:44,878 Epoch 4 Step: 19200 Batch Loss: 2.249157 Tokens per Sec: 16368, Lr: 0.000300\n", "2019-11-22 17:05:59,563 Epoch 4 Step: 19300 Batch Loss: 2.148375 Tokens per Sec: 15869, Lr: 0.000300\n", "2019-11-22 17:06:14,255 Epoch 4 Step: 19400 Batch Loss: 2.191632 Tokens per Sec: 15519, Lr: 0.000300\n", "2019-11-22 17:06:28,311 Epoch 4 Step: 19500 Batch Loss: 2.392773 Tokens per Sec: 16646, Lr: 0.000300\n", "2019-11-22 17:06:42,975 Epoch 4 Step: 19600 Batch Loss: 2.168487 Tokens per Sec: 15834, Lr: 0.000300\n", "2019-11-22 17:06:57,272 Epoch 4 Step: 19700 Batch Loss: 2.221589 Tokens per Sec: 15694, Lr: 0.000300\n", "2019-11-22 17:07:11,489 Epoch 4 Step: 19800 Batch Loss: 2.056837 Tokens per Sec: 16074, Lr: 0.000300\n", "2019-11-22 17:07:25,967 Epoch 4 Step: 19900 Batch Loss: 1.995538 Tokens per Sec: 16212, Lr: 0.000300\n", "2019-11-22 17:07:40,492 Epoch 4 Step: 20000 Batch Loss: 2.113255 Tokens per Sec: 15839, Lr: 0.000300\n", "2019-11-22 17:08:18,087 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:08:18,088 Saving new checkpoint.\n", "2019-11-22 17:08:18,360 Example #0\n", "2019-11-22 17:08:18,360 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:08:18,360 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:08:18,360 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó ń bọ̀ wá .\n", "2019-11-22 17:08:18,360 Example #1\n", "2019-11-22 17:08:18,361 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:08:18,361 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:08:18,361 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:08:18,361 Example #2\n", "2019-11-22 17:08:18,361 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:08:18,361 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:08:18,361 \tHypothesis: Ó ti ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe , àmọ́ ó ń fi sùúrù rìn sún mọ́lé .\n", "2019-11-22 17:08:18,361 Example #3\n", "2019-11-22 17:08:18,361 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:08:18,361 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:08:18,361 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s of the Hébérù àti Chaldee Dictionary ṣe sọ , “ ìfọ̀rọ̀wérọ̀ , ìwà ìbàjẹ́ , ìdààmú , ìdààmú ọkàn , títí láé . ”\n", "2019-11-22 17:08:18,362 Validation result (greedy) at epoch 4, step 20000: bleu: 19.17, loss: 57420.5898, ppl: 6.8493, duration: 37.8693s\n", "2019-11-22 17:08:32,989 Epoch 4 Step: 20100 Batch Loss: 2.029544 Tokens per Sec: 15909, Lr: 0.000300\n", "2019-11-22 17:08:47,382 Epoch 4 Step: 20200 Batch Loss: 1.892038 Tokens per Sec: 16201, Lr: 0.000300\n", "2019-11-22 17:09:02,290 Epoch 4 Step: 20300 Batch Loss: 2.244858 Tokens per Sec: 15256, Lr: 0.000300\n", "2019-11-22 17:09:16,640 Epoch 4 Step: 20400 Batch Loss: 2.276413 Tokens per Sec: 16204, Lr: 0.000300\n", "2019-11-22 17:09:31,100 Epoch 4 Step: 20500 Batch Loss: 1.953611 Tokens per Sec: 15877, Lr: 0.000300\n", "2019-11-22 17:09:45,189 Epoch 4 Step: 20600 Batch Loss: 2.263281 Tokens per Sec: 16501, Lr: 0.000300\n", "2019-11-22 17:09:59,440 Epoch 4 Step: 20700 Batch Loss: 2.171946 Tokens per Sec: 16287, Lr: 0.000300\n", "2019-11-22 17:10:14,019 Epoch 4 Step: 20800 Batch Loss: 2.143815 Tokens per Sec: 16003, Lr: 0.000300\n", "2019-11-22 17:10:27,942 Epoch 4 Step: 20900 Batch Loss: 1.883358 Tokens per Sec: 16414, Lr: 0.000300\n", "2019-11-22 17:10:42,094 Epoch 4 Step: 21000 Batch Loss: 1.957650 Tokens per Sec: 16248, Lr: 0.000300\n", "2019-11-22 17:11:19,890 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:11:19,890 Saving new checkpoint.\n", "2019-11-22 17:11:20,209 Example #0\n", "2019-11-22 17:11:20,210 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:11:20,210 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:11:20,210 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ àṣekúdórógbó ni mo ti ń ṣe .\n", "2019-11-22 17:11:20,210 Example #1\n", "2019-11-22 17:11:20,210 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:11:20,210 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:11:20,210 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:11:20,210 Example #2\n", "2019-11-22 17:11:20,211 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:11:20,211 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:11:20,211 \tHypothesis: Ó ní ìrírí púpọ̀ sí i , ó sì tún ní sùúrù , àmọ́ ó ń rìn sún mọ́lé .\n", "2019-11-22 17:11:20,211 Example #3\n", "2019-11-22 17:11:20,211 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:11:20,211 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:11:20,211 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studale of Hébérù àti Chaldee Dictionary ṣe sọ , “ ìwà àìmọ́ , ìwà àìmọ́ , àti ìwà àìmọ́ , títí láé . ”\n", "2019-11-22 17:11:20,211 Validation result (greedy) at epoch 4, step 21000: bleu: 20.17, loss: 56736.2930, ppl: 6.6941, duration: 38.1169s\n", "2019-11-22 17:11:31,314 Epoch 4: total training loss 11296.22\n", "2019-11-22 17:11:31,314 EPOCH 5\n", "2019-11-22 17:11:35,448 Epoch 5 Step: 21100 Batch Loss: 2.267139 Tokens per Sec: 13505, Lr: 0.000300\n", "2019-11-22 17:11:49,955 Epoch 5 Step: 21200 Batch Loss: 2.153799 Tokens per Sec: 16309, Lr: 0.000300\n", "2019-11-22 17:12:04,525 Epoch 5 Step: 21300 Batch Loss: 1.936871 Tokens per Sec: 15623, Lr: 0.000300\n", "2019-11-22 17:12:18,972 Epoch 5 Step: 21400 Batch Loss: 2.153348 Tokens per Sec: 15988, Lr: 0.000300\n", "2019-11-22 17:12:33,213 Epoch 5 Step: 21500 Batch Loss: 1.978111 Tokens per Sec: 15887, Lr: 0.000300\n", "2019-11-22 17:12:47,428 Epoch 5 Step: 21600 Batch Loss: 2.092513 Tokens per Sec: 15691, Lr: 0.000300\n", "2019-11-22 17:13:01,982 Epoch 5 Step: 21700 Batch Loss: 2.004012 Tokens per Sec: 15890, Lr: 0.000300\n", "2019-11-22 17:13:16,328 Epoch 5 Step: 21800 Batch Loss: 2.171779 Tokens per Sec: 16216, Lr: 0.000300\n", "2019-11-22 17:13:30,633 Epoch 5 Step: 21900 Batch Loss: 2.120487 Tokens per Sec: 15652, Lr: 0.000300\n", "2019-11-22 17:13:44,816 Epoch 5 Step: 22000 Batch Loss: 2.080701 Tokens per Sec: 16325, Lr: 0.000300\n", "2019-11-22 17:14:22,626 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:14:22,627 Saving new checkpoint.\n", "2019-11-22 17:14:22,935 Example #0\n", "2019-11-22 17:14:22,935 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:14:22,935 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:14:22,935 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó ń ṣe ni mò ń ṣe .\n", "2019-11-22 17:14:22,936 Example #1\n", "2019-11-22 17:14:22,936 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:14:22,936 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:14:22,936 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:14:22,936 Example #2\n", "2019-11-22 17:14:22,937 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:14:22,937 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:14:22,937 \tHypothesis: Ó ti ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:14:22,937 Example #3\n", "2019-11-22 17:14:22,937 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:14:22,937 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:14:22,938 \tHypothesis: Gẹ́gẹ́ bí ìwé Harkavyn Studale àti Chaldee Dictionary , sọ , “ ìfaradà , ìfaradà , ìjẹ́pàtàkì , ìjẹ́pàtàkì , títí láé . ”\n", "2019-11-22 17:14:22,938 Validation result (greedy) at epoch 5, step 22000: bleu: 20.13, loss: 56376.5117, ppl: 6.6139, duration: 38.1210s\n", "2019-11-22 17:14:37,277 Epoch 5 Step: 22100 Batch Loss: 2.109228 Tokens per Sec: 15975, Lr: 0.000300\n", "2019-11-22 17:14:51,626 Epoch 5 Step: 22200 Batch Loss: 2.198554 Tokens per Sec: 15869, Lr: 0.000300\n", "2019-11-22 17:15:05,888 Epoch 5 Step: 22300 Batch Loss: 2.232208 Tokens per Sec: 16238, Lr: 0.000300\n", "2019-11-22 17:15:19,991 Epoch 5 Step: 22400 Batch Loss: 2.024531 Tokens per Sec: 16564, Lr: 0.000300\n", "2019-11-22 17:15:34,538 Epoch 5 Step: 22500 Batch Loss: 2.181924 Tokens per Sec: 15887, Lr: 0.000300\n", "2019-11-22 17:15:48,972 Epoch 5 Step: 22600 Batch Loss: 2.102092 Tokens per Sec: 16297, Lr: 0.000300\n", "2019-11-22 17:16:03,634 Epoch 5 Step: 22700 Batch Loss: 1.812854 Tokens per Sec: 15437, Lr: 0.000300\n", "2019-11-22 17:16:18,144 Epoch 5 Step: 22800 Batch Loss: 2.073268 Tokens per Sec: 16350, Lr: 0.000300\n", "2019-11-22 17:16:32,481 Epoch 5 Step: 22900 Batch Loss: 2.069217 Tokens per Sec: 16005, Lr: 0.000300\n", "2019-11-22 17:16:46,784 Epoch 5 Step: 23000 Batch Loss: 1.982661 Tokens per Sec: 16711, Lr: 0.000300\n", "2019-11-22 17:17:24,424 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:17:24,424 Saving new checkpoint.\n", "2019-11-22 17:17:24,765 Example #0\n", "2019-11-22 17:17:24,765 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:17:24,765 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:17:24,765 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó ń bójú tó iṣẹ́ náà .\n", "2019-11-22 17:17:24,765 Example #1\n", "2019-11-22 17:17:24,765 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:17:24,766 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:17:24,766 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:17:24,766 Example #2\n", "2019-11-22 17:17:24,766 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:17:24,766 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:17:24,766 \tHypothesis: Ó ti ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn sún mọ́ ẹ .\n", "2019-11-22 17:17:24,766 Example #3\n", "2019-11-22 17:17:24,766 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:17:24,766 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:17:24,766 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s of the Hébérù àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìwà àìmọ́ , àìní , títí láé . ”\n", "2019-11-22 17:17:24,766 Validation result (greedy) at epoch 5, step 23000: bleu: 21.06, loss: 55626.3750, ppl: 6.4497, duration: 37.9819s\n", "2019-11-22 17:17:39,154 Epoch 5 Step: 23100 Batch Loss: 2.005813 Tokens per Sec: 15999, Lr: 0.000300\n", "2019-11-22 17:17:53,616 Epoch 5 Step: 23200 Batch Loss: 2.109508 Tokens per Sec: 16178, Lr: 0.000300\n", "2019-11-22 17:18:08,175 Epoch 5 Step: 23300 Batch Loss: 2.055749 Tokens per Sec: 15669, Lr: 0.000300\n", "2019-11-22 17:18:22,785 Epoch 5 Step: 23400 Batch Loss: 2.092495 Tokens per Sec: 15959, Lr: 0.000300\n", "2019-11-22 17:18:37,107 Epoch 5 Step: 23500 Batch Loss: 2.098208 Tokens per Sec: 16159, Lr: 0.000300\n", "2019-11-22 17:18:51,824 Epoch 5 Step: 23600 Batch Loss: 1.944332 Tokens per Sec: 15246, Lr: 0.000300\n", "2019-11-22 17:19:06,453 Epoch 5 Step: 23700 Batch Loss: 1.915375 Tokens per Sec: 15821, Lr: 0.000300\n", "2019-11-22 17:19:20,763 Epoch 5 Step: 23800 Batch Loss: 2.197342 Tokens per Sec: 16313, Lr: 0.000300\n", "2019-11-22 17:19:35,401 Epoch 5 Step: 23900 Batch Loss: 2.001249 Tokens per Sec: 16142, Lr: 0.000300\n", "2019-11-22 17:19:50,037 Epoch 5 Step: 24000 Batch Loss: 2.144041 Tokens per Sec: 15930, Lr: 0.000300\n", "2019-11-22 17:20:28,280 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:20:28,280 Saving new checkpoint.\n", "2019-11-22 17:20:28,610 Example #0\n", "2019-11-22 17:20:28,611 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:20:28,611 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:20:28,611 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó ń ṣe mí láǹfààní .\n", "2019-11-22 17:20:28,611 Example #1\n", "2019-11-22 17:20:28,611 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:20:28,611 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:20:28,611 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:20:28,612 Example #2\n", "2019-11-22 17:20:28,612 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:20:28,612 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:20:28,612 \tHypothesis: Ó ní ìrírí tó pọ̀ ju èyí tó o ṣe lọ , àmọ́ ó ń fi sùúrù rìn sún mọ́lé .\n", "2019-11-22 17:20:28,612 Example #3\n", "2019-11-22 17:20:28,612 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:20:28,612 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:20:28,612 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s of the Hébérù àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìfaradà , ìwà àìtọ́ , títí láé . ”\n", "2019-11-22 17:20:28,613 Validation result (greedy) at epoch 5, step 24000: bleu: 20.43, loss: 55376.7812, ppl: 6.3960, duration: 38.5752s\n", "2019-11-22 17:20:43,327 Epoch 5 Step: 24100 Batch Loss: 1.971654 Tokens per Sec: 15700, Lr: 0.000300\n", "2019-11-22 17:20:57,667 Epoch 5 Step: 24200 Batch Loss: 2.066741 Tokens per Sec: 16295, Lr: 0.000300\n", "2019-11-22 17:21:12,065 Epoch 5 Step: 24300 Batch Loss: 2.296745 Tokens per Sec: 15930, Lr: 0.000300\n", "2019-11-22 17:21:26,691 Epoch 5 Step: 24400 Batch Loss: 2.171690 Tokens per Sec: 15706, Lr: 0.000300\n", "2019-11-22 17:21:41,072 Epoch 5 Step: 24500 Batch Loss: 1.910099 Tokens per Sec: 16273, Lr: 0.000300\n", "2019-11-22 17:21:55,808 Epoch 5 Step: 24600 Batch Loss: 2.186445 Tokens per Sec: 16001, Lr: 0.000300\n", "2019-11-22 17:22:10,473 Epoch 5 Step: 24700 Batch Loss: 2.187626 Tokens per Sec: 15535, Lr: 0.000300\n", "2019-11-22 17:22:24,988 Epoch 5 Step: 24800 Batch Loss: 2.006366 Tokens per Sec: 16336, Lr: 0.000300\n", "2019-11-22 17:22:39,469 Epoch 5 Step: 24900 Batch Loss: 2.237786 Tokens per Sec: 15790, Lr: 0.000300\n", "2019-11-22 17:22:54,016 Epoch 5 Step: 25000 Batch Loss: 1.921993 Tokens per Sec: 16019, Lr: 0.000300\n", "2019-11-22 17:23:33,006 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:23:33,006 Saving new checkpoint.\n", "2019-11-22 17:23:33,314 Example #0\n", "2019-11-22 17:23:33,314 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:23:33,314 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:23:33,314 \tHypothesis: Mo ti wá rí i pé mo ti rí iṣẹ́ tó ń ṣe .\n", "2019-11-22 17:23:33,314 Example #1\n", "2019-11-22 17:23:33,315 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:23:33,315 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:23:33,315 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:23:33,315 Example #2\n", "2019-11-22 17:23:33,315 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:23:33,315 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:23:33,315 \tHypothesis: Ó ti ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:23:33,315 Example #3\n", "2019-11-22 17:23:33,316 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:23:33,316 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:23:33,316 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studale àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìwà àìlófin , títí láé , nítorí pé ó jẹ́ pé ó jẹ́ pé ó jẹ́ pé ó ti gidi ni . ”\n", "2019-11-22 17:23:33,316 Validation result (greedy) at epoch 5, step 25000: bleu: 20.91, loss: 54553.7578, ppl: 6.2220, duration: 39.2995s\n", "2019-11-22 17:23:48,009 Epoch 5 Step: 25100 Batch Loss: 1.775004 Tokens per Sec: 15620, Lr: 0.000300\n", "2019-11-22 17:24:02,588 Epoch 5 Step: 25200 Batch Loss: 1.859160 Tokens per Sec: 16132, Lr: 0.000300\n", "2019-11-22 17:24:16,942 Epoch 5 Step: 25300 Batch Loss: 2.025541 Tokens per Sec: 16154, Lr: 0.000300\n", "2019-11-22 17:24:31,555 Epoch 5 Step: 25400 Batch Loss: 1.930209 Tokens per Sec: 16376, Lr: 0.000300\n", "2019-11-22 17:24:45,692 Epoch 5 Step: 25500 Batch Loss: 2.030751 Tokens per Sec: 16184, Lr: 0.000300\n", "2019-11-22 17:25:00,060 Epoch 5 Step: 25600 Batch Loss: 2.066814 Tokens per Sec: 16383, Lr: 0.000300\n", "2019-11-22 17:25:14,684 Epoch 5 Step: 25700 Batch Loss: 2.064300 Tokens per Sec: 15768, Lr: 0.000300\n", "2019-11-22 17:25:28,839 Epoch 5 Step: 25800 Batch Loss: 2.138564 Tokens per Sec: 16422, Lr: 0.000300\n", "2019-11-22 17:25:42,900 Epoch 5 Step: 25900 Batch Loss: 2.016785 Tokens per Sec: 16379, Lr: 0.000300\n", "2019-11-22 17:25:57,399 Epoch 5 Step: 26000 Batch Loss: 1.847802 Tokens per Sec: 15956, Lr: 0.000300\n", "2019-11-22 17:26:35,741 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:26:35,742 Saving new checkpoint.\n", "2019-11-22 17:26:36,028 Example #0\n", "2019-11-22 17:26:36,028 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:26:36,028 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:26:36,028 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tí mò ń ṣe nísinsìnyí .\n", "2019-11-22 17:26:36,029 Example #1\n", "2019-11-22 17:26:36,029 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:26:36,029 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:26:36,029 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:26:36,029 Example #2\n", "2019-11-22 17:26:36,030 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:26:36,030 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:26:36,030 \tHypothesis: Ó ti ní ìrírí tó pọ̀ jù , ó sì ń ṣe é , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:26:36,030 Example #3\n", "2019-11-22 17:26:36,030 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:26:36,030 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:26:36,030 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s of the Hébérù àti Chaldee Dictionary ṣe sọ , “ ìfòyemọ̀ , ìfòyemọ̀ , ìfẹ́kúfẹ̀ẹ́ , fún ìbàjẹ́ , fún àkókò tí ó lọ kánrin . ”\n", "2019-11-22 17:26:36,031 Validation result (greedy) at epoch 5, step 26000: bleu: 21.09, loss: 54421.4375, ppl: 6.1944, duration: 38.6311s\n", "2019-11-22 17:26:50,655 Epoch 5 Step: 26100 Batch Loss: 1.910159 Tokens per Sec: 15900, Lr: 0.000300\n", "2019-11-22 17:27:05,555 Epoch 5 Step: 26200 Batch Loss: 1.964026 Tokens per Sec: 15666, Lr: 0.000300\n", "2019-11-22 17:27:19,970 Epoch 5 Step: 26300 Batch Loss: 2.003616 Tokens per Sec: 16113, Lr: 0.000300\n", "2019-11-22 17:27:25,381 Epoch 5: total training loss 10695.22\n", "2019-11-22 17:27:25,381 EPOCH 6\n", "2019-11-22 17:27:35,071 Epoch 6 Step: 26400 Batch Loss: 2.113199 Tokens per Sec: 14800, Lr: 0.000300\n", "2019-11-22 17:27:49,364 Epoch 6 Step: 26500 Batch Loss: 1.879611 Tokens per Sec: 16070, Lr: 0.000300\n", "2019-11-22 17:28:03,950 Epoch 6 Step: 26600 Batch Loss: 2.080094 Tokens per Sec: 16035, Lr: 0.000300\n", "2019-11-22 17:28:18,388 Epoch 6 Step: 26700 Batch Loss: 1.928730 Tokens per Sec: 16061, Lr: 0.000300\n", "2019-11-22 17:28:32,755 Epoch 6 Step: 26800 Batch Loss: 1.839602 Tokens per Sec: 15758, Lr: 0.000300\n", "2019-11-22 17:28:47,058 Epoch 6 Step: 26900 Batch Loss: 2.021560 Tokens per Sec: 15830, Lr: 0.000300\n", "2019-11-22 17:29:01,415 Epoch 6 Step: 27000 Batch Loss: 2.042310 Tokens per Sec: 16483, Lr: 0.000300\n", "2019-11-22 17:29:39,327 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:29:39,327 Saving new checkpoint.\n", "2019-11-22 17:29:39,687 Example #0\n", "2019-11-22 17:29:39,688 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:29:39,688 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:29:39,688 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ kan wà tó yẹ kí n ṣe .\n", "2019-11-22 17:29:39,688 Example #1\n", "2019-11-22 17:29:39,688 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:29:39,688 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:29:39,688 \tHypothesis: Ṣé mo mọyì ohun ìní tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:29:39,689 Example #2\n", "2019-11-22 17:29:39,689 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:29:39,689 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:29:39,689 \tHypothesis: Ó ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn sún mọ́ yín .\n", "2019-11-22 17:29:39,689 Example #3\n", "2019-11-22 17:29:39,689 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:29:39,689 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:29:39,689 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studale ṣe sọ , àwọn Akẹ́kọ̀ọ́ Hébérù àti Chaldee Dictionary , tó túmọ̀ sí “ ìfaradà , ìfẹ̀gbẹ́kẹ̀gbẹ́ , ìbàjẹ́ , títí láé . ”\n", "2019-11-22 17:29:39,690 Validation result (greedy) at epoch 6, step 27000: bleu: 21.60, loss: 53826.6484, ppl: 6.0722, duration: 38.2744s\n", "2019-11-22 17:29:54,256 Epoch 6 Step: 27100 Batch Loss: 1.946697 Tokens per Sec: 15842, Lr: 0.000300\n", "2019-11-22 17:30:08,820 Epoch 6 Step: 27200 Batch Loss: 1.756857 Tokens per Sec: 15986, Lr: 0.000300\n", "2019-11-22 17:30:23,273 Epoch 6 Step: 27300 Batch Loss: 1.869599 Tokens per Sec: 15666, Lr: 0.000300\n", "2019-11-22 17:30:37,933 Epoch 6 Step: 27400 Batch Loss: 2.167918 Tokens per Sec: 15426, Lr: 0.000300\n", "2019-11-22 17:30:52,571 Epoch 6 Step: 27500 Batch Loss: 1.770482 Tokens per Sec: 16011, Lr: 0.000300\n", "2019-11-22 17:31:07,134 Epoch 6 Step: 27600 Batch Loss: 2.089880 Tokens per Sec: 16028, Lr: 0.000300\n", "2019-11-22 17:31:21,804 Epoch 6 Step: 27700 Batch Loss: 1.868982 Tokens per Sec: 16081, Lr: 0.000300\n", "2019-11-22 17:31:36,143 Epoch 6 Step: 27800 Batch Loss: 2.087383 Tokens per Sec: 16712, Lr: 0.000300\n", "2019-11-22 17:31:50,558 Epoch 6 Step: 27900 Batch Loss: 1.829142 Tokens per Sec: 16383, Lr: 0.000300\n", "2019-11-22 17:32:04,867 Epoch 6 Step: 28000 Batch Loss: 2.180131 Tokens per Sec: 16364, Lr: 0.000300\n", "2019-11-22 17:32:42,684 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:32:42,685 Saving new checkpoint.\n", "2019-11-22 17:32:43,031 Example #0\n", "2019-11-22 17:32:43,032 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:32:43,032 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:32:43,032 \tHypothesis: Ní báyìí , mo ti wá rí i pé mo ti ń ṣiṣẹ́ .\n", "2019-11-22 17:32:43,032 Example #1\n", "2019-11-22 17:32:43,032 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:32:43,032 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:32:43,032 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:32:43,032 Example #2\n", "2019-11-22 17:32:43,033 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:32:43,033 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:32:43,033 \tHypothesis: Ó ti ní ìrírí tó pọ̀ ju ti tẹ́lẹ̀ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:32:43,033 Example #3\n", "2019-11-22 17:32:43,033 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:32:43,033 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:32:43,034 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s Studale àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìfọ̀rora - ẹni - wò , àìlófin , títí láé . ”\n", "2019-11-22 17:32:43,034 Validation result (greedy) at epoch 6, step 28000: bleu: 21.70, loss: 53366.1367, ppl: 5.9792, duration: 38.1663s\n", "2019-11-22 17:32:57,442 Epoch 6 Step: 28100 Batch Loss: 1.717030 Tokens per Sec: 15927, Lr: 0.000300\n", "2019-11-22 17:33:11,914 Epoch 6 Step: 28200 Batch Loss: 1.657245 Tokens per Sec: 15864, Lr: 0.000300\n", "2019-11-22 17:33:26,164 Epoch 6 Step: 28300 Batch Loss: 2.051284 Tokens per Sec: 16688, Lr: 0.000300\n", "2019-11-22 17:33:40,436 Epoch 6 Step: 28400 Batch Loss: 2.277625 Tokens per Sec: 16124, Lr: 0.000300\n", "2019-11-22 17:33:55,048 Epoch 6 Step: 28500 Batch Loss: 1.929556 Tokens per Sec: 15984, Lr: 0.000300\n", "2019-11-22 17:34:09,403 Epoch 6 Step: 28600 Batch Loss: 1.962888 Tokens per Sec: 15829, Lr: 0.000300\n", "2019-11-22 17:34:23,613 Epoch 6 Step: 28700 Batch Loss: 2.100291 Tokens per Sec: 16153, Lr: 0.000300\n", "2019-11-22 17:34:37,725 Epoch 6 Step: 28800 Batch Loss: 1.681772 Tokens per Sec: 16075, Lr: 0.000300\n", "2019-11-22 17:34:52,136 Epoch 6 Step: 28900 Batch Loss: 2.026470 Tokens per Sec: 16418, Lr: 0.000300\n", "2019-11-22 17:35:06,525 Epoch 6 Step: 29000 Batch Loss: 1.902625 Tokens per Sec: 15901, Lr: 0.000300\n", "2019-11-22 17:35:44,560 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:35:44,560 Saving new checkpoint.\n", "2019-11-22 17:35:44,902 Example #0\n", "2019-11-22 17:35:44,902 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:35:44,902 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:35:44,902 \tHypothesis: Mo ti wá rí i pé mo ti rí iṣẹ́ tó ń ṣe .\n", "2019-11-22 17:35:44,902 Example #1\n", "2019-11-22 17:35:44,903 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:35:44,903 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:35:44,903 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:35:44,903 Example #2\n", "2019-11-22 17:35:44,903 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:35:44,903 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:35:44,903 \tHypothesis: Ó ní ìrírí tó pọ̀ jù lọ , ó sì ń ṣe ohun tó o ṣe , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:35:44,903 Example #3\n", "2019-11-22 17:35:44,904 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:35:44,904 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:35:44,904 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Studale of the Greek and Chaldee Dictionary , látọwọ́ “ ìfòyemọ̀ , ìwà àìmọ́ , àti àìláárí , títí láé . ”\n", "2019-11-22 17:35:44,904 Validation result (greedy) at epoch 6, step 29000: bleu: 22.15, loss: 53238.4258, ppl: 5.9537, duration: 38.3783s\n", "2019-11-22 17:35:59,065 Epoch 6 Step: 29100 Batch Loss: 1.913733 Tokens per Sec: 16632, Lr: 0.000300\n", "2019-11-22 17:36:13,673 Epoch 6 Step: 29200 Batch Loss: 2.110575 Tokens per Sec: 15684, Lr: 0.000300\n", "2019-11-22 17:36:28,011 Epoch 6 Step: 29300 Batch Loss: 1.902560 Tokens per Sec: 15937, Lr: 0.000300\n", "2019-11-22 17:36:42,279 Epoch 6 Step: 29400 Batch Loss: 2.181222 Tokens per Sec: 16357, Lr: 0.000300\n", "2019-11-22 17:36:56,957 Epoch 6 Step: 29500 Batch Loss: 1.993552 Tokens per Sec: 16015, Lr: 0.000300\n", "2019-11-22 17:37:11,622 Epoch 6 Step: 29600 Batch Loss: 2.065743 Tokens per Sec: 15888, Lr: 0.000300\n", "2019-11-22 17:37:25,984 Epoch 6 Step: 29700 Batch Loss: 1.720443 Tokens per Sec: 15860, Lr: 0.000300\n", "2019-11-22 17:37:40,059 Epoch 6 Step: 29800 Batch Loss: 1.942151 Tokens per Sec: 16543, Lr: 0.000300\n", "2019-11-22 17:37:54,665 Epoch 6 Step: 29900 Batch Loss: 1.949508 Tokens per Sec: 15850, Lr: 0.000300\n", "2019-11-22 17:38:09,061 Epoch 6 Step: 30000 Batch Loss: 2.003276 Tokens per Sec: 16106, Lr: 0.000300\n", "2019-11-22 17:38:47,143 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:38:47,143 Saving new checkpoint.\n", "2019-11-22 17:38:47,510 Example #0\n", "2019-11-22 17:38:47,510 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:38:47,511 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:38:47,511 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ kan wà tó yẹ kí n ṣe .\n", "2019-11-22 17:38:47,511 Example #1\n", "2019-11-22 17:38:47,511 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:38:47,511 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:38:47,511 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:38:47,511 Example #2\n", "2019-11-22 17:38:47,511 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:38:47,511 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:38:47,512 \tHypothesis: Ó ní ìrírí tó ga ju èyí tí o ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:38:47,512 Example #3\n", "2019-11-22 17:38:47,512 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:38:47,512 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:38:47,512 \tHypothesis: Gẹ́gẹ́ bí ìwé Harkavy’s Studale of Hébérù àti Chaldee Dictionary , túmọ̀ sí “ ìfaradà , ìdààmú , ìdààmú , ìdààmú , títí láé . ”\n", "2019-11-22 17:38:47,512 Validation result (greedy) at epoch 6, step 30000: bleu: 22.44, loss: 52674.6484, ppl: 5.8423, duration: 38.4509s\n", "2019-11-22 17:39:01,936 Epoch 6 Step: 30100 Batch Loss: 2.022988 Tokens per Sec: 16210, Lr: 0.000300\n", "2019-11-22 17:39:15,962 Epoch 6 Step: 30200 Batch Loss: 1.842496 Tokens per Sec: 16547, Lr: 0.000300\n", "2019-11-22 17:39:30,201 Epoch 6 Step: 30300 Batch Loss: 1.915047 Tokens per Sec: 16234, Lr: 0.000300\n", "2019-11-22 17:39:44,609 Epoch 6 Step: 30400 Batch Loss: 2.068272 Tokens per Sec: 16008, Lr: 0.000300\n", "2019-11-22 17:39:59,348 Epoch 6 Step: 30500 Batch Loss: 1.872421 Tokens per Sec: 15187, Lr: 0.000300\n", "2019-11-22 17:40:13,866 Epoch 6 Step: 30600 Batch Loss: 1.926584 Tokens per Sec: 15913, Lr: 0.000300\n", "2019-11-22 17:40:28,453 Epoch 6 Step: 30700 Batch Loss: 1.916884 Tokens per Sec: 16053, Lr: 0.000300\n", "2019-11-22 17:40:42,925 Epoch 6 Step: 30800 Batch Loss: 1.821695 Tokens per Sec: 16111, Lr: 0.000300\n", "2019-11-22 17:40:57,414 Epoch 6 Step: 30900 Batch Loss: 1.993177 Tokens per Sec: 15752, Lr: 0.000300\n", "2019-11-22 17:41:12,220 Epoch 6 Step: 31000 Batch Loss: 1.870407 Tokens per Sec: 15553, Lr: 0.000300\n", "2019-11-22 17:41:51,341 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:41:51,341 Saving new checkpoint.\n", "2019-11-22 17:41:51,695 Example #0\n", "2019-11-22 17:41:51,695 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:41:51,695 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:41:51,695 \tHypothesis: Ní báyìí , mo ti wá rí i pé mo ní láti máa ṣiṣẹ́ .\n", "2019-11-22 17:41:51,696 Example #1\n", "2019-11-22 17:41:51,696 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:41:51,696 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:41:51,696 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:41:51,696 Example #2\n", "2019-11-22 17:41:51,696 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:41:51,696 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:41:51,696 \tHypothesis: Ó ní ìrírí tó pọ̀ tó , ó sì ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:41:51,696 Example #3\n", "2019-11-22 17:41:51,697 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:41:51,697 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:41:51,697 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s of the Hébérù àti Chaldee Dictionary , túmọ̀ sí “ ìwà àìlófin , títí láé , títí láé . ”\n", "2019-11-22 17:41:51,697 Validation result (greedy) at epoch 6, step 31000: bleu: 22.16, loss: 52553.3242, ppl: 5.8186, duration: 39.4763s\n", "2019-11-22 17:42:05,845 Epoch 6 Step: 31100 Batch Loss: 1.736670 Tokens per Sec: 16009, Lr: 0.000300\n", "2019-11-22 17:42:20,020 Epoch 6 Step: 31200 Batch Loss: 1.933458 Tokens per Sec: 16267, Lr: 0.000300\n", "2019-11-22 17:42:34,390 Epoch 6 Step: 31300 Batch Loss: 1.899296 Tokens per Sec: 16305, Lr: 0.000300\n", "2019-11-22 17:42:48,509 Epoch 6 Step: 31400 Batch Loss: 1.792978 Tokens per Sec: 16378, Lr: 0.000300\n", "2019-11-22 17:43:02,704 Epoch 6 Step: 31500 Batch Loss: 1.978403 Tokens per Sec: 16428, Lr: 0.000300\n", "2019-11-22 17:43:16,939 Epoch 6 Step: 31600 Batch Loss: 1.850261 Tokens per Sec: 16346, Lr: 0.000300\n", "2019-11-22 17:43:17,093 Epoch 6: total training loss 10311.63\n", "2019-11-22 17:43:17,093 EPOCH 7\n", "2019-11-22 17:43:31,874 Epoch 7 Step: 31700 Batch Loss: 1.830961 Tokens per Sec: 15062, Lr: 0.000300\n", "2019-11-22 17:43:46,208 Epoch 7 Step: 31800 Batch Loss: 1.890947 Tokens per Sec: 16016, Lr: 0.000300\n", "2019-11-22 17:44:00,452 Epoch 7 Step: 31900 Batch Loss: 1.945352 Tokens per Sec: 16496, Lr: 0.000300\n", "2019-11-22 17:44:14,555 Epoch 7 Step: 32000 Batch Loss: 1.827667 Tokens per Sec: 16544, Lr: 0.000300\n", "2019-11-22 17:44:52,534 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:44:52,535 Saving new checkpoint.\n", "2019-11-22 17:44:52,948 Example #0\n", "2019-11-22 17:44:52,949 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:44:52,949 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:44:52,949 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó ń mówó wọlé fún mi .\n", "2019-11-22 17:44:52,949 Example #1\n", "2019-11-22 17:44:52,949 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:44:52,949 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:44:52,950 \tHypothesis: Ṣé mo mọyì nǹkan tara tí mo ní pẹ̀lú Jèhófà àti àwọn èèyàn ?\n", "2019-11-22 17:44:52,950 Example #2\n", "2019-11-22 17:44:52,950 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:44:52,950 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:44:52,950 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì ń fi sùúrù rìn sún mọ́ ọ .\n", "2019-11-22 17:44:52,950 Example #3\n", "2019-11-22 17:44:52,950 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:44:52,950 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:44:52,950 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studale ṣe sọ , àwọn Akẹ́kọ̀ọ́ Hébérù àti Chaldee Dictionary , tó túmọ̀ sí “ ìfaradà , ìwà àìlófin , títí láé . ”\n", "2019-11-22 17:44:52,951 Validation result (greedy) at epoch 7, step 32000: bleu: 22.84, loss: 52127.1914, ppl: 5.7361, duration: 38.3949s\n", "2019-11-22 17:45:07,206 Epoch 7 Step: 32100 Batch Loss: 1.819387 Tokens per Sec: 16360, Lr: 0.000300\n", "2019-11-22 17:45:21,152 Epoch 7 Step: 32200 Batch Loss: 2.009302 Tokens per Sec: 16016, Lr: 0.000300\n", "2019-11-22 17:45:35,414 Epoch 7 Step: 32300 Batch Loss: 1.902013 Tokens per Sec: 16463, Lr: 0.000300\n", "2019-11-22 17:45:49,459 Epoch 7 Step: 32400 Batch Loss: 1.740094 Tokens per Sec: 16407, Lr: 0.000300\n", "2019-11-22 17:46:03,750 Epoch 7 Step: 32500 Batch Loss: 1.887079 Tokens per Sec: 15823, Lr: 0.000300\n", "2019-11-22 17:46:17,969 Epoch 7 Step: 32600 Batch Loss: 1.931270 Tokens per Sec: 16796, Lr: 0.000300\n", "2019-11-22 17:46:32,212 Epoch 7 Step: 32700 Batch Loss: 1.770277 Tokens per Sec: 16441, Lr: 0.000300\n", "2019-11-22 17:46:46,414 Epoch 7 Step: 32800 Batch Loss: 1.894068 Tokens per Sec: 16242, Lr: 0.000300\n", "2019-11-22 17:47:00,799 Epoch 7 Step: 32900 Batch Loss: 1.864567 Tokens per Sec: 16393, Lr: 0.000300\n", "2019-11-22 17:47:14,787 Epoch 7 Step: 33000 Batch Loss: 1.732246 Tokens per Sec: 16660, Lr: 0.000300\n", "2019-11-22 17:47:52,425 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:47:52,425 Saving new checkpoint.\n", "2019-11-22 17:47:52,808 Example #0\n", "2019-11-22 17:47:52,808 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:47:52,809 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:47:52,809 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó ń ṣe mí láǹfààní gan - an .\n", "2019-11-22 17:47:52,809 Example #1\n", "2019-11-22 17:47:52,809 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:47:52,809 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:47:52,809 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan ìní tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 17:47:52,809 Example #2\n", "2019-11-22 17:47:52,810 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:47:52,810 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:47:52,810 \tHypothesis: Ó ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:47:52,810 Example #3\n", "2019-11-22 17:47:52,810 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:47:52,810 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:47:52,810 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studale ṣe sọ , àwọn Akẹ́kọ̀ọ́ Hébérù àti Chaldee Dictionary , tó túmọ̀ sí “ ìfaradà , ìwà àìlófin , títí láé . ”\n", "2019-11-22 17:47:52,810 Validation result (greedy) at epoch 7, step 33000: bleu: 22.74, loss: 51758.1719, ppl: 5.6656, duration: 38.0232s\n", "2019-11-22 17:48:06,954 Epoch 7 Step: 33100 Batch Loss: 1.783124 Tokens per Sec: 16629, Lr: 0.000300\n", "2019-11-22 17:48:20,875 Epoch 7 Step: 33200 Batch Loss: 1.998001 Tokens per Sec: 16267, Lr: 0.000300\n", "2019-11-22 17:48:35,194 Epoch 7 Step: 33300 Batch Loss: 1.797060 Tokens per Sec: 16172, Lr: 0.000300\n", "2019-11-22 17:48:49,604 Epoch 7 Step: 33400 Batch Loss: 1.713831 Tokens per Sec: 15865, Lr: 0.000300\n", "2019-11-22 17:49:03,767 Epoch 7 Step: 33500 Batch Loss: 1.973309 Tokens per Sec: 16006, Lr: 0.000300\n", "2019-11-22 17:49:18,056 Epoch 7 Step: 33600 Batch Loss: 1.657038 Tokens per Sec: 16174, Lr: 0.000300\n", "2019-11-22 17:49:32,189 Epoch 7 Step: 33700 Batch Loss: 1.642341 Tokens per Sec: 16470, Lr: 0.000300\n", "2019-11-22 17:49:46,382 Epoch 7 Step: 33800 Batch Loss: 1.685241 Tokens per Sec: 15992, Lr: 0.000300\n", "2019-11-22 17:50:00,605 Epoch 7 Step: 33900 Batch Loss: 1.746425 Tokens per Sec: 15823, Lr: 0.000300\n", "2019-11-22 17:50:14,897 Epoch 7 Step: 34000 Batch Loss: 1.832884 Tokens per Sec: 15862, Lr: 0.000300\n", "2019-11-22 17:50:52,582 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:50:52,582 Saving new checkpoint.\n", "2019-11-22 17:50:52,922 Example #0\n", "2019-11-22 17:50:52,922 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:50:52,922 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:50:52,922 \tHypothesis: Mo ti wá rí i pé mo ti wá iṣẹ́ tó dára gan - an báyìí .\n", "2019-11-22 17:50:52,922 Example #1\n", "2019-11-22 17:50:52,923 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:50:52,923 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:50:52,923 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:50:52,923 Example #2\n", "2019-11-22 17:50:52,924 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:50:52,924 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:50:52,924 \tHypothesis: Ó ní ìrírí tó pọ̀ tó , ó sì ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:50:52,924 Example #3\n", "2019-11-22 17:50:52,924 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:50:52,924 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:50:52,924 \tHypothesis: Gẹ́gẹ́ bí ìwé Harkavy’s Studale àti Chaldee Dictionary ṣe sọ , “ ìfaradà , ìbàjẹ́ , ayérayé , títí láé . ”\n", "2019-11-22 17:50:52,924 Validation result (greedy) at epoch 7, step 34000: bleu: 23.13, loss: 51674.0195, ppl: 5.6496, duration: 38.0265s\n", "2019-11-22 17:51:07,250 Epoch 7 Step: 34100 Batch Loss: 2.154147 Tokens per Sec: 16139, Lr: 0.000300\n", "2019-11-22 17:51:21,493 Epoch 7 Step: 34200 Batch Loss: 1.994195 Tokens per Sec: 16074, Lr: 0.000300\n", "2019-11-22 17:51:35,628 Epoch 7 Step: 34300 Batch Loss: 1.971174 Tokens per Sec: 16271, Lr: 0.000300\n", "2019-11-22 17:51:50,145 Epoch 7 Step: 34400 Batch Loss: 1.877644 Tokens per Sec: 16279, Lr: 0.000300\n", "2019-11-22 17:52:04,061 Epoch 7 Step: 34500 Batch Loss: 1.944179 Tokens per Sec: 16683, Lr: 0.000300\n", "2019-11-22 17:52:18,164 Epoch 7 Step: 34600 Batch Loss: 1.993344 Tokens per Sec: 16489, Lr: 0.000300\n", "2019-11-22 17:52:32,258 Epoch 7 Step: 34700 Batch Loss: 1.789206 Tokens per Sec: 16024, Lr: 0.000300\n", "2019-11-22 17:52:46,551 Epoch 7 Step: 34800 Batch Loss: 2.084453 Tokens per Sec: 16087, Lr: 0.000300\n", "2019-11-22 17:53:00,741 Epoch 7 Step: 34900 Batch Loss: 1.872838 Tokens per Sec: 16397, Lr: 0.000300\n", "2019-11-22 17:53:14,973 Epoch 7 Step: 35000 Batch Loss: 1.942886 Tokens per Sec: 16332, Lr: 0.000300\n", "2019-11-22 17:53:52,337 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:53:52,337 Saving new checkpoint.\n", "2019-11-22 17:53:52,614 Example #0\n", "2019-11-22 17:53:52,615 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:53:52,615 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:53:52,615 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 17:53:52,615 Example #1\n", "2019-11-22 17:53:52,615 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:53:52,615 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:53:52,616 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:53:52,616 Example #2\n", "2019-11-22 17:53:52,616 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:53:52,616 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:53:52,616 \tHypothesis: Ó ní ìrírí tó ga ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn sún mọ́ ọ .\n", "2019-11-22 17:53:52,616 Example #3\n", "2019-11-22 17:53:52,617 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:53:52,617 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:53:52,617 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s of the Greek and Chaldee Dictionary , túmọ̀ sí “ ìfọ̀kànbalẹ̀ , ìwà àìmọ́ , títí láé . ”\n", "2019-11-22 17:53:52,617 Validation result (greedy) at epoch 7, step 35000: bleu: 22.84, loss: 51468.0273, ppl: 5.6107, duration: 37.6439s\n", "2019-11-22 17:54:06,990 Epoch 7 Step: 35100 Batch Loss: 1.800824 Tokens per Sec: 16219, Lr: 0.000300\n", "2019-11-22 17:54:21,005 Epoch 7 Step: 35200 Batch Loss: 1.905010 Tokens per Sec: 16328, Lr: 0.000300\n", "2019-11-22 17:54:35,330 Epoch 7 Step: 35300 Batch Loss: 2.127296 Tokens per Sec: 15973, Lr: 0.000300\n", "2019-11-22 17:54:49,399 Epoch 7 Step: 35400 Batch Loss: 2.056179 Tokens per Sec: 16628, Lr: 0.000300\n", "2019-11-22 17:55:03,932 Epoch 7 Step: 35500 Batch Loss: 1.864792 Tokens per Sec: 15566, Lr: 0.000300\n", "2019-11-22 17:55:18,420 Epoch 7 Step: 35600 Batch Loss: 1.854965 Tokens per Sec: 15919, Lr: 0.000300\n", "2019-11-22 17:55:32,906 Epoch 7 Step: 35700 Batch Loss: 1.960148 Tokens per Sec: 16370, Lr: 0.000300\n", "2019-11-22 17:55:47,004 Epoch 7 Step: 35800 Batch Loss: 1.674275 Tokens per Sec: 16265, Lr: 0.000300\n", "2019-11-22 17:56:01,505 Epoch 7 Step: 35900 Batch Loss: 1.459853 Tokens per Sec: 16001, Lr: 0.000300\n", "2019-11-22 17:56:16,119 Epoch 7 Step: 36000 Batch Loss: 1.824356 Tokens per Sec: 16293, Lr: 0.000300\n", "2019-11-22 17:56:54,179 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:56:54,179 Saving new checkpoint.\n", "2019-11-22 17:56:54,457 Example #0\n", "2019-11-22 17:56:54,457 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:56:54,457 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:56:54,457 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó máa jẹ́ kí n lè ṣe .\n", "2019-11-22 17:56:54,457 Example #1\n", "2019-11-22 17:56:54,457 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:56:54,457 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:56:54,457 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:56:54,458 Example #2\n", "2019-11-22 17:56:54,458 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:56:54,458 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:56:54,458 \tHypothesis: Ó ní ìrírí tó ga ju bó o ṣe ń ṣe , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:56:54,458 Example #3\n", "2019-11-22 17:56:54,458 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:56:54,458 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:56:54,458 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Studale àti Chaldee Dictionary ṣe sọ , “ ìfaradà , ìdààmú ọkàn , títí láé , nítorí pé ó wà títí láé . ”\n", "2019-11-22 17:56:54,458 Validation result (greedy) at epoch 7, step 36000: bleu: 23.21, loss: 50915.3398, ppl: 5.5078, duration: 38.3390s\n", "2019-11-22 17:57:09,022 Epoch 7 Step: 36100 Batch Loss: 1.683175 Tokens per Sec: 15655, Lr: 0.000300\n", "2019-11-22 17:57:23,139 Epoch 7 Step: 36200 Batch Loss: 1.800051 Tokens per Sec: 16548, Lr: 0.000300\n", "2019-11-22 17:57:37,418 Epoch 7 Step: 36300 Batch Loss: 1.829790 Tokens per Sec: 15961, Lr: 0.000300\n", "2019-11-22 17:57:51,550 Epoch 7 Step: 36400 Batch Loss: 1.936055 Tokens per Sec: 16397, Lr: 0.000300\n", "2019-11-22 17:58:05,654 Epoch 7 Step: 36500 Batch Loss: 1.887884 Tokens per Sec: 16672, Lr: 0.000300\n", "2019-11-22 17:58:19,769 Epoch 7 Step: 36600 Batch Loss: 2.152575 Tokens per Sec: 16581, Lr: 0.000300\n", "2019-11-22 17:58:33,764 Epoch 7 Step: 36700 Batch Loss: 1.868886 Tokens per Sec: 16698, Lr: 0.000300\n", "2019-11-22 17:58:47,796 Epoch 7 Step: 36800 Batch Loss: 1.611240 Tokens per Sec: 16292, Lr: 0.000300\n", "2019-11-22 17:58:58,268 Epoch 7: total training loss 10004.50\n", "2019-11-22 17:58:58,269 EPOCH 8\n", "2019-11-22 17:59:02,460 Epoch 8 Step: 36900 Batch Loss: 1.775815 Tokens per Sec: 15168, Lr: 0.000300\n", "2019-11-22 17:59:16,747 Epoch 8 Step: 37000 Batch Loss: 1.701950 Tokens per Sec: 16132, Lr: 0.000300\n", "2019-11-22 17:59:53,601 Hooray! New best validation result [ppl]!\n", "2019-11-22 17:59:53,601 Saving new checkpoint.\n", "2019-11-22 17:59:53,949 Example #0\n", "2019-11-22 17:59:53,949 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 17:59:53,949 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 17:59:53,949 \tHypothesis: Ní báyìí , mo ti ní láti rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 17:59:53,949 Example #1\n", "2019-11-22 17:59:53,950 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 17:59:53,950 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 17:59:53,950 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 17:59:53,950 Example #2\n", "2019-11-22 17:59:53,950 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 17:59:53,950 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 17:59:53,950 \tHypothesis: Ó ti ní ìrírí tó pọ̀ tó , ó sì ti ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 17:59:53,950 Example #3\n", "2019-11-22 17:59:53,951 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 17:59:53,951 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 17:59:53,951 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Studale àti Chaldee Dictionary , ṣe sọ , ó túmọ̀ sí “ ìfaradà , ìfòyemọ̀ , títí láé , títí láé . ”\n", "2019-11-22 17:59:53,951 Validation result (greedy) at epoch 8, step 37000: bleu: 23.56, loss: 50815.6133, ppl: 5.4894, duration: 37.2036s\n", "2019-11-22 18:00:08,087 Epoch 8 Step: 37100 Batch Loss: 2.157253 Tokens per Sec: 16220, Lr: 0.000300\n", "2019-11-22 18:00:22,112 Epoch 8 Step: 37200 Batch Loss: 1.724658 Tokens per Sec: 16922, Lr: 0.000300\n", "2019-11-22 18:00:36,527 Epoch 8 Step: 37300 Batch Loss: 1.712456 Tokens per Sec: 16157, Lr: 0.000300\n", "2019-11-22 18:00:50,900 Epoch 8 Step: 37400 Batch Loss: 1.795871 Tokens per Sec: 16349, Lr: 0.000300\n", "2019-11-22 18:01:05,100 Epoch 8 Step: 37500 Batch Loss: 1.737259 Tokens per Sec: 15628, Lr: 0.000300\n", "2019-11-22 18:01:19,255 Epoch 8 Step: 37600 Batch Loss: 1.865201 Tokens per Sec: 16408, Lr: 0.000300\n", "2019-11-22 18:01:33,683 Epoch 8 Step: 37700 Batch Loss: 1.791873 Tokens per Sec: 15686, Lr: 0.000300\n", "2019-11-22 18:01:48,136 Epoch 8 Step: 37800 Batch Loss: 1.938652 Tokens per Sec: 16399, Lr: 0.000300\n", "2019-11-22 18:02:02,361 Epoch 8 Step: 37900 Batch Loss: 1.804954 Tokens per Sec: 16572, Lr: 0.000300\n", "2019-11-22 18:02:16,485 Epoch 8 Step: 38000 Batch Loss: 1.928725 Tokens per Sec: 16013, Lr: 0.000300\n", "2019-11-22 18:02:54,687 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:02:54,687 Saving new checkpoint.\n", "2019-11-22 18:02:54,968 Example #0\n", "2019-11-22 18:02:54,969 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:02:54,969 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:02:54,969 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 18:02:54,969 Example #1\n", "2019-11-22 18:02:54,970 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:02:54,970 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:02:54,970 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:02:54,970 Example #2\n", "2019-11-22 18:02:54,970 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:02:54,971 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:02:54,971 \tHypothesis: Ó ti ní ìrírí tó pọ̀ jù , ó sì ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:02:54,971 Example #3\n", "2019-11-22 18:02:54,971 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:02:54,971 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:02:54,971 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , “ ìfaradà , ìdààmú ọkàn , títí láé , nítorí pé ó jẹ́ pé kò sí ohun tó burú nínú kéèyàn máa ṣe . ”\n", "2019-11-22 18:02:54,972 Validation result (greedy) at epoch 8, step 38000: bleu: 23.47, loss: 50547.6016, ppl: 5.4403, duration: 38.4859s\n", "2019-11-22 18:03:09,045 Epoch 8 Step: 38100 Batch Loss: 1.902024 Tokens per Sec: 16906, Lr: 0.000300\n", "2019-11-22 18:03:23,385 Epoch 8 Step: 38200 Batch Loss: 1.808283 Tokens per Sec: 15954, Lr: 0.000300\n", "2019-11-22 18:03:37,559 Epoch 8 Step: 38300 Batch Loss: 1.865547 Tokens per Sec: 16142, Lr: 0.000300\n", "2019-11-22 18:03:51,845 Epoch 8 Step: 38400 Batch Loss: 1.887298 Tokens per Sec: 16096, Lr: 0.000300\n", "2019-11-22 18:04:05,867 Epoch 8 Step: 38500 Batch Loss: 1.694458 Tokens per Sec: 16411, Lr: 0.000300\n", "2019-11-22 18:04:20,044 Epoch 8 Step: 38600 Batch Loss: 1.842062 Tokens per Sec: 16299, Lr: 0.000300\n", "2019-11-22 18:04:34,127 Epoch 8 Step: 38700 Batch Loss: 1.917456 Tokens per Sec: 16194, Lr: 0.000300\n", "2019-11-22 18:04:48,248 Epoch 8 Step: 38800 Batch Loss: 1.939326 Tokens per Sec: 16466, Lr: 0.000300\n", "2019-11-22 18:05:02,235 Epoch 8 Step: 38900 Batch Loss: 1.777627 Tokens per Sec: 16377, Lr: 0.000300\n", "2019-11-22 18:05:16,585 Epoch 8 Step: 39000 Batch Loss: 2.089313 Tokens per Sec: 16459, Lr: 0.000300\n", "2019-11-22 18:05:54,534 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:05:54,535 Saving new checkpoint.\n", "2019-11-22 18:05:54,858 Example #0\n", "2019-11-22 18:05:54,858 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:05:54,858 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:05:54,858 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ kan wà tí mo fẹ́ ṣe .\n", "2019-11-22 18:05:54,858 Example #1\n", "2019-11-22 18:05:54,858 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:05:54,858 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:05:54,859 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:05:54,859 Example #2\n", "2019-11-22 18:05:54,859 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:05:54,859 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:05:54,859 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:05:54,859 Example #3\n", "2019-11-22 18:05:54,859 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:05:54,859 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:05:54,860 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Studale of Hébérù àti Chaldee Dictionary ṣe sọ , “ ìfaradà , ìfaradà , àti ìbàlẹ̀ ọkàn . ”\n", "2019-11-22 18:05:54,860 Validation result (greedy) at epoch 8, step 39000: bleu: 23.53, loss: 50198.7188, ppl: 5.3771, duration: 38.2742s\n", "2019-11-22 18:06:08,947 Epoch 8 Step: 39100 Batch Loss: 1.997511 Tokens per Sec: 16456, Lr: 0.000300\n", "2019-11-22 18:06:23,146 Epoch 8 Step: 39200 Batch Loss: 1.620427 Tokens per Sec: 16284, Lr: 0.000300\n", "2019-11-22 18:06:37,380 Epoch 8 Step: 39300 Batch Loss: 1.771099 Tokens per Sec: 15948, Lr: 0.000300\n", "2019-11-22 18:06:51,818 Epoch 8 Step: 39400 Batch Loss: 1.795152 Tokens per Sec: 15889, Lr: 0.000300\n", "2019-11-22 18:07:06,050 Epoch 8 Step: 39500 Batch Loss: 1.792031 Tokens per Sec: 16230, Lr: 0.000300\n", "2019-11-22 18:07:20,369 Epoch 8 Step: 39600 Batch Loss: 1.839065 Tokens per Sec: 16029, Lr: 0.000300\n", "2019-11-22 18:07:34,212 Epoch 8 Step: 39700 Batch Loss: 1.625928 Tokens per Sec: 16508, Lr: 0.000300\n", "2019-11-22 18:07:48,374 Epoch 8 Step: 39800 Batch Loss: 1.995922 Tokens per Sec: 16087, Lr: 0.000300\n", "2019-11-22 18:08:02,606 Epoch 8 Step: 39900 Batch Loss: 1.682530 Tokens per Sec: 15997, Lr: 0.000300\n", "2019-11-22 18:08:16,485 Epoch 8 Step: 40000 Batch Loss: 1.793231 Tokens per Sec: 16453, Lr: 0.000300\n", "2019-11-22 18:08:54,234 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:08:54,235 Saving new checkpoint.\n", "2019-11-22 18:08:54,516 Example #0\n", "2019-11-22 18:08:54,517 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:08:54,517 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:08:54,517 \tHypothesis: Mo wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 18:08:54,517 Example #1\n", "2019-11-22 18:08:54,517 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:08:54,517 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:08:54,518 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:08:54,518 Example #2\n", "2019-11-22 18:08:54,518 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:08:54,518 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:08:54,518 \tHypothesis: Ó ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó máa ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:08:54,518 Example #3\n", "2019-11-22 18:08:54,518 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:08:54,519 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:08:54,519 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Studale of Hébérù àti Chaldee Dictionary , ṣe sọ , “ ìfaradà , ìfòyemọ̀ , àti ìbàlẹ̀ ọkàn . ”\n", "2019-11-22 18:08:54,519 Validation result (greedy) at epoch 8, step 40000: bleu: 23.89, loss: 50040.6875, ppl: 5.3487, duration: 38.0336s\n", "2019-11-22 18:09:08,811 Epoch 8 Step: 40100 Batch Loss: 1.965714 Tokens per Sec: 16173, Lr: 0.000300\n", "2019-11-22 18:09:22,906 Epoch 8 Step: 40200 Batch Loss: 1.749259 Tokens per Sec: 16575, Lr: 0.000300\n", "2019-11-22 18:09:37,059 Epoch 8 Step: 40300 Batch Loss: 2.016415 Tokens per Sec: 16192, Lr: 0.000300\n", "2019-11-22 18:09:51,354 Epoch 8 Step: 40400 Batch Loss: 1.889681 Tokens per Sec: 16742, Lr: 0.000300\n", "2019-11-22 18:10:05,567 Epoch 8 Step: 40500 Batch Loss: 1.721034 Tokens per Sec: 16149, Lr: 0.000300\n", "2019-11-22 18:10:19,804 Epoch 8 Step: 40600 Batch Loss: 1.768523 Tokens per Sec: 16499, Lr: 0.000300\n", "2019-11-22 18:10:34,176 Epoch 8 Step: 40700 Batch Loss: 1.831356 Tokens per Sec: 16376, Lr: 0.000300\n", "2019-11-22 18:10:48,293 Epoch 8 Step: 40800 Batch Loss: 1.852525 Tokens per Sec: 16461, Lr: 0.000300\n", "2019-11-22 18:11:02,269 Epoch 8 Step: 40900 Batch Loss: 1.884950 Tokens per Sec: 16309, Lr: 0.000300\n", "2019-11-22 18:11:16,292 Epoch 8 Step: 41000 Batch Loss: 1.898151 Tokens per Sec: 16559, Lr: 0.000300\n", "2019-11-22 18:11:53,618 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:11:53,618 Saving new checkpoint.\n", "2019-11-22 18:11:53,930 Example #0\n", "2019-11-22 18:11:53,930 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:11:53,930 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:11:53,930 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 18:11:53,930 Example #1\n", "2019-11-22 18:11:53,930 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:11:53,931 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:11:53,931 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:11:53,931 Example #2\n", "2019-11-22 18:11:53,931 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:11:53,931 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:11:53,931 \tHypothesis: Ó ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:11:53,931 Example #3\n", "2019-11-22 18:11:53,932 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:11:53,932 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:11:53,932 \tHypothesis: Gẹ́gẹ́ bí ìwé Harkavy’s Studale and Chaldee Dictionary , Dictionary , túmọ̀ sí “ ìfaradà , ìbàlẹ̀ òye , títí láé , títí láé . ”\n", "2019-11-22 18:11:53,932 Validation result (greedy) at epoch 8, step 41000: bleu: 23.64, loss: 49734.7305, ppl: 5.2941, duration: 37.6394s\n", "2019-11-22 18:12:08,244 Epoch 8 Step: 41100 Batch Loss: 1.907780 Tokens per Sec: 16092, Lr: 0.000300\n", "2019-11-22 18:12:22,464 Epoch 8 Step: 41200 Batch Loss: 1.914108 Tokens per Sec: 16294, Lr: 0.000300\n", "2019-11-22 18:12:36,881 Epoch 8 Step: 41300 Batch Loss: 1.746228 Tokens per Sec: 16005, Lr: 0.000300\n", "2019-11-22 18:12:51,137 Epoch 8 Step: 41400 Batch Loss: 1.987656 Tokens per Sec: 16669, Lr: 0.000300\n", "2019-11-22 18:13:05,494 Epoch 8 Step: 41500 Batch Loss: 1.790737 Tokens per Sec: 16298, Lr: 0.000300\n", "2019-11-22 18:13:20,168 Epoch 8 Step: 41600 Batch Loss: 1.747738 Tokens per Sec: 15765, Lr: 0.000300\n", "2019-11-22 18:13:34,905 Epoch 8 Step: 41700 Batch Loss: 1.784380 Tokens per Sec: 15949, Lr: 0.000300\n", "2019-11-22 18:13:49,302 Epoch 8 Step: 41800 Batch Loss: 1.838693 Tokens per Sec: 16066, Lr: 0.000300\n", "2019-11-22 18:14:03,703 Epoch 8 Step: 41900 Batch Loss: 1.876262 Tokens per Sec: 15830, Lr: 0.000300\n", "2019-11-22 18:14:18,315 Epoch 8 Step: 42000 Batch Loss: 1.860365 Tokens per Sec: 16185, Lr: 0.000300\n", "2019-11-22 18:14:57,389 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:14:57,389 Saving new checkpoint.\n", "2019-11-22 18:14:57,698 Example #0\n", "2019-11-22 18:14:57,699 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:14:57,699 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:14:57,699 \tHypothesis: Ní báyìí , mo ti wá rí ibi iṣẹ́ tó yẹ kí n máa ṣe .\n", "2019-11-22 18:14:57,699 Example #1\n", "2019-11-22 18:14:57,699 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:14:57,699 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:14:57,699 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 18:14:57,699 Example #2\n", "2019-11-22 18:14:57,699 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:14:57,700 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:14:57,700 \tHypothesis: Ó ti ní ìrírí tó pọ̀ tó , ó sì ti ṣe ohun tó o ṣe , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:14:57,700 Example #3\n", "2019-11-22 18:14:57,700 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:14:57,700 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:14:57,700 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studavy’s Studale àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìbàlẹ̀ ọkàn , ìwà àìlófin , títí láé , nítorí pé ó ti wà títí láé . ”\n", "2019-11-22 18:14:57,700 Validation result (greedy) at epoch 8, step 42000: bleu: 23.92, loss: 49712.9766, ppl: 5.2903, duration: 39.3852s\n", "2019-11-22 18:15:12,500 Epoch 8 Step: 42100 Batch Loss: 1.992931 Tokens per Sec: 15759, Lr: 0.000300\n", "2019-11-22 18:15:17,825 Epoch 8: total training loss 9732.93\n", "2019-11-22 18:15:17,825 EPOCH 9\n", "2019-11-22 18:15:27,878 Epoch 9 Step: 42200 Batch Loss: 1.643430 Tokens per Sec: 14518, Lr: 0.000300\n", "2019-11-22 18:15:42,803 Epoch 9 Step: 42300 Batch Loss: 2.053339 Tokens per Sec: 15805, Lr: 0.000300\n", "2019-11-22 18:15:57,244 Epoch 9 Step: 42400 Batch Loss: 1.656404 Tokens per Sec: 15748, Lr: 0.000300\n", "2019-11-22 18:16:12,250 Epoch 9 Step: 42500 Batch Loss: 1.797582 Tokens per Sec: 15539, Lr: 0.000300\n", "2019-11-22 18:16:27,425 Epoch 9 Step: 42600 Batch Loss: 1.896013 Tokens per Sec: 15073, Lr: 0.000300\n", "2019-11-22 18:16:42,446 Epoch 9 Step: 42700 Batch Loss: 1.811566 Tokens per Sec: 15749, Lr: 0.000300\n", "2019-11-22 18:16:57,232 Epoch 9 Step: 42800 Batch Loss: 2.322586 Tokens per Sec: 15447, Lr: 0.000300\n", "2019-11-22 18:17:12,044 Epoch 9 Step: 42900 Batch Loss: 1.955019 Tokens per Sec: 15592, Lr: 0.000300\n", "2019-11-22 18:17:26,977 Epoch 9 Step: 43000 Batch Loss: 1.954452 Tokens per Sec: 15755, Lr: 0.000300\n", "2019-11-22 18:18:06,248 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:18:06,248 Saving new checkpoint.\n", "2019-11-22 18:18:06,541 Example #0\n", "2019-11-22 18:18:06,541 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:18:06,541 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:18:06,541 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ ni mo máa ń ṣe .\n", "2019-11-22 18:18:06,542 Example #1\n", "2019-11-22 18:18:06,542 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:18:06,542 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:18:06,542 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:18:06,542 Example #2\n", "2019-11-22 18:18:06,542 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:18:06,542 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:18:06,543 \tHypothesis: Ó ní ìrírí tó pọ̀ jù lọ , ó sì tún ní ìrírí tó o ṣe ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:18:06,543 Example #3\n", "2019-11-22 18:18:06,543 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:18:06,543 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:18:06,543 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , “ ìbàjẹ́ , ìbàjẹ́ , ìbàjẹ́ , títí láé , fún àkókò tí ó lọ kánrin . ”\n", "2019-11-22 18:18:06,543 Validation result (greedy) at epoch 9, step 43000: bleu: 24.10, loss: 49629.4688, ppl: 5.2755, duration: 39.5660s\n", "2019-11-22 18:18:21,537 Epoch 9 Step: 43100 Batch Loss: 1.744525 Tokens per Sec: 15089, Lr: 0.000300\n", "2019-11-22 18:18:36,704 Epoch 9 Step: 43200 Batch Loss: 1.772058 Tokens per Sec: 15214, Lr: 0.000300\n", "2019-11-22 18:18:51,620 Epoch 9 Step: 43300 Batch Loss: 1.902907 Tokens per Sec: 15753, Lr: 0.000300\n", "2019-11-22 18:19:06,584 Epoch 9 Step: 43400 Batch Loss: 1.735963 Tokens per Sec: 15800, Lr: 0.000300\n", "2019-11-22 18:19:21,176 Epoch 9 Step: 43500 Batch Loss: 1.886015 Tokens per Sec: 15391, Lr: 0.000300\n", "2019-11-22 18:19:36,192 Epoch 9 Step: 43600 Batch Loss: 1.656335 Tokens per Sec: 15633, Lr: 0.000300\n", "2019-11-22 18:19:51,272 Epoch 9 Step: 43700 Batch Loss: 1.860252 Tokens per Sec: 15492, Lr: 0.000300\n", "2019-11-22 18:20:05,909 Epoch 9 Step: 43800 Batch Loss: 1.823786 Tokens per Sec: 15355, Lr: 0.000300\n", "2019-11-22 18:20:20,694 Epoch 9 Step: 43900 Batch Loss: 1.966671 Tokens per Sec: 15500, Lr: 0.000300\n", "2019-11-22 18:20:35,598 Epoch 9 Step: 44000 Batch Loss: 1.937821 Tokens per Sec: 15639, Lr: 0.000300\n", "2019-11-22 18:21:15,555 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:21:15,555 Saving new checkpoint.\n", "2019-11-22 18:21:15,927 Example #0\n", "2019-11-22 18:21:15,928 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:21:15,928 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:21:15,928 \tHypothesis: Mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 18:21:15,928 Example #1\n", "2019-11-22 18:21:15,928 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:21:15,928 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:21:15,929 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:21:15,929 Example #2\n", "2019-11-22 18:21:15,929 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:21:15,929 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:21:15,929 \tHypothesis: Ó ti ní ìrírí tó pọ̀ jù , ó sì ti ń ṣe é , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:21:15,929 Example #3\n", "2019-11-22 18:21:15,929 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:21:15,929 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:21:15,930 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s Students ’ àti Chaldee Dictionary , túmọ̀ sí “ ìfaradà , ìdààmú , ìdàgbàsókè , títí láé , nítorí pé kò sí àní - àní . ”\n", "2019-11-22 18:21:15,930 Validation result (greedy) at epoch 9, step 44000: bleu: 23.85, loss: 49299.0000, ppl: 5.2174, duration: 40.3324s\n", "2019-11-22 18:21:30,890 Epoch 9 Step: 44100 Batch Loss: 1.777228 Tokens per Sec: 15336, Lr: 0.000300\n", "2019-11-22 18:21:46,045 Epoch 9 Step: 44200 Batch Loss: 2.084293 Tokens per Sec: 15387, Lr: 0.000300\n", "2019-11-22 18:22:01,421 Epoch 9 Step: 44300 Batch Loss: 1.853697 Tokens per Sec: 15285, Lr: 0.000300\n", "2019-11-22 18:22:16,289 Epoch 9 Step: 44400 Batch Loss: 1.905579 Tokens per Sec: 15030, Lr: 0.000300\n", "2019-11-22 18:22:31,025 Epoch 9 Step: 44500 Batch Loss: 1.839125 Tokens per Sec: 15530, Lr: 0.000300\n", "2019-11-22 18:22:45,466 Epoch 9 Step: 44600 Batch Loss: 1.790594 Tokens per Sec: 15965, Lr: 0.000300\n", "2019-11-22 18:23:00,392 Epoch 9 Step: 44700 Batch Loss: 2.029154 Tokens per Sec: 15246, Lr: 0.000300\n", "2019-11-22 18:23:15,301 Epoch 9 Step: 44800 Batch Loss: 1.675198 Tokens per Sec: 15520, Lr: 0.000300\n", "2019-11-22 18:23:30,291 Epoch 9 Step: 44900 Batch Loss: 1.855109 Tokens per Sec: 15483, Lr: 0.000300\n", "2019-11-22 18:23:45,109 Epoch 9 Step: 45000 Batch Loss: 1.665070 Tokens per Sec: 15290, Lr: 0.000300\n", "2019-11-22 18:24:24,483 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:24:24,483 Saving new checkpoint.\n", "2019-11-22 18:24:24,790 Example #0\n", "2019-11-22 18:24:24,790 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:24:24,790 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:24:24,790 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ kan wà tó yẹ kí n ṣe .\n", "2019-11-22 18:24:24,791 Example #1\n", "2019-11-22 18:24:24,791 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:24:24,791 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:24:24,791 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:24:24,791 Example #2\n", "2019-11-22 18:24:24,792 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:24:24,792 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:24:24,792 \tHypothesis: Ó ti ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:24:24,792 Example #3\n", "2019-11-22 18:24:24,792 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:24:24,792 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:24:24,792 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s Bible and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ jíjẹ́ aláìṣòótọ́ , títí láé , nítorí pé ó ti pẹ́ jù lọ . ”\n", "2019-11-22 18:24:24,793 Validation result (greedy) at epoch 9, step 45000: bleu: 24.31, loss: 49239.2695, ppl: 5.2070, duration: 39.6833s\n", "2019-11-22 18:24:39,781 Epoch 9 Step: 45100 Batch Loss: 1.882748 Tokens per Sec: 15357, Lr: 0.000300\n", "2019-11-22 18:24:54,793 Epoch 9 Step: 45200 Batch Loss: 1.649030 Tokens per Sec: 15469, Lr: 0.000300\n", "2019-11-22 18:25:10,086 Epoch 9 Step: 45300 Batch Loss: 1.751250 Tokens per Sec: 15269, Lr: 0.000300\n", "2019-11-22 18:25:25,042 Epoch 9 Step: 45400 Batch Loss: 1.734173 Tokens per Sec: 15606, Lr: 0.000300\n", "2019-11-22 18:25:40,291 Epoch 9 Step: 45500 Batch Loss: 1.799389 Tokens per Sec: 15407, Lr: 0.000300\n", "2019-11-22 18:25:55,166 Epoch 9 Step: 45600 Batch Loss: 1.834233 Tokens per Sec: 15730, Lr: 0.000300\n", "2019-11-22 18:26:09,768 Epoch 9 Step: 45700 Batch Loss: 1.875898 Tokens per Sec: 16098, Lr: 0.000300\n", "2019-11-22 18:26:24,887 Epoch 9 Step: 45800 Batch Loss: 1.907900 Tokens per Sec: 14833, Lr: 0.000300\n", "2019-11-22 18:26:40,337 Epoch 9 Step: 45900 Batch Loss: 1.556278 Tokens per Sec: 15246, Lr: 0.000300\n", "2019-11-22 18:26:55,453 Epoch 9 Step: 46000 Batch Loss: 1.854272 Tokens per Sec: 15250, Lr: 0.000300\n", "2019-11-22 18:27:34,781 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:27:34,781 Saving new checkpoint.\n", "2019-11-22 18:27:35,080 Example #0\n", "2019-11-22 18:27:35,080 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:27:35,080 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:27:35,081 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ kan wà tó yẹ kí n ṣe .\n", "2019-11-22 18:27:35,081 Example #1\n", "2019-11-22 18:27:35,081 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:27:35,081 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:27:35,081 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 18:27:35,081 Example #2\n", "2019-11-22 18:27:35,081 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:27:35,081 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:27:35,082 \tHypothesis: Ó ní ìrírí tó pọ̀ tó , ó sì tún ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù dúró gbọn - in nítòsí rẹ .\n", "2019-11-22 18:27:35,082 Example #3\n", "2019-11-22 18:27:35,082 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:27:35,082 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:27:35,082 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Stud’s Stud’s and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìfaradà , ìfòyemọ̀ , àti àìlófin . ”\n", "2019-11-22 18:27:35,082 Validation result (greedy) at epoch 9, step 46000: bleu: 24.45, loss: 49009.9648, ppl: 5.1671, duration: 39.6292s\n", "2019-11-22 18:27:50,174 Epoch 9 Step: 46100 Batch Loss: 1.784587 Tokens per Sec: 15146, Lr: 0.000300\n", "2019-11-22 18:28:04,755 Epoch 9 Step: 46200 Batch Loss: 1.819000 Tokens per Sec: 16421, Lr: 0.000300\n", "2019-11-22 18:28:19,318 Epoch 9 Step: 46300 Batch Loss: 1.757184 Tokens per Sec: 15671, Lr: 0.000300\n", "2019-11-22 18:28:34,373 Epoch 9 Step: 46400 Batch Loss: 1.995332 Tokens per Sec: 15338, Lr: 0.000300\n", "2019-11-22 18:28:49,194 Epoch 9 Step: 46500 Batch Loss: 1.744114 Tokens per Sec: 15831, Lr: 0.000300\n", "2019-11-22 18:29:04,271 Epoch 9 Step: 46600 Batch Loss: 2.070216 Tokens per Sec: 15631, Lr: 0.000300\n", "2019-11-22 18:29:19,050 Epoch 9 Step: 46700 Batch Loss: 1.955923 Tokens per Sec: 15556, Lr: 0.000300\n", "2019-11-22 18:29:34,201 Epoch 9 Step: 46800 Batch Loss: 1.439619 Tokens per Sec: 15171, Lr: 0.000300\n", "2019-11-22 18:29:49,318 Epoch 9 Step: 46900 Batch Loss: 1.747817 Tokens per Sec: 15457, Lr: 0.000300\n", "2019-11-22 18:30:04,236 Epoch 9 Step: 47000 Batch Loss: 1.881855 Tokens per Sec: 15372, Lr: 0.000300\n", "2019-11-22 18:30:43,942 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:30:43,943 Saving new checkpoint.\n", "2019-11-22 18:30:44,287 Example #0\n", "2019-11-22 18:30:44,287 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:30:44,287 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:30:44,287 \tHypothesis: Ní báyìí , mo ti wá rí i pé mo ní láti máa ṣiṣẹ́ .\n", "2019-11-22 18:30:44,287 Example #1\n", "2019-11-22 18:30:44,288 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:30:44,288 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:30:44,288 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 18:30:44,288 Example #2\n", "2019-11-22 18:30:44,288 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:30:44,288 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:30:44,288 \tHypothesis: Ó ní ìrírí tó pọ̀ tó , ó sì ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:30:44,288 Example #3\n", "2019-11-22 18:30:44,288 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:30:44,289 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:30:44,289 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studale àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìbàlẹ̀ , ìfọ̀kànbalẹ̀ , títí láé , nítorí pé ó ti ṣẹlẹ̀ . ”\n", "2019-11-22 18:30:44,289 Validation result (greedy) at epoch 9, step 47000: bleu: 24.68, loss: 48887.7070, ppl: 5.1460, duration: 40.0527s\n", "2019-11-22 18:30:59,193 Epoch 9 Step: 47100 Batch Loss: 2.009070 Tokens per Sec: 15106, Lr: 0.000300\n", "2019-11-22 18:31:14,096 Epoch 9 Step: 47200 Batch Loss: 1.660535 Tokens per Sec: 15928, Lr: 0.000300\n", "2019-11-22 18:31:28,552 Epoch 9 Step: 47300 Batch Loss: 1.865400 Tokens per Sec: 15617, Lr: 0.000300\n", "2019-11-22 18:31:43,376 Epoch 9 Step: 47400 Batch Loss: 1.768543 Tokens per Sec: 15727, Lr: 0.000300\n", "2019-11-22 18:31:44,109 Epoch 9: total training loss 9551.34\n", "2019-11-22 18:31:44,109 EPOCH 10\n", "2019-11-22 18:31:58,764 Epoch 10 Step: 47500 Batch Loss: 1.720686 Tokens per Sec: 15045, Lr: 0.000300\n", "2019-11-22 18:32:13,798 Epoch 10 Step: 47600 Batch Loss: 1.789007 Tokens per Sec: 15613, Lr: 0.000300\n", "2019-11-22 18:32:28,728 Epoch 10 Step: 47700 Batch Loss: 1.706217 Tokens per Sec: 15597, Lr: 0.000300\n", "2019-11-22 18:32:43,748 Epoch 10 Step: 47800 Batch Loss: 1.660076 Tokens per Sec: 15235, Lr: 0.000300\n", "2019-11-22 18:32:58,410 Epoch 10 Step: 47900 Batch Loss: 1.844406 Tokens per Sec: 15548, Lr: 0.000300\n", "2019-11-22 18:33:13,341 Epoch 10 Step: 48000 Batch Loss: 1.710981 Tokens per Sec: 15025, Lr: 0.000300\n", "2019-11-22 18:33:52,846 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:33:52,847 Saving new checkpoint.\n", "2019-11-22 18:33:53,229 Example #0\n", "2019-11-22 18:33:53,230 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:33:53,230 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:33:53,230 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 18:33:53,230 Example #1\n", "2019-11-22 18:33:53,230 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:33:53,231 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:33:53,231 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:33:53,231 Example #2\n", "2019-11-22 18:33:53,231 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:33:53,231 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:33:53,231 \tHypothesis: Ó ti ní ìrírí tó pọ̀ tó , ó sì ti ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:33:53,231 Example #3\n", "2019-11-22 18:33:53,232 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:33:53,232 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:33:53,232 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Hébérù àti Chaldee Dictionary ṣe sọ , nígbà tí wọ́n ń pè ní “ ìfaradà , ìfaradà , ìfaradà , ìdàgbàdénú , títí láé , nítorí pé kò sí àní - àní . ”\n", "2019-11-22 18:33:53,232 Validation result (greedy) at epoch 10, step 48000: bleu: 25.05, loss: 48780.8906, ppl: 5.1276, duration: 39.8903s\n", "2019-11-22 18:34:08,484 Epoch 10 Step: 48100 Batch Loss: 1.810857 Tokens per Sec: 15027, Lr: 0.000300\n", "2019-11-22 18:34:23,356 Epoch 10 Step: 48200 Batch Loss: 1.789713 Tokens per Sec: 15526, Lr: 0.000300\n", "2019-11-22 18:34:38,494 Epoch 10 Step: 48300 Batch Loss: 1.805373 Tokens per Sec: 14895, Lr: 0.000300\n", "2019-11-22 18:34:53,502 Epoch 10 Step: 48400 Batch Loss: 1.883552 Tokens per Sec: 15655, Lr: 0.000300\n", "2019-11-22 18:35:08,187 Epoch 10 Step: 48500 Batch Loss: 1.713017 Tokens per Sec: 15824, Lr: 0.000300\n", "2019-11-22 18:35:23,222 Epoch 10 Step: 48600 Batch Loss: 1.798625 Tokens per Sec: 15579, Lr: 0.000300\n", "2019-11-22 18:35:38,097 Epoch 10 Step: 48700 Batch Loss: 1.702799 Tokens per Sec: 15093, Lr: 0.000300\n", "2019-11-22 18:35:52,916 Epoch 10 Step: 48800 Batch Loss: 1.780869 Tokens per Sec: 15261, Lr: 0.000300\n", "2019-11-22 18:36:07,693 Epoch 10 Step: 48900 Batch Loss: 1.858241 Tokens per Sec: 15476, Lr: 0.000300\n", "2019-11-22 18:36:22,371 Epoch 10 Step: 49000 Batch Loss: 1.834721 Tokens per Sec: 15649, Lr: 0.000300\n", "2019-11-22 18:37:01,980 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:37:01,980 Saving new checkpoint.\n", "2019-11-22 18:37:02,329 Example #0\n", "2019-11-22 18:37:02,329 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:37:02,329 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:37:02,329 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 18:37:02,329 Example #1\n", "2019-11-22 18:37:02,329 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:37:02,329 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:37:02,330 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:37:02,330 Example #2\n", "2019-11-22 18:37:02,330 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:37:02,330 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:37:02,330 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì níye lórí ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:37:02,330 Example #3\n", "2019-11-22 18:37:02,330 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:37:02,330 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:37:02,331 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Studavy’s of Hébérù àti Chaldee Dictionary ṣe sọ , “ ìfaradà , ìdúróṣinṣin , títí láé , títí láé , nítorí pé ó ti ṣẹlẹ̀ . ”\n", "2019-11-22 18:37:02,331 Validation result (greedy) at epoch 10, step 49000: bleu: 25.10, loss: 48473.3789, ppl: 5.0750, duration: 39.9599s\n", "2019-11-22 18:37:17,282 Epoch 10 Step: 49100 Batch Loss: 1.817355 Tokens per Sec: 15463, Lr: 0.000300\n", "2019-11-22 18:37:32,490 Epoch 10 Step: 49200 Batch Loss: 1.754628 Tokens per Sec: 15191, Lr: 0.000300\n", "2019-11-22 18:37:47,779 Epoch 10 Step: 49300 Batch Loss: 1.765160 Tokens per Sec: 15138, Lr: 0.000300\n", "2019-11-22 18:38:02,827 Epoch 10 Step: 49400 Batch Loss: 1.415619 Tokens per Sec: 15205, Lr: 0.000300\n", "2019-11-22 18:38:18,553 Epoch 10 Step: 49500 Batch Loss: 1.811286 Tokens per Sec: 14950, Lr: 0.000300\n", "2019-11-22 18:38:34,030 Epoch 10 Step: 49600 Batch Loss: 1.591902 Tokens per Sec: 15038, Lr: 0.000300\n", "2019-11-22 18:38:49,153 Epoch 10 Step: 49700 Batch Loss: 1.921869 Tokens per Sec: 15113, Lr: 0.000300\n", "2019-11-22 18:39:04,447 Epoch 10 Step: 49800 Batch Loss: 1.348321 Tokens per Sec: 15445, Lr: 0.000300\n", "2019-11-22 18:39:19,953 Epoch 10 Step: 49900 Batch Loss: 1.820107 Tokens per Sec: 14794, Lr: 0.000300\n", "2019-11-22 18:39:34,963 Epoch 10 Step: 50000 Batch Loss: 1.799530 Tokens per Sec: 15407, Lr: 0.000300\n", "2019-11-22 18:40:14,260 Example #0\n", "2019-11-22 18:40:14,260 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:40:14,260 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:40:14,260 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ kan wà tó ṣàrà ọ̀tọ̀ .\n", "2019-11-22 18:40:14,261 Example #1\n", "2019-11-22 18:40:14,261 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:40:14,261 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:40:14,261 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:40:14,261 Example #2\n", "2019-11-22 18:40:14,261 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:40:14,261 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:40:14,261 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún níye lórí ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:40:14,262 Example #3\n", "2019-11-22 18:40:14,262 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:40:14,262 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:40:14,262 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studer lédè Hébérù àti Chaldee Dictionary , túmọ̀ sí “ jíjẹ́ aláìṣòótọ́ , jíjẹ́ aláìṣòótọ́ , títí láé , nítorí pé kò sí ohun tó burú nínú kéèyàn máa ṣe . ”\n", "2019-11-22 18:40:14,262 Validation result (greedy) at epoch 10, step 50000: bleu: 25.01, loss: 48511.6641, ppl: 5.0816, duration: 39.2985s\n", "2019-11-22 18:40:29,548 Epoch 10 Step: 50100 Batch Loss: 1.843858 Tokens per Sec: 15017, Lr: 0.000300\n", "2019-11-22 18:40:44,445 Epoch 10 Step: 50200 Batch Loss: 1.571574 Tokens per Sec: 15689, Lr: 0.000300\n", "2019-11-22 18:40:59,442 Epoch 10 Step: 50300 Batch Loss: 1.682765 Tokens per Sec: 15724, Lr: 0.000300\n", "2019-11-22 18:41:14,328 Epoch 10 Step: 50400 Batch Loss: 1.721286 Tokens per Sec: 15561, Lr: 0.000300\n", "2019-11-22 18:41:29,753 Epoch 10 Step: 50500 Batch Loss: 1.639337 Tokens per Sec: 14970, Lr: 0.000300\n", "2019-11-22 18:41:44,873 Epoch 10 Step: 50600 Batch Loss: 1.765872 Tokens per Sec: 15206, Lr: 0.000300\n", "2019-11-22 18:42:00,031 Epoch 10 Step: 50700 Batch Loss: 1.723550 Tokens per Sec: 15145, Lr: 0.000300\n", "2019-11-22 18:42:14,633 Epoch 10 Step: 50800 Batch Loss: 1.798711 Tokens per Sec: 15954, Lr: 0.000300\n", "2019-11-22 18:42:29,379 Epoch 10 Step: 50900 Batch Loss: 1.816544 Tokens per Sec: 15669, Lr: 0.000300\n", "2019-11-22 18:42:44,585 Epoch 10 Step: 51000 Batch Loss: 1.710792 Tokens per Sec: 15651, Lr: 0.000300\n", "2019-11-22 18:43:24,063 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:43:24,063 Saving new checkpoint.\n", "2019-11-22 18:43:24,344 Example #0\n", "2019-11-22 18:43:24,345 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:43:24,345 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:43:24,345 \tHypothesis: Ní báyìí , mo ti wá rí ibi tí mo ti ń ṣiṣẹ́ .\n", "2019-11-22 18:43:24,345 Example #1\n", "2019-11-22 18:43:24,345 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:43:24,345 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:43:24,346 \tHypothesis: Ṣé mo mọyì àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn ju ti tẹ́lẹ̀ lọ ?\n", "2019-11-22 18:43:24,346 Example #2\n", "2019-11-22 18:43:24,346 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:43:24,346 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:43:24,346 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:43:24,346 Example #3\n", "2019-11-22 18:43:24,346 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:43:24,347 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:43:24,347 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Students of Greek and Chaldee Dictionary , lédè Gẹ̀ẹ́sì , túmọ̀ sí “ pípààrọ̀ , àìlófin , àti àìlófin , títí láé . ”\n", "2019-11-22 18:43:24,347 Validation result (greedy) at epoch 10, step 51000: bleu: 25.07, loss: 48310.2148, ppl: 5.0474, duration: 39.7620s\n", "2019-11-22 18:43:39,267 Epoch 10 Step: 51100 Batch Loss: 1.815988 Tokens per Sec: 15363, Lr: 0.000300\n", "2019-11-22 18:43:54,250 Epoch 10 Step: 51200 Batch Loss: 1.736729 Tokens per Sec: 15468, Lr: 0.000300\n", "2019-11-22 18:44:09,233 Epoch 10 Step: 51300 Batch Loss: 1.850763 Tokens per Sec: 15017, Lr: 0.000300\n", "2019-11-22 18:44:23,872 Epoch 10 Step: 51400 Batch Loss: 1.842521 Tokens per Sec: 16039, Lr: 0.000300\n", "2019-11-22 18:44:39,291 Epoch 10 Step: 51500 Batch Loss: 1.735334 Tokens per Sec: 15360, Lr: 0.000300\n", "2019-11-22 18:44:54,011 Epoch 10 Step: 51600 Batch Loss: 1.834383 Tokens per Sec: 15536, Lr: 0.000300\n", "2019-11-22 18:45:09,032 Epoch 10 Step: 51700 Batch Loss: 1.924234 Tokens per Sec: 15729, Lr: 0.000300\n", "2019-11-22 18:45:23,990 Epoch 10 Step: 51800 Batch Loss: 1.855218 Tokens per Sec: 15766, Lr: 0.000300\n", "2019-11-22 18:45:38,888 Epoch 10 Step: 51900 Batch Loss: 1.763970 Tokens per Sec: 15703, Lr: 0.000300\n", "2019-11-22 18:45:53,590 Epoch 10 Step: 52000 Batch Loss: 1.742789 Tokens per Sec: 15566, Lr: 0.000300\n", "2019-11-22 18:46:33,006 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:46:33,006 Saving new checkpoint.\n", "2019-11-22 18:46:33,322 Example #0\n", "2019-11-22 18:46:33,323 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:46:33,323 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:46:33,323 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 18:46:33,323 Example #1\n", "2019-11-22 18:46:33,323 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:46:33,323 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:46:33,323 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 18:46:33,323 Example #2\n", "2019-11-22 18:46:33,323 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:46:33,324 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:46:33,324 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń rìn nítòsí rẹ .\n", "2019-11-22 18:46:33,324 Example #3\n", "2019-11-22 18:46:33,324 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:46:33,324 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:46:33,324 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Students of Hébérù àti Chaldee Dictionary , túmọ̀ sí “ pípa ẹ̀yà , ìfaradà , àti ìbàlẹ̀ ọkàn , títí láé , nítorí pé kò sí nǹkan kan . ”\n", "2019-11-22 18:46:33,324 Validation result (greedy) at epoch 10, step 52000: bleu: 24.83, loss: 47913.3438, ppl: 4.9807, duration: 39.7336s\n", "2019-11-22 18:46:47,970 Epoch 10 Step: 52100 Batch Loss: 1.848286 Tokens per Sec: 15387, Lr: 0.000300\n", "2019-11-22 18:47:02,751 Epoch 10 Step: 52200 Batch Loss: 1.931308 Tokens per Sec: 15869, Lr: 0.000300\n", "2019-11-22 18:47:17,487 Epoch 10 Step: 52300 Batch Loss: 1.779812 Tokens per Sec: 15320, Lr: 0.000300\n", "2019-11-22 18:47:32,803 Epoch 10 Step: 52400 Batch Loss: 1.877774 Tokens per Sec: 15174, Lr: 0.000300\n", "2019-11-22 18:47:47,744 Epoch 10 Step: 52500 Batch Loss: 1.814524 Tokens per Sec: 15285, Lr: 0.000300\n", "2019-11-22 18:48:02,751 Epoch 10 Step: 52600 Batch Loss: 1.718752 Tokens per Sec: 15471, Lr: 0.000300\n", "2019-11-22 18:48:14,243 Epoch 10: total training loss 9377.54\n", "2019-11-22 18:48:14,244 EPOCH 11\n", "2019-11-22 18:48:18,346 Epoch 11 Step: 52700 Batch Loss: 1.914444 Tokens per Sec: 12986, Lr: 0.000300\n", "2019-11-22 18:48:33,284 Epoch 11 Step: 52800 Batch Loss: 1.795559 Tokens per Sec: 14897, Lr: 0.000300\n", "2019-11-22 18:48:48,479 Epoch 11 Step: 52900 Batch Loss: 1.619635 Tokens per Sec: 15363, Lr: 0.000300\n", "2019-11-22 18:49:03,571 Epoch 11 Step: 53000 Batch Loss: 1.811428 Tokens per Sec: 15259, Lr: 0.000300\n", "2019-11-22 18:49:43,504 Example #0\n", "2019-11-22 18:49:43,504 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:49:43,505 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:49:43,505 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 18:49:43,505 Example #1\n", "2019-11-22 18:49:43,505 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:49:43,505 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:49:43,505 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 18:49:43,505 Example #2\n", "2019-11-22 18:49:43,506 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:49:43,506 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:49:43,506 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì jẹ́ pé o ò ṣe bẹ́ẹ̀ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:49:43,506 Example #3\n", "2019-11-22 18:49:43,506 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:49:43,506 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:49:43,506 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Stud’s Stud’s and Chaldee Dictionary , Geadh túmọ̀ sí “ ìpọ́njú , ìfòyemọ̀ , àti ìbàjẹ́ , títí láé . ”\n", "2019-11-22 18:49:43,506 Validation result (greedy) at epoch 11, step 53000: bleu: 25.30, loss: 48378.9219, ppl: 5.0590, duration: 39.9355s\n", "2019-11-22 18:49:58,704 Epoch 11 Step: 53100 Batch Loss: 1.774940 Tokens per Sec: 14849, Lr: 0.000300\n", "2019-11-22 18:50:13,745 Epoch 11 Step: 53200 Batch Loss: 1.598310 Tokens per Sec: 15183, Lr: 0.000300\n", "2019-11-22 18:50:28,588 Epoch 11 Step: 53300 Batch Loss: 1.712658 Tokens per Sec: 15488, Lr: 0.000300\n", "2019-11-22 18:50:43,423 Epoch 11 Step: 53400 Batch Loss: 1.643004 Tokens per Sec: 15807, Lr: 0.000300\n", "2019-11-22 18:50:58,265 Epoch 11 Step: 53500 Batch Loss: 1.683958 Tokens per Sec: 15662, Lr: 0.000300\n", "2019-11-22 18:51:13,242 Epoch 11 Step: 53600 Batch Loss: 1.556329 Tokens per Sec: 15221, Lr: 0.000300\n", "2019-11-22 18:51:28,004 Epoch 11 Step: 53700 Batch Loss: 1.651017 Tokens per Sec: 15800, Lr: 0.000300\n", "2019-11-22 18:51:42,501 Epoch 11 Step: 53800 Batch Loss: 2.072875 Tokens per Sec: 15786, Lr: 0.000300\n", "2019-11-22 18:51:57,011 Epoch 11 Step: 53900 Batch Loss: 1.735065 Tokens per Sec: 15967, Lr: 0.000300\n", "2019-11-22 18:52:11,997 Epoch 11 Step: 54000 Batch Loss: 1.692464 Tokens per Sec: 15325, Lr: 0.000300\n", "2019-11-22 18:52:51,914 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:52:51,914 Saving new checkpoint.\n", "2019-11-22 18:52:52,224 Example #0\n", "2019-11-22 18:52:52,224 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:52:52,224 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:52:52,224 \tHypothesis: Ní báyìí , mo ti wá rí i pé mo ti rí iṣẹ́ tó dáa gan - an .\n", "2019-11-22 18:52:52,224 Example #1\n", "2019-11-22 18:52:52,225 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:52:52,225 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:52:52,225 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 18:52:52,225 Example #2\n", "2019-11-22 18:52:52,225 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:52:52,225 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:52:52,225 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì níye lórí ju bó o ṣe ń ṣe , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:52:52,225 Example #3\n", "2019-11-22 18:52:52,226 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:52:52,226 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:52:52,226 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìfaradà , ìfòyemọ̀ , àti àìlábòsí , títí láé . ”\n", "2019-11-22 18:52:52,226 Validation result (greedy) at epoch 11, step 54000: bleu: 25.61, loss: 47877.1602, ppl: 4.9746, duration: 40.2285s\n", "2019-11-22 18:53:07,279 Epoch 11 Step: 54100 Batch Loss: 1.669175 Tokens per Sec: 15474, Lr: 0.000300\n", "2019-11-22 18:53:22,261 Epoch 11 Step: 54200 Batch Loss: 1.657092 Tokens per Sec: 15351, Lr: 0.000300\n", "2019-11-22 18:53:36,918 Epoch 11 Step: 54300 Batch Loss: 1.511358 Tokens per Sec: 15581, Lr: 0.000300\n", "2019-11-22 18:53:51,539 Epoch 11 Step: 54400 Batch Loss: 1.671632 Tokens per Sec: 15841, Lr: 0.000300\n", "2019-11-22 18:54:06,710 Epoch 11 Step: 54500 Batch Loss: 1.807976 Tokens per Sec: 15074, Lr: 0.000300\n", "2019-11-22 18:54:21,564 Epoch 11 Step: 54600 Batch Loss: 1.891510 Tokens per Sec: 15405, Lr: 0.000300\n", "2019-11-22 18:54:36,602 Epoch 11 Step: 54700 Batch Loss: 1.780429 Tokens per Sec: 15734, Lr: 0.000300\n", "2019-11-22 18:54:51,049 Epoch 11 Step: 54800 Batch Loss: 1.876939 Tokens per Sec: 16181, Lr: 0.000300\n", "2019-11-22 18:55:05,473 Epoch 11 Step: 54900 Batch Loss: 1.761483 Tokens per Sec: 16243, Lr: 0.000300\n", "2019-11-22 18:55:20,467 Epoch 11 Step: 55000 Batch Loss: 1.594580 Tokens per Sec: 15530, Lr: 0.000300\n", "2019-11-22 18:55:59,021 Example #0\n", "2019-11-22 18:55:59,021 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:55:59,021 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:55:59,021 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 18:55:59,022 Example #1\n", "2019-11-22 18:55:59,022 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:55:59,022 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:55:59,022 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 18:55:59,022 Example #2\n", "2019-11-22 18:55:59,022 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:55:59,022 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:55:59,023 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún jẹ́ kó o mọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 18:55:59,023 Example #3\n", "2019-11-22 18:55:59,023 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:55:59,023 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:55:59,023 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Stud’s Stud’s Greek and Chaldee Dictionary ṣe sọ , “ ìfaradà , ìfaradà , ìdààmú , àti ìbàlẹ̀ ọkàn . ”\n", "2019-11-22 18:55:59,023 Validation result (greedy) at epoch 11, step 55000: bleu: 25.20, loss: 47916.1875, ppl: 4.9812, duration: 38.5560s\n", "2019-11-22 18:56:13,945 Epoch 11 Step: 55100 Batch Loss: 1.667538 Tokens per Sec: 15791, Lr: 0.000300\n", "2019-11-22 18:56:28,949 Epoch 11 Step: 55200 Batch Loss: 1.910728 Tokens per Sec: 15668, Lr: 0.000300\n", "2019-11-22 18:56:43,861 Epoch 11 Step: 55300 Batch Loss: 1.697156 Tokens per Sec: 15347, Lr: 0.000300\n", "2019-11-22 18:56:57,905 Epoch 11 Step: 55400 Batch Loss: 1.795330 Tokens per Sec: 16362, Lr: 0.000300\n", "2019-11-22 18:57:12,874 Epoch 11 Step: 55500 Batch Loss: 1.865149 Tokens per Sec: 15434, Lr: 0.000300\n", "2019-11-22 18:57:27,956 Epoch 11 Step: 55600 Batch Loss: 1.751371 Tokens per Sec: 15610, Lr: 0.000300\n", "2019-11-22 18:57:42,814 Epoch 11 Step: 55700 Batch Loss: 1.901042 Tokens per Sec: 15428, Lr: 0.000300\n", "2019-11-22 18:57:57,569 Epoch 11 Step: 55800 Batch Loss: 1.791068 Tokens per Sec: 15647, Lr: 0.000300\n", "2019-11-22 18:58:11,910 Epoch 11 Step: 55900 Batch Loss: 1.719673 Tokens per Sec: 16268, Lr: 0.000300\n", "2019-11-22 18:58:26,535 Epoch 11 Step: 56000 Batch Loss: 1.555165 Tokens per Sec: 15763, Lr: 0.000300\n", "2019-11-22 18:59:05,623 Hooray! New best validation result [ppl]!\n", "2019-11-22 18:59:05,624 Saving new checkpoint.\n", "2019-11-22 18:59:05,975 Example #0\n", "2019-11-22 18:59:05,976 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 18:59:05,976 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 18:59:05,976 \tHypothesis: Ní báyìí , mo ti wá rí i pé mo ti rí i pé iṣẹ́ tó dáa gan - an ni .\n", "2019-11-22 18:59:05,976 Example #1\n", "2019-11-22 18:59:05,976 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 18:59:05,976 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 18:59:05,976 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 18:59:05,976 Example #2\n", "2019-11-22 18:59:05,976 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 18:59:05,976 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 18:59:05,977 \tHypothesis: Ó ní ìrírí tó pọ̀ ju èyí tó o lè ṣe lọ , àmọ́ ó ń fi sùúrù rìn jìnnà sí ọ .\n", "2019-11-22 18:59:05,977 Example #3\n", "2019-11-22 18:59:05,977 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 18:59:05,977 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 18:59:05,977 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Harkavy’s Stud’s Bible and Chaldee Dictionary , túmọ̀ sí “ pípààrọ̀ , àìlófin , àti àìlábòsí , títí láé . ”\n", "2019-11-22 18:59:05,977 Validation result (greedy) at epoch 11, step 56000: bleu: 25.67, loss: 47479.3398, ppl: 4.9088, duration: 39.4422s\n", "2019-11-22 18:59:20,847 Epoch 11 Step: 56100 Batch Loss: 1.646805 Tokens per Sec: 15527, Lr: 0.000300\n", "2019-11-22 18:59:35,619 Epoch 11 Step: 56200 Batch Loss: 1.760223 Tokens per Sec: 15712, Lr: 0.000300\n", "2019-11-22 18:59:50,654 Epoch 11 Step: 56300 Batch Loss: 1.720318 Tokens per Sec: 15060, Lr: 0.000300\n", "2019-11-22 19:00:05,217 Epoch 11 Step: 56400 Batch Loss: 1.903985 Tokens per Sec: 16161, Lr: 0.000300\n", "2019-11-22 19:00:20,062 Epoch 11 Step: 56500 Batch Loss: 1.905734 Tokens per Sec: 15631, Lr: 0.000300\n", "2019-11-22 19:00:35,000 Epoch 11 Step: 56600 Batch Loss: 1.561795 Tokens per Sec: 15347, Lr: 0.000300\n", "2019-11-22 19:00:50,239 Epoch 11 Step: 56700 Batch Loss: 1.912502 Tokens per Sec: 15143, Lr: 0.000300\n", "2019-11-22 19:01:04,664 Epoch 11 Step: 56800 Batch Loss: 1.630125 Tokens per Sec: 16145, Lr: 0.000300\n", "2019-11-22 19:01:19,546 Epoch 11 Step: 56900 Batch Loss: 1.825897 Tokens per Sec: 15769, Lr: 0.000300\n", "2019-11-22 19:01:34,638 Epoch 11 Step: 57000 Batch Loss: 2.254814 Tokens per Sec: 15392, Lr: 0.000300\n", "2019-11-22 19:02:13,286 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:02:13,287 Saving new checkpoint.\n", "2019-11-22 19:02:13,598 Example #0\n", "2019-11-22 19:02:13,598 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:02:13,599 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:02:13,599 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 19:02:13,599 Example #1\n", "2019-11-22 19:02:13,599 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:02:13,599 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:02:13,599 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 19:02:13,599 Example #2\n", "2019-11-22 19:02:13,599 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:02:13,599 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:02:13,599 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì ní ìwọ̀n tó pọ̀ ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:02:13,600 Example #3\n", "2019-11-22 19:02:13,600 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:02:13,600 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:02:13,600 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studavy’s Bible and Chaldee Dictionary , túmọ̀ sí “ pípa òfin , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 19:02:13,600 Validation result (greedy) at epoch 11, step 57000: bleu: 25.33, loss: 47404.7852, ppl: 4.8965, duration: 38.9613s\n", "2019-11-22 19:02:27,891 Epoch 11 Step: 57100 Batch Loss: 1.345546 Tokens per Sec: 16222, Lr: 0.000300\n", "2019-11-22 19:02:41,875 Epoch 11 Step: 57200 Batch Loss: 1.266994 Tokens per Sec: 16536, Lr: 0.000300\n", "2019-11-22 19:02:56,240 Epoch 11 Step: 57300 Batch Loss: 1.789008 Tokens per Sec: 16184, Lr: 0.000300\n", "2019-11-22 19:03:11,116 Epoch 11 Step: 57400 Batch Loss: 1.859717 Tokens per Sec: 15558, Lr: 0.000300\n", "2019-11-22 19:03:25,648 Epoch 11 Step: 57500 Batch Loss: 1.730389 Tokens per Sec: 15852, Lr: 0.000300\n", "2019-11-22 19:03:40,342 Epoch 11 Step: 57600 Batch Loss: 1.763251 Tokens per Sec: 15926, Lr: 0.000300\n", "2019-11-22 19:03:54,885 Epoch 11 Step: 57700 Batch Loss: 1.834607 Tokens per Sec: 15745, Lr: 0.000300\n", "2019-11-22 19:04:09,428 Epoch 11 Step: 57800 Batch Loss: 1.602325 Tokens per Sec: 15321, Lr: 0.000300\n", "2019-11-22 19:04:24,598 Epoch 11 Step: 57900 Batch Loss: 1.700489 Tokens per Sec: 15938, Lr: 0.000300\n", "2019-11-22 19:04:31,857 Epoch 11: total training loss 9231.91\n", "2019-11-22 19:04:31,857 EPOCH 12\n", "2019-11-22 19:04:40,150 Epoch 12 Step: 58000 Batch Loss: 1.750925 Tokens per Sec: 14184, Lr: 0.000300\n", "2019-11-22 19:05:19,042 Example #0\n", "2019-11-22 19:05:19,043 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:05:19,043 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:05:19,043 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó ń mówó wọlé fún mi .\n", "2019-11-22 19:05:19,043 Example #1\n", "2019-11-22 19:05:19,043 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:05:19,043 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:05:19,043 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 19:05:19,044 Example #2\n", "2019-11-22 19:05:19,044 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:05:19,044 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:05:19,044 \tHypothesis: Ó ti ní ìrírí tó pọ̀ tó , ó sì ti ṣe ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:05:19,044 Example #3\n", "2019-11-22 19:05:19,044 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:05:19,044 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:05:19,045 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s the Greek and Chaldee Dictionary ṣe sọ , ohun tí ìwé atúmọ̀ èdè náà túmọ̀ sí ni “ pípa , ìbàlẹ̀ , àti ìbàlẹ̀ ọkàn , títí láé . ”\n", "2019-11-22 19:05:19,045 Validation result (greedy) at epoch 12, step 58000: bleu: 25.58, loss: 47421.2305, ppl: 4.8992, duration: 38.8942s\n", "2019-11-22 19:05:33,851 Epoch 12 Step: 58100 Batch Loss: 1.770721 Tokens per Sec: 15658, Lr: 0.000300\n", "2019-11-22 19:05:48,514 Epoch 12 Step: 58200 Batch Loss: 1.698592 Tokens per Sec: 15650, Lr: 0.000300\n", "2019-11-22 19:06:02,818 Epoch 12 Step: 58300 Batch Loss: 1.682937 Tokens per Sec: 16096, Lr: 0.000300\n", "2019-11-22 19:06:17,488 Epoch 12 Step: 58400 Batch Loss: 1.755842 Tokens per Sec: 15835, Lr: 0.000300\n", "2019-11-22 19:06:32,540 Epoch 12 Step: 58500 Batch Loss: 1.698979 Tokens per Sec: 15475, Lr: 0.000300\n", "2019-11-22 19:06:47,454 Epoch 12 Step: 58600 Batch Loss: 1.801945 Tokens per Sec: 15562, Lr: 0.000300\n", "2019-11-22 19:07:02,239 Epoch 12 Step: 58700 Batch Loss: 1.694300 Tokens per Sec: 15976, Lr: 0.000300\n", "2019-11-22 19:07:17,009 Epoch 12 Step: 58800 Batch Loss: 1.814037 Tokens per Sec: 15571, Lr: 0.000300\n", "2019-11-22 19:07:31,409 Epoch 12 Step: 58900 Batch Loss: 1.402122 Tokens per Sec: 15955, Lr: 0.000300\n", "2019-11-22 19:07:46,351 Epoch 12 Step: 59000 Batch Loss: 1.808490 Tokens per Sec: 15651, Lr: 0.000300\n", "2019-11-22 19:08:25,201 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:08:25,201 Saving new checkpoint.\n", "2019-11-22 19:08:25,523 Example #0\n", "2019-11-22 19:08:25,524 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:08:25,526 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:08:25,526 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó ń mówó wọlé fún mi .\n", "2019-11-22 19:08:25,526 Example #1\n", "2019-11-22 19:08:25,526 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:08:25,526 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:08:25,527 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 19:08:25,527 Example #2\n", "2019-11-22 19:08:25,527 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:08:25,527 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:08:25,527 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì níye lórí ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:08:25,527 Example #3\n", "2019-11-22 19:08:25,528 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:08:25,531 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:08:25,531 \tHypothesis: Gẹ́gẹ́ bí ìwé Harkavy’s Students of Greek and Chaldee Dictionary , © ʽadh túmọ̀ sí “ ìpọ́njú , ìfaradà , ìfaradà , títí láé , nítorí pé kò sí ohun tó lè ṣẹlẹ̀ . ”\n", "2019-11-22 19:08:25,531 Validation result (greedy) at epoch 12, step 59000: bleu: 25.77, loss: 47140.6055, ppl: 4.8534, duration: 39.1793s\n", "2019-11-22 19:08:40,350 Epoch 12 Step: 59100 Batch Loss: 1.723609 Tokens per Sec: 15529, Lr: 0.000300\n", "2019-11-22 19:08:55,145 Epoch 12 Step: 59200 Batch Loss: 1.835646 Tokens per Sec: 15637, Lr: 0.000300\n", "2019-11-22 19:09:09,824 Epoch 12 Step: 59300 Batch Loss: 1.566213 Tokens per Sec: 15597, Lr: 0.000300\n", "2019-11-22 19:09:24,583 Epoch 12 Step: 59400 Batch Loss: 1.749001 Tokens per Sec: 15398, Lr: 0.000300\n", "2019-11-22 19:09:39,203 Epoch 12 Step: 59500 Batch Loss: 2.370618 Tokens per Sec: 15634, Lr: 0.000300\n", "2019-11-22 19:09:54,144 Epoch 12 Step: 59600 Batch Loss: 1.703353 Tokens per Sec: 15494, Lr: 0.000300\n", "2019-11-22 19:10:08,542 Epoch 12 Step: 59700 Batch Loss: 1.680543 Tokens per Sec: 15692, Lr: 0.000300\n", "2019-11-22 19:10:23,262 Epoch 12 Step: 59800 Batch Loss: 1.657824 Tokens per Sec: 15757, Lr: 0.000300\n", "2019-11-22 19:10:37,840 Epoch 12 Step: 59900 Batch Loss: 1.731945 Tokens per Sec: 15929, Lr: 0.000300\n", "2019-11-22 19:10:52,592 Epoch 12 Step: 60000 Batch Loss: 1.674283 Tokens per Sec: 15778, Lr: 0.000300\n", "2019-11-22 19:11:31,407 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:11:31,407 Saving new checkpoint.\n", "2019-11-22 19:11:31,706 Example #0\n", "2019-11-22 19:11:31,707 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:11:31,707 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:11:31,707 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dáa gan - an .\n", "2019-11-22 19:11:31,707 Example #1\n", "2019-11-22 19:11:31,707 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:11:31,707 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:11:31,707 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 19:11:31,707 Example #2\n", "2019-11-22 19:11:31,707 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:11:31,708 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:11:31,708 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì ń fani mọ́ra ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:11:31,708 Example #3\n", "2019-11-22 19:11:31,708 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:11:31,708 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:11:31,708 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Students of Greek and Chaldee Dictionary ṣe sọ , ẹ̀mí túmọ̀ sí “ ìpọ́njú , ìfaradà , ìbàjẹ́ , títí láé , títí láé . ”\n", "2019-11-22 19:11:31,708 Validation result (greedy) at epoch 12, step 60000: bleu: 25.54, loss: 47128.0195, ppl: 4.8513, duration: 39.1159s\n", "2019-11-22 19:11:46,774 Epoch 12 Step: 60100 Batch Loss: 2.011400 Tokens per Sec: 15535, Lr: 0.000300\n", "2019-11-22 19:12:01,290 Epoch 12 Step: 60200 Batch Loss: 1.612499 Tokens per Sec: 16160, Lr: 0.000300\n", "2019-11-22 19:12:16,142 Epoch 12 Step: 60300 Batch Loss: 1.796610 Tokens per Sec: 15611, Lr: 0.000300\n", "2019-11-22 19:12:30,746 Epoch 12 Step: 60400 Batch Loss: 1.535006 Tokens per Sec: 16004, Lr: 0.000300\n", "2019-11-22 19:12:45,478 Epoch 12 Step: 60500 Batch Loss: 1.757887 Tokens per Sec: 15811, Lr: 0.000300\n", "2019-11-22 19:13:00,581 Epoch 12 Step: 60600 Batch Loss: 1.613712 Tokens per Sec: 15472, Lr: 0.000300\n", "2019-11-22 19:13:15,328 Epoch 12 Step: 60700 Batch Loss: 1.748634 Tokens per Sec: 15115, Lr: 0.000300\n", "2019-11-22 19:13:30,192 Epoch 12 Step: 60800 Batch Loss: 1.534616 Tokens per Sec: 15582, Lr: 0.000300\n", "2019-11-22 19:13:45,084 Epoch 12 Step: 60900 Batch Loss: 1.766616 Tokens per Sec: 15555, Lr: 0.000300\n", "2019-11-22 19:13:59,599 Epoch 12 Step: 61000 Batch Loss: 1.923884 Tokens per Sec: 15720, Lr: 0.000300\n", "2019-11-22 19:14:38,379 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:14:38,379 Saving new checkpoint.\n", "2019-11-22 19:14:38,697 Example #0\n", "2019-11-22 19:14:38,697 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:14:38,698 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:14:38,698 \tHypothesis: Mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 19:14:38,698 Example #1\n", "2019-11-22 19:14:38,698 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:14:38,698 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:14:38,698 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 19:14:38,698 Example #2\n", "2019-11-22 19:14:38,698 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:14:38,698 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:14:38,698 \tHypothesis: Ó ti ní ìrírí tó pọ̀ tó sì ti kọjá ohun tó o ṣe , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:14:38,699 Example #3\n", "2019-11-22 19:14:38,699 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:14:38,699 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:14:38,699 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , Geradh túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbàkígbà rí . ”\n", "2019-11-22 19:14:38,699 Validation result (greedy) at epoch 12, step 61000: bleu: 25.88, loss: 46893.8555, ppl: 4.8134, duration: 39.0996s\n", "2019-11-22 19:14:52,888 Epoch 12 Step: 61100 Batch Loss: 1.528000 Tokens per Sec: 15967, Lr: 0.000300\n", "2019-11-22 19:15:07,137 Epoch 12 Step: 61200 Batch Loss: 1.857489 Tokens per Sec: 16271, Lr: 0.000300\n", "2019-11-22 19:15:21,311 Epoch 12 Step: 61300 Batch Loss: 1.581496 Tokens per Sec: 16600, Lr: 0.000300\n", "2019-11-22 19:15:35,949 Epoch 12 Step: 61400 Batch Loss: 1.683292 Tokens per Sec: 15686, Lr: 0.000300\n", "2019-11-22 19:15:50,293 Epoch 12 Step: 61500 Batch Loss: 1.801144 Tokens per Sec: 16043, Lr: 0.000300\n", "2019-11-22 19:16:05,134 Epoch 12 Step: 61600 Batch Loss: 1.852965 Tokens per Sec: 15456, Lr: 0.000300\n", "2019-11-22 19:16:20,228 Epoch 12 Step: 61700 Batch Loss: 1.703704 Tokens per Sec: 15421, Lr: 0.000300\n", "2019-11-22 19:16:35,017 Epoch 12 Step: 61800 Batch Loss: 1.578313 Tokens per Sec: 15872, Lr: 0.000300\n", "2019-11-22 19:16:49,891 Epoch 12 Step: 61900 Batch Loss: 1.665675 Tokens per Sec: 15424, Lr: 0.000300\n", "2019-11-22 19:17:04,337 Epoch 12 Step: 62000 Batch Loss: 1.722660 Tokens per Sec: 16210, Lr: 0.000300\n", "2019-11-22 19:17:42,580 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:17:42,581 Saving new checkpoint.\n", "2019-11-22 19:17:42,903 Example #0\n", "2019-11-22 19:17:42,903 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:17:42,903 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:17:42,903 \tHypothesis: Ní báyìí , mo ní láti rí i pé iṣẹ́ tó dára ni mò ń ṣe .\n", "2019-11-22 19:17:42,903 Example #1\n", "2019-11-22 19:17:42,903 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:17:42,904 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:17:42,904 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 19:17:42,904 Example #2\n", "2019-11-22 19:17:42,904 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:17:42,904 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:17:42,904 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún nírètí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:17:42,904 Example #3\n", "2019-11-22 19:17:42,904 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:17:42,904 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:17:42,904 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Hébérù àti Chaldee Dictionary ṣe sọ , ohun tí Harkavy’s Studer túmọ̀ sí ni “ ìpele , ìfaradà , ìfaradà , títí láé , nítorí pé kò sí àní - àní . ”\n", "2019-11-22 19:17:42,905 Validation result (greedy) at epoch 12, step 62000: bleu: 25.99, loss: 46816.6875, ppl: 4.8010, duration: 38.5675s\n", "2019-11-22 19:17:57,439 Epoch 12 Step: 62100 Batch Loss: 1.698500 Tokens per Sec: 15820, Lr: 0.000300\n", "2019-11-22 19:18:12,358 Epoch 12 Step: 62200 Batch Loss: 1.479498 Tokens per Sec: 15336, Lr: 0.000300\n", "2019-11-22 19:18:27,283 Epoch 12 Step: 62300 Batch Loss: 1.628729 Tokens per Sec: 15284, Lr: 0.000300\n", "2019-11-22 19:18:42,584 Epoch 12 Step: 62400 Batch Loss: 1.652984 Tokens per Sec: 15175, Lr: 0.000300\n", "2019-11-22 19:18:57,251 Epoch 12 Step: 62500 Batch Loss: 1.785494 Tokens per Sec: 15799, Lr: 0.000300\n", "2019-11-22 19:19:11,880 Epoch 12 Step: 62600 Batch Loss: 1.926193 Tokens per Sec: 16584, Lr: 0.000300\n", "2019-11-22 19:19:26,530 Epoch 12 Step: 62700 Batch Loss: 1.704757 Tokens per Sec: 15498, Lr: 0.000300\n", "2019-11-22 19:19:41,387 Epoch 12 Step: 62800 Batch Loss: 1.768614 Tokens per Sec: 15319, Lr: 0.000300\n", "2019-11-22 19:19:56,302 Epoch 12 Step: 62900 Batch Loss: 1.812778 Tokens per Sec: 15526, Lr: 0.000300\n", "2019-11-22 19:20:10,701 Epoch 12 Step: 63000 Batch Loss: 1.904573 Tokens per Sec: 16392, Lr: 0.000300\n", "2019-11-22 19:20:48,680 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:20:48,680 Saving new checkpoint.\n", "2019-11-22 19:20:48,975 Example #0\n", "2019-11-22 19:20:48,975 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:20:48,975 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:20:48,975 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 19:20:48,975 Example #1\n", "2019-11-22 19:20:48,976 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:20:48,976 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:20:48,976 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 19:20:48,976 Example #2\n", "2019-11-22 19:20:48,976 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:20:48,976 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:20:48,976 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì ń gbé yín ró ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:20:48,976 Example #3\n", "2019-11-22 19:20:48,976 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:20:48,976 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:20:48,976 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Hébérù àti Chaldee Dictionary ṣe sọ , ohun tí wọ́n pè ní “ ìpele , ìfarapamọ́ra , ìfaradà , títí láé , nítorí pé kò sí nǹkan kan tó lè ṣẹlẹ̀ . ”\n", "2019-11-22 19:20:48,977 Validation result (greedy) at epoch 12, step 63000: bleu: 26.13, loss: 46565.4492, ppl: 4.7607, duration: 38.2749s\n", "2019-11-22 19:21:03,328 Epoch 12 Step: 63100 Batch Loss: 1.542762 Tokens per Sec: 16042, Lr: 0.000300\n", "2019-11-22 19:21:17,763 Epoch 12 Step: 63200 Batch Loss: 1.605413 Tokens per Sec: 15932, Lr: 0.000300\n", "2019-11-22 19:21:20,660 Epoch 12: total training loss 9097.68\n", "2019-11-22 19:21:20,660 EPOCH 13\n", "2019-11-22 19:21:33,303 Epoch 13 Step: 63300 Batch Loss: 1.726799 Tokens per Sec: 14899, Lr: 0.000300\n", "2019-11-22 19:21:48,193 Epoch 13 Step: 63400 Batch Loss: 1.669171 Tokens per Sec: 15315, Lr: 0.000300\n", "2019-11-22 19:22:03,217 Epoch 13 Step: 63500 Batch Loss: 1.652845 Tokens per Sec: 15092, Lr: 0.000300\n", "2019-11-22 19:22:17,707 Epoch 13 Step: 63600 Batch Loss: 1.690845 Tokens per Sec: 15997, Lr: 0.000300\n", "2019-11-22 19:22:32,597 Epoch 13 Step: 63700 Batch Loss: 1.829689 Tokens per Sec: 15750, Lr: 0.000300\n", "2019-11-22 19:22:47,777 Epoch 13 Step: 63800 Batch Loss: 1.456030 Tokens per Sec: 15512, Lr: 0.000300\n", "2019-11-22 19:23:02,457 Epoch 13 Step: 63900 Batch Loss: 1.741482 Tokens per Sec: 15464, Lr: 0.000300\n", "2019-11-22 19:23:17,093 Epoch 13 Step: 64000 Batch Loss: 1.754203 Tokens per Sec: 16086, Lr: 0.000300\n", "2019-11-22 19:23:56,026 Example #0\n", "2019-11-22 19:23:56,026 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:23:56,026 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:23:56,026 \tHypothesis: Ní báyìí , mo ní láti rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 19:23:56,027 Example #1\n", "2019-11-22 19:23:56,027 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:23:56,027 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:23:56,027 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 19:23:56,027 Example #2\n", "2019-11-22 19:23:56,027 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:23:56,027 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:23:56,028 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ń gbé ìgbésẹ̀ tó ga ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:23:56,028 Example #3\n", "2019-11-22 19:23:56,028 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:23:56,028 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:23:56,028 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s Stud’s and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ìṣesí , ìfaradà , títí láé , nítorí pé ó ti pẹ́ . ”\n", "2019-11-22 19:23:56,028 Validation result (greedy) at epoch 13, step 64000: bleu: 26.11, loss: 46685.0742, ppl: 4.7798, duration: 38.9347s\n", "2019-11-22 19:24:10,403 Epoch 13 Step: 64100 Batch Loss: 1.911896 Tokens per Sec: 16310, Lr: 0.000300\n", "2019-11-22 19:24:24,811 Epoch 13 Step: 64200 Batch Loss: 1.881376 Tokens per Sec: 15808, Lr: 0.000300\n", "2019-11-22 19:24:39,663 Epoch 13 Step: 64300 Batch Loss: 1.854874 Tokens per Sec: 15475, Lr: 0.000300\n", "2019-11-22 19:24:54,621 Epoch 13 Step: 64400 Batch Loss: 1.692084 Tokens per Sec: 15191, Lr: 0.000300\n", "2019-11-22 19:25:09,451 Epoch 13 Step: 64500 Batch Loss: 1.624424 Tokens per Sec: 15880, Lr: 0.000300\n", "2019-11-22 19:25:24,600 Epoch 13 Step: 64600 Batch Loss: 1.801361 Tokens per Sec: 15211, Lr: 0.000300\n", "2019-11-22 19:25:39,290 Epoch 13 Step: 64700 Batch Loss: 1.800556 Tokens per Sec: 16072, Lr: 0.000300\n", "2019-11-22 19:25:53,970 Epoch 13 Step: 64800 Batch Loss: 1.707783 Tokens per Sec: 15173, Lr: 0.000300\n", "2019-11-22 19:26:08,835 Epoch 13 Step: 64900 Batch Loss: 1.763811 Tokens per Sec: 15498, Lr: 0.000300\n", "2019-11-22 19:26:23,601 Epoch 13 Step: 65000 Batch Loss: 1.690284 Tokens per Sec: 15884, Lr: 0.000300\n", "2019-11-22 19:27:02,712 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:27:02,712 Saving new checkpoint.\n", "2019-11-22 19:27:03,047 Example #0\n", "2019-11-22 19:27:03,048 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:27:03,048 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:27:03,048 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 19:27:03,048 Example #1\n", "2019-11-22 19:27:03,048 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:27:03,048 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:27:03,049 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 19:27:03,049 Example #2\n", "2019-11-22 19:27:03,049 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:27:03,049 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:27:03,049 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:27:03,049 Example #3\n", "2019-11-22 19:27:03,050 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:27:03,050 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:27:03,050 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Students of Hebrew and Chaldee Dictionary ṣe sọ , ẹ̀mí Jèhóáṣì túmọ̀ sí “ pípa , ìfòyemọ̀ , títí láé , títí láé . ”\n", "2019-11-22 19:27:03,050 Validation result (greedy) at epoch 13, step 65000: bleu: 26.51, loss: 46518.2031, ppl: 4.7532, duration: 39.4479s\n", "2019-11-22 19:27:17,687 Epoch 13 Step: 65100 Batch Loss: 1.728072 Tokens per Sec: 15667, Lr: 0.000300\n", "2019-11-22 19:27:32,347 Epoch 13 Step: 65200 Batch Loss: 1.965157 Tokens per Sec: 15413, Lr: 0.000300\n", "2019-11-22 19:27:46,736 Epoch 13 Step: 65300 Batch Loss: 1.816453 Tokens per Sec: 16111, Lr: 0.000300\n", "2019-11-22 19:28:01,326 Epoch 13 Step: 65400 Batch Loss: 1.687267 Tokens per Sec: 16148, Lr: 0.000300\n", "2019-11-22 19:28:16,085 Epoch 13 Step: 65500 Batch Loss: 1.597811 Tokens per Sec: 15928, Lr: 0.000300\n", "2019-11-22 19:28:30,857 Epoch 13 Step: 65600 Batch Loss: 1.618564 Tokens per Sec: 15803, Lr: 0.000300\n", "2019-11-22 19:28:45,642 Epoch 13 Step: 65700 Batch Loss: 1.784943 Tokens per Sec: 15926, Lr: 0.000300\n", "2019-11-22 19:28:59,889 Epoch 13 Step: 65800 Batch Loss: 1.800314 Tokens per Sec: 15861, Lr: 0.000300\n", "2019-11-22 19:29:14,429 Epoch 13 Step: 65900 Batch Loss: 1.927365 Tokens per Sec: 16146, Lr: 0.000300\n", "2019-11-22 19:29:28,654 Epoch 13 Step: 66000 Batch Loss: 1.862185 Tokens per Sec: 15943, Lr: 0.000300\n", "2019-11-22 19:30:07,291 Example #0\n", "2019-11-22 19:30:07,291 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:30:07,291 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:30:07,291 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 19:30:07,292 Example #1\n", "2019-11-22 19:30:07,292 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:30:07,292 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:30:07,292 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara tí mo ní pẹ̀lú Jèhófà àti àwọn èèyàn ?\n", "2019-11-22 19:30:07,292 Example #2\n", "2019-11-22 19:30:07,292 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:30:07,292 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:30:07,292 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì ń fọgbọ́n rìn nítòsí rẹ .\n", "2019-11-22 19:30:07,293 Example #3\n", "2019-11-22 19:30:07,293 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:30:07,293 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:30:07,293 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , “ ìpalára , ìfòyemọ̀ , àti ìwà àìlófin , títí láé , nítorí pé ó ti di bárakú . ”\n", "2019-11-22 19:30:07,293 Validation result (greedy) at epoch 13, step 66000: bleu: 25.84, loss: 46568.3125, ppl: 4.7612, duration: 38.6392s\n", "2019-11-22 19:30:21,803 Epoch 13 Step: 66100 Batch Loss: 1.665885 Tokens per Sec: 16307, Lr: 0.000300\n", "2019-11-22 19:30:35,921 Epoch 13 Step: 66200 Batch Loss: 1.744151 Tokens per Sec: 16690, Lr: 0.000300\n", "2019-11-22 19:30:50,784 Epoch 13 Step: 66300 Batch Loss: 1.697231 Tokens per Sec: 15538, Lr: 0.000300\n", "2019-11-22 19:31:05,180 Epoch 13 Step: 66400 Batch Loss: 1.738222 Tokens per Sec: 15732, Lr: 0.000300\n", "2019-11-22 19:31:19,959 Epoch 13 Step: 66500 Batch Loss: 1.757660 Tokens per Sec: 15556, Lr: 0.000300\n", "2019-11-22 19:31:34,971 Epoch 13 Step: 66600 Batch Loss: 1.763628 Tokens per Sec: 15317, Lr: 0.000300\n", "2019-11-22 19:31:49,345 Epoch 13 Step: 66700 Batch Loss: 1.570760 Tokens per Sec: 16333, Lr: 0.000300\n", "2019-11-22 19:32:03,914 Epoch 13 Step: 66800 Batch Loss: 1.868588 Tokens per Sec: 16088, Lr: 0.000300\n", "2019-11-22 19:32:18,351 Epoch 13 Step: 66900 Batch Loss: 1.456978 Tokens per Sec: 15868, Lr: 0.000300\n", "2019-11-22 19:32:32,867 Epoch 13 Step: 67000 Batch Loss: 1.680600 Tokens per Sec: 15972, Lr: 0.000300\n", "2019-11-22 19:33:12,277 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:33:12,277 Saving new checkpoint.\n", "2019-11-22 19:33:12,564 Example #0\n", "2019-11-22 19:33:12,565 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:33:12,566 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:33:12,566 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 19:33:12,566 Example #1\n", "2019-11-22 19:33:12,566 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:33:12,567 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:33:12,567 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 19:33:12,567 Example #2\n", "2019-11-22 19:33:12,567 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:33:12,567 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:33:12,568 \tHypothesis: Ó ní ìrírí àti ìjákulẹ̀ ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:33:12,568 Example #3\n", "2019-11-22 19:33:12,568 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:33:12,568 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:33:12,568 \tHypothesis: Gẹ́gẹ́ bí ìwé Harkavy’s Stud’s Stud’s Bible and Chaldee Dictionary ṣe sọ , “ ìpele , ìfọ̀kànbalẹ̀ , àti ìpele ayérayé , nítorí pé kò sí àní - àní . ”\n", "2019-11-22 19:33:12,569 Validation result (greedy) at epoch 13, step 67000: bleu: 25.55, loss: 46256.2617, ppl: 4.7117, duration: 39.7009s\n", "2019-11-22 19:33:27,401 Epoch 13 Step: 67100 Batch Loss: 1.877455 Tokens per Sec: 15169, Lr: 0.000300\n", "2019-11-22 19:33:42,234 Epoch 13 Step: 67200 Batch Loss: 1.683302 Tokens per Sec: 15457, Lr: 0.000300\n", "2019-11-22 19:33:56,735 Epoch 13 Step: 67300 Batch Loss: 1.682717 Tokens per Sec: 16080, Lr: 0.000300\n", "2019-11-22 19:34:11,134 Epoch 13 Step: 67400 Batch Loss: 1.671041 Tokens per Sec: 16165, Lr: 0.000300\n", "2019-11-22 19:34:25,617 Epoch 13 Step: 67500 Batch Loss: 1.695073 Tokens per Sec: 15721, Lr: 0.000300\n", "2019-11-22 19:34:40,100 Epoch 13 Step: 67600 Batch Loss: 1.758677 Tokens per Sec: 15616, Lr: 0.000300\n", "2019-11-22 19:34:54,570 Epoch 13 Step: 67700 Batch Loss: 1.954269 Tokens per Sec: 16248, Lr: 0.000300\n", "2019-11-22 19:35:09,252 Epoch 13 Step: 67800 Batch Loss: 1.893522 Tokens per Sec: 16034, Lr: 0.000300\n", "2019-11-22 19:35:24,308 Epoch 13 Step: 67900 Batch Loss: 1.693724 Tokens per Sec: 15593, Lr: 0.000300\n", "2019-11-22 19:35:39,318 Epoch 13 Step: 68000 Batch Loss: 1.609221 Tokens per Sec: 15500, Lr: 0.000300\n", "2019-11-22 19:36:18,511 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:36:18,512 Saving new checkpoint.\n", "2019-11-22 19:36:18,817 Example #0\n", "2019-11-22 19:36:18,817 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:36:18,817 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:36:18,818 \tHypothesis: Ní báyìí , mo ti wá rí i pé mo ti rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 19:36:18,818 Example #1\n", "2019-11-22 19:36:18,818 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:36:18,818 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:36:18,818 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 19:36:18,818 Example #2\n", "2019-11-22 19:36:18,818 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:36:18,819 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:36:18,819 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó pọ̀ ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:36:18,819 Example #3\n", "2019-11-22 19:36:18,819 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:36:18,819 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:36:18,819 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , “ pípa ara pọ̀ , àìlábòsí , títí ayérayé , fún ìgbà kankan . ”\n", "2019-11-22 19:36:18,819 Validation result (greedy) at epoch 13, step 68000: bleu: 25.99, loss: 46204.2734, ppl: 4.7035, duration: 39.5010s\n", "2019-11-22 19:36:33,764 Epoch 13 Step: 68100 Batch Loss: 1.847595 Tokens per Sec: 15404, Lr: 0.000300\n", "2019-11-22 19:36:47,798 Epoch 13 Step: 68200 Batch Loss: 1.784470 Tokens per Sec: 16191, Lr: 0.000300\n", "2019-11-22 19:37:02,069 Epoch 13 Step: 68300 Batch Loss: 1.658668 Tokens per Sec: 16470, Lr: 0.000300\n", "2019-11-22 19:37:16,243 Epoch 13 Step: 68400 Batch Loss: 1.703142 Tokens per Sec: 15889, Lr: 0.000300\n", "2019-11-22 19:37:29,293 Epoch 13: total training loss 8987.16\n", "2019-11-22 19:37:29,293 EPOCH 14\n", "2019-11-22 19:37:31,279 Epoch 14 Step: 68500 Batch Loss: 1.761404 Tokens per Sec: 10716, Lr: 0.000300\n", "2019-11-22 19:37:46,134 Epoch 14 Step: 68600 Batch Loss: 1.836801 Tokens per Sec: 15550, Lr: 0.000300\n", "2019-11-22 19:38:00,617 Epoch 14 Step: 68700 Batch Loss: 1.743379 Tokens per Sec: 15979, Lr: 0.000300\n", "2019-11-22 19:38:15,425 Epoch 14 Step: 68800 Batch Loss: 1.551857 Tokens per Sec: 15941, Lr: 0.000300\n", "2019-11-22 19:38:30,501 Epoch 14 Step: 68900 Batch Loss: 1.734848 Tokens per Sec: 14984, Lr: 0.000300\n", "2019-11-22 19:38:45,292 Epoch 14 Step: 69000 Batch Loss: 1.662890 Tokens per Sec: 15814, Lr: 0.000300\n", "2019-11-22 19:39:24,462 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:39:24,462 Saving new checkpoint.\n", "2019-11-22 19:39:24,794 Example #0\n", "2019-11-22 19:39:24,795 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:39:24,795 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:39:24,795 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 19:39:24,795 Example #1\n", "2019-11-22 19:39:24,795 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:39:24,795 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:39:24,795 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 19:39:24,795 Example #2\n", "2019-11-22 19:39:24,796 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:39:24,796 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:39:24,796 \tHypothesis: Ó ti ní ìrírí tó pọ̀ jù , ó sì ti ṣe ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:39:24,796 Example #3\n", "2019-11-22 19:39:24,796 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:39:24,796 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:39:24,796 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s Stud’s Bible and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ẹ̀yà , ìfọ̀kànbalẹ̀ , ayérayé , fún ìgbà kan . ”\n", "2019-11-22 19:39:24,797 Validation result (greedy) at epoch 14, step 69000: bleu: 26.03, loss: 46199.3477, ppl: 4.7027, duration: 39.5047s\n", "2019-11-22 19:39:39,142 Epoch 14 Step: 69100 Batch Loss: 1.697929 Tokens per Sec: 15857, Lr: 0.000300\n", "2019-11-22 19:39:53,916 Epoch 14 Step: 69200 Batch Loss: 1.822878 Tokens per Sec: 15759, Lr: 0.000300\n", "2019-11-22 19:40:08,852 Epoch 14 Step: 69300 Batch Loss: 1.937788 Tokens per Sec: 15546, Lr: 0.000300\n", "2019-11-22 19:40:23,368 Epoch 14 Step: 69400 Batch Loss: 1.662451 Tokens per Sec: 15860, Lr: 0.000300\n", "2019-11-22 19:40:38,089 Epoch 14 Step: 69500 Batch Loss: 1.679015 Tokens per Sec: 15539, Lr: 0.000300\n", "2019-11-22 19:40:52,659 Epoch 14 Step: 69600 Batch Loss: 1.684168 Tokens per Sec: 15860, Lr: 0.000300\n", "2019-11-22 19:41:06,649 Epoch 14 Step: 69700 Batch Loss: 1.718147 Tokens per Sec: 16576, Lr: 0.000300\n", "2019-11-22 19:41:21,136 Epoch 14 Step: 69800 Batch Loss: 1.813857 Tokens per Sec: 16080, Lr: 0.000300\n", "2019-11-22 19:41:35,959 Epoch 14 Step: 69900 Batch Loss: 1.331593 Tokens per Sec: 15135, Lr: 0.000300\n", "2019-11-22 19:41:50,619 Epoch 14 Step: 70000 Batch Loss: 1.863897 Tokens per Sec: 16471, Lr: 0.000300\n", "2019-11-22 19:42:28,354 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:42:28,355 Saving new checkpoint.\n", "2019-11-22 19:42:28,632 Example #0\n", "2019-11-22 19:42:28,633 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:42:28,633 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:42:28,633 \tHypothesis: Ní báyìí , mo ní láti rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 19:42:28,633 Example #1\n", "2019-11-22 19:42:28,633 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:42:28,633 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:42:28,633 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 19:42:28,634 Example #2\n", "2019-11-22 19:42:28,634 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:42:28,634 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:42:28,634 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì ń jẹ́ kí o ṣe ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:42:28,634 Example #3\n", "2019-11-22 19:42:28,634 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:42:28,634 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:42:28,634 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Stud’s Studavy’s Hébérù àti Chaldee Dictionary ṣe sọ , ohun tó túmọ̀ sí ni pé , “ ìfọ̀kànbalẹ̀ , ìfọ̀kànbalẹ̀ , títí láé , nítorí pé ó ti pẹ́ . ”\n", "2019-11-22 19:42:28,635 Validation result (greedy) at epoch 14, step 70000: bleu: 25.89, loss: 46029.3477, ppl: 4.6760, duration: 38.0151s\n", "2019-11-22 19:42:43,191 Epoch 14 Step: 70100 Batch Loss: 1.654082 Tokens per Sec: 15250, Lr: 0.000300\n", "2019-11-22 19:42:57,793 Epoch 14 Step: 70200 Batch Loss: 1.813414 Tokens per Sec: 15779, Lr: 0.000300\n", "2019-11-22 19:43:12,228 Epoch 14 Step: 70300 Batch Loss: 1.725545 Tokens per Sec: 15831, Lr: 0.000300\n", "2019-11-22 19:43:26,722 Epoch 14 Step: 70400 Batch Loss: 1.507556 Tokens per Sec: 16134, Lr: 0.000300\n", "2019-11-22 19:43:41,138 Epoch 14 Step: 70500 Batch Loss: 1.696038 Tokens per Sec: 15986, Lr: 0.000300\n", "2019-11-22 19:43:55,723 Epoch 14 Step: 70600 Batch Loss: 1.595999 Tokens per Sec: 15883, Lr: 0.000300\n", "2019-11-22 19:44:09,889 Epoch 14 Step: 70700 Batch Loss: 1.640926 Tokens per Sec: 16267, Lr: 0.000300\n", "2019-11-22 19:44:24,306 Epoch 14 Step: 70800 Batch Loss: 1.741172 Tokens per Sec: 15677, Lr: 0.000300\n", "2019-11-22 19:44:38,757 Epoch 14 Step: 70900 Batch Loss: 1.636962 Tokens per Sec: 15720, Lr: 0.000300\n", "2019-11-22 19:44:53,419 Epoch 14 Step: 71000 Batch Loss: 1.740990 Tokens per Sec: 16099, Lr: 0.000300\n", "2019-11-22 19:45:32,646 Example #0\n", "2019-11-22 19:45:32,646 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:45:32,646 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:45:32,646 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 19:45:32,646 Example #1\n", "2019-11-22 19:45:32,647 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:45:32,647 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:45:32,647 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 19:45:32,647 Example #2\n", "2019-11-22 19:45:32,647 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:45:32,647 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:45:32,647 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:45:32,647 Example #3\n", "2019-11-22 19:45:32,648 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:45:32,648 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:45:32,648 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Studer àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ara pọ̀ , ìbàlẹ̀ ọkàn , títí láé , nítorí pé kò sí nǹkan kan . ”\n", "2019-11-22 19:45:32,648 Validation result (greedy) at epoch 14, step 71000: bleu: 26.24, loss: 46090.6992, ppl: 4.6856, duration: 39.2285s\n", "2019-11-22 19:45:47,435 Epoch 14 Step: 71100 Batch Loss: 1.775893 Tokens per Sec: 15913, Lr: 0.000300\n", "2019-11-22 19:46:01,822 Epoch 14 Step: 71200 Batch Loss: 1.713210 Tokens per Sec: 15739, Lr: 0.000300\n", "2019-11-22 19:46:16,229 Epoch 14 Step: 71300 Batch Loss: 1.687220 Tokens per Sec: 16267, Lr: 0.000300\n", "2019-11-22 19:46:31,149 Epoch 14 Step: 71400 Batch Loss: 1.755474 Tokens per Sec: 15442, Lr: 0.000300\n", "2019-11-22 19:46:46,308 Epoch 14 Step: 71500 Batch Loss: 1.732252 Tokens per Sec: 15627, Lr: 0.000300\n", "2019-11-22 19:47:00,571 Epoch 14 Step: 71600 Batch Loss: 1.414623 Tokens per Sec: 15892, Lr: 0.000300\n", "2019-11-22 19:47:14,909 Epoch 14 Step: 71700 Batch Loss: 1.631195 Tokens per Sec: 16406, Lr: 0.000300\n", "2019-11-22 19:47:29,235 Epoch 14 Step: 71800 Batch Loss: 1.592000 Tokens per Sec: 16069, Lr: 0.000300\n", "2019-11-22 19:47:43,847 Epoch 14 Step: 71900 Batch Loss: 1.810236 Tokens per Sec: 15827, Lr: 0.000300\n", "2019-11-22 19:47:58,337 Epoch 14 Step: 72000 Batch Loss: 1.624995 Tokens per Sec: 16208, Lr: 0.000300\n", "2019-11-22 19:48:37,117 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:48:37,117 Saving new checkpoint.\n", "2019-11-22 19:48:37,486 Example #0\n", "2019-11-22 19:48:37,486 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:48:37,487 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:48:37,487 \tHypothesis: Ní báyìí , mo ní láti wá ibi tí wọ́n ti ń ṣiṣẹ́ .\n", "2019-11-22 19:48:37,487 Example #1\n", "2019-11-22 19:48:37,488 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:48:37,488 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:48:37,488 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 19:48:37,488 Example #2\n", "2019-11-22 19:48:37,488 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:48:37,488 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:48:37,488 \tHypothesis: Ó ní ìrírí àti ìtura tó pọ̀ ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:48:37,488 Example #3\n", "2019-11-22 19:48:37,489 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:48:37,489 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:48:37,489 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Hébérù àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìpalára , ìbàjẹ́ , ìbàjẹ́ , títí láé , títí láé . ”\n", "2019-11-22 19:48:37,489 Validation result (greedy) at epoch 14, step 72000: bleu: 26.33, loss: 45973.5469, ppl: 4.6672, duration: 39.1515s\n", "2019-11-22 19:48:52,284 Epoch 14 Step: 72100 Batch Loss: 1.858146 Tokens per Sec: 16020, Lr: 0.000300\n", "2019-11-22 19:49:06,498 Epoch 14 Step: 72200 Batch Loss: 1.718819 Tokens per Sec: 16354, Lr: 0.000300\n", "2019-11-22 19:49:21,129 Epoch 14 Step: 72300 Batch Loss: 1.650326 Tokens per Sec: 16154, Lr: 0.000300\n", "2019-11-22 19:49:35,683 Epoch 14 Step: 72400 Batch Loss: 1.728758 Tokens per Sec: 15583, Lr: 0.000300\n", "2019-11-22 19:49:50,113 Epoch 14 Step: 72500 Batch Loss: 1.729764 Tokens per Sec: 15850, Lr: 0.000300\n", "2019-11-22 19:50:04,646 Epoch 14 Step: 72600 Batch Loss: 1.916999 Tokens per Sec: 15851, Lr: 0.000300\n", "2019-11-22 19:50:18,983 Epoch 14 Step: 72700 Batch Loss: 1.714276 Tokens per Sec: 15853, Lr: 0.000300\n", "2019-11-22 19:50:33,805 Epoch 14 Step: 72800 Batch Loss: 1.647557 Tokens per Sec: 15919, Lr: 0.000300\n", "2019-11-22 19:50:48,694 Epoch 14 Step: 72900 Batch Loss: 1.638982 Tokens per Sec: 15275, Lr: 0.000300\n", "2019-11-22 19:51:03,701 Epoch 14 Step: 73000 Batch Loss: 1.588628 Tokens per Sec: 15165, Lr: 0.000300\n", "2019-11-22 19:51:42,041 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:51:42,041 Saving new checkpoint.\n", "2019-11-22 19:51:42,324 Example #0\n", "2019-11-22 19:51:42,324 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:51:42,324 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:51:42,324 \tHypothesis: Ní báyìí , mo ní láti wá ibi tí wọ́n ti ń ṣiṣẹ́ .\n", "2019-11-22 19:51:42,324 Example #1\n", "2019-11-22 19:51:42,324 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:51:42,325 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:51:42,325 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 19:51:42,325 Example #2\n", "2019-11-22 19:51:42,326 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:51:42,326 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:51:42,326 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:51:42,326 Example #3\n", "2019-11-22 19:51:42,326 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:51:42,326 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:51:42,326 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Studavy’s Greek and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ìṣẹ́niníṣẹ̀ẹ́ , jíjẹ́ ẹni tó jẹ́ ẹni tó ń ṣaláìláàánú , títí láé . ”\n", "2019-11-22 19:51:42,326 Validation result (greedy) at epoch 14, step 73000: bleu: 26.22, loss: 45792.5508, ppl: 4.6390, duration: 38.6252s\n", "2019-11-22 19:51:57,030 Epoch 14 Step: 73100 Batch Loss: 1.668313 Tokens per Sec: 15782, Lr: 0.000300\n", "2019-11-22 19:52:11,321 Epoch 14 Step: 73200 Batch Loss: 1.723897 Tokens per Sec: 16150, Lr: 0.000300\n", "2019-11-22 19:52:25,696 Epoch 14 Step: 73300 Batch Loss: 1.713119 Tokens per Sec: 16054, Lr: 0.000300\n", "2019-11-22 19:52:40,284 Epoch 14 Step: 73400 Batch Loss: 1.796899 Tokens per Sec: 15793, Lr: 0.000300\n", "2019-11-22 19:52:55,008 Epoch 14 Step: 73500 Batch Loss: 1.757765 Tokens per Sec: 15779, Lr: 0.000300\n", "2019-11-22 19:53:09,433 Epoch 14 Step: 73600 Batch Loss: 1.715620 Tokens per Sec: 16062, Lr: 0.000300\n", "2019-11-22 19:53:23,836 Epoch 14 Step: 73700 Batch Loss: 1.508581 Tokens per Sec: 15752, Lr: 0.000300\n", "2019-11-22 19:53:33,600 Epoch 14: total training loss 8894.53\n", "2019-11-22 19:53:33,600 EPOCH 15\n", "2019-11-22 19:53:39,324 Epoch 15 Step: 73800 Batch Loss: 1.690070 Tokens per Sec: 14032, Lr: 0.000300\n", "2019-11-22 19:53:54,079 Epoch 15 Step: 73900 Batch Loss: 1.835059 Tokens per Sec: 15553, Lr: 0.000300\n", "2019-11-22 19:54:09,074 Epoch 15 Step: 74000 Batch Loss: 1.661966 Tokens per Sec: 15372, Lr: 0.000300\n", "2019-11-22 19:54:47,160 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:54:47,160 Saving new checkpoint.\n", "2019-11-22 19:54:47,520 Example #0\n", "2019-11-22 19:54:47,521 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:54:47,521 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:54:47,521 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 19:54:47,521 Example #1\n", "2019-11-22 19:54:47,521 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:54:47,521 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:54:47,521 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 19:54:47,521 Example #2\n", "2019-11-22 19:54:47,522 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:54:47,522 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:54:47,522 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì ń gbé ìgbé ayé tó o ní , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:54:47,522 Example #3\n", "2019-11-22 19:54:47,522 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:54:47,522 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:54:47,522 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìpele , ìfaradà , ìfaradà , ayérayé , fún ìgbà kankan . ”\n", "2019-11-22 19:54:47,522 Validation result (greedy) at epoch 15, step 74000: bleu: 26.38, loss: 45719.6680, ppl: 4.6277, duration: 38.4476s\n", "2019-11-22 19:55:02,321 Epoch 15 Step: 74100 Batch Loss: 1.734061 Tokens per Sec: 15767, Lr: 0.000300\n", "2019-11-22 19:55:17,162 Epoch 15 Step: 74200 Batch Loss: 1.808243 Tokens per Sec: 15662, Lr: 0.000300\n", "2019-11-22 19:55:31,739 Epoch 15 Step: 74300 Batch Loss: 1.705531 Tokens per Sec: 15695, Lr: 0.000300\n", "2019-11-22 19:55:46,235 Epoch 15 Step: 74400 Batch Loss: 1.645438 Tokens per Sec: 15869, Lr: 0.000300\n", "2019-11-22 19:56:00,416 Epoch 15 Step: 74500 Batch Loss: 1.640077 Tokens per Sec: 16214, Lr: 0.000300\n", "2019-11-22 19:56:14,869 Epoch 15 Step: 74600 Batch Loss: 1.756395 Tokens per Sec: 15836, Lr: 0.000300\n", "2019-11-22 19:56:29,672 Epoch 15 Step: 74700 Batch Loss: 1.582902 Tokens per Sec: 15809, Lr: 0.000300\n", "2019-11-22 19:56:44,243 Epoch 15 Step: 74800 Batch Loss: 1.636483 Tokens per Sec: 15780, Lr: 0.000300\n", "2019-11-22 19:56:59,318 Epoch 15 Step: 74900 Batch Loss: 1.715342 Tokens per Sec: 15532, Lr: 0.000300\n", "2019-11-22 19:57:14,086 Epoch 15 Step: 75000 Batch Loss: 1.551416 Tokens per Sec: 15835, Lr: 0.000300\n", "2019-11-22 19:57:51,907 Hooray! New best validation result [ppl]!\n", "2019-11-22 19:57:51,907 Saving new checkpoint.\n", "2019-11-22 19:57:52,200 Example #0\n", "2019-11-22 19:57:52,200 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 19:57:52,201 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 19:57:52,201 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 19:57:52,201 Example #1\n", "2019-11-22 19:57:52,201 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 19:57:52,201 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 19:57:52,201 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 19:57:52,201 Example #2\n", "2019-11-22 19:57:52,201 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 19:57:52,201 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 19:57:52,201 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 19:57:52,202 Example #3\n", "2019-11-22 19:57:52,202 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 19:57:52,202 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 19:57:52,202 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìpalára , ìfaradà , ayérayé , nítorí pé kò sí nǹkan kan tó lè ṣẹlẹ̀ . ”\n", "2019-11-22 19:57:52,202 Validation result (greedy) at epoch 15, step 75000: bleu: 26.43, loss: 45593.3398, ppl: 4.6081, duration: 38.1157s\n", "2019-11-22 19:58:06,568 Epoch 15 Step: 75100 Batch Loss: 1.540106 Tokens per Sec: 16272, Lr: 0.000300\n", "2019-11-22 19:58:21,203 Epoch 15 Step: 75200 Batch Loss: 1.686776 Tokens per Sec: 15752, Lr: 0.000300\n", "2019-11-22 19:58:35,538 Epoch 15 Step: 75300 Batch Loss: 1.426806 Tokens per Sec: 15910, Lr: 0.000300\n", "2019-11-22 19:58:49,900 Epoch 15 Step: 75400 Batch Loss: 1.683250 Tokens per Sec: 16097, Lr: 0.000300\n", "2019-11-22 19:59:04,673 Epoch 15 Step: 75500 Batch Loss: 1.570950 Tokens per Sec: 15700, Lr: 0.000300\n", "2019-11-22 19:59:19,077 Epoch 15 Step: 75600 Batch Loss: 1.669815 Tokens per Sec: 15743, Lr: 0.000300\n", "2019-11-22 19:59:33,877 Epoch 15 Step: 75700 Batch Loss: 1.554618 Tokens per Sec: 16041, Lr: 0.000300\n", "2019-11-22 19:59:48,681 Epoch 15 Step: 75800 Batch Loss: 1.748496 Tokens per Sec: 15883, Lr: 0.000300\n", "2019-11-22 20:00:03,485 Epoch 15 Step: 75900 Batch Loss: 1.581211 Tokens per Sec: 15998, Lr: 0.000300\n", "2019-11-22 20:00:18,335 Epoch 15 Step: 76000 Batch Loss: 1.716906 Tokens per Sec: 15920, Lr: 0.000300\n", "2019-11-22 20:00:57,390 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:00:57,390 Saving new checkpoint.\n", "2019-11-22 20:00:57,724 Example #0\n", "2019-11-22 20:00:57,724 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:00:57,724 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:00:57,724 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 20:00:57,725 Example #1\n", "2019-11-22 20:00:57,725 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:00:57,725 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:00:57,725 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 20:00:57,725 Example #2\n", "2019-11-22 20:00:57,725 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:00:57,725 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:00:57,725 \tHypothesis: Ó ti ní ìrírí tó pọ̀ jù , ó sì ń fsùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:00:57,726 Example #3\n", "2019-11-22 20:00:57,726 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:00:57,726 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:00:57,726 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Ìwé Mímọ́ Lédè Hébérù àti Kálídíà Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ara pọ̀ , jíjẹ́ aláìṣòótọ́ , títí láé , nítorí pé kò sí àní - àní . ”\n", "2019-11-22 20:00:57,726 Validation result (greedy) at epoch 15, step 76000: bleu: 26.63, loss: 45552.5391, ppl: 4.6018, duration: 39.3905s\n", "2019-11-22 20:01:12,096 Epoch 15 Step: 76100 Batch Loss: 1.722488 Tokens per Sec: 15842, Lr: 0.000300\n", "2019-11-22 20:01:26,388 Epoch 15 Step: 76200 Batch Loss: 1.702905 Tokens per Sec: 16179, Lr: 0.000300\n", "2019-11-22 20:01:41,071 Epoch 15 Step: 76300 Batch Loss: 1.548783 Tokens per Sec: 15921, Lr: 0.000300\n", "2019-11-22 20:01:55,493 Epoch 15 Step: 76400 Batch Loss: 1.774104 Tokens per Sec: 15995, Lr: 0.000300\n", "2019-11-22 20:02:09,944 Epoch 15 Step: 76500 Batch Loss: 1.673395 Tokens per Sec: 15918, Lr: 0.000300\n", "2019-11-22 20:02:24,298 Epoch 15 Step: 76600 Batch Loss: 1.662270 Tokens per Sec: 16161, Lr: 0.000300\n", "2019-11-22 20:02:38,604 Epoch 15 Step: 76700 Batch Loss: 1.665514 Tokens per Sec: 15856, Lr: 0.000300\n", "2019-11-22 20:02:53,236 Epoch 15 Step: 76800 Batch Loss: 1.710978 Tokens per Sec: 15914, Lr: 0.000300\n", "2019-11-22 20:03:07,806 Epoch 15 Step: 76900 Batch Loss: 1.484937 Tokens per Sec: 16183, Lr: 0.000300\n", "2019-11-22 20:03:22,182 Epoch 15 Step: 77000 Batch Loss: 1.603550 Tokens per Sec: 15775, Lr: 0.000300\n", "2019-11-22 20:04:00,782 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:04:00,782 Saving new checkpoint.\n", "2019-11-22 20:04:01,072 Example #0\n", "2019-11-22 20:04:01,072 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:04:01,072 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:04:01,072 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 20:04:01,072 Example #1\n", "2019-11-22 20:04:01,073 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:04:01,073 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:04:01,073 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti tàwọn èèyàn lọ ?\n", "2019-11-22 20:04:01,073 Example #2\n", "2019-11-22 20:04:01,073 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:04:01,073 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:04:01,074 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:04:01,074 Example #3\n", "2019-11-22 20:04:01,074 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:04:01,074 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:04:01,074 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Students of the Hebrew and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa , ìfọ̀kànbalẹ̀ , títí láé , títí láé . ”\n", "2019-11-22 20:04:01,074 Validation result (greedy) at epoch 15, step 77000: bleu: 26.81, loss: 45518.5312, ppl: 4.5966, duration: 38.8915s\n", "2019-11-22 20:04:15,508 Epoch 15 Step: 77100 Batch Loss: 1.578096 Tokens per Sec: 16011, Lr: 0.000300\n", "2019-11-22 20:04:30,241 Epoch 15 Step: 77200 Batch Loss: 1.607208 Tokens per Sec: 15909, Lr: 0.000300\n", "2019-11-22 20:04:44,813 Epoch 15 Step: 77300 Batch Loss: 1.693197 Tokens per Sec: 15802, Lr: 0.000300\n", "2019-11-22 20:04:59,263 Epoch 15 Step: 77400 Batch Loss: 1.720869 Tokens per Sec: 16089, Lr: 0.000300\n", "2019-11-22 20:05:13,675 Epoch 15 Step: 77500 Batch Loss: 1.766011 Tokens per Sec: 15949, Lr: 0.000300\n", "2019-11-22 20:05:28,253 Epoch 15 Step: 77600 Batch Loss: 1.688931 Tokens per Sec: 16102, Lr: 0.000300\n", "2019-11-22 20:05:42,925 Epoch 15 Step: 77700 Batch Loss: 1.729507 Tokens per Sec: 15423, Lr: 0.000300\n", "2019-11-22 20:05:57,379 Epoch 15 Step: 77800 Batch Loss: 1.808241 Tokens per Sec: 15612, Lr: 0.000300\n", "2019-11-22 20:06:11,984 Epoch 15 Step: 77900 Batch Loss: 1.701459 Tokens per Sec: 15781, Lr: 0.000300\n", "2019-11-22 20:06:26,072 Epoch 15 Step: 78000 Batch Loss: 1.778193 Tokens per Sec: 15681, Lr: 0.000300\n", "2019-11-22 20:07:05,103 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:07:05,103 Saving new checkpoint.\n", "2019-11-22 20:07:05,409 Example #0\n", "2019-11-22 20:07:05,409 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:07:05,409 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:07:05,409 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 20:07:05,409 Example #1\n", "2019-11-22 20:07:05,410 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:07:05,410 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:07:05,410 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:07:05,410 Example #2\n", "2019-11-22 20:07:05,410 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:07:05,410 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:07:05,410 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ti ṣe ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:07:05,410 Example #3\n", "2019-11-22 20:07:05,411 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:07:05,411 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:07:05,411 \tHypothesis: Gẹ́gẹ́ bí Harkavy’s Students of Hebrew and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa oúnjẹ , ìfaradà , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 20:07:05,411 Validation result (greedy) at epoch 15, step 78000: bleu: 26.80, loss: 45437.6562, ppl: 4.5842, duration: 39.3385s\n", "2019-11-22 20:07:19,919 Epoch 15 Step: 78100 Batch Loss: 1.564153 Tokens per Sec: 16096, Lr: 0.000300\n", "2019-11-22 20:07:35,054 Epoch 15 Step: 78200 Batch Loss: 1.667496 Tokens per Sec: 15592, Lr: 0.000300\n", "2019-11-22 20:07:49,828 Epoch 15 Step: 78300 Batch Loss: 1.542007 Tokens per Sec: 15531, Lr: 0.000300\n", "2019-11-22 20:08:04,154 Epoch 15 Step: 78400 Batch Loss: 1.720270 Tokens per Sec: 15906, Lr: 0.000300\n", "2019-11-22 20:08:18,800 Epoch 15 Step: 78500 Batch Loss: 1.585509 Tokens per Sec: 15914, Lr: 0.000300\n", "2019-11-22 20:08:33,327 Epoch 15 Step: 78600 Batch Loss: 1.730519 Tokens per Sec: 15887, Lr: 0.000300\n", "2019-11-22 20:08:47,851 Epoch 15 Step: 78700 Batch Loss: 1.804568 Tokens per Sec: 15791, Lr: 0.000300\n", "2019-11-22 20:09:02,845 Epoch 15 Step: 78800 Batch Loss: 1.542656 Tokens per Sec: 15427, Lr: 0.000300\n", "2019-11-22 20:09:17,206 Epoch 15 Step: 78900 Batch Loss: 1.585355 Tokens per Sec: 15706, Lr: 0.000300\n", "2019-11-22 20:09:31,928 Epoch 15 Step: 79000 Batch Loss: 1.680901 Tokens per Sec: 16015, Lr: 0.000300\n", "2019-11-22 20:10:09,897 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:10:09,897 Saving new checkpoint.\n", "2019-11-22 20:10:10,209 Example #0\n", "2019-11-22 20:10:10,210 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:10:10,210 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:10:10,210 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 20:10:10,210 Example #1\n", "2019-11-22 20:10:10,210 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:10:10,210 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:10:10,210 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:10:10,210 Example #2\n", "2019-11-22 20:10:10,211 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:10:10,211 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:10:10,211 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní sùúrù fún ọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:10:10,211 Example #3\n", "2019-11-22 20:10:10,211 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:10:10,211 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:10:10,211 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Studer of Hébérù àti Chaldee Dictionary ṣe sọ , ẹ̀mí ìdúróṣinṣin túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbà díẹ̀ . ”\n", "2019-11-22 20:10:10,211 Validation result (greedy) at epoch 15, step 79000: bleu: 26.55, loss: 45251.2344, ppl: 4.5556, duration: 38.2831s\n", "2019-11-22 20:10:15,895 Epoch 15: total training loss 8796.32\n", "2019-11-22 20:10:15,895 EPOCH 16\n", "2019-11-22 20:10:25,556 Epoch 16 Step: 79100 Batch Loss: 1.542168 Tokens per Sec: 14879, Lr: 0.000300\n", "2019-11-22 20:10:39,826 Epoch 16 Step: 79200 Batch Loss: 1.271038 Tokens per Sec: 16171, Lr: 0.000300\n", "2019-11-22 20:10:54,162 Epoch 16 Step: 79300 Batch Loss: 1.692273 Tokens per Sec: 16160, Lr: 0.000300\n", "2019-11-22 20:11:08,769 Epoch 16 Step: 79400 Batch Loss: 1.581714 Tokens per Sec: 15643, Lr: 0.000300\n", "2019-11-22 20:11:23,201 Epoch 16 Step: 79500 Batch Loss: 1.602006 Tokens per Sec: 16080, Lr: 0.000300\n", "2019-11-22 20:11:37,913 Epoch 16 Step: 79600 Batch Loss: 1.701217 Tokens per Sec: 15633, Lr: 0.000300\n", "2019-11-22 20:11:52,565 Epoch 16 Step: 79700 Batch Loss: 1.741897 Tokens per Sec: 15870, Lr: 0.000300\n", "2019-11-22 20:12:07,310 Epoch 16 Step: 79800 Batch Loss: 1.701781 Tokens per Sec: 15731, Lr: 0.000300\n", "2019-11-22 20:12:22,160 Epoch 16 Step: 79900 Batch Loss: 1.664052 Tokens per Sec: 15397, Lr: 0.000300\n", "2019-11-22 20:12:37,040 Epoch 16 Step: 80000 Batch Loss: 1.603602 Tokens per Sec: 15345, Lr: 0.000300\n", "2019-11-22 20:13:15,265 Example #0\n", "2019-11-22 20:13:15,265 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:13:15,265 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:13:15,265 \tHypothesis: Mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 20:13:15,265 Example #1\n", "2019-11-22 20:13:15,266 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:13:15,266 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:13:15,266 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:13:15,266 Example #2\n", "2019-11-22 20:13:15,266 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:13:15,266 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:13:15,266 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì ní ìrírí tó pọ̀ ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:13:15,266 Example #3\n", "2019-11-22 20:13:15,267 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:13:15,267 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:13:15,267 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Stud’s Stud’s Stude Dictionary ṣe sọ , ẹ̀mí ìdúróṣinṣin túmọ̀ sí “ pípa , ìfaradà , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 20:13:15,267 Validation result (greedy) at epoch 16, step 80000: bleu: 26.86, loss: 45264.8477, ppl: 4.5577, duration: 38.2271s\n", "2019-11-22 20:13:29,838 Epoch 16 Step: 80100 Batch Loss: 1.722698 Tokens per Sec: 16354, Lr: 0.000300\n", "2019-11-22 20:13:44,233 Epoch 16 Step: 80200 Batch Loss: 1.650931 Tokens per Sec: 16262, Lr: 0.000300\n", "2019-11-22 20:13:58,758 Epoch 16 Step: 80300 Batch Loss: 1.447714 Tokens per Sec: 15911, Lr: 0.000300\n", "2019-11-22 20:14:13,403 Epoch 16 Step: 80400 Batch Loss: 1.700615 Tokens per Sec: 15911, Lr: 0.000300\n", "2019-11-22 20:14:28,031 Epoch 16 Step: 80500 Batch Loss: 1.577889 Tokens per Sec: 16000, Lr: 0.000300\n", "2019-11-22 20:14:42,322 Epoch 16 Step: 80600 Batch Loss: 1.679476 Tokens per Sec: 16084, Lr: 0.000300\n", "2019-11-22 20:14:56,701 Epoch 16 Step: 80700 Batch Loss: 1.713239 Tokens per Sec: 16387, Lr: 0.000300\n", "2019-11-22 20:15:11,426 Epoch 16 Step: 80800 Batch Loss: 1.625294 Tokens per Sec: 15743, Lr: 0.000300\n", "2019-11-22 20:15:25,976 Epoch 16 Step: 80900 Batch Loss: 1.617507 Tokens per Sec: 16108, Lr: 0.000300\n", "2019-11-22 20:15:40,781 Epoch 16 Step: 81000 Batch Loss: 1.470590 Tokens per Sec: 15897, Lr: 0.000300\n", "2019-11-22 20:16:18,994 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:16:18,994 Saving new checkpoint.\n", "2019-11-22 20:16:19,283 Example #0\n", "2019-11-22 20:16:19,283 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:16:19,283 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:16:19,284 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ kan wà tí mo lè ṣe .\n", "2019-11-22 20:16:19,284 Example #1\n", "2019-11-22 20:16:19,284 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:16:19,284 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:16:19,284 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 20:16:19,284 Example #2\n", "2019-11-22 20:16:19,285 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:16:19,285 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:16:19,285 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì níye lórí ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:16:19,285 Example #3\n", "2019-11-22 20:16:19,285 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:16:19,285 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:16:19,285 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Studers of the Hebrew and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ìṣẹ́jú , ìfòyemọ̀ , títí láé , títí láé . ”\n", "2019-11-22 20:16:19,285 Validation result (greedy) at epoch 16, step 81000: bleu: 27.22, loss: 45159.5469, ppl: 4.5416, duration: 38.5037s\n", "2019-11-22 20:16:34,262 Epoch 16 Step: 81100 Batch Loss: 1.688357 Tokens per Sec: 15551, Lr: 0.000300\n", "2019-11-22 20:16:49,165 Epoch 16 Step: 81200 Batch Loss: 1.733574 Tokens per Sec: 15065, Lr: 0.000300\n", "2019-11-22 20:17:04,096 Epoch 16 Step: 81300 Batch Loss: 1.762540 Tokens per Sec: 15605, Lr: 0.000300\n", "2019-11-22 20:17:19,030 Epoch 16 Step: 81400 Batch Loss: 1.639084 Tokens per Sec: 15485, Lr: 0.000300\n", "2019-11-22 20:17:33,649 Epoch 16 Step: 81500 Batch Loss: 1.553250 Tokens per Sec: 16100, Lr: 0.000300\n", "2019-11-22 20:17:47,857 Epoch 16 Step: 81600 Batch Loss: 1.949810 Tokens per Sec: 16494, Lr: 0.000300\n", "2019-11-22 20:18:02,614 Epoch 16 Step: 81700 Batch Loss: 1.675899 Tokens per Sec: 15453, Lr: 0.000300\n", "2019-11-22 20:18:16,981 Epoch 16 Step: 81800 Batch Loss: 1.700198 Tokens per Sec: 15724, Lr: 0.000300\n", "2019-11-22 20:18:31,481 Epoch 16 Step: 81900 Batch Loss: 1.779592 Tokens per Sec: 15896, Lr: 0.000300\n", "2019-11-22 20:18:45,945 Epoch 16 Step: 82000 Batch Loss: 1.629955 Tokens per Sec: 16023, Lr: 0.000300\n", "2019-11-22 20:19:24,964 Example #0\n", "2019-11-22 20:19:24,964 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:19:24,964 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:19:24,964 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ kan wà tó yẹ kí n ṣe .\n", "2019-11-22 20:19:24,964 Example #1\n", "2019-11-22 20:19:24,964 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:19:24,964 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:19:24,964 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 20:19:24,965 Example #2\n", "2019-11-22 20:19:24,965 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:19:24,965 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:19:24,965 \tHypothesis: Ó ti ní ìrírí tó pọ̀ gan - an , ó sì ti ń ṣe ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:19:24,965 Example #3\n", "2019-11-22 20:19:24,965 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:19:24,965 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:19:24,965 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , ẹ̀mí ìdúróṣinṣin túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbà kan rí . ”\n", "2019-11-22 20:19:24,965 Validation result (greedy) at epoch 16, step 82000: bleu: 26.95, loss: 45183.6562, ppl: 4.5453, duration: 39.0201s\n", "2019-11-22 20:19:40,249 Epoch 16 Step: 82100 Batch Loss: 1.640131 Tokens per Sec: 15042, Lr: 0.000300\n", "2019-11-22 20:19:55,153 Epoch 16 Step: 82200 Batch Loss: 1.679563 Tokens per Sec: 15662, Lr: 0.000300\n", "2019-11-22 20:20:10,272 Epoch 16 Step: 82300 Batch Loss: 1.807524 Tokens per Sec: 15173, Lr: 0.000300\n", "2019-11-22 20:20:24,975 Epoch 16 Step: 82400 Batch Loss: 1.489744 Tokens per Sec: 15733, Lr: 0.000300\n", "2019-11-22 20:20:39,294 Epoch 16 Step: 82500 Batch Loss: 1.738844 Tokens per Sec: 16177, Lr: 0.000300\n", "2019-11-22 20:20:53,851 Epoch 16 Step: 82600 Batch Loss: 1.685384 Tokens per Sec: 15585, Lr: 0.000300\n", "2019-11-22 20:21:08,122 Epoch 16 Step: 82700 Batch Loss: 1.752394 Tokens per Sec: 16144, Lr: 0.000300\n", "2019-11-22 20:21:22,660 Epoch 16 Step: 82800 Batch Loss: 1.660209 Tokens per Sec: 16007, Lr: 0.000300\n", "2019-11-22 20:21:37,457 Epoch 16 Step: 82900 Batch Loss: 1.650844 Tokens per Sec: 15419, Lr: 0.000300\n", "2019-11-22 20:21:52,230 Epoch 16 Step: 83000 Batch Loss: 1.711287 Tokens per Sec: 15690, Lr: 0.000300\n", "2019-11-22 20:22:30,380 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:22:30,380 Saving new checkpoint.\n", "2019-11-22 20:22:30,677 Example #0\n", "2019-11-22 20:22:30,678 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:22:30,678 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:22:30,678 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 20:22:30,679 Example #1\n", "2019-11-22 20:22:30,679 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:22:30,679 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:22:30,679 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 20:22:30,679 Example #2\n", "2019-11-22 20:22:30,679 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:22:30,680 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:22:30,680 \tHypothesis: Ó ní ìrírí àti amúniláradá ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:22:30,680 Example #3\n", "2019-11-22 20:22:30,680 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:22:30,680 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:22:30,680 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Stud’s Stud’s Students of Hebrew and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ìṣẹ́jú , ìfaradà , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 20:22:30,680 Validation result (greedy) at epoch 16, step 83000: bleu: 26.74, loss: 45037.5703, ppl: 4.5231, duration: 38.4505s\n", "2019-11-22 20:22:45,229 Epoch 16 Step: 83100 Batch Loss: 1.627238 Tokens per Sec: 15847, Lr: 0.000300\n", "2019-11-22 20:22:59,917 Epoch 16 Step: 83200 Batch Loss: 1.645127 Tokens per Sec: 15904, Lr: 0.000300\n", "2019-11-22 20:23:14,111 Epoch 16 Step: 83300 Batch Loss: 1.673490 Tokens per Sec: 16331, Lr: 0.000300\n", "2019-11-22 20:23:28,768 Epoch 16 Step: 83400 Batch Loss: 1.520412 Tokens per Sec: 15886, Lr: 0.000300\n", "2019-11-22 20:23:43,489 Epoch 16 Step: 83500 Batch Loss: 1.759065 Tokens per Sec: 15637, Lr: 0.000300\n", "2019-11-22 20:23:58,149 Epoch 16 Step: 83600 Batch Loss: 1.645197 Tokens per Sec: 16260, Lr: 0.000300\n", "2019-11-22 20:24:12,960 Epoch 16 Step: 83700 Batch Loss: 1.615399 Tokens per Sec: 15611, Lr: 0.000300\n", "2019-11-22 20:24:27,917 Epoch 16 Step: 83800 Batch Loss: 1.668597 Tokens per Sec: 15596, Lr: 0.000300\n", "2019-11-22 20:24:42,990 Epoch 16 Step: 83900 Batch Loss: 1.613690 Tokens per Sec: 15049, Lr: 0.000300\n", "2019-11-22 20:24:57,496 Epoch 16 Step: 84000 Batch Loss: 1.553818 Tokens per Sec: 15953, Lr: 0.000300\n", "2019-11-22 20:25:36,834 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:25:36,834 Saving new checkpoint.\n", "2019-11-22 20:25:37,121 Example #0\n", "2019-11-22 20:25:37,121 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:25:37,121 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:25:37,121 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 20:25:37,121 Example #1\n", "2019-11-22 20:25:37,122 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:25:37,122 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:25:37,122 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:25:37,122 Example #2\n", "2019-11-22 20:25:37,122 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:25:37,122 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:25:37,123 \tHypothesis: Ó ní ìrírí àti ìjákulẹ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:25:37,123 Example #3\n", "2019-11-22 20:25:37,123 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:25:37,123 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:25:37,123 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Stud’s Greek and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìpànìyàn , ìfòfindè , títí láé , fún ìgbà kankan rí . ”\n", "2019-11-22 20:25:37,123 Validation result (greedy) at epoch 16, step 84000: bleu: 27.01, loss: 45016.1445, ppl: 4.5199, duration: 39.6274s\n", "2019-11-22 20:25:51,743 Epoch 16 Step: 84100 Batch Loss: 1.564611 Tokens per Sec: 16236, Lr: 0.000300\n", "2019-11-22 20:26:06,508 Epoch 16 Step: 84200 Batch Loss: 1.778262 Tokens per Sec: 15716, Lr: 0.000300\n", "2019-11-22 20:26:21,149 Epoch 16: total training loss 8686.00\n", "2019-11-22 20:26:21,149 EPOCH 17\n", "2019-11-22 20:26:22,232 Epoch 17 Step: 84300 Batch Loss: 1.428159 Tokens per Sec: 6276, Lr: 0.000300\n", "2019-11-22 20:26:36,834 Epoch 17 Step: 84400 Batch Loss: 1.718052 Tokens per Sec: 16030, Lr: 0.000300\n", "2019-11-22 20:26:51,502 Epoch 17 Step: 84500 Batch Loss: 1.460821 Tokens per Sec: 15531, Lr: 0.000300\n", "2019-11-22 20:27:05,903 Epoch 17 Step: 84600 Batch Loss: 1.386032 Tokens per Sec: 16197, Lr: 0.000300\n", "2019-11-22 20:27:20,685 Epoch 17 Step: 84700 Batch Loss: 1.758105 Tokens per Sec: 15760, Lr: 0.000300\n", "2019-11-22 20:27:35,195 Epoch 17 Step: 84800 Batch Loss: 1.637988 Tokens per Sec: 15949, Lr: 0.000300\n", "2019-11-22 20:27:49,871 Epoch 17 Step: 84900 Batch Loss: 1.432895 Tokens per Sec: 15931, Lr: 0.000300\n", "2019-11-22 20:28:04,287 Epoch 17 Step: 85000 Batch Loss: 1.729671 Tokens per Sec: 16495, Lr: 0.000300\n", "2019-11-22 20:28:43,461 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:28:43,462 Saving new checkpoint.\n", "2019-11-22 20:28:43,878 Example #0\n", "2019-11-22 20:28:43,878 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:28:43,878 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:28:43,878 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 20:28:43,879 Example #1\n", "2019-11-22 20:28:43,879 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:28:43,879 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:28:43,879 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 20:28:43,879 Example #2\n", "2019-11-22 20:28:43,879 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:28:43,879 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:28:43,880 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:28:43,880 Example #3\n", "2019-11-22 20:28:43,880 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:28:43,880 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:28:43,880 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa tí kò láfiwé , àìlófin , títí láé , nítorí pé kò sí nǹkan kan tó lè ṣẹlẹ̀ . ”\n", "2019-11-22 20:28:43,880 Validation result (greedy) at epoch 17, step 85000: bleu: 27.21, loss: 44939.9570, ppl: 4.5083, duration: 39.5928s\n", "2019-11-22 20:28:58,865 Epoch 17 Step: 85100 Batch Loss: 1.726990 Tokens per Sec: 15736, Lr: 0.000300\n", "2019-11-22 20:29:13,608 Epoch 17 Step: 85200 Batch Loss: 1.716999 Tokens per Sec: 15763, Lr: 0.000300\n", "2019-11-22 20:29:28,507 Epoch 17 Step: 85300 Batch Loss: 1.663451 Tokens per Sec: 15865, Lr: 0.000300\n", "2019-11-22 20:29:43,535 Epoch 17 Step: 85400 Batch Loss: 1.892349 Tokens per Sec: 15270, Lr: 0.000300\n", "2019-11-22 20:29:58,410 Epoch 17 Step: 85500 Batch Loss: 1.741484 Tokens per Sec: 15610, Lr: 0.000300\n", "2019-11-22 20:30:13,233 Epoch 17 Step: 85600 Batch Loss: 1.500385 Tokens per Sec: 15643, Lr: 0.000300\n", "2019-11-22 20:30:27,807 Epoch 17 Step: 85700 Batch Loss: 1.445377 Tokens per Sec: 16104, Lr: 0.000300\n", "2019-11-22 20:30:42,856 Epoch 17 Step: 85800 Batch Loss: 1.410331 Tokens per Sec: 15054, Lr: 0.000300\n", "2019-11-22 20:30:57,775 Epoch 17 Step: 85900 Batch Loss: 1.858719 Tokens per Sec: 15644, Lr: 0.000300\n", "2019-11-22 20:31:12,522 Epoch 17 Step: 86000 Batch Loss: 1.621224 Tokens per Sec: 15829, Lr: 0.000300\n", "2019-11-22 20:31:52,412 Example #0\n", "2019-11-22 20:31:52,412 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:31:52,412 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:31:52,412 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 20:31:52,412 Example #1\n", "2019-11-22 20:31:52,413 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:31:52,413 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:31:52,413 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:31:52,413 Example #2\n", "2019-11-22 20:31:52,413 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:31:52,413 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:31:52,413 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:31:52,414 Example #3\n", "2019-11-22 20:31:52,414 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:31:52,414 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:31:52,414 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Ìwé Mímọ́ Lédè Hébérù àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ara pọ̀ , jíjẹ́ ẹni tó jẹ́ aláìṣòótọ́ , títí láé , títí láé . ”\n", "2019-11-22 20:31:52,414 Validation result (greedy) at epoch 17, step 86000: bleu: 27.33, loss: 44954.8555, ppl: 4.5106, duration: 39.8914s\n", "2019-11-22 20:32:07,119 Epoch 17 Step: 86100 Batch Loss: 1.538028 Tokens per Sec: 15448, Lr: 0.000300\n", "2019-11-22 20:32:21,818 Epoch 17 Step: 86200 Batch Loss: 1.762896 Tokens per Sec: 16046, Lr: 0.000300\n", "2019-11-22 20:32:36,597 Epoch 17 Step: 86300 Batch Loss: 1.591392 Tokens per Sec: 15265, Lr: 0.000300\n", "2019-11-22 20:32:51,671 Epoch 17 Step: 86400 Batch Loss: 1.622226 Tokens per Sec: 15493, Lr: 0.000300\n", "2019-11-22 20:33:06,483 Epoch 17 Step: 86500 Batch Loss: 1.483786 Tokens per Sec: 15809, Lr: 0.000300\n", "2019-11-22 20:33:21,292 Epoch 17 Step: 86600 Batch Loss: 1.624578 Tokens per Sec: 15876, Lr: 0.000300\n", "2019-11-22 20:33:36,554 Epoch 17 Step: 86700 Batch Loss: 1.798055 Tokens per Sec: 15306, Lr: 0.000300\n", "2019-11-22 20:33:51,202 Epoch 17 Step: 86800 Batch Loss: 1.732648 Tokens per Sec: 15599, Lr: 0.000300\n", "2019-11-22 20:34:06,230 Epoch 17 Step: 86900 Batch Loss: 1.596448 Tokens per Sec: 15377, Lr: 0.000300\n", "2019-11-22 20:34:21,189 Epoch 17 Step: 87000 Batch Loss: 1.611819 Tokens per Sec: 15857, Lr: 0.000300\n", "2019-11-22 20:35:00,977 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:35:00,977 Saving new checkpoint.\n", "2019-11-22 20:35:01,307 Example #0\n", "2019-11-22 20:35:01,307 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:35:01,307 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:35:01,307 \tHypothesis: Mo ti wá rí i pé iṣẹ́ tó dára jù lọ ni mo ṣe .\n", "2019-11-22 20:35:01,307 Example #1\n", "2019-11-22 20:35:01,307 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:35:01,308 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:35:01,308 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:35:01,308 Example #2\n", "2019-11-22 20:35:01,308 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:35:01,308 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:35:01,308 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ń ṣe ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:35:01,308 Example #3\n", "2019-11-22 20:35:01,308 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:35:01,308 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:35:01,308 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Studavy’s Stud’s Greek and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ara pọ̀ , jíjẹ́ ọ̀làwọ́ , ayérayé , títí láé . ”\n", "2019-11-22 20:35:01,309 Validation result (greedy) at epoch 17, step 87000: bleu: 27.23, loss: 44793.3203, ppl: 4.4862, duration: 40.1188s\n", "2019-11-22 20:35:16,113 Epoch 17 Step: 87100 Batch Loss: 1.609877 Tokens per Sec: 15188, Lr: 0.000300\n", "2019-11-22 20:35:31,289 Epoch 17 Step: 87200 Batch Loss: 1.681150 Tokens per Sec: 15453, Lr: 0.000300\n", "2019-11-22 20:35:46,131 Epoch 17 Step: 87300 Batch Loss: 1.551250 Tokens per Sec: 15560, Lr: 0.000300\n", "2019-11-22 20:36:00,729 Epoch 17 Step: 87400 Batch Loss: 1.688189 Tokens per Sec: 15608, Lr: 0.000300\n", "2019-11-22 20:36:15,893 Epoch 17 Step: 87500 Batch Loss: 1.591051 Tokens per Sec: 15066, Lr: 0.000300\n", "2019-11-22 20:36:31,186 Epoch 17 Step: 87600 Batch Loss: 1.621074 Tokens per Sec: 14891, Lr: 0.000300\n", "2019-11-22 20:36:46,243 Epoch 17 Step: 87700 Batch Loss: 1.644185 Tokens per Sec: 15559, Lr: 0.000300\n", "2019-11-22 20:37:00,956 Epoch 17 Step: 87800 Batch Loss: 1.560085 Tokens per Sec: 15912, Lr: 0.000300\n", "2019-11-22 20:37:15,697 Epoch 17 Step: 87900 Batch Loss: 1.610095 Tokens per Sec: 15612, Lr: 0.000300\n", "2019-11-22 20:37:31,103 Epoch 17 Step: 88000 Batch Loss: 1.806689 Tokens per Sec: 15052, Lr: 0.000300\n", "2019-11-22 20:38:10,988 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:38:10,988 Saving new checkpoint.\n", "2019-11-22 20:38:11,346 Example #0\n", "2019-11-22 20:38:11,346 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:38:11,346 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:38:11,346 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 20:38:11,346 Example #1\n", "2019-11-22 20:38:11,346 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:38:11,347 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:38:11,347 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 20:38:11,347 Example #2\n", "2019-11-22 20:38:11,347 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:38:11,347 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:38:11,347 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó pọ̀ ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:38:11,347 Example #3\n", "2019-11-22 20:38:11,347 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:38:11,347 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:38:11,347 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Stud’s Stud’s Greek and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa , ìfaradà , ìfaradà , títí láé , nítorí pé kò sí àní - àní . ”\n", "2019-11-22 20:38:11,348 Validation result (greedy) at epoch 17, step 88000: bleu: 26.81, loss: 44742.0273, ppl: 4.4785, duration: 40.2443s\n", "2019-11-22 20:38:26,418 Epoch 17 Step: 88100 Batch Loss: 1.760160 Tokens per Sec: 14978, Lr: 0.000300\n", "2019-11-22 20:38:41,730 Epoch 17 Step: 88200 Batch Loss: 1.596778 Tokens per Sec: 15083, Lr: 0.000300\n", "2019-11-22 20:38:56,973 Epoch 17 Step: 88300 Batch Loss: 1.583237 Tokens per Sec: 15529, Lr: 0.000300\n", "2019-11-22 20:39:11,998 Epoch 17 Step: 88400 Batch Loss: 1.435121 Tokens per Sec: 15417, Lr: 0.000300\n", "2019-11-22 20:39:26,825 Epoch 17 Step: 88500 Batch Loss: 1.833673 Tokens per Sec: 15586, Lr: 0.000300\n", "2019-11-22 20:39:41,964 Epoch 17 Step: 88600 Batch Loss: 1.489437 Tokens per Sec: 15215, Lr: 0.000300\n", "2019-11-22 20:39:57,406 Epoch 17 Step: 88700 Batch Loss: 1.818495 Tokens per Sec: 15322, Lr: 0.000300\n", "2019-11-22 20:40:12,454 Epoch 17 Step: 88800 Batch Loss: 1.653397 Tokens per Sec: 15377, Lr: 0.000300\n", "2019-11-22 20:40:27,777 Epoch 17 Step: 88900 Batch Loss: 1.653956 Tokens per Sec: 15033, Lr: 0.000300\n", "2019-11-22 20:40:42,872 Epoch 17 Step: 89000 Batch Loss: 1.715395 Tokens per Sec: 15070, Lr: 0.000300\n", "2019-11-22 20:41:22,221 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:41:22,221 Saving new checkpoint.\n", "2019-11-22 20:41:22,576 Example #0\n", "2019-11-22 20:41:22,576 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:41:22,576 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:41:22,576 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 20:41:22,577 Example #1\n", "2019-11-22 20:41:22,577 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:41:22,577 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:41:22,577 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:41:22,577 Example #2\n", "2019-11-22 20:41:22,578 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:41:22,578 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:41:22,578 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì ń ṣe ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:41:22,578 Example #3\n", "2019-11-22 20:41:22,578 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:41:22,578 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:41:22,578 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Stud’s Stud’s and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìpele , ìfaradà , ìfararadà , ayérayé , nítorí pé kò sí àní - àní . ”\n", "2019-11-22 20:41:22,579 Validation result (greedy) at epoch 17, step 89000: bleu: 27.09, loss: 44494.6445, ppl: 4.4416, duration: 39.7061s\n", "2019-11-22 20:41:37,357 Epoch 17 Step: 89100 Batch Loss: 1.680858 Tokens per Sec: 15321, Lr: 0.000300\n", "2019-11-22 20:41:52,435 Epoch 17 Step: 89200 Batch Loss: 1.579470 Tokens per Sec: 15333, Lr: 0.000300\n", "2019-11-22 20:42:07,424 Epoch 17 Step: 89300 Batch Loss: 1.753365 Tokens per Sec: 14866, Lr: 0.000300\n", "2019-11-22 20:42:22,576 Epoch 17 Step: 89400 Batch Loss: 1.632853 Tokens per Sec: 15506, Lr: 0.000300\n", "2019-11-22 20:42:37,481 Epoch 17 Step: 89500 Batch Loss: 1.808817 Tokens per Sec: 15407, Lr: 0.000300\n", "2019-11-22 20:42:46,175 Epoch 17: total training loss 8631.65\n", "2019-11-22 20:42:46,176 EPOCH 18\n", "2019-11-22 20:42:53,016 Epoch 18 Step: 89600 Batch Loss: 1.587074 Tokens per Sec: 14042, Lr: 0.000300\n", "2019-11-22 20:43:07,932 Epoch 18 Step: 89700 Batch Loss: 1.562387 Tokens per Sec: 15590, Lr: 0.000300\n", "2019-11-22 20:43:23,108 Epoch 18 Step: 89800 Batch Loss: 1.459447 Tokens per Sec: 15252, Lr: 0.000300\n", "2019-11-22 20:43:38,087 Epoch 18 Step: 89900 Batch Loss: 1.348018 Tokens per Sec: 15028, Lr: 0.000300\n", "2019-11-22 20:43:53,082 Epoch 18 Step: 90000 Batch Loss: 1.554927 Tokens per Sec: 15042, Lr: 0.000300\n", "2019-11-22 20:44:32,776 Example #0\n", "2019-11-22 20:44:32,777 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:44:32,777 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:44:32,777 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 20:44:32,777 Example #1\n", "2019-11-22 20:44:32,777 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:44:32,777 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:44:32,777 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:44:32,777 Example #2\n", "2019-11-22 20:44:32,778 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:44:32,778 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:44:32,778 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìmí ẹ̀dùn ju bó ṣe yẹ lọ , àmọ́ ó ń rìn nítòsí rẹ .\n", "2019-11-22 20:44:32,778 Example #3\n", "2019-11-22 20:44:32,778 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:44:32,778 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:44:32,778 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Stud’s Stud’s and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ara ẹni mọ́ , jíjẹ́ ẹni tí kì í ṣe ẹni tí kì í ṣe ẹni tó ń ṣàìsàn , títí láé , nítorí pé kò sí àní - àní . ”\n", "2019-11-22 20:44:32,779 Validation result (greedy) at epoch 18, step 90000: bleu: 26.89, loss: 44701.7695, ppl: 4.4725, duration: 39.6966s\n", "2019-11-22 20:44:47,716 Epoch 18 Step: 90100 Batch Loss: 1.576040 Tokens per Sec: 15849, Lr: 0.000300\n", "2019-11-22 20:45:02,525 Epoch 18 Step: 90200 Batch Loss: 1.508818 Tokens per Sec: 15616, Lr: 0.000300\n", "2019-11-22 20:45:17,276 Epoch 18 Step: 90300 Batch Loss: 1.514325 Tokens per Sec: 15853, Lr: 0.000300\n", "2019-11-22 20:45:32,289 Epoch 18 Step: 90400 Batch Loss: 1.603475 Tokens per Sec: 15005, Lr: 0.000300\n", "2019-11-22 20:45:47,470 Epoch 18 Step: 90500 Batch Loss: 1.571438 Tokens per Sec: 15225, Lr: 0.000300\n", "2019-11-22 20:46:02,616 Epoch 18 Step: 90600 Batch Loss: 1.732231 Tokens per Sec: 15303, Lr: 0.000300\n", "2019-11-22 20:46:17,300 Epoch 18 Step: 90700 Batch Loss: 1.477379 Tokens per Sec: 15710, Lr: 0.000300\n", "2019-11-22 20:46:31,979 Epoch 18 Step: 90800 Batch Loss: 1.398143 Tokens per Sec: 15787, Lr: 0.000300\n", "2019-11-22 20:46:46,866 Epoch 18 Step: 90900 Batch Loss: 1.650631 Tokens per Sec: 15680, Lr: 0.000300\n", "2019-11-22 20:47:02,224 Epoch 18 Step: 91000 Batch Loss: 1.696082 Tokens per Sec: 15433, Lr: 0.000300\n", "2019-11-22 20:47:42,025 Example #0\n", "2019-11-22 20:47:42,026 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:47:42,026 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:47:42,026 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 20:47:42,026 Example #1\n", "2019-11-22 20:47:42,026 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:47:42,026 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:47:42,026 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 20:47:42,026 Example #2\n", "2019-11-22 20:47:42,027 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:47:42,027 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:47:42,027 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:47:42,027 Example #3\n", "2019-11-22 20:47:42,027 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:47:42,027 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:47:42,027 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , ẹ̀mí ìdúródeni túmọ̀ sí “ pípa , jíjẹ́ ẹni tó jẹ́ aláìlábòsí , títí láé , fún ìgbà mìíràn . ”\n", "2019-11-22 20:47:42,028 Validation result (greedy) at epoch 18, step 91000: bleu: 27.36, loss: 44617.7305, ppl: 4.4599, duration: 39.8028s\n", "2019-11-22 20:47:57,022 Epoch 18 Step: 91100 Batch Loss: 1.441011 Tokens per Sec: 15317, Lr: 0.000300\n", "2019-11-22 20:48:12,041 Epoch 18 Step: 91200 Batch Loss: 1.625508 Tokens per Sec: 15685, Lr: 0.000300\n", "2019-11-22 20:48:26,619 Epoch 18 Step: 91300 Batch Loss: 1.671562 Tokens per Sec: 15859, Lr: 0.000300\n", "2019-11-22 20:48:41,848 Epoch 18 Step: 91400 Batch Loss: 1.662126 Tokens per Sec: 15017, Lr: 0.000300\n", "2019-11-22 20:48:56,970 Epoch 18 Step: 91500 Batch Loss: 1.807242 Tokens per Sec: 14896, Lr: 0.000300\n", "2019-11-22 20:49:11,887 Epoch 18 Step: 91600 Batch Loss: 1.591945 Tokens per Sec: 15505, Lr: 0.000300\n", "2019-11-22 20:49:26,952 Epoch 18 Step: 91700 Batch Loss: 1.527838 Tokens per Sec: 15284, Lr: 0.000300\n", "2019-11-22 20:49:42,135 Epoch 18 Step: 91800 Batch Loss: 1.511250 Tokens per Sec: 15162, Lr: 0.000300\n", "2019-11-22 20:49:56,619 Epoch 18 Step: 91900 Batch Loss: 1.586612 Tokens per Sec: 15659, Lr: 0.000300\n", "2019-11-22 20:50:11,792 Epoch 18 Step: 92000 Batch Loss: 1.782441 Tokens per Sec: 15220, Lr: 0.000300\n", "2019-11-22 20:50:52,084 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:50:52,084 Saving new checkpoint.\n", "2019-11-22 20:50:52,536 Example #0\n", "2019-11-22 20:50:52,537 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:50:52,537 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:50:52,537 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 20:50:52,537 Example #1\n", "2019-11-22 20:50:52,538 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:50:52,538 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:50:52,538 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:50:52,538 Example #2\n", "2019-11-22 20:50:52,538 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:50:52,538 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:50:52,538 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:50:52,538 Example #3\n", "2019-11-22 20:50:52,539 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:50:52,539 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:50:52,539 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Harkavy’s Stud’s Greek and Chaldee Dictionary ṣe sọ , ẹ̀mí ìdúródeni túmọ̀ sí “ pípa , ìfaradà , títí láé , nítorí pé ó wà títí láé . ”\n", "2019-11-22 20:50:52,539 Validation result (greedy) at epoch 18, step 92000: bleu: 27.25, loss: 44391.9648, ppl: 4.4263, duration: 40.7466s\n", "2019-11-22 20:51:07,313 Epoch 18 Step: 92100 Batch Loss: 1.635401 Tokens per Sec: 15735, Lr: 0.000300\n", "2019-11-22 20:51:22,258 Epoch 18 Step: 92200 Batch Loss: 1.581625 Tokens per Sec: 15461, Lr: 0.000300\n", "2019-11-22 20:51:37,169 Epoch 18 Step: 92300 Batch Loss: 1.552732 Tokens per Sec: 15661, Lr: 0.000300\n", "2019-11-22 20:51:52,199 Epoch 18 Step: 92400 Batch Loss: 1.673231 Tokens per Sec: 15138, Lr: 0.000300\n", "2019-11-22 20:52:06,970 Epoch 18 Step: 92500 Batch Loss: 1.540900 Tokens per Sec: 15855, Lr: 0.000300\n", "2019-11-22 20:52:21,693 Epoch 18 Step: 92600 Batch Loss: 1.757509 Tokens per Sec: 15340, Lr: 0.000300\n", "2019-11-22 20:52:36,683 Epoch 18 Step: 92700 Batch Loss: 1.532640 Tokens per Sec: 15360, Lr: 0.000300\n", "2019-11-22 20:52:51,369 Epoch 18 Step: 92800 Batch Loss: 1.595624 Tokens per Sec: 15524, Lr: 0.000300\n", "2019-11-22 20:53:05,834 Epoch 18 Step: 92900 Batch Loss: 1.340526 Tokens per Sec: 15734, Lr: 0.000300\n", "2019-11-22 20:53:20,305 Epoch 18 Step: 93000 Batch Loss: 1.896823 Tokens per Sec: 15736, Lr: 0.000300\n", "2019-11-22 20:54:00,207 Hooray! New best validation result [ppl]!\n", "2019-11-22 20:54:00,207 Saving new checkpoint.\n", "2019-11-22 20:54:00,611 Example #0\n", "2019-11-22 20:54:00,611 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:54:00,612 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:54:00,612 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dáa ni .\n", "2019-11-22 20:54:00,612 Example #1\n", "2019-11-22 20:54:00,612 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:54:00,612 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:54:00,612 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 20:54:00,612 Example #2\n", "2019-11-22 20:54:00,613 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:54:00,613 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:54:00,613 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó ju ìwọ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:54:00,613 Example #3\n", "2019-11-22 20:54:00,613 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:54:00,613 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:54:00,614 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Stud’s Hebrew and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ ìfaradà , ìfaradà , ayérayé , nítorí pé kò sí ohun tó lè ṣẹlẹ̀ . ”\n", "2019-11-22 20:54:00,614 Validation result (greedy) at epoch 18, step 93000: bleu: 27.79, loss: 44273.4023, ppl: 4.4088, duration: 40.3082s\n", "2019-11-22 20:54:15,615 Epoch 18 Step: 93100 Batch Loss: 1.426377 Tokens per Sec: 15905, Lr: 0.000300\n", "2019-11-22 20:54:30,561 Epoch 18 Step: 93200 Batch Loss: 1.522738 Tokens per Sec: 15609, Lr: 0.000300\n", "2019-11-22 20:54:45,550 Epoch 18 Step: 93300 Batch Loss: 1.723581 Tokens per Sec: 15348, Lr: 0.000300\n", "2019-11-22 20:55:00,247 Epoch 18 Step: 93400 Batch Loss: 1.722146 Tokens per Sec: 15693, Lr: 0.000300\n", "2019-11-22 20:55:15,064 Epoch 18 Step: 93500 Batch Loss: 1.557412 Tokens per Sec: 15449, Lr: 0.000300\n", "2019-11-22 20:55:29,932 Epoch 18 Step: 93600 Batch Loss: 1.583753 Tokens per Sec: 15078, Lr: 0.000300\n", "2019-11-22 20:55:44,786 Epoch 18 Step: 93700 Batch Loss: 1.533281 Tokens per Sec: 15759, Lr: 0.000300\n", "2019-11-22 20:55:59,638 Epoch 18 Step: 93800 Batch Loss: 1.654800 Tokens per Sec: 15569, Lr: 0.000300\n", "2019-11-22 20:56:14,552 Epoch 18 Step: 93900 Batch Loss: 0.510635 Tokens per Sec: 15374, Lr: 0.000300\n", "2019-11-22 20:56:29,254 Epoch 18 Step: 94000 Batch Loss: 1.631217 Tokens per Sec: 15708, Lr: 0.000300\n", "2019-11-22 20:57:08,568 Example #0\n", "2019-11-22 20:57:08,568 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 20:57:08,568 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 20:57:08,568 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 20:57:08,568 Example #1\n", "2019-11-22 20:57:08,568 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 20:57:08,568 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 20:57:08,569 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara tí mo ní pẹ̀lú Jèhófà àti àwọn èèyàn ?\n", "2019-11-22 20:57:08,569 Example #2\n", "2019-11-22 20:57:08,569 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 20:57:08,569 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 20:57:08,569 \tHypothesis: Ó ní ìrírí tó ga ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 20:57:08,569 Example #3\n", "2019-11-22 20:57:08,569 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 20:57:08,569 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 20:57:08,569 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa ara , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 20:57:08,570 Validation result (greedy) at epoch 18, step 94000: bleu: 27.45, loss: 44356.9961, ppl: 4.4211, duration: 39.3151s\n", "2019-11-22 20:57:23,469 Epoch 18 Step: 94100 Batch Loss: 1.601784 Tokens per Sec: 15346, Lr: 0.000300\n", "2019-11-22 20:57:39,073 Epoch 18 Step: 94200 Batch Loss: 1.556637 Tokens per Sec: 15157, Lr: 0.000300\n", "2019-11-22 20:57:53,957 Epoch 18 Step: 94300 Batch Loss: 1.638817 Tokens per Sec: 15352, Lr: 0.000300\n", "2019-11-22 20:58:08,894 Epoch 18 Step: 94400 Batch Loss: 1.666951 Tokens per Sec: 15577, Lr: 0.000300\n", "2019-11-22 20:58:23,519 Epoch 18 Step: 94500 Batch Loss: 1.535136 Tokens per Sec: 15915, Lr: 0.000300\n", "2019-11-22 20:58:38,776 Epoch 18 Step: 94600 Batch Loss: 1.663071 Tokens per Sec: 15329, Lr: 0.000300\n", "2019-11-22 20:58:53,913 Epoch 18 Step: 94700 Batch Loss: 1.695413 Tokens per Sec: 15590, Lr: 0.000300\n", "2019-11-22 20:59:08,751 Epoch 18 Step: 94800 Batch Loss: 1.684641 Tokens per Sec: 15721, Lr: 0.000300\n", "2019-11-22 20:59:13,888 Epoch 18: total training loss 8578.95\n", "2019-11-22 20:59:13,889 EPOCH 19\n", "2019-11-22 20:59:24,526 Epoch 19 Step: 94900 Batch Loss: 1.380356 Tokens per Sec: 14468, Lr: 0.000300\n", "2019-11-22 20:59:39,979 Epoch 19 Step: 95000 Batch Loss: 1.868164 Tokens per Sec: 14703, Lr: 0.000300\n", "2019-11-22 21:00:19,168 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:00:19,169 Saving new checkpoint.\n", "2019-11-22 21:00:19,564 Example #0\n", "2019-11-22 21:00:19,564 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:00:19,564 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:00:19,565 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 21:00:19,565 Example #1\n", "2019-11-22 21:00:19,565 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:00:19,565 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:00:19,565 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 21:00:19,566 Example #2\n", "2019-11-22 21:00:19,566 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:00:19,566 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:00:19,566 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ń mú kí nǹkan nira fún ọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:00:19,566 Example #3\n", "2019-11-22 21:00:19,567 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:00:19,567 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:00:19,568 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , ẹ̀mí ìdúróṣinṣin , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 21:00:19,568 Validation result (greedy) at epoch 19, step 95000: bleu: 27.36, loss: 44258.0820, ppl: 4.4065, duration: 39.5890s\n", "2019-11-22 21:00:34,710 Epoch 19 Step: 95100 Batch Loss: 1.691883 Tokens per Sec: 15427, Lr: 0.000300\n", "2019-11-22 21:00:49,664 Epoch 19 Step: 95200 Batch Loss: 1.442258 Tokens per Sec: 15328, Lr: 0.000300\n", "2019-11-22 21:01:04,828 Epoch 19 Step: 95300 Batch Loss: 1.684685 Tokens per Sec: 15650, Lr: 0.000300\n", "2019-11-22 21:01:19,943 Epoch 19 Step: 95400 Batch Loss: 1.510193 Tokens per Sec: 15660, Lr: 0.000300\n", "2019-11-22 21:01:34,852 Epoch 19 Step: 95500 Batch Loss: 1.612412 Tokens per Sec: 15248, Lr: 0.000300\n", "2019-11-22 21:01:49,634 Epoch 19 Step: 95600 Batch Loss: 1.577331 Tokens per Sec: 15379, Lr: 0.000300\n", "2019-11-22 21:02:04,749 Epoch 19 Step: 95700 Batch Loss: 1.682149 Tokens per Sec: 15319, Lr: 0.000300\n", "2019-11-22 21:02:19,833 Epoch 19 Step: 95800 Batch Loss: 1.602911 Tokens per Sec: 15285, Lr: 0.000300\n", "2019-11-22 21:02:35,214 Epoch 19 Step: 95900 Batch Loss: 1.298134 Tokens per Sec: 15203, Lr: 0.000300\n", "2019-11-22 21:02:50,079 Epoch 19 Step: 96000 Batch Loss: 1.693936 Tokens per Sec: 15229, Lr: 0.000300\n", "2019-11-22 21:03:29,703 Example #0\n", "2019-11-22 21:03:29,703 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:03:29,703 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:03:29,703 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 21:03:29,703 Example #1\n", "2019-11-22 21:03:29,704 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:03:29,704 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:03:29,704 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 21:03:29,704 Example #2\n", "2019-11-22 21:03:29,704 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:03:29,704 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:03:29,704 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì níye lórí ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:03:29,704 Example #3\n", "2019-11-22 21:03:29,704 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:03:29,705 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:03:29,705 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , “ pípa tí wọ́n ń jẹ , jíjẹ́ ẹni tí kò láárí mọ́ , jíjẹ́ ẹni tí kò ní pẹ́ títí , títí láé . ”\n", "2019-11-22 21:03:29,705 Validation result (greedy) at epoch 19, step 96000: bleu: 27.51, loss: 44267.2930, ppl: 4.4079, duration: 39.6251s\n", "2019-11-22 21:03:44,997 Epoch 19 Step: 96100 Batch Loss: 1.655428 Tokens per Sec: 15203, Lr: 0.000300\n", "2019-11-22 21:03:59,651 Epoch 19 Step: 96200 Batch Loss: 1.642620 Tokens per Sec: 15608, Lr: 0.000300\n", "2019-11-22 21:04:14,658 Epoch 19 Step: 96300 Batch Loss: 1.626312 Tokens per Sec: 15226, Lr: 0.000300\n", "2019-11-22 21:04:29,490 Epoch 19 Step: 96400 Batch Loss: 1.428328 Tokens per Sec: 15568, Lr: 0.000300\n", "2019-11-22 21:04:44,517 Epoch 19 Step: 96500 Batch Loss: 1.542014 Tokens per Sec: 15532, Lr: 0.000300\n", "2019-11-22 21:04:59,225 Epoch 19 Step: 96600 Batch Loss: 1.672513 Tokens per Sec: 15716, Lr: 0.000300\n", "2019-11-22 21:05:13,983 Epoch 19 Step: 96700 Batch Loss: 1.651574 Tokens per Sec: 15675, Lr: 0.000300\n", "2019-11-22 21:05:28,664 Epoch 19 Step: 96800 Batch Loss: 1.739127 Tokens per Sec: 16002, Lr: 0.000300\n", "2019-11-22 21:05:44,021 Epoch 19 Step: 96900 Batch Loss: 1.600442 Tokens per Sec: 14629, Lr: 0.000300\n", "2019-11-22 21:05:59,101 Epoch 19 Step: 97000 Batch Loss: 1.719082 Tokens per Sec: 15597, Lr: 0.000300\n", "2019-11-22 21:06:38,646 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:06:38,647 Saving new checkpoint.\n", "2019-11-22 21:06:39,030 Example #0\n", "2019-11-22 21:06:39,030 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:06:39,031 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:06:39,031 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 21:06:39,031 Example #1\n", "2019-11-22 21:06:39,031 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:06:39,031 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:06:39,034 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara tí mo ní pẹ̀lú Jèhófà àti àwọn èèyàn ?\n", "2019-11-22 21:06:39,034 Example #2\n", "2019-11-22 21:06:39,034 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:06:39,034 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:06:39,034 \tHypothesis: Ó ní ìrírí àti ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:06:39,034 Example #3\n", "2019-11-22 21:06:39,034 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:06:39,035 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:06:39,035 \tHypothesis: Gẹ́gẹ́ bí ìwé Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa tí kò ní láárí , jíjẹ́ ẹni tó ní ìfaradà , jíjẹ́ ẹni tó ní ìfaradà , títí láé . ”\n", "2019-11-22 21:06:39,035 Validation result (greedy) at epoch 19, step 97000: bleu: 27.34, loss: 44100.9297, ppl: 4.3834, duration: 39.9335s\n", "2019-11-22 21:06:53,738 Epoch 19 Step: 97100 Batch Loss: 1.820669 Tokens per Sec: 15509, Lr: 0.000300\n", "2019-11-22 21:07:08,440 Epoch 19 Step: 97200 Batch Loss: 1.600401 Tokens per Sec: 15948, Lr: 0.000300\n", "2019-11-22 21:07:22,920 Epoch 19 Step: 97300 Batch Loss: 1.547576 Tokens per Sec: 15798, Lr: 0.000300\n", "2019-11-22 21:07:37,943 Epoch 19 Step: 97400 Batch Loss: 1.809657 Tokens per Sec: 15514, Lr: 0.000300\n", "2019-11-22 21:07:53,326 Epoch 19 Step: 97500 Batch Loss: 1.526635 Tokens per Sec: 15381, Lr: 0.000300\n", "2019-11-22 21:08:08,259 Epoch 19 Step: 97600 Batch Loss: 1.553174 Tokens per Sec: 15735, Lr: 0.000300\n", "2019-11-22 21:08:23,829 Epoch 19 Step: 97700 Batch Loss: 1.612436 Tokens per Sec: 14560, Lr: 0.000300\n", "2019-11-22 21:08:38,576 Epoch 19 Step: 97800 Batch Loss: 1.502536 Tokens per Sec: 15919, Lr: 0.000300\n", "2019-11-22 21:08:53,672 Epoch 19 Step: 97900 Batch Loss: 1.352056 Tokens per Sec: 15560, Lr: 0.000300\n", "2019-11-22 21:09:08,988 Epoch 19 Step: 98000 Batch Loss: 1.676750 Tokens per Sec: 14761, Lr: 0.000300\n", "2019-11-22 21:09:47,751 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:09:47,751 Saving new checkpoint.\n", "2019-11-22 21:09:48,115 Example #0\n", "2019-11-22 21:09:48,116 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:09:48,116 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:09:48,116 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 21:09:48,117 Example #1\n", "2019-11-22 21:09:48,117 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:09:48,117 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:09:48,117 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 21:09:48,117 Example #2\n", "2019-11-22 21:09:48,117 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:09:48,117 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:09:48,117 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:09:48,117 Example #3\n", "2019-11-22 21:09:48,118 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:09:48,118 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:09:48,118 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ti sọ , ẹ̀mí ẹ̀mí ẹ̀mí ìdúródeni túmọ̀ sí “ pípa , jíjẹ́ ẹni tó ń ṣojúsàájú , jíjẹ́ ẹni tó ń ṣàánú , títí láé , nítorí pé kò sí ohun tó lè ṣẹlẹ̀ . ”\n", "2019-11-22 21:09:48,118 Validation result (greedy) at epoch 19, step 98000: bleu: 27.76, loss: 44009.7539, ppl: 4.3700, duration: 39.1300s\n", "2019-11-22 21:10:03,303 Epoch 19 Step: 98100 Batch Loss: 1.611498 Tokens per Sec: 15467, Lr: 0.000300\n", "2019-11-22 21:10:18,468 Epoch 19 Step: 98200 Batch Loss: 1.589636 Tokens per Sec: 15338, Lr: 0.000300\n", "2019-11-22 21:10:33,431 Epoch 19 Step: 98300 Batch Loss: 1.672787 Tokens per Sec: 15628, Lr: 0.000300\n", "2019-11-22 21:10:48,130 Epoch 19 Step: 98400 Batch Loss: 1.499871 Tokens per Sec: 15579, Lr: 0.000300\n", "2019-11-22 21:11:03,300 Epoch 19 Step: 98500 Batch Loss: 1.796529 Tokens per Sec: 14981, Lr: 0.000300\n", "2019-11-22 21:11:18,330 Epoch 19 Step: 98600 Batch Loss: 1.744432 Tokens per Sec: 15585, Lr: 0.000300\n", "2019-11-22 21:11:32,915 Epoch 19 Step: 98700 Batch Loss: 1.702220 Tokens per Sec: 15935, Lr: 0.000300\n", "2019-11-22 21:11:47,623 Epoch 19 Step: 98800 Batch Loss: 1.613886 Tokens per Sec: 15923, Lr: 0.000300\n", "2019-11-22 21:12:02,388 Epoch 19 Step: 98900 Batch Loss: 1.638919 Tokens per Sec: 15833, Lr: 0.000300\n", "2019-11-22 21:12:17,298 Epoch 19 Step: 99000 Batch Loss: 1.598165 Tokens per Sec: 15517, Lr: 0.000300\n", "2019-11-22 21:12:56,641 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:12:56,641 Saving new checkpoint.\n", "2019-11-22 21:12:56,950 Example #0\n", "2019-11-22 21:12:56,950 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:12:56,950 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:12:56,950 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:12:56,950 Example #1\n", "2019-11-22 21:12:56,951 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:12:56,951 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:12:56,951 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 21:12:56,951 Example #2\n", "2019-11-22 21:12:56,951 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:12:56,951 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:12:56,951 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó ju èyí tó o ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:12:56,952 Example #3\n", "2019-11-22 21:12:56,952 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:12:56,952 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:12:56,952 \tHypothesis: Gẹ́gẹ́ bí ìwé ìròyìn Harkavy’s Students ’ àti Chaldee Dictionary ṣe sọ , ẹ̀mí ìdúróṣinṣin túmọ̀ sí “ pípa ara pọ̀ , jíjẹ́ ẹni tó ń ṣojúsàájú , títí láé , títí láé . ”\n", "2019-11-22 21:12:56,952 Validation result (greedy) at epoch 19, step 99000: bleu: 27.64, loss: 43902.3750, ppl: 4.3543, duration: 39.6536s\n", "2019-11-22 21:13:12,062 Epoch 19 Step: 99100 Batch Loss: 1.648959 Tokens per Sec: 15358, Lr: 0.000300\n", "2019-11-22 21:13:26,877 Epoch 19 Step: 99200 Batch Loss: 1.591777 Tokens per Sec: 15003, Lr: 0.000300\n", "2019-11-22 21:13:41,888 Epoch 19 Step: 99300 Batch Loss: 1.687308 Tokens per Sec: 15688, Lr: 0.000300\n", "2019-11-22 21:13:56,515 Epoch 19 Step: 99400 Batch Loss: 1.638022 Tokens per Sec: 15803, Lr: 0.000300\n", "2019-11-22 21:14:11,573 Epoch 19 Step: 99500 Batch Loss: 1.566030 Tokens per Sec: 15479, Lr: 0.000300\n", "2019-11-22 21:14:26,262 Epoch 19 Step: 99600 Batch Loss: 1.684414 Tokens per Sec: 15645, Lr: 0.000300\n", "2019-11-22 21:14:41,212 Epoch 19 Step: 99700 Batch Loss: 1.645632 Tokens per Sec: 15440, Lr: 0.000300\n", "2019-11-22 21:14:56,038 Epoch 19 Step: 99800 Batch Loss: 1.512568 Tokens per Sec: 15693, Lr: 0.000300\n", "2019-11-22 21:15:10,566 Epoch 19 Step: 99900 Batch Loss: 1.714731 Tokens per Sec: 15691, Lr: 0.000300\n", "2019-11-22 21:15:25,520 Epoch 19 Step: 100000 Batch Loss: 1.665435 Tokens per Sec: 15456, Lr: 0.000300\n", "2019-11-22 21:16:04,934 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:16:04,934 Saving new checkpoint.\n", "2019-11-22 21:16:05,236 Example #0\n", "2019-11-22 21:16:05,236 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:16:05,236 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:16:05,236 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:16:05,236 Example #1\n", "2019-11-22 21:16:05,237 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:16:05,237 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:16:05,237 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 21:16:05,237 Example #2\n", "2019-11-22 21:16:05,237 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:16:05,237 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:16:05,237 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì níye lórí ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:16:05,238 Example #3\n", "2019-11-22 21:16:05,238 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:16:05,238 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:16:05,238 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , Greadh túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , nítorí pé ó ṣeé ṣe . ”\n", "2019-11-22 21:16:05,238 Validation result (greedy) at epoch 19, step 100000: bleu: 27.76, loss: 43820.7695, ppl: 4.3424, duration: 39.7177s\n", "2019-11-22 21:16:20,144 Epoch 19: total training loss 8492.00\n", "2019-11-22 21:16:20,145 EPOCH 20\n", "2019-11-22 21:16:21,014 Epoch 20 Step: 100100 Batch Loss: 1.457240 Tokens per Sec: 5004, Lr: 0.000300\n", "2019-11-22 21:16:35,866 Epoch 20 Step: 100200 Batch Loss: 1.595183 Tokens per Sec: 15627, Lr: 0.000300\n", "2019-11-22 21:16:50,753 Epoch 20 Step: 100300 Batch Loss: 1.564803 Tokens per Sec: 15618, Lr: 0.000300\n", "2019-11-22 21:17:05,560 Epoch 20 Step: 100400 Batch Loss: 1.513261 Tokens per Sec: 15855, Lr: 0.000300\n", "2019-11-22 21:17:20,063 Epoch 20 Step: 100500 Batch Loss: 1.715981 Tokens per Sec: 16089, Lr: 0.000300\n", "2019-11-22 21:17:35,048 Epoch 20 Step: 100600 Batch Loss: 1.568985 Tokens per Sec: 15430, Lr: 0.000300\n", "2019-11-22 21:17:49,914 Epoch 20 Step: 100700 Batch Loss: 1.681697 Tokens per Sec: 15608, Lr: 0.000300\n", "2019-11-22 21:18:04,911 Epoch 20 Step: 100800 Batch Loss: 1.642986 Tokens per Sec: 15547, Lr: 0.000300\n", "2019-11-22 21:18:19,538 Epoch 20 Step: 100900 Batch Loss: 1.476083 Tokens per Sec: 15360, Lr: 0.000300\n", "2019-11-22 21:18:34,619 Epoch 20 Step: 101000 Batch Loss: 1.611714 Tokens per Sec: 15724, Lr: 0.000300\n", "2019-11-22 21:19:14,931 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:19:14,931 Saving new checkpoint.\n", "2019-11-22 21:19:15,246 Example #0\n", "2019-11-22 21:19:15,247 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:19:15,247 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:19:15,247 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dáa gan - an ni .\n", "2019-11-22 21:19:15,247 Example #1\n", "2019-11-22 21:19:15,248 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:19:15,248 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:19:15,248 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 21:19:15,249 Example #2\n", "2019-11-22 21:19:15,249 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:19:15,249 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:19:15,250 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún ju èyí tó o ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:19:15,250 Example #3\n", "2019-11-22 21:19:15,250 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:19:15,250 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:19:15,250 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , ẹ̀mí ìdúródenadh túmọ̀ sí “ pípa ara pọ̀ , jíjẹ́ ẹni tó ń ṣàìsàn , títí láé . ”\n", "2019-11-22 21:19:15,250 Validation result (greedy) at epoch 20, step 101000: bleu: 27.97, loss: 43753.1992, ppl: 4.3326, duration: 40.6307s\n", "2019-11-22 21:19:30,127 Epoch 20 Step: 101100 Batch Loss: 1.642865 Tokens per Sec: 15266, Lr: 0.000300\n", "2019-11-22 21:19:44,972 Epoch 20 Step: 101200 Batch Loss: 1.360693 Tokens per Sec: 15528, Lr: 0.000300\n", "2019-11-22 21:19:59,974 Epoch 20 Step: 101300 Batch Loss: 1.503125 Tokens per Sec: 14930, Lr: 0.000300\n", "2019-11-22 21:20:14,652 Epoch 20 Step: 101400 Batch Loss: 1.525021 Tokens per Sec: 15599, Lr: 0.000300\n", "2019-11-22 21:20:29,628 Epoch 20 Step: 101500 Batch Loss: 1.762026 Tokens per Sec: 15231, Lr: 0.000300\n", "2019-11-22 21:20:44,785 Epoch 20 Step: 101600 Batch Loss: 1.588973 Tokens per Sec: 15659, Lr: 0.000300\n", "2019-11-22 21:20:59,626 Epoch 20 Step: 101700 Batch Loss: 1.732967 Tokens per Sec: 15574, Lr: 0.000300\n", "2019-11-22 21:21:14,780 Epoch 20 Step: 101800 Batch Loss: 1.622060 Tokens per Sec: 14859, Lr: 0.000300\n", "2019-11-22 21:21:29,661 Epoch 20 Step: 101900 Batch Loss: 1.798751 Tokens per Sec: 15549, Lr: 0.000300\n", "2019-11-22 21:21:44,483 Epoch 20 Step: 102000 Batch Loss: 1.680089 Tokens per Sec: 15544, Lr: 0.000300\n", "2019-11-22 21:22:23,847 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:22:23,847 Saving new checkpoint.\n", "2019-11-22 21:22:24,187 Example #0\n", "2019-11-22 21:22:24,187 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:22:24,187 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:22:24,187 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 21:22:24,187 Example #1\n", "2019-11-22 21:22:24,187 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:22:24,188 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:22:24,188 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 21:22:24,188 Example #2\n", "2019-11-22 21:22:24,188 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:22:24,188 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:22:24,188 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:22:24,188 Example #3\n", "2019-11-22 21:22:24,188 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:22:24,188 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:22:24,189 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , Greadh túmọ̀ sí “ pípa ara ẹni mọ́ , ìfaradà , ayérayé , nítorí pé kò sí ìgbà kankan . ”\n", "2019-11-22 21:22:24,189 Validation result (greedy) at epoch 20, step 102000: bleu: 27.36, loss: 43741.5234, ppl: 4.3309, duration: 39.7054s\n", "2019-11-22 21:22:39,003 Epoch 20 Step: 102100 Batch Loss: 1.277653 Tokens per Sec: 15868, Lr: 0.000300\n", "2019-11-22 21:22:54,181 Epoch 20 Step: 102200 Batch Loss: 1.751354 Tokens per Sec: 15302, Lr: 0.000300\n", "2019-11-22 21:23:09,108 Epoch 20 Step: 102300 Batch Loss: 1.573533 Tokens per Sec: 15088, Lr: 0.000300\n", "2019-11-22 21:23:24,046 Epoch 20 Step: 102400 Batch Loss: 1.630090 Tokens per Sec: 15577, Lr: 0.000300\n", "2019-11-22 21:23:39,345 Epoch 20 Step: 102500 Batch Loss: 1.508060 Tokens per Sec: 15433, Lr: 0.000300\n", "2019-11-22 21:23:54,099 Epoch 20 Step: 102600 Batch Loss: 1.526354 Tokens per Sec: 16120, Lr: 0.000300\n", "2019-11-22 21:24:08,731 Epoch 20 Step: 102700 Batch Loss: 1.656579 Tokens per Sec: 15832, Lr: 0.000300\n", "2019-11-22 21:24:23,618 Epoch 20 Step: 102800 Batch Loss: 1.667231 Tokens per Sec: 15243, Lr: 0.000300\n", "2019-11-22 21:24:38,539 Epoch 20 Step: 102900 Batch Loss: 1.524169 Tokens per Sec: 15675, Lr: 0.000300\n", "2019-11-22 21:24:53,410 Epoch 20 Step: 103000 Batch Loss: 1.523323 Tokens per Sec: 15507, Lr: 0.000300\n", "2019-11-22 21:25:33,006 Example #0\n", "2019-11-22 21:25:33,007 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:25:33,007 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:25:33,007 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 21:25:33,007 Example #1\n", "2019-11-22 21:25:33,008 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:25:33,008 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:25:33,008 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 21:25:33,008 Example #2\n", "2019-11-22 21:25:33,008 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:25:33,008 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:25:33,008 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:25:33,009 Example #3\n", "2019-11-22 21:25:33,009 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:25:33,009 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:25:33,009 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , ẹ̀mí ìdúródeni , jíjẹ́ ẹni tó ń ṣàìsàn , jíjẹ́ ẹni tó ń ṣàìsàn , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 21:25:33,009 Validation result (greedy) at epoch 20, step 103000: bleu: 27.46, loss: 43810.6641, ppl: 4.3409, duration: 39.5992s\n", "2019-11-22 21:25:47,909 Epoch 20 Step: 103100 Batch Loss: 1.672420 Tokens per Sec: 15994, Lr: 0.000300\n", "2019-11-22 21:26:02,010 Epoch 20 Step: 103200 Batch Loss: 1.567407 Tokens per Sec: 15789, Lr: 0.000300\n", "2019-11-22 21:26:16,938 Epoch 20 Step: 103300 Batch Loss: 1.558486 Tokens per Sec: 15858, Lr: 0.000300\n", "2019-11-22 21:26:32,208 Epoch 20 Step: 103400 Batch Loss: 1.591221 Tokens per Sec: 15575, Lr: 0.000300\n", "2019-11-22 21:26:47,076 Epoch 20 Step: 103500 Batch Loss: 1.537541 Tokens per Sec: 15405, Lr: 0.000300\n", "2019-11-22 21:27:01,672 Epoch 20 Step: 103600 Batch Loss: 1.272653 Tokens per Sec: 15858, Lr: 0.000300\n", "2019-11-22 21:27:16,245 Epoch 20 Step: 103700 Batch Loss: 1.590712 Tokens per Sec: 15801, Lr: 0.000300\n", "2019-11-22 21:27:31,248 Epoch 20 Step: 103800 Batch Loss: 1.536085 Tokens per Sec: 15473, Lr: 0.000300\n", "2019-11-22 21:27:45,990 Epoch 20 Step: 103900 Batch Loss: 1.675096 Tokens per Sec: 15558, Lr: 0.000300\n", "2019-11-22 21:28:00,588 Epoch 20 Step: 104000 Batch Loss: 1.485709 Tokens per Sec: 15652, Lr: 0.000300\n", "2019-11-22 21:28:39,607 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:28:39,607 Saving new checkpoint.\n", "2019-11-22 21:28:39,923 Example #0\n", "2019-11-22 21:28:39,923 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:28:39,923 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:28:39,924 \tHypothesis: Ní báyìí , mo ti wá rí iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:28:39,924 Example #1\n", "2019-11-22 21:28:39,924 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:28:39,924 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:28:39,924 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 21:28:39,924 Example #2\n", "2019-11-22 21:28:39,924 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:28:39,924 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:28:39,924 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì tún ní ìrírí tó ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:28:39,924 Example #3\n", "2019-11-22 21:28:39,925 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:28:39,925 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:28:39,925 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ and Chaldee Dictionary ṣe sọ , Loadh túmọ̀ sí “ ìfaradà , ìfaradà , ayérayé , fún àkókò èyíkéyìí . ”\n", "2019-11-22 21:28:39,925 Validation result (greedy) at epoch 20, step 104000: bleu: 27.58, loss: 43704.0938, ppl: 4.3255, duration: 39.3364s\n", "2019-11-22 21:28:54,459 Epoch 20 Step: 104100 Batch Loss: 1.651636 Tokens per Sec: 15892, Lr: 0.000300\n", "2019-11-22 21:29:08,845 Epoch 20 Step: 104200 Batch Loss: 1.684310 Tokens per Sec: 16095, Lr: 0.000300\n", "2019-11-22 21:29:23,524 Epoch 20 Step: 104300 Batch Loss: 1.505278 Tokens per Sec: 15542, Lr: 0.000300\n", "2019-11-22 21:29:38,253 Epoch 20 Step: 104400 Batch Loss: 1.461483 Tokens per Sec: 15746, Lr: 0.000300\n", "2019-11-22 21:29:53,204 Epoch 20 Step: 104500 Batch Loss: 1.746076 Tokens per Sec: 15196, Lr: 0.000300\n", "2019-11-22 21:30:07,852 Epoch 20 Step: 104600 Batch Loss: 1.846210 Tokens per Sec: 15854, Lr: 0.000300\n", "2019-11-22 21:30:22,282 Epoch 20 Step: 104700 Batch Loss: 1.735857 Tokens per Sec: 15875, Lr: 0.000300\n", "2019-11-22 21:30:37,274 Epoch 20 Step: 104800 Batch Loss: 1.590485 Tokens per Sec: 15050, Lr: 0.000300\n", "2019-11-22 21:30:52,131 Epoch 20 Step: 104900 Batch Loss: 1.835269 Tokens per Sec: 15666, Lr: 0.000300\n", "2019-11-22 21:31:06,817 Epoch 20 Step: 105000 Batch Loss: 1.469874 Tokens per Sec: 15731, Lr: 0.000300\n", "2019-11-22 21:31:46,601 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:31:46,601 Saving new checkpoint.\n", "2019-11-22 21:31:46,941 Example #0\n", "2019-11-22 21:31:46,942 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:31:46,942 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:31:46,942 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 21:31:46,942 Example #1\n", "2019-11-22 21:31:46,942 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:31:46,942 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:31:46,942 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 21:31:46,943 Example #2\n", "2019-11-22 21:31:46,943 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:31:46,943 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:31:46,943 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìmí ẹ̀dùn tó pọ̀ ju tìrẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:31:46,943 Example #3\n", "2019-11-22 21:31:46,943 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:31:46,943 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:31:46,943 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Greek and Chaldee Dictionary ṣe sọ , ẹ̀mí mímọ́ túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , nítorí pé ó ti wà títí láé . ”\n", "2019-11-22 21:31:46,943 Validation result (greedy) at epoch 20, step 105000: bleu: 27.55, loss: 43678.7891, ppl: 4.3218, duration: 40.1263s\n", "2019-11-22 21:32:01,947 Epoch 20 Step: 105100 Batch Loss: 1.704978 Tokens per Sec: 15626, Lr: 0.000300\n", "2019-11-22 21:32:16,542 Epoch 20 Step: 105200 Batch Loss: 1.621272 Tokens per Sec: 15815, Lr: 0.000300\n", "2019-11-22 21:32:31,287 Epoch 20 Step: 105300 Batch Loss: 1.644099 Tokens per Sec: 15563, Lr: 0.000300\n", "2019-11-22 21:32:41,869 Epoch 20: total training loss 8454.10\n", "2019-11-22 21:32:41,869 EPOCH 21\n", "2019-11-22 21:32:46,739 Epoch 21 Step: 105400 Batch Loss: 1.737627 Tokens per Sec: 14330, Lr: 0.000300\n", "2019-11-22 21:33:01,560 Epoch 21 Step: 105500 Batch Loss: 1.702609 Tokens per Sec: 15657, Lr: 0.000300\n", "2019-11-22 21:33:16,041 Epoch 21 Step: 105600 Batch Loss: 1.590939 Tokens per Sec: 16037, Lr: 0.000300\n", "2019-11-22 21:33:30,730 Epoch 21 Step: 105700 Batch Loss: 1.670056 Tokens per Sec: 15632, Lr: 0.000300\n", "2019-11-22 21:33:45,318 Epoch 21 Step: 105800 Batch Loss: 1.740239 Tokens per Sec: 16073, Lr: 0.000300\n", "2019-11-22 21:34:00,734 Epoch 21 Step: 105900 Batch Loss: 1.708194 Tokens per Sec: 15156, Lr: 0.000300\n", "2019-11-22 21:34:15,691 Epoch 21 Step: 106000 Batch Loss: 1.727259 Tokens per Sec: 15088, Lr: 0.000300\n", "2019-11-22 21:34:55,144 Example #0\n", "2019-11-22 21:34:55,144 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:34:55,144 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:34:55,144 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:34:55,145 Example #1\n", "2019-11-22 21:34:55,145 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:34:55,145 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:34:55,145 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 21:34:55,145 Example #2\n", "2019-11-22 21:34:55,145 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:34:55,146 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:34:55,146 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó ju ìwọ lọ , ṣùgbọ́n ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:34:55,146 Example #3\n", "2019-11-22 21:34:55,146 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:34:55,146 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:34:55,146 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ pípa , ìfaradà , ìfaradà , títí ayérayé , nítorí pé kò sí . ”\n", "2019-11-22 21:34:55,146 Validation result (greedy) at epoch 21, step 106000: bleu: 27.53, loss: 43824.6445, ppl: 4.3430, duration: 39.4551s\n", "2019-11-22 21:35:09,895 Epoch 21 Step: 106100 Batch Loss: 1.683293 Tokens per Sec: 15558, Lr: 0.000300\n", "2019-11-22 21:35:24,807 Epoch 21 Step: 106200 Batch Loss: 1.614103 Tokens per Sec: 15524, Lr: 0.000300\n", "2019-11-22 21:35:39,341 Epoch 21 Step: 106300 Batch Loss: 1.632254 Tokens per Sec: 16106, Lr: 0.000300\n", "2019-11-22 21:35:54,157 Epoch 21 Step: 106400 Batch Loss: 1.675527 Tokens per Sec: 15363, Lr: 0.000300\n", "2019-11-22 21:36:08,992 Epoch 21 Step: 106500 Batch Loss: 1.741642 Tokens per Sec: 15840, Lr: 0.000300\n", "2019-11-22 21:36:23,950 Epoch 21 Step: 106600 Batch Loss: 1.572420 Tokens per Sec: 15770, Lr: 0.000300\n", "2019-11-22 21:36:38,422 Epoch 21 Step: 106700 Batch Loss: 1.611669 Tokens per Sec: 15840, Lr: 0.000300\n", "2019-11-22 21:36:53,472 Epoch 21 Step: 106800 Batch Loss: 1.504990 Tokens per Sec: 15674, Lr: 0.000300\n", "2019-11-22 21:37:09,120 Epoch 21 Step: 106900 Batch Loss: 1.628757 Tokens per Sec: 14963, Lr: 0.000300\n", "2019-11-22 21:37:23,994 Epoch 21 Step: 107000 Batch Loss: 1.718890 Tokens per Sec: 15874, Lr: 0.000300\n", "2019-11-22 21:38:02,529 Example #0\n", "2019-11-22 21:38:02,529 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:38:02,529 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:38:02,530 \tHypothesis: Ní báyìí , mo ti wá rí iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:38:02,530 Example #1\n", "2019-11-22 21:38:02,530 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:38:02,530 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:38:02,530 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 21:38:02,530 Example #2\n", "2019-11-22 21:38:02,530 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:38:02,531 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:38:02,531 \tHypothesis: Ó ní ìrírí àti amina ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:38:02,531 Example #3\n", "2019-11-22 21:38:02,531 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:38:02,531 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:38:02,531 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ àti Chaldee Dictionary ṣe sọ , “ pípa tí wọ́n ń jẹ , jíjẹ́ ẹni tó ń fìtara ṣe iṣẹ́ ìsìn Ọlọ́run mọ́ títí láé , títí láé . ”\n", "2019-11-22 21:38:02,531 Validation result (greedy) at epoch 21, step 107000: bleu: 27.56, loss: 43689.6328, ppl: 4.3234, duration: 38.5365s\n", "2019-11-22 21:38:17,217 Epoch 21 Step: 107100 Batch Loss: 1.615608 Tokens per Sec: 15952, Lr: 0.000300\n", "2019-11-22 21:38:31,985 Epoch 21 Step: 107200 Batch Loss: 1.348237 Tokens per Sec: 15813, Lr: 0.000300\n", "2019-11-22 21:38:46,509 Epoch 21 Step: 107300 Batch Loss: 1.587620 Tokens per Sec: 15483, Lr: 0.000300\n", "2019-11-22 21:39:00,936 Epoch 21 Step: 107400 Batch Loss: 1.526895 Tokens per Sec: 16230, Lr: 0.000300\n", "2019-11-22 21:39:15,414 Epoch 21 Step: 107500 Batch Loss: 1.566335 Tokens per Sec: 16099, Lr: 0.000300\n", "2019-11-22 21:39:30,444 Epoch 21 Step: 107600 Batch Loss: 1.663119 Tokens per Sec: 15128, Lr: 0.000300\n", "2019-11-22 21:39:44,921 Epoch 21 Step: 107700 Batch Loss: 1.632383 Tokens per Sec: 15769, Lr: 0.000300\n", "2019-11-22 21:39:59,543 Epoch 21 Step: 107800 Batch Loss: 1.765630 Tokens per Sec: 15818, Lr: 0.000300\n", "2019-11-22 21:40:14,213 Epoch 21 Step: 107900 Batch Loss: 1.596165 Tokens per Sec: 15564, Lr: 0.000300\n", "2019-11-22 21:40:29,081 Epoch 21 Step: 108000 Batch Loss: 1.690495 Tokens per Sec: 15838, Lr: 0.000300\n", "2019-11-22 21:41:07,765 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:41:07,765 Saving new checkpoint.\n", "2019-11-22 21:41:08,097 Example #0\n", "2019-11-22 21:41:08,097 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:41:08,097 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:41:08,097 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára jù lọ ni .\n", "2019-11-22 21:41:08,098 Example #1\n", "2019-11-22 21:41:08,098 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:41:08,098 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:41:08,098 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 21:41:08,098 Example #2\n", "2019-11-22 21:41:08,098 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:41:08,098 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:41:08,098 \tHypothesis: Ó ní ìrírí àti ìrírí tó pọ̀ ju tìẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:41:08,099 Example #3\n", "2019-11-22 21:41:08,099 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:41:08,099 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:41:08,099 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , ìdàgbàsókè , ìfaradà , ìfaradà , ìfaradà , títí láé , fún ìgbà gbogbo . ”\n", "2019-11-22 21:41:08,099 Validation result (greedy) at epoch 21, step 108000: bleu: 27.73, loss: 43538.6211, ppl: 4.3015, duration: 39.0180s\n", "2019-11-22 21:41:23,043 Epoch 21 Step: 108100 Batch Loss: 1.514063 Tokens per Sec: 15669, Lr: 0.000300\n", "2019-11-22 21:41:37,414 Epoch 21 Step: 108200 Batch Loss: 1.868731 Tokens per Sec: 16091, Lr: 0.000300\n", "2019-11-22 21:41:52,057 Epoch 21 Step: 108300 Batch Loss: 1.706495 Tokens per Sec: 15473, Lr: 0.000300\n", "2019-11-22 21:42:07,315 Epoch 21 Step: 108400 Batch Loss: 1.585463 Tokens per Sec: 15217, Lr: 0.000300\n", "2019-11-22 21:42:21,654 Epoch 21 Step: 108500 Batch Loss: 1.312557 Tokens per Sec: 16268, Lr: 0.000300\n", "2019-11-22 21:42:36,312 Epoch 21 Step: 108600 Batch Loss: 1.709908 Tokens per Sec: 15434, Lr: 0.000300\n", "2019-11-22 21:42:50,428 Epoch 21 Step: 108700 Batch Loss: 1.646346 Tokens per Sec: 16938, Lr: 0.000300\n", "2019-11-22 21:43:04,545 Epoch 21 Step: 108800 Batch Loss: 1.617369 Tokens per Sec: 16047, Lr: 0.000300\n", "2019-11-22 21:43:18,803 Epoch 21 Step: 108900 Batch Loss: 1.801594 Tokens per Sec: 16647, Lr: 0.000300\n", "2019-11-22 21:43:33,301 Epoch 21 Step: 109000 Batch Loss: 1.521628 Tokens per Sec: 15788, Lr: 0.000300\n", "2019-11-22 21:44:11,244 Example #0\n", "2019-11-22 21:44:11,244 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:44:11,244 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:44:11,244 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:44:11,244 Example #1\n", "2019-11-22 21:44:11,244 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:44:11,244 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:44:11,244 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 21:44:11,245 Example #2\n", "2019-11-22 21:44:11,245 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:44:11,245 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:44:11,245 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì tún ní ìrírí tó ju tìrẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:44:11,245 Example #3\n", "2019-11-22 21:44:11,245 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:44:11,245 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:44:11,245 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Harkavy’s Students of Hebrew and Chaldee Dictionary ṣe sọ , Ábúrámù túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbàkigbà . ”\n", "2019-11-22 21:44:11,245 Validation result (greedy) at epoch 21, step 109000: bleu: 27.35, loss: 43658.4648, ppl: 4.3188, duration: 37.9440s\n", "2019-11-22 21:44:25,666 Epoch 21 Step: 109100 Batch Loss: 1.665910 Tokens per Sec: 15894, Lr: 0.000300\n", "2019-11-22 21:44:40,315 Epoch 21 Step: 109200 Batch Loss: 1.681227 Tokens per Sec: 15618, Lr: 0.000300\n", "2019-11-22 21:44:54,834 Epoch 21 Step: 109300 Batch Loss: 1.688612 Tokens per Sec: 16115, Lr: 0.000300\n", "2019-11-22 21:45:09,207 Epoch 21 Step: 109400 Batch Loss: 1.776141 Tokens per Sec: 15892, Lr: 0.000300\n", "2019-11-22 21:45:23,875 Epoch 21 Step: 109500 Batch Loss: 1.628811 Tokens per Sec: 15515, Lr: 0.000300\n", "2019-11-22 21:45:38,418 Epoch 21 Step: 109600 Batch Loss: 1.873812 Tokens per Sec: 15969, Lr: 0.000300\n", "2019-11-22 21:45:52,507 Epoch 21 Step: 109700 Batch Loss: 1.546331 Tokens per Sec: 16670, Lr: 0.000300\n", "2019-11-22 21:46:06,874 Epoch 21 Step: 109800 Batch Loss: 1.625034 Tokens per Sec: 16198, Lr: 0.000300\n", "2019-11-22 21:46:21,180 Epoch 21 Step: 109900 Batch Loss: 1.562253 Tokens per Sec: 16136, Lr: 0.000300\n", "2019-11-22 21:46:35,387 Epoch 21 Step: 110000 Batch Loss: 1.789161 Tokens per Sec: 16594, Lr: 0.000300\n", "2019-11-22 21:47:13,745 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:47:13,745 Saving new checkpoint.\n", "2019-11-22 21:47:14,034 Example #0\n", "2019-11-22 21:47:14,034 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:47:14,034 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:47:14,034 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:47:14,035 Example #1\n", "2019-11-22 21:47:14,035 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:47:14,035 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:47:14,035 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 21:47:14,035 Example #2\n", "2019-11-22 21:47:14,035 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:47:14,035 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:47:14,035 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó ju tìrẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:47:14,035 Example #3\n", "2019-11-22 21:47:14,035 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:47:14,036 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:47:14,036 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 21:47:14,036 Validation result (greedy) at epoch 21, step 110000: bleu: 27.90, loss: 43518.1016, ppl: 4.2986, duration: 38.6482s\n", "2019-11-22 21:47:28,311 Epoch 21 Step: 110100 Batch Loss: 1.582155 Tokens per Sec: 16120, Lr: 0.000300\n", "2019-11-22 21:47:42,573 Epoch 21 Step: 110200 Batch Loss: 1.448854 Tokens per Sec: 16108, Lr: 0.000300\n", "2019-11-22 21:47:56,949 Epoch 21 Step: 110300 Batch Loss: 1.602965 Tokens per Sec: 16501, Lr: 0.000300\n", "2019-11-22 21:48:11,315 Epoch 21 Step: 110400 Batch Loss: 1.483142 Tokens per Sec: 16380, Lr: 0.000300\n", "2019-11-22 21:48:25,667 Epoch 21 Step: 110500 Batch Loss: 1.648122 Tokens per Sec: 16171, Lr: 0.000300\n", "2019-11-22 21:48:40,020 Epoch 21 Step: 110600 Batch Loss: 1.650742 Tokens per Sec: 15696, Lr: 0.000300\n", "2019-11-22 21:48:44,122 Epoch 21: total training loss 8373.18\n", "2019-11-22 21:48:44,122 EPOCH 22\n", "2019-11-22 21:48:54,834 Epoch 22 Step: 110700 Batch Loss: 1.555104 Tokens per Sec: 15566, Lr: 0.000300\n", "2019-11-22 21:49:08,787 Epoch 22 Step: 110800 Batch Loss: 1.618127 Tokens per Sec: 16366, Lr: 0.000300\n", "2019-11-22 21:49:22,965 Epoch 22 Step: 110900 Batch Loss: 1.611895 Tokens per Sec: 15950, Lr: 0.000300\n", "2019-11-22 21:49:37,345 Epoch 22 Step: 111000 Batch Loss: 1.531513 Tokens per Sec: 16342, Lr: 0.000300\n", "2019-11-22 21:50:14,972 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:50:14,973 Saving new checkpoint.\n", "2019-11-22 21:50:15,280 Example #0\n", "2019-11-22 21:50:15,280 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:50:15,280 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:50:15,280 \tHypothesis: Ní báyìí , mo ní láti wá ibi tí wọ́n ti máa ṣe iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:50:15,280 Example #1\n", "2019-11-22 21:50:15,281 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:50:15,281 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:50:15,281 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 21:50:15,281 Example #2\n", "2019-11-22 21:50:15,281 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:50:15,281 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:50:15,281 \tHypothesis: Ó ti ní ìrírí tó pọ̀ tó sì ti ń ràn ẹ́ lọ́wọ́ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:50:15,281 Example #3\n", "2019-11-22 21:50:15,282 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:50:15,282 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:50:15,282 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè náà , Chaldee Dictionary , Caradh ṣe sọ , ó túmọ̀ sí “ ìfarararapamọ́pò , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 21:50:15,282 Validation result (greedy) at epoch 22, step 111000: bleu: 28.00, loss: 43500.0117, ppl: 4.2960, duration: 37.9369s\n", "2019-11-22 21:50:29,655 Epoch 22 Step: 111100 Batch Loss: 1.648854 Tokens per Sec: 16404, Lr: 0.000300\n", "2019-11-22 21:50:44,147 Epoch 22 Step: 111200 Batch Loss: 1.744660 Tokens per Sec: 15773, Lr: 0.000300\n", "2019-11-22 21:50:58,570 Epoch 22 Step: 111300 Batch Loss: 1.482286 Tokens per Sec: 16578, Lr: 0.000300\n", "2019-11-22 21:51:13,252 Epoch 22 Step: 111400 Batch Loss: 1.384792 Tokens per Sec: 15783, Lr: 0.000300\n", "2019-11-22 21:51:27,590 Epoch 22 Step: 111500 Batch Loss: 1.512777 Tokens per Sec: 15443, Lr: 0.000300\n", "2019-11-22 21:51:41,941 Epoch 22 Step: 111600 Batch Loss: 1.721794 Tokens per Sec: 15814, Lr: 0.000300\n", "2019-11-22 21:51:56,051 Epoch 22 Step: 111700 Batch Loss: 1.517695 Tokens per Sec: 16611, Lr: 0.000300\n", "2019-11-22 21:52:10,468 Epoch 22 Step: 111800 Batch Loss: 1.519945 Tokens per Sec: 16066, Lr: 0.000300\n", "2019-11-22 21:52:24,946 Epoch 22 Step: 111900 Batch Loss: 1.625962 Tokens per Sec: 15811, Lr: 0.000300\n", "2019-11-22 21:52:39,076 Epoch 22 Step: 112000 Batch Loss: 1.562459 Tokens per Sec: 16560, Lr: 0.000300\n", "2019-11-22 21:53:17,172 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:53:17,172 Saving new checkpoint.\n", "2019-11-22 21:53:17,454 Example #0\n", "2019-11-22 21:53:17,455 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:53:17,455 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:53:17,455 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:53:17,455 Example #1\n", "2019-11-22 21:53:17,455 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:53:17,455 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:53:17,455 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 21:53:17,455 Example #2\n", "2019-11-22 21:53:17,456 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:53:17,456 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:53:17,456 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:53:17,456 Example #3\n", "2019-11-22 21:53:17,456 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:53:17,456 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:53:17,456 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ pípa tí kò ní láárí mọ́ , jíjẹ́ ẹni tí kò ní láárí , títí láé , nítorí pé kò sí ìgbà kankan . ”\n", "2019-11-22 21:53:17,457 Validation result (greedy) at epoch 22, step 112000: bleu: 27.95, loss: 43425.8594, ppl: 4.2853, duration: 38.3804s\n", "2019-11-22 21:53:31,677 Epoch 22 Step: 112100 Batch Loss: 1.509299 Tokens per Sec: 16113, Lr: 0.000300\n", "2019-11-22 21:53:46,582 Epoch 22 Step: 112200 Batch Loss: 1.679588 Tokens per Sec: 15747, Lr: 0.000300\n", "2019-11-22 21:54:00,897 Epoch 22 Step: 112300 Batch Loss: 1.506727 Tokens per Sec: 16088, Lr: 0.000300\n", "2019-11-22 21:54:14,898 Epoch 22 Step: 112400 Batch Loss: 1.708936 Tokens per Sec: 16888, Lr: 0.000300\n", "2019-11-22 21:54:28,980 Epoch 22 Step: 112500 Batch Loss: 1.655952 Tokens per Sec: 15737, Lr: 0.000300\n", "2019-11-22 21:54:43,117 Epoch 22 Step: 112600 Batch Loss: 1.699505 Tokens per Sec: 16260, Lr: 0.000300\n", "2019-11-22 21:54:57,435 Epoch 22 Step: 112700 Batch Loss: 1.607161 Tokens per Sec: 16786, Lr: 0.000300\n", "2019-11-22 21:55:11,873 Epoch 22 Step: 112800 Batch Loss: 1.544597 Tokens per Sec: 15928, Lr: 0.000300\n", "2019-11-22 21:55:25,938 Epoch 22 Step: 112900 Batch Loss: 1.653906 Tokens per Sec: 16493, Lr: 0.000300\n", "2019-11-22 21:55:39,713 Epoch 22 Step: 113000 Batch Loss: 1.716519 Tokens per Sec: 17002, Lr: 0.000300\n", "2019-11-22 21:56:16,658 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:56:16,658 Saving new checkpoint.\n", "2019-11-22 21:56:16,982 Example #0\n", "2019-11-22 21:56:16,982 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:56:16,982 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:56:16,982 \tHypothesis: Ní báyìí , mo ní láti wá ibi iṣẹ́ tó dára gan - an .\n", "2019-11-22 21:56:16,982 Example #1\n", "2019-11-22 21:56:16,983 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:56:16,983 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:56:16,983 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 21:56:16,983 Example #2\n", "2019-11-22 21:56:16,983 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:56:16,983 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:56:16,983 \tHypothesis: Ó ní ìrírí tó pọ̀ jù , ó sì ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:56:16,983 Example #3\n", "2019-11-22 21:56:16,983 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:56:16,983 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:56:16,984 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ àti Chaldee Dictionary ṣe sọ , Loadh túmọ̀ sí “ pípa tí ń ṣeni lọ́ṣẹ́ , jíjẹ́ ẹni tó ń ṣojúsàájú , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 21:56:16,984 Validation result (greedy) at epoch 22, step 113000: bleu: 28.06, loss: 43400.6562, ppl: 4.2817, duration: 37.2699s\n", "2019-11-22 21:56:30,917 Epoch 22 Step: 113100 Batch Loss: 1.425385 Tokens per Sec: 16225, Lr: 0.000300\n", "2019-11-22 21:56:44,740 Epoch 22 Step: 113200 Batch Loss: 1.397763 Tokens per Sec: 16823, Lr: 0.000300\n", "2019-11-22 21:56:59,287 Epoch 22 Step: 113300 Batch Loss: 1.515320 Tokens per Sec: 15620, Lr: 0.000300\n", "2019-11-22 21:57:13,195 Epoch 22 Step: 113400 Batch Loss: 1.599679 Tokens per Sec: 16854, Lr: 0.000300\n", "2019-11-22 21:57:27,247 Epoch 22 Step: 113500 Batch Loss: 1.608261 Tokens per Sec: 16302, Lr: 0.000300\n", "2019-11-22 21:57:41,244 Epoch 22 Step: 113600 Batch Loss: 1.581507 Tokens per Sec: 16938, Lr: 0.000300\n", "2019-11-22 21:57:55,194 Epoch 22 Step: 113700 Batch Loss: 1.349848 Tokens per Sec: 16723, Lr: 0.000300\n", "2019-11-22 21:58:09,522 Epoch 22 Step: 113800 Batch Loss: 1.430196 Tokens per Sec: 16527, Lr: 0.000300\n", "2019-11-22 21:58:23,584 Epoch 22 Step: 113900 Batch Loss: 1.632643 Tokens per Sec: 16937, Lr: 0.000300\n", "2019-11-22 21:58:37,490 Epoch 22 Step: 114000 Batch Loss: 1.587444 Tokens per Sec: 16627, Lr: 0.000300\n", "2019-11-22 21:59:14,360 Hooray! New best validation result [ppl]!\n", "2019-11-22 21:59:14,360 Saving new checkpoint.\n", "2019-11-22 21:59:14,639 Example #0\n", "2019-11-22 21:59:14,639 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 21:59:14,639 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 21:59:14,639 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 21:59:14,640 Example #1\n", "2019-11-22 21:59:14,640 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 21:59:14,640 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 21:59:14,640 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 21:59:14,640 Example #2\n", "2019-11-22 21:59:14,640 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 21:59:14,640 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 21:59:14,640 \tHypothesis: Ó ní ìrírí àti ìjákulẹ̀ tó o ní , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 21:59:14,641 Example #3\n", "2019-11-22 21:59:14,641 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 21:59:14,641 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 21:59:14,641 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , Loadh túmọ̀ sí “ pípa tí kò ní láárí mọ́ , títí láé , títí láé . ”\n", "2019-11-22 21:59:14,641 Validation result (greedy) at epoch 22, step 114000: bleu: 27.87, loss: 43229.6641, ppl: 4.2572, duration: 37.1512s\n", "2019-11-22 21:59:28,808 Epoch 22 Step: 114100 Batch Loss: 1.520773 Tokens per Sec: 16099, Lr: 0.000300\n", "2019-11-22 21:59:42,526 Epoch 22 Step: 114200 Batch Loss: 1.657965 Tokens per Sec: 16632, Lr: 0.000300\n", "2019-11-22 21:59:57,078 Epoch 22 Step: 114300 Batch Loss: 1.656014 Tokens per Sec: 15951, Lr: 0.000300\n", "2019-11-22 22:00:11,100 Epoch 22 Step: 114400 Batch Loss: 1.534148 Tokens per Sec: 16634, Lr: 0.000300\n", "2019-11-22 22:00:25,007 Epoch 22 Step: 114500 Batch Loss: 1.599884 Tokens per Sec: 16666, Lr: 0.000300\n", "2019-11-22 22:00:39,103 Epoch 22 Step: 114600 Batch Loss: 1.705714 Tokens per Sec: 16476, Lr: 0.000300\n", "2019-11-22 22:00:53,035 Epoch 22 Step: 114700 Batch Loss: 1.657300 Tokens per Sec: 16793, Lr: 0.000300\n", "2019-11-22 22:01:07,202 Epoch 22 Step: 114800 Batch Loss: 1.562645 Tokens per Sec: 16420, Lr: 0.000300\n", "2019-11-22 22:01:21,446 Epoch 22 Step: 114900 Batch Loss: 1.632205 Tokens per Sec: 16727, Lr: 0.000300\n", "2019-11-22 22:01:35,675 Epoch 22 Step: 115000 Batch Loss: 1.546326 Tokens per Sec: 16176, Lr: 0.000300\n", "2019-11-22 22:02:13,253 Example #0\n", "2019-11-22 22:02:13,253 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:02:13,253 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:02:13,253 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 22:02:13,254 Example #1\n", "2019-11-22 22:02:13,254 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:02:13,254 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:02:13,254 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 22:02:13,254 Example #2\n", "2019-11-22 22:02:13,254 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:02:13,254 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:02:13,254 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:02:13,255 Example #3\n", "2019-11-22 22:02:13,255 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:02:13,255 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:02:13,255 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , Loadh túmọ̀ sí “ ìfararadà , ìfararadà , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 22:02:13,255 Validation result (greedy) at epoch 22, step 115000: bleu: 27.53, loss: 43276.3477, ppl: 4.2639, duration: 37.5798s\n", "2019-11-22 22:02:27,111 Epoch 22 Step: 115100 Batch Loss: 1.424276 Tokens per Sec: 16938, Lr: 0.000300\n", "2019-11-22 22:02:41,966 Epoch 22 Step: 115200 Batch Loss: 1.656070 Tokens per Sec: 15089, Lr: 0.000300\n", "2019-11-22 22:02:56,310 Epoch 22 Step: 115300 Batch Loss: 1.750308 Tokens per Sec: 16158, Lr: 0.000300\n", "2019-11-22 22:03:10,462 Epoch 22 Step: 115400 Batch Loss: 1.587919 Tokens per Sec: 16155, Lr: 0.000300\n", "2019-11-22 22:03:24,653 Epoch 22 Step: 115500 Batch Loss: 1.381043 Tokens per Sec: 16392, Lr: 0.000300\n", "2019-11-22 22:03:39,043 Epoch 22 Step: 115600 Batch Loss: 1.426003 Tokens per Sec: 15993, Lr: 0.000300\n", "2019-11-22 22:03:53,133 Epoch 22 Step: 115700 Batch Loss: 1.571656 Tokens per Sec: 16526, Lr: 0.000300\n", "2019-11-22 22:04:07,328 Epoch 22 Step: 115800 Batch Loss: 1.565423 Tokens per Sec: 16467, Lr: 0.000300\n", "2019-11-22 22:04:20,019 Epoch 22: total training loss 8329.25\n", "2019-11-22 22:04:20,019 EPOCH 23\n", "2019-11-22 22:04:22,193 Epoch 23 Step: 115900 Batch Loss: 1.507829 Tokens per Sec: 11626, Lr: 0.000300\n", "2019-11-22 22:04:36,277 Epoch 23 Step: 116000 Batch Loss: 1.567000 Tokens per Sec: 16561, Lr: 0.000300\n", "2019-11-22 22:05:13,885 Example #0\n", "2019-11-22 22:05:13,885 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:05:13,885 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:05:13,885 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 22:05:13,885 Example #1\n", "2019-11-22 22:05:13,886 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:05:13,886 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:05:13,886 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:05:13,886 Example #2\n", "2019-11-22 22:05:13,886 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:05:13,886 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:05:13,886 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì tún ní ìrírí tó ju tìrẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:05:13,886 Example #3\n", "2019-11-22 22:05:13,886 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:05:13,886 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:05:13,887 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of the Students of the Greek and Chaldee Dictionary ṣe sọ , Jèhóádà túmọ̀ sí “ pípa nǹkan mọ́ , níní ìfaradà , títí láé , fún àkókò tí ó lọ kánrin . ”\n", "2019-11-22 22:05:13,887 Validation result (greedy) at epoch 23, step 116000: bleu: 27.69, loss: 43250.3008, ppl: 4.2602, duration: 37.6090s\n", "2019-11-22 22:05:28,133 Epoch 23 Step: 116100 Batch Loss: 1.681826 Tokens per Sec: 16342, Lr: 0.000300\n", "2019-11-22 22:05:42,435 Epoch 23 Step: 116200 Batch Loss: 1.533741 Tokens per Sec: 16132, Lr: 0.000300\n", "2019-11-22 22:05:56,841 Epoch 23 Step: 116300 Batch Loss: 1.580687 Tokens per Sec: 16399, Lr: 0.000300\n", "2019-11-22 22:06:10,862 Epoch 23 Step: 116400 Batch Loss: 1.602107 Tokens per Sec: 16817, Lr: 0.000300\n", "2019-11-22 22:06:25,102 Epoch 23 Step: 116500 Batch Loss: 1.648783 Tokens per Sec: 16028, Lr: 0.000300\n", "2019-11-22 22:06:39,754 Epoch 23 Step: 116600 Batch Loss: 1.666987 Tokens per Sec: 15707, Lr: 0.000300\n", "2019-11-22 22:06:53,992 Epoch 23 Step: 116700 Batch Loss: 1.676392 Tokens per Sec: 16431, Lr: 0.000300\n", "2019-11-22 22:07:08,121 Epoch 23 Step: 116800 Batch Loss: 1.520978 Tokens per Sec: 16302, Lr: 0.000300\n", "2019-11-22 22:07:22,009 Epoch 23 Step: 116900 Batch Loss: 1.460813 Tokens per Sec: 16627, Lr: 0.000300\n", "2019-11-22 22:07:36,215 Epoch 23 Step: 117000 Batch Loss: 1.716920 Tokens per Sec: 15935, Lr: 0.000300\n", "2019-11-22 22:08:13,577 Example #0\n", "2019-11-22 22:08:13,578 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:08:13,578 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:08:13,578 \tHypothesis: Ní báyìí , mo ti wá rí iṣẹ́ tó dára gan - an .\n", "2019-11-22 22:08:13,578 Example #1\n", "2019-11-22 22:08:13,578 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:08:13,578 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:08:13,578 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:08:13,579 Example #2\n", "2019-11-22 22:08:13,579 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:08:13,579 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:08:13,579 \tHypothesis: Ó ní ìrírí àti ìdààmú tó pọ̀ ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:08:13,579 Example #3\n", "2019-11-22 22:08:13,579 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:08:13,580 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:08:13,580 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hebrew and Chaldee Dictionary ṣe sọ , ó túmọ̀ sí “ pípa , ìdúróṣinṣin , títí láé , fún ìgbàkígbà rí . ”\n", "2019-11-22 22:08:13,580 Validation result (greedy) at epoch 23, step 117000: bleu: 28.06, loss: 43234.5312, ppl: 4.2579, duration: 37.3650s\n", "2019-11-22 22:08:27,675 Epoch 23 Step: 117100 Batch Loss: 1.640084 Tokens per Sec: 15939, Lr: 0.000300\n", "2019-11-22 22:08:42,152 Epoch 23 Step: 117200 Batch Loss: 1.666645 Tokens per Sec: 15645, Lr: 0.000300\n", "2019-11-22 22:08:56,574 Epoch 23 Step: 117300 Batch Loss: 1.558988 Tokens per Sec: 16837, Lr: 0.000300\n", "2019-11-22 22:09:10,467 Epoch 23 Step: 117400 Batch Loss: 1.597291 Tokens per Sec: 16565, Lr: 0.000300\n", "2019-11-22 22:09:24,549 Epoch 23 Step: 117500 Batch Loss: 1.512645 Tokens per Sec: 16465, Lr: 0.000300\n", "2019-11-22 22:09:38,823 Epoch 23 Step: 117600 Batch Loss: 1.420668 Tokens per Sec: 16367, Lr: 0.000300\n", "2019-11-22 22:09:52,973 Epoch 23 Step: 117700 Batch Loss: 1.453762 Tokens per Sec: 16851, Lr: 0.000300\n", "2019-11-22 22:10:07,501 Epoch 23 Step: 117800 Batch Loss: 1.474311 Tokens per Sec: 15704, Lr: 0.000300\n", "2019-11-22 22:10:21,631 Epoch 23 Step: 117900 Batch Loss: 1.541557 Tokens per Sec: 16346, Lr: 0.000300\n", "2019-11-22 22:10:36,264 Epoch 23 Step: 118000 Batch Loss: 1.716614 Tokens per Sec: 15805, Lr: 0.000300\n", "2019-11-22 22:11:13,912 Hooray! New best validation result [ppl]!\n", "2019-11-22 22:11:13,912 Saving new checkpoint.\n", "2019-11-22 22:11:14,265 Example #0\n", "2019-11-22 22:11:14,265 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:11:14,265 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:11:14,266 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára jù lọ ni .\n", "2019-11-22 22:11:14,266 Example #1\n", "2019-11-22 22:11:14,266 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:11:14,266 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:11:14,266 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:11:14,266 Example #2\n", "2019-11-22 22:11:14,266 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:11:14,267 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:11:14,267 \tHypothesis: Ó ní ìrírí àti ìdààmú tó pọ̀ ju èyí tí o ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:11:14,267 Example #3\n", "2019-11-22 22:11:14,267 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:11:14,267 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:11:14,267 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , ìdààmú , ìwọ̀nba nǹkan , títí ayérayé . ”\n", "2019-11-22 22:11:14,267 Validation result (greedy) at epoch 23, step 118000: bleu: 27.50, loss: 43184.1758, ppl: 4.2507, duration: 38.0026s\n", "2019-11-22 22:11:28,739 Epoch 23 Step: 118100 Batch Loss: 1.573608 Tokens per Sec: 15858, Lr: 0.000300\n", "2019-11-22 22:11:43,076 Epoch 23 Step: 118200 Batch Loss: 1.705415 Tokens per Sec: 16037, Lr: 0.000300\n", "2019-11-22 22:11:56,973 Epoch 23 Step: 118300 Batch Loss: 1.420967 Tokens per Sec: 16799, Lr: 0.000300\n", "2019-11-22 22:12:11,228 Epoch 23 Step: 118400 Batch Loss: 1.676920 Tokens per Sec: 16178, Lr: 0.000300\n", "2019-11-22 22:12:25,527 Epoch 23 Step: 118500 Batch Loss: 1.567995 Tokens per Sec: 16397, Lr: 0.000300\n", "2019-11-22 22:12:39,851 Epoch 23 Step: 118600 Batch Loss: 1.488030 Tokens per Sec: 15996, Lr: 0.000300\n", "2019-11-22 22:12:53,913 Epoch 23 Step: 118700 Batch Loss: 1.451116 Tokens per Sec: 16831, Lr: 0.000300\n", "2019-11-22 22:13:08,108 Epoch 23 Step: 118800 Batch Loss: 1.574539 Tokens per Sec: 16106, Lr: 0.000300\n", "2019-11-22 22:13:22,949 Epoch 23 Step: 118900 Batch Loss: 1.510302 Tokens per Sec: 15268, Lr: 0.000300\n", "2019-11-22 22:13:37,789 Epoch 23 Step: 119000 Batch Loss: 1.539112 Tokens per Sec: 15475, Lr: 0.000300\n", "2019-11-22 22:14:15,888 Hooray! New best validation result [ppl]!\n", "2019-11-22 22:14:15,889 Saving new checkpoint.\n", "2019-11-22 22:14:16,171 Example #0\n", "2019-11-22 22:14:16,171 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:14:16,171 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:14:16,171 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 22:14:16,171 Example #1\n", "2019-11-22 22:14:16,172 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:14:16,172 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:14:16,172 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 22:14:16,172 Example #2\n", "2019-11-22 22:14:16,172 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:14:16,172 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:14:16,172 \tHypothesis: Ó ní ìrírí àti ìdààmú tó pọ̀ ju èyí tí o ṣe lọ , àmọ́ ó fi sùúrù rìn jìnnà sí yín .\n", "2019-11-22 22:14:16,172 Example #3\n", "2019-11-22 22:14:16,173 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:14:16,173 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:14:16,173 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Harkavy’s Stud’s Stud’s Hebrew and Chaldee Dictionary ṣe sọ , Geradh túmọ̀ sí “ ìfarararapamọ́sí , jíjẹ́ ẹni tó ń ṣàìsàn , títí láé . ”\n", "2019-11-22 22:14:16,173 Validation result (greedy) at epoch 23, step 119000: bleu: 28.25, loss: 42994.3164, ppl: 4.2238, duration: 38.3840s\n", "2019-11-22 22:14:30,462 Epoch 23 Step: 119100 Batch Loss: 1.492450 Tokens per Sec: 16653, Lr: 0.000300\n", "2019-11-22 22:14:44,746 Epoch 23 Step: 119200 Batch Loss: 1.503995 Tokens per Sec: 15698, Lr: 0.000300\n", "2019-11-22 22:14:59,046 Epoch 23 Step: 119300 Batch Loss: 1.577260 Tokens per Sec: 16606, Lr: 0.000300\n", "2019-11-22 22:15:13,325 Epoch 23 Step: 119400 Batch Loss: 1.667424 Tokens per Sec: 16156, Lr: 0.000300\n", "2019-11-22 22:15:27,885 Epoch 23 Step: 119500 Batch Loss: 1.535337 Tokens per Sec: 15575, Lr: 0.000300\n", "2019-11-22 22:15:42,248 Epoch 23 Step: 119600 Batch Loss: 1.590281 Tokens per Sec: 16328, Lr: 0.000300\n", "2019-11-22 22:15:56,288 Epoch 23 Step: 119700 Batch Loss: 1.710711 Tokens per Sec: 16717, Lr: 0.000300\n", "2019-11-22 22:16:10,501 Epoch 23 Step: 119800 Batch Loss: 1.475656 Tokens per Sec: 16613, Lr: 0.000300\n", "2019-11-22 22:16:24,464 Epoch 23 Step: 119900 Batch Loss: 1.558545 Tokens per Sec: 16213, Lr: 0.000300\n", "2019-11-22 22:16:38,935 Epoch 23 Step: 120000 Batch Loss: 1.548606 Tokens per Sec: 15851, Lr: 0.000300\n", "2019-11-22 22:17:16,514 Example #0\n", "2019-11-22 22:17:16,515 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:17:16,515 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:17:16,515 \tHypothesis: Ní báyìí , mo ní láti wá ibi tó dára jù lọ nínú iṣẹ́ .\n", "2019-11-22 22:17:16,515 Example #1\n", "2019-11-22 22:17:16,515 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:17:16,515 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:17:16,515 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:17:16,515 Example #2\n", "2019-11-22 22:17:16,516 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:17:16,516 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:17:16,516 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì níye lórí ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:17:16,516 Example #3\n", "2019-11-22 22:17:16,516 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:17:16,516 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:17:16,516 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , ohun tó túmọ̀ sí ni “ pípa tí kò ní láárí mọ́ , títí láé , títí láé . ”\n", "2019-11-22 22:17:16,517 Validation result (greedy) at epoch 23, step 120000: bleu: 28.28, loss: 43134.4688, ppl: 4.2437, duration: 37.5811s\n", "2019-11-22 22:17:30,655 Epoch 23 Step: 120100 Batch Loss: 1.620291 Tokens per Sec: 15849, Lr: 0.000300\n", "2019-11-22 22:17:44,928 Epoch 23 Step: 120200 Batch Loss: 1.643003 Tokens per Sec: 16031, Lr: 0.000300\n", "2019-11-22 22:17:58,834 Epoch 23 Step: 120300 Batch Loss: 1.745018 Tokens per Sec: 16552, Lr: 0.000300\n", "2019-11-22 22:18:13,131 Epoch 23 Step: 120400 Batch Loss: 1.596445 Tokens per Sec: 16442, Lr: 0.000300\n", "2019-11-22 22:18:27,337 Epoch 23 Step: 120500 Batch Loss: 1.622208 Tokens per Sec: 16392, Lr: 0.000300\n", "2019-11-22 22:18:41,751 Epoch 23 Step: 120600 Batch Loss: 1.540985 Tokens per Sec: 15850, Lr: 0.000300\n", "2019-11-22 22:18:56,022 Epoch 23 Step: 120700 Batch Loss: 1.591651 Tokens per Sec: 16103, Lr: 0.000300\n", "2019-11-22 22:19:10,652 Epoch 23 Step: 120800 Batch Loss: 1.589833 Tokens per Sec: 16139, Lr: 0.000300\n", "2019-11-22 22:19:25,119 Epoch 23 Step: 120900 Batch Loss: 1.554196 Tokens per Sec: 16248, Lr: 0.000300\n", "2019-11-22 22:19:39,227 Epoch 23 Step: 121000 Batch Loss: 1.611871 Tokens per Sec: 16351, Lr: 0.000300\n", "2019-11-22 22:20:17,107 Example #0\n", "2019-11-22 22:20:17,107 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:20:17,108 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:20:17,108 \tHypothesis: Ní báyìí , mo ní láti wá ibi tí wọ́n ti máa ṣe iṣẹ́ tó bójú mu .\n", "2019-11-22 22:20:17,108 Example #1\n", "2019-11-22 22:20:17,108 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:20:17,108 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:20:17,108 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 22:20:17,108 Example #2\n", "2019-11-22 22:20:17,108 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:20:17,109 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:20:17,109 \tHypothesis: Ó ní ìrírí àti ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:20:17,109 Example #3\n", "2019-11-22 22:20:17,109 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:20:17,109 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:20:17,109 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , àwọn Akẹ́kọ̀ọ́ Harkavy’s Stud’s , tí wọ́n ń pè ní Chaldee Dictionary , ń túmọ̀ sí “ ìfaradà , jíjẹ́ ẹni tó ní ẹ̀mí tó pọ̀ , títí láé , títí láé . ”\n", "2019-11-22 22:20:17,109 Validation result (greedy) at epoch 23, step 121000: bleu: 27.91, loss: 43129.8086, ppl: 4.2430, duration: 37.8820s\n", "2019-11-22 22:20:31,522 Epoch 23 Step: 121100 Batch Loss: 1.337394 Tokens per Sec: 15820, Lr: 0.000300\n", "2019-11-22 22:20:39,564 Epoch 23: total training loss 8293.95\n", "2019-11-22 22:20:39,564 EPOCH 24\n", "2019-11-22 22:20:46,212 Epoch 24 Step: 121200 Batch Loss: 1.543393 Tokens per Sec: 14965, Lr: 0.000300\n", "2019-11-22 22:21:00,206 Epoch 24 Step: 121300 Batch Loss: 1.620436 Tokens per Sec: 16510, Lr: 0.000300\n", "2019-11-22 22:21:14,447 Epoch 24 Step: 121400 Batch Loss: 1.661164 Tokens per Sec: 16124, Lr: 0.000300\n", "2019-11-22 22:21:28,928 Epoch 24 Step: 121500 Batch Loss: 1.440388 Tokens per Sec: 16171, Lr: 0.000300\n", "2019-11-22 22:21:43,292 Epoch 24 Step: 121600 Batch Loss: 1.548202 Tokens per Sec: 15807, Lr: 0.000300\n", "2019-11-22 22:21:57,607 Epoch 24 Step: 121700 Batch Loss: 1.681992 Tokens per Sec: 16355, Lr: 0.000300\n", "2019-11-22 22:22:11,767 Epoch 24 Step: 121800 Batch Loss: 1.553603 Tokens per Sec: 16119, Lr: 0.000300\n", "2019-11-22 22:22:26,016 Epoch 24 Step: 121900 Batch Loss: 1.567026 Tokens per Sec: 16218, Lr: 0.000300\n", "2019-11-22 22:22:40,234 Epoch 24 Step: 122000 Batch Loss: 1.490457 Tokens per Sec: 16124, Lr: 0.000300\n", "2019-11-22 22:23:17,600 Example #0\n", "2019-11-22 22:23:17,601 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:23:17,601 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:23:17,601 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 22:23:17,601 Example #1\n", "2019-11-22 22:23:17,601 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:23:17,601 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:23:17,601 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 22:23:17,601 Example #2\n", "2019-11-22 22:23:17,602 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:23:17,602 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:23:17,602 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:23:17,602 Example #3\n", "2019-11-22 22:23:17,602 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:23:17,602 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:23:17,602 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè èdè Hébérù àti Chaldee Dictionary ṣe sọ , olùtọ́jú olùtọ́jú olùtọ́jú àgùntàn náà túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 22:23:17,603 Validation result (greedy) at epoch 24, step 122000: bleu: 28.18, loss: 43015.4844, ppl: 4.2268, duration: 37.3689s\n", "2019-11-22 22:23:31,992 Epoch 24 Step: 122100 Batch Loss: 1.669733 Tokens per Sec: 16043, Lr: 0.000300\n", "2019-11-22 22:23:46,179 Epoch 24 Step: 122200 Batch Loss: 1.628521 Tokens per Sec: 16052, Lr: 0.000300\n", "2019-11-22 22:24:00,362 Epoch 24 Step: 122300 Batch Loss: 1.521653 Tokens per Sec: 16678, Lr: 0.000300\n", "2019-11-22 22:24:14,558 Epoch 24 Step: 122400 Batch Loss: 1.505615 Tokens per Sec: 16124, Lr: 0.000300\n", "2019-11-22 22:24:28,695 Epoch 24 Step: 122500 Batch Loss: 1.566727 Tokens per Sec: 16211, Lr: 0.000300\n", "2019-11-22 22:24:42,938 Epoch 24 Step: 122600 Batch Loss: 1.561285 Tokens per Sec: 16282, Lr: 0.000300\n", "2019-11-22 22:24:56,842 Epoch 24 Step: 122700 Batch Loss: 1.571618 Tokens per Sec: 16923, Lr: 0.000300\n", "2019-11-22 22:25:10,962 Epoch 24 Step: 122800 Batch Loss: 1.691975 Tokens per Sec: 16723, Lr: 0.000300\n", "2019-11-22 22:25:25,309 Epoch 24 Step: 122900 Batch Loss: 1.687072 Tokens per Sec: 16274, Lr: 0.000300\n", "2019-11-22 22:25:39,972 Epoch 24 Step: 123000 Batch Loss: 1.492481 Tokens per Sec: 15757, Lr: 0.000300\n", "2019-11-22 22:26:18,018 Example #0\n", "2019-11-22 22:26:18,018 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:26:18,018 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:26:18,018 \tHypothesis: Ní báyìí , mo ti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 22:26:18,019 Example #1\n", "2019-11-22 22:26:18,019 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:26:18,019 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:26:18,019 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 22:26:18,019 Example #2\n", "2019-11-22 22:26:18,019 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:26:18,019 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:26:18,020 \tHypothesis: Ó ní ìrírí àti ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:26:18,020 Example #3\n", "2019-11-22 22:26:18,020 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:26:18,020 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:26:18,020 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , ìdààmú ọkàn , ìfaradà , títí láé , nítorí pé kò sí ìgbà kankan rí . ”\n", "2019-11-22 22:26:18,020 Validation result (greedy) at epoch 24, step 123000: bleu: 28.01, loss: 43128.0508, ppl: 4.2428, duration: 38.0484s\n", "2019-11-22 22:26:32,224 Epoch 24 Step: 123100 Batch Loss: 1.525734 Tokens per Sec: 16889, Lr: 0.000300\n", "2019-11-22 22:26:46,668 Epoch 24 Step: 123200 Batch Loss: 1.578100 Tokens per Sec: 15956, Lr: 0.000300\n", "2019-11-22 22:27:00,837 Epoch 24 Step: 123300 Batch Loss: 1.382990 Tokens per Sec: 15918, Lr: 0.000300\n", "2019-11-22 22:27:15,122 Epoch 24 Step: 123400 Batch Loss: 1.578272 Tokens per Sec: 16312, Lr: 0.000300\n", "2019-11-22 22:27:29,242 Epoch 24 Step: 123500 Batch Loss: 1.511401 Tokens per Sec: 16637, Lr: 0.000300\n", "2019-11-22 22:27:43,664 Epoch 24 Step: 123600 Batch Loss: 1.607718 Tokens per Sec: 16079, Lr: 0.000300\n", "2019-11-22 22:27:57,522 Epoch 24 Step: 123700 Batch Loss: 1.395405 Tokens per Sec: 16738, Lr: 0.000300\n", "2019-11-22 22:28:11,699 Epoch 24 Step: 123800 Batch Loss: 1.605031 Tokens per Sec: 15660, Lr: 0.000300\n", "2019-11-22 22:28:25,968 Epoch 24 Step: 123900 Batch Loss: 1.551346 Tokens per Sec: 16044, Lr: 0.000300\n", "2019-11-22 22:28:40,065 Epoch 24 Step: 124000 Batch Loss: 1.522209 Tokens per Sec: 16599, Lr: 0.000300\n", "2019-11-22 22:29:17,501 Hooray! New best validation result [ppl]!\n", "2019-11-22 22:29:17,501 Saving new checkpoint.\n", "2019-11-22 22:29:17,825 Example #0\n", "2019-11-22 22:29:17,826 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:29:17,826 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:29:17,826 \tHypothesis: Ní báyìí , mo ní láti rí i pé iṣẹ́ tó dára jù lọ ni .\n", "2019-11-22 22:29:17,826 Example #1\n", "2019-11-22 22:29:17,826 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:29:17,826 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:29:17,826 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:29:17,827 Example #2\n", "2019-11-22 22:29:17,827 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:29:17,827 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:29:17,827 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:29:17,827 Example #3\n", "2019-11-22 22:29:17,827 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:29:17,828 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:29:17,828 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hebrew and Chaldee Dictionary , ṣe sọ , ó túmọ̀ sí “ pípa tí kò lófin mọ́ , jíjẹ́ ẹni tó ń ṣojúsàájú , títí láé , fún ìgbà kan . ”\n", "2019-11-22 22:29:17,828 Validation result (greedy) at epoch 24, step 124000: bleu: 28.35, loss: 42868.9961, ppl: 4.2061, duration: 37.7622s\n", "2019-11-22 22:29:32,356 Epoch 24 Step: 124100 Batch Loss: 1.455458 Tokens per Sec: 15966, Lr: 0.000300\n", "2019-11-22 22:29:46,411 Epoch 24 Step: 124200 Batch Loss: 1.710230 Tokens per Sec: 16596, Lr: 0.000300\n", "2019-11-22 22:30:01,003 Epoch 24 Step: 124300 Batch Loss: 1.445591 Tokens per Sec: 16022, Lr: 0.000300\n", "2019-11-22 22:30:14,942 Epoch 24 Step: 124400 Batch Loss: 1.666345 Tokens per Sec: 16474, Lr: 0.000300\n", "2019-11-22 22:30:29,411 Epoch 24 Step: 124500 Batch Loss: 1.715130 Tokens per Sec: 15991, Lr: 0.000300\n", "2019-11-22 22:30:43,737 Epoch 24 Step: 124600 Batch Loss: 1.546571 Tokens per Sec: 16338, Lr: 0.000300\n", "2019-11-22 22:30:58,186 Epoch 24 Step: 124700 Batch Loss: 1.702155 Tokens per Sec: 16279, Lr: 0.000300\n", "2019-11-22 22:31:11,977 Epoch 24 Step: 124800 Batch Loss: 1.509586 Tokens per Sec: 16696, Lr: 0.000300\n", "2019-11-22 22:31:25,978 Epoch 24 Step: 124900 Batch Loss: 1.360152 Tokens per Sec: 16710, Lr: 0.000300\n", "2019-11-22 22:31:40,322 Epoch 24 Step: 125000 Batch Loss: 1.461590 Tokens per Sec: 16470, Lr: 0.000300\n", "2019-11-22 22:32:18,302 Example #0\n", "2019-11-22 22:32:18,303 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:32:18,303 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:32:18,303 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 22:32:18,303 Example #1\n", "2019-11-22 22:32:18,303 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:32:18,303 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:32:18,303 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:32:18,303 Example #2\n", "2019-11-22 22:32:18,304 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:32:18,304 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:32:18,304 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún ga ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:32:18,304 Example #3\n", "2019-11-22 22:32:18,304 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:32:18,304 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:32:18,304 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbà kan rí . ”\n", "2019-11-22 22:32:18,304 Validation result (greedy) at epoch 24, step 125000: bleu: 28.39, loss: 42901.8320, ppl: 4.2107, duration: 37.9816s\n", "2019-11-22 22:32:32,578 Epoch 24 Step: 125100 Batch Loss: 1.634498 Tokens per Sec: 16204, Lr: 0.000300\n", "2019-11-22 22:32:46,782 Epoch 24 Step: 125200 Batch Loss: 1.763761 Tokens per Sec: 15811, Lr: 0.000300\n", "2019-11-22 22:33:01,359 Epoch 24 Step: 125300 Batch Loss: 1.504720 Tokens per Sec: 15617, Lr: 0.000300\n", "2019-11-22 22:33:15,909 Epoch 24 Step: 125400 Batch Loss: 1.475682 Tokens per Sec: 15997, Lr: 0.000300\n", "2019-11-22 22:33:30,226 Epoch 24 Step: 125500 Batch Loss: 1.661504 Tokens per Sec: 15768, Lr: 0.000300\n", "2019-11-22 22:33:44,759 Epoch 24 Step: 125600 Batch Loss: 1.651488 Tokens per Sec: 16308, Lr: 0.000300\n", "2019-11-22 22:33:58,613 Epoch 24 Step: 125700 Batch Loss: 1.507493 Tokens per Sec: 16594, Lr: 0.000300\n", "2019-11-22 22:34:12,578 Epoch 24 Step: 125800 Batch Loss: 1.547604 Tokens per Sec: 16128, Lr: 0.000300\n", "2019-11-22 22:34:26,522 Epoch 24 Step: 125900 Batch Loss: 1.279876 Tokens per Sec: 16306, Lr: 0.000300\n", "2019-11-22 22:34:41,152 Epoch 24 Step: 126000 Batch Loss: 1.573120 Tokens per Sec: 15805, Lr: 0.000300\n", "2019-11-22 22:35:18,469 Hooray! New best validation result [ppl]!\n", "2019-11-22 22:35:18,469 Saving new checkpoint.\n", "2019-11-22 22:35:18,751 Example #0\n", "2019-11-22 22:35:18,751 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:35:18,751 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:35:18,751 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 22:35:18,751 Example #1\n", "2019-11-22 22:35:18,752 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:35:18,752 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:35:18,752 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 22:35:18,752 Example #2\n", "2019-11-22 22:35:18,752 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:35:18,752 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:35:18,752 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:35:18,752 Example #3\n", "2019-11-22 22:35:18,752 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:35:18,753 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:35:18,753 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ pípa tí kò ní láárí mọ́ , títí láé , títí láé , nítorí pé kò sí ìgbà kankan . ”\n", "2019-11-22 22:35:18,753 Validation result (greedy) at epoch 24, step 126000: bleu: 28.03, loss: 42811.5469, ppl: 4.1980, duration: 37.6005s\n", "2019-11-22 22:35:33,040 Epoch 24 Step: 126100 Batch Loss: 1.704311 Tokens per Sec: 15927, Lr: 0.000300\n", "2019-11-22 22:35:46,760 Epoch 24 Step: 126200 Batch Loss: 1.579584 Tokens per Sec: 16872, Lr: 0.000300\n", "2019-11-22 22:36:01,232 Epoch 24 Step: 126300 Batch Loss: 1.635013 Tokens per Sec: 16016, Lr: 0.000300\n", "2019-11-22 22:36:15,734 Epoch 24 Step: 126400 Batch Loss: 1.481892 Tokens per Sec: 15842, Lr: 0.000300\n", "2019-11-22 22:36:19,662 Epoch 24: total training loss 8258.49\n", "2019-11-22 22:36:19,662 EPOCH 25\n", "2019-11-22 22:36:30,077 Epoch 25 Step: 126500 Batch Loss: 1.504299 Tokens per Sec: 15738, Lr: 0.000300\n", "2019-11-22 22:36:44,071 Epoch 25 Step: 126600 Batch Loss: 1.490432 Tokens per Sec: 16773, Lr: 0.000300\n", "2019-11-22 22:36:57,857 Epoch 25 Step: 126700 Batch Loss: 1.568514 Tokens per Sec: 16881, Lr: 0.000300\n", "2019-11-22 22:37:11,625 Epoch 25 Step: 126800 Batch Loss: 1.588932 Tokens per Sec: 16756, Lr: 0.000300\n", "2019-11-22 22:37:25,797 Epoch 25 Step: 126900 Batch Loss: 1.609676 Tokens per Sec: 16213, Lr: 0.000300\n", "2019-11-22 22:37:39,829 Epoch 25 Step: 127000 Batch Loss: 1.750473 Tokens per Sec: 16588, Lr: 0.000300\n", "2019-11-22 22:38:17,201 Example #0\n", "2019-11-22 22:38:17,201 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:38:17,201 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:38:17,201 \tHypothesis: Ní báyìí , mo ti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 22:38:17,201 Example #1\n", "2019-11-22 22:38:17,202 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:38:17,202 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:38:17,202 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:38:17,202 Example #2\n", "2019-11-22 22:38:17,203 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:38:17,203 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:38:17,203 \tHypothesis: Ó ní ìrírí tó pọ̀ tó o sì ní tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:38:17,203 Example #3\n", "2019-11-22 22:38:17,203 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:38:17,203 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:38:17,204 \tHypothesis: Gẹ́gẹ́ bí ìwé Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , ìdùnnú , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 22:38:17,204 Validation result (greedy) at epoch 25, step 127000: bleu: 28.13, loss: 42945.9141, ppl: 4.2169, duration: 37.3739s\n", "2019-11-22 22:38:31,452 Epoch 25 Step: 127100 Batch Loss: 1.529393 Tokens per Sec: 16303, Lr: 0.000300\n", "2019-11-22 22:38:45,717 Epoch 25 Step: 127200 Batch Loss: 1.488252 Tokens per Sec: 16075, Lr: 0.000300\n", "2019-11-22 22:39:00,255 Epoch 25 Step: 127300 Batch Loss: 1.452989 Tokens per Sec: 15972, Lr: 0.000300\n", "2019-11-22 22:39:14,680 Epoch 25 Step: 127400 Batch Loss: 1.540260 Tokens per Sec: 15937, Lr: 0.000300\n", "2019-11-22 22:39:28,876 Epoch 25 Step: 127500 Batch Loss: 1.578853 Tokens per Sec: 15865, Lr: 0.000300\n", "2019-11-22 22:39:43,146 Epoch 25 Step: 127600 Batch Loss: 1.662840 Tokens per Sec: 15566, Lr: 0.000300\n", "2019-11-22 22:39:57,241 Epoch 25 Step: 127700 Batch Loss: 1.347171 Tokens per Sec: 16604, Lr: 0.000300\n", "2019-11-22 22:40:11,894 Epoch 25 Step: 127800 Batch Loss: 1.561909 Tokens per Sec: 15901, Lr: 0.000300\n", "2019-11-22 22:40:26,076 Epoch 25 Step: 127900 Batch Loss: 1.563912 Tokens per Sec: 16203, Lr: 0.000300\n", "2019-11-22 22:40:40,236 Epoch 25 Step: 128000 Batch Loss: 1.557989 Tokens per Sec: 16507, Lr: 0.000300\n", "2019-11-22 22:41:17,425 Hooray! New best validation result [ppl]!\n", "2019-11-22 22:41:17,425 Saving new checkpoint.\n", "2019-11-22 22:41:17,803 Example #0\n", "2019-11-22 22:41:17,803 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:41:17,803 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:41:17,803 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 22:41:17,803 Example #1\n", "2019-11-22 22:41:17,804 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:41:17,804 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:41:17,804 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 22:41:17,804 Example #2\n", "2019-11-22 22:41:17,804 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:41:17,804 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:41:17,804 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì tún nítumọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn jìnnà sí ẹ .\n", "2019-11-22 22:41:17,804 Example #3\n", "2019-11-22 22:41:17,805 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:41:17,805 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:41:17,805 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , olùtọ́jú ibẹ̀ túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , nítorí pé kò sí àní - àní . ”\n", "2019-11-22 22:41:17,805 Validation result (greedy) at epoch 25, step 128000: bleu: 28.08, loss: 42721.7188, ppl: 4.1854, duration: 37.5687s\n", "2019-11-22 22:41:31,462 Epoch 25 Step: 128100 Batch Loss: 1.573690 Tokens per Sec: 16824, Lr: 0.000300\n", "2019-11-22 22:41:45,897 Epoch 25 Step: 128200 Batch Loss: 1.586075 Tokens per Sec: 16346, Lr: 0.000300\n", "2019-11-22 22:41:59,868 Epoch 25 Step: 128300 Batch Loss: 1.541721 Tokens per Sec: 16384, Lr: 0.000300\n", "2019-11-22 22:42:13,750 Epoch 25 Step: 128400 Batch Loss: 1.513599 Tokens per Sec: 16697, Lr: 0.000300\n", "2019-11-22 22:42:27,520 Epoch 25 Step: 128500 Batch Loss: 1.685933 Tokens per Sec: 16741, Lr: 0.000300\n", "2019-11-22 22:42:42,022 Epoch 25 Step: 128600 Batch Loss: 1.608651 Tokens per Sec: 16070, Lr: 0.000300\n", "2019-11-22 22:42:56,137 Epoch 25 Step: 128700 Batch Loss: 1.585185 Tokens per Sec: 16571, Lr: 0.000300\n", "2019-11-22 22:43:10,555 Epoch 25 Step: 128800 Batch Loss: 1.401481 Tokens per Sec: 15899, Lr: 0.000300\n", "2019-11-22 22:43:25,114 Epoch 25 Step: 128900 Batch Loss: 1.553735 Tokens per Sec: 15791, Lr: 0.000300\n", "2019-11-22 22:43:39,293 Epoch 25 Step: 129000 Batch Loss: 1.561631 Tokens per Sec: 16322, Lr: 0.000300\n", "2019-11-22 22:44:16,431 Example #0\n", "2019-11-22 22:44:16,431 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:44:16,431 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:44:16,431 \tHypothesis: Ní báyìí , mo ti wá rí iṣẹ́ tó dára gan - an .\n", "2019-11-22 22:44:16,432 Example #1\n", "2019-11-22 22:44:16,432 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:44:16,432 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:44:16,432 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:44:16,432 Example #2\n", "2019-11-22 22:44:16,432 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:44:16,432 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:44:16,432 \tHypothesis: Ó ní ìrírí àti ìdààmú tó pọ̀ ju bó ṣe yẹ lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:44:16,433 Example #3\n", "2019-11-22 22:44:16,433 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:44:16,433 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:44:16,433 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 22:44:16,433 Validation result (greedy) at epoch 25, step 129000: bleu: 28.32, loss: 42742.6562, ppl: 4.1883, duration: 37.1399s\n", "2019-11-22 22:44:30,509 Epoch 25 Step: 129100 Batch Loss: 1.610821 Tokens per Sec: 16365, Lr: 0.000300\n", "2019-11-22 22:44:44,648 Epoch 25 Step: 129200 Batch Loss: 1.477716 Tokens per Sec: 16331, Lr: 0.000300\n", "2019-11-22 22:44:58,557 Epoch 25 Step: 129300 Batch Loss: 1.664829 Tokens per Sec: 16748, Lr: 0.000300\n", "2019-11-22 22:45:12,355 Epoch 25 Step: 129400 Batch Loss: 1.434471 Tokens per Sec: 16836, Lr: 0.000300\n", "2019-11-22 22:45:26,238 Epoch 25 Step: 129500 Batch Loss: 1.502040 Tokens per Sec: 16796, Lr: 0.000300\n", "2019-11-22 22:45:40,267 Epoch 25 Step: 129600 Batch Loss: 1.538293 Tokens per Sec: 16440, Lr: 0.000300\n", "2019-11-22 22:45:54,378 Epoch 25 Step: 129700 Batch Loss: 1.526207 Tokens per Sec: 16445, Lr: 0.000300\n", "2019-11-22 22:46:08,554 Epoch 25 Step: 129800 Batch Loss: 1.438056 Tokens per Sec: 16245, Lr: 0.000300\n", "2019-11-22 22:46:22,439 Epoch 25 Step: 129900 Batch Loss: 1.672305 Tokens per Sec: 16748, Lr: 0.000300\n", "2019-11-22 22:46:36,627 Epoch 25 Step: 130000 Batch Loss: 1.453660 Tokens per Sec: 16284, Lr: 0.000300\n", "2019-11-22 22:47:14,249 Example #0\n", "2019-11-22 22:47:14,249 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:47:14,249 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:47:14,249 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára jù lọ ni .\n", "2019-11-22 22:47:14,250 Example #1\n", "2019-11-22 22:47:14,250 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:47:14,250 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:47:14,250 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:47:14,250 Example #2\n", "2019-11-22 22:47:14,250 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:47:14,250 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:47:14,250 \tHypothesis: Ó ti ní ìrírí àti amọ́kànyọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:47:14,251 Example #3\n", "2019-11-22 22:47:14,251 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:47:14,251 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:47:14,251 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Harkavy’s Stud’s Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , nítorí pé kò sí ohun tó lè ṣẹlẹ̀ sí wa . ”\n", "2019-11-22 22:47:14,251 Validation result (greedy) at epoch 25, step 130000: bleu: 28.15, loss: 42810.6719, ppl: 4.1979, duration: 37.6240s\n", "2019-11-22 22:47:28,404 Epoch 25 Step: 130100 Batch Loss: 1.446979 Tokens per Sec: 16356, Lr: 0.000300\n", "2019-11-22 22:47:42,381 Epoch 25 Step: 130200 Batch Loss: 1.634638 Tokens per Sec: 16558, Lr: 0.000300\n", "2019-11-22 22:47:56,478 Epoch 25 Step: 130300 Batch Loss: 1.534678 Tokens per Sec: 16844, Lr: 0.000300\n", "2019-11-22 22:48:10,501 Epoch 25 Step: 130400 Batch Loss: 1.422293 Tokens per Sec: 16521, Lr: 0.000300\n", "2019-11-22 22:48:24,506 Epoch 25 Step: 130500 Batch Loss: 1.626375 Tokens per Sec: 16684, Lr: 0.000300\n", "2019-11-22 22:48:38,296 Epoch 25 Step: 130600 Batch Loss: 1.612790 Tokens per Sec: 17247, Lr: 0.000300\n", "2019-11-22 22:48:52,645 Epoch 25 Step: 130700 Batch Loss: 1.461276 Tokens per Sec: 16351, Lr: 0.000300\n", "2019-11-22 22:49:06,420 Epoch 25 Step: 130800 Batch Loss: 1.425781 Tokens per Sec: 16713, Lr: 0.000300\n", "2019-11-22 22:49:20,584 Epoch 25 Step: 130900 Batch Loss: 1.586448 Tokens per Sec: 16549, Lr: 0.000300\n", "2019-11-22 22:49:34,332 Epoch 25 Step: 131000 Batch Loss: 1.633646 Tokens per Sec: 16016, Lr: 0.000300\n", "2019-11-22 22:50:11,696 Hooray! New best validation result [ppl]!\n", "2019-11-22 22:50:11,696 Saving new checkpoint.\n", "2019-11-22 22:50:11,983 Example #0\n", "2019-11-22 22:50:11,983 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:50:11,983 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:50:11,983 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 22:50:11,983 Example #1\n", "2019-11-22 22:50:11,984 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:50:11,984 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:50:11,984 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:50:11,984 Example #2\n", "2019-11-22 22:50:11,984 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:50:11,984 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:50:11,984 \tHypothesis: Ó ní ìrírí àti ìjákulẹ̀ tó pọ̀ ju tìẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:50:11,984 Example #3\n", "2019-11-22 22:50:11,984 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:50:11,985 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:50:11,985 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbàkigbà rí . ”\n", "2019-11-22 22:50:11,985 Validation result (greedy) at epoch 25, step 131000: bleu: 28.04, loss: 42646.0898, ppl: 4.1748, duration: 37.6519s\n", "2019-11-22 22:50:26,030 Epoch 25 Step: 131100 Batch Loss: 1.613611 Tokens per Sec: 16428, Lr: 0.000300\n", "2019-11-22 22:50:39,921 Epoch 25 Step: 131200 Batch Loss: 1.511195 Tokens per Sec: 16771, Lr: 0.000300\n", "2019-11-22 22:50:53,673 Epoch 25 Step: 131300 Batch Loss: 1.477616 Tokens per Sec: 16756, Lr: 0.000300\n", "2019-11-22 22:51:07,687 Epoch 25 Step: 131400 Batch Loss: 1.629531 Tokens per Sec: 16360, Lr: 0.000300\n", "2019-11-22 22:51:21,636 Epoch 25 Step: 131500 Batch Loss: 1.389010 Tokens per Sec: 16383, Lr: 0.000300\n", "2019-11-22 22:51:35,440 Epoch 25 Step: 131600 Batch Loss: 1.717625 Tokens per Sec: 16336, Lr: 0.000300\n", "2019-11-22 22:51:48,866 Epoch 25: total training loss 8212.82\n", "2019-11-22 22:51:48,867 EPOCH 26\n", "2019-11-22 22:51:49,569 Epoch 26 Step: 131700 Batch Loss: 1.481885 Tokens per Sec: 3789, Lr: 0.000300\n", "2019-11-22 22:52:03,478 Epoch 26 Step: 131800 Batch Loss: 1.533257 Tokens per Sec: 16852, Lr: 0.000300\n", "2019-11-22 22:52:17,746 Epoch 26 Step: 131900 Batch Loss: 1.713872 Tokens per Sec: 16346, Lr: 0.000300\n", "2019-11-22 22:52:32,055 Epoch 26 Step: 132000 Batch Loss: 1.763058 Tokens per Sec: 16247, Lr: 0.000300\n", "2019-11-22 22:53:09,355 Example #0\n", "2019-11-22 22:53:09,355 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:53:09,355 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:53:09,355 \tHypothesis: Ní báyìí , mo ti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 22:53:09,355 Example #1\n", "2019-11-22 22:53:09,356 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:53:09,356 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:53:09,356 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 22:53:09,356 Example #2\n", "2019-11-22 22:53:09,356 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:53:09,356 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:53:09,357 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:53:09,357 Example #3\n", "2019-11-22 22:53:09,357 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:53:09,357 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:53:09,357 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , jíjẹ́ ẹni tó ń fẹsẹ̀ múlẹ̀ ṣinṣin , títí láé . ”\n", "2019-11-22 22:53:09,357 Validation result (greedy) at epoch 26, step 132000: bleu: 28.37, loss: 42647.9766, ppl: 4.1750, duration: 37.3017s\n", "2019-11-22 22:53:23,707 Epoch 26 Step: 132100 Batch Loss: 1.791790 Tokens per Sec: 16210, Lr: 0.000300\n", "2019-11-22 22:53:37,669 Epoch 26 Step: 132200 Batch Loss: 1.607279 Tokens per Sec: 16761, Lr: 0.000300\n", "2019-11-22 22:53:52,014 Epoch 26 Step: 132300 Batch Loss: 1.321737 Tokens per Sec: 15841, Lr: 0.000300\n", "2019-11-22 22:54:06,120 Epoch 26 Step: 132400 Batch Loss: 1.633270 Tokens per Sec: 16737, Lr: 0.000300\n", "2019-11-22 22:54:20,146 Epoch 26 Step: 132500 Batch Loss: 1.514960 Tokens per Sec: 16383, Lr: 0.000300\n", "2019-11-22 22:54:34,787 Epoch 26 Step: 132600 Batch Loss: 1.548204 Tokens per Sec: 15975, Lr: 0.000300\n", "2019-11-22 22:54:49,034 Epoch 26 Step: 132700 Batch Loss: 1.504619 Tokens per Sec: 16418, Lr: 0.000300\n", "2019-11-22 22:55:02,983 Epoch 26 Step: 132800 Batch Loss: 1.513198 Tokens per Sec: 16503, Lr: 0.000300\n", "2019-11-22 22:55:16,960 Epoch 26 Step: 132900 Batch Loss: 1.388904 Tokens per Sec: 16635, Lr: 0.000300\n", "2019-11-22 22:55:31,168 Epoch 26 Step: 133000 Batch Loss: 1.520779 Tokens per Sec: 15908, Lr: 0.000300\n", "2019-11-22 22:56:09,311 Hooray! New best validation result [ppl]!\n", "2019-11-22 22:56:09,312 Saving new checkpoint.\n", "2019-11-22 22:56:09,636 Example #0\n", "2019-11-22 22:56:09,636 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:56:09,636 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:56:09,636 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 22:56:09,637 Example #1\n", "2019-11-22 22:56:09,637 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:56:09,637 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:56:09,637 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 22:56:09,637 Example #2\n", "2019-11-22 22:56:09,638 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:56:09,638 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:56:09,638 \tHypothesis: Ó ní ìrírí àti amúniláradá ju bó o ṣe ń rìn jìnnà sí ẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:56:09,638 Example #3\n", "2019-11-22 22:56:09,638 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:56:09,638 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:56:09,638 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , Hédíà túmọ̀ sí “ ìfaradà , ìfaradà , ìfaradà , títí láé , fún ìgbàkigbà . ”\n", "2019-11-22 22:56:09,639 Validation result (greedy) at epoch 26, step 133000: bleu: 28.45, loss: 42638.6562, ppl: 4.1737, duration: 38.4706s\n", "2019-11-22 22:56:24,056 Epoch 26 Step: 133100 Batch Loss: 1.469816 Tokens per Sec: 16235, Lr: 0.000300\n", "2019-11-22 22:56:38,220 Epoch 26 Step: 133200 Batch Loss: 1.666913 Tokens per Sec: 16390, Lr: 0.000300\n", "2019-11-22 22:56:52,504 Epoch 26 Step: 133300 Batch Loss: 1.610434 Tokens per Sec: 16292, Lr: 0.000300\n", "2019-11-22 22:57:06,672 Epoch 26 Step: 133400 Batch Loss: 1.162460 Tokens per Sec: 15791, Lr: 0.000300\n", "2019-11-22 22:57:20,581 Epoch 26 Step: 133500 Batch Loss: 1.467444 Tokens per Sec: 16585, Lr: 0.000300\n", "2019-11-22 22:57:35,205 Epoch 26 Step: 133600 Batch Loss: 1.710076 Tokens per Sec: 15891, Lr: 0.000300\n", "2019-11-22 22:57:49,076 Epoch 26 Step: 133700 Batch Loss: 1.577151 Tokens per Sec: 16633, Lr: 0.000300\n", "2019-11-22 22:58:02,913 Epoch 26 Step: 133800 Batch Loss: 1.544309 Tokens per Sec: 16663, Lr: 0.000300\n", "2019-11-22 22:58:16,869 Epoch 26 Step: 133900 Batch Loss: 1.578401 Tokens per Sec: 16738, Lr: 0.000300\n", "2019-11-22 22:58:31,091 Epoch 26 Step: 134000 Batch Loss: 1.631289 Tokens per Sec: 16387, Lr: 0.000300\n", "2019-11-22 22:59:08,769 Example #0\n", "2019-11-22 22:59:08,769 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 22:59:08,769 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 22:59:08,769 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 22:59:08,769 Example #1\n", "2019-11-22 22:59:08,769 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 22:59:08,769 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 22:59:08,770 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 22:59:08,770 Example #2\n", "2019-11-22 22:59:08,770 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 22:59:08,770 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 22:59:08,770 \tHypothesis: Ó ní ìrírí tó pọ̀ tó o sì ń ṣe ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 22:59:08,770 Example #3\n", "2019-11-22 22:59:08,770 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 22:59:08,770 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 22:59:08,771 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of the Hébérù àti Chaldee Dictionary ṣe sọ , ẹ̀mí bàjẹ́ túmọ̀ sí “ pípa rọ́rọ́ , jíjẹ́ ẹni tó ń fẹsẹ̀ múlẹ̀ títí láé , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 22:59:08,771 Validation result (greedy) at epoch 26, step 134000: bleu: 28.35, loss: 42648.3008, ppl: 4.1751, duration: 37.6797s\n", "2019-11-22 22:59:22,910 Epoch 26 Step: 134100 Batch Loss: 1.536390 Tokens per Sec: 16294, Lr: 0.000300\n", "2019-11-22 22:59:37,203 Epoch 26 Step: 134200 Batch Loss: 1.589528 Tokens per Sec: 16579, Lr: 0.000300\n", "2019-11-22 22:59:51,355 Epoch 26 Step: 134300 Batch Loss: 1.607837 Tokens per Sec: 16105, Lr: 0.000300\n", "2019-11-22 23:00:05,501 Epoch 26 Step: 134400 Batch Loss: 1.449506 Tokens per Sec: 16500, Lr: 0.000300\n", "2019-11-22 23:00:19,605 Epoch 26 Step: 134500 Batch Loss: 1.466990 Tokens per Sec: 15950, Lr: 0.000300\n", "2019-11-22 23:00:33,688 Epoch 26 Step: 134600 Batch Loss: 1.415249 Tokens per Sec: 16640, Lr: 0.000300\n", "2019-11-22 23:00:48,020 Epoch 26 Step: 134700 Batch Loss: 1.432979 Tokens per Sec: 15854, Lr: 0.000300\n", "2019-11-22 23:01:02,298 Epoch 26 Step: 134800 Batch Loss: 1.619497 Tokens per Sec: 15920, Lr: 0.000300\n", "2019-11-22 23:01:16,882 Epoch 26 Step: 134900 Batch Loss: 1.772073 Tokens per Sec: 15618, Lr: 0.000300\n", "2019-11-22 23:01:31,196 Epoch 26 Step: 135000 Batch Loss: 1.317268 Tokens per Sec: 16108, Lr: 0.000300\n", "2019-11-22 23:02:07,888 Hooray! New best validation result [ppl]!\n", "2019-11-22 23:02:07,889 Saving new checkpoint.\n", "2019-11-22 23:02:08,167 Example #0\n", "2019-11-22 23:02:08,167 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:02:08,168 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:02:08,168 \tHypothesis: Ní báyìí , mo ní láti wá ibi tí mo ti lè rí iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:02:08,168 Example #1\n", "2019-11-22 23:02:08,168 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:02:08,168 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:02:08,168 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:02:08,169 Example #2\n", "2019-11-22 23:02:08,169 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:02:08,169 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:02:08,169 \tHypothesis: Ó ti ní ìrírí àti ìrírí tó pọ̀ ju ti tẹ́lẹ̀ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:02:08,170 Example #3\n", "2019-11-22 23:02:08,170 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:02:08,170 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:02:08,170 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , nítorí pé kò sí ìgbà kankan rí . ”\n", "2019-11-22 23:02:08,170 Validation result (greedy) at epoch 26, step 135000: bleu: 28.30, loss: 42633.5859, ppl: 4.1730, duration: 36.9742s\n", "2019-11-22 23:02:22,298 Epoch 26 Step: 135100 Batch Loss: 1.598465 Tokens per Sec: 16172, Lr: 0.000300\n", "2019-11-22 23:02:36,656 Epoch 26 Step: 135200 Batch Loss: 1.286231 Tokens per Sec: 16520, Lr: 0.000300\n", "2019-11-22 23:02:50,625 Epoch 26 Step: 135300 Batch Loss: 1.694247 Tokens per Sec: 16831, Lr: 0.000300\n", "2019-11-22 23:03:05,065 Epoch 26 Step: 135400 Batch Loss: 1.458286 Tokens per Sec: 16135, Lr: 0.000300\n", "2019-11-22 23:03:19,292 Epoch 26 Step: 135500 Batch Loss: 1.650381 Tokens per Sec: 16294, Lr: 0.000300\n", "2019-11-22 23:03:33,386 Epoch 26 Step: 135600 Batch Loss: 1.715355 Tokens per Sec: 16244, Lr: 0.000300\n", "2019-11-22 23:03:47,508 Epoch 26 Step: 135700 Batch Loss: 1.409088 Tokens per Sec: 16388, Lr: 0.000300\n", "2019-11-22 23:04:01,675 Epoch 26 Step: 135800 Batch Loss: 1.328752 Tokens per Sec: 16175, Lr: 0.000300\n", "2019-11-22 23:04:15,880 Epoch 26 Step: 135900 Batch Loss: 1.639147 Tokens per Sec: 16462, Lr: 0.000300\n", "2019-11-22 23:04:30,185 Epoch 26 Step: 136000 Batch Loss: 1.606146 Tokens per Sec: 15869, Lr: 0.000300\n", "2019-11-22 23:05:07,494 Hooray! New best validation result [ppl]!\n", "2019-11-22 23:05:07,494 Saving new checkpoint.\n", "2019-11-22 23:05:07,781 Example #0\n", "2019-11-22 23:05:07,781 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:05:07,781 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:05:07,781 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:05:07,781 Example #1\n", "2019-11-22 23:05:07,782 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:05:07,782 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:05:07,782 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 23:05:07,782 Example #2\n", "2019-11-22 23:05:07,782 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:05:07,782 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:05:07,782 \tHypothesis: Ó ti ní ìrírí àti amúniláradá ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:05:07,783 Example #3\n", "2019-11-22 23:05:07,783 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:05:07,783 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:05:07,783 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , ohun tí Hédíìsì túmọ̀ sí ni “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:05:07,783 Validation result (greedy) at epoch 26, step 136000: bleu: 28.47, loss: 42431.5977, ppl: 4.1449, duration: 37.5981s\n", "2019-11-22 23:05:21,971 Epoch 26 Step: 136100 Batch Loss: 1.796404 Tokens per Sec: 16384, Lr: 0.000300\n", "2019-11-22 23:05:36,068 Epoch 26 Step: 136200 Batch Loss: 1.500346 Tokens per Sec: 16344, Lr: 0.000300\n", "2019-11-22 23:05:50,208 Epoch 26 Step: 136300 Batch Loss: 1.623628 Tokens per Sec: 16331, Lr: 0.000300\n", "2019-11-22 23:06:04,880 Epoch 26 Step: 136400 Batch Loss: 1.419936 Tokens per Sec: 16058, Lr: 0.000300\n", "2019-11-22 23:06:19,333 Epoch 26 Step: 136500 Batch Loss: 1.602681 Tokens per Sec: 16361, Lr: 0.000300\n", "2019-11-22 23:06:33,744 Epoch 26 Step: 136600 Batch Loss: 1.739229 Tokens per Sec: 15587, Lr: 0.000300\n", "2019-11-22 23:06:48,246 Epoch 26 Step: 136700 Batch Loss: 1.528127 Tokens per Sec: 15869, Lr: 0.000300\n", "2019-11-22 23:07:03,242 Epoch 26 Step: 136800 Batch Loss: 1.648409 Tokens per Sec: 15400, Lr: 0.000300\n", "2019-11-22 23:07:17,854 Epoch 26 Step: 136900 Batch Loss: 1.530972 Tokens per Sec: 15877, Lr: 0.000300\n", "2019-11-22 23:07:27,170 Epoch 26: total training loss 8167.20\n", "2019-11-22 23:07:27,170 EPOCH 27\n", "2019-11-22 23:07:32,834 Epoch 27 Step: 137000 Batch Loss: 1.692628 Tokens per Sec: 14638, Lr: 0.000300\n", "2019-11-22 23:08:10,501 Hooray! New best validation result [ppl]!\n", "2019-11-22 23:08:10,501 Saving new checkpoint.\n", "2019-11-22 23:08:10,794 Example #0\n", "2019-11-22 23:08:10,795 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:08:10,795 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:08:10,795 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:08:10,795 Example #1\n", "2019-11-22 23:08:10,795 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:08:10,795 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:08:10,795 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:08:10,795 Example #2\n", "2019-11-22 23:08:10,796 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:08:10,796 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:08:10,796 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì níye lórí ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:08:10,796 Example #3\n", "2019-11-22 23:08:10,796 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:08:10,796 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:08:10,796 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Stud’s Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:08:10,796 Validation result (greedy) at epoch 27, step 137000: bleu: 28.30, loss: 42356.8242, ppl: 4.1345, duration: 37.9617s\n", "2019-11-22 23:08:25,233 Epoch 27 Step: 137100 Batch Loss: 1.526612 Tokens per Sec: 15873, Lr: 0.000300\n", "2019-11-22 23:08:39,728 Epoch 27 Step: 137200 Batch Loss: 1.503124 Tokens per Sec: 16297, Lr: 0.000300\n", "2019-11-22 23:08:53,955 Epoch 27 Step: 137300 Batch Loss: 1.507359 Tokens per Sec: 16401, Lr: 0.000300\n", "2019-11-22 23:09:08,945 Epoch 27 Step: 137400 Batch Loss: 1.436713 Tokens per Sec: 15745, Lr: 0.000300\n", "2019-11-22 23:09:23,251 Epoch 27 Step: 137500 Batch Loss: 1.503957 Tokens per Sec: 16218, Lr: 0.000300\n", "2019-11-22 23:09:37,490 Epoch 27 Step: 137600 Batch Loss: 1.427222 Tokens per Sec: 15891, Lr: 0.000300\n", "2019-11-22 23:09:51,473 Epoch 27 Step: 137700 Batch Loss: 1.401341 Tokens per Sec: 16541, Lr: 0.000300\n", "2019-11-22 23:10:05,636 Epoch 27 Step: 137800 Batch Loss: 1.529368 Tokens per Sec: 16368, Lr: 0.000300\n", "2019-11-22 23:10:20,183 Epoch 27 Step: 137900 Batch Loss: 1.350100 Tokens per Sec: 15664, Lr: 0.000300\n", "2019-11-22 23:10:34,770 Epoch 27 Step: 138000 Batch Loss: 1.560699 Tokens per Sec: 15571, Lr: 0.000300\n", "2019-11-22 23:11:12,298 Example #0\n", "2019-11-22 23:11:12,298 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:11:12,298 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:11:12,298 \tHypothesis: Ní báyìí , mo ní láti rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 23:11:12,299 Example #1\n", "2019-11-22 23:11:12,299 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:11:12,299 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:11:12,299 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 23:11:12,299 Example #2\n", "2019-11-22 23:11:12,299 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:11:12,299 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:11:12,300 \tHypothesis: Ó ti ní ìrírí tó pọ̀ tó sì ti kọjá agbára rẹ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:11:12,300 Example #3\n", "2019-11-22 23:11:12,300 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:11:12,300 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:11:12,300 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Harkavy’s Stud’s Stud’s Hébérù àti Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:11:12,300 Validation result (greedy) at epoch 27, step 138000: bleu: 28.29, loss: 42570.7188, ppl: 4.1643, duration: 37.5298s\n", "2019-11-22 23:11:26,225 Epoch 27 Step: 138100 Batch Loss: 1.314763 Tokens per Sec: 16359, Lr: 0.000300\n", "2019-11-22 23:11:40,333 Epoch 27 Step: 138200 Batch Loss: 1.550699 Tokens per Sec: 16423, Lr: 0.000300\n", "2019-11-22 23:11:54,289 Epoch 27 Step: 138300 Batch Loss: 1.479673 Tokens per Sec: 16538, Lr: 0.000300\n", "2019-11-22 23:12:08,732 Epoch 27 Step: 138400 Batch Loss: 1.567595 Tokens per Sec: 16265, Lr: 0.000300\n", "2019-11-22 23:12:23,215 Epoch 27 Step: 138500 Batch Loss: 1.550856 Tokens per Sec: 16247, Lr: 0.000300\n", "2019-11-22 23:12:37,155 Epoch 27 Step: 138600 Batch Loss: 1.768647 Tokens per Sec: 16195, Lr: 0.000300\n", "2019-11-22 23:12:51,150 Epoch 27 Step: 138700 Batch Loss: 1.527115 Tokens per Sec: 16714, Lr: 0.000300\n", "2019-11-22 23:13:05,544 Epoch 27 Step: 138800 Batch Loss: 1.548779 Tokens per Sec: 16338, Lr: 0.000300\n", "2019-11-22 23:13:19,909 Epoch 27 Step: 138900 Batch Loss: 1.460426 Tokens per Sec: 16401, Lr: 0.000300\n", "2019-11-22 23:13:33,818 Epoch 27 Step: 139000 Batch Loss: 1.686403 Tokens per Sec: 16949, Lr: 0.000300\n", "2019-11-22 23:14:11,423 Example #0\n", "2019-11-22 23:14:11,423 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:14:11,423 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:14:11,423 \tHypothesis: Ní báyìí , mo ní láti wá ibi iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:14:11,423 Example #1\n", "2019-11-22 23:14:11,423 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:14:11,423 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:14:11,424 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 23:14:11,424 Example #2\n", "2019-11-22 23:14:11,424 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:14:11,424 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:14:11,424 \tHypothesis: Ó ní ìrírí àti amúniláradá ju tìrẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:14:11,424 Example #3\n", "2019-11-22 23:14:11,424 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:14:11,424 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:14:11,424 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:14:11,425 Validation result (greedy) at epoch 27, step 139000: bleu: 28.42, loss: 42416.5000, ppl: 4.1428, duration: 37.6067s\n", "2019-11-22 23:14:25,331 Epoch 27 Step: 139100 Batch Loss: 1.380748 Tokens per Sec: 16689, Lr: 0.000300\n", "2019-11-22 23:14:39,274 Epoch 27 Step: 139200 Batch Loss: 1.507467 Tokens per Sec: 16456, Lr: 0.000300\n", "2019-11-22 23:14:53,439 Epoch 27 Step: 139300 Batch Loss: 1.710825 Tokens per Sec: 16476, Lr: 0.000300\n", "2019-11-22 23:15:07,510 Epoch 27 Step: 139400 Batch Loss: 1.434281 Tokens per Sec: 16354, Lr: 0.000300\n", "2019-11-22 23:15:21,861 Epoch 27 Step: 139500 Batch Loss: 1.471690 Tokens per Sec: 16262, Lr: 0.000300\n", "2019-11-22 23:15:35,899 Epoch 27 Step: 139600 Batch Loss: 1.570065 Tokens per Sec: 16677, Lr: 0.000300\n", "2019-11-22 23:15:50,063 Epoch 27 Step: 139700 Batch Loss: 1.511532 Tokens per Sec: 16272, Lr: 0.000300\n", "2019-11-22 23:16:04,228 Epoch 27 Step: 139800 Batch Loss: 1.592713 Tokens per Sec: 16216, Lr: 0.000300\n", "2019-11-22 23:16:18,194 Epoch 27 Step: 139900 Batch Loss: 1.550174 Tokens per Sec: 16497, Lr: 0.000300\n", "2019-11-22 23:16:31,935 Epoch 27 Step: 140000 Batch Loss: 1.588811 Tokens per Sec: 16419, Lr: 0.000300\n", "2019-11-22 23:17:09,361 Hooray! New best validation result [ppl]!\n", "2019-11-22 23:17:09,361 Saving new checkpoint.\n", "2019-11-22 23:17:09,671 Example #0\n", "2019-11-22 23:17:09,672 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:17:09,672 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:17:09,672 \tHypothesis: Ní báyìí , mo ní láti wá ibi iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:17:09,672 Example #1\n", "2019-11-22 23:17:09,672 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:17:09,672 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:17:09,673 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti àwọn èèyàn lọ ?\n", "2019-11-22 23:17:09,673 Example #2\n", "2019-11-22 23:17:09,673 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:17:09,673 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:17:09,673 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì nítumọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:17:09,673 Example #3\n", "2019-11-22 23:17:09,673 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:17:09,673 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:17:09,674 \tHypothesis: Gẹ́gẹ́ bí àwọn Akẹ́kọ̀ọ́ Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , ìdùnnú , ìfaradà , ìfaradà , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 23:17:09,674 Validation result (greedy) at epoch 27, step 140000: bleu: 28.43, loss: 42311.2930, ppl: 4.1282, duration: 37.7382s\n", "2019-11-22 23:17:24,012 Epoch 27 Step: 140100 Batch Loss: 1.529737 Tokens per Sec: 16333, Lr: 0.000300\n", "2019-11-22 23:17:37,829 Epoch 27 Step: 140200 Batch Loss: 1.514061 Tokens per Sec: 16635, Lr: 0.000300\n", "2019-11-22 23:17:51,912 Epoch 27 Step: 140300 Batch Loss: 1.269603 Tokens per Sec: 16217, Lr: 0.000300\n", "2019-11-22 23:18:05,943 Epoch 27 Step: 140400 Batch Loss: 1.516551 Tokens per Sec: 16376, Lr: 0.000300\n", "2019-11-22 23:18:20,448 Epoch 27 Step: 140500 Batch Loss: 1.620251 Tokens per Sec: 15776, Lr: 0.000300\n", "2019-11-22 23:18:35,053 Epoch 27 Step: 140600 Batch Loss: 1.426247 Tokens per Sec: 15668, Lr: 0.000300\n", "2019-11-22 23:18:49,706 Epoch 27 Step: 140700 Batch Loss: 1.522131 Tokens per Sec: 15788, Lr: 0.000300\n", "2019-11-22 23:19:03,978 Epoch 27 Step: 140800 Batch Loss: 1.735798 Tokens per Sec: 16143, Lr: 0.000300\n", "2019-11-22 23:19:18,422 Epoch 27 Step: 140900 Batch Loss: 1.452836 Tokens per Sec: 15687, Lr: 0.000300\n", "2019-11-22 23:19:33,374 Epoch 27 Step: 141000 Batch Loss: 1.458712 Tokens per Sec: 15594, Lr: 0.000300\n", "2019-11-22 23:20:12,480 Example #0\n", "2019-11-22 23:20:12,481 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:20:12,481 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:20:12,481 \tHypothesis: Ní báyìí , mo ní láti wá ibi iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:20:12,481 Example #1\n", "2019-11-22 23:20:12,481 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:20:12,481 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:20:12,481 \tHypothesis: Ṣé ohun tí mo kà sí ohun ìní tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:20:12,481 Example #2\n", "2019-11-22 23:20:12,481 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:20:12,481 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:20:12,481 \tHypothesis: Ó ní ìrírí tó pọ̀ tó sì ń fani mọ́ra ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:20:12,482 Example #3\n", "2019-11-22 23:20:12,482 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:20:12,482 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:20:12,482 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:20:12,482 Validation result (greedy) at epoch 27, step 141000: bleu: 28.61, loss: 42365.3242, ppl: 4.1357, duration: 39.1080s\n", "2019-11-22 23:20:27,528 Epoch 27 Step: 141100 Batch Loss: 1.645906 Tokens per Sec: 15419, Lr: 0.000300\n", "2019-11-22 23:20:42,657 Epoch 27 Step: 141200 Batch Loss: 1.763200 Tokens per Sec: 15902, Lr: 0.000300\n", "2019-11-22 23:20:57,414 Epoch 27 Step: 141300 Batch Loss: 1.749830 Tokens per Sec: 15741, Lr: 0.000300\n", "2019-11-22 23:21:12,112 Epoch 27 Step: 141400 Batch Loss: 1.637800 Tokens per Sec: 15763, Lr: 0.000300\n", "2019-11-22 23:21:26,607 Epoch 27 Step: 141500 Batch Loss: 1.632680 Tokens per Sec: 15735, Lr: 0.000300\n", "2019-11-22 23:21:41,518 Epoch 27 Step: 141600 Batch Loss: 1.560324 Tokens per Sec: 15562, Lr: 0.000300\n", "2019-11-22 23:21:56,675 Epoch 27 Step: 141700 Batch Loss: 1.567649 Tokens per Sec: 15535, Lr: 0.000300\n", "2019-11-22 23:22:11,319 Epoch 27 Step: 141800 Batch Loss: 1.569226 Tokens per Sec: 15844, Lr: 0.000300\n", "2019-11-22 23:22:26,060 Epoch 27 Step: 141900 Batch Loss: 1.512757 Tokens per Sec: 15754, Lr: 0.000300\n", "2019-11-22 23:22:40,948 Epoch 27 Step: 142000 Batch Loss: 1.477056 Tokens per Sec: 15609, Lr: 0.000300\n", "2019-11-22 23:23:20,049 Hooray! New best validation result [ppl]!\n", "2019-11-22 23:23:20,049 Saving new checkpoint.\n", "2019-11-22 23:23:20,376 Example #0\n", "2019-11-22 23:23:20,377 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:23:20,377 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:23:20,377 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 23:23:20,377 Example #1\n", "2019-11-22 23:23:20,377 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:23:20,377 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:23:20,377 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 23:23:20,378 Example #2\n", "2019-11-22 23:23:20,378 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:23:20,378 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:23:20,378 \tHypothesis: Ó ti ní ìrírí tó pọ̀ gan - an , ó sì ti mú kí ara tù ú , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:23:20,378 Example #3\n", "2019-11-22 23:23:20,379 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:23:20,379 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:23:20,379 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Greek and Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , ìfaradà , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 23:23:20,379 Validation result (greedy) at epoch 27, step 142000: bleu: 29.18, loss: 42150.9531, ppl: 4.1061, duration: 39.4313s\n", "2019-11-22 23:23:35,452 Epoch 27 Step: 142100 Batch Loss: 1.616459 Tokens per Sec: 15283, Lr: 0.000300\n", "2019-11-22 23:23:50,191 Epoch 27 Step: 142200 Batch Loss: 1.559099 Tokens per Sec: 15831, Lr: 0.000300\n", "2019-11-22 23:23:54,338 Epoch 27: total training loss 8125.09\n", "2019-11-22 23:23:54,338 EPOCH 28\n", "2019-11-22 23:24:06,006 Epoch 28 Step: 142300 Batch Loss: 1.483303 Tokens per Sec: 14747, Lr: 0.000300\n", "2019-11-22 23:24:21,328 Epoch 28 Step: 142400 Batch Loss: 1.458850 Tokens per Sec: 14712, Lr: 0.000300\n", "2019-11-22 23:24:36,372 Epoch 28 Step: 142500 Batch Loss: 1.505849 Tokens per Sec: 15512, Lr: 0.000300\n", "2019-11-22 23:24:51,181 Epoch 28 Step: 142600 Batch Loss: 1.497399 Tokens per Sec: 15374, Lr: 0.000300\n", "2019-11-22 23:25:05,972 Epoch 28 Step: 142700 Batch Loss: 1.658846 Tokens per Sec: 15259, Lr: 0.000300\n", "2019-11-22 23:25:21,240 Epoch 28 Step: 142800 Batch Loss: 1.693617 Tokens per Sec: 15517, Lr: 0.000300\n", "2019-11-22 23:25:36,283 Epoch 28 Step: 142900 Batch Loss: 1.438543 Tokens per Sec: 15385, Lr: 0.000300\n", "2019-11-22 23:25:51,499 Epoch 28 Step: 143000 Batch Loss: 1.672790 Tokens per Sec: 15476, Lr: 0.000300\n", "2019-11-22 23:26:31,217 Example #0\n", "2019-11-22 23:26:31,217 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:26:31,217 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:26:31,217 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:26:31,218 Example #1\n", "2019-11-22 23:26:31,218 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:26:31,218 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:26:31,218 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn lọ ?\n", "2019-11-22 23:26:31,218 Example #2\n", "2019-11-22 23:26:31,218 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:26:31,218 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:26:31,218 \tHypothesis: Ó ti ní ìrírí tó pọ̀ jù , ó sì ti mú kó ṣeé ṣe fún ọ láti ṣe , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:26:31,219 Example #3\n", "2019-11-22 23:26:31,219 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:26:31,219 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:26:31,219 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè náà , The Harkavy’s Stud’s Stud’s Stud’s Greek and Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìdúró , títí láé , títí láé . ”\n", "2019-11-22 23:26:31,219 Validation result (greedy) at epoch 28, step 143000: bleu: 28.66, loss: 42464.1367, ppl: 4.1494, duration: 39.7199s\n", "2019-11-22 23:26:46,022 Epoch 28 Step: 143100 Batch Loss: 1.716228 Tokens per Sec: 15657, Lr: 0.000300\n", "2019-11-22 23:27:00,677 Epoch 28 Step: 143200 Batch Loss: 1.575646 Tokens per Sec: 15814, Lr: 0.000300\n", "2019-11-22 23:27:15,539 Epoch 28 Step: 143300 Batch Loss: 1.590463 Tokens per Sec: 15565, Lr: 0.000300\n", "2019-11-22 23:27:30,745 Epoch 28 Step: 143400 Batch Loss: 1.704813 Tokens per Sec: 14930, Lr: 0.000300\n", "2019-11-22 23:27:45,533 Epoch 28 Step: 143500 Batch Loss: 1.657692 Tokens per Sec: 15859, Lr: 0.000300\n", "2019-11-22 23:28:00,420 Epoch 28 Step: 143600 Batch Loss: 1.449963 Tokens per Sec: 15524, Lr: 0.000300\n", "2019-11-22 23:28:15,278 Epoch 28 Step: 143700 Batch Loss: 1.396618 Tokens per Sec: 15727, Lr: 0.000300\n", "2019-11-22 23:28:29,930 Epoch 28 Step: 143800 Batch Loss: 1.545718 Tokens per Sec: 16043, Lr: 0.000300\n", "2019-11-22 23:28:44,256 Epoch 28 Step: 143900 Batch Loss: 1.547558 Tokens per Sec: 16212, Lr: 0.000300\n", "2019-11-22 23:28:58,763 Epoch 28 Step: 144000 Batch Loss: 1.776842 Tokens per Sec: 16116, Lr: 0.000300\n", "2019-11-22 23:29:37,164 Example #0\n", "2019-11-22 23:29:37,165 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:29:37,165 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:29:37,165 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:29:37,165 Example #1\n", "2019-11-22 23:29:37,165 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:29:37,165 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:29:37,165 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:29:37,166 Example #2\n", "2019-11-22 23:29:37,166 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:29:37,166 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:29:37,166 \tHypothesis: Ó ti ní ìrírí tó pọ̀ tó sì ti pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:29:37,166 Example #3\n", "2019-11-22 23:29:37,166 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:29:37,167 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:29:37,167 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé , fún ìgbà kan rí . ”\n", "2019-11-22 23:29:37,167 Validation result (greedy) at epoch 28, step 144000: bleu: 29.00, loss: 42485.6914, ppl: 4.1524, duration: 38.4033s\n", "2019-11-22 23:29:51,477 Epoch 28 Step: 144100 Batch Loss: 1.215062 Tokens per Sec: 15434, Lr: 0.000300\n", "2019-11-22 23:30:06,114 Epoch 28 Step: 144200 Batch Loss: 1.454081 Tokens per Sec: 15946, Lr: 0.000300\n", "2019-11-22 23:30:20,644 Epoch 28 Step: 144300 Batch Loss: 1.536556 Tokens per Sec: 16011, Lr: 0.000300\n", "2019-11-22 23:30:35,029 Epoch 28 Step: 144400 Batch Loss: 1.319460 Tokens per Sec: 15607, Lr: 0.000300\n", "2019-11-22 23:30:49,443 Epoch 28 Step: 144500 Batch Loss: 1.506854 Tokens per Sec: 15906, Lr: 0.000300\n", "2019-11-22 23:31:03,820 Epoch 28 Step: 144600 Batch Loss: 1.421983 Tokens per Sec: 15774, Lr: 0.000300\n", "2019-11-22 23:31:18,185 Epoch 28 Step: 144700 Batch Loss: 1.511408 Tokens per Sec: 16164, Lr: 0.000300\n", "2019-11-22 23:31:32,734 Epoch 28 Step: 144800 Batch Loss: 1.623863 Tokens per Sec: 15668, Lr: 0.000300\n", "2019-11-22 23:31:47,270 Epoch 28 Step: 144900 Batch Loss: 1.466014 Tokens per Sec: 16024, Lr: 0.000300\n", "2019-11-22 23:32:01,847 Epoch 28 Step: 145000 Batch Loss: 1.466992 Tokens per Sec: 15743, Lr: 0.000300\n", "2019-11-22 23:32:39,859 Example #0\n", "2019-11-22 23:32:39,859 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:32:39,859 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:32:39,859 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 23:32:39,860 Example #1\n", "2019-11-22 23:32:39,860 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:32:39,860 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:32:39,860 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:32:39,860 Example #2\n", "2019-11-22 23:32:39,861 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:32:39,861 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:32:39,861 \tHypothesis: Ó ní ìrírí àti amúniláradá ju bó o ṣe ń ṣe lọ , àmọ́ ó ń fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:32:39,861 Example #3\n", "2019-11-22 23:32:39,861 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:32:39,861 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:32:39,861 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Stud’s Bible and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:32:39,861 Validation result (greedy) at epoch 28, step 145000: bleu: 28.91, loss: 42302.5195, ppl: 4.1270, duration: 38.0144s\n", "2019-11-22 23:32:54,505 Epoch 28 Step: 145100 Batch Loss: 1.542354 Tokens per Sec: 15585, Lr: 0.000300\n", "2019-11-22 23:33:09,111 Epoch 28 Step: 145200 Batch Loss: 1.366380 Tokens per Sec: 15854, Lr: 0.000300\n", "2019-11-22 23:33:23,296 Epoch 28 Step: 145300 Batch Loss: 1.445353 Tokens per Sec: 16479, Lr: 0.000300\n", "2019-11-22 23:33:37,769 Epoch 28 Step: 145400 Batch Loss: 1.434375 Tokens per Sec: 16274, Lr: 0.000300\n", "2019-11-22 23:33:52,374 Epoch 28 Step: 145500 Batch Loss: 1.374506 Tokens per Sec: 15827, Lr: 0.000300\n", "2019-11-22 23:34:06,735 Epoch 28 Step: 145600 Batch Loss: 1.668589 Tokens per Sec: 16353, Lr: 0.000300\n", "2019-11-22 23:34:21,284 Epoch 28 Step: 145700 Batch Loss: 1.471887 Tokens per Sec: 16013, Lr: 0.000300\n", "2019-11-22 23:34:35,650 Epoch 28 Step: 145800 Batch Loss: 1.973406 Tokens per Sec: 15860, Lr: 0.000300\n", "2019-11-22 23:34:49,860 Epoch 28 Step: 145900 Batch Loss: 1.577447 Tokens per Sec: 16184, Lr: 0.000300\n", "2019-11-22 23:35:04,140 Epoch 28 Step: 146000 Batch Loss: 1.590573 Tokens per Sec: 16296, Lr: 0.000300\n", "2019-11-22 23:35:42,118 Example #0\n", "2019-11-22 23:35:42,118 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:35:42,119 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:35:42,119 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 23:35:42,119 Example #1\n", "2019-11-22 23:35:42,119 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:35:42,119 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:35:42,119 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:35:42,119 Example #2\n", "2019-11-22 23:35:42,120 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:35:42,120 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:35:42,120 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìjákulẹ̀ ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:35:42,120 Example #3\n", "2019-11-22 23:35:42,120 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:35:42,120 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:35:42,121 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ti sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìdẹkùn , títí láé , títí láé . ”\n", "2019-11-22 23:35:42,121 Validation result (greedy) at epoch 28, step 146000: bleu: 28.48, loss: 42169.6875, ppl: 4.1087, duration: 37.9807s\n", "2019-11-22 23:35:56,205 Epoch 28 Step: 146100 Batch Loss: 1.452927 Tokens per Sec: 16357, Lr: 0.000300\n", "2019-11-22 23:36:10,339 Epoch 28 Step: 146200 Batch Loss: 1.606269 Tokens per Sec: 16684, Lr: 0.000300\n", "2019-11-22 23:36:24,383 Epoch 28 Step: 146300 Batch Loss: 1.547732 Tokens per Sec: 16424, Lr: 0.000300\n", "2019-11-22 23:36:38,618 Epoch 28 Step: 146400 Batch Loss: 1.449237 Tokens per Sec: 16401, Lr: 0.000300\n", "2019-11-22 23:36:53,118 Epoch 28 Step: 146500 Batch Loss: 1.617392 Tokens per Sec: 16224, Lr: 0.000300\n", "2019-11-22 23:37:07,694 Epoch 28 Step: 146600 Batch Loss: 1.490273 Tokens per Sec: 15465, Lr: 0.000300\n", "2019-11-22 23:37:21,834 Epoch 28 Step: 146700 Batch Loss: 1.371654 Tokens per Sec: 16456, Lr: 0.000300\n", "2019-11-22 23:37:36,200 Epoch 28 Step: 146800 Batch Loss: 1.423738 Tokens per Sec: 16291, Lr: 0.000300\n", "2019-11-22 23:37:50,688 Epoch 28 Step: 146900 Batch Loss: 1.661541 Tokens per Sec: 15892, Lr: 0.000300\n", "2019-11-22 23:38:05,064 Epoch 28 Step: 147000 Batch Loss: 1.620910 Tokens per Sec: 15919, Lr: 0.000300\n", "2019-11-22 23:38:43,142 Example #0\n", "2019-11-22 23:38:43,142 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:38:43,142 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:38:43,142 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:38:43,142 Example #1\n", "2019-11-22 23:38:43,142 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:38:43,143 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:38:43,143 \tHypothesis: Ṣé mo máa ń mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:38:43,143 Example #2\n", "2019-11-22 23:38:43,143 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:38:43,143 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:38:43,143 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an ju ti ìwọ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:38:43,143 Example #3\n", "2019-11-22 23:38:43,143 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:38:43,144 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:38:43,144 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:38:43,144 Validation result (greedy) at epoch 28, step 147000: bleu: 28.56, loss: 42190.6562, ppl: 4.1116, duration: 38.0793s\n", "2019-11-22 23:38:57,370 Epoch 28 Step: 147100 Batch Loss: 1.613267 Tokens per Sec: 16419, Lr: 0.000300\n", "2019-11-22 23:39:11,706 Epoch 28 Step: 147200 Batch Loss: 1.597794 Tokens per Sec: 15597, Lr: 0.000300\n", "2019-11-22 23:39:25,996 Epoch 28 Step: 147300 Batch Loss: 1.569838 Tokens per Sec: 16087, Lr: 0.000300\n", "2019-11-22 23:39:40,619 Epoch 28 Step: 147400 Batch Loss: 1.657857 Tokens per Sec: 15559, Lr: 0.000300\n", "2019-11-22 23:39:55,016 Epoch 28 Step: 147500 Batch Loss: 1.496679 Tokens per Sec: 16152, Lr: 0.000300\n", "2019-11-22 23:39:55,182 Epoch 28: total training loss 8112.57\n", "2019-11-22 23:39:55,182 EPOCH 29\n", "2019-11-22 23:40:09,786 Epoch 29 Step: 147600 Batch Loss: 1.560368 Tokens per Sec: 15852, Lr: 0.000300\n", "2019-11-22 23:40:24,004 Epoch 29 Step: 147700 Batch Loss: 1.423685 Tokens per Sec: 16233, Lr: 0.000300\n", "2019-11-22 23:40:38,154 Epoch 29 Step: 147800 Batch Loss: 1.604561 Tokens per Sec: 16742, Lr: 0.000300\n", "2019-11-22 23:40:52,220 Epoch 29 Step: 147900 Batch Loss: 1.521287 Tokens per Sec: 16401, Lr: 0.000300\n", "2019-11-22 23:41:06,896 Epoch 29 Step: 148000 Batch Loss: 1.715958 Tokens per Sec: 15769, Lr: 0.000300\n", "2019-11-22 23:41:44,796 Example #0\n", "2019-11-22 23:41:44,796 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:41:44,797 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:41:44,797 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:41:44,797 Example #1\n", "2019-11-22 23:41:44,797 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:41:44,797 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:41:44,797 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:41:44,797 Example #2\n", "2019-11-22 23:41:44,798 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:41:44,798 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:41:44,798 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju èyí tó o ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:41:44,798 Example #3\n", "2019-11-22 23:41:44,798 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:41:44,798 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:41:44,798 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , ẹ̀mí ẹ̀mí ẹ̀mí ẹ̀mí ẹ̀mí ẹ̀mí ẹ̀mí ẹ̀mí ẹ̀mí ẹ̀mí ẹ̀mí ẹ̀mí mímọ́ túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:41:44,799 Validation result (greedy) at epoch 29, step 148000: bleu: 29.13, loss: 42308.4258, ppl: 4.1278, duration: 37.9025s\n", "2019-11-22 23:41:59,114 Epoch 29 Step: 148100 Batch Loss: 1.491268 Tokens per Sec: 16342, Lr: 0.000210\n", "2019-11-22 23:42:13,281 Epoch 29 Step: 148200 Batch Loss: 1.469071 Tokens per Sec: 16120, Lr: 0.000210\n", "2019-11-22 23:42:27,321 Epoch 29 Step: 148300 Batch Loss: 1.445298 Tokens per Sec: 16359, Lr: 0.000210\n", "2019-11-22 23:42:41,410 Epoch 29 Step: 148400 Batch Loss: 1.365828 Tokens per Sec: 16568, Lr: 0.000210\n", "2019-11-22 23:42:55,561 Epoch 29 Step: 148500 Batch Loss: 1.320271 Tokens per Sec: 15587, Lr: 0.000210\n", "2019-11-22 23:43:10,071 Epoch 29 Step: 148600 Batch Loss: 1.433380 Tokens per Sec: 16078, Lr: 0.000210\n", "2019-11-22 23:43:24,745 Epoch 29 Step: 148700 Batch Loss: 1.689189 Tokens per Sec: 15885, Lr: 0.000210\n", "2019-11-22 23:43:38,906 Epoch 29 Step: 148800 Batch Loss: 1.389647 Tokens per Sec: 16379, Lr: 0.000210\n", "2019-11-22 23:43:52,723 Epoch 29 Step: 148900 Batch Loss: 1.469328 Tokens per Sec: 16046, Lr: 0.000210\n", "2019-11-22 23:44:07,075 Epoch 29 Step: 149000 Batch Loss: 1.604453 Tokens per Sec: 15957, Lr: 0.000210\n", "2019-11-22 23:44:45,166 Hooray! New best validation result [ppl]!\n", "2019-11-22 23:44:45,166 Saving new checkpoint.\n", "2019-11-22 23:44:45,471 Example #0\n", "2019-11-22 23:44:45,471 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:44:45,472 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:44:45,472 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 23:44:45,472 Example #1\n", "2019-11-22 23:44:45,472 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:44:45,472 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:44:45,472 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:44:45,472 Example #2\n", "2019-11-22 23:44:45,472 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:44:45,472 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:44:45,472 \tHypothesis: Ó ní ìrírí àti amúniláradá ju bó ṣe yẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:44:45,472 Example #3\n", "2019-11-22 23:44:45,473 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:44:45,473 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:44:45,473 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students ’ lédè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , nítorí pé kò sí ìgbà kankan . ”\n", "2019-11-22 23:44:45,473 Validation result (greedy) at epoch 29, step 149000: bleu: 29.06, loss: 41804.8008, ppl: 4.0587, duration: 38.3973s\n", "2019-11-22 23:45:00,078 Epoch 29 Step: 149100 Batch Loss: 1.391833 Tokens per Sec: 15738, Lr: 0.000210\n", "2019-11-22 23:45:14,447 Epoch 29 Step: 149200 Batch Loss: 1.540331 Tokens per Sec: 16045, Lr: 0.000210\n", "2019-11-22 23:45:28,654 Epoch 29 Step: 149300 Batch Loss: 1.461457 Tokens per Sec: 15959, Lr: 0.000210\n", "2019-11-22 23:45:42,896 Epoch 29 Step: 149400 Batch Loss: 1.578515 Tokens per Sec: 16226, Lr: 0.000210\n", "2019-11-22 23:45:57,378 Epoch 29 Step: 149500 Batch Loss: 1.385026 Tokens per Sec: 15780, Lr: 0.000210\n", "2019-11-22 23:46:12,082 Epoch 29 Step: 149600 Batch Loss: 1.485155 Tokens per Sec: 15821, Lr: 0.000210\n", "2019-11-22 23:46:26,439 Epoch 29 Step: 149700 Batch Loss: 1.614772 Tokens per Sec: 16159, Lr: 0.000210\n", "2019-11-22 23:46:40,638 Epoch 29 Step: 149800 Batch Loss: 1.588130 Tokens per Sec: 16425, Lr: 0.000210\n", "2019-11-22 23:46:55,115 Epoch 29 Step: 149900 Batch Loss: 1.506442 Tokens per Sec: 16170, Lr: 0.000210\n", "2019-11-22 23:47:09,706 Epoch 29 Step: 150000 Batch Loss: 1.451236 Tokens per Sec: 15895, Lr: 0.000210\n", "2019-11-22 23:47:48,566 Example #0\n", "2019-11-22 23:47:48,566 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:47:48,566 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:47:48,567 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:47:48,567 Example #1\n", "2019-11-22 23:47:48,567 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:47:48,567 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:47:48,567 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:47:48,567 Example #2\n", "2019-11-22 23:47:48,567 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:47:48,568 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:47:48,568 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju tìrẹ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:47:48,568 Example #3\n", "2019-11-22 23:47:48,568 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:47:48,568 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:47:48,568 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé , fún ìgbà kankan . ”\n", "2019-11-22 23:47:48,568 Validation result (greedy) at epoch 29, step 150000: bleu: 29.07, loss: 41822.2734, ppl: 4.0611, duration: 38.8615s\n", "2019-11-22 23:48:02,860 Epoch 29 Step: 150100 Batch Loss: 1.492362 Tokens per Sec: 16548, Lr: 0.000210\n", "2019-11-22 23:48:17,311 Epoch 29 Step: 150200 Batch Loss: 1.376339 Tokens per Sec: 15589, Lr: 0.000210\n", "2019-11-22 23:48:32,061 Epoch 29 Step: 150300 Batch Loss: 1.548204 Tokens per Sec: 15704, Lr: 0.000210\n", "2019-11-22 23:48:46,294 Epoch 29 Step: 150400 Batch Loss: 1.378780 Tokens per Sec: 16473, Lr: 0.000210\n", "2019-11-22 23:49:00,794 Epoch 29 Step: 150500 Batch Loss: 1.428960 Tokens per Sec: 16167, Lr: 0.000210\n", "2019-11-22 23:49:15,130 Epoch 29 Step: 150600 Batch Loss: 1.377262 Tokens per Sec: 16161, Lr: 0.000210\n", "2019-11-22 23:49:29,169 Epoch 29 Step: 150700 Batch Loss: 1.590404 Tokens per Sec: 16483, Lr: 0.000210\n", "2019-11-22 23:49:43,458 Epoch 29 Step: 150800 Batch Loss: 1.524671 Tokens per Sec: 16385, Lr: 0.000210\n", "2019-11-22 23:49:57,709 Epoch 29 Step: 150900 Batch Loss: 1.536111 Tokens per Sec: 16259, Lr: 0.000210\n", "2019-11-22 23:50:12,025 Epoch 29 Step: 151000 Batch Loss: 1.695945 Tokens per Sec: 15994, Lr: 0.000210\n", "2019-11-22 23:50:50,065 Hooray! New best validation result [ppl]!\n", "2019-11-22 23:50:50,065 Saving new checkpoint.\n", "2019-11-22 23:50:50,426 Example #0\n", "2019-11-22 23:50:50,426 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:50:50,426 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:50:50,426 \tHypothesis: Ní báyìí , mo ti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:50:50,426 Example #1\n", "2019-11-22 23:50:50,426 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:50:50,427 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:50:50,427 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:50:50,427 Example #2\n", "2019-11-22 23:50:50,427 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:50:50,427 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:50:50,427 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìmí ẹ̀dùn tó pọ̀ ju bó o ṣe ń ṣe , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:50:50,427 Example #3\n", "2019-11-22 23:50:50,427 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:50:50,427 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:50:50,427 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Stud’s Stude Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:50:50,428 Validation result (greedy) at epoch 29, step 151000: bleu: 28.92, loss: 41790.4727, ppl: 4.0568, duration: 38.4025s\n", "2019-11-22 23:51:04,689 Epoch 29 Step: 151100 Batch Loss: 1.448946 Tokens per Sec: 16017, Lr: 0.000210\n", "2019-11-22 23:51:19,324 Epoch 29 Step: 151200 Batch Loss: 1.559973 Tokens per Sec: 15738, Lr: 0.000210\n", "2019-11-22 23:51:33,518 Epoch 29 Step: 151300 Batch Loss: 1.414077 Tokens per Sec: 15991, Lr: 0.000210\n", "2019-11-22 23:51:47,844 Epoch 29 Step: 151400 Batch Loss: 1.460547 Tokens per Sec: 16554, Lr: 0.000210\n", "2019-11-22 23:52:02,172 Epoch 29 Step: 151500 Batch Loss: 1.639385 Tokens per Sec: 15677, Lr: 0.000210\n", "2019-11-22 23:52:16,060 Epoch 29 Step: 151600 Batch Loss: 1.476301 Tokens per Sec: 16490, Lr: 0.000210\n", "2019-11-22 23:52:30,230 Epoch 29 Step: 151700 Batch Loss: 1.520030 Tokens per Sec: 16607, Lr: 0.000210\n", "2019-11-22 23:52:44,506 Epoch 29 Step: 151800 Batch Loss: 1.520811 Tokens per Sec: 16337, Lr: 0.000210\n", "2019-11-22 23:52:58,608 Epoch 29 Step: 151900 Batch Loss: 1.385747 Tokens per Sec: 16442, Lr: 0.000210\n", "2019-11-22 23:53:12,982 Epoch 29 Step: 152000 Batch Loss: 1.468411 Tokens per Sec: 16378, Lr: 0.000210\n", "2019-11-22 23:53:50,240 Hooray! New best validation result [ppl]!\n", "2019-11-22 23:53:50,240 Saving new checkpoint.\n", "2019-11-22 23:53:50,543 Example #0\n", "2019-11-22 23:53:50,544 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:53:50,544 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:53:50,544 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 23:53:50,544 Example #1\n", "2019-11-22 23:53:50,544 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:53:50,544 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:53:50,544 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:53:50,544 Example #2\n", "2019-11-22 23:53:50,545 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:53:50,545 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:53:50,545 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:53:50,545 Example #3\n", "2019-11-22 23:53:50,545 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:53:50,545 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:53:50,545 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbà gbogbo . ”\n", "2019-11-22 23:53:50,546 Validation result (greedy) at epoch 29, step 152000: bleu: 29.01, loss: 41692.3789, ppl: 4.0435, duration: 37.5635s\n", "2019-11-22 23:54:04,902 Epoch 29 Step: 152100 Batch Loss: 1.555136 Tokens per Sec: 16154, Lr: 0.000210\n", "2019-11-22 23:54:18,957 Epoch 29 Step: 152200 Batch Loss: 1.440344 Tokens per Sec: 16806, Lr: 0.000210\n", "2019-11-22 23:54:33,334 Epoch 29 Step: 152300 Batch Loss: 1.512457 Tokens per Sec: 16314, Lr: 0.000210\n", "2019-11-22 23:54:47,776 Epoch 29 Step: 152400 Batch Loss: 1.239807 Tokens per Sec: 15801, Lr: 0.000210\n", "2019-11-22 23:55:01,701 Epoch 29 Step: 152500 Batch Loss: 1.548917 Tokens per Sec: 16530, Lr: 0.000210\n", "2019-11-22 23:55:16,382 Epoch 29 Step: 152600 Batch Loss: 1.456507 Tokens per Sec: 16067, Lr: 0.000210\n", "2019-11-22 23:55:30,673 Epoch 29 Step: 152700 Batch Loss: 1.590476 Tokens per Sec: 16001, Lr: 0.000210\n", "2019-11-22 23:55:40,993 Epoch 29: total training loss 7978.43\n", "2019-11-22 23:55:40,993 EPOCH 30\n", "2019-11-22 23:55:45,989 Epoch 30 Step: 152800 Batch Loss: 1.447655 Tokens per Sec: 14117, Lr: 0.000210\n", "2019-11-22 23:56:00,432 Epoch 30 Step: 152900 Batch Loss: 1.408246 Tokens per Sec: 15750, Lr: 0.000210\n", "2019-11-22 23:56:15,051 Epoch 30 Step: 153000 Batch Loss: 1.382946 Tokens per Sec: 16068, Lr: 0.000210\n", "2019-11-22 23:56:52,648 Hooray! New best validation result [ppl]!\n", "2019-11-22 23:56:52,648 Saving new checkpoint.\n", "2019-11-22 23:56:52,930 Example #0\n", "2019-11-22 23:56:52,930 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:56:52,930 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:56:52,930 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-22 23:56:52,930 Example #1\n", "2019-11-22 23:56:52,931 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:56:52,931 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:56:52,931 \tHypothesis: Ǹjẹ́ mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:56:52,931 Example #2\n", "2019-11-22 23:56:52,931 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:56:52,931 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:56:52,931 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:56:52,931 Example #3\n", "2019-11-22 23:56:52,932 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:56:52,932 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:56:52,932 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:56:52,932 Validation result (greedy) at epoch 30, step 153000: bleu: 29.11, loss: 41551.1953, ppl: 4.0244, duration: 37.8804s\n", "2019-11-22 23:57:06,972 Epoch 30 Step: 153100 Batch Loss: 1.486815 Tokens per Sec: 16588, Lr: 0.000210\n", "2019-11-22 23:57:21,065 Epoch 30 Step: 153200 Batch Loss: 1.440431 Tokens per Sec: 16313, Lr: 0.000210\n", "2019-11-22 23:57:35,310 Epoch 30 Step: 153300 Batch Loss: 1.360119 Tokens per Sec: 16209, Lr: 0.000210\n", "2019-11-22 23:57:49,822 Epoch 30 Step: 153400 Batch Loss: 1.501901 Tokens per Sec: 15828, Lr: 0.000210\n", "2019-11-22 23:58:04,173 Epoch 30 Step: 153500 Batch Loss: 1.570280 Tokens per Sec: 16174, Lr: 0.000210\n", "2019-11-22 23:58:18,505 Epoch 30 Step: 153600 Batch Loss: 1.444445 Tokens per Sec: 16656, Lr: 0.000210\n", "2019-11-22 23:58:32,877 Epoch 30 Step: 153700 Batch Loss: 1.379108 Tokens per Sec: 16097, Lr: 0.000210\n", "2019-11-22 23:58:47,365 Epoch 30 Step: 153800 Batch Loss: 1.492330 Tokens per Sec: 16132, Lr: 0.000210\n", "2019-11-22 23:59:01,672 Epoch 30 Step: 153900 Batch Loss: 1.403965 Tokens per Sec: 16168, Lr: 0.000210\n", "2019-11-22 23:59:15,810 Epoch 30 Step: 154000 Batch Loss: 1.517142 Tokens per Sec: 16399, Lr: 0.000210\n", "2019-11-22 23:59:52,856 Example #0\n", "2019-11-22 23:59:52,856 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-22 23:59:52,856 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-22 23:59:52,856 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-22 23:59:52,857 Example #1\n", "2019-11-22 23:59:52,857 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-22 23:59:52,857 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-22 23:59:52,857 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-22 23:59:52,857 Example #2\n", "2019-11-22 23:59:52,857 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-22 23:59:52,857 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-22 23:59:52,857 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì nírìírí ju bó o ṣe ń rìn jìnnà tó , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-22 23:59:52,858 Example #3\n", "2019-11-22 23:59:52,858 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-22 23:59:52,858 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-22 23:59:52,858 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Hébérù àti Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-22 23:59:52,858 Validation result (greedy) at epoch 30, step 154000: bleu: 29.22, loss: 41562.2422, ppl: 4.0259, duration: 37.0482s\n", "2019-11-23 00:00:06,918 Epoch 30 Step: 154100 Batch Loss: 1.525992 Tokens per Sec: 16666, Lr: 0.000210\n", "2019-11-23 00:00:20,825 Epoch 30 Step: 154200 Batch Loss: 1.669695 Tokens per Sec: 17048, Lr: 0.000210\n", "2019-11-23 00:00:34,963 Epoch 30 Step: 154300 Batch Loss: 1.528432 Tokens per Sec: 16512, Lr: 0.000210\n", "2019-11-23 00:00:49,025 Epoch 30 Step: 154400 Batch Loss: 1.516881 Tokens per Sec: 15935, Lr: 0.000210\n", "2019-11-23 00:01:02,956 Epoch 30 Step: 154500 Batch Loss: 1.317040 Tokens per Sec: 16902, Lr: 0.000210\n", "2019-11-23 00:01:16,915 Epoch 30 Step: 154600 Batch Loss: 1.547061 Tokens per Sec: 16418, Lr: 0.000210\n", "2019-11-23 00:01:31,445 Epoch 30 Step: 154700 Batch Loss: 1.491301 Tokens per Sec: 16118, Lr: 0.000210\n", "2019-11-23 00:01:45,974 Epoch 30 Step: 154800 Batch Loss: 1.528856 Tokens per Sec: 15919, Lr: 0.000210\n", "2019-11-23 00:02:00,250 Epoch 30 Step: 154900 Batch Loss: 1.538177 Tokens per Sec: 16034, Lr: 0.000210\n", "2019-11-23 00:02:14,536 Epoch 30 Step: 155000 Batch Loss: 1.467259 Tokens per Sec: 16068, Lr: 0.000210\n", "2019-11-23 00:02:51,453 Example #0\n", "2019-11-23 00:02:51,453 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-23 00:02:51,453 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-23 00:02:51,453 \tHypothesis: Ní báyìí , mo ní láti wá ibi tí wọ́n ti ń ṣiṣẹ́ .\n", "2019-11-23 00:02:51,453 Example #1\n", "2019-11-23 00:02:51,454 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-23 00:02:51,454 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-23 00:02:51,454 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-23 00:02:51,454 Example #2\n", "2019-11-23 00:02:51,454 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-23 00:02:51,454 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-23 00:02:51,454 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju ìwọ lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-23 00:02:51,455 Example #3\n", "2019-11-23 00:02:51,455 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-23 00:02:51,455 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-23 00:02:51,455 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hébérù àti Chaldee Dictionary ṣe sọ , ẹ̀mí ìfara - ẹni - rúbọ túmọ̀ sí “ ìfaradà , ìdúró títí láé , títí láé . ”\n", "2019-11-23 00:02:51,455 Validation result (greedy) at epoch 30, step 155000: bleu: 28.74, loss: 41553.9570, ppl: 4.0248, duration: 36.9185s\n", "2019-11-23 00:03:05,646 Epoch 30 Step: 155100 Batch Loss: 1.498846 Tokens per Sec: 16375, Lr: 0.000210\n", "2019-11-23 00:03:19,823 Epoch 30 Step: 155200 Batch Loss: 1.565410 Tokens per Sec: 16355, Lr: 0.000210\n", "2019-11-23 00:03:33,606 Epoch 30 Step: 155300 Batch Loss: 1.491219 Tokens per Sec: 16238, Lr: 0.000210\n", "2019-11-23 00:03:47,574 Epoch 30 Step: 155400 Batch Loss: 1.471962 Tokens per Sec: 16201, Lr: 0.000210\n", "2019-11-23 00:04:01,755 Epoch 30 Step: 155500 Batch Loss: 1.461966 Tokens per Sec: 16277, Lr: 0.000210\n", "2019-11-23 00:04:15,868 Epoch 30 Step: 155600 Batch Loss: 1.558781 Tokens per Sec: 16365, Lr: 0.000210\n", "2019-11-23 00:04:29,929 Epoch 30 Step: 155700 Batch Loss: 1.357789 Tokens per Sec: 16268, Lr: 0.000210\n", "2019-11-23 00:04:44,024 Epoch 30 Step: 155800 Batch Loss: 1.484366 Tokens per Sec: 16716, Lr: 0.000210\n", "2019-11-23 00:04:57,991 Epoch 30 Step: 155900 Batch Loss: 1.587483 Tokens per Sec: 16769, Lr: 0.000210\n", "2019-11-23 00:05:12,138 Epoch 30 Step: 156000 Batch Loss: 1.476411 Tokens per Sec: 15941, Lr: 0.000210\n", "2019-11-23 00:05:49,270 Hooray! New best validation result [ppl]!\n", "2019-11-23 00:05:49,270 Saving new checkpoint.\n", "2019-11-23 00:05:49,546 Example #0\n", "2019-11-23 00:05:49,546 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-23 00:05:49,546 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-23 00:05:49,547 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-23 00:05:49,547 Example #1\n", "2019-11-23 00:05:49,547 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-23 00:05:49,547 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-23 00:05:49,547 \tHypothesis: Ṣé ohun ìní tara tí mo ní kò ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-23 00:05:49,547 Example #2\n", "2019-11-23 00:05:49,547 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-23 00:05:49,547 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-23 00:05:49,547 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju èyí tí o ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-23 00:05:49,548 Example #3\n", "2019-11-23 00:05:49,548 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-23 00:05:49,548 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-23 00:05:49,548 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Students of Hebrew and Chaldee Dictionary ṣe sọ , ẹ̀mí ìfara - ẹni - rúbọ túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , títí láé . ”\n", "2019-11-23 00:05:49,548 Validation result (greedy) at epoch 30, step 156000: bleu: 28.77, loss: 41520.2891, ppl: 4.0202, duration: 37.4095s\n", "2019-11-23 00:06:04,001 Epoch 30 Step: 156100 Batch Loss: 1.487775 Tokens per Sec: 15889, Lr: 0.000210\n", "2019-11-23 00:06:18,670 Epoch 30 Step: 156200 Batch Loss: 1.542108 Tokens per Sec: 15919, Lr: 0.000210\n", "2019-11-23 00:06:32,594 Epoch 30 Step: 156300 Batch Loss: 1.463306 Tokens per Sec: 16795, Lr: 0.000210\n", "2019-11-23 00:06:46,503 Epoch 30 Step: 156400 Batch Loss: 1.352501 Tokens per Sec: 16271, Lr: 0.000210\n", "2019-11-23 00:07:00,779 Epoch 30 Step: 156500 Batch Loss: 1.512884 Tokens per Sec: 16174, Lr: 0.000210\n", "2019-11-23 00:07:14,799 Epoch 30 Step: 156600 Batch Loss: 1.517406 Tokens per Sec: 16373, Lr: 0.000210\n", "2019-11-23 00:07:28,908 Epoch 30 Step: 156700 Batch Loss: 1.499792 Tokens per Sec: 16751, Lr: 0.000210\n", "2019-11-23 00:07:42,945 Epoch 30 Step: 156800 Batch Loss: 1.566260 Tokens per Sec: 16554, Lr: 0.000210\n", "2019-11-23 00:07:57,484 Epoch 30 Step: 156900 Batch Loss: 1.537557 Tokens per Sec: 16469, Lr: 0.000210\n", "2019-11-23 00:08:11,524 Epoch 30 Step: 157000 Batch Loss: 1.480180 Tokens per Sec: 16917, Lr: 0.000210\n", "2019-11-23 00:08:49,441 Hooray! New best validation result [ppl]!\n", "2019-11-23 00:08:49,441 Saving new checkpoint.\n", "2019-11-23 00:08:49,732 Example #0\n", "2019-11-23 00:08:49,733 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-23 00:08:49,733 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-23 00:08:49,733 \tHypothesis: Ní báyìí , mo ti wá rí i pé iṣẹ́ tó dára gan - an ni .\n", "2019-11-23 00:08:49,733 Example #1\n", "2019-11-23 00:08:49,733 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-23 00:08:49,733 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-23 00:08:49,733 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-23 00:08:49,733 Example #2\n", "2019-11-23 00:08:49,734 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-23 00:08:49,734 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-23 00:08:49,734 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe lọ , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-23 00:08:49,734 Example #3\n", "2019-11-23 00:08:49,734 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-23 00:08:49,734 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-23 00:08:49,734 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Stud’s Students of Hebrew and Chaldee Dictionary ṣe sọ , Hédíìsì túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbà kan rí . ”\n", "2019-11-23 00:08:49,735 Validation result (greedy) at epoch 30, step 157000: bleu: 29.26, loss: 41392.8789, ppl: 4.0031, duration: 38.2107s\n", "2019-11-23 00:09:03,980 Epoch 30 Step: 157100 Batch Loss: 1.537297 Tokens per Sec: 15957, Lr: 0.000210\n", "2019-11-23 00:09:18,473 Epoch 30 Step: 157200 Batch Loss: 1.694021 Tokens per Sec: 15384, Lr: 0.000210\n", "2019-11-23 00:09:32,636 Epoch 30 Step: 157300 Batch Loss: 1.501680 Tokens per Sec: 16087, Lr: 0.000210\n", "2019-11-23 00:09:46,987 Epoch 30 Step: 157400 Batch Loss: 1.337631 Tokens per Sec: 16258, Lr: 0.000210\n", "2019-11-23 00:10:01,083 Epoch 30 Step: 157500 Batch Loss: 1.457002 Tokens per Sec: 16806, Lr: 0.000210\n", "2019-11-23 00:10:15,428 Epoch 30 Step: 157600 Batch Loss: 1.532916 Tokens per Sec: 16280, Lr: 0.000210\n", "2019-11-23 00:10:29,463 Epoch 30 Step: 157700 Batch Loss: 1.522864 Tokens per Sec: 16358, Lr: 0.000210\n", "2019-11-23 00:10:43,799 Epoch 30 Step: 157800 Batch Loss: 1.660474 Tokens per Sec: 15928, Lr: 0.000210\n", "2019-11-23 00:10:58,265 Epoch 30 Step: 157900 Batch Loss: 1.525949 Tokens per Sec: 16084, Lr: 0.000210\n", "2019-11-23 00:11:12,491 Epoch 30 Step: 158000 Batch Loss: 1.545663 Tokens per Sec: 16066, Lr: 0.000210\n", "2019-11-23 00:11:50,169 Example #0\n", "2019-11-23 00:11:50,169 \tSource: Now I had to find a legitimate line of work .\n", "2019-11-23 00:11:50,169 \tReference: Torí náà , mo ní láti wá iṣẹ́ gidi .\n", "2019-11-23 00:11:50,169 \tHypothesis: Ní báyìí , mo ní láti wá iṣẹ́ tó dára gan - an .\n", "2019-11-23 00:11:50,169 Example #1\n", "2019-11-23 00:11:50,170 \tSource: Do I value material things more than my relationship with Jehovah and with people ?\n", "2019-11-23 00:11:50,170 \tReference: Ṣé àwọn nǹkan tara ló jẹ mí lógún jù àbí àjọṣe mi pẹ̀lú Jèhófà àtàwọn èèyàn ?\n", "2019-11-23 00:11:50,170 \tHypothesis: Ṣé mo mọyì àwọn nǹkan tara ju àjọṣe mi pẹ̀lú Jèhófà àti pẹ̀lú àwọn èèyàn lọ ?\n", "2019-11-23 00:11:50,170 Example #2\n", "2019-11-23 00:11:50,170 \tSource: He has far more experience and stamina than you do , but he patiently walks near you .\n", "2019-11-23 00:11:50,170 \tReference: Ẹni tẹ́ ẹ jọ ń lọ yìí mọ ọ̀nà yẹn dáadáa .\n", "2019-11-23 00:11:50,170 \tHypothesis: Ó ní ìrírí tó pọ̀ gan - an , ó sì ní ìrírí tó pọ̀ ju bó o ṣe ń ṣe , àmọ́ ó fi sùúrù rìn nítòsí rẹ .\n", "2019-11-23 00:11:50,170 Example #3\n", "2019-11-23 00:11:50,171 \tSource: According to Harkavy’s Students ’ Hebrew and Chaldee Dictionary , ʽadh means “ duration , everlastingness , eternity , for ever . ”\n", "2019-11-23 00:11:50,171 \tReference: Gẹ́gẹ́ bí Harkavy’s Students ’ Hebrew and Chaldee Dictionary ṣe sọ , ʽadh túmọ̀ sí “ àkókò gígùn , àìnípẹ̀kun , títí gbére , títí láé . ”\n", "2019-11-23 00:11:50,171 \tHypothesis: Gẹ́gẹ́ bí ìwé atúmọ̀ èdè Harkavy’s Stud’s Stud’s Stud’s , Chaldee Dictionary , tó túmọ̀ sí “ ìfaradà , ìfaradà , títí láé , fún ìgbà kan rí . ”\n", "2019-11-23 00:11:50,171 Validation result (greedy) at epoch 30, step 158000: bleu: 29.49, loss: 41444.3828, ppl: 4.0100, duration: 37.6794s\n", "2019-11-23 00:11:54,970 Epoch 30: total training loss 7915.69\n", "2019-11-23 00:11:54,971 Training ended after 30 epochs.\n", "2019-11-23 00:11:54,971 Best validation result (greedy) at step 157000: 4.00 ppl.\n", "2019-11-23 00:12:35,522 dev bleu: 29.69 [Beam search decoding with beam size = 5 and alpha = 1.0]\n", "2019-11-23 00:12:35,523 Translations saved to: models/enyo_transformer/00157000.hyps.dev\n", "2019-11-23 00:13:28,912 test bleu: 37.26 [Beam search decoding with beam size = 5 and alpha = 1.0]\n", "2019-11-23 00:13:28,915 Translations saved to: models/enyo_transformer/00157000.hyps.test\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "MBoDS09JM807", "outputId": "5731894a-d855-4b7f-d5a2-59917f42e00f", "colab": { "base_uri": "https://localhost:8080/", "height": 55 } }, "source": [ "# Copy the created models from the notebook storage to google drive for persistant storage \n", "!mkdir -p \"$gdrive_path/models/${src}${tgt}_transformer/\" # Herman\n", "!cp -r joeynmt/models/${src}${tgt}_transformer/* \"$gdrive_path/models/${src}${tgt}_transformer/\"" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "cp: cannot create symbolic link '/content/drive/My Drive/masakhane/en-yo-baseline/models/enyo_transformer/best.ckpt': Function not implemented\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "n94wlrCjVc17", "outputId": "476c336f-15ba-4e79-808f-279ed6dd4551", "colab": { "base_uri": "https://localhost:8080/", "height": 55 } }, "source": [ "# Output our validation accuracy\n", "! cat \"$gdrive_path/models/${src}${tgt}_transformer/validations.txt\"" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "cat: '/content/drive/My Drive/masakhane/en-yo-baseline/models/enyo_transformer/validations.txt': No such file or directory\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "66WhRE9lIhoD", "outputId": "0ed5a693-75ea-48d8-9e27-dd2a6fd6ab30", "colab": { "base_uri": "https://localhost:8080/", "height": 72 } }, "source": [ "# Test our model\n", "! cd joeynmt; python3 -m joeynmt test \"$gdrive_path/models/${src}${tgt}_transformer/config.yaml\"" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "2019-11-23 00:23:37,906 Hello! This is Joey-NMT.\n", "2019-11-23 00:24:22,545 dev bleu: 29.69 [Beam search decoding with beam size = 5 and alpha = 1.0]\n", "2019-11-23 00:25:16,705 test bleu: 37.26 [Beam search decoding with beam size = 5 and alpha = 1.0]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "KzJtuvwCOl4H", "colab_type": "text" }, "source": [ "#*Tensorboard*\n", "JoeyNMT TensorboardX to visualize training and validation curves and attention matrices during training" ] }, { "cell_type": "code", "metadata": { "id": "eoBJrURfqWFP", "colab_type": "code", "outputId": "b10de1e0-ccdb-47b7-bba4-650f195b187a", "colab": { "base_uri": "https://localhost:8080/", "height": 35 } }, "source": [ "# Restart runtime using 'Runtime' -> 'Restart runtime...'\n", "%tensorflow_version 1.x\n", "import tensorflow as tf\n", "print(tf.__version__)" ], "execution_count": 4, "outputs": [ { "output_type": "stream", "text": [ "1.15.0\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "N4Z8QObHNUhi", "colab_type": "code", "colab": {} }, "source": [ "%load_ext tensorboard" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "FX0-6G05Osnl", "colab_type": "code", "outputId": "9088e94f-81d7-4df5-bdd9-a43b9fbf856c", "colab": { "resources": { "http://localhost:6006/": { "data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cjx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CjxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FNQUFBRDNlSDVaQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFGelVrZENBSzdPSE9rQUFBRC9VRXhVUmZGbEtmYUVMdkZtS2ZOeUsvNjdOdldBTGY2OE52NjlOdk54Sy8yME5meXlOUDIyTmZOMEsvSnJLdnFoTXYyek5mMjVOZjI0TmYyM05mZU9ML3l6TlB5dk5QSm9LdmlXTVBtZU1mTjFLL1dCTGZlUEwvRm5LZmVNTC9xbE12UjdMUG1jTWZlTEwvYUpMdlI1TFBGb0tmSnVLdlIzTFA2Nk52eXdOUGVOTC9WL0xmYUlMdjIxTmYyNk5mTnpLL052Sy9SNkxQbWFNZnl4TlBxZk12VitMZnVyTS9pU01QbWJNZkp2S3ZtZE1mdW1NL3FpTXZtWk1meXROUEpxS3Z5c05QTjJLL2lZTVBOd0svdXBNL0p0S3ZKc0t2aVZNUGFITHZhR0x2SnBLdlI4TFBhS0x2cWtNdnVxTS9hRkx2UjRMUHVvTS9pVE1QV0RMZmlSTVBtWU1YUzBuZ2tBQUFMb1NVUkJWSGphN2RybmN0cEFGSWJoRlVJU1NLSjNNS1lhMCt5NHhUVzk5MzcvMTVKa0pobFRqaHJTckhSbXZ1Zi9hczZMMFlMRkNnRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CSjZuamVucXNwemduUHJzckdYOVpwaTJ0Q3JtbmM2K2RZTnRoVlk1V3BNbXhRTFdQZE1zT3VZVnd6TmozZWkydDNtUXdhVjQzQkpQRENTMk5iSjVhRWV1WC8rOXFjalFPdGZGSWtJa3J2WTJnNE1WY21PQnNGV2Jvd0tPL2tOeWo2MmdScEpjRGFQQmx4THIxQjB6ZEcwQy84THpiSmlKcnNodXZ5MWd6bEE5K3JEOG1Ja3V5SUpqRkUzL2Rxbll3b1NtN0lVRVBvRC93dXQ4aUlndVNJRGpsRnhlL3lmWEw1dnVTSTIxQlRaTExoWG9PSUxNTzhIeHdhL0w4YkkwTGZtVWRoR293YjJadlQwZTU3cEZORGdCMDZJbFZ5am1tSUJsMlQvbmw5Unc2U0Q5R2dTRy9RMHVRa2FXM1hobW92S1EzZUZRNE4yVW85T1ExZUZac05lcmY3dlArck80cmhtWTFMZzN2RlZvUDgrOEJYZzFzRm53Ym5DazROVGhXOEd1aUtCRGRrVlZ0VE5Gdk5lbFZzTnFUYnlXbklPTTJvZVRSb3lXdndtcEpIZy91Y1hCcmNKdVhUNER3cnB3WmkydnkwVkN4OFl0WGcvRDJiVTRPZml1UTNlRmZFMktENGJmQ3FpTE5COTkzZ1hzR2x3YTJDVDROekJhY0dJVlE2WXNpcFFkaDB4RWRPRFVLakl4clNwODhvblo4emJiRkxnMURvaUZPNUJYdkRHdjJNeTkvSmhVVDhKVVpUSTB5RGFOSExCeklidnFURE5ZaFVpVncva2RqUTFrTTJDSEZEUGpLVytLenlSVEYwZy9nYTl3OXkrZkFOUXB4dlg4Q1UrTnk3RlVXRGVGM1krZzNsUk9JZjRrMFVEWDllQ3l2TzUzMVB5WWhIZ2E5enZQWkpVNWI3M1kvZVhqOEh2OUQ0OG42SGFGNUxiY2pSdDhUWlR0ZGE1TTFEZlhuYmtYMUMwU0hDRkt6UUI1RmU4b3A0R05HTkhhdnZaRVNiVndUNXI2VzF4eXVDUEJZM1k5WWdEcXprbkgvZTNZZk56enVMMzBsMEllYnJaNWtLdHVESVh0MW44NjhFVDZrZjMvNDl0THZyQ2NaeUY4UHUyMTVkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFjUEliTnJCaE9hQlh1Y29BQUFBQVNVVk9SSzVDWUlJPSI+CjxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FNQUFBRDNlSDVaQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFGelVrZENBSzdPSE9rQUFBRC9VRXhVUmZGbEtmYUVMdkZtS2ZOeUsvNjdOdldBTGY2OE52NjlOdk54Sy8yME5meXlOUDIyTmZOMEsvSnJLdnFoTXYyek5mMjVOZjI0TmYyM05mZU9ML3l6TlB5dk5QSm9LdmlXTVBtZU1mTjFLL1dCTGZlUEwvRm5LZmVNTC9xbE12UjdMUG1jTWZlTEwvYUpMdlI1TFBGb0tmSnVLdlIzTFA2Nk52eXdOUGVOTC9WL0xmYUlMdjIxTmYyNk5mTnpLL052Sy9SNkxQbWFNZnl4TlBxZk12VitMZnVyTS9pU01QbWJNZkp2S3ZtZE1mdW1NL3FpTXZtWk1meXROUEpxS3Z5c05QTjJLL2lZTVBOd0svdXBNL0p0S3ZKc0t2aVZNUGFITHZhR0x2SnBLdlI4TFBhS0x2cWtNdnVxTS9hRkx2UjRMUHVvTS9pVE1QV0RMZmlSTVBtWU1YUzBuZ2tBQUFMb1NVUkJWSGphN2RybmN0cEFGSWJoRlVJU1NLSjNNS1lhMCt5NHhUVzk5MzcvMTVKa0pobFRqaHJTckhSbXZ1Zi9hczZMMFlMRkNnRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CSjZuamVucXNwemduUHJzckdYOVpwaTJ0Q3JtbmM2K2RZTnRoVlk1V3BNbXhRTFdQZE1zT3VZVnd6TmozZWkydDNtUXdhVjQzQkpQRENTMk5iSjVhRWV1WC8rOXFjalFPdGZGSWtJa3J2WTJnNE1WY21PQnNGV2Jvd0tPL2tOeWo2MmdScEpjRGFQQmx4THIxQjB6ZEcwQy84THpiSmlKcnNodXZ5MWd6bEE5K3JEOG1Ja3V5SUpqRkUzL2Rxbll3b1NtN0lVRVBvRC93dXQ4aUlndVNJRGpsRnhlL3lmWEw1dnVTSTIxQlRaTExoWG9PSUxNTzhIeHdhL0w4YkkwTGZtVWRoR293YjJadlQwZTU3cEZORGdCMDZJbFZ5am1tSUJsMlQvbmw5Unc2U0Q5R2dTRy9RMHVRa2FXM1hobW92S1EzZUZRNE4yVW85T1ExZUZac05lcmY3dlArck80cmhtWTFMZzN2RlZvUDgrOEJYZzFzRm53Ym5DazROVGhXOEd1aUtCRGRrVlZ0VE5Gdk5lbFZzTnFUYnlXbklPTTJvZVRSb3lXdndtcEpIZy91Y1hCcmNKdVhUNER3cnB3WmkydnkwVkN4OFl0WGcvRDJiVTRPZml1UTNlRmZFMktENGJmQ3FpTE5COTkzZ1hzR2x3YTJDVDROekJhY0dJVlE2WXNpcFFkaDB4RWRPRFVLakl4clNwODhvblo4emJiRkxnMURvaUZPNUJYdkRHdjJNeTkvSmhVVDhKVVpUSTB5RGFOSExCeklidnFURE5ZaFVpVncva2RqUTFrTTJDSEZEUGpLVytLenlSVEYwZy9nYTl3OXkrZkFOUXB4dlg4Q1UrTnk3RlVXRGVGM1krZzNsUk9JZjRrMFVEWDllQ3l2TzUzMVB5WWhIZ2E5enZQWkpVNWI3M1kvZVhqOEh2OUQ0OG42SGFGNUxiY2pSdDhUWlR0ZGE1TTFEZlhuYmtYMUMwU0hDRkt6UUI1RmU4b3A0R05HTkhhdnZaRVNiVndUNXI2VzF4eXVDUEJZM1k5WWdEcXprbkgvZTNZZk56enVMMzBsMEllYnJaNWtLdHVESVh0MW44NjhFVDZrZjMvNDl0THZyQ2NaeUY4UHUyMTVkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFjUEliTnJCaE9hQlh1Y29BQUFBQVNVVk9SSzVDWUlJPSI+CjxzY3JpcHQ+Ly8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgohZnVuY3Rpb24oYSxiKXt2YXIgYz17fSxkPXt9LGU9e30sZj1udWxsOyFmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBhO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109YVtjXTtyZXR1cm4gYn1mdW5jdGlvbiBkKCl7dGhpcy5fZGVsYXk9MCx0aGlzLl9lbmREZWxheT0wLHRoaXMuX2ZpbGw9Im5vbmUiLHRoaXMuX2l0ZXJhdGlvblN0YXJ0PTAsdGhpcy5faXRlcmF0aW9ucz0xLHRoaXMuX2R1cmF0aW9uPTAsdGhpcy5fcGxheWJhY2tSYXRlPTEsdGhpcy5fZGlyZWN0aW9uPSJub3JtYWwiLHRoaXMuX2Vhc2luZz0ibGluZWFyIix0aGlzLl9lYXNpbmdGdW5jdGlvbj13fWZ1bmN0aW9uIGUoKXtyZXR1cm4gYS5pc0RlcHJlY2F0ZWQoIkludmFsaWQgdGltaW5nIGlucHV0cyIsIjIwMTYtMDMtMDIiLCJUeXBlRXJyb3IgZXhjZXB0aW9ucyB3aWxsIGJlIHRocm93biBpbnN0ZWFkLiIsITApfWZ1bmN0aW9uIGYoYixjLGUpe3ZhciBmPW5ldyBkO3JldHVybiBjJiYoZi5maWxsPSJib3RoIixmLmR1cmF0aW9uPSJhdXRvIiksIm51bWJlciIhPXR5cGVvZiBifHxpc05hTihiKT92b2lkIDAhPT1iJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2lmKCJhdXRvIiE9YltjXSl7aWYoKCJudW1iZXIiPT10eXBlb2YgZltjXXx8ImR1cmF0aW9uIj09YykmJigibnVtYmVyIiE9dHlwZW9mIGJbY118fGlzTmFOKGJbY10pKSlyZXR1cm47aWYoImZpbGwiPT1jJiYtMT09dS5pbmRleE9mKGJbY10pKXJldHVybjtpZigiZGlyZWN0aW9uIj09YyYmLTE9PXYuaW5kZXhPZihiW2NdKSlyZXR1cm47aWYoInBsYXliYWNrUmF0ZSI9PWMmJjEhPT1iW2NdJiZhLmlzRGVwcmVjYXRlZCgiQW5pbWF0aW9uRWZmZWN0VGltaW5nLnBsYXliYWNrUmF0ZSIsIjIwMTQtMTEtMjgiLCJVc2UgQW5pbWF0aW9uLnBsYXliYWNrUmF0ZSBpbnN0ZWFkLiIpKXJldHVybjtmW2NdPWJbY119fSk6Zi5kdXJhdGlvbj1iLGZ9ZnVuY3Rpb24gZyhhKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGEmJihhPWlzTmFOKGEpP3tkdXJhdGlvbjowfTp7ZHVyYXRpb246YX0pLGF9ZnVuY3Rpb24gaChiLGMpe3JldHVybiBiPWEubnVtZXJpY1RpbWluZ1RvT2JqZWN0KGIpLGYoYixjKX1mdW5jdGlvbiBpKGEsYixjLGQpe3JldHVybiAwPmF8fGE+MXx8MD5jfHxjPjE/dzpmdW5jdGlvbihlKXtmdW5jdGlvbiBmKGEsYixjKXtyZXR1cm4gMyphKigxLWMpKigxLWMpKmMrMypiKigxLWMpKmMqYytjKmMqY31pZigwPT1lfHwxPT1lKXJldHVybiBlO2Zvcih2YXIgZz0wLGg9MTs7KXt2YXIgaT0oZytoKS8yLGo9ZihhLGMsaSk7aWYoTWF0aC5hYnMoZS1qKTwxZS00KXJldHVybiBmKGIsZCxpKTtlPmo/Zz1pOmg9aX19fWZ1bmN0aW9uIGooYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYz49MSlyZXR1cm4gMTt2YXIgZD0xL2E7cmV0dXJuIGMrPWIqZCxjLWMlZH19ZnVuY3Rpb24gayhhKXtCfHwoQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSksQi5hbmltYXRpb25UaW1pbmdGdW5jdGlvbj0iIixCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPWE7dmFyIGI9Qi5hbmltYXRpb25UaW1pbmdGdW5jdGlvbjtpZigiIj09YiYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoYSsiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciBlYXNpbmciKTt2YXIgYz1ELmV4ZWMoYik7aWYoYylyZXR1cm4gaS5hcHBseSh0aGlzLGMuc2xpY2UoMSkubWFwKE51bWJlcikpO3ZhciBkPUUuZXhlYyhiKTtpZihkKXJldHVybiBqKE51bWJlcihkWzFdKSx7c3RhcnQ6eCxtaWRkbGU6eSxlbmQ6en1bZFsyXV0pO3ZhciBmPUFbYl07cmV0dXJuIGY/Zjp3fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIE1hdGguYWJzKG0oYSkvYS5wbGF5YmFja1JhdGUpfWZ1bmN0aW9uIG0oYSl7cmV0dXJuIGEuZHVyYXRpb24qYS5pdGVyYXRpb25zfWZ1bmN0aW9uIG4oYSxiLGMpe3JldHVybiBudWxsPT1iP0Y6YjxjLmRlbGF5P0c6Yj49Yy5kZWxheSthP0g6SX1mdW5jdGlvbiBvKGEsYixjLGQsZSl7c3dpdGNoKGQpe2Nhc2UgRzpyZXR1cm4iYmFja3dhcmRzIj09Ynx8ImJvdGgiPT1iPzA6bnVsbDtjYXNlIEk6cmV0dXJuIGMtZTtjYXNlIEg6cmV0dXJuImZvcndhcmRzIj09Ynx8ImJvdGgiPT1iP2E6bnVsbDtjYXNlIEY6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHAoYSxiLGMsZCl7cmV0dXJuKGQucGxheWJhY2tSYXRlPDA/Yi1hOmIpKmQucGxheWJhY2tSYXRlK2N9ZnVuY3Rpb24gcShhLGIsYyxkLGUpe3JldHVybiBjPT09MS8wfHxjPT09LSgxLzApfHxjLWQ9PWImJmUuaXRlcmF0aW9ucyYmKGUuaXRlcmF0aW9ucytlLml0ZXJhdGlvblN0YXJ0KSUxPT0wP2E6YyVhfWZ1bmN0aW9uIHIoYSxiLGMsZCl7cmV0dXJuIDA9PT1jPzA6Yj09YT9kLml0ZXJhdGlvblN0YXJ0K2QuaXRlcmF0aW9ucy0xOk1hdGguZmxvb3IoYy9hKX1mdW5jdGlvbiBzKGEsYixjLGQpe3ZhciBlPWElMj49MSxmPSJub3JtYWwiPT1kLmRpcmVjdGlvbnx8ZC5kaXJlY3Rpb249PShlPyJhbHRlcm5hdGUtcmV2ZXJzZSI6ImFsdGVybmF0ZSIpLGc9Zj9jOmItYyxoPWcvYjtyZXR1cm4gYipkLl9lYXNpbmdGdW5jdGlvbihoKX1mdW5jdGlvbiB0KGEsYixjKXt2YXIgZD1uKGEsYixjKSxlPW8oYSxjLmZpbGwsYixkLGMuZGVsYXkpO2lmKG51bGw9PT1lKXJldHVybiBudWxsO2lmKDA9PT1hKXJldHVybiBkPT09Rz8wOjE7dmFyIGY9Yy5pdGVyYXRpb25TdGFydCpjLmR1cmF0aW9uLGc9cChhLGUsZixjKSxoPXEoYy5kdXJhdGlvbixtKGMpLGcsZixjKSxpPXIoYy5kdXJhdGlvbixoLGcsYyk7cmV0dXJuIHMoaSxjLmR1cmF0aW9uLGgsYykvYy5kdXJhdGlvbn12YXIgdT0iYmFja3dhcmRzfGZvcndhcmRzfGJvdGh8bm9uZSIuc3BsaXQoInwiKSx2PSJyZXZlcnNlfGFsdGVybmF0ZXxhbHRlcm5hdGUtcmV2ZXJzZSIuc3BsaXQoInwiKSx3PWZ1bmN0aW9uKGEpe3JldHVybiBhfTtkLnByb3RvdHlwZT17X3NldE1lbWJlcjpmdW5jdGlvbihiLGMpe3RoaXNbIl8iK2JdPWMsdGhpcy5fZWZmZWN0JiYodGhpcy5fZWZmZWN0Ll90aW1pbmdJbnB1dFtiXT1jLHRoaXMuX2VmZmVjdC5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQodGhpcy5fZWZmZWN0Ll90aW1pbmdJbnB1dCksdGhpcy5fZWZmZWN0LmFjdGl2ZUR1cmF0aW9uPWEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24odGhpcy5fZWZmZWN0Ll90aW1pbmcpLHRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uJiZ0aGlzLl9lZmZlY3QuX2FuaW1hdGlvbi5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSl9LGdldCBwbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5fcGxheWJhY2tSYXRlfSxzZXQgZGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJkZWxheSIsYSl9LGdldCBkZWxheSgpe3JldHVybiB0aGlzLl9kZWxheX0sc2V0IGVuZERlbGF5KGEpe3RoaXMuX3NldE1lbWJlcigiZW5kRGVsYXkiLGEpfSxnZXQgZW5kRGVsYXkoKXtyZXR1cm4gdGhpcy5fZW5kRGVsYXl9LHNldCBmaWxsKGEpe3RoaXMuX3NldE1lbWJlcigiZmlsbCIsYSl9LGdldCBmaWxsKCl7cmV0dXJuIHRoaXMuX2ZpbGx9LHNldCBpdGVyYXRpb25TdGFydChhKXtpZigoaXNOYU4oYSl8fDA+YSkmJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpdGVyYXRpb25TdGFydCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgcmVjZWl2ZWQ6ICIrdGltaW5nLml0ZXJhdGlvblN0YXJ0KTt0aGlzLl9zZXRNZW1iZXIoIml0ZXJhdGlvblN0YXJ0IixhKX0sZ2V0IGl0ZXJhdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvblN0YXJ0fSxzZXQgZHVyYXRpb24oYSl7aWYoImF1dG8iIT1hJiYoaXNOYU4oYSl8fDA+YSkmJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkdXJhdGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBvciBhdXRvLCByZWNlaXZlZDogIithKTt0aGlzLl9zZXRNZW1iZXIoImR1cmF0aW9uIixhKX0sZ2V0IGR1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2R1cmF0aW9ufSxzZXQgZGlyZWN0aW9uKGEpe3RoaXMuX3NldE1lbWJlcigiZGlyZWN0aW9uIixhKX0sZ2V0IGRpcmVjdGlvbigpe3JldHVybiB0aGlzLl9kaXJlY3Rpb259LHNldCBlYXNpbmcoYSl7dGhpcy5fZWFzaW5nRnVuY3Rpb249ayhhKSx0aGlzLl9zZXRNZW1iZXIoImVhc2luZyIsYSl9LGdldCBlYXNpbmcoKXtyZXR1cm4gdGhpcy5fZWFzaW5nfSxzZXQgaXRlcmF0aW9ucyhhKXtpZigoaXNOYU4oYSl8fDA+YSkmJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpdGVyYXRpb25zIG11c3QgYmUgbm9uLW5lZ2F0aXZlLCByZWNlaXZlZDogIithKTt0aGlzLl9zZXRNZW1iZXIoIml0ZXJhdGlvbnMiLGEpfSxnZXQgaXRlcmF0aW9ucygpe3JldHVybiB0aGlzLl9pdGVyYXRpb25zfX07dmFyIHg9MSx5PS41LHo9MCxBPXtlYXNlOmkoLjI1LC4xLC4yNSwxKSwiZWFzZS1pbiI6aSguNDIsMCwxLDEpLCJlYXNlLW91dCI6aSgwLDAsLjU4LDEpLCJlYXNlLWluLW91dCI6aSguNDIsMCwuNTgsMSksInN0ZXAtc3RhcnQiOmooMSx4KSwic3RlcC1taWRkbGUiOmooMSx5KSwic3RlcC1lbmQiOmooMSx6KX0sQj1udWxsLEM9IlxccyooLT9cXGQrXFwuP1xcZCp8LT9cXC5cXGQrKVxccyoiLEQ9bmV3IFJlZ0V4cCgiY3ViaWMtYmV6aWVyXFwoIitDKyIsIitDKyIsIitDKyIsIitDKyJcXCkiKSxFPS9zdGVwc1woXHMqKFxkKylccyosXHMqKHN0YXJ0fG1pZGRsZXxlbmQpXHMqXCkvLEY9MCxHPTEsSD0yLEk9MzthLmNsb25lVGltaW5nSW5wdXQ9YyxhLm1ha2VUaW1pbmc9ZixhLm51bWVyaWNUaW1pbmdUb09iamVjdD1nLGEubm9ybWFsaXplVGltaW5nSW5wdXQ9aCxhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uPWwsYS5jYWxjdWxhdGVUaW1lRnJhY3Rpb249dCxhLmNhbGN1bGF0ZVBoYXNlPW4sYS50b1RpbWluZ0Z1bmN0aW9uPWt9KGMsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7cmV0dXJuIGEgaW4gaj9qW2FdW2JdfHxiOmJ9ZnVuY3Rpb24gZChhLGIsZCl7dmFyIGU9Z1thXTtpZihlKXtoLnN0eWxlW2FdPWI7Zm9yKHZhciBmIGluIGUpe3ZhciBpPWVbZl0saj1oLnN0eWxlW2ldO2RbaV09YyhpLGopfX1lbHNlIGRbYV09YyhhLGIpfWZ1bmN0aW9uIGUoYSl7dmFyIGI9W107Zm9yKHZhciBjIGluIGEpaWYoIShjIGluWyJlYXNpbmciLCJvZmZzZXQiLCJjb21wb3NpdGUiXSkpe3ZhciBkPWFbY107QXJyYXkuaXNBcnJheShkKXx8KGQ9W2RdKTtmb3IodmFyIGUsZj1kLmxlbmd0aCxnPTA7Zj5nO2crKyllPXt9LCJvZmZzZXQiaW4gYT9lLm9mZnNldD1hLm9mZnNldDoxPT1mP2Uub2Zmc2V0PTE6ZS5vZmZzZXQ9Zy8oZi0xKSwiZWFzaW5nImluIGEmJihlLmVhc2luZz1hLmVhc2luZyksImNvbXBvc2l0ZSJpbiBhJiYoZS5jb21wb3NpdGU9YS5jb21wb3NpdGUpLGVbY109ZFtnXSxiLnB1c2goZSl9cmV0dXJuIGIuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLm9mZnNldC1iLm9mZnNldH0pLGJ9ZnVuY3Rpb24gZihhKXtmdW5jdGlvbiBiKCl7dmFyIGE9Yy5sZW5ndGg7bnVsbD09Y1thLTFdLm9mZnNldCYmKGNbYS0xXS5vZmZzZXQ9MSksYT4xJiZudWxsPT1jWzBdLm9mZnNldCYmKGNbMF0ub2Zmc2V0PTApO2Zvcih2YXIgYj0wLGQ9Y1swXS5vZmZzZXQsZT0xO2E+ZTtlKyspe3ZhciBmPWNbZV0ub2Zmc2V0O2lmKG51bGwhPWYpe2Zvcih2YXIgZz0xO2UtYj5nO2crKyljW2IrZ10ub2Zmc2V0PWQrKGYtZCkqZy8oZS1iKTtiPWUsZD1mfX19aWYobnVsbD09YSlyZXR1cm5bXTt3aW5kb3cuU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3ImJkFycmF5LnByb3RvdHlwZS5mcm9tJiZhW1N5bWJvbC5pdGVyYXRvcl0mJihhPUFycmF5LmZyb20oYSkpLEFycmF5LmlzQXJyYXkoYSl8fChhPWUoYSkpO2Zvcih2YXIgYz1hLm1hcChmdW5jdGlvbihhKXt2YXIgYj17fTtmb3IodmFyIGMgaW4gYSl7dmFyIGU9YVtjXTtpZigib2Zmc2V0Ij09Yyl7aWYobnVsbCE9ZSYmKGU9TnVtYmVyKGUpLCFpc0Zpbml0ZShlKSkpdGhyb3cgbmV3IFR5cGVFcnJvcigia2V5ZnJhbWUgb2Zmc2V0cyBtdXN0IGJlIG51bWJlcnMuIil9ZWxzZXtpZigiY29tcG9zaXRlIj09Yyl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiYWRkIGNvbXBvc2l0aW5nIGlzIG5vdCBzdXBwb3J0ZWQifTtlPSIiK2V9ZChjLGUsYil9cmV0dXJuIHZvaWQgMD09Yi5vZmZzZXQmJihiLm9mZnNldD1udWxsKSxifSksZj0hMCxnPS0oMS8wKSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBpPWNbaF0ub2Zmc2V0O2lmKG51bGwhPWkpe2lmKGc+aSl0aHJvd3tjb2RlOkRPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsbmFtZToiSW52YWxpZE1vZGlmaWNhdGlvbkVycm9yIixtZXNzYWdlOiJLZXlmcmFtZXMgYXJlIG5vdCBsb29zZWx5IHNvcnRlZCBieSBvZmZzZXQuIFNvcnQgb3Igc3BlY2lmeSBvZmZzZXRzLiJ9O2c9aX1lbHNlIGY9ITF9cmV0dXJuIGM9Yy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0Pj0wJiZhLm9mZnNldDw9MX0pLGZ8fGIoKSxjfXZhciBnPXtiYWNrZ3JvdW5kOlsiYmFja2dyb3VuZEltYWdlIiwiYmFja2dyb3VuZFBvc2l0aW9uIiwiYmFja2dyb3VuZFNpemUiLCJiYWNrZ3JvdW5kUmVwZWF0IiwiYmFja2dyb3VuZEF0dGFjaG1lbnQiLCJiYWNrZ3JvdW5kT3JpZ2luIiwiYmFja2dyb3VuZENsaXAiLCJiYWNrZ3JvdW5kQ29sb3IiXSxib3JkZXI6WyJib3JkZXJUb3BDb2xvciIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0V2lkdGgiLCJib3JkZXJCb3R0b21Db2xvciIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJMZWZ0Q29sb3IiLCJib3JkZXJMZWZ0U3R5bGUiLCJib3JkZXJMZWZ0V2lkdGgiXSxib3JkZXJCb3R0b206WyJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyQm90dG9tQ29sb3IiXSxib3JkZXJDb2xvcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyUmlnaHRDb2xvciIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyTGVmdDpbImJvcmRlckxlZnRXaWR0aCIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRDb2xvciJdLGJvcmRlclJhZGl1czpbImJvcmRlclRvcExlZnRSYWRpdXMiLCJib3JkZXJUb3BSaWdodFJhZGl1cyIsImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyJdLGJvcmRlclJpZ2h0OlsiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlclJpZ2h0U3R5bGUiLCJib3JkZXJSaWdodENvbG9yIl0sYm9yZGVyVG9wOlsiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJUb3BTdHlsZSIsImJvcmRlclRvcENvbG9yIl0sYm9yZGVyV2lkdGg6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRXaWR0aCJdLGZsZXg6WyJmbGV4R3JvdyIsImZsZXhTaHJpbmsiLCJmbGV4QmFzaXMiXSxmb250OlsiZm9udEZhbWlseSIsImZvbnRTaXplIiwiZm9udFN0eWxlIiwiZm9udFZhcmlhbnQiLCJmb250V2VpZ2h0IiwibGluZUhlaWdodCJdLG1hcmdpbjpbIm1hcmdpblRvcCIsIm1hcmdpblJpZ2h0IiwibWFyZ2luQm90dG9tIiwibWFyZ2luTGVmdCJdLG91dGxpbmU6WyJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lU3R5bGUiLCJvdXRsaW5lV2lkdGgiXSxwYWRkaW5nOlsicGFkZGluZ1RvcCIsInBhZGRpbmdSaWdodCIsInBhZGRpbmdCb3R0b20iLCJwYWRkaW5nTGVmdCJdfSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImRpdiIpLGk9e3RoaW46IjFweCIsbWVkaXVtOiIzcHgiLHRoaWNrOiI1cHgifSxqPXtib3JkZXJCb3R0b21XaWR0aDppLGJvcmRlckxlZnRXaWR0aDppLGJvcmRlclJpZ2h0V2lkdGg6aSxib3JkZXJUb3BXaWR0aDppLGZvbnRTaXplOnsieHgtc21hbGwiOiI2MCUiLCJ4LXNtYWxsIjoiNzUlIixzbWFsbDoiODklIixtZWRpdW06IjEwMCUiLGxhcmdlOiIxMjAlIiwieC1sYXJnZSI6IjE1MCUiLCJ4eC1sYXJnZSI6IjIwMCUifSxmb250V2VpZ2h0Ontub3JtYWw6IjQwMCIsYm9sZDoiNzAwIn0sb3V0bGluZVdpZHRoOmksdGV4dFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggdHJhbnNwYXJlbnQifSxib3hTaGFkb3c6e25vbmU6IjBweCAwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9fTthLmNvbnZlcnRUb0FycmF5Rm9ybT1lLGEubm9ybWFsaXplS2V5ZnJhbWVzPWZ9KGMsZiksZnVuY3Rpb24oYSl7dmFyIGI9e307YS5pc0RlcHJlY2F0ZWQ9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiLGc9bmV3IERhdGUsaD1uZXcgRGF0ZShjKTtyZXR1cm4gaC5zZXRNb250aChoLmdldE1vbnRoKCkrMyksaD5nPyhhIGluIGJ8fGNvbnNvbGUud2FybigiV2ViIEFuaW1hdGlvbnM6ICIrYSsiICIrZisiIGRlcHJlY2F0ZWQgYW5kIHdpbGwgc3RvcCB3b3JraW5nIG9uICIraC50b0RhdGVTdHJpbmcoKSsiLiAiK2QpLGJbYV09ITAsITEpOiEwfSxhLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiO2lmKGEuaXNEZXByZWNhdGVkKGIsYyxkLGUpKXRocm93IG5ldyBFcnJvcihiKyIgIitmKyIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIitkKX19KGMpLGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUpe3ZhciBhPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hbmltYXRlKFtdLDApLGI9ITA7aWYoYSYmKGI9ITEsInBsYXl8Y3VycmVudFRpbWV8cGF1c2V8cmV2ZXJzZXxwbGF5YmFja1JhdGV8Y2FuY2VsfGZpbmlzaHxzdGFydFRpbWV8cGxheVN0YXRlIi5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oYyl7dm9pZCAwPT09YVtjXSYmKGI9ITApfSkpLCFiKXJldHVybn0hZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYVtjXSlpZigib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kKXt2YXIgZT17b2Zmc2V0OmFbY10ub2Zmc2V0LGVhc2luZzphW2NdLmVhc2luZyx2YWx1ZTphW2NdW2RdfTtiW2RdPWJbZF18fFtdLGJbZF0ucHVzaChlKX1mb3IodmFyIGYgaW4gYil7dmFyIGc9YltmXTtpZigwIT1nWzBdLm9mZnNldHx8MSE9Z1tnLmxlbmd0aC0xXS5vZmZzZXQpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsbmFtZToiTm90U3VwcG9ydGVkRXJyb3IiLG1lc3NhZ2U6IlBhcnRpYWwga2V5ZnJhbWVzIGFyZSBub3Qgc3VwcG9ydGVkIn19cmV0dXJuIGJ9ZnVuY3Rpb24gZShjKXt2YXIgZD1bXTtmb3IodmFyIGUgaW4gYylmb3IodmFyIGY9Y1tlXSxnPTA7ZzxmLmxlbmd0aC0xO2crKyl7dmFyIGg9ZltnXS5vZmZzZXQsaT1mW2crMV0ub2Zmc2V0LGo9ZltnXS52YWx1ZSxrPWZbZysxXS52YWx1ZSxsPWZbZ10uZWFzaW5nO2g9PWkmJigxPT1pP2o9azprPWopLGQucHVzaCh7c3RhcnRUaW1lOmgsZW5kVGltZTppLGVhc2luZzphLnRvVGltaW5nRnVuY3Rpb24obD9sOiJsaW5lYXIiKSxwcm9wZXJ0eTplLGludGVycG9sYXRpb246Yi5wcm9wZXJ0eUludGVycG9sYXRpb24oZSxqLGspfSl9cmV0dXJuIGQuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0YXJ0VGltZS1iLnN0YXJ0VGltZX0pLGR9Yi5jb252ZXJ0RWZmZWN0SW5wdXQ9ZnVuY3Rpb24oYyl7dmFyIGY9YS5ub3JtYWxpemVLZXlmcmFtZXMoYyksZz1kKGYpLGg9ZShnKTtyZXR1cm4gZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWguZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiAwPj1jJiYwPT1hLnN0YXJ0VGltZXx8Yz49MSYmMT09YS5lbmRUaW1lfHxjPj1hLnN0YXJ0VGltZSYmYzw9YS5lbmRUaW1lfSkuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZT1jLWQuc3RhcnRUaW1lLGY9ZC5lbmRUaW1lLWQuc3RhcnRUaW1lLGc9MD09Zj8wOmQuZWFzaW5nKGUvZik7Yi5hcHBseShhLGQucHJvcGVydHksZC5pbnRlcnBvbGF0aW9uKGcpKX0pO2Vsc2UgZm9yKHZhciBkIGluIGcpIm9mZnNldCIhPWQmJiJlYXNpbmciIT1kJiYiY29tcG9zaXRlIiE9ZCYmYi5jbGVhcihhLGQpfX19KGMsZCxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4gYS5yZXBsYWNlKC8tKC4pL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSl9ZnVuY3Rpb24gZShhLGIsYyl7aFtjXT1oW2NdfHxbXSxoW2NdLnB1c2goW2EsYl0pfWZ1bmN0aW9uIGYoYSxiLGMpe2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz1jW2ZdO2UoYSxiLGQoZykpfX1mdW5jdGlvbiBnKGMsZSxmKXt2YXIgZz1jOy8tLy50ZXN0KGMpJiYhYS5pc0RlcHJlY2F0ZWQoIkh5cGhlbmF0ZWQgcHJvcGVydHkgbmFtZXMiLCIyMDE2LTAzLTIyIiwiVXNlIGNhbWVsQ2FzZSBpbnN0ZWFkLiIsITApJiYoZz1kKGMpKSwiaW5pdGlhbCIhPWUmJiJpbml0aWFsIiE9Znx8KCJpbml0aWFsIj09ZSYmKGU9aVtnXSksImluaXRpYWwiPT1mJiYoZj1pW2ddKSk7Zm9yKHZhciBqPWU9PWY/W106aFtnXSxrPTA7aiYmazxqLmxlbmd0aDtrKyspe3ZhciBsPWpba11bMF0oZSksbT1qW2tdWzBdKGYpO2lmKHZvaWQgMCE9PWwmJnZvaWQgMCE9PW0pe3ZhciBuPWpba11bMV0obCxtKTtpZihuKXt2YXIgbz1iLkludGVycG9sYXRpb24uYXBwbHkobnVsbCxuKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIDA9PWE/ZToxPT1hP2Y6byhhKX19fX1yZXR1cm4gYi5JbnRlcnBvbGF0aW9uKCExLCEwLGZ1bmN0aW9uKGEpe3JldHVybiBhP2Y6ZX0pfXZhciBoPXt9O2IuYWRkUHJvcGVydGllc0hhbmRsZXI9Zjt2YXIgaT17YmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsYmFja2dyb3VuZFBvc2l0aW9uOiIwJSAwJSIsYm9yZGVyQm90dG9tQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyQm90dG9tTGVmdFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21SaWdodFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21XaWR0aDoiM3B4Iixib3JkZXJMZWZ0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyTGVmdFdpZHRoOiIzcHgiLGJvcmRlclJpZ2h0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyUmlnaHRXaWR0aDoiM3B4Iixib3JkZXJTcGFjaW5nOiIycHgiLGJvcmRlclRvcENvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlclRvcExlZnRSYWRpdXM6IjBweCIsYm9yZGVyVG9wUmlnaHRSYWRpdXM6IjBweCIsYm9yZGVyVG9wV2lkdGg6IjNweCIsYm90dG9tOiJhdXRvIixjbGlwOiJyZWN0KDBweCwgMHB4LCAwcHgsIDBweCkiLGNvbG9yOiJibGFjayIsZm9udFNpemU6IjEwMCUiLGZvbnRXZWlnaHQ6IjQwMCIsaGVpZ2h0OiJhdXRvIixsZWZ0OiJhdXRvIixsZXR0ZXJTcGFjaW5nOiJub3JtYWwiLGxpbmVIZWlnaHQ6IjEyMCUiLG1hcmdpbkJvdHRvbToiMHB4IixtYXJnaW5MZWZ0OiIwcHgiLG1hcmdpblJpZ2h0OiIwcHgiLG1hcmdpblRvcDoiMHB4IixtYXhIZWlnaHQ6Im5vbmUiLG1heFdpZHRoOiJub25lIixtaW5IZWlnaHQ6IjBweCIsbWluV2lkdGg6IjBweCIsb3BhY2l0eToiMS4wIixvdXRsaW5lQ29sb3I6ImludmVydCIsb3V0bGluZU9mZnNldDoiMHB4IixvdXRsaW5lV2lkdGg6IjNweCIscGFkZGluZ0JvdHRvbToiMHB4IixwYWRkaW5nTGVmdDoiMHB4IixwYWRkaW5nUmlnaHQ6IjBweCIscGFkZGluZ1RvcDoiMHB4IixyaWdodDoiYXV0byIsdGV4dEluZGVudDoiMHB4Iix0ZXh0U2hhZG93OiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCIsdG9wOiJhdXRvIix0cmFuc2Zvcm06IiIsdmVydGljYWxBbGlnbjoiMHB4Iix2aXNpYmlsaXR5OiJ2aXNpYmxlIix3aWR0aDoiYXV0byIsd29yZFNwYWNpbmc6Im5vcm1hbCIsekluZGV4OiJhdXRvIn07Yi5wcm9wZXJ0eUludGVycG9sYXRpb249Z30oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGIpe3ZhciBjPWEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oYiksZD1mdW5jdGlvbihkKXtyZXR1cm4gYS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYyxkLGIpfTtyZXR1cm4gZC5fdG90YWxEdXJhdGlvbj1iLmRlbGF5K2MrYi5lbmREZWxheSxkLl9pc0N1cnJlbnQ9ZnVuY3Rpb24oZCl7dmFyIGU9YS5jYWxjdWxhdGVQaGFzZShjLGQsYik7cmV0dXJuIGU9PT1QaGFzZUFjdGl2ZXx8ZT09PVBoYXNlQmVmb3JlfSxkfWIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYyxlLGYsZyl7dmFyIGgsaT1kKGEubm9ybWFsaXplVGltaW5nSW5wdXQoZikpLGo9Yi5jb252ZXJ0RWZmZWN0SW5wdXQoZSksaz1mdW5jdGlvbigpe2ooYyxoKX07cmV0dXJuIGsuX3VwZGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gaD1pKGEpLG51bGwhPT1ofSxrLl9jbGVhcj1mdW5jdGlvbigpe2ooYyxudWxsKX0say5faGFzU2FtZVRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYz09PWF9LGsuX2lzQ3VycmVudD1pLl9pc0N1cnJlbnQsay5fdG90YWxEdXJhdGlvbj1pLl90b3RhbER1cmF0aW9uLGsuX2lkPWcsa30sYi5OdWxsRWZmZWN0PWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKCl7YSYmKGEoKSxhPW51bGwpfTtyZXR1cm4gYi5fdXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGIuX3RvdGFsRHVyYXRpb249MCxiLl9pc0N1cnJlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYi5faGFzU2FtZVRhcmdldD1mdW5jdGlvbigpe3JldHVybiExfSxifX0oYyxkLGYpLGZ1bmN0aW9uKGEsYil7YS5hcHBseT1mdW5jdGlvbihiLGMsZCl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09ZH0sYS5jbGVhcj1mdW5jdGlvbihiLGMpe2Iuc3R5bGVbYS5wcm9wZXJ0eU5hbWUoYyldPSIifX0oZCxmKSxmdW5jdGlvbihhKXt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihiLGMpe3ZhciBkPSIiO3JldHVybiBjJiZjLmlkJiYoZD1jLmlkKSxhLnRpbWVsaW5lLl9wbGF5KGEuS2V5ZnJhbWVFZmZlY3QodGhpcyxiLGMsZCkpfX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYixkKXtpZigibnVtYmVyIj09dHlwZW9mIGEmJiJudW1iZXIiPT10eXBlb2YgYilyZXR1cm4gYSooMS1kKStiKmQ7aWYoImJvb2xlYW4iPT10eXBlb2YgYSYmImJvb2xlYW4iPT10eXBlb2YgYilyZXR1cm4uNT5kP2E6YjtpZihhLmxlbmd0aD09Yi5sZW5ndGgpe2Zvcih2YXIgZT1bXSxmPTA7ZjxhLmxlbmd0aDtmKyspZS5wdXNoKGMoYVtmXSxiW2ZdLGQpKTtyZXR1cm4gZX10aHJvdyJNaXNtYXRjaGVkIGludGVycG9sYXRpb24gYXJndW1lbnRzICIrYSsiOiIrYn1hLkludGVycG9sYXRpb249ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZChjKGEsYixlKSl9fX0oZCxmKSxmdW5jdGlvbihhLGIsYyl7YS5zZXF1ZW5jZU51bWJlcj0wO3ZhciBkPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnRhcmdldD1hLHRoaXMuY3VycmVudFRpbWU9Yix0aGlzLnRpbWVsaW5lVGltZT1jLHRoaXMudHlwZT0iZmluaXNoIix0aGlzLmJ1YmJsZXM9ITEsdGhpcy5jYW5jZWxhYmxlPSExLHRoaXMuY3VycmVudFRhcmdldD1hLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMSx0aGlzLmV2ZW50UGhhc2U9RXZlbnQuQVRfVEFSR0VULHRoaXMudGltZVN0YW1wPURhdGUubm93KCl9O2IuQW5pbWF0aW9uPWZ1bmN0aW9uKGIpe3RoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLl9zZXF1ZW5jZU51bWJlcj1hLnNlcXVlbmNlTnVtYmVyKyssdGhpcy5fY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5fcGxheWJhY2tSYXRlPTEsdGhpcy5faW5UaW1lbGluZT0hMCx0aGlzLl9maW5pc2hlZEZsYWc9ITAsdGhpcy5vbmZpbmlzaD1udWxsLHRoaXMuX2ZpbmlzaEhhbmRsZXJzPVtdLHRoaXMuX2VmZmVjdD1iLHRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKDApLHRoaXMuX2lkbGU9ITAsdGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExfSxiLkFuaW1hdGlvbi5wcm90b3R5cGU9e19lbnN1cmVBbGl2ZTpmdW5jdGlvbigpe3RoaXMucGxheWJhY2tSYXRlPDAmJjA9PT10aGlzLmN1cnJlbnRUaW1lP3RoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKC0xKTp0aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSh0aGlzLmN1cnJlbnRUaW1lKSx0aGlzLl9pblRpbWVsaW5lfHwhdGhpcy5faW5FZmZlY3QmJnRoaXMuX2ZpbmlzaGVkRmxhZ3x8KHRoaXMuX2luVGltZWxpbmU9ITAsYi50aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpKX0sX3RpY2tDdXJyZW50VGltZTpmdW5jdGlvbihhLGIpe2EhPXRoaXMuX2N1cnJlbnRUaW1lJiYodGhpcy5fY3VycmVudFRpbWU9YSx0aGlzLl9pc0ZpbmlzaGVkJiYhYiYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCksdGhpcy5fZW5zdXJlQWxpdmUoKSl9LGdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl9pZGxlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/bnVsbDp0aGlzLl9jdXJyZW50VGltZX0sc2V0IGN1cnJlbnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fChiLnJlc3RhcnQoKSx0aGlzLl9wYXVzZWR8fG51bGw9PXRoaXMuX3N0YXJ0VGltZXx8KHRoaXMuX3N0YXJ0VGltZT10aGlzLl90aW1lbGluZS5jdXJyZW50VGltZS1hL3RoaXMuX3BsYXliYWNrUmF0ZSksdGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2N1cnJlbnRUaW1lIT1hJiYodGhpcy5fdGlja0N1cnJlbnRUaW1lKGEsITApLGIuaW52YWxpZGF0ZUVmZmVjdHMoKSkpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZX0sc2V0IHN0YXJ0VGltZShhKXthPSthLGlzTmFOKGEpfHx0aGlzLl9wYXVzZWR8fHRoaXMuX2lkbGV8fCh0aGlzLl9zdGFydFRpbWU9YSx0aGlzLl90aWNrQ3VycmVudFRpbWUoKHRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpLGIuaW52YWxpZGF0ZUVmZmVjdHMoKSl9LGdldCBwbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5fcGxheWJhY2tSYXRlfSxzZXQgcGxheWJhY2tSYXRlKGEpe2lmKGEhPXRoaXMuX3BsYXliYWNrUmF0ZSl7dmFyIGI9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9wbGF5YmFja1JhdGU9YSx0aGlzLl9zdGFydFRpbWU9bnVsbCwicGF1c2VkIiE9dGhpcy5wbGF5U3RhdGUmJiJpZGxlIiE9dGhpcy5wbGF5U3RhdGUmJnRoaXMucGxheSgpLG51bGwhPWImJih0aGlzLmN1cnJlbnRUaW1lPWIpfX0sZ2V0IF9pc0ZpbmlzaGVkKCl7cmV0dXJuIXRoaXMuX2lkbGUmJih0aGlzLl9wbGF5YmFja1JhdGU+MCYmdGhpcy5fY3VycmVudFRpbWU+PXRoaXMuX3RvdGFsRHVyYXRpb258fHRoaXMuX3BsYXliYWNrUmF0ZTwwJiZ0aGlzLl9jdXJyZW50VGltZTw9MCl9LGdldCBfdG90YWxEdXJhdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3QuX3RvdGFsRHVyYXRpb259LGdldCBwbGF5U3RhdGUoKXtyZXR1cm4gdGhpcy5faWRsZT8iaWRsZSI6bnVsbD09dGhpcy5fc3RhcnRUaW1lJiYhdGhpcy5fcGF1c2VkJiYwIT10aGlzLnBsYXliYWNrUmF0ZXx8dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPyJwZW5kaW5nIjp0aGlzLl9wYXVzZWQ/InBhdXNlZCI6dGhpcy5faXNGaW5pc2hlZD8iZmluaXNoZWQiOiJydW5uaW5nIn0scGxheTpmdW5jdGlvbigpe3RoaXMuX3BhdXNlZD0hMSwodGhpcy5faXNGaW5pc2hlZHx8dGhpcy5faWRsZSkmJih0aGlzLl9jdXJyZW50VGltZT10aGlzLl9wbGF5YmFja1JhdGU+MD8wOnRoaXMuX3RvdGFsRHVyYXRpb24sdGhpcy5fc3RhcnRUaW1lPW51bGwpLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMSx0aGlzLl9pZGxlPSExLHRoaXMuX2Vuc3VyZUFsaXZlKCksYi5pbnZhbGlkYXRlRWZmZWN0cygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX2lzRmluaXNoZWR8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMCksdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5fcGF1c2VkPSEwfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9pZGxlfHwodGhpcy5jdXJyZW50VGltZT10aGlzLl9wbGF5YmFja1JhdGU+MD90aGlzLl90b3RhbER1cmF0aW9uOjAsdGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RvdGFsRHVyYXRpb24tdGhpcy5jdXJyZW50VGltZSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sY2FuY2VsOmZ1bmN0aW9uKCl7dGhpcy5faW5FZmZlY3QmJih0aGlzLl9pbkVmZmVjdD0hMSx0aGlzLl9pZGxlPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLmN1cnJlbnRUaW1lPTAsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5fZWZmZWN0Ll91cGRhdGUobnVsbCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMucGxheWJhY2tSYXRlKj0tMSx0aGlzLnBsYXkoKX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiZmluaXNoIj09YSYmdGhpcy5fZmluaXNoSGFuZGxlcnMucHVzaChiKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpe2lmKCJmaW5pc2giPT1hKXt2YXIgYz10aGlzLl9maW5pc2hIYW5kbGVycy5pbmRleE9mKGIpO2M+PTAmJnRoaXMuX2ZpbmlzaEhhbmRsZXJzLnNwbGljZShjLDEpfX0sX2ZpcmVFdmVudHM6ZnVuY3Rpb24oYSl7aWYodGhpcy5faXNGaW5pc2hlZCl7aWYoIXRoaXMuX2ZpbmlzaGVkRmxhZyl7dmFyIGI9bmV3IGQodGhpcyx0aGlzLl9jdXJyZW50VGltZSxhKSxjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmNvbmNhdCh0aGlzLm9uZmluaXNoP1t0aGlzLm9uZmluaXNoXTpbXSk7c2V0VGltZW91dChmdW5jdGlvbigpe2MuZm9yRWFjaChmdW5jdGlvbihhKXthLmNhbGwoYi50YXJnZXQsYil9KX0sMCksdGhpcy5fZmluaXNoZWRGbGFnPSEwfX1lbHNlIHRoaXMuX2ZpbmlzaGVkRmxhZz0hMX0sX3RpY2s6ZnVuY3Rpb24oYSxiKXt0aGlzLl9pZGxlfHx0aGlzLl9wYXVzZWR8fChudWxsPT10aGlzLl9zdGFydFRpbWU/YiYmKHRoaXMuc3RhcnRUaW1lPWEtdGhpcy5fY3VycmVudFRpbWUvdGhpcy5wbGF5YmFja1JhdGUpOnRoaXMuX2lzRmluaXNoZWR8fHRoaXMuX3RpY2tDdXJyZW50VGltZSgoYS10aGlzLl9zdGFydFRpbWUpKnRoaXMucGxheWJhY2tSYXRlKSksYiYmKHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSx0aGlzLl9maXJlRXZlbnRzKGEpKX0sZ2V0IF9uZWVkc1RpY2soKXtyZXR1cm4gdGhpcy5wbGF5U3RhdGUgaW57cGVuZGluZzoxLHJ1bm5pbmc6MX18fCF0aGlzLl9maW5pc2hlZEZsYWd9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBiPWo7aj1bXSxhPHAuY3VycmVudFRpbWUmJihhPXAuY3VycmVudFRpbWUpLGgoYSwhMCksYi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMV0oYSl9KSxnKCksbD12b2lkIDB9ZnVuY3Rpb24gZShhLGIpe3JldHVybiBhLl9zZXF1ZW5jZU51bWJlci1iLl9zZXF1ZW5jZU51bWJlcn1mdW5jdGlvbiBmKCl7dGhpcy5fYW5pbWF0aW9ucz1bXSx0aGlzLmN1cnJlbnRUaW1lPXdpbmRvdy5wZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpOjB9ZnVuY3Rpb24gZygpe28uZm9yRWFjaChmdW5jdGlvbihhKXthKCl9KSxvLmxlbmd0aD0wfWZ1bmN0aW9uIGgoYSxjKXtuPSExO3ZhciBkPWIudGltZWxpbmU7ZC5jdXJyZW50VGltZT1hLGQuX2FuaW1hdGlvbnMuc29ydChlKSxtPSExO3ZhciBmPWQuX2FuaW1hdGlvbnM7ZC5fYW5pbWF0aW9ucz1bXTt2YXIgZz1bXSxoPVtdO2Y9Zi5maWx0ZXIoZnVuY3Rpb24oYil7Yi5fdGljayhhLGMpLGIuX2luRWZmZWN0P2gucHVzaChiLl9lZmZlY3QpOmcucHVzaChiLl9lZmZlY3QpLGIuX25lZWRzVGljayYmKG09ITApO3ZhciBkPWIuX2luRWZmZWN0fHxiLl9uZWVkc1RpY2s7cmV0dXJuIGIuX2luVGltZWxpbmU9ZCxkfSksby5wdXNoLmFwcGx5KG8sZyksby5wdXNoLmFwcGx5KG8saCksZC5fYW5pbWF0aW9ucy5wdXNoLmFwcGx5KGQuX2FuaW1hdGlvbnMsZiksbSYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7fSl9dmFyIGk9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSxqPVtdLGs9MDt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe3ZhciBiPWsrKztyZXR1cm4gMD09ai5sZW5ndGgmJmkoZCksai5wdXNoKFtiLGFdKSxifSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7ai5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMF09PWEmJihiWzFdPWZ1bmN0aW9uKCl7fSl9KX0sZi5wcm90b3R5cGU9e19wbGF5OmZ1bmN0aW9uKGMpe2MuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMudGltaW5nKTt2YXIgZD1uZXcgYi5BbmltYXRpb24oYyk7cmV0dXJuIGQuX2lkbGU9ITEsZC5fdGltZWxpbmU9dGhpcyx0aGlzLl9hbmltYXRpb25zLnB1c2goZCksYi5yZXN0YXJ0KCksYi5pbnZhbGlkYXRlRWZmZWN0cygpLGR9fTt2YXIgbD12b2lkIDAsbT0hMSxuPSExO2IucmVzdGFydD1mdW5jdGlvbigpe3JldHVybiBtfHwobT0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KSxuPSEwKSxufSxiLmludmFsaWRhdGVFZmZlY3RzPWZ1bmN0aW9uKCl7aChiLnRpbWVsaW5lLmN1cnJlbnRUaW1lLCExKSxnKCl9O3ZhciBvPVtdLHA9bmV3IGY7Yi50aW1lbGluZT1wfShjLGQsZiksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPWEuZXhlYyhiKTtyZXR1cm4gYz8oYz1hLmlnbm9yZUNhc2U/Y1swXS50b0xvd2VyQ2FzZSgpOmNbMF0sW2MsYi5zdWJzdHIoYy5sZW5ndGgpXSk6dm9pZCAwfWZ1bmN0aW9uIGMoYSxiKXtiPWIucmVwbGFjZSgvXlxzKi8sIiIpO3ZhciBjPWEoYik7cmV0dXJuIGM/W2NbMF0sY1sxXS5yZXBsYWNlKC9eXHMqLywiIildOnZvaWQgMH1mdW5jdGlvbiBkKGEsZCxlKXthPWMuYmluZChudWxsLGEpO2Zvcih2YXIgZj1bXTs7KXt2YXIgZz1hKGUpO2lmKCFnKXJldHVybltmLGVdO2lmKGYucHVzaChnWzBdKSxlPWdbMV0sZz1iKGQsZSksIWd8fCIiPT1nWzFdKXJldHVybltmLGVdO2U9Z1sxXX19ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz0wLGQ9MDtkPGIubGVuZ3RoJiYoIS9cc3wsLy50ZXN0KGJbZF0pfHwwIT1jKTtkKyspaWYoIigiPT1iW2RdKWMrKztlbHNlIGlmKCIpIj09YltkXSYmKGMtLSwwPT1jJiZkKyssMD49YykpYnJlYWs7dmFyIGU9YShiLnN1YnN0cigwLGQpKTtyZXR1cm4gdm9pZCAwPT1lP3ZvaWQgMDpbZSxiLnN1YnN0cihkKV19ZnVuY3Rpb24gZihhLGIpe2Zvcih2YXIgYz1hLGQ9YjtjJiZkOyljPmQ/YyU9ZDpkJT1jO3JldHVybiBjPWEqYi8oYytkKX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1hKGIpO3JldHVybiBjJiYoY1swXT12b2lkIDApLGN9fWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7dmFyIGQ9YShjKTtyZXR1cm4gZD9kOltiLGNdfX1mdW5jdGlvbiBpKGIsYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGIubGVuZ3RoO2UrKyl7dmFyIGY9YS5jb25zdW1lVHJpbW1lZChiW2VdLGMpO2lmKCFmfHwiIj09ZlswXSlyZXR1cm47dm9pZCAwIT09ZlswXSYmZC5wdXNoKGZbMF0pLGM9ZlsxXX1yZXR1cm4iIj09Yz9kOnZvaWQgMH1mdW5jdGlvbiBqKGEsYixjLGQsZSl7Zm9yKHZhciBnPVtdLGg9W10saT1bXSxqPWYoZC5sZW5ndGgsZS5sZW5ndGgpLGs9MDtqPms7aysrKXt2YXIgbD1iKGRbayVkLmxlbmd0aF0sZVtrJWUubGVuZ3RoXSk7aWYoIWwpcmV0dXJuO2cucHVzaChsWzBdKSxoLnB1c2gobFsxXSksaS5wdXNoKGxbMl0pfXJldHVybltnLGgsZnVuY3Rpb24oYil7dmFyIGQ9Yi5tYXAoZnVuY3Rpb24oYSxiKXtyZXR1cm4gaVtiXShhKX0pLmpvaW4oYyk7cmV0dXJuIGE/YShkKTpkfV19ZnVuY3Rpb24gayhhLGIsYyl7Zm9yKHZhciBkPVtdLGU9W10sZj1bXSxnPTAsaD0wO2g8Yy5sZW5ndGg7aCsrKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBjW2hdKXt2YXIgaT1jW2hdKGFbZ10sYltnKytdKTtkLnB1c2goaVswXSksZS5wdXNoKGlbMV0pLGYucHVzaChpWzJdKX1lbHNlIWZ1bmN0aW9uKGEpe2QucHVzaCghMSksZS5wdXNoKCExKSxmLnB1c2goZnVuY3Rpb24oKXtyZXR1cm4gY1thXX0pfShoKTtyZXR1cm5bZCxlLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspYis9ZltjXShhW2NdKTtyZXR1cm4gYn1dfWEuY29uc3VtZVRva2VuPWIsYS5jb25zdW1lVHJpbW1lZD1jLGEuY29uc3VtZVJlcGVhdGVkPWQsYS5jb25zdW1lUGFyZW50aGVzaXNlZD1lLGEuaWdub3JlPWcsYS5vcHRpb25hbD1oLGEuY29uc3VtZUxpc3Q9aSxhLm1lcmdlTmVzdGVkUmVwZWF0ZWQ9ai5iaW5kKG51bGwsbnVsbCksYS5tZXJnZVdyYXBwZWROZXN0ZWRSZXBlYXRlZD1qLGEubWVyZ2VMaXN0PWt9KGQpLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYil7ZnVuY3Rpb24gYyhiKXt2YXIgYz1hLmNvbnN1bWVUb2tlbigvXmluc2V0L2ksYik7aWYoYylyZXR1cm4gZC5pbnNldD0hMCxjO3ZhciBjPWEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKTtpZihjKXJldHVybiBkLmxlbmd0aHMucHVzaChjWzBdKSxjO3ZhciBjPWEuY29uc3VtZUNvbG9yKGIpO3JldHVybiBjPyhkLmNvbG9yPWNbMF0sYyk6dm9pZCAwfXZhciBkPXtpbnNldDohMSxsZW5ndGhzOltdLGNvbG9yOm51bGx9LGU9YS5jb25zdW1lUmVwZWF0ZWQoYywvXi8sYik7cmV0dXJuIGUmJmVbMF0ubGVuZ3RoP1tkLGVbMV1dOnZvaWQgMH1mdW5jdGlvbiBjKGMpe3ZhciBkPWEuY29uc3VtZVJlcGVhdGVkKGIsL14sLyxjKTtyZXR1cm4gZCYmIiI9PWRbMV0/ZFswXTp2b2lkIDB9ZnVuY3Rpb24gZChiLGMpe2Zvcig7Yi5sZW5ndGhzLmxlbmd0aDxNYXRoLm1heChiLmxlbmd0aHMubGVuZ3RoLGMubGVuZ3Rocy5sZW5ndGgpOyliLmxlbmd0aHMucHVzaCh7cHg6MH0pO2Zvcig7Yy5sZW5ndGhzLmxlbmd0aDxNYXRoLm1heChiLmxlbmd0aHMubGVuZ3RoLGMubGVuZ3Rocy5sZW5ndGgpOyljLmxlbmd0aHMucHVzaCh7cHg6MH0pO2lmKGIuaW5zZXQ9PWMuaW5zZXQmJiEhYi5jb2xvcj09ISFjLmNvbG9yKXtmb3IodmFyIGQsZT1bXSxmPVtbXSwwXSxnPVtbXSwwXSxoPTA7aDxiLmxlbmd0aHMubGVuZ3RoO2grKyl7dmFyIGk9YS5tZXJnZURpbWVuc2lvbnMoYi5sZW5ndGhzW2hdLGMubGVuZ3Roc1toXSwyPT1oKTtmWzBdLnB1c2goaVswXSksZ1swXS5wdXNoKGlbMV0pLGUucHVzaChpWzJdKX1pZihiLmNvbG9yJiZjLmNvbG9yKXt2YXIgaj1hLm1lcmdlQ29sb3JzKGIuY29sb3IsYy5jb2xvcik7ZlsxXT1qWzBdLGdbMV09alsxXSxkPWpbMl19cmV0dXJuW2YsZyxmdW5jdGlvbihhKXtmb3IodmFyIGM9Yi5pbnNldD8iaW5zZXQgIjoiICIsZj0wO2Y8ZS5sZW5ndGg7ZisrKWMrPWVbZl0oYVswXVtmXSkrIiAiO3JldHVybiBkJiYoYys9ZChhWzFdKSksY31dfX1mdW5jdGlvbiBlKGIsYyxkLGUpe2Z1bmN0aW9uIGYoYSl7cmV0dXJue2luc2V0OmEsY29sb3I6WzAsMCwwLDBdLGxlbmd0aHM6W3tweDowfSx7cHg6MH0se3B4OjB9LHtweDowfV19fWZvcih2YXIgZz1bXSxoPVtdLGk9MDtpPGQubGVuZ3RofHxpPGUubGVuZ3RoO2krKyl7dmFyIGo9ZFtpXXx8ZihlW2ldLmluc2V0KSxrPWVbaV18fGYoZFtpXS5pbnNldCk7Zy5wdXNoKGopLGgucHVzaChrKX1yZXR1cm4gYS5tZXJnZU5lc3RlZFJlcGVhdGVkKGIsYyxnLGgpfXZhciBmPWUuYmluZChudWxsLGQsIiwgIik7YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihjLGYsWyJib3gtc2hhZG93IiwidGV4dC1zaGFkb3ciXSl9KGQpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gYS50b0ZpeGVkKDMpLnJlcGxhY2UoIi4wMDAiLCIiKX1mdW5jdGlvbiBkKGEsYixjKXtyZXR1cm4gTWF0aC5taW4oYixNYXRoLm1heChhLGMpKX1mdW5jdGlvbiBlKGEpe3JldHVybi9eXHMqWy0rXT8oXGQqXC4pP1xkK1xzKiQvLnRlc3QoYSk/TnVtYmVyKGEpOnZvaWQgMH1mdW5jdGlvbiBmKGEsYil7cmV0dXJuW2EsYixjXX1mdW5jdGlvbiBnKGEsYil7cmV0dXJuIDAhPWE/aSgwLDEvMCkoYSxiKTp2b2lkIDB9ZnVuY3Rpb24gaChhLGIpe3JldHVyblthLGIsZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoZCgxLDEvMCxhKSl9XX1mdW5jdGlvbiBpKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuW2UsZixmdW5jdGlvbihlKXtyZXR1cm4gYyhkKGEsYixlKSl9XX19ZnVuY3Rpb24gaihhLGIpe3JldHVyblthLGIsTWF0aC5yb3VuZF19YS5jbGFtcD1kLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxpKDAsMS8wKSxbImJvcmRlci1pbWFnZS13aWR0aCIsImxpbmUtaGVpZ2h0Il0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxpKDAsMSksWyJvcGFjaXR5Iiwic2hhcGUtaW1hZ2UtdGhyZXNob2xkIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxnLFsiZmxleC1ncm93IiwiZmxleC1zaHJpbmsiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGgsWyJvcnBoYW5zIiwid2lkb3dzIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxqLFsiei1pbmRleCJdKSxhLnBhcnNlTnVtYmVyPWUsYS5tZXJnZU51bWJlcnM9ZixhLm51bWJlclRvU3RyaW5nPWN9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7cmV0dXJuInZpc2libGUiPT1hfHwidmlzaWJsZSI9PWI/WzAsMSxmdW5jdGlvbihjKXtyZXR1cm4gMD49Yz9hOmM+PTE/YjoidmlzaWJsZSJ9XTp2b2lkIDB9YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihTdHJpbmcsYyxbInZpc2liaWxpdHkiXSl9KGQpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXthPWEudHJpbSgpLGYuZmlsbFN0eWxlPSIjMDAwIixmLmZpbGxTdHlsZT1hO3ZhciBiPWYuZmlsbFN0eWxlO2lmKGYuZmlsbFN0eWxlPSIjZmZmIixmLmZpbGxTdHlsZT1hLGI9PWYuZmlsbFN0eWxlKXtmLmZpbGxSZWN0KDAsMCwxLDEpO3ZhciBjPWYuZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGE7Zi5jbGVhclJlY3QoMCwwLDEsMSk7dmFyIGQ9Y1szXS8yNTU7cmV0dXJuW2NbMF0qZCxjWzFdKmQsY1syXSpkLGRdfX1mdW5jdGlvbiBkKGIsYyl7cmV0dXJuW2IsYyxmdW5jdGlvbihiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxhKSl9aWYoYlszXSlmb3IodmFyIGQ9MDszPmQ7ZCsrKWJbZF09TWF0aC5yb3VuZChjKGJbZF0vYlszXSkpO3JldHVybiBiWzNdPWEubnVtYmVyVG9TdHJpbmcoYS5jbGFtcCgwLDEsYlszXSkpLCJyZ2JhKCIrYi5qb2luKCIsIikrIikifV19dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIik7ZS53aWR0aD1lLmhlaWdodD0xO3ZhciBmPWUuZ2V0Q29udGV4dCgiMmQiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZCxbImJhY2tncm91bmQtY29sb3IiLCJib3JkZXItYm90dG9tLWNvbG9yIiwiYm9yZGVyLWxlZnQtY29sb3IiLCJib3JkZXItcmlnaHQtY29sb3IiLCJib3JkZXItdG9wLWNvbG9yIiwiY29sb3IiLCJvdXRsaW5lLWNvbG9yIiwidGV4dC1kZWNvcmF0aW9uLWNvbG9yIl0pLGEuY29uc3VtZUNvbG9yPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGMpLGEubWVyZ2VDb2xvcnM9ZH0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZihiPWIudHJpbSgpLnRvTG93ZXJDYXNlKCksIjAiPT1iJiYicHgiLnNlYXJjaChhKT49MClyZXR1cm57cHg6MH07aWYoL15bXihdKiR8XmNhbGMvLnRlc3QoYikpe2I9Yi5yZXBsYWNlKC9jYWxjXCgvZywiKCIpO3ZhciBjPXt9O2I9Yi5yZXBsYWNlKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV09bnVsbCwiVSIrYX0pO2Zvcih2YXIgZD0iVSgiK2Euc291cmNlKyIpIixlPWIucmVwbGFjZSgvWy0rXT8oXGQqXC4pP1xkKy9nLCJOIikucmVwbGFjZShuZXcgUmVnRXhwKCJOIitkLCJnIiksIkQiKS5yZXBsYWNlKC9cc1srLV1ccy9nLCJPIikucmVwbGFjZSgvXHMvZywiIiksZj1bL05cKihEKS9nLC8oTnxEKVsqXC9dTi9nLC8oTnxEKU9cMS9nLC9cKChOfEQpXCkvZ10sZz0wO2c8Zi5sZW5ndGg7KWZbZ10udGVzdChlKT8oZT1lLnJlcGxhY2UoZltnXSwiJDEiKSxnPTApOmcrKztpZigiRCI9PWUpe2Zvcih2YXIgaCBpbiBjKXt2YXIgaT1ldmFsKGIucmVwbGFjZShuZXcgUmVnRXhwKCJVIitoLCJnIiksIiIpLnJlcGxhY2UobmV3IFJlZ0V4cChkLCJnIiksIiowIikpO2lmKCFpc0Zpbml0ZShpKSlyZXR1cm47Y1toXT1pfXJldHVybiBjfX19ZnVuY3Rpb24gZChhLGIpe3JldHVybiBlKGEsYiwhMCl9ZnVuY3Rpb24gZShiLGMsZCl7dmFyIGUsZj1bXTtmb3IoZSBpbiBiKWYucHVzaChlKTtmb3IoZSBpbiBjKWYuaW5kZXhPZihlKTwwJiZmLnB1c2goZSk7cmV0dXJuIGI9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGJbYV18fDB9KSxjPWYubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfHwwfSksW2IsYyxmdW5jdGlvbihiKXt2YXIgYz1iLm1hcChmdW5jdGlvbihjLGUpe3JldHVybiAxPT1iLmxlbmd0aCYmZCYmKGM9TWF0aC5tYXgoYywwKSksYS5udW1iZXJUb1N0cmluZyhjKStmW2VdfSkuam9pbigiICsgIik7cmV0dXJuIGIubGVuZ3RoPjE/ImNhbGMoIitjKyIpIjpjfV19dmFyIGY9InB4fGVtfGV4fGNofHJlbXx2d3x2aHx2bWlufHZtYXh8Y218bW18aW58cHR8cGMiLGc9Yy5iaW5kKG51bGwsbmV3IFJlZ0V4cChmLCJnIikpLGg9Yy5iaW5kKG51bGwsbmV3IFJlZ0V4cChmKyJ8JSIsImciKSksaT1jLmJpbmQobnVsbCwvZGVnfHJhZHxncmFkfHR1cm4vZyk7YS5wYXJzZUxlbmd0aD1nLGEucGFyc2VMZW5ndGhPclBlcmNlbnQ9aCxhLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQ9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsaCksYS5wYXJzZUFuZ2xlPWksYS5tZXJnZURpbWVuc2lvbnM9ZTt2YXIgaj1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxnKSxrPWEuY29uc3VtZVJlcGVhdGVkLmJpbmQodm9pZCAwLGosL14vKSxsPWEuY29uc3VtZVJlcGVhdGVkLmJpbmQodm9pZCAwLGssL14sLyk7YS5jb25zdW1lU2l6ZVBhaXJMaXN0PWw7dmFyIG09ZnVuY3Rpb24oYSl7dmFyIGI9bChhKTtyZXR1cm4gYiYmIiI9PWJbMV0/YlswXTp2b2lkIDB9LG49YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLGQsIiAiKSxvPWEubWVyZ2VOZXN0ZWRSZXBlYXRlZC5iaW5kKHZvaWQgMCxuLCIsIik7YS5tZXJnZU5vbk5lZ2F0aXZlU2l6ZVBhaXI9bixhLmFkZFByb3BlcnRpZXNIYW5kbGVyKG0sbyxbImJhY2tncm91bmQtc2l6ZSJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGgsZCxbImJvcmRlci1ib3R0b20td2lkdGgiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItbGVmdC13aWR0aCIsImJvcmRlci1yaWdodC13aWR0aCIsImJvcmRlci10b3Atd2lkdGgiLCJmbGV4LWJhc2lzIiwiZm9udC1zaXplIiwiaGVpZ2h0IiwibGluZS1oZWlnaHQiLCJtYXgtaGVpZ2h0IiwibWF4LXdpZHRoIiwib3V0bGluZS13aWR0aCIsIndpZHRoIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxlLFsiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyIsImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwiYm90dG9tIiwibGVmdCIsImxldHRlci1zcGFjaW5nIiwibWFyZ2luLWJvdHRvbSIsIm1hcmdpbi1sZWZ0IiwibWFyZ2luLXJpZ2h0IiwibWFyZ2luLXRvcCIsIm1pbi1oZWlnaHQiLCJtaW4td2lkdGgiLCJvdXRsaW5lLW9mZnNldCIsInBhZGRpbmctYm90dG9tIiwicGFkZGluZy1sZWZ0IiwicGFkZGluZy1yaWdodCIsInBhZGRpbmctdG9wIiwicGVyc3BlY3RpdmUiLCJyaWdodCIsInNoYXBlLW1hcmdpbiIsInRleHQtaW5kZW50IiwidG9wIiwidmVydGljYWwtYWxpZ24iLCJ3b3JkLXNwYWNpbmciXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIpe3JldHVybiBhLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQoYil8fGEuY29uc3VtZVRva2VuKC9eYXV0by8sYil9ZnVuY3Rpb24gZChiKXt2YXIgZD1hLmNvbnN1bWVMaXN0KFthLmlnbm9yZShhLmNvbnN1bWVUb2tlbi5iaW5kKG51bGwsL15yZWN0LykpLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwoLykpLGEuY29uc3VtZVJlcGVhdGVkLmJpbmQobnVsbCxjLC9eLC8pLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwpLykpXSxiKTtyZXR1cm4gZCYmND09ZFswXS5sZW5ndGg/ZFswXTp2b2lkIDB9ZnVuY3Rpb24gZShiLGMpe3JldHVybiJhdXRvIj09Ynx8ImF1dG8iPT1jP1shMCwhMSxmdW5jdGlvbihkKXt2YXIgZT1kP2I6YztpZigiYXV0byI9PWUpcmV0dXJuImF1dG8iO3ZhciBmPWEubWVyZ2VEaW1lbnNpb25zKGUsZSk7cmV0dXJuIGZbMl0oZlswXSl9XTphLm1lcmdlRGltZW5zaW9ucyhiLGMpfWZ1bmN0aW9uIGYoYSl7cmV0dXJuInJlY3QoIithKyIpIn12YXIgZz1hLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkLmJpbmQobnVsbCxmLGUsIiwgIik7YS5wYXJzZUJveD1kLGEubWVyZ2VCb3hlcz1nLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZCxnLFsiY2xpcCJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPTA7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09az9iW2MrK106YX0pfX1mdW5jdGlvbiBkKGEpe3JldHVybiBhfWZ1bmN0aW9uIGUoYil7aWYoYj1iLnRvTG93ZXJDYXNlKCkudHJpbSgpLCJub25lIj09YilyZXR1cm5bXTtmb3IodmFyIGMsZD0vXHMqKFx3KylcKChbXildKilcKS9nLGU9W10sZj0wO2M9ZC5leGVjKGIpOyl7aWYoYy5pbmRleCE9ZilyZXR1cm47Zj1jLmluZGV4K2NbMF0ubGVuZ3RoO3ZhciBnPWNbMV0saD1uW2ddO2lmKCFoKXJldHVybjt2YXIgaT1jWzJdLnNwbGl0KCIsIiksaj1oWzBdO2lmKGoubGVuZ3RoPGkubGVuZ3RoKXJldHVybjtmb3IodmFyIGs9W10sbz0wO288ai5sZW5ndGg7bysrKXt2YXIgcCxxPWlbb10scj1qW29dO2lmKHA9cT97QTpmdW5jdGlvbihiKXtyZXR1cm4iMCI9PWIudHJpbSgpP206YS5wYXJzZUFuZ2xlKGIpfSxOOmEucGFyc2VOdW1iZXIsVDphLnBhcnNlTGVuZ3RoT3JQZXJjZW50LEw6YS5wYXJzZUxlbmd0aH1bci50b1VwcGVyQ2FzZSgpXShxKTp7YTptLG46a1swXSx0Omx9W3JdLHZvaWQgMD09PXApcmV0dXJuO2sucHVzaChwKX1pZihlLnB1c2goe3Q6ZyxkOmt9KSxkLmxhc3RJbmRleD09Yi5sZW5ndGgpcmV0dXJuIGV9fWZ1bmN0aW9uIGYoYSl7cmV0dXJuIGEudG9GaXhlZCg2KS5yZXBsYWNlKCIuMDAwMDAwIiwiIil9ZnVuY3Rpb24gZyhiLGMpe2lmKGIuZGVjb21wb3NpdGlvblBhaXIhPT1jKXtiLmRlY29tcG9zaXRpb25QYWlyPWM7dmFyIGQ9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihiKX1pZihjLmRlY29tcG9zaXRpb25QYWlyIT09Yil7Yy5kZWNvbXBvc2l0aW9uUGFpcj1iO3ZhciBlPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24oYyl9cmV0dXJuIG51bGw9PWRbMF18fG51bGw9PWVbMF0/W1shMV0sWyEwXSxmdW5jdGlvbihhKXtyZXR1cm4gYT9jWzBdLmQ6YlswXS5kfV06KGRbMF0ucHVzaCgwKSxlWzBdLnB1c2goMSksW2QsZSxmdW5jdGlvbihiKXt2YXIgYz1hLnF1YXQoZFswXVszXSxlWzBdWzNdLGJbNV0pLGc9YS5jb21wb3NlTWF0cml4KGJbMF0sYlsxXSxiWzJdLGMsYls0XSksaD1nLm1hcChmKS5qb2luKCIsIik7cmV0dXJuIGh9XSl9ZnVuY3Rpb24gaChhKXtyZXR1cm4gYS5yZXBsYWNlKC9beHldLywiIil9ZnVuY3Rpb24gaShhKXtyZXR1cm4gYS5yZXBsYWNlKC8oeHx5fHp8M2QpPyQvLCIzZCIpfWZ1bmN0aW9uIGooYixjKXt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uJiYhMCxlPSExO2lmKCFiLmxlbmd0aHx8IWMubGVuZ3RoKXtiLmxlbmd0aHx8KGU9ITAsYj1jLGM9W10pO2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaj1iW2ZdLnQsaz1iW2ZdLmQsbD0ic2NhbGUiPT1qLnN1YnN0cigwLDUpPzE6MDtjLnB1c2goe3Q6aixkOmsubWFwKGZ1bmN0aW9uKGEpe2lmKCJudW1iZXIiPT10eXBlb2YgYSlyZXR1cm4gbDt2YXIgYj17fTtmb3IodmFyIGMgaW4gYSliW2NdPWw7cmV0dXJuIGJ9KX0pfX12YXIgbT1mdW5jdGlvbihhLGIpe3JldHVybiJwZXJzcGVjdGl2ZSI9PWEmJiJwZXJzcGVjdGl2ZSI9PWJ8fCgibWF0cml4Ij09YXx8Im1hdHJpeDNkIj09YSkmJigibWF0cml4Ij09Ynx8Im1hdHJpeDNkIj09Yil9LG89W10scD1bXSxxPVtdO2lmKGIubGVuZ3RoIT1jLmxlbmd0aCl7aWYoIWQpcmV0dXJuO3ZhciByPWcoYixjKTtvPVtyWzBdXSxwPVtyWzFdXSxxPVtbIm1hdHJpeCIsW3JbMl1dXV19ZWxzZSBmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl7dmFyIGoscz1iW2ZdLnQsdD1jW2ZdLnQsdT1iW2ZdLmQsdj1jW2ZdLmQsdz1uW3NdLHg9blt0XTtpZihtKHMsdCkpe2lmKCFkKXJldHVybjt2YXIgcj1nKFtiW2ZdXSxbY1tmXV0pO28ucHVzaChyWzBdKSxwLnB1c2goclsxXSkscS5wdXNoKFsibWF0cml4IixbclsyXV1dKX1lbHNle2lmKHM9PXQpaj1zO2Vsc2UgaWYod1syXSYmeFsyXSYmaChzKT09aCh0KSlqPWgocyksdT13WzJdKHUpLHY9eFsyXSh2KTtlbHNle2lmKCF3WzFdfHwheFsxXXx8aShzKSE9aSh0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoYixjKTtvPVtyWzBdXSxwPVtyWzFdXSxxPVtbIm1hdHJpeCIsW3JbMl1dXV07YnJlYWt9aj1pKHMpLHU9d1sxXSh1KSx2PXhbMV0odil9Zm9yKHZhciB5PVtdLHo9W10sQT1bXSxCPTA7Qjx1Lmxlbmd0aDtCKyspe3ZhciBDPSJudW1iZXIiPT10eXBlb2YgdVtCXT9hLm1lcmdlTnVtYmVyczphLm1lcmdlRGltZW5zaW9ucyxyPUModVtCXSx2W0JdKTt5W0JdPXJbMF0seltCXT1yWzFdLEEucHVzaChyWzJdKX1vLnB1c2goeSkscC5wdXNoKHopLHEucHVzaChbaixBXSl9fWlmKGUpe3ZhciBEPW87bz1wLHA9RH1yZXR1cm5bbyxwLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWEubWFwKGZ1bmN0aW9uKGEsYyl7cmV0dXJuIHFbYl1bMV1bY10oYSl9KS5qb2luKCIsIik7cmV0dXJuIm1hdHJpeCI9PXFbYl1bMF0mJjE2PT1jLnNwbGl0KCIsIikubGVuZ3RoJiYocVtiXVswXT0ibWF0cml4M2QiKSxxW2JdWzBdKyIoIitjKyIpIn0pLmpvaW4oIiAiKX1dfXZhciBrPW51bGwsbD17cHg6MH0sbT17ZGVnOjB9LG49e21hdHJpeDpbIk5OTk5OTiIsW2ssaywwLDAsayxrLDAsMCwwLDAsMSwwLGssaywwLDFdLGRdLG1hdHJpeDNkOlsiTk5OTk5OTk5OTk5OTk5OTiIsZF0scm90YXRlOlsiQSJdLHJvdGF0ZXg6WyJBIl0scm90YXRleTpbIkEiXSxyb3RhdGV6OlsiQSJdLHJvdGF0ZTNkOlsiTk5OQSJdLHBlcnNwZWN0aXZlOlsiTCJdLHNjYWxlOlsiTm4iLGMoW2ssaywxXSksZF0sc2NhbGV4OlsiTiIsYyhbaywxLDFdKSxjKFtrLDFdKV0sc2NhbGV5OlsiTiIsYyhbMSxrLDFdKSxjKFsxLGtdKV0sc2NhbGV6OlsiTiIsYyhbMSwxLGtdKV0sc2NhbGUzZDpbIk5OTiIsZF0sc2tldzpbIkFhIixudWxsLGRdLHNrZXd4OlsiQSIsbnVsbCxjKFtrLG1dKV0sc2tld3k6WyJBIixudWxsLGMoW20sa10pXSx0cmFuc2xhdGU6WyJUdCIsYyhbayxrLGxdKSxkXSx0cmFuc2xhdGV4OlsiVCIsYyhbayxsLGxdKSxjKFtrLGxdKV0sdHJhbnNsYXRleTpbIlQiLGMoW2wsayxsXSksYyhbbCxrXSldLHRyYW5zbGF0ZXo6WyJMIixjKFtsLGwsa10pXSx0cmFuc2xhdGUzZDpbIlRUTCIsZF19O2EuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxqLFsidHJhbnNmb3JtIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2IuY29uY2F0KFthXSkuZm9yRWFjaChmdW5jdGlvbihiKXtiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmKGRbYV09Yil9KX12YXIgZD17fTtjKCJ0cmFuc2Zvcm0iLFsid2Via2l0VHJhbnNmb3JtIiwibXNUcmFuc2Zvcm0iXSksYygidHJhbnNmb3JtT3JpZ2luIixbIndlYmtpdFRyYW5zZm9ybU9yaWdpbiJdKSxjKCJwZXJzcGVjdGl2ZSIsWyJ3ZWJraXRQZXJzcGVjdGl2ZSJdKSxjKCJwZXJzcGVjdGl2ZU9yaWdpbiIsWyJ3ZWJraXRQZXJzcGVjdGl2ZU9yaWdpbiJdKSxhLnByb3BlcnR5TmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gZFthXXx8YX19KGQsZil9KCksIWZ1bmN0aW9uKCl7aWYodm9pZCAwPT09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikuYW5pbWF0ZShbXSkub25jYW5jZWwpe3ZhciBhO2lmKHdpbmRvdy5wZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93KXZhciBhPWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTtlbHNlIHZhciBhPWZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9O3ZhciBiPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnRhcmdldD1hLHRoaXMuY3VycmVudFRpbWU9Yix0aGlzLnRpbWVsaW5lVGltZT1jLHRoaXMudHlwZT0iY2FuY2VsIix0aGlzLmJ1YmJsZXM9ITEsdGhpcy5jYW5jZWxhYmxlPSExLHRoaXMuY3VycmVudFRhcmdldD1hLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMSx0aGlzLmV2ZW50UGhhc2U9RXZlbnQuQVRfVEFSR0VULHRoaXMudGltZVN0YW1wPURhdGUubm93KCl9LGM9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU7d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oZCxlKXt2YXIgZj1jLmNhbGwodGhpcyxkLGUpO2YuX2NhbmNlbEhhbmRsZXJzPVtdLGYub25jYW5jZWw9bnVsbDt2YXIgZz1mLmNhbmNlbDtmLmNhbmNlbD1mdW5jdGlvbigpe2cuY2FsbCh0aGlzKTt2YXIgYz1uZXcgYih0aGlzLG51bGwsYSgpKSxkPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmNvbmNhdCh0aGlzLm9uY2FuY2VsP1t0aGlzLm9uY2FuY2VsXTpbXSk7c2V0VGltZW91dChmdW5jdGlvbigpe2QuZm9yRWFjaChmdW5jdGlvbihhKXthLmNhbGwoYy50YXJnZXQsYyl9KX0sMCl9O3ZhciBoPWYuYWRkRXZlbnRMaXN0ZW5lcjtmLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXsiZnVuY3Rpb24iPT10eXBlb2YgYiYmImNhbmNlbCI9PWE/dGhpcy5fY2FuY2VsSGFuZGxlcnMucHVzaChiKTpoLmNhbGwodGhpcyxhLGIpfTt2YXIgaT1mLnJlbW92ZUV2ZW50TGlzdGVuZXI7cmV0dXJuIGYucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpe2lmKCJjYW5jZWwiPT1hKXt2YXIgYz10aGlzLl9jYW5jZWxIYW5kbGVycy5pbmRleE9mKGIpO2M+PTAmJnRoaXMuX2NhbmNlbEhhbmRsZXJzLnNwbGljZShjLDEpfWVsc2UgaS5jYWxsKHRoaXMsYSxiKX0sZn19fSgpLGZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxjPW51bGwsZD0hMTt0cnl7dmFyIGU9Z2V0Q29tcHV0ZWRTdHlsZShiKS5nZXRQcm9wZXJ0eVZhbHVlKCJvcGFjaXR5IiksZj0iMCI9PWU/IjEiOiIwIjtjPWIuYW5pbWF0ZSh7b3BhY2l0eTpbZixmXX0se2R1cmF0aW9uOjF9KSxjLmN1cnJlbnRUaW1lPTAsZD1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKT09Zn1jYXRjaChnKXt9ZmluYWxseXtjJiZjLmNhbmNlbCgpfWlmKCFkKXt2YXIgaD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihiLGMpe3JldHVybiB3aW5kb3cuU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3ImJkFycmF5LnByb3RvdHlwZS5mcm9tJiZiW1N5bWJvbC5pdGVyYXRvcl0mJihiPUFycmF5LmZyb20oYikpLEFycmF5LmlzQXJyYXkoYil8fG51bGw9PT1ifHwoYj1hLmNvbnZlcnRUb0FycmF5Rm9ybShiKSksaC5jYWxsKHRoaXMsYixjKX19fShjKSwhZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lO2IuY3VycmVudFRpbWU9YSxiLl9kaXNjYXJkQW5pbWF0aW9ucygpLDA9PWIuX2FuaW1hdGlvbnMubGVuZ3RoP2Y9ITE6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGQpOwp9dmFyIGU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBlKGZ1bmN0aW9uKGIpe3dpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksYShiKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpfSl9LGIuQW5pbWF0aW9uVGltZWxpbmU9ZnVuY3Rpb24oKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9dm9pZCAwfSxiLkFuaW1hdGlvblRpbWVsaW5lLnByb3RvdHlwZT17Z2V0QW5pbWF0aW9uczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNjYXJkQW5pbWF0aW9ucygpLHRoaXMuX2FuaW1hdGlvbnMuc2xpY2UoKX0sX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlczpmdW5jdGlvbigpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl91cGRhdGVQcm9taXNlcygpfSl9LF9kaXNjYXJkQW5pbWF0aW9uczpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbnM9dGhpcy5fYW5pbWF0aW9ucy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImZpbmlzaGVkIiE9YS5wbGF5U3RhdGUmJiJpZGxlIiE9YS5wbGF5U3RhdGV9KX0sX3BsYXk6ZnVuY3Rpb24oYSl7dmFyIGM9bmV3IGIuQW5pbWF0aW9uKGEsdGhpcyk7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbnMucHVzaChjKSxiLnJlc3RhcnRXZWJBbmltYXRpb25zTmV4dFRpY2soKSxjLl91cGRhdGVQcm9taXNlcygpLGMuX2FuaW1hdGlvbi5wbGF5KCksYy5fdXBkYXRlUHJvbWlzZXMoKSxjfSxwbGF5OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLnJlbW92ZSgpLHRoaXMuX3BsYXkoYSl9fTt2YXIgZj0hMTtiLnJlc3RhcnRXZWJBbmltYXRpb25zTmV4dFRpY2s9ZnVuY3Rpb24oKXtmfHwoZj0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCkpfTt2YXIgZz1uZXcgYi5BbmltYXRpb25UaW1lbGluZTtiLnRpbWVsaW5lPWc7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuZG9jdW1lbnQsInRpbWVsaW5lIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBnfX0pfWNhdGNoKGgpe310cnl7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lPWd9Y2F0Y2goaCl7fX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXM9W10sYi5BbmltYXRpb249ZnVuY3Rpb24oYixjKXtpZih0aGlzLmlkPSIiLGImJmIuX2lkJiYodGhpcy5pZD1iLl9pZCksdGhpcy5lZmZlY3Q9YixiJiYoYi5fYW5pbWF0aW9uPXRoaXMpLCFjKXRocm93IG5ldyBFcnJvcigiQW5pbWF0aW9uIHdpdGggbnVsbCB0aW1lbGluZSBpcyBub3Qgc3VwcG9ydGVkIik7dGhpcy5fdGltZWxpbmU9Yyx0aGlzLl9zZXF1ZW5jZU51bWJlcj1hLnNlcXVlbmNlTnVtYmVyKyssdGhpcy5faG9sZFRpbWU9MCx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5faXNHcm91cD0hMSx0aGlzLl9hbmltYXRpb249bnVsbCx0aGlzLl9jaGlsZEFuaW1hdGlvbnM9W10sdGhpcy5fY2FsbGJhY2s9bnVsbCx0aGlzLl9vbGRQbGF5U3RhdGU9ImlkbGUiLHRoaXMuX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X3VwZGF0ZVByb21pc2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fb2xkUGxheVN0YXRlLGI9dGhpcy5wbGF5U3RhdGU7cmV0dXJuIHRoaXMuX3JlYWR5UHJvbWlzZSYmYiE9PWEmJigiaWRsZSI9PWI/KHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZSgpLHRoaXMuX3JlYWR5UHJvbWlzZT12b2lkIDApOiJwZW5kaW5nIj09YT90aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlKCk6InBlbmRpbmciPT1iJiYodGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCkpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZSYmYiE9PWEmJigiaWRsZSI9PWI/KHRoaXMuX3JlamVjdEZpbmlzaGVkUHJvbWlzZSgpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApOiJmaW5pc2hlZCI9PWI/dGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpOiJmaW5pc2hlZCI9PWEmJih0aGlzLl9maW5pc2hlZFByb21pc2U9dm9pZCAwKSksdGhpcy5fb2xkUGxheVN0YXRlPXRoaXMucGxheVN0YXRlLHRoaXMuX3JlYWR5UHJvbWlzZXx8dGhpcy5fZmluaXNoZWRQcm9taXNlfSxfcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBhLGMsZCxlLGY9ISF0aGlzLl9hbmltYXRpb247ZiYmKGE9dGhpcy5wbGF5YmFja1JhdGUsYz10aGlzLl9wYXVzZWQsZD10aGlzLnN0YXJ0VGltZSxlPXRoaXMuY3VycmVudFRpbWUsdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvbi5fd3JhcHBlcj1udWxsLHRoaXMuX2FuaW1hdGlvbj1udWxsKSwoIXRoaXMuZWZmZWN0fHx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5LZXlmcmFtZUVmZmVjdCkmJih0aGlzLl9hbmltYXRpb249Yi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcy5lZmZlY3QpLGIuYmluZEFuaW1hdGlvbkZvcktleWZyYW1lRWZmZWN0KHRoaXMpKSwodGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yR3JvdXAodGhpcykpLHRoaXMuZWZmZWN0JiZ0aGlzLmVmZmVjdC5fb25zYW1wbGUmJmIuYmluZEFuaW1hdGlvbkZvckN1c3RvbUVmZmVjdCh0aGlzKSxmJiYoMSE9YSYmKHRoaXMucGxheWJhY2tSYXRlPWEpLG51bGwhPT1kP3RoaXMuc3RhcnRUaW1lPWQ6bnVsbCE9PWU/dGhpcy5jdXJyZW50VGltZT1lOm51bGwhPT10aGlzLl9ob2xkVGltZSYmKHRoaXMuY3VycmVudFRpbWU9dGhpcy5faG9sZFRpbWUpLGMmJnRoaXMucGF1c2UoKSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sX3VwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKCl7aWYodGhpcy5lZmZlY3QmJiJpZGxlIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBhPXRoaXMuZWZmZWN0Ll90aW1pbmcuZGVsYXk7dGhpcy5fY2hpbGRBbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24oYyl7dGhpcy5fYXJyYW5nZUNoaWxkcmVuKGMsYSksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihhKz1iLmdyb3VwQ2hpbGREdXJhdGlvbihjLmVmZmVjdCkpfS5iaW5kKHRoaXMpKX19LF9zZXRFeHRlcm5hbEFuaW1hdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmVmZmVjdCYmdGhpcy5faXNHcm91cClmb3IodmFyIGI9MDtiPHRoaXMuZWZmZWN0LmNoaWxkcmVuLmxlbmd0aDtiKyspdGhpcy5lZmZlY3QuY2hpbGRyZW5bYl0uX2FuaW1hdGlvbj1hLHRoaXMuX2NoaWxkQW5pbWF0aW9uc1tiXS5fc2V0RXh0ZXJuYWxBbmltYXRpb24oYSl9LF9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmdGhpcy5faXNHcm91cCl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9yZW1vdmVDaGlsZEFuaW1hdGlvbnMoKSx0aGlzLmVmZmVjdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPXdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fcGxheShjKTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMucHVzaChkKSxkLnBsYXliYWNrUmF0ZT10aGlzLnBsYXliYWNrUmF0ZSx0aGlzLl9wYXVzZWQmJmQucGF1c2UoKSxjLl9hbmltYXRpb249dGhpcy5lZmZlY3QuX2FuaW1hdGlvbix0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oZCxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMpKX0uYmluZCh0aGlzKSl9fSxfYXJyYW5nZUNoaWxkcmVuOmZ1bmN0aW9uKGEsYil7bnVsbD09PXRoaXMuc3RhcnRUaW1lP2EuY3VycmVudFRpbWU9dGhpcy5jdXJyZW50VGltZS1iL3RoaXMucGxheWJhY2tSYXRlOmEuc3RhcnRUaW1lIT09dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSYmKGEuc3RhcnRUaW1lPXRoaXMuc3RhcnRUaW1lK2IvdGhpcy5wbGF5YmFja1JhdGUpfSxnZXQgdGltZWxpbmUoKXtyZXR1cm4gdGhpcy5fdGltZWxpbmV9LGdldCBwbGF5U3RhdGUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uP3RoaXMuX2FuaW1hdGlvbi5wbGF5U3RhdGU6ImlkbGUifSxnZXQgZmluaXNoZWQoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX2ZpbmlzaGVkUHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fZmluaXNoZWRQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdEZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksImZpbmlzaGVkIj09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVGaW5pc2hlZFByb21pc2UoKSksdGhpcy5fZmluaXNoZWRQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IHJlYWR5KCl7cmV0dXJuIHdpbmRvdy5Qcm9taXNlPyh0aGlzLl9yZWFkeVByb21pc2V8fCgtMT09Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmluZGV4T2YodGhpcykmJmIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5wdXNoKHRoaXMpLHRoaXMuX3JlYWR5UHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXthKHRoaXMpfSx0aGlzLl9yZWplY3RSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXtiKHt0eXBlOkRPTUV4Y2VwdGlvbi5BQk9SVF9FUlIsbmFtZToiQWJvcnRFcnJvciJ9KX19LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9PXRoaXMucGxheVN0YXRlJiZ0aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlKCkpLHRoaXMuX3JlYWR5UHJvbWlzZSk6KGNvbnNvbGUud2FybigiQW5pbWF0aW9uIFByb21pc2VzIHJlcXVpcmUgSmF2YVNjcmlwdCBQcm9taXNlIGNvbnN0cnVjdG9yIiksbnVsbCl9LGdldCBvbmZpbmlzaCgpe3JldHVybiB0aGlzLl9hbmltYXRpb24ub25maW5pc2h9LHNldCBvbmZpbmlzaChhKXsiZnVuY3Rpb24iPT10eXBlb2YgYT90aGlzLl9hbmltYXRpb24ub25maW5pc2g9ZnVuY3Rpb24oYil7Yi50YXJnZXQ9dGhpcyxhLmNhbGwodGhpcyxiKX0uYmluZCh0aGlzKTp0aGlzLl9hbmltYXRpb24ub25maW5pc2g9YX0sZ2V0IG9uY2FuY2VsKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmNhbmNlbH0sc2V0IG9uY2FuY2VsKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmNhbmNlbD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmNhbmNlbD1hfSxnZXQgY3VycmVudFRpbWUoKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBhPXRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZTtyZXR1cm4gdGhpcy5fdXBkYXRlUHJvbWlzZXMoKSxhfSxzZXQgY3VycmVudFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uY3VycmVudFRpbWU9aXNGaW5pdGUoYSk/YTpNYXRoLnNpZ24oYSkqTnVtYmVyLk1BWF9WQUxVRSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiLGMpe2IuY3VycmVudFRpbWU9YS1jfSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sZ2V0IHN0YXJ0VGltZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLnN0YXJ0VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5zdGFydFRpbWU9YStjfSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24ucGxheWJhY2tSYXRlfSxzZXQgcGxheWJhY2tSYXRlKGEpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGI9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucGxheWJhY2tSYXRlPWEsdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIpe2IucGxheWJhY2tSYXRlPWF9KSwicGF1c2VkIiE9dGhpcy5wbGF5U3RhdGUmJiJpZGxlIiE9dGhpcy5wbGF5U3RhdGUmJnRoaXMucGxheSgpLG51bGwhPT1iJiYodGhpcy5jdXJyZW50VGltZT1iKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5fYW5pbWF0aW9uLnBsYXkoKSwtMT09dGhpcy5fdGltZWxpbmUuX2FuaW1hdGlvbnMuaW5kZXhPZih0aGlzKSYmdGhpcy5fdGltZWxpbmUuX2FuaW1hdGlvbnMucHVzaCh0aGlzKSx0aGlzLl9yZWdpc3RlcigpLGIuYXdhaXRTdGFydFRpbWUodGhpcyksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe3ZhciBiPWEuY3VycmVudFRpbWU7YS5wbGF5KCksYS5jdXJyZW50VGltZT1ifSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuY3VycmVudFRpbWUmJih0aGlzLl9ob2xkVGltZT10aGlzLmN1cnJlbnRUaW1lKSx0aGlzLl9hbmltYXRpb24ucGF1c2UoKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnBhdXNlKCl9KSx0aGlzLl9wYXVzZWQ9ITAsdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uZmluaXNoKCksdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jYW5jZWwoKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHJldmVyc2U6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBhPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fYW5pbWF0aW9uLnJldmVyc2UoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7YS5yZXZlcnNlKCl9KSxudWxsIT09YSYmKHRoaXMuY3VycmVudFRpbWU9YSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpe3ZhciBjPWI7ImZ1bmN0aW9uIj09dHlwZW9mIGImJihjPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PXRoaXMsYi5jYWxsKHRoaXMsYSl9LmJpbmQodGhpcyksYi5fd3JhcHBlcj1jKSx0aGlzLl9hbmltYXRpb24uYWRkRXZlbnRMaXN0ZW5lcihhLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dGhpcy5fYW5pbWF0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxiJiZiLl93cmFwcGVyfHxiKX0sX3JlbW92ZUNoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2Zvcig7dGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDspdGhpcy5fY2hpbGRBbmltYXRpb25zLnBvcCgpLmNhbmNlbCgpfSxfZm9yRWFjaENoaWxkOmZ1bmN0aW9uKGIpe3ZhciBjPTA7aWYodGhpcy5lZmZlY3QuY2hpbGRyZW4mJnRoaXMuX2NoaWxkQW5pbWF0aW9ucy5sZW5ndGg8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoJiZ0aGlzLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSx0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihhKXtiLmNhbGwodGhpcyxhLGMpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYys9YS5lZmZlY3QuYWN0aXZlRHVyYXRpb24pfS5iaW5kKHRoaXMpKSwicGVuZGluZyIhPXRoaXMucGxheVN0YXRlKXt2YXIgZD10aGlzLmVmZmVjdC5fdGltaW5nLGU9dGhpcy5jdXJyZW50VGltZTtudWxsIT09ZSYmKGU9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihkKSxlLGQpKSwobnVsbD09ZXx8aXNOYU4oZSkpJiZ0aGlzLl9yZW1vdmVDaGlsZEFuaW1hdGlvbnMoKX19fSx3aW5kb3cuQW5pbWF0aW9uPWIuQW5pbWF0aW9ufShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dGhpcy5fZnJhbWVzPWEubm9ybWFsaXplS2V5ZnJhbWVzKGIpfWZ1bmN0aW9uIGUoKXtmb3IodmFyIGE9ITE7aS5sZW5ndGg7KXt2YXIgYj1pLnNoaWZ0KCk7Yi5fdXBkYXRlQ2hpbGRyZW4oKSxhPSEwfXJldHVybiBhfXZhciBmPWZ1bmN0aW9uKGEpe2lmKGEuX2FuaW1hdGlvbj12b2lkIDAsYSBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8YSBpbnN0YW5jZW9mIHdpbmRvdy5Hcm91cEVmZmVjdClmb3IodmFyIGI9MDtiPGEuY2hpbGRyZW4ubGVuZ3RoO2IrKylmKGEuY2hpbGRyZW5bYl0pfTtiLnJlbW92ZU11bHRpPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107ZC5fcGFyZW50PygtMT09Yi5pbmRleE9mKGQuX3BhcmVudCkmJmIucHVzaChkLl9wYXJlbnQpLGQuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoZC5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoZCksMSksZC5fcGFyZW50PW51bGwsZihkKSk6ZC5fYW5pbWF0aW9uJiZkLl9hbmltYXRpb24uZWZmZWN0PT1kJiYoZC5fYW5pbWF0aW9uLmNhbmNlbCgpLGQuX2FuaW1hdGlvbi5lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KG51bGwsW10pLGQuX2FuaW1hdGlvbi5fY2FsbGJhY2smJihkLl9hbmltYXRpb24uX2NhbGxiYWNrLl9hbmltYXRpb249bnVsbCksZC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpLGYoZCkpfWZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5fcmVidWlsZCgpfSxiLktleWZyYW1lRWZmZWN0PWZ1bmN0aW9uKGIsYyxlLGYpe3JldHVybiB0aGlzLnRhcmdldD1iLHRoaXMuX3BhcmVudD1udWxsLGU9YS5udW1lcmljVGltaW5nVG9PYmplY3QoZSksdGhpcy5fdGltaW5nSW5wdXQ9YS5jbG9uZVRpbWluZ0lucHV0KGUpLHRoaXMuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGUpLHRoaXMudGltaW5nPWEubWFrZVRpbWluZyhlLCExLHRoaXMpLHRoaXMudGltaW5nLl9lZmZlY3Q9dGhpcywiZnVuY3Rpb24iPT10eXBlb2YgYz8oYS5kZXByZWNhdGVkKCJDdXN0b20gS2V5ZnJhbWVFZmZlY3QiLCIyMDE1LTA2LTIyIiwiVXNlIEtleWZyYW1lRWZmZWN0Lm9uc2FtcGxlIGluc3RlYWQuIiksdGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcz1jKTp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPW5ldyBkKGMpLHRoaXMuX2tleWZyYW1lcz1jLHRoaXMuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl90aW1pbmcpLHRoaXMuX2lkPWYsdGhpc30sYi5LZXlmcmFtZUVmZmVjdC5wcm90b3R5cGU9e2dldEZyYW1lczpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzP3RoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM6dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcy5fZnJhbWVzfSxzZXQgb25zYW1wbGUoYSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZ2V0RnJhbWVzKCkpdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nIG9uc2FtcGxlIG9uIGN1c3RvbSBlZmZlY3QgS2V5ZnJhbWVFZmZlY3QgaXMgbm90IHN1cHBvcnRlZC4iKTt0aGlzLl9vbnNhbXBsZT1hLHRoaXMuX2FuaW1hdGlvbiYmdGhpcy5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpfSxnZXQgcGFyZW50KCl7cmV0dXJuIHRoaXMuX3BhcmVudH0sY2xvbmU6ZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIkNsb25pbmcgY3VzdG9tIGVmZmVjdHMgaXMgbm90IHN1cHBvcnRlZC4iKTt2YXIgYj1uZXcgS2V5ZnJhbWVFZmZlY3QodGhpcy50YXJnZXQsW10sYS5jbG9uZVRpbWluZ0lucHV0KHRoaXMuX3RpbWluZ0lucHV0KSx0aGlzLl9pZCk7cmV0dXJuIGIuX25vcm1hbGl6ZWRLZXlmcmFtZXM9dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcyxiLl9rZXlmcmFtZXM9dGhpcy5fa2V5ZnJhbWVzLGJ9LHJlbW92ZTpmdW5jdGlvbigpe2IucmVtb3ZlTXVsdGkoW3RoaXNdKX19O3ZhciBnPUVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU7RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihhLGMpe3ZhciBkPSIiO3JldHVybiBjJiZjLmlkJiYoZD1jLmlkKSxiLnRpbWVsaW5lLl9wbGF5KG5ldyBiLktleWZyYW1lRWZmZWN0KHRoaXMsYSxjLGQpKX07dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2Iik7Yi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9YS50YXJnZXR8fGgsYz1hLl9rZXlmcmFtZXM7ImZ1bmN0aW9uIj09dHlwZW9mIGMmJihjPVtdKTt2YXIgZD1hLl90aW1pbmdJbnB1dDtkLmlkPWEuX2lkfWVsc2UgdmFyIGI9aCxjPVtdLGQ9MDtyZXR1cm4gZy5hcHBseShiLFtjLGRdKX0sYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYSl7YS5lZmZlY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmVmZmVjdC5fbm9ybWFsaXplZEtleWZyYW1lcyYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KGEpfTt2YXIgaT1bXTtiLmF3YWl0U3RhcnRUaW1lPWZ1bmN0aW9uKGEpe251bGw9PT1hLnN0YXJ0VGltZSYmYS5faXNHcm91cCYmKDA9PWkubGVuZ3RoJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSksaS5wdXNoKGEpKX07dmFyIGo9d2luZG93LmdldENvbXB1dGVkU3R5bGU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywiZ2V0Q29tcHV0ZWRTdHlsZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKTt2YXIgYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZSgpJiYoYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksd2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhfX0pLHdpbmRvdy5LZXlmcmFtZUVmZmVjdD1iLktleWZyYW1lRWZmZWN0LHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBbmltYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LnRpbWVsaW5lLmdldEFuaW1hdGlvbnMoKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hLmVmZmVjdCYmYS5lZmZlY3QudGFyZ2V0PT10aGlzfS5iaW5kKHRoaXMpKX19KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXthLl9yZWdpc3RlcmVkfHwoYS5fcmVnaXN0ZXJlZD0hMCxnLnB1c2goYSksaHx8KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKSl9ZnVuY3Rpb24gZShhKXt2YXIgYj1nO2c9W10sYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfSksYj1iLmZpbHRlcihmdW5jdGlvbihhKXthKCk7dmFyIGI9YS5fYW5pbWF0aW9uP2EuX2FuaW1hdGlvbi5wbGF5U3RhdGU6ImlkbGUiO3JldHVybiJydW5uaW5nIiE9YiYmInBlbmRpbmciIT1iJiYoYS5fcmVnaXN0ZXJlZD0hMSksYS5fcmVnaXN0ZXJlZH0pLGcucHVzaC5hcHBseShnLGIpLGcubGVuZ3RoPyhoPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShlKSk6aD0hMX12YXIgZj0oZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksMCk7Yi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0PWZ1bmN0aW9uKGIpe3ZhciBjLGU9Yi5lZmZlY3QudGFyZ2V0LGc9ImZ1bmN0aW9uIj09dHlwZW9mIGIuZWZmZWN0LmdldEZyYW1lcygpO2M9Zz9iLmVmZmVjdC5nZXRGcmFtZXMoKTpiLmVmZmVjdC5fb25zYW1wbGU7dmFyIGg9Yi5lZmZlY3QudGltaW5nLGk9bnVsbDtoPWEubm9ybWFsaXplVGltaW5nSW5wdXQoaCk7dmFyIGo9ZnVuY3Rpb24oKXt2YXIgZD1qLl9hbmltYXRpb24/ai5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lOm51bGw7bnVsbCE9PWQmJihkPWEuY2FsY3VsYXRlVGltZUZyYWN0aW9uKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oaCksZCxoKSxpc05hTihkKSYmKGQ9bnVsbCkpLGQhPT1pJiYoZz9jKGQsZSxiLmVmZmVjdCk6YyhkLGIuZWZmZWN0LGIuZWZmZWN0Ll9hbmltYXRpb24pKSxpPWR9O2ouX2FuaW1hdGlvbj1iLGouX3JlZ2lzdGVyZWQ9ITEsai5fc2VxdWVuY2VOdW1iZXI9ZisrLGIuX2NhbGxiYWNrPWosZChqKX07dmFyIGc9W10saD0hMTtiLkFuaW1hdGlvbi5wcm90b3R5cGUuX3JlZ2lzdGVyPWZ1bmN0aW9uKCl7dGhpcy5fY2FsbGJhY2smJmQodGhpcy5fY2FsbGJhY2spfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLl90aW1pbmcuZGVsYXkrYS5hY3RpdmVEdXJhdGlvbithLl90aW1pbmcuZW5kRGVsYXl9ZnVuY3Rpb24gZShiLGMsZCl7dGhpcy5faWQ9ZCx0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPWJ8fFtdLHRoaXMuX3JlcGFyZW50KHRoaXMuY2hpbGRyZW4pLGM9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYyksdGhpcy5fdGltaW5nSW5wdXQ9YS5jbG9uZVRpbWluZ0lucHV0KGMpLHRoaXMuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMsITApLHRoaXMudGltaW5nPWEubWFrZVRpbWluZyhjLCEwLHRoaXMpLHRoaXMudGltaW5nLl9lZmZlY3Q9dGhpcywiYXV0byI9PT10aGlzLl90aW1pbmcuZHVyYXRpb24mJih0aGlzLl90aW1pbmcuZHVyYXRpb249dGhpcy5hY3RpdmVEdXJhdGlvbil9d2luZG93LlNlcXVlbmNlRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHdpbmRvdy5Hcm91cEVmZmVjdD1mdW5jdGlvbigpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZT17X2lzQW5jZXN0b3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXM7bnVsbCE9PWI7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fcGFyZW50fXJldHVybiExfSxfcmVidWlsZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzO2E7KSJhdXRvIj09PWEudGltaW5nLmR1cmF0aW9uJiYoYS5fdGltaW5nLmR1cmF0aW9uPWEuYWN0aXZlRHVyYXRpb24pLGE9YS5fcGFyZW50O3RoaXMuX2FuaW1hdGlvbiYmdGhpcy5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpfSxfcmVwYXJlbnQ6ZnVuY3Rpb24oYSl7Yi5yZW1vdmVNdWx0aShhKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLl9wYXJlbnQ9dGhpc30sX3B1dENoaWxkOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWI/IkNhbm5vdCBhcHBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiI6IkNhbm5vdCBwcmVwZW5kIGFuIGFuY2VzdG9yIG9yIHNlbGYiLGQ9MDtkPGEubGVuZ3RoO2QrKylpZih0aGlzLl9pc0FuY2VzdG9yKGFbZF0pKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUixuYW1lOiJIaWVyYXJjaHlSZXF1ZXN0RXJyb3IiLG1lc3NhZ2U6Y307Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYj90aGlzLmNoaWxkcmVuLnB1c2goYVtkXSk6dGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFbZF0pO3RoaXMuX3JlcGFyZW50KGEpLHRoaXMuX3JlYnVpbGQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCEwKX0scHJlcGVuZDpmdW5jdGlvbigpe3RoaXMuX3B1dENoaWxkKGFyZ3VtZW50cywhMSl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxnZXQgZmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuWzBdOm51bGx9LGdldCBsYXN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg/dGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aC0xXTpudWxsfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYj1hLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLGM9W10sZD0wO2Q8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZCsrKWMucHVzaCh0aGlzLmNoaWxkcmVuW2RdLmNsb25lKCkpO3JldHVybiB0aGlzIGluc3RhbmNlb2YgR3JvdXBFZmZlY3Q/bmV3IEdyb3VwRWZmZWN0KGMsYik6bmV3IFNlcXVlbmNlRWZmZWN0KGMsYil9LHJlbW92ZTpmdW5jdGlvbigpe2IucmVtb3ZlTXVsdGkoW3RoaXNdKX19LHdpbmRvdy5TZXF1ZW5jZUVmZmVjdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5TZXF1ZW5jZUVmZmVjdC5wcm90b3R5cGUsImFjdGl2ZUR1cmF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2ErPWQoYil9KSxNYXRoLm1heChhLDApfX0pLHdpbmRvdy5Hcm91cEVmZmVjdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5Hcm91cEVmZmVjdC5wcm90b3R5cGUsImFjdGl2ZUR1cmF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2E9TWF0aC5tYXgoYSxkKGIpKX0pLGF9fSksYi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yR3JvdXA9ZnVuY3Rpb24oYyl7dmFyIGQsZT1udWxsLGY9ZnVuY3Rpb24oYil7dmFyIGM9ZC5fd3JhcHBlcjtyZXR1cm4gYyYmInBlbmRpbmciIT1jLnBsYXlTdGF0ZSYmYy5lZmZlY3Q/bnVsbD09Yj92b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpOjA9PWImJmMucGxheWJhY2tSYXRlPDAmJihlfHwoZT1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMuZWZmZWN0LnRpbWluZykpLGI9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihlKSwtMSxlKSxpc05hTihiKXx8bnVsbD09Yik/KGMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLmN1cnJlbnRUaW1lPS0xfSksdm9pZCBjLl9yZW1vdmVDaGlsZEFuaW1hdGlvbnMoKSk6dm9pZCAwOnZvaWQgMH0sZz1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSxjLl90aW1pbmcsYy5faWQpO3JldHVybiBnLm9uc2FtcGxlPWYsZD1iLnRpbWVsaW5lLl9wbGF5KGcpfSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihhKXthLl9hbmltYXRpb24uX3dyYXBwZXI9YSxhLl9pc0dyb3VwPSEwLGIuYXdhaXRTdGFydFRpbWUoYSksYS5fY29uc3RydWN0Q2hpbGRBbmltYXRpb25zKCksYS5fc2V0RXh0ZXJuYWxBbmltYXRpb24oYSl9LGIuZ3JvdXBDaGlsZER1cmF0aW9uPWR9KGMsZSxmKSxiWyJ0cnVlIl09YX0oe30sZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKSk7Cjwvc2NyaXB0PjxzY3JpcHQ+LyoqCkBsaWNlbnNlIEBub2NvbXBpbGUKQ29weXJpZ2h0IChjKSAyMDE4IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KKGZ1bmN0aW9uKCl7LyoKCiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCid1c2Ugc3RyaWN0Jzt2YXIgbixwPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c9PT10aGlzP3RoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJm51bGwhPWdsb2JhbD9nbG9iYWw6dGhpcyxhYT0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGEsYixjKXthIT1BcnJheS5wcm90b3R5cGUmJmEhPU9iamVjdC5wcm90b3R5cGUmJihhW2JdPWMudmFsdWUpfTtmdW5jdGlvbiBiYSgpe2JhPWZ1bmN0aW9uKCl7fTtwLlN5bWJvbHx8KHAuU3ltYm9sPWNhKX12YXIgY2E9ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4ianNjb21wX3N5bWJvbF8iKyhifHwiIikrYSsrfX0oKTsKZnVuY3Rpb24gZGEoKXtiYSgpO3ZhciBhPXAuU3ltYm9sLml0ZXJhdG9yO2F8fChhPXAuU3ltYm9sLml0ZXJhdG9yPXAuU3ltYm9sKCJpdGVyYXRvciIpKTsiZnVuY3Rpb24iIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW2FdJiZhYShBcnJheS5wcm90b3R5cGUsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGVhKHRoaXMpfX0pO2RhPWZ1bmN0aW9uKCl7fX1mdW5jdGlvbiBlYShhKXt2YXIgYj0wO3JldHVybiBmYShmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fSl9ZnVuY3Rpb24gZmEoYSl7ZGEoKTthPXtuZXh0OmF9O2FbcC5TeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3JldHVybiBhfWZ1bmN0aW9uIGlhKGEpe2RhKCk7dmFyIGI9YVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBiP2IuY2FsbChhKTplYShhKX0KZnVuY3Rpb24gamEoYSl7Zm9yKHZhciBiLGM9W107IShiPWEubmV4dCgpKS5kb25lOyljLnB1c2goYi52YWx1ZSk7cmV0dXJuIGN9CihmdW5jdGlvbigpe2lmKCFmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO2EuaW5pdEV2ZW50KCJmb28iLCEwLCEwKTthLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGEuZGVmYXVsdFByZXZlbnRlZH0oKSl7dmFyIGE9RXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0O0V2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsYWJsZSYmKGEuY2FsbCh0aGlzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZGVmYXVsdFByZXZlbnRlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiEwfSxjb25maWd1cmFibGU6ITB9KSl9fXZhciBiPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCF3aW5kb3cuQ3VzdG9tRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KXdpbmRvdy5DdXN0b21FdmVudD1mdW5jdGlvbihhLGIpe2I9Ynx8e307dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50Iik7CmMuaW5pdEN1c3RvbUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfSx3aW5kb3cuQ3VzdG9tRXZlbnQucHJvdG90eXBlPXdpbmRvdy5FdmVudC5wcm90b3R5cGU7aWYoIXdpbmRvdy5FdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuRXZlbnQpe3ZhciBjPXdpbmRvdy5FdmVudDt3aW5kb3cuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO2MuaW5pdEV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUpO3JldHVybiBjfTtpZihjKWZvcih2YXIgZCBpbiBjKXdpbmRvdy5FdmVudFtkXT1jW2RdO3dpbmRvdy5FdmVudC5wcm90b3R5cGU9Yy5wcm90b3R5cGV9aWYoIXdpbmRvdy5Nb3VzZUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5Nb3VzZUV2ZW50KXtiPXdpbmRvdy5Nb3VzZUV2ZW50O3dpbmRvdy5Nb3VzZUV2ZW50PWZ1bmN0aW9uKGEsCmIpe2I9Ynx8e307dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnQiKTtjLmluaXRNb3VzZUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi52aWV3fHx3aW5kb3csYi5kZXRhaWwsYi5zY3JlZW5YLGIuc2NyZWVuWSxiLmNsaWVudFgsYi5jbGllbnRZLGIuY3RybEtleSxiLmFsdEtleSxiLnNoaWZ0S2V5LGIubWV0YUtleSxiLmJ1dHRvbixiLnJlbGF0ZWRUYXJnZXQpO3JldHVybiBjfTtpZihiKWZvcihkIGluIGIpd2luZG93Lk1vdXNlRXZlbnRbZF09YltkXTt3aW5kb3cuTW91c2VFdmVudC5wcm90b3R5cGU9Yi5wcm90b3R5cGV9QXJyYXkuZnJvbXx8KEFycmF5LmZyb209ZnVuY3Rpb24oYSl7cmV0dXJuW10uc2xpY2UuY2FsbChhKX0pO09iamVjdC5hc3NpZ258fChPYmplY3QuYXNzaWduPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGQ9MCxlO2Q8Yy5sZW5ndGg7ZCsrKWlmKGU9Y1tkXSlmb3IodmFyIGY9CmEsbT1lLHE9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobSkseD0wO3g8cS5sZW5ndGg7eCsrKWU9cVt4XSxmW2VdPW1bZV07cmV0dXJuIGF9KX0pKHdpbmRvdy5XZWJDb21wb25lbnRzKTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7fWZ1bmN0aW9uIGIoYSxiKXtpZighYS5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm5bXTtzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6cmV0dXJuIHVhLmNhbGwoYSxiKTtjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpyZXR1cm4gbGIuY2FsbChhLGIpO2RlZmF1bHQ6cmV0dXJuIFUuY2FsbChhLGIpfX12YXIgYz0idW5kZWZpbmVkIj09PXR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50LGQ9IShkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuY2xvbmVOb2RlKClpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpLGU9ITE7L1RyaWRlbnQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcih2YXIgZDtkPWEuZmlyc3RDaGlsZDspYy5jYWxsKHRoaXMsZCxiKTtlbHNlIGMuY2FsbCh0aGlzLAphLGIpO3JldHVybiBhfWU9ITA7dmFyIGI9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlO05vZGUucHJvdG90eXBlLmNsb25lTm9kZT1mdW5jdGlvbihhKXthPWIuY2FsbCh0aGlzLGEpO3RoaXMgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50JiYoYS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUpO3JldHVybiBhfTtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsO0RvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3I9SFRNTEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3I7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUse25vZGVUeXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFfSxjb25maWd1cmFibGU6ITB9LGxvY2FsTmFtZTp7Z2V0OmZ1bmN0aW9uKCl7fSwKY29uZmlndXJhYmxlOiEwfSxub2RlTmFtZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIiNkb2N1bWVudC1mcmFnbWVudCJ9LGNvbmZpZ3VyYWJsZTohMH19KTt2YXIgYz1Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU7Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWE7dmFyIGQ9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24oYil7YiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/YS5jYWxsKHRoaXMsYixudWxsKTpkLmNhbGwodGhpcyxiKTtyZXR1cm4gYn07dmFyIGY9Tm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQsZz1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQ7Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkPWZ1bmN0aW9uKGIsYyl7YiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/KGEuY2FsbCh0aGlzLGIsYyksZi5jYWxsKHRoaXMsYykpOmcuY2FsbCh0aGlzLGIsYyk7cmV0dXJuIGN9O0RvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50PQpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3JlYXRlRWxlbWVudCgiZGYiKTthLl9fcHJvdG9fXz1Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZTtyZXR1cm4gYX07dmFyIGg9RG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGU7RG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGU9ZnVuY3Rpb24oYSxiKXtiPWguY2FsbCh0aGlzLGEsYnx8ITEpO2EgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50JiYoYi5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUpO3JldHVybiBifX0oKTt2YXIgZj1Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsZz1Eb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCxoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLGs9Tm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQsbD1Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZCxtPU5vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZCxxPURPTVBhcnNlci5wcm90b3R5cGUucGFyc2VGcm9tU3RyaW5nLAp4PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZSwiaW5uZXJIVE1MIil8fHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbm5lckhUTUx9LHNldDpmdW5jdGlvbihhKXt0aGlzLmlubmVySFRNTD1hfX0sTT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5Ob2RlLnByb3RvdHlwZSwiY2hpbGROb2RlcyIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc319LFU9RWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCx1YT1Eb2N1bWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxsYj1Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLG1iPWZ1bmN0aW9uKCl7aWYoIWMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIiksYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO2IuY29udGVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7CmEuY29udGVudC5hcHBlbmRDaGlsZChiKTthPWEuY2xvbmVOb2RlKCEwKTtyZXR1cm4gMD09PWEuY29udGVudC5jaGlsZE5vZGVzLmxlbmd0aHx8MD09PWEuY29udGVudC5maXJzdENoaWxkLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fGR9fSgpO2lmKGMpe3ZhciBTPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgidGVtcGxhdGUiKSxDPSEwLFY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtWLnRleHRDb250ZW50PSJ0ZW1wbGF0ZXtkaXNwbGF5Om5vbmU7fSI7dmFyIGhhPWRvY3VtZW50LmhlYWQ7aGEuaW5zZXJ0QmVmb3JlKFYsaGEuZmlyc3RFbGVtZW50Q2hpbGQpO2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSFRNTEVsZW1lbnQucHJvdG90eXBlKTt2YXIgdmE9IWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLmhhc093blByb3BlcnR5KCJpbm5lckhUTUwiKTthLkc9ZnVuY3Rpb24oYil7aWYoIWIuY29udGVudCYmYi5uYW1lc3BhY2VVUkk9PT0KZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSl7Yi5jb250ZW50PVMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Zvcih2YXIgYztjPWIuZmlyc3RDaGlsZDspbC5jYWxsKGIuY29udGVudCxjKTtpZih2YSliLl9fcHJvdG9fXz1hLnByb3RvdHlwZTtlbHNlIGlmKGIuY2xvbmVOb2RlPWZ1bmN0aW9uKGIpe3JldHVybiBhLmEodGhpcyxiKX0sQyl0cnl7UChiKSxXKGIpfWNhdGNoKFRnKXtDPSExfWEuQyhiLmNvbnRlbnQpfX07dmFyIFg9e29wdGlvbjpbInNlbGVjdCJdLHRoZWFkOlsidGFibGUiXSxjb2w6WyJjb2xncm91cCIsInRhYmxlIl0sdHI6WyJ0Ym9keSIsInRhYmxlIl0sdGg6WyJ0ciIsInRib2R5IiwidGFibGUiXSx0ZDpbInRyIiwidGJvZHkiLCJ0YWJsZSJdfSxQPWZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmIodGhpcyl9LHNldDpmdW5jdGlvbihiKXt2YXIgYz1YWygvPChbYS16XVteL1wwPlx4MjBcdFxyXG5cZl0rKS9pLmV4ZWMoYil8fApbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXTtpZihjKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKWI9IjwiK2NbZF0rIj4iK2IrIjwvIitjW2RdKyI+IjtTLmJvZHkuaW5uZXJIVE1MPWI7Zm9yKGEuQyhTKTt0aGlzLmNvbnRlbnQuZmlyc3RDaGlsZDspay5jYWxsKHRoaXMuY29udGVudCx0aGlzLmNvbnRlbnQuZmlyc3RDaGlsZCk7Yj1TLmJvZHk7aWYoYylmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWI9Yi5sYXN0Q2hpbGQ7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWwuY2FsbCh0aGlzLmNvbnRlbnQsYi5maXJzdENoaWxkKX0sY29uZmlndXJhYmxlOiEwfSl9LFc9ZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIm91dGVySFRNTCIse2dldDpmdW5jdGlvbigpe3JldHVybiI8dGVtcGxhdGU+Iit0aGlzLmlubmVySFRNTCsiPC90ZW1wbGF0ZT4ifSxzZXQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5wYXJlbnROb2RlKXtTLmJvZHkuaW5uZXJIVE1MPWE7Zm9yKGE9dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtTLmJvZHkuZmlyc3RDaGlsZDspbC5jYWxsKGEsClMuYm9keS5maXJzdENoaWxkKTttLmNhbGwodGhpcy5wYXJlbnROb2RlLGEsdGhpcyl9ZWxzZSB0aHJvdyBFcnJvcigiRmFpbGVkIHRvIHNldCB0aGUgJ291dGVySFRNTCcgcHJvcGVydHkgb24gJ0VsZW1lbnQnOiBUaGlzIGVsZW1lbnQgaGFzIG5vIHBhcmVudCBub2RlLiIpO30sY29uZmlndXJhYmxlOiEwfSl9O1AoYS5wcm90b3R5cGUpO1coYS5wcm90b3R5cGUpO2EuQz1mdW5jdGlvbihjKXtjPWIoYywidGVtcGxhdGUiKTtmb3IodmFyIGQ9MCxlPWMubGVuZ3RoLGY7ZDxlJiYoZj1jW2RdKTtkKyspYS5HKGYpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixmdW5jdGlvbigpe2EuQyhkb2N1bWVudCl9KTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbigpe3ZhciBiPWcuYXBwbHkodGhpcyxhcmd1bWVudHMpOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZSYmYS5HKGIpO3JldHVybiBifTtET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZz0KZnVuY3Rpb24oKXt2YXIgYj1xLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthLkMoYik7cmV0dXJuIGJ9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIse2dldDpmdW5jdGlvbigpe3JldHVybiBuYih0aGlzKX0sc2V0OmZ1bmN0aW9uKGIpe3guc2V0LmNhbGwodGhpcyxiKTthLkModGhpcyl9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSk7dmFyIFZlPS9bJlx1MDBBMCJdL2cseWM9L1smXHUwMEEwPD5dL2csemM9ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX07Vj1mdW5jdGlvbihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9O3ZhciBXZT1WKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksClhlPVYoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKSxuYj1mdW5jdGlvbihhLGIpeyJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSYmKGE9YS5jb250ZW50KTtmb3IodmFyIGM9IiIsZD1iP2IoYSk6TS5nZXQuY2FsbChhKSxlPTAsZj1kLmxlbmd0aCxnO2U8ZiYmKGc9ZFtlXSk7ZSsrKXthOnt2YXIgaD1nO3ZhciBrPWE7dmFyIGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpmb3IodmFyIFA9aC5sb2NhbE5hbWUsbT0iPCIrUCxXPWguYXR0cmlidXRlcyxxPTA7az1XW3FdO3ErKyltKz0iICIray5uYW1lKyc9Iicray52YWx1ZS5yZXBsYWNlKFZlLHpjKSsnIic7bSs9Ij4iO2g9V2VbUF0/bTptK25iKGgsbCkrIjwvIitQKyI+IjticmVhayBhO2Nhc2UgTm9kZS5URVhUX05PREU6aD1oLmRhdGE7aD1rJiZYZVtrLmxvY2FsTmFtZV0/aDpoLnJlcGxhY2UoeWMsemMpO2JyZWFrIGE7CmNhc2UgTm9kZS5DT01NRU5UX05PREU6aD0iXHgzYyEtLSIraC5kYXRhKyItLVx4M2UiO2JyZWFrIGE7ZGVmYXVsdDp0aHJvdyB3aW5kb3cuY29uc29sZS5lcnJvcihoKSxFcnJvcigibm90IGltcGxlbWVudGVkIik7fX1jKz1ofXJldHVybiBjfX1pZihjfHxtYil7YS5hPWZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5jYWxsKGEsITEpO3RoaXMuRyYmdGhpcy5HKGMpO2ImJihsLmNhbGwoYy5jb250ZW50LGYuY2FsbChhLmNvbnRlbnQsITApKSxvYihjLmNvbnRlbnQsYS5jb250ZW50KSk7cmV0dXJuIGN9O3ZhciBvYj1mdW5jdGlvbihjLGQpe2lmKGQucXVlcnlTZWxlY3RvckFsbCYmKGQ9YihkLCJ0ZW1wbGF0ZSIpLDAhPT1kLmxlbmd0aCkpe2M9YihjLCJ0ZW1wbGF0ZSIpO2Zvcih2YXIgZT0wLGY9Yy5sZW5ndGgsZyxoO2U8ZjtlKyspaD1kW2VdLGc9Y1tlXSxhJiZhLkcmJmEuRyhoKSxtLmNhbGwoZy5wYXJlbnROb2RlLFllLmNhbGwoaCwhMCksZyl9fSxZZT1Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9CmZ1bmN0aW9uKGIpe2lmKCFlJiZkJiZ0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClpZihiKXZhciBjPVplLmNhbGwodGhpcy5vd25lckRvY3VtZW50LHRoaXMsITApO2Vsc2UgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7ZWxzZSB0aGlzLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJiJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZSYmdGhpcy5uYW1lc3BhY2VVUkk9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk/Yz1hLmEodGhpcyxiKTpjPWYuY2FsbCh0aGlzLGIpO2ImJm9iKGMsdGhpcyk7cmV0dXJuIGN9LFplPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGMsZCl7ZD1kfHwhMTtpZigidGVtcGxhdGUiPT09Yy5sb2NhbE5hbWUpcmV0dXJuIGEuYShjLGQpO3ZhciBlPWguY2FsbCh0aGlzLGMsZCk7aWYoZCl7b2IoZSxjKTtjPWIoZSwnc2NyaXB0Om5vdChbdHlwZV0pLHNjcmlwdFt0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9InRleHQvamF2YXNjcmlwdCJdJyk7CmZvcih2YXIgZixrPTA7azxjLmxlbmd0aDtrKyspe2Y9Y1trXTtkPWcuY2FsbChkb2N1bWVudCwic2NyaXB0Iik7ZC50ZXh0Q29udGVudD1mLnRleHRDb250ZW50O2Zvcih2YXIgbD1mLmF0dHJpYnV0ZXMsUD0wLFc7UDxsLmxlbmd0aDtQKyspVz1sW1BdLGQuc2V0QXR0cmlidXRlKFcubmFtZSxXLnZhbHVlKTttLmNhbGwoZi5wYXJlbnROb2RlLGQsZil9fXJldHVybiBlfX1jJiYod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ9YSl9KSgpO3ZhciBrYT1zZXRUaW1lb3V0O2Z1bmN0aW9uIGxhKCl7fWZ1bmN0aW9uIG1hKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7YS5hcHBseShiLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHIoYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Iik7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBhIGZ1bmN0aW9uIik7dGhpcy51PTA7dGhpcy5tYT0hMTt0aGlzLmg9dm9pZCAwO3RoaXMuST1bXTtuYShhLHRoaXMpfQpmdW5jdGlvbiBvYShhLGIpe2Zvcig7Mz09PWEudTspYT1hLmg7MD09PWEudT9hLkkucHVzaChiKTooYS5tYT0hMCxwYShmdW5jdGlvbigpe3ZhciBjPTE9PT1hLnU/Yi5OYTpiLk9hO2lmKG51bGw9PT1jKSgxPT09YS51P3FhOnJhKShiLmdhLGEuaCk7ZWxzZXt0cnl7dmFyIGQ9YyhhLmgpfWNhdGNoKGUpe3JhKGIuZ2EsZSk7cmV0dXJufXFhKGIuZ2EsZCl9fSkpfWZ1bmN0aW9uIHFhKGEsYil7dHJ5e2lmKGI9PT1hKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuIik7aWYoYiYmKCJvYmplY3QiPT09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PT10eXBlb2YgYikpe3ZhciBjPWIudGhlbjtpZihiIGluc3RhbmNlb2Ygcil7YS51PTM7YS5oPWI7c2EoYSk7cmV0dXJufWlmKCJmdW5jdGlvbiI9PT10eXBlb2YgYyl7bmEobWEoYyxiKSxhKTtyZXR1cm59fWEudT0xO2EuaD1iO3NhKGEpfWNhdGNoKGQpe3JhKGEsZCl9fQpmdW5jdGlvbiByYShhLGIpe2EudT0yO2EuaD1iO3NhKGEpfWZ1bmN0aW9uIHNhKGEpezI9PT1hLnUmJjA9PT1hLkkubGVuZ3RoJiZwYShmdW5jdGlvbigpe2EubWF8fCJ1bmRlZmluZWQiIT09dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGUmJmNvbnNvbGUud2FybigiUG9zc2libGUgVW5oYW5kbGVkIFByb21pc2UgUmVqZWN0aW9uOiIsYS5oKX0pO2Zvcih2YXIgYj0wLGM9YS5JLmxlbmd0aDtiPGM7YisrKW9hKGEsYS5JW2JdKTthLkk9bnVsbH1mdW5jdGlvbiB0YShhLGIsYyl7dGhpcy5OYT0iZnVuY3Rpb24iPT09dHlwZW9mIGE/YTpudWxsO3RoaXMuT2E9ImZ1bmN0aW9uIj09PXR5cGVvZiBiP2I6bnVsbDt0aGlzLmdhPWN9ZnVuY3Rpb24gbmEoYSxiKXt2YXIgYz0hMTt0cnl7YShmdW5jdGlvbihhKXtjfHwoYz0hMCxxYShiLGEpKX0sZnVuY3Rpb24oYSl7Y3x8KGM9ITAscmEoYixhKSl9KX1jYXRjaChkKXtjfHwoYz0hMCxyYShiLGQpKX19CnIucHJvdG90eXBlWyJjYXRjaCJdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRoZW4obnVsbCxhKX07ci5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGxhKTtvYSh0aGlzLG5ldyB0YShhLGIsYykpO3JldHVybiBjfTtyLnByb3RvdHlwZVsiZmluYWxseSJdPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBjfSl9LGZ1bmN0aW9uKGMpe3JldHVybiBiLnJlc29sdmUoYSgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGIucmVqZWN0KGMpfSl9KX07CmZ1bmN0aW9uIHdhKGEpe3JldHVybiBuZXcgcihmdW5jdGlvbihiLGMpe2Z1bmN0aW9uIGQoYSxnKXt0cnl7aWYoZyYmKCJvYmplY3QiPT09dHlwZW9mIGd8fCJmdW5jdGlvbiI9PT10eXBlb2YgZykpe3ZhciBoPWcudGhlbjtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGgpe2guY2FsbChnLGZ1bmN0aW9uKGIpe2QoYSxiKX0sYyk7cmV0dXJufX1lW2FdPWc7MD09PS0tZiYmYihlKX1jYXRjaChtKXtjKG0pfX1pZighYXx8InVuZGVmaW5lZCI9PT10eXBlb2YgYS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvbWlzZS5hbGwgYWNjZXB0cyBhbiBhcnJheSIpO3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gYihbXSk7Zm9yKHZhciBmPWUubGVuZ3RoLGc9MDtnPGUubGVuZ3RoO2crKylkKGcsZVtnXSl9KX0KZnVuY3Rpb24geGEoYSl7cmV0dXJuIGEmJiJvYmplY3QiPT09dHlwZW9mIGEmJmEuY29uc3RydWN0b3I9PT1yP2E6bmV3IHIoZnVuY3Rpb24oYil7YihhKX0pfWZ1bmN0aW9uIHlhKGEpe3JldHVybiBuZXcgcihmdW5jdGlvbihiLGMpe2MoYSl9KX1mdW5jdGlvbiB6YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9MCxlPWEubGVuZ3RoO2Q8ZTtkKyspYVtkXS50aGVuKGIsYyl9KX12YXIgcGE9ImZ1bmN0aW9uIj09PXR5cGVvZiBzZXRJbW1lZGlhdGUmJmZ1bmN0aW9uKGEpe3NldEltbWVkaWF0ZShhKX18fGZ1bmN0aW9uKGEpe2thKGEsMCl9Oy8qCgpDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwppZighd2luZG93LlByb21pc2Upe3dpbmRvdy5Qcm9taXNlPXI7ci5wcm90b3R5cGUudGhlbj1yLnByb3RvdHlwZS50aGVuO3IuYWxsPXdhO3IucmFjZT16YTtyLnJlc29sdmU9eGE7ci5yZWplY3Q9eWE7dmFyIEFhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxCYT1bXTsobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9QmEubGVuZ3RoLGI9MDtiPGE7YisrKUJhW2JdKCk7QmEuc3BsaWNlKDAsYSl9KSkub2JzZXJ2ZShBYSx7Y2hhcmFjdGVyRGF0YTohMH0pO3BhPWZ1bmN0aW9uKGEpe0JhLnB1c2goYSk7QWEudGV4dENvbnRlbnQ9MDxBYS50ZXh0Q29udGVudC5sZW5ndGg/IiI6ImEifX07KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudClyZXR1cm4gbmV3IEN1c3RvbUV2ZW50KGEsYik7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50Iik7Yy5pbml0Q3VzdG9tRXZlbnQoYSwhIWIuYnViYmxlcywhIWIuY2FuY2VsYWJsZSxiLmRldGFpbCk7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhKXtpZihNKXJldHVybiBhLm93bmVyRG9jdW1lbnQhPT1kb2N1bWVudD9hLm93bmVyRG9jdW1lbnQ6bnVsbDt2YXIgYj1hLl9faW1wb3J0RG9jO2lmKCFiJiZhLnBhcmVudE5vZGUpe2I9YS5wYXJlbnROb2RlO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYi5jbG9zZXN0KWI9Yi5jbG9zZXN0KCJsaW5rW3JlbD1pbXBvcnRdIik7ZWxzZSBmb3IoOyFoKGIpJiYoYj1iLnBhcmVudE5vZGUpOyk7YS5fX2ltcG9ydERvYz1ifXJldHVybiBifWZ1bmN0aW9uIGQoYSl7dmFyIGI9bShkb2N1bWVudCwibGlua1tyZWw9aW1wb3J0XTpub3QoW2ltcG9ydC1kZXBlbmRlbmN5XSkiKSwKYz1iLmxlbmd0aDtjP3EoYixmdW5jdGlvbihiKXtyZXR1cm4gZyhiLGZ1bmN0aW9uKCl7MD09PS0tYyYmYSgpfSl9KTphKCl9ZnVuY3Rpb24gZShhKXtmdW5jdGlvbiBiKCl7ImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmZG9jdW1lbnQuYm9keSYmKGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGIpLGEoKSl9ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsYik7YigpfWZ1bmN0aW9uIGYoYSl7ZShmdW5jdGlvbigpe3JldHVybiBkKGZ1bmN0aW9uKCl7cmV0dXJuIGEmJmEoKX0pfSl9ZnVuY3Rpb24gZyhhLGIpe2lmKGEuX19sb2FkZWQpYiYmYigpO2Vsc2UgaWYoInNjcmlwdCI9PT1hLmxvY2FsTmFtZSYmIWEuc3JjfHwic3R5bGUiPT09YS5sb2NhbE5hbWUmJiFhLmZpcnN0Q2hpbGQpYS5fX2xvYWRlZD0hMCxiJiZiKCk7ZWxzZXt2YXIgYz1mdW5jdGlvbihkKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoZC50eXBlLApjKTthLl9fbG9hZGVkPSEwO2ImJmIoKX07YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixjKTtoYSYmInN0eWxlIj09PWEubG9jYWxOYW1lfHxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX19ZnVuY3Rpb24gaChhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYibGluayI9PT1hLmxvY2FsTmFtZSYmImltcG9ydCI9PT1hLnJlbH1mdW5jdGlvbiBrKCl7dmFyIGE9dGhpczt0aGlzLmE9e307dGhpcy5iPTA7dGhpcy5jPW5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGIpe3JldHVybiBhLkphKGIpfSk7dGhpcy5jLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KTt0aGlzLmxvYWRJbXBvcnRzKGRvY3VtZW50KX1mdW5jdGlvbiBsKGEpe3EobShhLCJ0ZW1wbGF0ZSIpLGZ1bmN0aW9uKGEpe3EobShhLmNvbnRlbnQsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0ibW9kdWxlIl0nKSwKZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cShhLmF0dHJpYnV0ZXMsZnVuY3Rpb24oYSl7cmV0dXJuIGIuc2V0QXR0cmlidXRlKGEubmFtZSxhLnZhbHVlKX0pO2IudGV4dENvbnRlbnQ9YS50ZXh0Q29udGVudDthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGIsYSl9KTtsKGEuY29udGVudCl9KX1mdW5jdGlvbiBtKGEsYil7cmV0dXJuIGEuY2hpbGROb2Rlcy5sZW5ndGg/YS5xdWVyeVNlbGVjdG9yQWxsKGIpOlV9ZnVuY3Rpb24gcShhLGIsYyl7dmFyIGQ9YT9hLmxlbmd0aDowLGU9Yz8tMToxO2ZvcihjPWM/ZC0xOjA7YzxkJiYwPD1jO2MrPWUpYihhW2NdLGMpfXZhciB4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKSxNPSJpbXBvcnQiaW4geCxVPXgucXVlcnlTZWxlY3RvckFsbCgiKiIpLHVhPW51bGw7ITE9PT0iY3VycmVudFNjcmlwdCJpbiBkb2N1bWVudCYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCJjdXJyZW50U2NyaXB0IiwKe2dldDpmdW5jdGlvbigpe3JldHVybiB1YXx8KCJjb21wbGV0ZSIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP2RvY3VtZW50LnNjcmlwdHNbZG9jdW1lbnQuc2NyaXB0cy5sZW5ndGgtMV06bnVsbCl9LGNvbmZpZ3VyYWJsZTohMH0pO3ZhciBsYj0vKHVybFwoKShbXildKikoXCkpL2csbWI9LyhAaW1wb3J0W1xzXSsoPyF1cmxcKCkpKFteO10qKSg7KS9nLFM9Lyg8bGlua1tePl0qKShyZWw9Wyd8Il0/c3R5bGVzaGVldFsnfCJdP1tePl0qPikvZyxDPXtFYTpmdW5jdGlvbihhLGIpe2EuaHJlZiYmYS5zZXRBdHRyaWJ1dGUoImhyZWYiLEMuWChhLmdldEF0dHJpYnV0ZSgiaHJlZiIpLGIpKTthLnNyYyYmYS5zZXRBdHRyaWJ1dGUoInNyYyIsQy5YKGEuZ2V0QXR0cmlidXRlKCJzcmMiKSxiKSk7aWYoInN0eWxlIj09PWEubG9jYWxOYW1lKXt2YXIgYz1DLnFhKGEudGV4dENvbnRlbnQsYixsYik7YS50ZXh0Q29udGVudD1DLnFhKGMsYixtYil9fSxxYTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEucmVwbGFjZShjLApmdW5jdGlvbihhLGMsZCxlKXthPWQucmVwbGFjZSgvWyInXS9nLCIiKTtiJiYoYT1DLlgoYSxiKSk7cmV0dXJuIGMrIiciK2ErIiciK2V9KX0sWDpmdW5jdGlvbihhLGIpe2lmKHZvaWQgMD09PUMuYWEpe0MuYWE9ITE7dHJ5e3ZhciBjPW5ldyBVUkwoImIiLCJodHRwOi8vYSIpO2MucGF0aG5hbWU9ImMlMjBkIjtDLmFhPSJodHRwOi8vYS9jJTIwZCI9PT1jLmhyZWZ9Y2F0Y2goeWMpe319aWYoQy5hYSlyZXR1cm4obmV3IFVSTChhLGIpKS5ocmVmO2M9Qy54YTtjfHwoYz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInRlbXAiKSxDLnhhPWMsYy5qYT1jLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSxjLmhlYWQuYXBwZW5kQ2hpbGQoYy5qYSksYy5pYT1jLmNyZWF0ZUVsZW1lbnQoImEiKSk7Yy5qYS5ocmVmPWI7Yy5pYS5ocmVmPWE7cmV0dXJuIGMuaWEuaHJlZnx8YX19LFY9e2FzeW5jOiEwLGxvYWQ6ZnVuY3Rpb24oYSxiLGMpe2lmKGEpaWYoYS5tYXRjaCgvXmRhdGE6Lykpe2E9CmEuc3BsaXQoIiwiKTt2YXIgZD1hWzFdO2Q9LTE8YVswXS5pbmRleE9mKCI7YmFzZTY0Iik/YXRvYihkKTpkZWNvZGVVUklDb21wb25lbnQoZCk7YihkKX1lbHNle3ZhciBlPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9wZW4oIkdFVCIsYSxWLmFzeW5jKTtlLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWUucmVzcG9uc2VVUkx8fGUuZ2V0UmVzcG9uc2VIZWFkZXIoIkxvY2F0aW9uIik7YSYmMD09PWEuaW5kZXhPZigiLyIpJiYoYT0obG9jYXRpb24ub3JpZ2lufHxsb2NhdGlvbi5wcm90b2NvbCsiLy8iK2xvY2F0aW9uLmhvc3QpK2EpO3ZhciBkPWUucmVzcG9uc2V8fGUucmVzcG9uc2VUZXh0OzMwND09PWUuc3RhdHVzfHwwPT09ZS5zdGF0dXN8fDIwMDw9ZS5zdGF0dXMmJjMwMD5lLnN0YXR1cz9iKGQsYSk6YyhkKX07ZS5zZW5kKCl9ZWxzZSBjKCJlcnJvcjogaHJlZiBtdXN0IGJlIHNwZWNpZmllZCIpfX0saGE9L1RyaWRlbnQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fC9FZGdlXC9cZC4vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwprLnByb3RvdHlwZS5sb2FkSW1wb3J0cz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2E9bShhLCJsaW5rW3JlbD1pbXBvcnRdIik7cShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLmcoYSl9KX07ay5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9YS5ocmVmO2lmKHZvaWQgMCE9PXRoaXMuYVtjXSl7dmFyIGQ9dGhpcy5hW2NdO2QmJmQuX19sb2FkZWQmJihhLl9faW1wb3J0PWQsdGhpcy5mKGEpKX1lbHNlIHRoaXMuYisrLHRoaXMuYVtjXT0icGVuZGluZyIsVi5sb2FkKGMsZnVuY3Rpb24oYSxkKXthPWIuS2EoYSxkfHxjKTtiLmFbY109YTtiLmItLTtiLmxvYWRJbXBvcnRzKGEpO2IubCgpfSxmdW5jdGlvbigpe2IuYVtjXT1udWxsO2IuYi0tO2IubCgpfSl9O2sucHJvdG90eXBlLkthPWZ1bmN0aW9uKGEsYil7aWYoIWEpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtoYSYmKGE9YS5yZXBsYWNlKFMsZnVuY3Rpb24oYSxiLGMpe3JldHVybi0xPT09CmEuaW5kZXhPZigidHlwZT0iKT9iKyIgdHlwZT1pbXBvcnQtZGlzYWJsZSAiK2M6YX0pKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO2MuaW5uZXJIVE1MPWE7aWYoYy5jb250ZW50KWE9Yy5jb250ZW50LGwoYSk7ZWxzZSBmb3IoYT1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yy5maXJzdENoaWxkOylhLmFwcGVuZENoaWxkKGMuZmlyc3RDaGlsZCk7aWYoYz1hLnF1ZXJ5U2VsZWN0b3IoImJhc2UiKSliPUMuWChjLmdldEF0dHJpYnV0ZSgiaHJlZiIpLGIpLGMucmVtb3ZlQXR0cmlidXRlKCJocmVmIik7Yz1tKGEsJ2xpbmtbcmVsPWltcG9ydF0sbGlua1tyZWw9c3R5bGVzaGVldF1baHJlZl1bdHlwZT1pbXBvcnQtZGlzYWJsZV0sc3R5bGU6bm90KFt0eXBlXSksbGlua1tyZWw9c3R5bGVzaGVldF1baHJlZl06bm90KFt0eXBlXSksc2NyaXB0Om5vdChbdHlwZV0pLHNjcmlwdFt0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9InRleHQvamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJtb2R1bGUiXScpOwp2YXIgZD0wO3EoYyxmdW5jdGlvbihhKXtnKGEpO0MuRWEoYSxiKTthLnNldEF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiLCIiKTtpZigic2NyaXB0Ij09PWEubG9jYWxOYW1lJiYhYS5zcmMmJmEudGV4dENvbnRlbnQpe2lmKCJtb2R1bGUiPT09YS50eXBlKXRocm93IEVycm9yKCJJbmxpbmUgbW9kdWxlIHNjcmlwdHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gSFRNTCBJbXBvcnRzLiIpO2Euc2V0QXR0cmlidXRlKCJzcmMiLCJkYXRhOnRleHQvamF2YXNjcmlwdDtjaGFyc2V0PXV0Zi04LCIrZW5jb2RlVVJJQ29tcG9uZW50KGEudGV4dENvbnRlbnQrKCJcbi8vIyBzb3VyY2VVUkw9IitiKyhkPyItIitkOiIiKSsiLmpzXG4iKSkpO2EudGV4dENvbnRlbnQ9IiI7ZCsrfX0pO3JldHVybiBhfTtrLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZighdGhpcy5iKXt0aGlzLmMuZGlzY29ubmVjdCgpO3RoaXMuZmxhdHRlbihkb2N1bWVudCk7dmFyIGI9ITEsYz0hMSxkPWZ1bmN0aW9uKCl7YyYmCmImJihhLmxvYWRJbXBvcnRzKGRvY3VtZW50KSxhLmJ8fChhLmMub2JzZXJ2ZShkb2N1bWVudC5oZWFkLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pLGEuZGEoKSkpfTt0aGlzLk1hKGZ1bmN0aW9uKCl7Yz0hMDtkKCl9KTt0aGlzLkxhKGZ1bmN0aW9uKCl7Yj0hMDtkKCl9KX19O2sucHJvdG90eXBlLmZsYXR0ZW49ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPW0oYSwibGlua1tyZWw9aW1wb3J0XSIpO3EoYSxmdW5jdGlvbihhKXt2YXIgYz1iLmFbYS5ocmVmXTsoYS5fX2ltcG9ydD1jKSYmYy5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmKGIuYVthLmhyZWZdPWEsYS5yZWFkeVN0YXRlPSJsb2FkaW5nIixhLl9faW1wb3J0PWEsYi5mbGF0dGVuKGMpLGEuYXBwZW5kQ2hpbGQoYykpfSl9O2sucHJvdG90eXBlLkxhPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoZSl7aWYoZTxkKXt2YXIgZj1jW2VdLGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Zi5yZW1vdmVBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5Iik7CnEoZi5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGEpe3JldHVybiBoLnNldEF0dHJpYnV0ZShhLm5hbWUsYS52YWx1ZSl9KTt1YT1oO2YucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxmKTtnKGgsZnVuY3Rpb24oKXt1YT1udWxsO2IoZSsxKX0pfWVsc2UgYSgpfXZhciBjPW0oZG9jdW1lbnQsInNjcmlwdFtpbXBvcnQtZGVwZW5kZW5jeV0iKSxkPWMubGVuZ3RoO2IoMCl9O2sucHJvdG90eXBlLk1hPWZ1bmN0aW9uKGEpe3ZhciBiPW0oZG9jdW1lbnQsInN0eWxlW2ltcG9ydC1kZXBlbmRlbmN5XSxsaW5rW3JlbD1zdHlsZXNoZWV0XVtpbXBvcnQtZGVwZW5kZW5jeV0iKSxkPWIubGVuZ3RoO2lmKGQpe3ZhciBlPWhhJiYhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdW3R5cGU9aW1wb3J0LWRpc2FibGVdIik7cShiLGZ1bmN0aW9uKGIpe2coYixmdW5jdGlvbigpe2IucmVtb3ZlQXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIpOzA9PT0tLWQmJgphKCl9KTtpZihlJiZiLnBhcmVudE5vZGUhPT1kb2N1bWVudC5oZWFkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGIubG9jYWxOYW1lKTtmLl9fYXBwbGllZEVsZW1lbnQ9YjtmLnNldEF0dHJpYnV0ZSgidHlwZSIsImltcG9ydC1wbGFjZWhvbGRlciIpO2IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZixiLm5leHRTaWJsaW5nKTtmb3IoZj1jKGIpO2YmJmMoZik7KWY9YyhmKTtmLnBhcmVudE5vZGUhPT1kb2N1bWVudC5oZWFkJiYoZj1udWxsKTtkb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShiLGYpO2IucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIil9fSl9ZWxzZSBhKCl9O2sucHJvdG90eXBlLmRhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF0iKTtxKGIsZnVuY3Rpb24oYil7cmV0dXJuIGEuZihiKX0sITApfTtrLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe2EuX19sb2FkZWR8fChhLl9fbG9hZGVkPSEwLGEuaW1wb3J0JiYoYS5pbXBvcnQucmVhZHlTdGF0ZT0KImNvbXBsZXRlIiksYS5kaXNwYXRjaEV2ZW50KGIoYS5pbXBvcnQ/ImxvYWQiOiJlcnJvciIse2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMSxkZXRhaWw6dm9pZCAwfSkpKX07ay5wcm90b3R5cGUuSmE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztxKGEsZnVuY3Rpb24oYSl7cmV0dXJuIHEoYS5hZGRlZE5vZGVzLGZ1bmN0aW9uKGEpe2EmJmEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGgoYSk/Yi5nKGEpOmIubG9hZEltcG9ydHMoYSkpfSl9KX07dmFyIHZhPW51bGw7aWYoTSl4PW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF0iKSxxKHgsZnVuY3Rpb24oYSl7YS5pbXBvcnQmJiJsb2FkaW5nIj09PWEuaW1wb3J0LnJlYWR5U3RhdGV8fChhLl9fbG9hZGVkPSEwKX0pLHg9ZnVuY3Rpb24oYSl7YT1hLnRhcmdldDtoKGEpJiYoYS5fX2xvYWRlZD0hMCl9LGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHgsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKeCwhMCk7ZWxzZXt2YXIgWD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJiYXNlVVJJIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KCghWHx8WC5jb25maWd1cmFibGU/Tm9kZTpFbGVtZW50KS5wcm90b3R5cGUsImJhc2VVUkkiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1oKHRoaXMpP3RoaXM6Yyh0aGlzKTtyZXR1cm4gYT9hLmhyZWY6WCYmWC5nZXQ/WC5nZXQuY2FsbCh0aGlzKTooZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYmFzZSIpfHx3aW5kb3cubG9jYXRpb24pLmhyZWZ9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEhUTUxMaW5rRWxlbWVudC5wcm90b3R5cGUsImltcG9ydCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faW1wb3J0fHxudWxsfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO2UoZnVuY3Rpb24oKXt2YT1uZXcga30pfWYoZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKCJIVE1MSW1wb3J0c0xvYWRlZCIsCntjYW5jZWxhYmxlOiEwLGJ1YmJsZXM6ITAsZGV0YWlsOnZvaWQgMH0pKX0pO2EudXNlTmF0aXZlPU07YS53aGVuUmVhZHk9ZjthLmltcG9ydEZvckVsZW1lbnQ9YzthLmxvYWRJbXBvcnRzPWZ1bmN0aW9uKGEpe3ZhJiZ2YS5sb2FkSW1wb3J0cyhhKX19KSh3aW5kb3cuSFRNTEltcG9ydHM9d2luZG93LkhUTUxJbXBvcnRzfHx7fSk7LyoKCiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCndpbmRvdy5XZWJDb21wb25lbnRzPXdpbmRvdy5XZWJDb21wb25lbnRzfHx7ZmxhZ3M6e319O3ZhciBDYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0id2ViY29tcG9uZW50cy1saXRlLmpzIl0nKSxEYT0vd2MtKC4rKS8sdD17fTtpZighdC5ub09wdHMpe2xvY2F0aW9uLnNlYXJjaC5zbGljZSgxKS5zcGxpdCgiJiIpLmZvckVhY2goZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI9Iik7dmFyIGI7YVswXSYmKGI9YVswXS5tYXRjaChEYSkpJiYodFtiWzFdXT1hWzFdfHwhMCl9KTtpZihDYSlmb3IodmFyIEVhPTAsRmE9dm9pZCAwO0ZhPUNhLmF0dHJpYnV0ZXNbRWFdO0VhKyspInNyYyIhPT1GYS5uYW1lJiYodFtGYS5uYW1lXT1GYS52YWx1ZXx8ITApO2lmKHQubG9nJiZ0LmxvZy5zcGxpdCl7dmFyIEdhPXQubG9nLnNwbGl0KCIsIik7dC5sb2c9e307R2EuZm9yRWFjaChmdW5jdGlvbihhKXt0LmxvZ1thXT0hMH0pfWVsc2UgdC5sb2c9e319CndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzPXQ7dmFyIEhhPXQuc2hhZHlkb207SGEmJih3aW5kb3cuU2hhZHlET009d2luZG93LlNoYWR5RE9NfHx7fSx3aW5kb3cuU2hhZHlET00uZm9yY2U9SGEpO3ZhciBJYT10LnJlZ2lzdGVyfHx0LmNlO0lhJiZ3aW5kb3cuY3VzdG9tRWxlbWVudHMmJih3aW5kb3cuY3VzdG9tRWxlbWVudHMuZm9yY2VQb2x5ZmlsbD1JYSk7LyoKCkNvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCmZ1bmN0aW9uIEphKCl7dGhpcy5wYT10aGlzLnJvb3Q9bnVsbDt0aGlzLlQ9ITE7dGhpcy5EPXRoaXMuUD10aGlzLmNhPXRoaXMuYXNzaWduZWRTbG90PXRoaXMuYXNzaWduZWROb2Rlcz10aGlzLkg9bnVsbDt0aGlzLmNoaWxkTm9kZXM9dGhpcy5uZXh0U2libGluZz10aGlzLnByZXZpb3VzU2libGluZz10aGlzLmxhc3RDaGlsZD10aGlzLmZpcnN0Q2hpbGQ9dGhpcy5wYXJlbnROb2RlPXRoaXMuSz12b2lkIDA7dGhpcy5rYT10aGlzLmxhPSExO3RoaXMuTz17fX1KYS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue319O2Z1bmN0aW9uIHUoYSl7YS5fX3NoYWR5fHwoYS5fX3NoYWR5PW5ldyBKYSk7cmV0dXJuIGEuX19zaGFkeX1mdW5jdGlvbiB2KGEpe3JldHVybiBhJiZhLl9fc2hhZHl9O3ZhciB3PXdpbmRvdy5TaGFkeURPTXx8e307dy5HYT0hKCFFbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3d8fCFOb2RlLnByb3RvdHlwZS5nZXRSb290Tm9kZSk7dmFyIEthPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsImZpcnN0Q2hpbGQiKTt3Lm09ISEoS2EmJkthLmNvbmZpZ3VyYWJsZSYmS2EuZ2V0KTt3LmVhPXcuZm9yY2V8fCF3LkdhO3cuSj13Lm5vUGF0Y2h8fCExO3cub2E9dy5wcmVmZXJQZXJmb3JtYW5jZTtmdW5jdGlvbiB5KGEpe3JldHVybihhPXYoYSkpJiZ2b2lkIDAhPT1hLmZpcnN0Q2hpbGR9ZnVuY3Rpb24geihhKXtyZXR1cm4iU2hhZHlSb290Ij09PWEuemF9ZnVuY3Rpb24gTGEoYSl7cmV0dXJuKGE9KGE9dihhKSkmJmEucm9vdCkmJk1hKGEpfQp2YXIgTmE9RWxlbWVudC5wcm90b3R5cGUsT2E9TmEubWF0Y2hlc3x8TmEubWF0Y2hlc1NlbGVjdG9yfHxOYS5tb3pNYXRjaGVzU2VsZWN0b3J8fE5hLm1zTWF0Y2hlc1NlbGVjdG9yfHxOYS5vTWF0Y2hlc1NlbGVjdG9yfHxOYS53ZWJraXRNYXRjaGVzU2VsZWN0b3IsUGE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpLFFhPTAsUmE9W107KG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKDtSYS5sZW5ndGg7KXRyeXtSYS5zaGlmdCgpKCl9Y2F0Y2goYSl7dGhyb3cgUGEudGV4dENvbnRlbnQ9UWErKyxhO319KSkub2JzZXJ2ZShQYSx7Y2hhcmFjdGVyRGF0YTohMH0pO2Z1bmN0aW9uIFNhKGEpe1JhLnB1c2goYSk7UGEudGV4dENvbnRlbnQ9UWErK312YXIgVGE9ISFkb2N1bWVudC5jb250YWlucztmdW5jdGlvbiBVYShhLGIpe2Zvcig7Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9fc2hhZHlfcGFyZW50Tm9kZX1yZXR1cm4hMX0KZnVuY3Rpb24gVmEoYSl7Zm9yKHZhciBiPWEubGVuZ3RoLTE7MDw9YjtiLS0pe3ZhciBjPWFbYl0sZD1jLmdldEF0dHJpYnV0ZSgiaWQiKXx8Yy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTtkJiYibGVuZ3RoIiE9PWQmJmlzTmFOKGQpJiYoYVtkXT1jKX1hLml0ZW09ZnVuY3Rpb24oYil7cmV0dXJuIGFbYl19O2EubmFtZWRJdGVtPWZ1bmN0aW9uKGIpe2lmKCJsZW5ndGgiIT09YiYmaXNOYU4oYikmJmFbYl0pcmV0dXJuIGFbYl07Zm9yKHZhciBjPWlhKGEpLGQ9Yy5uZXh0KCk7IWQuZG9uZTtkPWMubmV4dCgpKWlmKGQ9ZC52YWx1ZSwoZC5nZXRBdHRyaWJ1dGUoImlkIil8fGQuZ2V0QXR0cmlidXRlKCJuYW1lIikpPT1iKXJldHVybiBkO3JldHVybiBudWxsfTtyZXR1cm4gYX0KZnVuY3Rpb24gQShhLGIsYyxkKXtjPXZvaWQgMD09PWM/IiI6Yztmb3IodmFyIGUgaW4gYil7dmFyIGY9YltlXTtpZighKGQmJjA8PWQuaW5kZXhPZihlKSkpe2YuY29uZmlndXJhYmxlPSEwO3ZhciBnPWMrZTtpZihmLnZhbHVlKWFbZ109Zi52YWx1ZTtlbHNlIHRyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxnLGYpfWNhdGNoKGgpe319fX1mdW5jdGlvbiBCKGEpe3ZhciBiPXt9O09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpLmZvckVhY2goZnVuY3Rpb24oYyl7YltjXT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsYyl9KTtyZXR1cm4gYn07dmFyIFdhPVtdLFhhO2Z1bmN0aW9uIFlhKGEpe1hhfHwoWGE9ITAsU2EoWmEpKTtXYS5wdXNoKGEpfWZ1bmN0aW9uIFphKCl7WGE9ITE7Zm9yKHZhciBhPSEhV2EubGVuZ3RoO1dhLmxlbmd0aDspV2Euc2hpZnQoKSgpO3JldHVybiBhfVphLmxpc3Q9V2E7ZnVuY3Rpb24gJGEoKXt0aGlzLmE9ITE7dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3RoaXMuUz1uZXcgU2V0fWZ1bmN0aW9uIGFiKGEpe2EuYXx8KGEuYT0hMCxTYShmdW5jdGlvbigpe2EuZmx1c2goKX0pKX0kYS5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtpZih0aGlzLmEpe3RoaXMuYT0hMTt2YXIgYT10aGlzLnRha2VSZWNvcmRzKCk7YS5sZW5ndGgmJnRoaXMuUy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IoYSl9KX19OyRhLnByb3RvdHlwZS50YWtlUmVjb3Jkcz1mdW5jdGlvbigpe2lmKHRoaXMuYWRkZWROb2Rlcy5sZW5ndGh8fHRoaXMucmVtb3ZlZE5vZGVzLmxlbmd0aCl7dmFyIGE9W3thZGRlZE5vZGVzOnRoaXMuYWRkZWROb2RlcyxyZW1vdmVkTm9kZXM6dGhpcy5yZW1vdmVkTm9kZXN9XTt0aGlzLmFkZGVkTm9kZXM9W107dGhpcy5yZW1vdmVkTm9kZXM9W107cmV0dXJuIGF9cmV0dXJuW119OwpmdW5jdGlvbiBiYihhLGIpe3ZhciBjPXUoYSk7Yy5IfHwoYy5IPW5ldyAkYSk7Yy5ILlMuYWRkKGIpO3ZhciBkPWMuSDtyZXR1cm57eWE6YixGOmQsQWE6YSx0YWtlUmVjb3JkczpmdW5jdGlvbigpe3JldHVybiBkLnRha2VSZWNvcmRzKCl9fX1mdW5jdGlvbiBjYihhKXt2YXIgYj1hJiZhLkY7YiYmKGIuUy5kZWxldGUoYS55YSksYi5TLnNpemV8fCh1KGEuQWEpLkg9bnVsbCkpfQpmdW5jdGlvbiBkYihhLGIpe3ZhciBjPWIuZ2V0Um9vdE5vZGUoKTtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7dmFyIGI9Yz09PWEudGFyZ2V0LmdldFJvb3ROb2RlKCk7aWYoYiYmYS5hZGRlZE5vZGVzKXtpZihiPUFycmF5LmZyb20oYS5hZGRlZE5vZGVzKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGM9PT1hLmdldFJvb3ROb2RlKCl9KSxiLmxlbmd0aClyZXR1cm4gYT1PYmplY3QuY3JlYXRlKGEpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJhZGRlZE5vZGVzIix7dmFsdWU6Yixjb25maWd1cmFibGU6ITB9KSxhfWVsc2UgaWYoYilyZXR1cm4gYX0pLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYX0pfTt2YXIgZWI9L1smXHUwMEEwIl0vZyxmYj0vWyZcdTAwQTA8Pl0vZztmdW5jdGlvbiBnYihhKXtzd2l0Y2goYSl7Y2FzZSAiJiI6cmV0dXJuIiZhbXA7IjtjYXNlICI8IjpyZXR1cm4iJmx0OyI7Y2FzZSAiPiI6cmV0dXJuIiZndDsiO2Nhc2UgJyInOnJldHVybiImcXVvdDsiO2Nhc2UgIlx1MDBhMCI6cmV0dXJuIiZuYnNwOyJ9fWZ1bmN0aW9uIGhiKGEpe2Zvcih2YXIgYj17fSxjPTA7YzxhLmxlbmd0aDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgaWI9aGIoImFyZWEgYmFzZSBiciBjb2wgY29tbWFuZCBlbWJlZCBociBpbWcgaW5wdXQga2V5Z2VuIGxpbmsgbWV0YSBwYXJhbSBzb3VyY2UgdHJhY2sgd2JyIi5zcGxpdCgiICIpKSxqYj1oYigic3R5bGUgc2NyaXB0IHhtcCBpZnJhbWUgbm9lbWJlZCBub2ZyYW1lcyBwbGFpbnRleHQgbm9zY3JpcHQiLnNwbGl0KCIgIikpOwpmdW5jdGlvbiBrYihhLGIpeyJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSYmKGE9YS5jb250ZW50KTtmb3IodmFyIGM9IiIsZD1iP2IoYSk6YS5jaGlsZE5vZGVzLGU9MCxmPWQubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9ZFtlXSk7ZSsrKXthOnt2YXIgaD1nO3ZhciBrPWEsbD1iO3N3aXRjaChoLm5vZGVUeXBlKXtjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOms9aC5sb2NhbE5hbWU7Zm9yKHZhciBtPSI8IitrLHE9aC5hdHRyaWJ1dGVzLHg9MCxNO009cVt4XTt4KyspbSs9IiAiK00ubmFtZSsnPSInK00udmFsdWUucmVwbGFjZShlYixnYikrJyInO20rPSI+IjtoPWliW2tdP206bStrYihoLGwpKyI8LyIraysiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOmg9aC5kYXRhO2g9ayYmamJbay5sb2NhbE5hbWVdP2g6aC5yZXBsYWNlKGZiLGdiKTticmVhayBhO2Nhc2UgTm9kZS5DT01NRU5UX05PREU6aD0iXHgzYyEtLSIraC5kYXRhKyItLVx4M2UiO2JyZWFrIGE7ZGVmYXVsdDp0aHJvdyB3aW5kb3cuY29uc29sZS5lcnJvcihoKSwKRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Yys9aH1yZXR1cm4gY307dmFyIHBiPXcubSxxYj17cXVlcnlTZWxlY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yKGEpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3F1ZXJ5U2VsZWN0b3JBbGwoYSl9fSxyYj17fTtmdW5jdGlvbiBzYihhKXtyYlthXT1mdW5jdGlvbihiKXtyZXR1cm4gYlsiX19zaGFkeV9uYXRpdmVfIithXX19ZnVuY3Rpb24gdGIoYSxiKXtBKGEsYiwiX19zaGFkeV9uYXRpdmVfIik7Zm9yKHZhciBjIGluIGIpc2IoYyl9ZnVuY3Rpb24gRChhLGIpe2I9dm9pZCAwPT09Yj9bXTpiO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdLGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGQpO2UmJihPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiX19zaGFkeV9uYXRpdmVfIitkLGUpLGUudmFsdWU/cWJbZF18fChxYltkXT1lLnZhbHVlKTpzYihkKSl9fQp2YXIgRT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGRvY3VtZW50LE5vZGVGaWx0ZXIuU0hPV19BTEwsbnVsbCwhMSksRj1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGRvY3VtZW50LE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULG51bGwsITEpLHViPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiaW5lcnQiKTtmdW5jdGlvbiB2YihhKXtmb3IodmFyIGI7Yj1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYil9dmFyIHdiPVsiZmlyc3RFbGVtZW50Q2hpbGQiLCJsYXN0RWxlbWVudENoaWxkIiwiY2hpbGRyZW4iLCJjaGlsZEVsZW1lbnRDb3VudCJdLHhiPVsicXVlcnlTZWxlY3RvciIsInF1ZXJ5U2VsZWN0b3JBbGwiXTsKZnVuY3Rpb24geWIoKXt2YXIgYT1bImRpc3BhdGNoRXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciJdO3dpbmRvdy5FdmVudFRhcmdldD9EKHdpbmRvdy5FdmVudFRhcmdldC5wcm90b3R5cGUsYSk6KEQoTm9kZS5wcm90b3R5cGUsYSksRChXaW5kb3cucHJvdG90eXBlLGEpKTtwYj9EKE5vZGUucHJvdG90eXBlLCJwYXJlbnROb2RlIGZpcnN0Q2hpbGQgbGFzdENoaWxkIHByZXZpb3VzU2libGluZyBuZXh0U2libGluZyBjaGlsZE5vZGVzIHBhcmVudEVsZW1lbnQgdGV4dENvbnRlbnQiLnNwbGl0KCIgIikpOnRiKE5vZGUucHJvdG90eXBlLHtwYXJlbnROb2RlOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUucGFyZW50Tm9kZSgpfX0sZmlyc3RDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLmZpcnN0Q2hpbGQoKX19LGxhc3RDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT0KdGhpcztyZXR1cm4gRS5sYXN0Q2hpbGQoKX19LHByZXZpb3VzU2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLnByZXZpb3VzU2libGluZygpfX0sbmV4dFNpYmxpbmc6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5uZXh0U2libGluZygpfX0sY2hpbGROb2Rlczp7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9W107RS5jdXJyZW50Tm9kZT10aGlzO2Zvcih2YXIgYz1FLmZpcnN0Q2hpbGQoKTtjOylhLnB1c2goYyksYz1FLm5leHRTaWJsaW5nKCk7cmV0dXJuIGF9fSxwYXJlbnRFbGVtZW50OntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYucGFyZW50Tm9kZSgpfX0sdGV4dENvbnRlbnQ6e2dldDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLm5vZGVUeXBlKXtjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOmNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOmZvcih2YXIgYT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMsCk5vZGVGaWx0ZXIuU0hPV19URVhULG51bGwsITEpLGM9IiIsZDtkPWEubmV4dE5vZGUoKTspYys9ZC5ub2RlVmFsdWU7cmV0dXJuIGM7ZGVmYXVsdDpyZXR1cm4gdGhpcy5ub2RlVmFsdWV9fSxzZXQ6ZnVuY3Rpb24oYSl7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgYXx8bnVsbD09PWEpYT0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTp2Yih0aGlzKTsoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X25hdGl2ZV9pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSksdm9pZCAwKTticmVhaztkZWZhdWx0OnRoaXMubm9kZVZhbHVlPWF9fX19KTtEKE5vZGUucHJvdG90eXBlLCJhcHBlbmRDaGlsZCBpbnNlcnRCZWZvcmUgcmVtb3ZlQ2hpbGQgcmVwbGFjZUNoaWxkIGNsb25lTm9kZSBjb250YWlucyIuc3BsaXQoIiAiKSk7CmE9e2ZpcnN0RWxlbWVudENoaWxkOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYuZmlyc3RDaGlsZCgpfX0sbGFzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLmxhc3RDaGlsZCgpfX0sY2hpbGRyZW46e2dldDpmdW5jdGlvbigpe3ZhciBhPVtdO0YuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9Ri5maXJzdENoaWxkKCk7YzspYS5wdXNoKGMpLGM9Ri5uZXh0U2libGluZygpO3JldHVybiBWYShhKX19LGNoaWxkRWxlbWVudENvdW50OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZHJlbj90aGlzLmNoaWxkcmVuLmxlbmd0aDowfX19O3BiPyhEKEVsZW1lbnQucHJvdG90eXBlLHdiKSxEKEVsZW1lbnQucHJvdG90eXBlLFsicHJldmlvdXNFbGVtZW50U2libGluZyIsIm5leHRFbGVtZW50U2libGluZyIsImlubmVySFRNTCJdKSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKImNoaWxkcmVuIikmJkQoSFRNTEVsZW1lbnQucHJvdG90eXBlLFsiY2hpbGRyZW4iXSksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImlubmVySFRNTCJdKSk6KHRiKEVsZW1lbnQucHJvdG90eXBlLGEpLHRiKEVsZW1lbnQucHJvdG90eXBlLHtwcmV2aW91c0VsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYucHJldmlvdXNTaWJsaW5nKCl9fSxuZXh0RWxlbWVudFNpYmxpbmc6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5uZXh0U2libGluZygpfX0saW5uZXJIVE1MOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ga2IodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzfSl9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/CnRoaXMuY29udGVudDp0aGlzO3ZiKGIpO3ZhciBkPXRoaXMubG9jYWxOYW1lfHwiZGl2IjtkPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PXViLm5hbWVzcGFjZVVSST91Yi5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksZCk6dWIuY3JlYXRlRWxlbWVudChkKTtkLmlubmVySFRNTD1hO2ZvcihhPSJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT9kLmNvbnRlbnQ6ZDtkPWEuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZDspYi5fX3NoYWR5X25hdGl2ZV9pbnNlcnRCZWZvcmUoZCx2b2lkIDApfX19KSk7RChFbGVtZW50LnByb3RvdHlwZSwic2V0QXR0cmlidXRlIGdldEF0dHJpYnV0ZSBoYXNBdHRyaWJ1dGUgcmVtb3ZlQXR0cmlidXRlIGZvY3VzIGJsdXIiLnNwbGl0KCIgIikpO0QoRWxlbWVudC5wcm90b3R5cGUseGIpO0QoSFRNTEVsZW1lbnQucHJvdG90eXBlLFsiZm9jdXMiLCJibHVyIiwiY29udGFpbnMiXSk7cGImJkQoSFRNTEVsZW1lbnQucHJvdG90eXBlLApbInBhcmVudEVsZW1lbnQiLCJjaGlsZHJlbiIsImlubmVySFRNTCJdKTt3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCYmRCh3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSk7cGI/RChEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx3Yik6dGIoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsYSk7RChEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx4Yik7cGI/KEQoRG9jdW1lbnQucHJvdG90eXBlLHdiKSxEKERvY3VtZW50LnByb3RvdHlwZSxbImFjdGl2ZUVsZW1lbnQiXSkpOnRiKERvY3VtZW50LnByb3RvdHlwZSxhKTtEKERvY3VtZW50LnByb3RvdHlwZSxbImltcG9ydE5vZGUiLCJnZXRFbGVtZW50QnlJZCJdKTtEKERvY3VtZW50LnByb3RvdHlwZSx4Yil9O3ZhciB6Yj1CKHtnZXQgY2hpbGROb2Rlcygpe3JldHVybiB0aGlzLl9fc2hhZHlfY2hpbGROb2Rlc30sZ2V0IGZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2ZpcnN0Q2hpbGR9LGdldCBsYXN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RDaGlsZH0sZ2V0IHRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0IHRleHRDb250ZW50KGEpe3RoaXMuX19zaGFkeV90ZXh0Q29udGVudD1hfSxnZXQgY2hpbGRFbGVtZW50Q291bnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkRWxlbWVudENvdW50fSxnZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkcmVufSxnZXQgZmlyc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2ZpcnN0RWxlbWVudENoaWxkfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3JldHVybiB0aGlzLl9fc2hhZHlfbGFzdEVsZW1lbnRDaGlsZH0sZ2V0IGlubmVySFRNTCgpe3JldHVybiB0aGlzLl9fc2hhZHlfaW5uZXJIVE1MfSwKc2V0IGlubmVySFRNTChhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTD1hfSxnZXQgc2hhZG93Um9vdCgpe3JldHVybiB0aGlzLl9fc2hhZHlfc2hhZG93Um9vdH19KSxBYj1CKHtnZXQgcGFyZW50RWxlbWVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfcGFyZW50RWxlbWVudH0sZ2V0IHBhcmVudE5vZGUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudE5vZGV9LGdldCBuZXh0U2libGluZygpe3JldHVybiB0aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZ30sZ2V0IG5leHRFbGVtZW50U2libGluZygpe3JldHVybiB0aGlzLl9fc2hhZHlfbmV4dEVsZW1lbnRTaWJsaW5nfSxnZXQgcHJldmlvdXNFbGVtZW50U2libGluZygpe3JldHVybiB0aGlzLl9fc2hhZHlfcHJldmlvdXNFbGVtZW50U2libGluZ30sZ2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLl9fc2hhZHlfY2xhc3NOYW1lfSwKc2V0IGNsYXNzTmFtZShhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NsYXNzTmFtZT1hfX0pLEJiO2ZvcihCYiBpbiB6Yil6YltCYl0uZW51bWVyYWJsZT0hMTtmb3IodmFyIENiIGluIEFiKUFiW0NiXS5lbnVtZXJhYmxlPSExO3ZhciBEYj13Lm18fHcuSixFYj1EYj9mdW5jdGlvbigpe306ZnVuY3Rpb24oYSl7dmFyIGI9dShhKTtiLmxhfHwoYi5sYT0hMCxBKGEsQWIpKX0sRmI9RGI/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXUoYSk7Yi5rYXx8KGIua2E9ITAsQShhLHpiKSl9O3ZhciBHYj0iX19ldmVudFdyYXBwZXJzIitEYXRlLm5vdygpLEhiPWZ1bmN0aW9uKCl7dmFyIGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFdmVudC5wcm90b3R5cGUsImNvbXBvc2VkIik7cmV0dXJuIGE/ZnVuY3Rpb24oYil7cmV0dXJuIGEuZ2V0LmNhbGwoYil9Om51bGx9KCksSWI9e2JsdXI6ITAsZm9jdXM6ITAsZm9jdXNpbjohMCxmb2N1c291dDohMCxjbGljazohMCxkYmxjbGljazohMCxtb3VzZWRvd246ITAsbW91c2VlbnRlcjohMCxtb3VzZWxlYXZlOiEwLG1vdXNlbW92ZTohMCxtb3VzZW91dDohMCxtb3VzZW92ZXI6ITAsbW91c2V1cDohMCx3aGVlbDohMCxiZWZvcmVpbnB1dDohMCxpbnB1dDohMCxrZXlkb3duOiEwLGtleXVwOiEwLGNvbXBvc2l0aW9uc3RhcnQ6ITAsY29tcG9zaXRpb251cGRhdGU6ITAsY29tcG9zaXRpb25lbmQ6ITAsdG91Y2hzdGFydDohMCx0b3VjaGVuZDohMCx0b3VjaG1vdmU6ITAsdG91Y2hjYW5jZWw6ITAscG9pbnRlcm92ZXI6ITAsCnBvaW50ZXJlbnRlcjohMCxwb2ludGVyZG93bjohMCxwb2ludGVybW92ZTohMCxwb2ludGVydXA6ITAscG9pbnRlcmNhbmNlbDohMCxwb2ludGVyb3V0OiEwLHBvaW50ZXJsZWF2ZTohMCxnb3Rwb2ludGVyY2FwdHVyZTohMCxsb3N0cG9pbnRlcmNhcHR1cmU6ITAsZHJhZ3N0YXJ0OiEwLGRyYWc6ITAsZHJhZ2VudGVyOiEwLGRyYWdsZWF2ZTohMCxkcmFnb3ZlcjohMCxkcm9wOiEwLGRyYWdlbmQ6ITAsRE9NQWN0aXZhdGU6ITAsRE9NRm9jdXNJbjohMCxET01Gb2N1c091dDohMCxrZXlwcmVzczohMH0sSmI9e0RPTUF0dHJNb2RpZmllZDohMCxET01BdHRyaWJ1dGVOYW1lQ2hhbmdlZDohMCxET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQ6ITAsRE9NRWxlbWVudE5hbWVDaGFuZ2VkOiEwLERPTU5vZGVJbnNlcnRlZDohMCxET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnQ6ITAsRE9NTm9kZVJlbW92ZWQ6ITAsRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1lbnQ6ITAsRE9NU3VidHJlZU1vZGlmaWVkOiEwfTsKZnVuY3Rpb24gS2IoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBOb2RlP2EuX19zaGFkeV9nZXRSb290Tm9kZSgpOmF9ZnVuY3Rpb24gTGIoYSxiKXt2YXIgYz1bXSxkPWE7Zm9yKGE9S2IoYSk7ZDspYy5wdXNoKGQpLGQuX19zaGFkeV9hc3NpZ25lZFNsb3Q/ZD1kLl9fc2hhZHlfYXNzaWduZWRTbG90OmQubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJmQuaG9zdCYmKGJ8fGQhPT1hKT9kPWQuaG9zdDpkPWQuX19zaGFkeV9wYXJlbnROb2RlO2NbYy5sZW5ndGgtMV09PT1kb2N1bWVudCYmYy5wdXNoKHdpbmRvdyk7cmV0dXJuIGN9ZnVuY3Rpb24gTWIoYSl7YS5fX2NvbXBvc2VkUGF0aHx8KGEuX19jb21wb3NlZFBhdGg9TGIoYS50YXJnZXQsITApKTtyZXR1cm4gYS5fX2NvbXBvc2VkUGF0aH0KZnVuY3Rpb24gTmIoYSxiKXtpZigheilyZXR1cm4gYTthPUxiKGEsITApO2Zvcih2YXIgYz0wLGQsZT12b2lkIDAsZixnPXZvaWQgMDtjPGIubGVuZ3RoO2MrKylpZihkPWJbY10sZj1LYihkKSxmIT09ZSYmKGc9YS5pbmRleE9mKGYpLGU9ZiksIXooZil8fC0xPGcpcmV0dXJuIGR9ZnVuY3Rpb24gT2IoYSl7ZnVuY3Rpb24gYihiLGQpe2I9bmV3IGEoYixkKTtiLl9fY29tcG9zZWQ9ZCYmISFkLmNvbXBvc2VkO3JldHVybiBifWIuX19wcm90b19fPWE7Yi5wcm90b3R5cGU9YS5wcm90b3R5cGU7cmV0dXJuIGJ9dmFyIFBiPXtmb2N1czohMCxibHVyOiEwfTtmdW5jdGlvbiBRYihhKXtyZXR1cm4gYS5fX3RhcmdldCE9PWEudGFyZ2V0fHxhLl9fcmVsYXRlZFRhcmdldCE9PWEucmVsYXRlZFRhcmdldH0KZnVuY3Rpb24gUmIoYSxiLGMpe2lmKGM9Yi5fX2hhbmRsZXJzJiZiLl9faGFuZGxlcnNbYS50eXBlXSYmYi5fX2hhbmRsZXJzW2EudHlwZV1bY10pZm9yKHZhciBkPTAsZTsoZT1jW2RdKSYmKCFRYihhKXx8YS50YXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXQpJiYoZS5jYWxsKGIsYSksIWEuX19pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQpO2QrKyk7fQpmdW5jdGlvbiBTYihhKXt2YXIgYj1hLmNvbXBvc2VkUGF0aCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJjdXJyZW50VGFyZ2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGR9LGNvbmZpZ3VyYWJsZTohMH0pO2Zvcih2YXIgYz1iLmxlbmd0aC0xOzA8PWM7Yy0tKXt2YXIgZD1iW2NdO1JiKGEsZCwiY2FwdHVyZSIpO2lmKGEuWilyZXR1cm59T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsImV2ZW50UGhhc2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRXZlbnQuQVRfVEFSR0VUfX0pO3ZhciBlO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Q9YltjXTt2YXIgZj12KGQpO2Y9ZiYmZi5yb290O2lmKDA9PT1jfHxmJiZmPT09ZSlpZihSYihhLGQsImJ1YmJsZSIpLGQhPT13aW5kb3cmJihlPWQuX19zaGFkeV9nZXRSb290Tm9kZSgpKSxhLlopYnJlYWt9fQpmdW5jdGlvbiBUYihhLGIsYyxkLGUsZil7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspe3ZhciBoPWFbZ10saz1oLnR5cGUsbD1oLmNhcHR1cmUsbT1oLm9uY2UscT1oLnBhc3NpdmU7aWYoYj09PWgubm9kZSYmYz09PWsmJmQ9PT1sJiZlPT09bSYmZj09PXEpcmV0dXJuIGd9cmV0dXJuLTF9CmZ1bmN0aW9uIFViKGEsYixjKXtpZihiKXt2YXIgZD10eXBlb2YgYjtpZigiZnVuY3Rpb24iPT09ZHx8Im9iamVjdCI9PT1kKWlmKCJvYmplY3QiIT09ZHx8Yi5oYW5kbGVFdmVudCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmhhbmRsZUV2ZW50KXtpZihKYlthXSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsYixjKTtpZihjJiYib2JqZWN0Ij09PXR5cGVvZiBjKXt2YXIgZT0hIWMuY2FwdHVyZTt2YXIgZj0hIWMub25jZTt2YXIgZz0hIWMucGFzc2l2ZX1lbHNlIGU9ISFjLGc9Zj0hMTt2YXIgaD1jJiZjLiR8fHRoaXMsaz1iW0diXTtpZihrKXtpZigtMTxUYihrLGgsYSxlLGYsZykpcmV0dXJufWVsc2UgYltHYl09W107az1mdW5jdGlvbihlKXtmJiZ0aGlzLl9fc2hhZHlfcmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyk7ZS5fX3RhcmdldHx8VmIoZSk7aWYoaCE9PXRoaXMpe3ZhciBnPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwiY3VycmVudFRhcmdldCIpOwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBofSxjb25maWd1cmFibGU6ITB9KX1lLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0PWUuY3VycmVudFRhcmdldDtpZigheihoKXx8LTEhPWUuY29tcG9zZWRQYXRoKCkuaW5kZXhPZihoKSlpZihlLmNvbXBvc2VkfHwtMTxlLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YoaCkpaWYoUWIoZSkmJmUudGFyZ2V0PT09ZS5yZWxhdGVkVGFyZ2V0KWUuZXZlbnRQaGFzZT09PUV2ZW50LkJVQkJMSU5HX1BIQVNFJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO2Vsc2UgaWYoZS5ldmVudFBoYXNlPT09RXZlbnQuQ0FQVFVSSU5HX1BIQVNFfHxlLmJ1YmJsZXN8fGUudGFyZ2V0PT09aHx8aCBpbnN0YW5jZW9mIFdpbmRvdyl7dmFyIGs9ImZ1bmN0aW9uIj09PWQ/Yi5jYWxsKGgsZSk6Yi5oYW5kbGVFdmVudCYmYi5oYW5kbGVFdmVudChlKTtoIT09dGhpcyYmKGc/KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLAoiY3VycmVudFRhcmdldCIsZyksZz1udWxsKTpkZWxldGUgZS5jdXJyZW50VGFyZ2V0KTtyZXR1cm4ga319O2JbR2JdLnB1c2goe25vZGU6aCx0eXBlOmEsY2FwdHVyZTplLG9uY2U6ZixwYXNzaXZlOmcsWWE6a30pO1BiW2FdPyh0aGlzLl9faGFuZGxlcnM9dGhpcy5fX2hhbmRsZXJzfHx7fSx0aGlzLl9faGFuZGxlcnNbYV09dGhpcy5fX2hhbmRsZXJzW2FdfHx7Y2FwdHVyZTpbXSxidWJibGU6W119LHRoaXMuX19oYW5kbGVyc1thXVtlPyJjYXB0dXJlIjoiYnViYmxlIl0ucHVzaChrKSk6dGhpcy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsayxjKX19fQpmdW5jdGlvbiBXYihhLGIsYyl7aWYoYil7aWYoSmJbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyk7aWYoYyYmIm9iamVjdCI9PT10eXBlb2YgYyl7dmFyIGQ9ISFjLmNhcHR1cmU7dmFyIGU9ISFjLm9uY2U7dmFyIGY9ISFjLnBhc3NpdmV9ZWxzZSBkPSEhYyxmPWU9ITE7dmFyIGc9YyYmYy4kfHx0aGlzLGg9dm9pZCAwO3ZhciBrPW51bGw7dHJ5e2s9YltHYl19Y2F0Y2gobCl7fWsmJihlPVRiKGssZyxhLGQsZSxmKSwtMTxlJiYoaD1rLnNwbGljZShlLDEpWzBdLllhLGsubGVuZ3RofHwoYltHYl09dm9pZCAwKSkpO3RoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGh8fGIsYyk7aCYmUGJbYV0mJnRoaXMuX19oYW5kbGVycyYmdGhpcy5fX2hhbmRsZXJzW2FdJiYoYT10aGlzLl9faGFuZGxlcnNbYV1bZD8iY2FwdHVyZSI6ImJ1YmJsZSJdLGg9YS5pbmRleE9mKGgpLC0xPGgmJmEuc3BsaWNlKGgsMSkpfX0KZnVuY3Rpb24gWGIoKXtmb3IodmFyIGEgaW4gUGIpd2luZG93Ll9fc2hhZHlfbmF0aXZlX2FkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXthLl9fdGFyZ2V0fHwoVmIoYSksU2IoYSkpfSwhMCl9CnZhciBZYj1CKHtnZXQgY29tcG9zZWQoKXt2b2lkIDA9PT10aGlzLl9fY29tcG9zZWQmJihIYj90aGlzLl9fY29tcG9zZWQ9ImZvY3VzaW4iPT09dGhpcy50eXBlfHwiZm9jdXNvdXQiPT09dGhpcy50eXBlfHxIYih0aGlzKTohMSE9PXRoaXMuaXNUcnVzdGVkJiYodGhpcy5fX2NvbXBvc2VkPUliW3RoaXMudHlwZV0pKTtyZXR1cm4gdGhpcy5fX2NvbXBvc2VkfHwhMX0sY29tcG9zZWRQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fX2NvbXBvc2VkUGF0aHx8KHRoaXMuX19jb21wb3NlZFBhdGg9TGIodGhpcy5fX3RhcmdldCx0aGlzLmNvbXBvc2VkKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZFBhdGh9LGdldCB0YXJnZXQoKXtyZXR1cm4gTmIodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuY29tcG9zZWRQYXRoKCkpfSxnZXQgcmVsYXRlZFRhcmdldCgpe2lmKCF0aGlzLl9fcmVsYXRlZFRhcmdldClyZXR1cm4gbnVsbDt0aGlzLl9fcmVsYXRlZFRhcmdldENvbXBvc2VkUGF0aHx8Cih0aGlzLl9fcmVsYXRlZFRhcmdldENvbXBvc2VkUGF0aD1MYih0aGlzLl9fcmVsYXRlZFRhcmdldCwhMCkpO3JldHVybiBOYih0aGlzLmN1cnJlbnRUYXJnZXR8fHRoaXMuX19wcmV2aW91c0N1cnJlbnRUYXJnZXQsdGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXtFdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uLmNhbGwodGhpcyk7dGhpcy5aPSEwfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXtFdmVudC5wcm90b3R5cGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLmNhbGwodGhpcyk7dGhpcy5aPXRoaXMuX19pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9ITB9fSk7CmZ1bmN0aW9uIFZiKGEpe2EuX190YXJnZXQ9YS50YXJnZXQ7YS5fX3JlbGF0ZWRUYXJnZXQ9YS5yZWxhdGVkVGFyZ2V0O2lmKHcubSl7dmFyIGI9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpO2lmKCFPYmplY3QuaGFzT3duUHJvcGVydHkoYiwiX19zaGFkeV9wYXRjaGVkUHJvdG8iKSl7dmFyIGM9T2JqZWN0LmNyZWF0ZShiKTtjLl9fc2hhZHlfc291cmNlUHJvdG89YjtBKGMsWWIpO2IuX19zaGFkeV9wYXRjaGVkUHJvdG89Y31hLl9fcHJvdG9fXz1iLl9fc2hhZHlfcGF0Y2hlZFByb3RvfWVsc2UgQShhLFliKX12YXIgWmI9T2IoRXZlbnQpLCRiPU9iKEN1c3RvbUV2ZW50KSxhYz1PYihNb3VzZUV2ZW50KTsKZnVuY3Rpb24gYmMoKXtpZighSGImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJpc1RydXN0ZWQiKSl7dmFyIGE9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgTW91c2VFdmVudCgiY2xpY2siLHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY29tcG9zZWQ6ITB9KTt0aGlzLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07RWxlbWVudC5wcm90b3R5cGUuY2xpY2s/RWxlbWVudC5wcm90b3R5cGUuY2xpY2s9YTpIVE1MRWxlbWVudC5wcm90b3R5cGUuY2xpY2smJihIVE1MRWxlbWVudC5wcm90b3R5cGUuY2xpY2s9YSl9fXZhciBjYz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhEb2N1bWVudC5wcm90b3R5cGUpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4ib24iPT09YS5zdWJzdHJpbmcoMCwyKX0pO2Z1bmN0aW9uIGRjKGEsYil7cmV0dXJue2luZGV4OmEsTDpbXSxSOmJ9fQpmdW5jdGlvbiBlYyhhLGIsYyxkKXt2YXIgZT0wLGY9MCxnPTAsaD0wLGs9TWF0aC5taW4oYi1lLGQtZik7aWYoMD09ZSYmMD09ZilhOntmb3IoZz0wO2c8aztnKyspaWYoYVtnXSE9PWNbZ10pYnJlYWsgYTtnPWt9aWYoYj09YS5sZW5ndGgmJmQ9PWMubGVuZ3RoKXtoPWEubGVuZ3RoO2Zvcih2YXIgbD1jLmxlbmd0aCxtPTA7bTxrLWcmJmZjKGFbLS1oXSxjWy0tbF0pOyltKys7aD1tfWUrPWc7Zis9ZztiLT1oO2QtPWg7aWYoMD09Yi1lJiYwPT1kLWYpcmV0dXJuW107aWYoZT09Yil7Zm9yKGI9ZGMoZSwwKTtmPGQ7KWIuTC5wdXNoKGNbZisrXSk7cmV0dXJuW2JdfWlmKGY9PWQpcmV0dXJuW2RjKGUsYi1lKV07az1lO2c9ZjtkPWQtZysxO2g9Yi1rKzE7Yj1BcnJheShkKTtmb3IobD0wO2w8ZDtsKyspYltsXT1BcnJheShoKSxiW2xdWzBdPWw7Zm9yKGw9MDtsPGg7bCsrKWJbMF1bbF09bDtmb3IobD0xO2w8ZDtsKyspZm9yKG09MTttPGg7bSsrKWlmKGFbayttLTFdPT09Y1tnK2wtMV0pYltsXVttXT0KYltsLTFdW20tMV07ZWxzZXt2YXIgcT1iW2wtMV1bbV0rMSx4PWJbbF1bbS0xXSsxO2JbbF1bbV09cTx4P3E6eH1rPWIubGVuZ3RoLTE7Zz1iWzBdLmxlbmd0aC0xO2Q9YltrXVtnXTtmb3IoYT1bXTswPGt8fDA8ZzspMD09az8oYS5wdXNoKDIpLGctLSk6MD09Zz8oYS5wdXNoKDMpLGstLSk6KGg9YltrLTFdW2ctMV0sbD1iW2stMV1bZ10sbT1iW2tdW2ctMV0scT1sPG0/bDxoP2w6aDptPGg/bTpoLHE9PWg/KGg9PWQ/YS5wdXNoKDApOihhLnB1c2goMSksZD1oKSxrLS0sZy0tKTpxPT1sPyhhLnB1c2goMyksay0tLGQ9bCk6KGEucHVzaCgyKSxnLS0sZD1tKSk7YS5yZXZlcnNlKCk7Yj12b2lkIDA7az1bXTtmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKXN3aXRjaChhW2ddKXtjYXNlIDA6YiYmKGsucHVzaChiKSxiPXZvaWQgMCk7ZSsrO2YrKzticmVhaztjYXNlIDE6Ynx8KGI9ZGMoZSwwKSk7Yi5SKys7ZSsrO2IuTC5wdXNoKGNbZl0pO2YrKzticmVhaztjYXNlIDI6Ynx8KGI9ZGMoZSwwKSk7CmIuUisrO2UrKzticmVhaztjYXNlIDM6Ynx8KGI9ZGMoZSwwKSksYi5MLnB1c2goY1tmXSksZisrfWImJmsucHVzaChiKTtyZXR1cm4ga31mdW5jdGlvbiBmYyhhLGIpe3JldHVybiBhPT09Yn07ZnVuY3Rpb24gZ2MoYSxiLGMpe0ViKGEpO2M9Y3x8bnVsbDt2YXIgZD11KGEpLGU9dShiKSxmPWM/dShjKTpudWxsO2QucHJldmlvdXNTaWJsaW5nPWM/Zi5wcmV2aW91c1NpYmxpbmc6Yi5fX3NoYWR5X2xhc3RDaGlsZDtpZihmPXYoZC5wcmV2aW91c1NpYmxpbmcpKWYubmV4dFNpYmxpbmc9YTtpZihmPXYoZC5uZXh0U2libGluZz1jKSlmLnByZXZpb3VzU2libGluZz1hO2QucGFyZW50Tm9kZT1iO2M/Yz09PWUuZmlyc3RDaGlsZCYmKGUuZmlyc3RDaGlsZD1hKTooZS5sYXN0Q2hpbGQ9YSxlLmZpcnN0Q2hpbGR8fChlLmZpcnN0Q2hpbGQ9YSkpO2UuY2hpbGROb2Rlcz1udWxsfQpmdW5jdGlvbiBoYyhhLGIsYyl7RmIoYik7dmFyIGQ9dShiKTt2b2lkIDAhPT1kLmZpcnN0Q2hpbGQmJihkLmNoaWxkTm9kZXM9bnVsbCk7aWYoYS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSl7ZD1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKylnYyhkW2VdLGIsYyk7YT11KGEpO2I9dm9pZCAwIT09YS5maXJzdENoaWxkP251bGw6dm9pZCAwO2EuZmlyc3RDaGlsZD1hLmxhc3RDaGlsZD1iO2EuY2hpbGROb2Rlcz1ifWVsc2UgZ2MoYSxiLGMpfQpmdW5jdGlvbiBpYyhhLGIpe3ZhciBjPXUoYSk7Yj11KGIpO2E9PT1iLmZpcnN0Q2hpbGQmJihiLmZpcnN0Q2hpbGQ9Yy5uZXh0U2libGluZyk7YT09PWIubGFzdENoaWxkJiYoYi5sYXN0Q2hpbGQ9Yy5wcmV2aW91c1NpYmxpbmcpO2E9Yy5wcmV2aW91c1NpYmxpbmc7dmFyIGQ9Yy5uZXh0U2libGluZzthJiYodShhKS5uZXh0U2libGluZz1kKTtkJiYodShkKS5wcmV2aW91c1NpYmxpbmc9YSk7Yy5wYXJlbnROb2RlPWMucHJldmlvdXNTaWJsaW5nPWMubmV4dFNpYmxpbmc9dm9pZCAwO3ZvaWQgMCE9PWIuY2hpbGROb2RlcyYmKGIuY2hpbGROb2Rlcz1udWxsKX0KZnVuY3Rpb24gamMoYSl7dmFyIGI9dShhKTtpZih2b2lkIDA9PT1iLmZpcnN0Q2hpbGQpe2IuY2hpbGROb2Rlcz1udWxsO3ZhciBjPWIuZmlyc3RDaGlsZD1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGR8fG51bGw7Yi5sYXN0Q2hpbGQ9YS5fX3NoYWR5X25hdGl2ZV9sYXN0Q2hpbGR8fG51bGw7RmIoYSk7Yj1jO2ZvcihjPXZvaWQgMDtiO2I9Yi5fX3NoYWR5X25hdGl2ZV9uZXh0U2libGluZyl7dmFyIGQ9dShiKTtkLnBhcmVudE5vZGU9YTtkLm5leHRTaWJsaW5nPWIuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd8fG51bGw7ZC5wcmV2aW91c1NpYmxpbmc9Y3x8bnVsbDtjPWI7RWIoYil9fX07dmFyIGtjPW51bGw7ZnVuY3Rpb24gRygpe2tjfHwoa2M9d2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pO3JldHVybiBrY3x8bnVsbH1mdW5jdGlvbiBsYyhhLGIpe3ZhciBjPUcoKTtjJiZjLnVuc2NvcGVOb2RlKGEsYil9ZnVuY3Rpb24gbWMoYSxiKXt2YXIgYz1HKCk7aWYoIWMpcmV0dXJuITA7aWYoYS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSl7Yz0hMDthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgZD0wO2MmJmQ8YS5sZW5ndGg7ZCsrKWM9YyYmbWMoYVtkXSxiKTtyZXR1cm4gY31yZXR1cm4gYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFPyEwOmMuY3VycmVudFNjb3BlRm9yTm9kZShhKT09PWJ9ZnVuY3Rpb24gbmMoYSl7aWYoYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiIiO3ZhciBiPUcoKTtyZXR1cm4gYj9iLmN1cnJlbnRTY29wZUZvck5vZGUoYSk6IiJ9CmZ1bmN0aW9uIG9jKGEsYil7aWYoYSl7YS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZiKGEpO2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBjPTAsZDtjPGEubGVuZ3RoO2MrKylkPWFbY10sZC5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZvYyhkLGIpfX07dmFyIHBjPXdpbmRvdy5kb2N1bWVudCxxYz13Lm9hLHJjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsImlzQ29ubmVjdGVkIiksc2M9cmMmJnJjLmdldDtmdW5jdGlvbiB0YyhhKXtmb3IodmFyIGI7Yj1hLl9fc2hhZHlfZmlyc3RDaGlsZDspYS5fX3NoYWR5X3JlbW92ZUNoaWxkKGIpfWZ1bmN0aW9uIHVjKGEpe3ZhciBiPXYoYSk7aWYoYiYmdm9pZCAwIT09Yi5LKXtiPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ9Yi5sZW5ndGgsZT12b2lkIDA7YzxkJiYoZT1iW2NdKTtjKyspdWMoZSl9aWYoYT12KGEpKWEuSz12b2lkIDB9ZnVuY3Rpb24gdmMoYSl7dmFyIGI9YTthJiYic2xvdCI9PT1hLmxvY2FsTmFtZSYmKGI9KGI9KGI9dihhKSkmJmIuRCkmJmIubGVuZ3RoP2JbMF06dmMoYS5fX3NoYWR5X25leHRTaWJsaW5nKSk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHdjKGEsYixjKXtpZihhPShhPXYoYSkpJiZhLkgpYiYmYS5hZGRlZE5vZGVzLnB1c2goYiksYyYmYS5yZW1vdmVkTm9kZXMucHVzaChjKSxhYihhKX0KdmFyIENjPUIoe2dldCBwYXJlbnROb2RlKCl7dmFyIGE9dih0aGlzKTthPWEmJmEucGFyZW50Tm9kZTtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZX0sZ2V0IGZpcnN0Q2hpbGQoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5maXJzdENoaWxkO3JldHVybiB2b2lkIDAhPT1hP2E6dGhpcy5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7dmFyIGE9dih0aGlzKTthPWEmJmEubGFzdENoaWxkO3JldHVybiB2b2lkIDAhPT1hP2E6dGhpcy5fX3NoYWR5X25hdGl2ZV9sYXN0Q2hpbGR9LGdldCBuZXh0U2libGluZygpe3ZhciBhPXYodGhpcyk7YT1hJiZhLm5leHRTaWJsaW5nO3JldHVybiB2b2lkIDAhPT1hP2E6dGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0U2libGluZ30sZ2V0IHByZXZpb3VzU2libGluZygpe3ZhciBhPXYodGhpcyk7YT1hJiZhLnByZXZpb3VzU2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfcHJldmlvdXNTaWJsaW5nfSwKZ2V0IGNoaWxkTm9kZXMoKXtpZih5KHRoaXMpKXt2YXIgYT12KHRoaXMpO2lmKCFhLmNoaWxkTm9kZXMpe2EuY2hpbGROb2Rlcz1bXTtmb3IodmFyIGI9dGhpcy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YjtiPWIuX19zaGFkeV9uZXh0U2libGluZylhLmNoaWxkTm9kZXMucHVzaChiKX12YXIgYz1hLmNoaWxkTm9kZXN9ZWxzZSBjPXRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGROb2RlcztjLml0ZW09ZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV19O3JldHVybiBjfSxnZXQgcGFyZW50RWxlbWVudCgpe3ZhciBhPXYodGhpcyk7KGE9YSYmYS5wYXJlbnROb2RlKSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYoYT1udWxsKTtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfcGFyZW50RWxlbWVudH0sZ2V0IGlzQ29ubmVjdGVkKCl7aWYoc2MmJnNjLmNhbGwodGhpcykpcmV0dXJuITA7aWYodGhpcy5ub2RlVHlwZT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXJldHVybiExOwp2YXIgYT10aGlzLm93bmVyRG9jdW1lbnQ7aWYoVGEpe2lmKGEuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykpcmV0dXJuITB9ZWxzZSBpZihhLmRvY3VtZW50RWxlbWVudCYmYS5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykpcmV0dXJuITA7Zm9yKGE9dGhpczthJiYhKGEgaW5zdGFuY2VvZiBEb2N1bWVudCk7KWE9YS5fX3NoYWR5X3BhcmVudE5vZGV8fCh6KGEpP2EuaG9zdDp2b2lkIDApO3JldHVybiEhKGEmJmEgaW5zdGFuY2VvZiBEb2N1bWVudCl9LGdldCB0ZXh0Q29udGVudCgpe2lmKHkodGhpcykpe2Zvcih2YXIgYT1bXSxiPTAsYz10aGlzLl9fc2hhZHlfY2hpbGROb2RlcyxkO2Q9Y1tiXTtiKyspZC5ub2RlVHlwZSE9PU5vZGUuQ09NTUVOVF9OT0RFJiZhLnB1c2goZC5fX3NoYWR5X3RleHRDb250ZW50KTtyZXR1cm4gYS5qb2luKCIiKX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV90ZXh0Q29udGVudH0sc2V0IHRleHRDb250ZW50KGEpe2lmKCJ1bmRlZmluZWQiPT09CnR5cGVvZiBhfHxudWxsPT09YSlhPSIiO3N3aXRjaCh0aGlzLm5vZGVUeXBlKXtjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOmNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOmlmKCF5KHRoaXMpJiZ3Lm0pe3ZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkOyhiIT10aGlzLl9fc2hhZHlfbGFzdENoaWxkfHxiJiZiLm5vZGVUeXBlIT1Ob2RlLlRFWFRfTk9ERSkmJnRjKHRoaXMpO3RoaXMuX19zaGFkeV9uYXRpdmVfdGV4dENvbnRlbnQ9YX1lbHNlIHRjKHRoaXMpLCgwPGEubGVuZ3RofHx0aGlzLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpJiZ0aGlzLl9fc2hhZHlfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpKTticmVhaztkZWZhdWx0OnRoaXMubm9kZVZhbHVlPWF9fSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1wYyYmYS5vd25lckRvY3VtZW50IT09cGMpcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsCmIpLGE7aWYoYT09PXRoaXMpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdhcHBlbmRDaGlsZCcgb24gJ05vZGUnOiBUaGUgbmV3IGNoaWxkIGVsZW1lbnQgY29udGFpbnMgdGhlIHBhcmVudC4iKTtpZihiKXt2YXIgYz12KGIpO2M9YyYmYy5wYXJlbnROb2RlO2lmKHZvaWQgMCE9PWMmJmMhPT10aGlzfHx2b2lkIDA9PT1jJiZiLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUhPT10aGlzKXRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnaW5zZXJ0QmVmb3JlJyBvbiAnTm9kZSc6IFRoZSBub2RlIGJlZm9yZSB3aGljaCB0aGUgbmV3IG5vZGUgaXMgdG8gYmUgaW5zZXJ0ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLiIpO31pZihiPT09YSlyZXR1cm4gYTt2YXIgZD1bXSxlPShjPXhjKHRoaXMpKT9jLmhvc3QubG9jYWxOYW1lOm5jKHRoaXMpLGY9YS5fX3NoYWR5X3BhcmVudE5vZGU7aWYoZil7dmFyIGc9bmMoYSk7Zi5fX3NoYWR5X3JlbW92ZUNoaWxkKGEsISFjfHwKIXhjKGEpKX1mPSEwO3ZhciBoPSghcWN8fHZvaWQgMD09PWEuX19ub0luc2VydGlvblBvaW50KSYmIW1jKGEsZSksaz1jJiYhYS5fX25vSW5zZXJ0aW9uUG9pbnQmJighcWN8fGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpO2lmKGt8fGgpaCYmKGc9Z3x8bmMoYSkpLG9jKGEsZnVuY3Rpb24oYSl7ayYmInNsb3QiPT09YS5sb2NhbE5hbWUmJmQucHVzaChhKTtpZihoKXt2YXIgYj1nO0coKSYmKGImJmxjKGEsYiksKGI9RygpKSYmYi5zY29wZU5vZGUoYSxlKSl9fSk7aWYoInNsb3QiPT09dGhpcy5sb2NhbE5hbWV8fGQubGVuZ3RoKWQubGVuZ3RoJiYoYy5jPWMuY3x8W10sYy5hPWMuYXx8W10sYy5iPWMuYnx8e30sYy5jLnB1c2guYXBwbHkoYy5jLGQgaW5zdGFuY2VvZiBBcnJheT9kOmphKGlhKGQpKSkpLGMmJkFjKGMpO3kodGhpcykmJihoYyhhLHRoaXMsYiksYz12KHRoaXMpLExhKHRoaXMpPyhBYyhjLnJvb3QpLGY9ITEpOmMucm9vdCYmKGY9ITEpKTtmPwooYz16KHRoaXMpP3RoaXMuaG9zdDp0aGlzLGI/KGI9dmMoYiksYy5fX3NoYWR5X25hdGl2ZV9pbnNlcnRCZWZvcmUoYSxiKSk6Yy5fX3NoYWR5X25hdGl2ZV9hcHBlbmRDaGlsZChhKSk6YS5vd25lckRvY3VtZW50IT09dGhpcy5vd25lckRvY3VtZW50JiZ0aGlzLm93bmVyRG9jdW1lbnQuYWRvcHROb2RlKGEpO3djKHRoaXMsYSk7cmV0dXJuIGF9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9fc2hhZHlfaW5zZXJ0QmVmb3JlKGEpfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8hMTpiO2lmKHRoaXMub3duZXJEb2N1bWVudCE9PXBjKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpO2lmKGEuX19zaGFkeV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiVGhlIG5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIG5vZGU6ICIrYSk7dmFyIGM9eGMoYSksZD1jJiZCYyhjLGEpLGU9dih0aGlzKTsKaWYoeSh0aGlzKSYmKGljKGEsdGhpcyksTGEodGhpcykpKXtBYyhlLnJvb3QpO3ZhciBmPSEwfWlmKEcoKSYmIWImJmMpe3ZhciBnPW5jKGEpO29jKGEsZnVuY3Rpb24oYSl7bGMoYSxnKX0pfXVjKGEpO2MmJigoYj10aGlzJiYic2xvdCI9PT10aGlzLmxvY2FsTmFtZSkmJihmPSEwKSwoZHx8YikmJkFjKGMpKTtmfHwoZj16KHRoaXMpP3RoaXMuaG9zdDp0aGlzLCghZS5yb290JiYic2xvdCIhPT1hLmxvY2FsTmFtZXx8Zj09PWEuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZSkmJmYuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSkpO3djKHRoaXMsbnVsbCxhKTtyZXR1cm4gYX0scmVwbGFjZUNoaWxkOmZ1bmN0aW9uKGEsYil7dGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpO3RoaXMuX19zaGFkeV9yZW1vdmVDaGlsZChiKTtyZXR1cm4gYX0sY2xvbmVOb2RlOmZ1bmN0aW9uKGEpe2lmKCJ0ZW1wbGF0ZSI9PXRoaXMubG9jYWxOYW1lKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2Nsb25lTm9kZShhKTsKdmFyIGI9dGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoITEpO2lmKGEmJmIubm9kZVR5cGUhPT1Ob2RlLkFUVFJJQlVURV9OT0RFKXthPXRoaXMuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLl9fc2hhZHlfY2xvbmVOb2RlKCEwKSxiLl9fc2hhZHlfYXBwZW5kQ2hpbGQoZCl9cmV0dXJuIGJ9LGdldFJvb3ROb2RlOmZ1bmN0aW9uKGEpe2lmKHRoaXMmJnRoaXMubm9kZVR5cGUpe3ZhciBiPXUodGhpcyksYz1iLks7dm9pZCAwPT09YyYmKHoodGhpcyk/KGM9dGhpcyxiLks9Yyk6KGM9KGM9dGhpcy5fX3NoYWR5X3BhcmVudE5vZGUpP2MuX19zaGFkeV9nZXRSb290Tm9kZShhKTp0aGlzLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5fX3NoYWR5X25hdGl2ZV9jb250YWlucyh0aGlzKSYmKGIuSz1jKSkpO3JldHVybiBjfX0sY29udGFpbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIFVhKHRoaXMsYSl9fSk7ZnVuY3Rpb24gRGMoYSxiLGMpe3ZhciBkPVtdO0VjKGEuX19zaGFkeV9jaGlsZE5vZGVzLGIsYyxkKTtyZXR1cm4gZH1mdW5jdGlvbiBFYyhhLGIsYyxkKXtmb3IodmFyIGU9MCxmPWEubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9YVtlXSk7ZSsrKXt2YXIgaDtpZihoPWcubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7aD1nO3ZhciBrPWIsbD1jLG09ZCxxPWsoaCk7cSYmbS5wdXNoKGgpO2wmJmwocSk/aD1xOihFYyhoLl9fc2hhZHlfY2hpbGROb2RlcyxrLGwsbSksaD12b2lkIDApfWlmKGgpYnJlYWt9fQp2YXIgRmM9Qih7Z2V0IGZpcnN0RWxlbWVudENoaWxkKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLmZpcnN0Q2hpbGQpe2ZvcihhPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLl9fc2hhZHlfbmV4dFNpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RFbGVtZW50Q2hpbGR9LGdldCBsYXN0RWxlbWVudENoaWxkKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLmxhc3RDaGlsZCl7Zm9yKGE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZDthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9sYXN0RWxlbWVudENoaWxkfSxnZXQgY2hpbGRyZW4oKXtyZXR1cm4geSh0aGlzKT9WYShBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodGhpcy5fX3NoYWR5X2NoaWxkTm9kZXMsCmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREV9KSk6dGhpcy5fX3NoYWR5X25hdGl2ZV9jaGlsZHJlbn0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7dmFyIGE9dGhpcy5fX3NoYWR5X2NoaWxkcmVuO3JldHVybiBhP2EubGVuZ3RoOjB9fSksR2M9Qih7cXVlcnlTZWxlY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gRGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gT2EuY2FsbChiLGEpfSxmdW5jdGlvbihhKXtyZXR1cm4hIWF9KVswXXx8bnVsbH0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhLGIpe2lmKGIpe2I9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpKTt2YXIgYz10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtyZXR1cm4gYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9nZXRSb290Tm9kZSgpPT1jfSl9cmV0dXJuIERjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIE9hLmNhbGwoYiwKYSl9KX19KSxIYz13Lm9hP09iamVjdC5hc3NpZ24oe30sRmMpOkZjO09iamVjdC5hc3NpZ24oRmMsR2MpO3ZhciBJYz1CKHtnZXRFbGVtZW50QnlJZDpmdW5jdGlvbihhKXtyZXR1cm4iIj09PWE/bnVsbDpEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBiLmlkPT1hfSxmdW5jdGlvbihhKXtyZXR1cm4hIWF9KVswXXx8bnVsbH19KTt2YXIgSmM9Qih7Z2V0IGFjdGl2ZUVsZW1lbnQoKXt2YXIgYT13Lm0/ZG9jdW1lbnQuX19zaGFkeV9uYXRpdmVfYWN0aXZlRWxlbWVudDpkb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKCFhfHwhYS5ub2RlVHlwZSlyZXR1cm4gbnVsbDt2YXIgYj0hIXoodGhpcyk7aWYoISh0aGlzPT09ZG9jdW1lbnR8fGImJnRoaXMuaG9zdCE9PWEmJnRoaXMuaG9zdC5fX3NoYWR5X25hdGl2ZV9jb250YWlucyhhKSkpcmV0dXJuIG51bGw7Zm9yKGI9eGMoYSk7YiYmYiE9PXRoaXM7KWE9Yi5ob3N0LGI9eGMoYSk7cmV0dXJuIHRoaXM9PT1kb2N1bWVudD9iP251bGw6YTpiPT09dGhpcz9hOm51bGx9fSk7dmFyIEtjPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiaW5lcnQiKSxMYz1CKHtnZXQgaW5uZXJIVE1MKCl7cmV0dXJuIHkodGhpcyk/a2IoInRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lP3RoaXMuY29udGVudDp0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfY2hpbGROb2Rlc30pOnRoaXMuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MfSxzZXQgaW5uZXJIVE1MKGEpe2lmKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZSl0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTD1hO2Vsc2V7dGModGhpcyk7dmFyIGI9dGhpcy5sb2NhbE5hbWV8fCJkaXYiO2I9dGhpcy5uYW1lc3BhY2VVUkkmJnRoaXMubmFtZXNwYWNlVVJJIT09S2MubmFtZXNwYWNlVVJJP0tjLmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSxiKTpLYy5jcmVhdGVFbGVtZW50KGIpO2Zvcih3Lm0/Yi5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTpiLmlubmVySFRNTD0KYTthPWIuX19zaGFkeV9maXJzdENoaWxkOyl0aGlzLl9fc2hhZHlfaW5zZXJ0QmVmb3JlKGEpfX19KTt2YXIgTWM9Qih7YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIsYyl7Im9iamVjdCIhPT10eXBlb2YgYyYmKGM9e2NhcHR1cmU6ISFjfSk7Yy4kPXRoaXM7dGhpcy5ob3N0Ll9fc2hhZHlfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuJD10aGlzO3RoaXMuaG9zdC5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpfX0pO2Z1bmN0aW9uIE5jKGEsYil7QShhLE1jLGIpO0EoYSxKYyxiKTtBKGEsTGMsYik7QShhLEZjLGIpO3cuSiYmIWI/KEEoYSxDYyxiKSxBKGEsSWMsYikpOncubXx8KEEoYSxBYiksQShhLHpiKSl9O3ZhciBPYz17fSxQYz13LmRlZmVyQ29ubmVjdGlvbkNhbGxiYWNrcyYmImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSxRYztmdW5jdGlvbiBSYyhhKXt2YXIgYj1bXTtkbyBiLnVuc2hpZnQoYSk7d2hpbGUoYT1hLl9fc2hhZHlfcGFyZW50Tm9kZSk7cmV0dXJuIGJ9CmZ1bmN0aW9uIFNjKGEsYixjKXtpZihhIT09T2MpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpO3RoaXMuemE9IlNoYWR5Um9vdCI7dGhpcy5ob3N0PWI7dGhpcy5tb2RlPWMmJmMubW9kZTtqYyhiKTthPXUoYik7YS5yb290PXRoaXM7YS5wYT0iY2xvc2VkIiE9PXRoaXMubW9kZT90aGlzOm51bGw7YT11KHRoaXMpO2EuZmlyc3RDaGlsZD1hLmxhc3RDaGlsZD1hLnBhcmVudE5vZGU9YS5uZXh0U2libGluZz1hLnByZXZpb3VzU2libGluZz1udWxsO2EuY2hpbGROb2Rlcz1bXTt0aGlzLmJhPXRoaXMuQj0hMTt0aGlzLmM9dGhpcy5iPXRoaXMuYT1udWxsO2lmKHcucHJlZmVyUGVyZm9ybWFuY2UpZm9yKDthPWIuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZDspYi5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtlbHNlIEFjKHRoaXMpfWZ1bmN0aW9uIEFjKGEpe2EuQnx8KGEuQj0hMCxZYShmdW5jdGlvbigpe3JldHVybiBUYyhhKX0pKX0KZnVuY3Rpb24gVGMoYSl7dmFyIGI7aWYoYj1hLkIpe2Zvcih2YXIgYzthOylhOnthLkImJihjPWEpLGI9YTthPWIuaG9zdC5fX3NoYWR5X2dldFJvb3ROb2RlKCk7aWYoeihhKSYmKGI9dihiLmhvc3QpKSYmMDxiLk4pYnJlYWsgYTthPXZvaWQgMH1iPWN9KGM9YikmJmMuX3JlbmRlclNlbGYoKX0KU2MucHJvdG90eXBlLl9yZW5kZXJTZWxmPWZ1bmN0aW9uKCl7dmFyIGE9UGM7UGM9ITA7dGhpcy5CPSExO2lmKHRoaXMuYSl7VWModGhpcyk7Zm9yKHZhciBiPTAsYztiPHRoaXMuYS5sZW5ndGg7YisrKXtjPXRoaXMuYVtiXTt2YXIgZD12KGMpLGU9ZC5hc3NpZ25lZE5vZGVzO2QuYXNzaWduZWROb2Rlcz1bXTtkLkQ9W107aWYoZC5jYT1lKWZvcihkPTA7ZDxlLmxlbmd0aDtkKyspe3ZhciBmPXYoZVtkXSk7Zi5QPWYuYXNzaWduZWRTbG90O2YuYXNzaWduZWRTbG90PT09YyYmKGYuYXNzaWduZWRTbG90PW51bGwpfX1mb3IoYj10aGlzLmhvc3QuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpVmModGhpcyxiKTtmb3IoYj0wO2I8dGhpcy5hLmxlbmd0aDtiKyspe2M9dGhpcy5hW2JdO2U9dihjKTtpZighZS5hc3NpZ25lZE5vZGVzLmxlbmd0aClmb3IoZD1jLl9fc2hhZHlfZmlyc3RDaGlsZDtkO2Q9ZC5fX3NoYWR5X25leHRTaWJsaW5nKVZjKHRoaXMsCmQsYyk7KGQ9KGQ9dihjLl9fc2hhZHlfcGFyZW50Tm9kZSkpJiZkLnJvb3QpJiYoTWEoZCl8fGQuQikmJmQuX3JlbmRlclNlbGYoKTtXYyh0aGlzLGUuRCxlLmFzc2lnbmVkTm9kZXMpO2lmKGQ9ZS5jYSl7Zm9yKGY9MDtmPGQubGVuZ3RoO2YrKyl2KGRbZl0pLlA9bnVsbDtlLmNhPW51bGw7ZC5sZW5ndGg+ZS5hc3NpZ25lZE5vZGVzLmxlbmd0aCYmKGUuVD0hMCl9ZS5UJiYoZS5UPSExLFhjKHRoaXMsYykpfWM9dGhpcy5hO2I9W107Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylkPWNbZV0uX19zaGFkeV9wYXJlbnROb2RlLChmPXYoZCkpJiZmLnJvb3R8fCEoMD5iLmluZGV4T2YoZCkpfHxiLnB1c2goZCk7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl7Zj1iW2NdO2U9Zj09PXRoaXM/dGhpcy5ob3N0OmY7ZD1bXTtmPWYuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgZz0wO2c8Zi5sZW5ndGg7ZysrKXt2YXIgaD1mW2ddO2lmKCJzbG90Ij09aC5sb2NhbE5hbWUpe2g9dihoKS5EO2Zvcih2YXIgaz0KMDtrPGgubGVuZ3RoO2srKylkLnB1c2goaFtrXSl9ZWxzZSBkLnB1c2goaCl9Zj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXMpO2c9ZWMoZCxkLmxlbmd0aCxmLGYubGVuZ3RoKTtrPWg9MDtmb3IodmFyIGw9dm9pZCAwO2g8Zy5sZW5ndGgmJihsPWdbaF0pO2grKyl7Zm9yKHZhciBtPTAscT12b2lkIDA7bTxsLkwubGVuZ3RoJiYocT1sLkxbbV0pO20rKylxLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU9PT1lJiZlLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKHEpLGYuc3BsaWNlKGwuaW5kZXgraywxKTtrLT1sLlJ9az0wO2ZvcihsPXZvaWQgMDtrPGcubGVuZ3RoJiYobD1nW2tdKTtrKyspZm9yKGg9ZltsLmluZGV4XSxtPWwuaW5kZXg7bTxsLmluZGV4K2wuUjttKyspcT1kW21dLGUuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKHEsaCksZi5zcGxpY2UobSwwLHEpfX1pZighdy5wcmVmZXJQZXJmb3JtYW5jZSYmIXRoaXMuYmEpZm9yKGI9CnRoaXMuaG9zdC5fX3NoYWR5X2NoaWxkTm9kZXMsYz0wLGU9Yi5sZW5ndGg7YzxlO2MrKylkPWJbY10sZj12KGQpLGQuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZSE9PXRoaXMuaG9zdHx8InNsb3QiIT09ZC5sb2NhbE5hbWUmJmYuYXNzaWduZWRTbG90fHx0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoZCk7dGhpcy5iYT0hMDtQYz1hO1FjJiZRYygpfTtmdW5jdGlvbiBWYyhhLGIsYyl7dmFyIGQ9dShiKSxlPWQuUDtkLlA9bnVsbDtjfHwoYz0oYT1hLmJbYi5fX3NoYWR5X3Nsb3R8fCJfX2NhdGNoYWxsIl0pJiZhWzBdKTtjPyh1KGMpLmFzc2lnbmVkTm9kZXMucHVzaChiKSxkLmFzc2lnbmVkU2xvdD1jKTpkLmFzc2lnbmVkU2xvdD12b2lkIDA7ZSE9PWQuYXNzaWduZWRTbG90JiZkLmFzc2lnbmVkU2xvdCYmKHUoZC5hc3NpZ25lZFNsb3QpLlQ9ITApfQpmdW5jdGlvbiBXYyhhLGIsYyl7Zm9yKHZhciBkPTAsZT12b2lkIDA7ZDxjLmxlbmd0aCYmKGU9Y1tkXSk7ZCsrKWlmKCJzbG90Ij09ZS5sb2NhbE5hbWUpe3ZhciBmPXYoZSkuYXNzaWduZWROb2RlcztmJiZmLmxlbmd0aCYmV2MoYSxiLGYpfWVsc2UgYi5wdXNoKGNbZF0pfWZ1bmN0aW9uIFhjKGEsYil7Yi5fX3NoYWR5X25hdGl2ZV9kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgic2xvdGNoYW5nZSIpKTtiPXYoYik7Yi5hc3NpZ25lZFNsb3QmJlhjKGEsYi5hc3NpZ25lZFNsb3QpfQpmdW5jdGlvbiBVYyhhKXtpZihhLmMmJmEuYy5sZW5ndGgpe2Zvcih2YXIgYj1hLmMsYyxkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBlPWJbZF07amMoZSk7dmFyIGY9ZS5fX3NoYWR5X3BhcmVudE5vZGU7amMoZik7Zj12KGYpO2YuTj0oZi5OfHwwKSsxO2Y9WWMoZSk7YS5iW2ZdPyhjPWN8fHt9LGNbZl09ITAsYS5iW2ZdLnB1c2goZSkpOmEuYltmXT1bZV07YS5hLnB1c2goZSl9aWYoYylmb3IodmFyIGcgaW4gYylhLmJbZ109WmMoYS5iW2ddKTthLmM9W119fWZ1bmN0aW9uIFljKGEpe3ZhciBiPWEubmFtZXx8YS5nZXRBdHRyaWJ1dGUoIm5hbWUiKXx8Il9fY2F0Y2hhbGwiO3JldHVybiBhLndhPWJ9CmZ1bmN0aW9uIFpjKGEpe3JldHVybiBhLnNvcnQoZnVuY3Rpb24oYSxjKXthPVJjKGEpO2Zvcih2YXIgYj1SYyhjKSxlPTA7ZTxhLmxlbmd0aDtlKyspe2M9YVtlXTt2YXIgZj1iW2VdO2lmKGMhPT1mKXJldHVybiBhPUFycmF5LmZyb20oYy5fX3NoYWR5X3BhcmVudE5vZGUuX19zaGFkeV9jaGlsZE5vZGVzKSxhLmluZGV4T2YoYyktYS5pbmRleE9mKGYpfX0pfQpmdW5jdGlvbiBCYyhhLGIpe2lmKGEuYSl7VWMoYSk7dmFyIGM9YS5iLGQ7Zm9yKGQgaW4gYylmb3IodmFyIGU9Y1tkXSxmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07aWYoVWEoYixnKSl7ZS5zcGxpY2UoZiwxKTt2YXIgaD1hLmEuaW5kZXhPZihnKTswPD1oJiYoYS5hLnNwbGljZShoLDEpLChoPXYoZy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmaC5OJiZoLk4tLSk7Zi0tO2c9dihnKTtpZihoPWcuRClmb3IodmFyIGs9MDtrPGgubGVuZ3RoO2srKyl7dmFyIGw9aFtrXSxtPWwuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZTttJiZtLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGwpfWcuRD1bXTtnLmFzc2lnbmVkTm9kZXM9W107aD0hMH19cmV0dXJuIGh9fWZ1bmN0aW9uIE1hKGEpe1VjKGEpO3JldHVybiEoIWEuYXx8IWEuYS5sZW5ndGgpfQooZnVuY3Rpb24oYSl7YS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7TmMoYSwiX19zaGFkeV8iKTtOYyhhKTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhLHtub2RlVHlwZTp7dmFsdWU6Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFLGNvbmZpZ3VyYWJsZTohMH0sbm9kZU5hbWU6e3ZhbHVlOiIjZG9jdW1lbnQtZnJhZ21lbnQiLGNvbmZpZ3VyYWJsZTohMH0sbm9kZVZhbHVlOnt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMH19KTtbImxvY2FsTmFtZSIsIm5hbWVzcGFjZVVSSSIsInByZWZpeCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7dmFsdWU6dm9pZCAwLGNvbmZpZ3VyYWJsZTohMH0pfSk7WyJvd25lckRvY3VtZW50IiwiYmFzZVVSSSIsImlzQ29ubmVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3N0W2JdfSwKY29uZmlndXJhYmxlOiEwfSl9KX0pKFNjLnByb3RvdHlwZSk7CmlmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmdy5lYSYmIXcucHJlZmVyUGVyZm9ybWFuY2Upe3ZhciAkYz1uZXcgTWFwO1FjPWZ1bmN0aW9uKCl7dmFyIGE9W107JGMuZm9yRWFjaChmdW5jdGlvbihiLGMpe2EucHVzaChbYyxiXSl9KTskYy5jbGVhcigpO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1hW2JdWzBdO2FbYl1bMV0/Yy51YSgpOmMudmEoKX19O1BjJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbigpe1BjPSExO1FjKCl9LHtvbmNlOiEwfSk7dmFyIGFkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0wLGU9Il9faXNDb25uZWN0ZWQiK2QrKztpZihifHxjKWEucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWEucHJvdG90eXBlLnVhPWZ1bmN0aW9uKCl7UGM/JGMuc2V0KHRoaXMsITApOnRoaXNbZV18fCh0aGlzW2VdPSEwLGImJmIuY2FsbCh0aGlzKSl9LGEucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPQphLnByb3RvdHlwZS52YT1mdW5jdGlvbigpe1BjP3RoaXMuaXNDb25uZWN0ZWR8fCRjLnNldCh0aGlzLCExKTp0aGlzW2VdJiYodGhpc1tlXT0hMSxjJiZjLmNhbGwodGhpcykpfTtyZXR1cm4gYX0sYmQ9d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LkN1c3RvbUVsZW1lbnRSZWdpc3RyeS5wcm90b3R5cGUsImRlZmluZSIse3ZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2ssZD1iLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaztiZC5jYWxsKHdpbmRvdy5jdXN0b21FbGVtZW50cyxhLGFkKGIsYyxkKSk7Yi5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2s9YztiLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz1kfX0pfWZ1bmN0aW9uIHhjKGEpe2E9YS5fX3NoYWR5X2dldFJvb3ROb2RlKCk7aWYoeihhKSlyZXR1cm4gYX07ZnVuY3Rpb24gY2QoYSl7dGhpcy5ub2RlPWF9bj1jZC5wcm90b3R5cGU7bi5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyl9O24ucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpfTtuLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hcHBlbmRDaGlsZChhKX07bi5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfaW5zZXJ0QmVmb3JlKGEsYil9O24ucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3JlbW92ZUNoaWxkKGEpfTtuLnJlcGxhY2VDaGlsZD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZXBsYWNlQ2hpbGQoYSxiKX07Cm4uY2xvbmVOb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9jbG9uZU5vZGUoYSl9O24uZ2V0Um9vdE5vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2dldFJvb3ROb2RlKGEpfTtuLmNvbnRhaW5zPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9jb250YWlucyhhKX07bi5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9kaXNwYXRjaEV2ZW50KGEpfTtuLnNldEF0dHJpYnV0ZT1mdW5jdGlvbihhLGIpe3RoaXMubm9kZS5fX3NoYWR5X3NldEF0dHJpYnV0ZShhLGIpfTtuLmdldEF0dHJpYnV0ZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2dldEF0dHJpYnV0ZShhKX07bi5oYXNBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9oYXNBdHRyaWJ1dGUoYSl9O24ucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3JlbW92ZUF0dHJpYnV0ZShhKX07Cm4uYXR0YWNoU2hhZG93PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hdHRhY2hTaGFkb3coYSl9O24uZm9jdXM9ZnVuY3Rpb24oKXt0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfZm9jdXMoKX07bi5ibHVyPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfYmx1cigpfTtuLmltcG9ydE5vZGU9ZnVuY3Rpb24oYSxiKXtpZih0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2ltcG9ydE5vZGUoYSxiKX07bi5nZXRFbGVtZW50QnlJZD1mdW5jdGlvbihhKXtpZih0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2dldEVsZW1lbnRCeUlkKGEpfTtuLnF1ZXJ5U2VsZWN0b3I9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3IoYSl9OwpuLnF1ZXJ5U2VsZWN0b3JBbGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcXVlcnlTZWxlY3RvckFsbChhLGIpfTtuLmFzc2lnbmVkTm9kZXM9ZnVuY3Rpb24oYSl7aWYoInNsb3QiPT09dGhpcy5ub2RlLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXNzaWduZWROb2RlcyhhKX07CnAuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2QucHJvdG90eXBlLHthY3RpdmVFbGVtZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZih6KHRoaXMubm9kZSl8fHRoaXMubm9kZS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfTk9ERSlyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYWN0aXZlRWxlbWVudH19LF9hY3RpdmVFbGVtZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmVFbGVtZW50fX0saG9zdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoeih0aGlzLm5vZGUpKXJldHVybiB0aGlzLm5vZGUuaG9zdH19LHBhcmVudE5vZGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wYXJlbnROb2RlfX0sZmlyc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLAplbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9maXJzdENoaWxkfX0sbGFzdENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbGFzdENoaWxkfX0sbmV4dFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uZXh0U2libGluZ319LHByZXZpb3VzU2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3ByZXZpb3VzU2libGluZ319LGNoaWxkTm9kZXM6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9jaGlsZE5vZGVzfX0scGFyZW50RWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsCmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wYXJlbnRFbGVtZW50fX0sZmlyc3RFbGVtZW50Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH19LGxhc3RFbGVtZW50Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9sYXN0RWxlbWVudENoaWxkfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dEVsZW1lbnRTaWJsaW5nfX0scHJldmlvdXNFbGVtZW50U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9fSwKY2hpbGRyZW46e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9jaGlsZHJlbn19LGNoaWxkRWxlbWVudENvdW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRFbGVtZW50Q291bnR9fSxzaGFkb3dSb290Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2hhZG93Um9vdH19LGFzc2lnbmVkU2xvdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkU2xvdH19LGlzQ29ubmVjdGVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfaXNDb25uZWN0ZWR9fSxpbm5lckhUTUw6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5ub2RlLl9fc2hhZHlfaW5uZXJIVE1MPWF9fSx0ZXh0Q29udGVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5ub2RlLl9fc2hhZHlfdGV4dENvbnRlbnQ9YX19LHNsb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9zbG90fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5ub2RlLl9fc2hhZHlfc2xvdD1hfX19KTsKY2MuZm9yRWFjaChmdW5jdGlvbihhKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoY2QucHJvdG90eXBlLGEse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVbIl9fc2hhZHlfIithXX0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMubm9kZVsiX19zaGFkeV8iK2FdPWJ9LGNvbmZpZ3VyYWJsZTohMH0pfSk7dmFyIGRkPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGVkKGEpe2lmKHooYSl8fGEgaW5zdGFuY2VvZiBjZClyZXR1cm4gYTt2YXIgYj1kZC5nZXQoYSk7Ynx8KGI9bmV3IGNkKGEpLGRkLnNldChhLGIpKTtyZXR1cm4gYn07dmFyIGZkPUIoe2Rpc3BhdGNoRXZlbnQ6ZnVuY3Rpb24oYSl7WmEoKTtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9kaXNwYXRjaEV2ZW50KGEpfSxhZGRFdmVudExpc3RlbmVyOlViLHJlbW92ZUV2ZW50TGlzdGVuZXI6V2J9KTt2YXIgZ2Q9Qih7Z2V0IGFzc2lnbmVkU2xvdCgpe3ZhciBhPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlOyhhPWEmJmEuX19zaGFkeV9zaGFkb3dSb290KSYmVGMoYSk7cmV0dXJuKGE9dih0aGlzKSkmJmEuYXNzaWduZWRTbG90fHxudWxsfX0pO3ZhciBoZD13aW5kb3cuZG9jdW1lbnQ7ZnVuY3Rpb24gaWQoYSxiKXtpZigic2xvdCI9PT1iKWE9YS5fX3NoYWR5X3BhcmVudE5vZGUsTGEoYSkmJkFjKHYoYSkucm9vdCk7ZWxzZSBpZigic2xvdCI9PT1hLmxvY2FsTmFtZSYmIm5hbWUiPT09YiYmKGI9eGMoYSkpKXtpZihiLmEpe1VjKGIpO3ZhciBjPWEud2EsZD1ZYyhhKTtpZihkIT09Yyl7Yz1iLmJbY107dmFyIGU9Yy5pbmRleE9mKGEpOzA8PWUmJmMuc3BsaWNlKGUsMSk7Yz1iLmJbZF18fChiLmJbZF09W10pO2MucHVzaChhKTsxPGMubGVuZ3RoJiYoYi5iW2RdPVpjKGMpKX19QWMoYil9fQp2YXIgamQ9Qih7Z2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2lmKGEmJnZvaWQgMCE9PWEucHJldmlvdXNTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfcHJldmlvdXNTaWJsaW5nO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLl9fc2hhZHlfcHJldmlvdXNTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9LGdldCBuZXh0RWxlbWVudFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2lmKGEmJnZvaWQgMCE9PWEubmV4dFNpYmxpbmcpe2ZvcihhPXRoaXMuX19zaGFkeV9uZXh0U2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X25leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX25leHRFbGVtZW50U2libGluZ30sZ2V0IHNsb3QoKXtyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoInNsb3QiKX0sCnNldCBzbG90KGEpe3RoaXMuX19zaGFkeV9zZXRBdHRyaWJ1dGUoInNsb3QiLGEpfSxnZXQgc2hhZG93Um9vdCgpe3ZhciBhPXYodGhpcyk7cmV0dXJuIGEmJmEucGF8fG51bGx9LGdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifSxzZXQgY2xhc3NOYW1lKGEpe3RoaXMuX19zaGFkeV9zZXRBdHRyaWJ1dGUoImNsYXNzIixhKX0sc2V0QXR0cmlidXRlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09aGQpdGhpcy5fX3NoYWR5X25hdGl2ZV9zZXRBdHRyaWJ1dGUoYSxiKTtlbHNle3ZhciBjOyhjPUcoKSkmJiJjbGFzcyI9PT1hPyhjLnNldEVsZW1lbnRDbGFzcyh0aGlzLGIpLGM9ITApOmM9ITE7Y3x8KHRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYiksaWQodGhpcyxhKSl9fSxyZW1vdmVBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7dGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVBdHRyaWJ1dGUoYSk7aWQodGhpcywKYSl9LGF0dGFjaFNoYWRvdzpmdW5jdGlvbihhKXtpZighdGhpcyl0aHJvdyBFcnJvcigiTXVzdCBwcm92aWRlIGEgaG9zdC4iKTtpZighYSl0aHJvdyBFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMuIik7cmV0dXJuIG5ldyBTYyhPYyx0aGlzLGEpfX0pO3ZhciBrZD1CKHtibHVyOmZ1bmN0aW9uKCl7dmFyIGE9dih0aGlzKTsoYT0oYT1hJiZhLnJvb3QpJiZhLmFjdGl2ZUVsZW1lbnQpP2EuX19zaGFkeV9ibHVyKCk6dGhpcy5fX3NoYWR5X25hdGl2ZV9ibHVyKCl9fSk7Y2MuZm9yRWFjaChmdW5jdGlvbihhKXtrZFthXT17c2V0OmZ1bmN0aW9uKGIpe3ZhciBjPXUodGhpcyksZD1hLnN1YnN0cmluZygyKTtjLk9bYV0mJnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLGMuT1thXSk7dGhpcy5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoZCxiKTtjLk9bYV09Yn0sZ2V0OmZ1bmN0aW9uKCl7dmFyIGI9dih0aGlzKTtyZXR1cm4gYiYmYi5PW2FdfSxjb25maWd1cmFibGU6ITB9fSk7dmFyIGxkPUIoe2Fzc2lnbmVkTm9kZXM6ZnVuY3Rpb24oYSl7aWYoInNsb3QiPT09dGhpcy5sb2NhbE5hbWUpe3ZhciBiPXRoaXMuX19zaGFkeV9nZXRSb290Tm9kZSgpO2ImJnooYikmJlRjKGIpO3JldHVybihiPXYodGhpcykpPyhhJiZhLmZsYXR0ZW4/Yi5EOmIuYXNzaWduZWROb2Rlcyl8fFtdOltdfX19KTt2YXIgbWQ9d2luZG93LmRvY3VtZW50LG5kPUIoe2ltcG9ydE5vZGU6ZnVuY3Rpb24oYSxiKXtpZihhLm93bmVyRG9jdW1lbnQhPT1tZHx8InRlbXBsYXRlIj09PWEubG9jYWxOYW1lKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ltcG9ydE5vZGUoYSxiKTt2YXIgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2ltcG9ydE5vZGUoYSwhMSk7aWYoYil7YT1hLl9fc2hhZHlfY2hpbGROb2RlcztiPTA7Zm9yKHZhciBkO2I8YS5sZW5ndGg7YisrKWQ9dGhpcy5fX3NoYWR5X2ltcG9ydE5vZGUoYVtiXSwhMCksYy5fX3NoYWR5X2FwcGVuZENoaWxkKGQpfXJldHVybiBjfX0pO3ZhciBvZD1CKHthZGRFdmVudExpc3RlbmVyOlViLmJpbmQod2luZG93KSxyZW1vdmVFdmVudExpc3RlbmVyOldiLmJpbmQod2luZG93KX0pO3ZhciBwZD17fTtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwicGFyZW50RWxlbWVudCIpJiYocGQucGFyZW50RWxlbWVudD1DYy5wYXJlbnRFbGVtZW50KTtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwiY29udGFpbnMiKSYmKHBkLmNvbnRhaW5zPUNjLmNvbnRhaW5zKTtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwiY2hpbGRyZW4iKSYmKHBkLmNoaWxkcmVuPUZjLmNoaWxkcmVuKTtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwiaW5uZXJIVE1MIikmJihwZC5pbm5lckhUTUw9TGMuaW5uZXJIVE1MKTtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwiY2xhc3NOYW1lIikmJihwZC5jbGFzc05hbWU9amQuY2xhc3NOYW1lKTsKdmFyIHFkPXtFdmVudFRhcmdldDpbZmRdLE5vZGU6W0NjLHdpbmRvdy5FdmVudFRhcmdldD9udWxsOmZkXSxUZXh0OltnZF0sRWxlbWVudDpbamQsRmMsZ2QsIXcubXx8ImlubmVySFRNTCJpbiBFbGVtZW50LnByb3RvdHlwZT9MYzpudWxsLHdpbmRvdy5IVE1MU2xvdEVsZW1lbnQ/bnVsbDpsZF0sSFRNTEVsZW1lbnQ6W2tkLHBkXSxIVE1MU2xvdEVsZW1lbnQ6W2xkXSxEb2N1bWVudEZyYWdtZW50OltIYyxJY10sRG9jdW1lbnQ6W25kLEhjLEljLEpjXSxXaW5kb3c6W29kXX0scmQ9dy5tP251bGw6WyJpbm5lckhUTUwiLCJ0ZXh0Q29udGVudCJdO2Z1bmN0aW9uIHNkKGEpe3ZhciBiPWE/bnVsbDpyZCxjPXt9LGQ7Zm9yKGQgaW4gcWQpYy5XPXdpbmRvd1tkXSYmd2luZG93W2RdLnByb3RvdHlwZSxxZFtkXS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gYy5XJiZkJiZBKGMuVyxkLGEsYil9fShjKSksYz17VzpjLld9fTtpZih3LmVhKXt2YXIgU2hhZHlET009e2luVXNlOncuZWEscGF0Y2g6ZnVuY3Rpb24oYSl7RmIoYSk7RWIoYSk7cmV0dXJuIGF9LGlzU2hhZHlSb290OnosZW5xdWV1ZTpZYSxmbHVzaDpaYSxmbHVzaEluaXRpYWw6ZnVuY3Rpb24oYSl7IWEuYmEmJmEuQiYmVGMoYSl9LHNldHRpbmdzOncsZmlsdGVyTXV0YXRpb25zOmRiLG9ic2VydmVDaGlsZHJlbjpiYix1bm9ic2VydmVDaGlsZHJlbjpjYixkZWZlckNvbm5lY3Rpb25DYWxsYmFja3M6dy5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MscHJlZmVyUGVyZm9ybWFuY2U6dy5wcmVmZXJQZXJmb3JtYW5jZSxoYW5kbGVzRHluYW1pY1Njb3Bpbmc6ITAsd3JhcDp3Lko/ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LFdyYXBwZXI6Y2QsY29tcG9zZWRQYXRoOk1iLG5vUGF0Y2g6dy5KLG5hdGl2ZU1ldGhvZHM6cWIsbmF0aXZlVHJlZTpyYn07d2luZG93LlNoYWR5RE9NPVNoYWR5RE9NO3liKCk7c2QoIl9fc2hhZHlfIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LAoiX2FjdGl2ZUVsZW1lbnQiLEpjLmFjdGl2ZUVsZW1lbnQpO0EoV2luZG93LnByb3RvdHlwZSxvZCwiX19zaGFkeV8iKTt3Lkp8fChzZCgpLGJjKCkpO1hiKCk7d2luZG93LkV2ZW50PVpiO3dpbmRvdy5DdXN0b21FdmVudD0kYjt3aW5kb3cuTW91c2VFdmVudD1hYzt3aW5kb3cuU2hhZG93Um9vdD1TY307dmFyIHRkPW5ldyBTZXQoImFubm90YXRpb24teG1sIGNvbG9yLXByb2ZpbGUgZm9udC1mYWNlIGZvbnQtZmFjZS1zcmMgZm9udC1mYWNlLXVyaSBmb250LWZhY2UtZm9ybWF0IGZvbnQtZmFjZS1uYW1lIG1pc3NpbmctZ2x5cGgiLnNwbGl0KCIgIikpO2Z1bmN0aW9uIHVkKGEpe3ZhciBiPXRkLmhhcyhhKTthPS9eW2Etel1bLjAtOV9hLXpdKi1bXC0uMC05X2Etel0qJC8udGVzdChhKTtyZXR1cm4hYiYmYX1mdW5jdGlvbiBIKGEpe3ZhciBiPWEuaXNDb25uZWN0ZWQ7aWYodm9pZCAwIT09YilyZXR1cm4gYjtmb3IoO2EmJiEoYS5fX0NFX2lzSW1wb3J0RG9jdW1lbnR8fGEgaW5zdGFuY2VvZiBEb2N1bWVudCk7KWE9YS5wYXJlbnROb2RlfHwod2luZG93LlNoYWRvd1Jvb3QmJmEgaW5zdGFuY2VvZiBTaGFkb3dSb290P2EuaG9zdDp2b2lkIDApO3JldHVybiEoIWF8fCEoYS5fX0NFX2lzSW1wb3J0RG9jdW1lbnR8fGEgaW5zdGFuY2VvZiBEb2N1bWVudCkpfQpmdW5jdGlvbiB2ZChhLGIpe2Zvcig7YiYmYiE9PWEmJiFiLm5leHRTaWJsaW5nOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYiYmYiE9PWE/Yi5uZXh0U2libGluZzpudWxsfQpmdW5jdGlvbiB3ZChhLGIsYyl7Yz12b2lkIDA9PT1jP25ldyBTZXQ6Yztmb3IodmFyIGQ9YTtkOyl7aWYoZC5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgZT1kO2IoZSk7dmFyIGY9ZS5sb2NhbE5hbWU7aWYoImxpbmsiPT09ZiYmImltcG9ydCI9PT1lLmdldEF0dHJpYnV0ZSgicmVsIikpe2Q9ZS5pbXBvcnQ7aWYoZCBpbnN0YW5jZW9mIE5vZGUmJiFjLmhhcyhkKSlmb3IoYy5hZGQoZCksZD1kLmZpcnN0Q2hpbGQ7ZDtkPWQubmV4dFNpYmxpbmcpd2QoZCxiLGMpO2Q9dmQoYSxlKTtjb250aW51ZX1lbHNlIGlmKCJ0ZW1wbGF0ZSI9PT1mKXtkPXZkKGEsZSk7Y29udGludWV9aWYoZT1lLl9fQ0Vfc2hhZG93Um9vdClmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpd2QoZSxiLGMpfWQ9ZC5maXJzdENoaWxkP2QuZmlyc3RDaGlsZDp2ZChhLGQpfX1mdW5jdGlvbiBJKGEsYixjKXthW2JdPWN9O2Z1bmN0aW9uIHhkKCl7dGhpcy5hPW5ldyBNYXA7dGhpcy5nPW5ldyBNYXA7dGhpcy5mPVtdO3RoaXMuYz0hMX1mdW5jdGlvbiB5ZChhLGIsYyl7YS5hLnNldChiLGMpO2EuZy5zZXQoYy5jb25zdHJ1Y3RvckZ1bmN0aW9uLGMpfWZ1bmN0aW9uIHpkKGEsYil7YS5jPSEwO2EuZi5wdXNoKGIpfWZ1bmN0aW9uIEFkKGEsYil7YS5jJiZ3ZChiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmIoYil9KX14ZC5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXtpZih0aGlzLmMmJiFhLl9fQ0VfcGF0Y2hlZCl7YS5fX0NFX3BhdGNoZWQ9ITA7Zm9yKHZhciBiPTA7Yjx0aGlzLmYubGVuZ3RoO2IrKyl0aGlzLmZbYl0oYSl9fTtmdW5jdGlvbiBKKGEsYil7dmFyIGM9W107d2QoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlP2EuY29ubmVjdGVkQ2FsbGJhY2soZCk6QmQoYSxkKX19CmZ1bmN0aW9uIEsoYSxiKXt2YXIgYz1bXTt3ZChiLGZ1bmN0aW9uKGEpe3JldHVybiBjLnB1c2goYSl9KTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdOzE9PT1kLl9fQ0Vfc3RhdGUmJmEuZGlzY29ubmVjdGVkQ2FsbGJhY2soZCl9fQpmdW5jdGlvbiBMKGEsYixjKXtjPXZvaWQgMD09PWM/e306Yzt2YXIgZD1jLlhhfHxuZXcgU2V0LGU9Yy5ZfHxmdW5jdGlvbihiKXtyZXR1cm4gQmQoYSxiKX0sZj1bXTt3ZChiLGZ1bmN0aW9uKGIpe2lmKCJsaW5rIj09PWIubG9jYWxOYW1lJiYiaW1wb3J0Ij09PWIuZ2V0QXR0cmlidXRlKCJyZWwiKSl7dmFyIGM9Yi5pbXBvcnQ7YyBpbnN0YW5jZW9mIE5vZGUmJihjLl9fQ0VfaXNJbXBvcnREb2N1bWVudD0hMCxjLl9fQ0VfaGFzUmVnaXN0cnk9ITApO2MmJiJjb21wbGV0ZSI9PT1jLnJlYWR5U3RhdGU/Yy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQ9ITA6Yi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe3ZhciBjPWIuaW1wb3J0O2lmKCFjLl9fQ0VfZG9jdW1lbnRMb2FkSGFuZGxlZCl7Yy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQ9ITA7dmFyIGY9bmV3IFNldChkKTtmLmRlbGV0ZShjKTtMKGEsYyx7WGE6ZixZOmV9KX19KX1lbHNlIGYucHVzaChiKX0sZCk7aWYoYS5jKWZvcihiPQowO2I8Zi5sZW5ndGg7YisrKWEuYihmW2JdKTtmb3IoYj0wO2I8Zi5sZW5ndGg7YisrKWUoZltiXSl9CmZ1bmN0aW9uIEJkKGEsYil7aWYodm9pZCAwPT09Yi5fX0NFX3N0YXRlKXt2YXIgYz1iLm93bmVyRG9jdW1lbnQ7aWYoYy5kZWZhdWx0Vmlld3x8Yy5fX0NFX2lzSW1wb3J0RG9jdW1lbnQmJmMuX19DRV9oYXNSZWdpc3RyeSlpZihjPWEuYS5nZXQoYi5sb2NhbE5hbWUpKXtjLmNvbnN0cnVjdGlvblN0YWNrLnB1c2goYik7dmFyIGQ9Yy5jb25zdHJ1Y3RvckZ1bmN0aW9uO3RyeXt0cnl7aWYobmV3IGQhPT1iKXRocm93IEVycm9yKCJUaGUgY3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3IgZGlkIG5vdCBwcm9kdWNlIHRoZSBlbGVtZW50IGJlaW5nIHVwZ3JhZGVkLiIpO31maW5hbGx5e2MuY29uc3RydWN0aW9uU3RhY2sucG9wKCl9fWNhdGNoKGcpe3Rocm93IGIuX19DRV9zdGF0ZT0yLGc7fWIuX19DRV9zdGF0ZT0xO2IuX19DRV9kZWZpbml0aW9uPWM7aWYoYy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2spZm9yKGM9Yy5vYnNlcnZlZEF0dHJpYnV0ZXMsZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT0KY1tkXSxmPWIuZ2V0QXR0cmlidXRlKGUpO251bGwhPT1mJiZhLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhiLGUsbnVsbCxmLG51bGwpfUgoYikmJmEuY29ubmVjdGVkQ2FsbGJhY2soYil9fX14ZC5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dmFyIGI9YS5fX0NFX2RlZmluaXRpb247Yi5jb25uZWN0ZWRDYWxsYmFjayYmYi5jb25uZWN0ZWRDYWxsYmFjay5jYWxsKGEpfTt4ZC5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dmFyIGI9YS5fX0NFX2RlZmluaXRpb247Yi5kaXNjb25uZWN0ZWRDYWxsYmFjayYmYi5kaXNjb25uZWN0ZWRDYWxsYmFjay5jYWxsKGEpfTsKeGQucHJvdG90eXBlLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaz1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWEuX19DRV9kZWZpbml0aW9uO2YuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrJiYtMTxmLm9ic2VydmVkQXR0cmlidXRlcy5pbmRleE9mKGIpJiZmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjay5jYWxsKGEsYixjLGQsZSl9O2Z1bmN0aW9uIENkKGEpe3ZhciBiPWRvY3VtZW50O3RoaXMuYj1hO3RoaXMuYT1iO3RoaXMuRj12b2lkIDA7TCh0aGlzLmIsdGhpcy5hKTsibG9hZGluZyI9PT10aGlzLmEucmVhZHlTdGF0ZSYmKHRoaXMuRj1uZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmMuYmluZCh0aGlzKSksdGhpcy5GLm9ic2VydmUodGhpcy5hLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pKX1mdW5jdGlvbiBEZChhKXthLkYmJmEuRi5kaXNjb25uZWN0KCl9Q2QucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hLnJlYWR5U3RhdGU7ImludGVyYWN0aXZlIiE9PWImJiJjb21wbGV0ZSIhPT1ifHxEZCh0aGlzKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcih2YXIgYz1hW2JdLmFkZGVkTm9kZXMsZD0wO2Q8Yy5sZW5ndGg7ZCsrKUwodGhpcy5iLGNbZF0pfTtmdW5jdGlvbiBFZCgpe3ZhciBhPXRoaXM7dGhpcy5hPXRoaXMuaD12b2lkIDA7dGhpcy5iPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe2EuYT1iO2EuaCYmYihhLmgpfSl9RWQucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oYSl7aWYodGhpcy5oKXRocm93IEVycm9yKCJBbHJlYWR5IHJlc29sdmVkLiIpO3RoaXMuaD1hO3RoaXMuYSYmdGhpcy5hKGEpfTtmdW5jdGlvbiBOKGEpe3RoaXMuYz0hMTt0aGlzLmE9YTt0aGlzLmw9bmV3IE1hcDt0aGlzLmY9ZnVuY3Rpb24oYSl7cmV0dXJuIGEoKX07dGhpcy5iPSExO3RoaXMuZz1bXTt0aGlzLmRhPW5ldyBDZChhKX1uPU4ucHJvdG90eXBlOwpuLnNhPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztpZighKGIgaW5zdGFuY2VvZiBGdW5jdGlvbikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3JzIG11c3QgYmUgZnVuY3Rpb25zLiIpO2lmKCF1ZChhKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlRoZSBlbGVtZW50IG5hbWUgJyIrYSsiJyBpcyBub3QgdmFsaWQuIik7aWYodGhpcy5hLmEuZ2V0KGEpKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IHdpdGggbmFtZSAnIithKyInIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4iKTtpZih0aGlzLmMpdGhyb3cgRXJyb3IoIkEgY3VzdG9tIGVsZW1lbnQgaXMgYWxyZWFkeSBiZWluZyBkZWZpbmVkLiIpO3RoaXMuYz0hMDt0cnl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9ZVthXTtpZih2b2lkIDAhPT1iJiYhKGIgaW5zdGFuY2VvZiBGdW5jdGlvbikpdGhyb3cgRXJyb3IoIlRoZSAnIithKyInIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbi4iKTsKcmV0dXJuIGJ9LGU9Yi5wcm90b3R5cGU7aWYoIShlIGluc3RhbmNlb2YgT2JqZWN0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgY3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3IncyBwcm90b3R5cGUgaXMgbm90IGFuIG9iamVjdC4iKTt2YXIgZj1kKCJjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBnPWQoImRpc2Nvbm5lY3RlZENhbGxiYWNrIik7dmFyIGg9ZCgiYWRvcHRlZENhbGxiYWNrIik7dmFyIGs9ZCgiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIik7dmFyIGw9Yi5vYnNlcnZlZEF0dHJpYnV0ZXN8fFtdfWNhdGNoKG0pe3JldHVybn1maW5hbGx5e3RoaXMuYz0hMX1iPXtsb2NhbE5hbWU6YSxjb25zdHJ1Y3RvckZ1bmN0aW9uOmIsY29ubmVjdGVkQ2FsbGJhY2s6ZixkaXNjb25uZWN0ZWRDYWxsYmFjazpnLGFkb3B0ZWRDYWxsYmFjazpoLGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjazprLG9ic2VydmVkQXR0cmlidXRlczpsLGNvbnN0cnVjdGlvblN0YWNrOltdfTt5ZCh0aGlzLmEsCmEsYik7dGhpcy5nLnB1c2goYik7dGhpcy5ifHwodGhpcy5iPSEwLHRoaXMuZihmdW5jdGlvbigpe3JldHVybiBGZChjKX0pKX07bi5ZPWZ1bmN0aW9uKGEpe0wodGhpcy5hLGEpfTsKZnVuY3Rpb24gRmQoYSl7aWYoITEhPT1hLmIpe2EuYj0hMTtmb3IodmFyIGI9YS5nLGM9W10sZD1uZXcgTWFwLGU9MDtlPGIubGVuZ3RoO2UrKylkLnNldChiW2VdLmxvY2FsTmFtZSxbXSk7TChhLmEsZG9jdW1lbnQse1k6ZnVuY3Rpb24oYil7aWYodm9pZCAwPT09Yi5fX0NFX3N0YXRlKXt2YXIgZT1iLmxvY2FsTmFtZSxmPWQuZ2V0KGUpO2Y/Zi5wdXNoKGIpOmEuYS5hLmdldChlKSYmYy5wdXNoKGIpfX19KTtmb3IoZT0wO2U8Yy5sZW5ndGg7ZSsrKUJkKGEuYSxjW2VdKTtmb3IoOzA8Yi5sZW5ndGg7KXt2YXIgZj1iLnNoaWZ0KCk7ZT1mLmxvY2FsTmFtZTtmPWQuZ2V0KGYubG9jYWxOYW1lKTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKylCZChhLmEsZltnXSk7KGU9YS5sLmdldChlKSkmJmUucmVzb2x2ZSh2b2lkIDApfX19bi5nZXQ9ZnVuY3Rpb24oYSl7aWYoYT10aGlzLmEuYS5nZXQoYSkpcmV0dXJuIGEuY29uc3RydWN0b3JGdW5jdGlvbn07Cm4udGE9ZnVuY3Rpb24oYSl7aWYoIXVkKGEpKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgU3ludGF4RXJyb3IoIiciK2ErIicgaXMgbm90IGEgdmFsaWQgY3VzdG9tIGVsZW1lbnQgbmFtZS4iKSk7dmFyIGI9dGhpcy5sLmdldChhKTtpZihiKXJldHVybiBiLmI7Yj1uZXcgRWQ7dGhpcy5sLnNldChhLGIpO3RoaXMuYS5hLmdldChhKSYmIXRoaXMuZy5zb21lKGZ1bmN0aW9uKGIpe3JldHVybiBiLmxvY2FsTmFtZT09PWF9KSYmYi5yZXNvbHZlKHZvaWQgMCk7cmV0dXJuIGIuYn07bi5QYT1mdW5jdGlvbihhKXtEZCh0aGlzLmRhKTt2YXIgYj10aGlzLmY7dGhpcy5mPWZ1bmN0aW9uKGMpe3JldHVybiBhKGZ1bmN0aW9uKCl7cmV0dXJuIGIoYyl9KX19O3dpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnk9TjtOLnByb3RvdHlwZS5kZWZpbmU9Ti5wcm90b3R5cGUuc2E7Ti5wcm90b3R5cGUudXBncmFkZT1OLnByb3RvdHlwZS5ZO04ucHJvdG90eXBlLmdldD1OLnByb3RvdHlwZS5nZXQ7Ck4ucHJvdG90eXBlLndoZW5EZWZpbmVkPU4ucHJvdG90eXBlLnRhO04ucHJvdG90eXBlLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2s9Ti5wcm90b3R5cGUuUGE7dmFyIEdkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCxIZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnROUyxJZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGUsSmQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5wcmVwZW5kLEtkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuYXBwZW5kLExkPXdpbmRvdy5Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5wcmVwZW5kLE1kPXdpbmRvdy5Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5hcHBlbmQsTmQ9d2luZG93Lk5vZGUucHJvdG90eXBlLmNsb25lTm9kZSxPZD13aW5kb3cuTm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsUGQ9d2luZG93Lk5vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZSxRZD13aW5kb3cuTm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQsUmQ9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZCxTZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5Ob2RlLnByb3RvdHlwZSwKInRleHRDb250ZW50IiksVGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmF0dGFjaFNoYWRvdyxVZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZSwiaW5uZXJIVE1MIiksVmQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZSxXZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlLFhkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGUsWWQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5TLFpkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUywkZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlTlMsYWU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxiZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRIVE1MLGNlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5wcmVwZW5kLApkZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kLGVlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5iZWZvcmUsZmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFmdGVyLGdlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5yZXBsYWNlV2l0aCxoZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlLGllPXdpbmRvdy5IVE1MRWxlbWVudCxqZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLGtlPXdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50LGxlPXdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRIVE1MO3ZhciBtZT1uZXcgZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIG5lKCl7dmFyIGE9b2U7d2luZG93LkhUTUxFbGVtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe3ZhciBiPXRoaXMuY29uc3RydWN0b3IsZD1hLmcuZ2V0KGIpO2lmKCFkKXRocm93IEVycm9yKCJUaGUgY3VzdG9tIGVsZW1lbnQgYmVpbmcgY29uc3RydWN0ZWQgd2FzIG5vdCByZWdpc3RlcmVkIHdpdGggYGN1c3RvbUVsZW1lbnRzYC4iKTt2YXIgZT1kLmNvbnN0cnVjdGlvblN0YWNrO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gZT1HZC5jYWxsKGRvY3VtZW50LGQubG9jYWxOYW1lKSxPYmplY3Quc2V0UHJvdG90eXBlT2YoZSxiLnByb3RvdHlwZSksZS5fX0NFX3N0YXRlPTEsZS5fX0NFX2RlZmluaXRpb249ZCxhLmIoZSksZTtkPWUubGVuZ3RoLTE7dmFyIGY9ZVtkXTtpZihmPT09bWUpdGhyb3cgRXJyb3IoIlRoZSBIVE1MRWxlbWVudCBjb25zdHJ1Y3RvciB3YXMgZWl0aGVyIGNhbGxlZCByZWVudHJhbnRseSBmb3IgdGhpcyBjb25zdHJ1Y3RvciBvciBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIik7CmVbZF09bWU7T2JqZWN0LnNldFByb3RvdHlwZU9mKGYsYi5wcm90b3R5cGUpO2EuYihmKTtyZXR1cm4gZn1iLnByb3RvdHlwZT1pZS5wcm90b3R5cGU7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIucHJvdG90eXBlLCJjb25zdHJ1Y3RvciIse3dyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOmJ9KTtyZXR1cm4gYn0oKX07ZnVuY3Rpb24gcGUoYSxiLGMpe2Z1bmN0aW9uIGQoYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2Zvcih2YXIgZD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoOysrZSlkW2VdPWFyZ3VtZW50c1tlXTtlPVtdO2Zvcih2YXIgZj1bXSxsPTA7bDxkLmxlbmd0aDtsKyspe3ZhciBtPWRbbF07bSBpbnN0YW5jZW9mIEVsZW1lbnQmJkgobSkmJmYucHVzaChtKTtpZihtIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IobT1tLmZpcnN0Q2hpbGQ7bTttPW0ubmV4dFNpYmxpbmcpZS5wdXNoKG0pO2Vsc2UgZS5wdXNoKG0pfWIuYXBwbHkodGhpcyxkKTtmb3IoZD0wO2Q8Zi5sZW5ndGg7ZCsrKUsoYSxmW2RdKTtpZihIKHRoaXMpKWZvcihkPTA7ZDxlLmxlbmd0aDtkKyspZj1lW2RdLGYgaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsZil9fXZvaWQgMCE9PWMuViYmKGIucHJlcGVuZD1kKGMuVikpO3ZvaWQgMCE9PWMuYXBwZW5kJiYoYi5hcHBlbmQ9ZChjLmFwcGVuZCkpfTtmdW5jdGlvbiBxZSgpe3ZhciBhPW9lO0koRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50IixmdW5jdGlvbihiKXtpZih0aGlzLl9fQ0VfaGFzUmVnaXN0cnkpe3ZhciBjPWEuYS5nZXQoYik7aWYoYylyZXR1cm4gbmV3IGMuY29uc3RydWN0b3JGdW5jdGlvbn1iPUdkLmNhbGwodGhpcyxiKTthLmIoYik7cmV0dXJuIGJ9KTtJKERvY3VtZW50LnByb3RvdHlwZSwiaW1wb3J0Tm9kZSIsZnVuY3Rpb24oYixjKXtiPUlkLmNhbGwodGhpcyxiLCEhYyk7dGhpcy5fX0NFX2hhc1JlZ2lzdHJ5P0woYSxiKTpBZChhLGIpO3JldHVybiBifSk7SShEb2N1bWVudC5wcm90b3R5cGUsImNyZWF0ZUVsZW1lbnROUyIsZnVuY3Rpb24oYixjKXtpZih0aGlzLl9fQ0VfaGFzUmVnaXN0cnkmJihudWxsPT09Ynx8Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPT09Yikpe3ZhciBkPWEuYS5nZXQoYyk7aWYoZClyZXR1cm4gbmV3IGQuY29uc3RydWN0b3JGdW5jdGlvbn1iPUhkLmNhbGwodGhpcywKYixjKTthLmIoYik7cmV0dXJuIGJ9KTtwZShhLERvY3VtZW50LnByb3RvdHlwZSx7VjpKZCxhcHBlbmQ6S2R9KX07ZnVuY3Rpb24gcmUoKXtmdW5jdGlvbiBhKGEsZCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsInRleHRDb250ZW50Iix7ZW51bWVyYWJsZTpkLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpkLmdldCxzZXQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKWQuc2V0LmNhbGwodGhpcyxhKTtlbHNle3ZhciBjPXZvaWQgMDtpZih0aGlzLmZpcnN0Q2hpbGQpe3ZhciBlPXRoaXMuY2hpbGROb2RlcyxoPWUubGVuZ3RoO2lmKDA8aCYmSCh0aGlzKSl7Yz1BcnJheShoKTtmb3IodmFyIGs9MDtrPGg7aysrKWNba109ZVtrXX19ZC5zZXQuY2FsbCh0aGlzLGEpO2lmKGMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKylLKGIsY1thXSl9fX0pfXZhciBiPW9lO0koTm9kZS5wcm90b3R5cGUsImluc2VydEJlZm9yZSIsZnVuY3Rpb24oYSxkKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7CmE9UGQuY2FsbCh0aGlzLGEsZCk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKUooYixjW2RdKTtyZXR1cm4gYX1jPUgoYSk7ZD1QZC5jYWxsKHRoaXMsYSxkKTtjJiZLKGIsYSk7SCh0aGlzKSYmSihiLGEpO3JldHVybiBkfSk7SShOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQiLGZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPU9kLmNhbGwodGhpcyxhKTtpZihIKHRoaXMpKWZvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKUooYixjW2VdKTtyZXR1cm4gYX1jPUgoYSk7ZT1PZC5jYWxsKHRoaXMsYSk7YyYmSyhiLGEpO0godGhpcykmJkooYixhKTtyZXR1cm4gZX0pO0koTm9kZS5wcm90b3R5cGUsImNsb25lTm9kZSIsZnVuY3Rpb24oYSl7YT1OZC5jYWxsKHRoaXMsISFhKTt0aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9MKGIsYSk6CkFkKGIsYSk7cmV0dXJuIGF9KTtJKE5vZGUucHJvdG90eXBlLCJyZW1vdmVDaGlsZCIsZnVuY3Rpb24oYSl7dmFyIGM9SChhKSxlPVFkLmNhbGwodGhpcyxhKTtjJiZLKGIsYSk7cmV0dXJuIGV9KTtJKE5vZGUucHJvdG90eXBlLCJyZXBsYWNlQ2hpbGQiLGZ1bmN0aW9uKGEsZCl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpO2E9UmQuY2FsbCh0aGlzLGEsZCk7aWYoSCh0aGlzKSlmb3IoSyhiLGQpLGQ9MDtkPGMubGVuZ3RoO2QrKylKKGIsY1tkXSk7cmV0dXJuIGF9Yz1IKGEpO3ZhciBmPVJkLmNhbGwodGhpcyxhLGQpLGc9SCh0aGlzKTtnJiZLKGIsZCk7YyYmSyhiLGEpO2cmJkooYixhKTtyZXR1cm4gZn0pO1NkJiZTZC5nZXQ/YShOb2RlLnByb3RvdHlwZSxTZCk6emQoYixmdW5jdGlvbihiKXthKGIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2Zvcih2YXIgYT0KW10sYj0wO2I8dGhpcy5jaGlsZE5vZGVzLmxlbmd0aDtiKyspYS5wdXNoKHRoaXMuY2hpbGROb2Rlc1tiXS50ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9LHNldDpmdW5jdGlvbihhKXtmb3IoO3RoaXMuZmlyc3RDaGlsZDspUWQuY2FsbCh0aGlzLHRoaXMuZmlyc3RDaGlsZCk7T2QuY2FsbCh0aGlzLGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpKX19KX0pfTtmdW5jdGlvbiBzZShhKXtmdW5jdGlvbiBiKGIpe3JldHVybiBmdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlXT1hcmd1bWVudHNbZV07ZT1bXTtmb3IodmFyIGg9W10saz0wO2s8ZC5sZW5ndGg7aysrKXt2YXIgbD1kW2tdO2wgaW5zdGFuY2VvZiBFbGVtZW50JiZIKGwpJiZoLnB1c2gobCk7aWYobCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKGw9bC5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWUucHVzaChsKTtlbHNlIGUucHVzaChsKX1iLmFwcGx5KHRoaXMsZCk7Zm9yKGQ9MDtkPGgubGVuZ3RoO2QrKylLKGEsaFtkXSk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKWg9ZVtkXSxoIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGgpfX12YXIgYz1FbGVtZW50LnByb3RvdHlwZTt2b2lkIDAhPT1lZSYmKGMuYmVmb3JlPWIoZWUpKTt2b2lkIDAhPT1lZSYmKGMuYWZ0ZXI9YihmZSkpO3ZvaWQgMCE9PWdlJiYKSShjLCJyZXBsYWNlV2l0aCIsZnVuY3Rpb24oYil7Zm9yKHZhciBjPVtdLGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZF09YXJndW1lbnRzW2RdO2Q9W107Zm9yKHZhciBnPVtdLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGs9Y1toXTtrIGluc3RhbmNlb2YgRWxlbWVudCYmSChrKSYmZy5wdXNoKGspO2lmKGsgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihrPWsuZmlyc3RDaGlsZDtrO2s9ay5uZXh0U2libGluZylkLnB1c2goayk7ZWxzZSBkLnB1c2goayl9aD1IKHRoaXMpO2dlLmFwcGx5KHRoaXMsYyk7Zm9yKGM9MDtjPGcubGVuZ3RoO2MrKylLKGEsZ1tjXSk7aWYoaClmb3IoSyhhLHRoaXMpLGM9MDtjPGQubGVuZ3RoO2MrKylnPWRbY10sZyBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxnKX0pO3ZvaWQgMCE9PWhlJiZJKGMsInJlbW92ZSIsZnVuY3Rpb24oKXt2YXIgYj1IKHRoaXMpO2hlLmNhbGwodGhpcyk7YiYmSyhhLHRoaXMpfSl9O2Z1bmN0aW9uIHRlKCl7ZnVuY3Rpb24gYShhLGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJpbm5lckhUTUwiLHtlbnVtZXJhYmxlOmIuZW51bWVyYWJsZSxjb25maWd1cmFibGU6ITAsZ2V0OmIuZ2V0LHNldDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLGU9dm9pZCAwO0godGhpcykmJihlPVtdLHdkKHRoaXMsZnVuY3Rpb24oYSl7YSE9PWMmJmUucHVzaChhKX0pKTtiLnNldC5jYWxsKHRoaXMsYSk7aWYoZSlmb3IodmFyIGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGc9ZVtmXTsxPT09Zy5fX0NFX3N0YXRlJiZkLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGcpfXRoaXMub3duZXJEb2N1bWVudC5fX0NFX2hhc1JlZ2lzdHJ5P0woZCx0aGlzKTpBZChkLHRoaXMpO3JldHVybiBhfX0pfWZ1bmN0aW9uIGIoYSxiKXtJKGEsImluc2VydEFkamFjZW50RWxlbWVudCIsZnVuY3Rpb24oYSxjKXt2YXIgZT1IKGMpO2E9Yi5jYWxsKHRoaXMsYSxjKTtlJiZLKGQsYyk7SChhKSYmSihkLGMpO3JldHVybiBhfSl9CmZ1bmN0aW9uIGMoYSxiKXtmdW5jdGlvbiBjKGEsYil7Zm9yKHZhciBjPVtdO2EhPT1iO2E9YS5uZXh0U2libGluZyljLnB1c2goYSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKylMKGQsY1tiXSl9SShhLCJpbnNlcnRBZGphY2VudEhUTUwiLGZ1bmN0aW9uKGEsZCl7YT1hLnRvTG93ZXJDYXNlKCk7aWYoImJlZm9yZWJlZ2luIj09PWEpe3ZhciBlPXRoaXMucHJldmlvdXNTaWJsaW5nO2IuY2FsbCh0aGlzLGEsZCk7YyhlfHx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCx0aGlzKX1lbHNlIGlmKCJhZnRlcmJlZ2luIj09PWEpZT10aGlzLmZpcnN0Q2hpbGQsYi5jYWxsKHRoaXMsYSxkKSxjKHRoaXMuZmlyc3RDaGlsZCxlKTtlbHNlIGlmKCJiZWZvcmVlbmQiPT09YSllPXRoaXMubGFzdENoaWxkLGIuY2FsbCh0aGlzLGEsZCksYyhlfHx0aGlzLmZpcnN0Q2hpbGQsbnVsbCk7ZWxzZSBpZigiYWZ0ZXJlbmQiPT09YSllPXRoaXMubmV4dFNpYmxpbmcsYi5jYWxsKHRoaXMsYSxkKSxjKHRoaXMubmV4dFNpYmxpbmcsCmUpO2Vsc2UgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgdmFsdWUgcHJvdmlkZWQgKCIrU3RyaW5nKGEpKyIpIGlzIG5vdCBvbmUgb2YgJ2JlZm9yZWJlZ2luJywgJ2FmdGVyYmVnaW4nLCAnYmVmb3JlZW5kJywgb3IgJ2FmdGVyZW5kJy4iKTt9KX12YXIgZD1vZTtUZCYmSShFbGVtZW50LnByb3RvdHlwZSwiYXR0YWNoU2hhZG93IixmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX0NFX3NoYWRvd1Jvb3Q9YT1UZC5jYWxsKHRoaXMsYSl9KTtVZCYmVWQuZ2V0P2EoRWxlbWVudC5wcm90b3R5cGUsVWQpOmplJiZqZS5nZXQ/YShIVE1MRWxlbWVudC5wcm90b3R5cGUsamUpOnpkKGQsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTmQuY2FsbCh0aGlzLCEwKS5pbm5lckhUTUx9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUsYz1iP3RoaXMuY29udGVudDp0aGlzLGQ9SGQuY2FsbChkb2N1bWVudCwKdGhpcy5uYW1lc3BhY2VVUkksdGhpcy5sb2NhbE5hbWUpO2ZvcihkLmlubmVySFRNTD1hOzA8Yy5jaGlsZE5vZGVzLmxlbmd0aDspUWQuY2FsbChjLGMuY2hpbGROb2Rlc1swXSk7Zm9yKGE9Yj9kLmNvbnRlbnQ6ZDswPGEuY2hpbGROb2Rlcy5sZW5ndGg7KU9kLmNhbGwoYyxhLmNoaWxkTm9kZXNbMF0pfX0pfSk7SShFbGVtZW50LnByb3RvdHlwZSwic2V0QXR0cmlidXRlIixmdW5jdGlvbihhLGIpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFdkLmNhbGwodGhpcyxhLGIpO3ZhciBjPVZkLmNhbGwodGhpcyxhKTtXZC5jYWxsKHRoaXMsYSxiKTtiPVZkLmNhbGwodGhpcyxhKTtkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGEsYyxiLG51bGwpfSk7SShFbGVtZW50LnByb3RvdHlwZSwic2V0QXR0cmlidXRlTlMiLGZ1bmN0aW9uKGEsYixjKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBaZC5jYWxsKHRoaXMsYSxiLGMpO3ZhciBlPVlkLmNhbGwodGhpcyxhLApiKTtaZC5jYWxsKHRoaXMsYSxiLGMpO2M9WWQuY2FsbCh0aGlzLGEsYik7ZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxiLGUsYyxhKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInJlbW92ZUF0dHJpYnV0ZSIsZnVuY3Rpb24oYSl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gWGQuY2FsbCh0aGlzLGEpO3ZhciBiPVZkLmNhbGwodGhpcyxhKTtYZC5jYWxsKHRoaXMsYSk7bnVsbCE9PWImJmQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYSxiLG51bGwsbnVsbCl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmVBdHRyaWJ1dGVOUyIsZnVuY3Rpb24oYSxiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiAkZC5jYWxsKHRoaXMsYSxiKTt2YXIgYz1ZZC5jYWxsKHRoaXMsYSxiKTskZC5jYWxsKHRoaXMsYSxiKTt2YXIgZT1ZZC5jYWxsKHRoaXMsYSxiKTtjIT09ZSYmZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxiLGMsZSxhKX0pO2tlP2IoSFRNTEVsZW1lbnQucHJvdG90eXBlLAprZSk6YWU/YihFbGVtZW50LnByb3RvdHlwZSxhZSk6Y29uc29sZS53YXJuKCJDdXN0b20gRWxlbWVudHM6IGBFbGVtZW50I2luc2VydEFkamFjZW50RWxlbWVudGAgd2FzIG5vdCBwYXRjaGVkLiIpO2xlP2MoSFRNTEVsZW1lbnQucHJvdG90eXBlLGxlKTpiZT9jKEVsZW1lbnQucHJvdG90eXBlLGJlKTpjb25zb2xlLndhcm4oIkN1c3RvbSBFbGVtZW50czogYEVsZW1lbnQjaW5zZXJ0QWRqYWNlbnRIVE1MYCB3YXMgbm90IHBhdGNoZWQuIik7cGUoZCxFbGVtZW50LnByb3RvdHlwZSx7VjpjZSxhcHBlbmQ6ZGV9KTtzZShkKX07dmFyIHVlPXdpbmRvdy5jdXN0b21FbGVtZW50cztpZighdWV8fHVlLmZvcmNlUG9seWZpbGx8fCJmdW5jdGlvbiIhPXR5cGVvZiB1ZS5kZWZpbmV8fCJmdW5jdGlvbiIhPXR5cGVvZiB1ZS5nZXQpe3ZhciBvZT1uZXcgeGQ7bmUoKTtxZSgpO3BlKG9lLERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtWOkxkLGFwcGVuZDpNZH0pO3JlKCk7dGUoKTtkb2N1bWVudC5fX0NFX2hhc1JlZ2lzdHJ5PSEwO3ZhciBjdXN0b21FbGVtZW50cz1uZXcgTihvZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywiY3VzdG9tRWxlbWVudHMiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpjdXN0b21FbGVtZW50c30pfTtmdW5jdGlvbiB2ZSgpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHdlKGEpe2E9YS5yZXBsYWNlKHhlLCIiKS5yZXBsYWNlKHllLCIiKTt2YXIgYj16ZSxjPWEsZD1uZXcgdmU7ZC5zdGFydD0wO2QuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZT1kLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZS5ydWxlc3x8KGUucnVsZXM9W10pO3ZhciBoPWUsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2U9bmV3IHZlO2Uuc3RhcnQ9ZisxO2UucGFyZW50PWg7ZS5wcmV2aW91cz1rO2gucnVsZXMucHVzaChlKX1lbHNlIn0iPT09Y1tmXSYmKGUuZW5kPWYrMSxlPWUucGFyZW50fHxkKTtyZXR1cm4gYihkLGEpfQpmdW5jdGlvbiB6ZShhLGIpe3ZhciBjPWIuc3Vic3RyaW5nKGEuc3RhcnQsYS5lbmQtMSk7YS5wYXJzZWRDc3NUZXh0PWEuY3NzVGV4dD1jLnRyaW0oKTthLnBhcmVudCYmKGM9Yi5zdWJzdHJpbmcoYS5wcmV2aW91cz9hLnByZXZpb3VzLmVuZDphLnBhcmVudC5zdGFydCxhLnN0YXJ0LTEpLGM9QWUoYyksYz1jLnJlcGxhY2UoQmUsIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUNlOmMubWF0Y2goRGUpJiYoYS50eXBlPUVlLGEua2V5ZnJhbWVzTmFtZT1hLnNlbGVjdG9yLnNwbGl0KEJlKS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/RmU6R2UpO2lmKGM9YS5ydWxlcylmb3IodmFyIGQ9MCxlPWMubGVuZ3RoLGY9dm9pZCAwO2Q8ZSYmKGY9Y1tkXSk7ZCsrKXplKGYsCmIpO3JldHVybiBhfWZ1bmN0aW9uIEFlKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEhlKGEsYixjKXtjPXZvaWQgMD09PWM/IiI6Yzt2YXIgZD0iIjtpZihhLmNzc1RleHR8fGEucnVsZXMpe3ZhciBlPWEucnVsZXMsZjtpZihmPWUpZj1lWzBdLGY9IShmJiZmLnNlbGVjdG9yJiYwPT09Zi5zZWxlY3Rvci5pbmRleE9mKCItLSIpKTtpZihmKXtmPTA7Zm9yKHZhciBnPWUubGVuZ3RoLGg9dm9pZCAwO2Y8ZyYmKGg9ZVtmXSk7ZisrKWQ9SGUoaCxiLGQpfWVsc2UgYj9iPWEuY3NzVGV4dDooYj1hLmNzc1RleHQsYj1iLnJlcGxhY2UoSWUsIiIpLnJlcGxhY2UoSmUsIiIpLGI9Yi5yZXBsYWNlKEtlLCIiKS5yZXBsYWNlKExlLCIiKSksKGQ9Yi50cmltKCkpJiYoZD0iICAiK2QrIlxuIil9ZCYmKGEuc2VsZWN0b3ImJihjKz1hLnNlbGVjdG9yKyIge1xuIiksYys9ZCxhLnNlbGVjdG9yJiYoYys9In1cblxuIikpO3JldHVybiBjfQp2YXIgR2U9MSxFZT03LENlPTQsRmU9MUUzLHhlPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLHllPS9AaW1wb3J0W147XSo7L2dpbSxJZT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0sSmU9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLEtlPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLExlPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sRGU9L15AW15cc10qa2V5ZnJhbWVzLyxCZT0vXHMrL2c7dmFyIE89ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSksTWU7ZnVuY3Rpb24gTmUoYSl7TWU9YSYmYS5zaGltY3NzcHJvcGVydGllcz8hMTpPfHwhKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpfXZhciBPZTt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKE9lPXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCk7dmFyIFBlPSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9NZT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzOndpbmRvdy5TaGFkeUNTUz8oTmUod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpOZSh3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciBRPU1lLFFlPU9lO3ZhciBSZT0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLFNlPS8oPzpefFxXKylAYXBwbHlccypcKD8oW14pO1xuXSopXCk/L2dpLFRlPS8oLS1bXHctXSspXHMqKFs6LDspXXwkKS9naSxVZT0vKGFuaW1hdGlvblxzKjopfChhbmltYXRpb24tbmFtZVxzKjopLywkZT0vQG1lZGlhXHMoLiopLyxhZj0vXHtbXn1dKlx9L2c7dmFyIGJmPW5ldyBTZXQ7ZnVuY3Rpb24gY2YoYSxiKXtpZighYSlyZXR1cm4iIjsic3RyaW5nIj09PXR5cGVvZiBhJiYoYT13ZShhKSk7YiYmZGYoYSxiKTtyZXR1cm4gSGUoYSxRKX1mdW5jdGlvbiBlZihhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXdlKGEudGV4dENvbnRlbnQpKTtyZXR1cm4gYS5fX2Nzc1J1bGVzfHxudWxsfWZ1bmN0aW9uIGZmKGEpe3JldHVybiEhYS5wYXJlbnQmJmEucGFyZW50LnR5cGU9PT1FZX1mdW5jdGlvbiBkZihhLGIsYyxkKXtpZihhKXt2YXIgZT0hMSxmPWEudHlwZTtpZihkJiZmPT09Q2Upe3ZhciBnPWEuc2VsZWN0b3IubWF0Y2goJGUpO2cmJih3aW5kb3cubWF0Y2hNZWRpYShnWzFdKS5tYXRjaGVzfHwoZT0hMCkpfWY9PT1HZT9iKGEpOmMmJmY9PT1FZT9jKGEpOmY9PT1GZSYmKGU9ITApO2lmKChhPWEucnVsZXMpJiYhZSlmb3IoZT0wLGY9YS5sZW5ndGgsZz12b2lkIDA7ZTxmJiYoZz1hW2VdKTtlKyspZGYoZyxiLGMsZCl9fQpmdW5jdGlvbiBnZihhLGIsYyxkKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2ImJmUuc2V0QXR0cmlidXRlKCJzY29wZSIsYik7ZS50ZXh0Q29udGVudD1hO2hmKGUsYyxkKTtyZXR1cm4gZX12YXIgamY9bnVsbDtmdW5jdGlvbiBrZihhKXthPWRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiBTaGFkeSBET00gc3R5bGVzIGZvciAiK2ErIiAiKTt2YXIgYj1kb2N1bWVudC5oZWFkO2IuaW5zZXJ0QmVmb3JlKGEsKGpmP2pmLm5leHRTaWJsaW5nOm51bGwpfHxiLmZpcnN0Q2hpbGQpO3JldHVybiBqZj1hfWZ1bmN0aW9uIGhmKGEsYixjKXtiPWJ8fGRvY3VtZW50LmhlYWQ7Yi5pbnNlcnRCZWZvcmUoYSxjJiZjLm5leHRTaWJsaW5nfHxiLmZpcnN0Q2hpbGQpO2pmP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oamYpPT09Tm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcmJihqZj1hKTpqZj1hfQpmdW5jdGlvbiBsZihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YjxkO2IrKylpZigiKCI9PT1hW2JdKWMrKztlbHNlIGlmKCIpIj09PWFbYl0mJjA9PT0tLWMpcmV0dXJuIGI7cmV0dXJuLTF9ZnVuY3Rpb24gbWYoYSxiKXt2YXIgYz1hLmluZGV4T2YoInZhcigiKTtpZigtMT09PWMpcmV0dXJuIGIoYSwiIiwiIiwiIik7dmFyIGQ9bGYoYSxjKzMpLGU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPW1mKGEuc3Vic3RyaW5nKGQrMSksYik7ZD1lLmluZGV4T2YoIiwiKTtyZXR1cm4tMT09PWQ/YihjLGUudHJpbSgpLCIiLGEpOmIoYyxlLnN1YnN0cmluZygwLGQpLnRyaW0oKSxlLnN1YnN0cmluZyhkKzEpLnRyaW0oKSxhKX1mdW5jdGlvbiBuZihhLGIpe08/YS5zZXRBdHRyaWJ1dGUoImNsYXNzIixiKTp3aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5zZXRBdHRyaWJ1dGUuY2FsbChhLCJjbGFzcyIsYil9CnZhciBvZj13aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS53cmFwfHxmdW5jdGlvbihhKXtyZXR1cm4gYX07ZnVuY3Rpb24gcGYoYSl7dmFyIGI9YS5sb2NhbE5hbWUsYz0iIjtiPy0xPGIuaW5kZXhPZigiLSIpfHwoYz1iLGI9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIik6KGI9YS5pcyxjPWEuZXh0ZW5kcyk7cmV0dXJue2lzOmIsTTpjfX1mdW5jdGlvbiBxZihhKXtmb3IodmFyIGI9W10sYz0iIixkPTA7MDw9ZCYmZDxhLmxlbmd0aDtkKyspaWYoIigiPT09YVtkXSl7dmFyIGU9bGYoYSxkKTtjKz1hLnNsaWNlKGQsZSsxKTtkPWV9ZWxzZSIsIj09PWFbZF0/KGIucHVzaChjKSxjPSIiKTpjKz1hW2RdO2MmJmIucHVzaChjKTtyZXR1cm4gYn0KZnVuY3Rpb24gcmYoYSl7aWYodm9pZCAwIT09UWUpcmV0dXJuIFFlO2lmKHZvaWQgMD09PWEuX19jc3NCdWlsZCl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoImNzcy1idWlsZCIpO2lmKGIpYS5fX2Nzc0J1aWxkPWI7ZWxzZXthOntiPSJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZT9hLmNvbnRlbnQuZmlyc3RDaGlsZDphLmZpcnN0Q2hpbGQ7aWYoYiBpbnN0YW5jZW9mIENvbW1lbnQmJihiPWIudGV4dENvbnRlbnQudHJpbSgpLnNwbGl0KCI6IiksImNzcy1idWlsZCI9PT1iWzBdKSl7Yj1iWzFdO2JyZWFrIGF9Yj0iIn1pZigiIiE9PWIpe3ZhciBjPSJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZT9hLmNvbnRlbnQuZmlyc3RDaGlsZDphLmZpcnN0Q2hpbGQ7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpfWEuX19jc3NCdWlsZD1ifX1yZXR1cm4gYS5fX2Nzc0J1aWxkfHwiIn0KZnVuY3Rpb24gc2YoYSl7YT12b2lkIDA9PT1hPyIiOmE7cmV0dXJuIiIhPT1hJiZRP08/InNoYWRvdyI9PT1hOiJzaGFkeSI9PT1hOiExfTtmdW5jdGlvbiB0Zigpe31mdW5jdGlvbiB1ZihhLGIpe3ZmKFIsYSxmdW5jdGlvbihhKXt3ZihhLGJ8fCIiKX0pfWZ1bmN0aW9uIHZmKGEsYixjKXtiLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJmMoYik7dmFyIGQ7InRlbXBsYXRlIj09PWIubG9jYWxOYW1lP2Q9KGIuY29udGVudHx8Yi5fY29udGVudHx8YikuY2hpbGROb2RlczpkPWIuY2hpbGRyZW58fGIuY2hpbGROb2RlcztpZihkKWZvcihiPTA7YjxkLmxlbmd0aDtiKyspdmYoYSxkW2JdLGMpfQpmdW5jdGlvbiB3ZihhLGIsYyl7aWYoYilpZihhLmNsYXNzTGlzdCljPyhhLmNsYXNzTGlzdC5yZW1vdmUoInN0eWxlLXNjb3BlIiksYS5jbGFzc0xpc3QucmVtb3ZlKGIpKTooYS5jbGFzc0xpc3QuYWRkKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LmFkZChiKSk7ZWxzZSBpZihhLmdldEF0dHJpYnV0ZSl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Yz9kJiYoYj1kLnJlcGxhY2UoInN0eWxlLXNjb3BlIiwiIikucmVwbGFjZShiLCIiKSxuZihhLGIpKTpuZihhLChkP2QrIiAiOiIiKSsic3R5bGUtc2NvcGUgIitiKX19ZnVuY3Rpb24geGYoYSxiLGMpe3ZmKFIsYSxmdW5jdGlvbihhKXt3ZihhLGIsITApO3dmKGEsYyl9KX1mdW5jdGlvbiB5ZihhLGIpe3ZmKFIsYSxmdW5jdGlvbihhKXt3ZihhLGJ8fCIiLCEwKX0pfQpmdW5jdGlvbiB6ZihhLGIsYyxkLGUpe3ZhciBmPVI7ZT12b2lkIDA9PT1lPyIiOmU7IiI9PT1lJiYoT3x8InNoYWR5Ij09PSh2b2lkIDA9PT1kPyIiOmQpP2U9Y2YoYixjKTooYT1wZihhKSxlPUFmKGYsYixhLmlzLGEuTSxjKSsiXG5cbiIpKTtyZXR1cm4gZS50cmltKCl9ZnVuY3Rpb24gQWYoYSxiLGMsZCxlKXt2YXIgZj1CZihjLGQpO2M9Yz8iLiIrYzoiIjtyZXR1cm4gY2YoYixmdW5jdGlvbihiKXtiLmN8fChiLnNlbGVjdG9yPWIuaj1DZihhLGIsYS5iLGMsZiksYi5jPSEwKTtlJiZlKGIsYyxmKX0pfWZ1bmN0aW9uIEJmKGEsYil7cmV0dXJuIGI/Iltpcz0iK2ErIl0iOmF9CmZ1bmN0aW9uIENmKGEsYixjLGQsZSl7dmFyIGY9cWYoYi5zZWxlY3Rvcik7aWYoIWZmKGIpKXtiPTA7Zm9yKHZhciBnPWYubGVuZ3RoLGg9dm9pZCAwO2I8ZyYmKGg9ZltiXSk7YisrKWZbYl09Yy5jYWxsKGEsaCxkLGUpfXJldHVybiBmLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4hIWF9KS5qb2luKCIsIil9ZnVuY3Rpb24gRGYoYSl7cmV0dXJuIGEucmVwbGFjZShFZixmdW5jdGlvbihhLGMsZCl7LTE8ZC5pbmRleE9mKCIrIik/ZD1kLnJlcGxhY2UoL1wrL2csIl9fXyIpOi0xPGQuaW5kZXhPZigiX19fIikmJihkPWQucmVwbGFjZSgvX19fL2csIisiKSk7cmV0dXJuIjoiK2MrIigiK2QrIikifSl9CmZ1bmN0aW9uIEZmKGEpe2Zvcih2YXIgYj1bXSxjO2M9YS5tYXRjaChHZik7KXt2YXIgZD1jLmluZGV4LGU9bGYoYSxkKTtpZigtMT09PWUpdGhyb3cgRXJyb3IoYy5pbnB1dCsiIHNlbGVjdG9yIG1pc3NpbmcgJyknIik7Yz1hLnNsaWNlKGQsZSsxKTthPWEucmVwbGFjZShjLCJcdWUwMDAiKTtiLnB1c2goYyl9cmV0dXJue2hhOmEsbWF0Y2hlczpifX1mdW5jdGlvbiBIZihhLGIpe3ZhciBjPWEuc3BsaXQoIlx1ZTAwMCIpO3JldHVybiBiLnJlZHVjZShmdW5jdGlvbihhLGIsZil7cmV0dXJuIGErYitjW2YrMV19LGNbMF0pfQp0Zi5wcm90b3R5cGUuYj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9ITE7YT1hLnRyaW0oKTt2YXIgZT1FZi50ZXN0KGEpO2UmJihhPWEucmVwbGFjZShFZixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIjoiK2IrIigiK2MucmVwbGFjZSgvXHMvZywiIikrIikifSksYT1EZihhKSk7dmFyIGY9R2YudGVzdChhKTtpZihmKXt2YXIgZz1GZihhKTthPWcuaGE7Zz1nLm1hdGNoZXN9YT1hLnJlcGxhY2UoSWYsIjpob3N0ICQxIik7YT1hLnJlcGxhY2UoSmYsZnVuY3Rpb24oYSxlLGYpe2R8fChhPUtmKGYsZSxiLGMpLGQ9ZHx8YS5zdG9wLGU9YS5DYSxmPWEudmFsdWUpO3JldHVybiBlK2Z9KTtmJiYoYT1IZihhLGcpKTtlJiYoYT1EZihhKSk7cmV0dXJuIGF9OwpmdW5jdGlvbiBLZihhLGIsYyxkKXt2YXIgZT1hLmluZGV4T2YoIjo6c2xvdHRlZCIpOzA8PWEuaW5kZXhPZigiOmhvc3QiKT9hPUxmKGEsZCk6MCE9PWUmJihhPWM/TWYoYSxjKTphKTtjPSExOzA8PWUmJihiPSIiLGM9ITApO2lmKGMpe3ZhciBmPSEwO2MmJihhPWEucmVwbGFjZShOZixmdW5jdGlvbihhLGIpe3JldHVybiIgPiAiK2J9KSl9YT1hLnJlcGxhY2UoT2YsZnVuY3Rpb24oYSxiLGMpe3JldHVybidbZGlyPSInK2MrJyJdICcrYisiLCAiK2IrJ1tkaXI9IicrYysnIl0nfSk7cmV0dXJue3ZhbHVlOmEsQ2E6YixzdG9wOmZ9fQpmdW5jdGlvbiBNZihhLGIpe2E9YS5zcGxpdCgvKFxbLis/XF0pLyk7Zm9yKHZhciBjPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKylpZigxPT09ZCUyKWMucHVzaChhW2RdKTtlbHNle3ZhciBlPWFbZF07aWYoIiIhPT1lfHxkIT09YS5sZW5ndGgtMSllPWUuc3BsaXQoIjoiKSxlWzBdKz1iLGMucHVzaChlLmpvaW4oIjoiKSl9cmV0dXJuIGMuam9pbigiIil9ZnVuY3Rpb24gTGYoYSxiKXt2YXIgYz1hLm1hdGNoKFBmKTtyZXR1cm4oYz1jJiZjWzJdLnRyaW0oKXx8IiIpP2NbMF0ubWF0Y2goUWYpP2EucmVwbGFjZShQZixmdW5jdGlvbihhLGMsZil7cmV0dXJuIGIrZn0pOmMuc3BsaXQoUWYpWzBdPT09Yj9jOiJzaG91bGRfbm90X21hdGNoIjphLnJlcGxhY2UoIjpob3N0IixiKX1mdW5jdGlvbiBSZihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKX0KdGYucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWF0Y2goIjpob3N0Iik/IiI6YS5tYXRjaCgiOjpzbG90dGVkIik/dGhpcy5iKGEsIjpub3QoLnN0eWxlLXNjb3BlKSIpOk1mKGEudHJpbSgpLCI6bm90KC5zdHlsZS1zY29wZSkiKX07cC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0Zi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJzdHlsZS1zY29wZSJ9fX0pOwp2YXIgRWY9LzoobnRoWy1cd10rKVwoKFteKV0rKVwpLyxKZj0vKF58W1xzPit+XSspKCg/OlxbLis/XF18W15ccz4rfj1bXSkrKS9nLFFmPS9bWy46IypdLyxJZj0vXig6OnNsb3R0ZWQpLyxQZj0vKDpob3N0KSg/OlwoKCg/OlwoW14pKF0qXCl8W14pKF0qKSs/KVwpKS8sTmY9Lyg/Ojo6c2xvdHRlZCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLE9mPS8oLiopOmRpclwoKD86KGx0cnxydGwpKVwpLyxHZj0vOig/Om1hdGNoZXN8YW55fC0oPzp3ZWJraXR8bW96KS1hbnkpLyxSPW5ldyB0ZjtmdW5jdGlvbiBTZihhLGIsYyxkLGUpe3RoaXMuQT1hfHxudWxsO3RoaXMuYj1ifHxudWxsO3RoaXMuZmE9Y3x8W107dGhpcy5vPW51bGw7dGhpcy5jc3NCdWlsZD1lfHwiIjt0aGlzLk09ZHx8IiI7dGhpcy5hPXRoaXMucz10aGlzLnc9bnVsbH1mdW5jdGlvbiBUKGEpe3JldHVybiBhP2EuX19zdHlsZUluZm86bnVsbH1mdW5jdGlvbiBUZihhLGIpe3JldHVybiBhLl9fc3R5bGVJbmZvPWJ9U2YucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfTtTZi5wcm90b3R5cGUuX2dldFN0eWxlUnVsZXM9U2YucHJvdG90eXBlLmM7ZnVuY3Rpb24gVWYoYSl7dmFyIGI9dGhpcy5tYXRjaGVzfHx0aGlzLm1hdGNoZXNTZWxlY3Rvcnx8dGhpcy5tb3pNYXRjaGVzU2VsZWN0b3J8fHRoaXMubXNNYXRjaGVzU2VsZWN0b3J8fHRoaXMub01hdGNoZXNTZWxlY3Rvcnx8dGhpcy53ZWJraXRNYXRjaGVzU2VsZWN0b3I7cmV0dXJuIGImJmIuY2FsbCh0aGlzLGEpfXZhciBWZj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKCJUcmlkZW50Iik7ZnVuY3Rpb24gV2YoKXt9ZnVuY3Rpb24gWGYoYSl7dmFyIGI9e30sYz1bXSxkPTA7ZGYoYSxmdW5jdGlvbihhKXtZZihhKTthLmluZGV4PWQrKzthPWEuaS5jc3NUZXh0O2Zvcih2YXIgYztjPVRlLmV4ZWMoYSk7KXt2YXIgZT1jWzFdOyI6IiE9PWNbMl0mJihiW2VdPSEwKX19LGZ1bmN0aW9uKGEpe2MucHVzaChhKX0pO2EuYj1jO2E9W107Zm9yKHZhciBlIGluIGIpYS5wdXNoKGUpO3JldHVybiBhfQpmdW5jdGlvbiBZZihhKXtpZighYS5pKXt2YXIgYj17fSxjPXt9O1pmKGEsYykmJihiLnY9YyxhLnJ1bGVzPW51bGwpO2IuY3NzVGV4dD1hLnBhcnNlZENzc1RleHQucmVwbGFjZShhZiwiIikucmVwbGFjZShSZSwiIik7YS5pPWJ9fWZ1bmN0aW9uIFpmKGEsYil7dmFyIGM9YS5pO2lmKGMpe2lmKGMudilyZXR1cm4gT2JqZWN0LmFzc2lnbihiLGMudiksITB9ZWxzZXtjPWEucGFyc2VkQ3NzVGV4dDtmb3IodmFyIGQ7YT1SZS5leGVjKGMpOyl7ZD0oYVsyXXx8YVszXSkudHJpbSgpO2lmKCJpbmhlcml0IiE9PWR8fCJ1bnNldCIhPT1kKWJbYVsxXS50cmltKCldPWQ7ZD0hMH1yZXR1cm4gZH19CmZ1bmN0aW9uICRmKGEsYixjKXtiJiYoYj0wPD1iLmluZGV4T2YoIjsiKT9hZyhhLGIsYyk6bWYoYixmdW5jdGlvbihiLGUsZixnKXtpZighZSlyZXR1cm4gYitnOyhlPSRmKGEsY1tlXSxjKSkmJiJpbml0aWFsIiE9PWU/ImFwcGx5LXNoaW0taW5oZXJpdCI9PT1lJiYoZT0iaW5oZXJpdCIpOmU9JGYoYSxjW2ZdfHxmLGMpfHxmO3JldHVybiBiKyhlfHwiIikrZ30pKTtyZXR1cm4gYiYmYi50cmltKCl8fCIifQpmdW5jdGlvbiBhZyhhLGIsYyl7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBkPTAsZSxmO2Q8Yi5sZW5ndGg7ZCsrKWlmKGU9YltkXSl7U2UubGFzdEluZGV4PTA7aWYoZj1TZS5leGVjKGUpKWU9JGYoYSxjW2ZbMV1dLGMpO2Vsc2UgaWYoZj1lLmluZGV4T2YoIjoiKSwtMSE9PWYpe3ZhciBnPWUuc3Vic3RyaW5nKGYpO2c9Zy50cmltKCk7Zz0kZihhLGcsYyl8fGc7ZT1lLnN1YnN0cmluZygwLGYpK2d9YltkXT1lJiZlLmxhc3RJbmRleE9mKCI7Iik9PT1lLmxlbmd0aC0xP2Uuc2xpY2UoMCwtMSk6ZXx8IiJ9cmV0dXJuIGIuam9pbigiOyIpfQpmdW5jdGlvbiBiZyhhLGIpe3ZhciBjPXt9LGQ9W107ZGYoYSxmdW5jdGlvbihhKXthLml8fFlmKGEpO3ZhciBlPWEuanx8YS5wYXJzZWRTZWxlY3RvcjtiJiZhLmkudiYmZSYmVWYuY2FsbChiLGUpJiYoWmYoYSxjKSxhPWEuaW5kZXgsZT1wYXJzZUludChhLzMyLDEwKSxkW2VdPShkW2VdfHwwKXwxPDxhJTMyKX0sbnVsbCwhMCk7cmV0dXJue3Y6YyxrZXk6ZH19CmZ1bmN0aW9uIGNnKGEsYixjLGQpe2IuaXx8WWYoYik7aWYoYi5pLnYpe3ZhciBlPXBmKGEpO2E9ZS5pcztlPWUuTTtlPWE/QmYoYSxlKToiaHRtbCI7dmFyIGY9Yi5wYXJzZWRTZWxlY3RvcixnPSI6aG9zdCA+ICoiPT09Znx8Imh0bWwiPT09ZixoPTA9PT1mLmluZGV4T2YoIjpob3N0IikmJiFnOyJzaGFkeSI9PT1jJiYoZz1mPT09ZSsiID4gKi4iK2V8fC0xIT09Zi5pbmRleE9mKCJodG1sIiksaD0hZyYmMD09PWYuaW5kZXhPZihlKSk7aWYoZ3x8aCljPWUsaCYmKGIuanx8KGIuaj1DZihSLGIsUi5iLGE/Ii4iK2E6IiIsZSkpLGM9Yi5qfHxlKSxkKHtoYTpjLElhOmgsWmE6Z30pfX1mdW5jdGlvbiBkZyhhLGIsYyl7dmFyIGQ9e30sZT17fTtkZihiLGZ1bmN0aW9uKGIpe2NnKGEsYixjLGZ1bmN0aW9uKGMpe1VmLmNhbGwoYS5fZWxlbWVudHx8YSxjLmhhKSYmKGMuSWE/WmYoYixkKTpaZihiLGUpKX0pfSxudWxsLCEwKTtyZXR1cm57UmE6ZSxIYTpkfX0KZnVuY3Rpb24gZWcoYSxiLGMsZCl7dmFyIGU9cGYoYiksZj1CZihlLmlzLGUuTSksZz1uZXcgUmVnRXhwKCIoPzpefFteLiNbOl0pIisoYi5leHRlbmRzPyJcXCIrZi5zbGljZSgwLC0xKSsiXFxdIjpmKSsiKCR8Wy46W1xccz4rfl0pIiksaD1UKGIpO2U9aC5BO2g9aC5jc3NCdWlsZDt2YXIgaz1mZyhlLGQpO3JldHVybiB6ZihiLGUsZnVuY3Rpb24oYil7dmFyIGU9IiI7Yi5pfHxZZihiKTtiLmkuY3NzVGV4dCYmKGU9YWcoYSxiLmkuY3NzVGV4dCxjKSk7Yi5jc3NUZXh0PWU7aWYoIU8mJiFmZihiKSYmYi5jc3NUZXh0KXt2YXIgaD1lPWIuY3NzVGV4dDtudWxsPT1iLm5hJiYoYi5uYT1VZS50ZXN0KGUpKTtpZihiLm5hKWlmKG51bGw9PWIuVSl7Yi5VPVtdO2Zvcih2YXIgbCBpbiBrKWg9a1tsXSxoPWgoZSksZSE9PWgmJihlPWgsYi5VLnB1c2gobCkpfWVsc2V7Zm9yKGw9MDtsPGIuVS5sZW5ndGg7KytsKWg9a1tiLlVbbF1dLGU9aChlKTtoPWV9Yi5jc3NUZXh0PWg7Yi5qPWIuanx8CmIuc2VsZWN0b3I7ZT0iLiIrZDtsPXFmKGIuaik7aD0wO2Zvcih2YXIgTT1sLmxlbmd0aCxVPXZvaWQgMDtoPE0mJihVPWxbaF0pO2grKylsW2hdPVUubWF0Y2goZyk/VS5yZXBsYWNlKGYsZSk6ZSsiICIrVTtiLnNlbGVjdG9yPWwuam9pbigiLCIpfX0saCl9ZnVuY3Rpb24gZmcoYSxiKXthPWEuYjt2YXIgYz17fTtpZighTyYmYSlmb3IodmFyIGQ9MCxlPWFbZF07ZDxhLmxlbmd0aDtlPWFbKytkXSl7dmFyIGY9ZSxnPWI7Zi5mPW5ldyBSZWdFeHAoIlxcYiIrZi5rZXlmcmFtZXNOYW1lKyIoPyFcXEJ8LSkiLCJnIik7Zi5hPWYua2V5ZnJhbWVzTmFtZSsiLSIrZztmLmo9Zi5qfHxmLnNlbGVjdG9yO2Yuc2VsZWN0b3I9Zi5qLnJlcGxhY2UoZi5rZXlmcmFtZXNOYW1lLGYuYSk7Y1tlLmtleWZyYW1lc05hbWVdPWdnKGUpfXJldHVybiBjfWZ1bmN0aW9uIGdnKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYi5yZXBsYWNlKGEuZixhLmEpfX0KZnVuY3Rpb24gaGcoYSxiKXt2YXIgYz1pZyxkPWVmKGEpO2EudGV4dENvbnRlbnQ9Y2YoZCxmdW5jdGlvbihhKXt2YXIgZD1hLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0O2EuaSYmYS5pLmNzc1RleHQmJihkPWQucmVwbGFjZShJZSwiIikucmVwbGFjZShKZSwiIiksYS5jc3NUZXh0PWFnKGMsZCxiKSl9KX1wLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdmLnByb3RvdHlwZSx7YTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIngtc2NvcGUifX19KTt2YXIgaWc9bmV3IFdmO3ZhciBqZz17fSxrZz13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoa2cmJiFPJiYhUGUpe3ZhciBsZz1rZy5kZWZpbmU7a2cuZGVmaW5lPWZ1bmN0aW9uKGEsYixjKXtqZ1thXXx8KGpnW2FdPWtmKGEpKTtsZy5jYWxsKGtnLGEsYixjKX19O2Z1bmN0aW9uIG1nKCl7dGhpcy5jYWNoZT17fX1tZy5wcm90b3R5cGUuc3RvcmU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy5jYWNoZVthXXx8W107ZS5wdXNoKHt2OmIsc3R5bGVFbGVtZW50OmMsczpkfSk7MTAwPGUubGVuZ3RoJiZlLnNoaWZ0KCk7dGhpcy5jYWNoZVthXT1lfTtmdW5jdGlvbiBuZygpe312YXIgb2c9bmV3IFJlZ0V4cChSLmErIlxccyooW15cXHNdKikiKTtmdW5jdGlvbiBwZyhhKXtyZXR1cm4oYT0oYS5jbGFzc0xpc3QmJmEuY2xhc3NMaXN0LnZhbHVlP2EuY2xhc3NMaXN0LnZhbHVlOmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikubWF0Y2gob2cpKT9hWzFdOiIifWZ1bmN0aW9uIHFnKGEpe3ZhciBiPW9mKGEpLmdldFJvb3ROb2RlKCk7cmV0dXJuIGI9PT1hfHxiPT09YS5vd25lckRvY3VtZW50PyIiOihhPWIuaG9zdCk/cGYoYSkuaXM6IiJ9CmZ1bmN0aW9uIHJnKGEpe2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1hW2JdO2lmKGMudGFyZ2V0IT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZjLnRhcmdldCE9PWRvY3VtZW50LmhlYWQpZm9yKHZhciBkPTA7ZDxjLmFkZGVkTm9kZXMubGVuZ3RoO2QrKyl7dmFyIGU9Yy5hZGRlZE5vZGVzW2RdO2lmKGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGY9ZS5nZXRSb290Tm9kZSgpLGc9cGcoZSk7aWYoZyYmZj09PWUub3duZXJEb2N1bWVudCYmKCJzdHlsZSIhPT1lLmxvY2FsTmFtZSYmInRlbXBsYXRlIiE9PWUubG9jYWxOYW1lfHwiIj09PXJmKGUpKSl5ZihlLGcpO2Vsc2UgaWYoZiBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpZm9yKGY9cWcoZSksZiE9PWcmJnhmKGUsZyxmKSxlPXdpbmRvdy5TaGFkeURPTS5uYXRpdmVNZXRob2RzLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChlLCI6bm90KC4iK1IuYSsiKSIpLGc9MDtnPGUubGVuZ3RoO2crKyl7Zj1lW2ddOwp2YXIgaD1xZyhmKTtoJiZ3ZihmLGgpfX19fX0KaWYoIShPfHx3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5oYW5kbGVzRHluYW1pY1Njb3BpbmcpKXt2YXIgc2c9bmV3IE11dGF0aW9uT2JzZXJ2ZXIocmcpLHRnPWZ1bmN0aW9uKGEpe3NnLm9ic2VydmUoYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KX07aWYod2luZG93LmN1c3RvbUVsZW1lbnRzJiYhd2luZG93LmN1c3RvbUVsZW1lbnRzLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2spdGcoZG9jdW1lbnQpO2Vsc2V7dmFyIHVnPWZ1bmN0aW9uKCl7dGcoZG9jdW1lbnQuYm9keSl9O3dpbmRvdy5IVE1MSW1wb3J0cz93aW5kb3cuSFRNTEltcG9ydHMud2hlblJlYWR5KHVnKTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtpZigibG9hZGluZyI9PT1kb2N1bWVudC5yZWFkeVN0YXRlKXt2YXIgYT1mdW5jdGlvbigpe3VnKCk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsYSl9O2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLAphKX1lbHNlIHVnKCl9KX1uZz1mdW5jdGlvbigpe3JnKHNnLnRha2VSZWNvcmRzKCkpfX12YXIgdmc9bmc7dmFyIHdnPXt9O3ZhciB4Zz1Qcm9taXNlLnJlc29sdmUoKTtmdW5jdGlvbiB5ZyhhKXtpZihhPXdnW2FdKWEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9ufHwwLGEuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uPWEuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9ufHwwLGEuX2FwcGx5U2hpbU5leHRWZXJzaW9uPShhLl9hcHBseVNoaW1OZXh0VmVyc2lvbnx8MCkrMX1mdW5jdGlvbiB6ZyhhKXtyZXR1cm4gYS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb249PT1hLl9hcHBseVNoaW1OZXh0VmVyc2lvbn1mdW5jdGlvbiBBZyhhKXthLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1OZXh0VmVyc2lvbjthLl92YWxpZGF0aW5nfHwoYS5fdmFsaWRhdGluZz0hMCx4Zy50aGVuKGZ1bmN0aW9uKCl7YS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZz0hMX0pKX07dmFyIEJnPXt9LENnPW5ldyBtZztmdW5jdGlvbiBZKCl7dGhpcy5sPXt9O3RoaXMuYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7dmFyIGE9bmV3IHZlO2EucnVsZXM9W107dGhpcy5mPVRmKHRoaXMuYyxuZXcgU2YoYSkpO3RoaXMuZz0hMTt0aGlzLmI9dGhpcy5hPW51bGx9bj1ZLnByb3RvdHlwZTtuLmZsdXNoPWZ1bmN0aW9uKCl7dmcoKX07bi5GYT1mdW5jdGlvbihhKXtyZXR1cm4gZWYoYSl9O24uVmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGNmKGEpfTtuLnByZXBhcmVUZW1wbGF0ZT1mdW5jdGlvbihhLGIsYyl7dGhpcy5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKTt0aGlzLnByZXBhcmVUZW1wbGF0ZVN0eWxlcyhhLGIsYyl9OwpuLnByZXBhcmVUZW1wbGF0ZVN0eWxlcz1mdW5jdGlvbihhLGIsYyl7aWYoIWEuX3ByZXBhcmVkJiYhUGUpe098fGpnW2JdfHwoamdbYl09a2YoYikpO2EuX3ByZXBhcmVkPSEwO2EubmFtZT1iO2EuZXh0ZW5kcz1jO3dnW2JdPWE7dmFyIGQ9cmYoYSksZT1zZihkKTtjPXtpczpiLGV4dGVuZHM6Y307Zm9yKHZhciBmPVtdLGc9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksaD0wO2g8Zy5sZW5ndGg7aCsrKXt2YXIgaz1nW2hdO2lmKGsuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighTyl7dmFyIGw9ay50ZXh0Q29udGVudDtiZi5oYXMobCl8fChiZi5hZGQobCksbD1rLmNsb25lTm9kZSghMCksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsKSk7ay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfX1lbHNlIGYucHVzaChrLnRleHRDb250ZW50KSxrLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoayl9Zj1mLmpvaW4oIiIpLnRyaW0oKSsoQmdbYl18fCIiKTsKRGcodGhpcyk7aWYoIWUpe2lmKGc9IWQpZz1TZS50ZXN0KGYpfHxSZS50ZXN0KGYpLFNlLmxhc3RJbmRleD0wLFJlLmxhc3RJbmRleD0wO2g9d2UoZik7ZyYmUSYmdGhpcy5hJiZ0aGlzLmEudHJhbnNmb3JtUnVsZXMoaCxiKTthLl9zdHlsZUFzdD1ofWc9W107UXx8KGc9WGYoYS5fc3R5bGVBc3QpKTtpZighZy5sZW5ndGh8fFEpaD1PP2EuY29udGVudDpudWxsLGI9amdbYl18fG51bGwsZD16ZihjLGEuX3N0eWxlQXN0LG51bGwsZCxlP2Y6IiIpLGQ9ZC5sZW5ndGg/Z2YoZCxjLmlzLGgsYik6bnVsbCxhLl9zdHlsZT1kO2EuYT1nfX07bi5RYT1mdW5jdGlvbihhLGIpe0JnW2JdPWEuam9pbigiICIpfTtuLnByZXBhcmVUZW1wbGF0ZURvbT1mdW5jdGlvbihhLGIpe2lmKCFQZSl7dmFyIGM9cmYoYSk7T3x8InNoYWR5Ij09PWN8fGEuX2RvbVByZXBhcmVkfHwoYS5fZG9tUHJlcGFyZWQ9ITAsdWYoYS5jb250ZW50LGIpKX19OwpmdW5jdGlvbiBFZyhhKXt2YXIgYj1wZihhKSxjPWIuaXM7Yj1iLk07dmFyIGQ9amdbY118fG51bGwsZT13Z1tjXTtpZihlKXtjPWUuX3N0eWxlQXN0O3ZhciBmPWUuYTtlPXJmKGUpO2I9bmV3IFNmKGMsZCxmLGIsZSk7VGYoYSxiKTtyZXR1cm4gYn19ZnVuY3Rpb24gRmcoYSl7IWEuYiYmd2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UmJihhLmI9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlLGEuYi50cmFuc2Zvcm1DYWxsYmFjaz1mdW5jdGlvbihiKXthLnJhKGIpfSxhLmIudmFsaWRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpeyhhLmIuZW5xdWV1ZWR8fGEuZykmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9CmZ1bmN0aW9uIERnKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltLGEuYS5pbnZhbGlkQ2FsbGJhY2s9eWcpO0ZnKGEpfQpuLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7aWYoIVBlJiYoRGcodGhpcyksdGhpcy5iKSl7dmFyIGE9dGhpcy5iLnByb2Nlc3NTdHlsZXMoKTtpZih0aGlzLmIuZW5xdWV1ZWQmJiFzZih0aGlzLmYuY3NzQnVpbGQpKXtpZihRKXtpZighdGhpcy5mLmNzc0J1aWxkKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLmIuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShhW2JdKTtpZihjJiZRJiZ0aGlzLmEpe3ZhciBkPWVmKGMpO0RnKHRoaXMpO3RoaXMuYS50cmFuc2Zvcm1SdWxlcyhkKTtjLnRleHRDb250ZW50PWNmKGQpfX19ZWxzZXtHZyh0aGlzLHRoaXMuYyx0aGlzLmYpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspKGM9dGhpcy5iLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSkpJiZoZyhjLHRoaXMuZi53KTt0aGlzLmcmJnRoaXMuc3R5bGVEb2N1bWVudCgpfXRoaXMuYi5lbnF1ZXVlZD0hMX19fTsKbi5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSxiKXtpZihQZSl7aWYoYil7VChhKXx8VGYoYSxuZXcgU2YobnVsbCkpO3ZhciBjPVQoYSk7Yy5vPWMub3x8e307T2JqZWN0LmFzc2lnbihjLm8sYik7SGcodGhpcyxhLGMpfX1lbHNlIGlmKGM9VChhKXx8RWcoYSkpaWYoYSE9PXRoaXMuYyYmKHRoaXMuZz0hMCksYiYmKGMubz1jLm98fHt9LE9iamVjdC5hc3NpZ24oYy5vLGIpKSxRKUhnKHRoaXMsYSxjKTtlbHNlIGlmKHRoaXMuZmx1c2goKSxHZyh0aGlzLGEsYyksYy5mYSYmYy5mYS5sZW5ndGgpe2I9cGYoYSkuaXM7dmFyIGQ7YTp7aWYoZD1DZy5jYWNoZVtiXSlmb3IodmFyIGU9ZC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIGY9ZFtlXTtiOnt2YXIgZz1jLmZhO2Zvcih2YXIgaD0wO2g8Zy5sZW5ndGg7aCsrKXt2YXIgaz1nW2hdO2lmKGYudltrXSE9PWMud1trXSl7Zz0hMTticmVhayBifX1nPSEwfWlmKGcpe2Q9ZjticmVhayBhfX1kPXZvaWQgMH1nPWQ/ZC5zdHlsZUVsZW1lbnQ6bnVsbDsKZT1jLnM7KGY9ZCYmZC5zKXx8KGY9dGhpcy5sW2JdPSh0aGlzLmxbYl18fDApKzEsZj1iKyItIitmKTtjLnM9ZjtmPWMucztoPWlnO2g9Zz9nLnRleHRDb250ZW50fHwiIjplZyhoLGEsYy53LGYpO2s9VChhKTt2YXIgbD1rLmE7bCYmIU8mJmwhPT1nJiYobC5fdXNlQ291bnQtLSwwPj1sLl91c2VDb3VudCYmbC5wYXJlbnROb2RlJiZsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobCkpO08/ay5hPyhrLmEudGV4dENvbnRlbnQ9aCxnPWsuYSk6aCYmKGc9Z2YoaCxmLGEuc2hhZG93Um9vdCxrLmIpKTpnP2cucGFyZW50Tm9kZXx8KFZmJiYtMTxoLmluZGV4T2YoIkBtZWRpYSIpJiYoZy50ZXh0Q29udGVudD1oKSxoZihnLG51bGwsay5iKSk6aCYmKGc9Z2YoaCxmLG51bGwsay5iKSk7ZyYmKGcuX3VzZUNvdW50PWcuX3VzZUNvdW50fHwwLGsuYSE9ZyYmZy5fdXNlQ291bnQrKyxrLmE9Zyk7Zj1nO098fChnPWMucyxrPWg9YS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiLGUmJihrPWgucmVwbGFjZShuZXcgUmVnRXhwKCJcXHMqeC1zY29wZVxccyoiKwplKyJcXHMqIiwiZyIpLCIgIikpLGsrPShrPyIgIjoiIikrIngtc2NvcGUgIitnLGghPT1rJiZuZihhLGspKTtkfHxDZy5zdG9yZShiLGMudyxmLGMucyl9fTsKZnVuY3Rpb24gSGcoYSxiLGMpe3ZhciBkPXBmKGIpLmlzO2lmKGMubyl7dmFyIGU9Yy5vLGY7Zm9yKGYgaW4gZSludWxsPT09Zj9iLnN0eWxlLnJlbW92ZVByb3BlcnR5KGYpOmIuc3R5bGUuc2V0UHJvcGVydHkoZixlW2ZdKX1lPXdnW2RdO2lmKCEoIWUmJmIhPT1hLmN8fGUmJiIiIT09cmYoZSkpJiZlJiZlLl9zdHlsZSYmIXpnKGUpKXtpZih6ZyhlKXx8ZS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1lLl9hcHBseVNoaW1OZXh0VmVyc2lvbilEZyhhKSxhLmEmJmEuYS50cmFuc2Zvcm1SdWxlcyhlLl9zdHlsZUFzdCxkKSxlLl9zdHlsZS50ZXh0Q29udGVudD16ZihiLGMuQSksQWcoZSk7TyYmKGE9Yi5zaGFkb3dSb290KSYmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKSYmKGEudGV4dENvbnRlbnQ9emYoYixjLkEpKTtjLkE9ZS5fc3R5bGVBc3R9fQpmdW5jdGlvbiBJZyhhLGIpe3JldHVybihiPW9mKGIpLmdldFJvb3ROb2RlKCkuaG9zdCk/VChiKXx8RWcoYik/YjpJZyhhLGIpOmEuY31mdW5jdGlvbiBHZyhhLGIsYyl7dmFyIGQ9SWcoYSxiKSxlPVQoZCksZj1lLnc7ZD09PWEuY3x8Znx8KEdnKGEsZCxlKSxmPWUudyk7YT1PYmplY3QuY3JlYXRlKGZ8fG51bGwpO2Q9ZGcoYixjLkEsYy5jc3NCdWlsZCk7Yj1iZyhlLkEsYikudjtPYmplY3QuYXNzaWduKGEsZC5IYSxiLGQuUmEpO2I9Yy5vO2Zvcih2YXIgZyBpbiBiKWlmKChlPWJbZ10pfHwwPT09ZSlhW2ddPWU7Zz1pZztiPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZD1iW2VdLGFbZF09JGYoZyxhW2RdLGEpO2Mudz1hfW4uc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXt0aGlzLnN0eWxlU3VidHJlZSh0aGlzLmMsYSl9OwpuLnN0eWxlU3VidHJlZT1mdW5jdGlvbihhLGIpe3ZhciBjPW9mKGEpLGQ9Yy5zaGFkb3dSb290OyhkfHxhPT09dGhpcy5jKSYmdGhpcy5zdHlsZUVsZW1lbnQoYSxiKTtpZihhPWQmJihkLmNoaWxkcmVufHxkLmNoaWxkTm9kZXMpKWZvcihjPTA7YzxhLmxlbmd0aDtjKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtjXSk7ZWxzZSBpZihjPWMuY2hpbGRyZW58fGMuY2hpbGROb2Rlcylmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKXRoaXMuc3R5bGVTdWJ0cmVlKGNbYV0pfTsKbi5yYT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9cmYoYSk7YyE9PXRoaXMuZi5jc3NCdWlsZCYmKHRoaXMuZi5jc3NCdWlsZD1jKTtpZighc2YoYykpe3ZhciBkPWVmKGEpO2RmKGQsZnVuY3Rpb24oYSl7aWYoTylSZihhKTtlbHNle3ZhciBkPVI7YS5zZWxlY3Rvcj1hLnBhcnNlZFNlbGVjdG9yO1JmKGEpO2Euc2VsZWN0b3I9YS5qPUNmKGQsYSxkLmMsdm9pZCAwLHZvaWQgMCl9USYmIiI9PT1jJiYoRGcoYiksYi5hJiZiLmEudHJhbnNmb3JtUnVsZShhKSl9KTtRP2EudGV4dENvbnRlbnQ9Y2YoZCk6dGhpcy5mLkEucnVsZXMucHVzaChkKX19O24uZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlPWZ1bmN0aW9uKGEsYil7dmFyIGM7UXx8KGM9KFQoYSl8fFQoSWcodGhpcyxhKSkpLndbYl0pO3JldHVybihjPWN8fHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoYikpP2MudHJpbSgpOiIifTsKbi5VYT1mdW5jdGlvbihhLGIpe3ZhciBjPW9mKGEpLmdldFJvb3ROb2RlKCk7Yj1iP2Iuc3BsaXQoL1xzLyk6W107Yz1jLmhvc3QmJmMuaG9zdC5sb2NhbE5hbWU7aWYoIWMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2lmKGQpe2Q9ZC5zcGxpdCgvXHMvKTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKylpZihkW2VdPT09Ui5hKXtjPWRbZSsxXTticmVha319fWMmJmIucHVzaChSLmEsYyk7UXx8KGM9VChhKSkmJmMucyYmYi5wdXNoKGlnLmEsYy5zKTtuZihhLGIuam9pbigiICIpKX07bi5CYT1mdW5jdGlvbihhKXtyZXR1cm4gVChhKX07bi5UYT1mdW5jdGlvbihhLGIpe3dmKGEsYil9O24uV2E9ZnVuY3Rpb24oYSxiKXt3ZihhLGIsITApfTtuLlNhPWZ1bmN0aW9uKGEpe3JldHVybiBxZyhhKX07bi5EYT1mdW5jdGlvbihhKXtyZXR1cm4gcGcoYSl9O1kucHJvdG90eXBlLmZsdXNoPVkucHJvdG90eXBlLmZsdXNoO1kucHJvdG90eXBlLnByZXBhcmVUZW1wbGF0ZT1ZLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU7ClkucHJvdG90eXBlLnN0eWxlRWxlbWVudD1ZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ7WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1ZLnByb3RvdHlwZS5zdHlsZURvY3VtZW50O1kucHJvdG90eXBlLnN0eWxlU3VidHJlZT1ZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU7WS5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlPVkucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZTtZLnByb3RvdHlwZS5zZXRFbGVtZW50Q2xhc3M9WS5wcm90b3R5cGUuVWE7WS5wcm90b3R5cGUuX3N0eWxlSW5mb0Zvck5vZGU9WS5wcm90b3R5cGUuQmE7WS5wcm90b3R5cGUudHJhbnNmb3JtQ3VzdG9tU3R5bGVGb3JEb2N1bWVudD1ZLnByb3RvdHlwZS5yYTtZLnByb3RvdHlwZS5nZXRTdHlsZUFzdD1ZLnByb3RvdHlwZS5GYTtZLnByb3RvdHlwZS5zdHlsZUFzdFRvU3RyaW5nPVkucHJvdG90eXBlLlZhO1kucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPVkucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzOwpZLnByb3RvdHlwZS5zY29wZU5vZGU9WS5wcm90b3R5cGUuVGE7WS5wcm90b3R5cGUudW5zY29wZU5vZGU9WS5wcm90b3R5cGUuV2E7WS5wcm90b3R5cGUuc2NvcGVGb3JOb2RlPVkucHJvdG90eXBlLlNhO1kucHJvdG90eXBlLmN1cnJlbnRTY29wZUZvck5vZGU9WS5wcm90b3R5cGUuRGE7WS5wcm90b3R5cGUucHJlcGFyZUFkb3B0ZWRDc3NUZXh0PVkucHJvdG90eXBlLlFhO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFkucHJvdG90eXBlLHtuYXRpdmVTaGFkb3c6e2dldDpmdW5jdGlvbigpe3JldHVybiBPfX0sbmF0aXZlQ3NzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUX19fSk7dmFyIFo9bmV3IFksSmcsS2c7d2luZG93LlNoYWR5Q1NTJiYoSmc9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSxLZz13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UpOwp3aW5kb3cuU2hhZHlDU1M9e1Njb3BpbmdTaGltOloscHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oYSxiKXtaLnByZXBhcmVUZW1wbGF0ZURvbShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnByZXBhcmVUZW1wbGF0ZVN0eWxlcyhhLGIsYyl9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1ouc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRG9jdW1lbnQoYSl9LGZsdXNoQ3VzdG9tU3R5bGVzOmZ1bmN0aW9uKCl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpfSwKZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFouZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKGEsYil9LG5hdGl2ZUNzczpRLG5hdGl2ZVNoYWRvdzpPLGNzc0J1aWxkOlFlLGRpc2FibGVSdW50aW1lOlBlfTtKZyYmKHdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW09SmcpO0tnJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPUtnKTt2YXIgTGc9d2luZG93LmN1c3RvbUVsZW1lbnRzLE1nPXdpbmRvdy5IVE1MSW1wb3J0cyxOZz13aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudDt3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e307aWYoTGcmJkxnLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2spe3ZhciBPZyxQZz1mdW5jdGlvbigpe2lmKE9nKXtOZy5DJiZOZy5DKHdpbmRvdy5kb2N1bWVudCk7dmFyIGE9T2c7T2c9bnVsbDthKCk7cmV0dXJuITB9fSxRZz1NZy53aGVuUmVhZHk7TGcucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayhmdW5jdGlvbihhKXtPZz1hO1FnKFBnKX0pO01nLndoZW5SZWFkeT1mdW5jdGlvbihhKXtRZyhmdW5jdGlvbigpe1BnKCk/TWcud2hlblJlYWR5KGEpOmEoKX0pfX0KTWcud2hlblJlYWR5KGZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7d2luZG93LldlYkNvbXBvbmVudHMucmVhZHk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIldlYkNvbXBvbmVudHNSZWFkeSIse2J1YmJsZXM6ITB9KSl9KX0pO3ZhciBSZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO1JnLnRleHRDb250ZW50PSJib2R5IHt0cmFuc2l0aW9uOiBvcGFjaXR5IGVhc2UtaW4gMC4yczsgfSBcbmJvZHlbdW5yZXNvbHZlZF0ge29wYWNpdHk6IDA7IGRpc3BsYXk6IGJsb2NrOyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IH0gXG4iO3ZhciBTZz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIik7U2cuaW5zZXJ0QmVmb3JlKFJnLFNnLmZpcnN0Q2hpbGQpO30pLmNhbGwodGhpcyk7CgoKPC9zY3JpcHQ+PHNjcmlwdD4oZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBsPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHA7ZnVuY3Rpb24gcihhKXtwPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6bHx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdDt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHQ9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgYWE9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP3A9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KHIod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpyKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIHU9cCx2PXQ7ZnVuY3Rpb24gdygpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHgoYSl7YT1hLnJlcGxhY2UoYmEsIiIpLnJlcGxhY2UoY2EsIiIpO3ZhciBiPXksYz1hLGU9bmV3IHc7ZS5zdGFydD0wO2UuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZD1lLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBoPWQsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHc7ZC5zdGFydD1mKzE7ZC5wYXJlbnQ9aDtkLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGQpfWVsc2UifSI9PT1jW2ZdJiYoZC5lbmQ9ZisxLGQ9ZC5wYXJlbnR8fGUpO3JldHVybiBiKGUsYSl9CmZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWRhKGMpLGM9Yy5yZXBsYWNlKHosIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUE6Yy5tYXRjaChlYSkmJihhLnR5cGU9QixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdCh6KS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/QzpEKTtpZihjPWEucnVsZXMpZm9yKHZhciBlPTAsZD1jLmxlbmd0aCxmPXZvaWQgMDtlPGQmJihmPWNbZV0pO2UrKyl5KGYsYik7CnJldHVybiBhfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBlPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGQ9YS5ydWxlcyxmO2lmKGY9ZClmPWRbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZC5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1kW2ZdKTtmKyspZT1FKGgsYixlKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKGZhLCIiKS5yZXBsYWNlKGhhLCIiKSxiPWIucmVwbGFjZShpYSwiIikucmVwbGFjZShqYSwiIikpLChlPWIudHJpbSgpKSYmKGU9IiAgIitlKyJcbiIpfWUmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWUsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEQ9MSxCPTcsQT00LEM9MUUzLGJhPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLGNhPS9AaW1wb3J0W147XSo7L2dpbSxmYT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0saGE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLGlhPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLGphPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sZWE9L15AW15cc10qa2V5ZnJhbWVzLyx6PS9ccysvZzt2YXIgRz0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLEg9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksa2E9L0BtZWRpYVxzKC4qKS87dmFyIEk9bmV3IFNldDtmdW5jdGlvbiBKKGEpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXgoYSkpO3JldHVybiBFKGEsdSl9ZnVuY3Rpb24gSyhhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTChhLGIsYyxlKXtpZihhKXt2YXIgZD0hMSxmPWEudHlwZTtpZihlJiZmPT09QSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChrYSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChkPSEwKSl9Zj09PUQ/YihhKTpjJiZmPT09Qj9jKGEpOmY9PT1DJiYoZD0hMCk7aWYoKGE9YS5ydWxlcykmJiFkKWZvcihkPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtkPGYmJihnPWFbZF0pO2QrKylMKGcsYixjLGUpfX0KZnVuY3Rpb24gTShhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTthOnt2YXIgZT0wO3ZhciBkPWMrMztmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKylpZigiKCI9PT1hW2RdKWUrKztlbHNlIGlmKCIpIj09PWFbZF0mJjA9PT0tLWUpYnJlYWsgYTtkPS0xfWU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPU0oYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfQpmdW5jdGlvbiBOKGEpe2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifTt2YXIgbGE9LztccyovbSxtYT0vXlxzKihpbml0aWFsKXwoaW5oZXJpdClccyokLyxPPS9ccyohaW1wb3J0YW50LztmdW5jdGlvbiBQKCl7dGhpcy5hPXt9fVAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe2E9YS50cmltKCk7dGhpcy5hW2FdPXtoOmIsaTp7fX19O1AucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXthPWEudHJpbSgpO3JldHVybiB0aGlzLmFbYV18fG51bGx9O3ZhciBRPW51bGw7ZnVuY3Rpb24gUigpe3RoaXMuYj10aGlzLmM9bnVsbDt0aGlzLmE9bmV3IFB9Ui5wcm90b3R5cGUubz1mdW5jdGlvbihhKXthPUgudGVzdChhKXx8Ry50ZXN0KGEpO0gubGFzdEluZGV4PTA7Ry5sYXN0SW5kZXg9MDtyZXR1cm4gYX07ClIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hLl9nYXRoZXJlZFN0eWxlKXt2YXIgYz1bXTtmb3IodmFyIGU9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1lW2RdO2lmKGYuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighbCl7dmFyIGc9Zi50ZXh0Q29udGVudDtJLmhhcyhnKXx8KEkuYWRkKGcpLGc9Zi5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZykpO2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX19ZWxzZSBjLnB1c2goZi50ZXh0Q29udGVudCksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfShjPWMuam9pbigiIikudHJpbSgpKT8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGUudGV4dENvbnRlbnQ9YyxhLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsYS5jb250ZW50LmZpcnN0Q2hpbGQpLGM9ZSk6Yz1udWxsO2EuX2dhdGhlcmVkU3R5bGU9CmN9cmV0dXJuKGE9YS5fZ2F0aGVyZWRTdHlsZSk/dGhpcy5qKGEsYik6bnVsbH07Ui5wcm90b3R5cGUuaj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO3ZhciBjPUsoYSk7dGhpcy5sKGMsYik7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1LKGEpO0woYyxmdW5jdGlvbihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKTtiLmcoYSl9KTthLnRleHRDb250ZW50PUooYyk7cmV0dXJuIGN9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuYz1iO0woYSxmdW5jdGlvbihhKXtjLmcoYSl9KTt0aGlzLmM9bnVsbH07Ui5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthLmNzc1RleHQ9bmEodGhpcyxhLnBhcnNlZENzc1RleHQsYSk7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSI6aG9zdCA+ICoiKX07CmZ1bmN0aW9uIG5hKGEsYixjKXtiPWIucmVwbGFjZShHLGZ1bmN0aW9uKGIsZCxmLGcpe3JldHVybiBvYShhLGIsZCxmLGcsYyl9KTtyZXR1cm4gUyhhLGIsYyl9ZnVuY3Rpb24gcGEoYSxiKXtmb3IodmFyIGM9YjtjLnBhcmVudDspYz1jLnBhcmVudDt2YXIgZT17fSxkPSExO0woYyxmdW5jdGlvbihjKXsoZD1kfHxjPT09Yil8fGMuc2VsZWN0b3I9PT1iLnNlbGVjdG9yJiZPYmplY3QuYXNzaWduKGUsVChhLGMucGFyc2VkQ3NzVGV4dCkpfSk7cmV0dXJuIGV9CmZ1bmN0aW9uIFMoYSxiLGMpe2Zvcih2YXIgZTtlPUguZXhlYyhiKTspe3ZhciBkPWVbMF0sZj1lWzFdO2U9ZS5pbmRleDt2YXIgZz1iLnNsaWNlKDAsZStkLmluZGV4T2YoIkBhcHBseSIpKTtiPWIuc2xpY2UoZStkLmxlbmd0aCk7dmFyIGg9Yz9wYShhLGMpOnt9O09iamVjdC5hc3NpZ24oaCxUKGEsZykpO2Q9dm9pZCAwO3ZhciBrPWE7Zj1mLnJlcGxhY2UobGEsIiIpO3ZhciBuPVtdO3ZhciBtPWsuYS5nZXQoZik7bXx8KGsuYS5zZXQoZix7fSksbT1rLmEuZ2V0KGYpKTtpZihtKXtrLmMmJihtLmlbay5jXT0hMCk7dmFyIHE9bS5oO2ZvcihkIGluIHEpaz1oJiZoW2RdLG09W2QsIjogdmFyKCIsZiwiXy1fIixkXSxrJiZtLnB1c2goIiwiLGsucmVwbGFjZShPLCIiKSksbS5wdXNoKCIpIiksTy50ZXN0KHFbZF0pJiZtLnB1c2goIiAhaW1wb3J0YW50Iiksbi5wdXNoKG0uam9pbigiIikpfWQ9bi5qb2luKCI7ICIpO2I9ZytkK2I7SC5sYXN0SW5kZXg9ZStkLmxlbmd0aH1yZXR1cm4gYn0KZnVuY3Rpb24gVChhLGIsYyl7Yz12b2lkIDA9PT1jPyExOmM7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBlLGQsZj17fSxnPTAsaDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10paWYoaD1lLnNwbGl0KCI6IiksMTxoLmxlbmd0aCl7ZT1oWzBdLnRyaW0oKTtkPWguc2xpY2UoMSkuam9pbigiOiIpO2lmKGMpe3ZhciBrPWE7aD1lO3ZhciBuPW1hLmV4ZWMoZCk7biYmKG5bMV0/KGsuYnx8KGsuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIiksay5iLnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksay5iLnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrLmIpKSxoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGsuYikuZ2V0UHJvcGVydHlWYWx1ZShoKSk6aD0iYXBwbHktc2hpbS1pbmhlcml0IixkPWgpfWZbZV09ZH1yZXR1cm4gZn1mdW5jdGlvbiBxYShhLGIpe2lmKFEpZm9yKHZhciBjIGluIGIuaSljIT09YS5jJiZRKGMpfQpmdW5jdGlvbiBvYShhLGIsYyxlLGQsZil7ZSYmTShlLGZ1bmN0aW9uKGIsYyl7YyYmYS5hLmdldChjKSYmKGQ9IkBhcHBseSAiK2MrIjsiKX0pO2lmKCFkKXJldHVybiBiO3ZhciBnPVMoYSwiIitkLGYpO2Y9Yi5zbGljZSgwLGIuaW5kZXhPZigiLS0iKSk7dmFyIGg9Zz1UKGEsZywhMCksaz1hLmEuZ2V0KGMpLG49ayYmay5oO24/aD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobiksZyk6YS5hLnNldChjLGgpO3ZhciBtPVtdLHEsWj0hMTtmb3IocSBpbiBoKXt2YXIgRj1nW3FdO3ZvaWQgMD09PUYmJihGPSJpbml0aWFsIik7IW58fHEgaW4gbnx8KFo9ITApO20ucHVzaChjKyJfLV8iK3ErIjogIitGKX1aJiZxYShhLGspO2smJihrLmg9aCk7ZSYmKGY9YisiOyIrZik7cmV0dXJuIGYrbS5qb2luKCI7ICIpKyI7In1SLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1SLnByb3RvdHlwZS5vO1IucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPVIucHJvdG90eXBlLmo7ClIucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPVIucHJvdG90eXBlLmY7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9Ui5wcm90b3R5cGUubDtSLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPVIucHJvdG90eXBlLmc7Ui5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGU9Ui5wcm90b3R5cGUubTtSLnByb3RvdHlwZS5fc2VwYXJhdG9yPSJfLV8iO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9LHNldDpmdW5jdGlvbihhKXtRPWF9fSk7dmFyIFU9e307dmFyIHJhPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHNhKGEpe2lmKGE9VVthXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gdWEoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAscmEudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBWPW5ldyBSO2Z1bmN0aW9uIFcoKXt0aGlzLmE9bnVsbDtWLmludmFsaWRDYWxsYmFjaz1zYX1mdW5jdGlvbiBYKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5hLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGEpe1YuZihhKX0sYS5hLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLmEuZW5xdWV1ZWQmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTsiIj09PU4oYSkmJihVW2JdPWEsYj1WLm0oYSxiKSxhLl9zdHlsZUFzdD1iKX07ClcucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7WCh0aGlzKTtpZih0aGlzLmEpe3ZhciBhPXRoaXMuYS5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5hLmVucXVldWVkKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5hLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7YyYmVi5mKGMpfXRoaXMuYS5lbnF1ZXVlZD0hMX19fTsKVy5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTtpZihiKWZvcih2YXIgYyBpbiBiKW51bGw9PT1jP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoYyk6YS5zdHlsZS5zZXRQcm9wZXJ0eShjLGJbY10pO2lmKGEuc2hhZG93Um9vdClmb3IodGhpcy5zdHlsZUVsZW1lbnQoYSksYT1hLnNoYWRvd1Jvb3QuY2hpbGRyZW58fGEuc2hhZG93Um9vdC5jaGlsZE5vZGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKTtlbHNlIGZvcihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9OwpXLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt2YXIgYj1hLmxvY2FsTmFtZSxjO2I/LTE8Yi5pbmRleE9mKCItIik/Yz1iOmM9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIjpjPWEuaXM7Yj1VW2NdO2lmKCEoYiYmIiIhPT1OKGIpfHwhYnx8dGEoYikpKXtpZih0YShiKXx8Yi5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1iLl9hcHBseVNoaW1OZXh0VmVyc2lvbil0aGlzLnByZXBhcmVUZW1wbGF0ZShiLGMpLHVhKGIpO2lmKGE9YS5zaGFkb3dSb290KWlmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKWEuX19jc3NSdWxlcz1iLl9zdHlsZUFzdCxhLnRleHRDb250ZW50PUooYi5fc3R5bGVBc3QpfX07Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXtYKHRoaXMpO3RoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksYSl9OwppZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXt2YXIgWT1uZXcgVyx2YT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnByZXBhcmVUZW1wbGF0ZShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kuc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTsKWS5zdHlsZURvY3VtZW50KGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczp1LG5hdGl2ZVNoYWRvdzpsLGNzc0J1aWxkOnYsZGlzYWJsZVJ1bnRpbWU6YWF9O3ZhJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXZhKX13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPVY7fSkuY2FsbCh0aGlzKTsKCgo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCB1c2VyUG9seW1lciA9IHdpbmRvdy5Qb2x5bWVyOwoKICAvKioKICAgKiBAbmFtZXNwYWNlIFBvbHltZXIKICAgKiBAc3VtbWFyeSBQb2x5bWVyIGlzIGEgbGlnaHR3ZWlnaHQgbGlicmFyeSBidWlsdCBvbiB0b3Agb2YgdGhlIHdlYgogICAqICAgc3RhbmRhcmRzLWJhc2VkIFdlYiBDb21wb25lbnRzIEFQSSdzLCBhbmQgbWFrZXMgaXQgZWFzeSB0byBidWlsZCB5b3VyCiAgICogICBvd24gY3VzdG9tIEhUTUwgZWxlbWVudHMuCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyID0gZnVuY3Rpb24oaW5mbykgewogICAgcmV0dXJuIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4oaW5mbyk7CiAgfTsKCiAgLy8gc3VwcG9ydCB1c2VyIHNldHRpbmdzIG9uIHRoZSBQb2x5bWVyIG9iamVjdAogIGlmICh1c2VyUG9seW1lcikgewogICAgT2JqZWN0LmFzc2lnbihQb2x5bWVyLCB1c2VyUG9seW1lcik7CiAgfQoKICAvLyBUbyBiZSBwbHVnZ2VkIGJ5IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBpZiBsb2FkZWQKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogIC8qKgogICAqIEBwYXJhbSB7IVBvbHltZXJJbml0fSBpbmZvIFByb3RvdHlwZSBmb3IgdGhlIGN1c3RvbSBlbGVtZW50LiBJdCBtdXN0IGNvbnRhaW4KICAgKiAgIGFuIGBpc2AgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgZWxlbWVudCBuYW1lLiBPdGhlciBwcm9wZXJ0aWVzIHBvcHVsYXRlCiAgICogICB0aGUgZWxlbWVudCBwcm90b3R5cGUuIFRoZSBgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgaG9zdEF0dHJpYnV0ZXNgLAogICAqICAgYW5kIGBsaXN0ZW5lcnNgIHByb3BlcnRpZXMgYXJlIHByb2Nlc3NlZCB0byBjcmVhdGUgZWxlbWVudCBmZWF0dXJlcy4KICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgY3VzdG9tIGVsZW1lbnQgY2xhc3MgZm9yIHRoZSBnaXZlbiBwcm92aWRlZAogICAqICAgcHJvdG90eXBlIGBpbmZvYCBvYmplY3QuIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGlmIGdpdmVuIGJ5IGBpbmZvLmlzYC4KICAgKi8KICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvYWQgcG9seW1lci5odG1sIHRvIHVzZSB0aGUgUG9seW1lcigpIGZ1bmN0aW9uLicpOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKICB3aW5kb3cuUG9seW1lci52ZXJzaW9uID0gJzIuNy4wJzsKCiAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAvKgogIFdoZW4gdXNpbmcgQ2xvc3VyZSBDb21waWxlciwgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eShwcm9wZXJ0eSwgb2JqZWN0KSBpcyByZXBsYWNlZCBieSB0aGUgbXVuZ2VkIG5hbWUgZm9yIG9iamVjdFtwcm9wZXJ0eV0KICBXZSBjYW5ub3QgYWxpYXMgdGhpcyBmdW5jdGlvbiwgc28gd2UgaGF2ZSB0byB1c2UgYSBzbWFsbCBzaGltIHRoYXQgaGFzIHRoZSBzYW1lIGJlaGF2aW9yIHdoZW4gbm90IGNvbXBpbGluZy4KICAqLwogIHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgb2JqKSB7CiAgICByZXR1cm4gcHJvcDsKICB9OwogIC8qIGVzbGludC1lbmFibGUgKi8KCn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+CgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBsZXQgQ1NTX1VSTF9SWCA9IC8odXJsXCgpKFteKV0qKShcKSkvZzsKICAgIGxldCBBQlNfVVJMID0gLyheXC8pfCheIyl8KF5bXHctXGRdKjopLzsKICAgIGxldCB3b3JraW5nVVJMOwogICAgbGV0IHJlc29sdmVEb2M7CiAgICAvKioKICAgICAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkwgYWdhaW5zdCB0aGUgcHJvdmlkZWQgYGJhc2VVcmknLgogICAgICogCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBubyByZXNvbHV0aW9uIGZvciBVUkxzIHRoYXQgc3RhcnQKICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICogVVJMIHJlc29sdXRpb24sIHVzZSBgd2luZG93LlVSTGAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVzb2x2ZVVybAogICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBJbnB1dCBVUkwgdG8gcmVzb2x2ZQogICAgICogQHBhcmFtIHs/c3RyaW5nPX0gYmFzZVVSSSBCYXNlIFVSSSB0byByZXNvbHZlIHRoZSBVUkwgYWdhaW5zdAogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBVUkwKICAgICAqLwogICAgZnVuY3Rpb24gcmVzb2x2ZVVybCh1cmwsIGJhc2VVUkkpIHsKICAgICAgaWYgKHVybCAmJiBBQlNfVVJMLnRlc3QodXJsKSkgewogICAgICAgIHJldHVybiB1cmw7CiAgICAgIH0KICAgICAgLy8gTGF6eSBmZWF0dXJlIGRldGVjdGlvbi4KICAgICAgaWYgKHdvcmtpbmdVUkwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHdvcmtpbmdVUkwgPSBmYWxzZTsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgdSA9IG5ldyBVUkwoJ2InLCAnaHR0cDovL2EnKTsKICAgICAgICAgIHUucGF0aG5hbWUgPSAnYyUyMGQnOwogICAgICAgICAgd29ya2luZ1VSTCA9ICh1LmhyZWYgPT09ICdodHRwOi8vYS9jJTIwZCcpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIC8vIHNpbGVudGx5IGZhaWwKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFiYXNlVVJJKSB7CiAgICAgICAgYmFzZVVSSSA9IGRvY3VtZW50LmJhc2VVUkkgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgIH0KICAgICAgaWYgKHdvcmtpbmdVUkwpIHsKICAgICAgICByZXR1cm4gKG5ldyBVUkwodXJsLCBiYXNlVVJJKSkuaHJlZjsKICAgICAgfQogICAgICAvLyBGYWxsYmFjayB0byBjcmVhdGluZyBhbiBhbmNob3IgaW50byBhIGRpc2Nvbm5lY3RlZCBkb2N1bWVudC4KICAgICAgaWYgKCFyZXNvbHZlRG9jKSB7CiAgICAgICAgcmVzb2x2ZURvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgndGVtcCcpOwogICAgICAgIHJlc29sdmVEb2MuYmFzZSA9IHJlc29sdmVEb2MuY3JlYXRlRWxlbWVudCgnYmFzZScpOwogICAgICAgIHJlc29sdmVEb2MuaGVhZC5hcHBlbmRDaGlsZChyZXNvbHZlRG9jLmJhc2UpOwogICAgICAgIHJlc29sdmVEb2MuYW5jaG9yID0gcmVzb2x2ZURvYy5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgcmVzb2x2ZURvYy5ib2R5LmFwcGVuZENoaWxkKHJlc29sdmVEb2MuYW5jaG9yKTsKICAgICAgfQogICAgICByZXNvbHZlRG9jLmJhc2UuaHJlZiA9IGJhc2VVUkk7CiAgICAgIHJlc29sdmVEb2MuYW5jaG9yLmhyZWYgPSB1cmw7CiAgICAgIHJldHVybiByZXNvbHZlRG9jLmFuY2hvci5ocmVmIHx8IHVybDsKCiAgICB9CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhbnkgcmVsYXRpdmUgVVJMJ3MgaW4gdGhlIGdpdmVuIENTUyB0ZXh0IGFnYWluc3QgdGhlIHByb3ZpZGVkCiAgICAgKiBgb3duZXJEb2N1bWVudGAncyBgYmFzZVVSSWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVzb2x2ZVVybAogICAgICogQHBhcmFtIHtzdHJpbmd9IGNzc1RleHQgQ1NTIHRleHQgdG8gcHJvY2VzcwogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gUHJvY2Vzc2VkIENTUyB0ZXh0IHdpdGggcmVzb2x2ZWQgVVJMJ3MKICAgICAqLwogICAgZnVuY3Rpb24gcmVzb2x2ZUNzcyhjc3NUZXh0LCBiYXNlVVJJKSB7CiAgICAgIHJldHVybiBjc3NUZXh0LnJlcGxhY2UoQ1NTX1VSTF9SWCwgZnVuY3Rpb24obSwgcHJlLCB1cmwsIHBvc3QpIHsKICAgICAgICByZXR1cm4gcHJlICsgJ1wnJyArCiAgICAgICAgICByZXNvbHZlVXJsKHVybC5yZXBsYWNlKC9bIiddL2csICcnKSwgYmFzZVVSSSkgKwogICAgICAgICAgJ1wnJyArIHBvc3Q7CiAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHBhdGggZnJvbSBhIGdpdmVuIGB1cmxgLiBUaGUgcGF0aCBpbmNsdWRlcyB0aGUgdHJhaWxpbmcKICAgICAqIGAvYCBmcm9tIHRoZSB1cmwuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVzb2x2ZVVybAogICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBJbnB1dCBVUkwgdG8gdHJhbnNmb3JtCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHJlc29sdmVkIHBhdGgKICAgICAqLwogICAgZnVuY3Rpb24gcGF0aEZyb21VcmwodXJsKSB7CiAgICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKDAsIHVybC5sYXN0SW5kZXhPZignLycpICsgMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIHJlc29sdmluZyByZWxhdGl2ZSBVUkwncy4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJMJ3MuCiAgICAgKi8KICAgIFBvbHltZXIuUmVzb2x2ZVVybCA9IHsKICAgICAgcmVzb2x2ZUNzczogcmVzb2x2ZUNzcywKICAgICAgcmVzb2x2ZVVybDogcmVzb2x2ZVVybCwKICAgICAgcGF0aEZyb21Vcmw6IHBhdGhGcm9tVXJsCiAgICB9OwoKICB9KSgpOwoKPC9zY3JpcHQ+PHNjcmlwdD4KLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsLCBsZWdhY3kgc2V0dGluZ3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuU2V0dGluZ3MgPSBQb2x5bWVyLlNldHRpbmdzIHx8IHt9OwoKICBQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyA9ICEod2luZG93LlNoYWR5RE9NKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPQogICAgQm9vbGVhbighd2luZG93LlNoYWR5Q1NTIHx8IHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3MpOwogIFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlQ3VzdG9tRWxlbWVudHMgPQogICAgISh3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayk7CgoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgKiBgUG9seW1lci5FbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAqIG1ha2UgVVJMJ3MgcmVsYXRpdmUgdG8gYW4gYXBwbGljYXRpb24ncyByb290LiAgRGVmYXVsdHMgdG8gdGhlIG1haW4KICAgKiBkb2N1bWVudCBVUkwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2V0CiAgICogYFBvbHltZXIucm9vdFBhdGhgIHRvIHByb3ZpZGUgYSBzdGFibGUgYXBwbGljYXRpb24gbW91bnQgcGF0aCB3aGVuCiAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGggfHwKICAgIFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsIHJvb3RQYXRoIHByb3BlcnR5IHVzZWQgYnkgYFBvbHltZXIuRWxlbWVudE1peGluYCBhbmQKICAgKiBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnJvb3RQYXRoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIG5ldyByb290IHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0Um9vdFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICBQb2x5bWVyLnJvb3RQYXRoID0gcGF0aDsKICB9OwoKICAvKioKICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4gVGhlIGNhbGxiYWNrIHNpZ25hdHVyZSBpczoKICAgKgogICAqICAgICBQb2x5bWVyID0gewogICAqICAgICAgIHNhbml0aXplRE9NVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBuYW1lLCB0eXBlLCBub2RlKSB7IC4uLiB9CiAgICogICAgIH0KICAgKgogICAqIFdoZXJlOgogICAqCiAgICogYHZhbHVlYCBpcyB0aGUgdmFsdWUgdG8gc2FuaXRpemUuCiAgICogYG5hbWVgIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsIGhyZWYpLgogICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgKiBgbm9kZWAgaXMgdGhlIG5vZGUgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkLgogICAqCiAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGF2YWlsYWJsZSB2aWEgYFBvbHltZXIuc2FuaXRpemVET01WYWx1ZWAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCosc3RyaW5nLHN0cmluZyxOb2RlKToqKXx1bmRlZmluZWR9IG5ld1Nhbml0aXplRE9NVmFsdWUgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGNhbGxiYWNrCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFNhbml0aXplRE9NVmFsdWUgPSBmdW5jdGlvbihuZXdTYW5pdGl6ZURPTVZhbHVlKSB7CiAgICBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUgPSBuZXdTYW5pdGl6ZURPTVZhbHVlOwogIH07CgogIC8qKgogICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZ2VzdHVyZXMgbWFkZSBmcm9tIHRvdWNoIHdpbGwgbm90IGJlIGFibGUgdG8gcHJldmVudCBzY3JvbGxpbmcsIGFsbG93aW5nIGZvciBzbW9vdGhlcgogICAqIHNjcm9sbGluZyBwZXJmb3JtYW5jZS4KICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogIC8qKgogICAqIFNldHMgYHBhc3NpdmVUb3VjaEdlc3R1cmVzYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzIHVzaW5nIFBvbHltZXIgR2VzdHVyZXMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGFzc2l2ZSBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIHRvdWNoIGdlc3R1cmVzIGdsb2JhbGx5CiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFBhc3NpdmVUb3VjaEdlc3R1cmVzID0gZnVuY3Rpb24odXNlUGFzc2l2ZSkgewogICAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IHVzZVBhc3NpdmU7CiAgfTsKCiAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zIHx8CiAgICAgIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MgJiYgd2luZG93LlBvbHltZXJTZXR0aW5ncy5sZWdhY3lPcHRpbWl6YXRpb25zIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBsZWdhY3lPcHRpbWl6YXRpb25zYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzLiBFbmFibGVzCiAgICogb3B0aW1pemF0aW9ucyB3aGVuIG9ubHkgbGVnYWN5IFBvbHltZXIoKSBzdHlsZSBlbGVtZW50cyBhcmUgdXNlZC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtib29sZWFufSB1c2VMZWdhY3lPcHRpbWl6YXRpb25zIGVuYWJsZSBvciBkaXNhYmxlIGxlZ2FjeSBvcHRpbWl6YXRpb25zIGdsb2JhbGx5LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRMZWdhY3lPcHRpbWl6YXRpb25zID0gZnVuY3Rpb24odXNlTGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gdXNlTGVnYWN5T3B0aW1pemF0aW9uczsKICB9Owp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHVuaXF1ZSBnbG9iYWwgaWQgZm9yIGRlZHVwaW5nIG1peGlucy4KICBsZXQgZGVkdXBlSWQgPSAwOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7RnVuY3Rpb259CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBNaXhpbkZ1bmN0aW9uKCl7fQogIC8qKiBAdHlwZSB7KFdlYWtNYXAgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5BcHBsaWNhdGlvbnM7CiAgLyoqIEB0eXBlIHsoT2JqZWN0IHwgdW5kZWZpbmVkKX0gKi8KICBNaXhpbkZ1bmN0aW9uLnByb3RvdHlwZS5fX21peGluU2V0OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogIC8qKgogICAqIFdyYXBzIGFuIEVTNiBjbGFzcyBleHByZXNzaW9uIG1peGluIHN1Y2ggdGhhdCB0aGUgbWl4aW4gaXMgb25seSBhcHBsaWVkCiAgICogaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYXBwbGllZCBpdHMgYmFzZSBhcmd1bWVudC4gQWxzbyBtZW1vaXplcyBtaXhpbgogICAqIGFwcGxpY2F0aW9ucy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHRlbXBsYXRlIFQKICAgKiBAcGFyYW0ge1R9IG1peGluIEVTNiBjbGFzcyBleHByZXNzaW9uIG1peGluIHRvIHdyYXAKICAgKiBAcmV0dXJuIHtUfQogICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAqLwogIFBvbHltZXIuZGVkdXBpbmdNaXhpbiA9IGZ1bmN0aW9uKG1peGluKSB7CiAgICBsZXQgbWl4aW5BcHBsaWNhdGlvbnMgPSAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhtaXhpbikuX19taXhpbkFwcGxpY2F0aW9uczsKICAgIGlmICghbWl4aW5BcHBsaWNhdGlvbnMpIHsKICAgICAgbWl4aW5BcHBsaWNhdGlvbnMgPSBuZXcgV2Vha01hcCgpOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhtaXhpbikuX19taXhpbkFwcGxpY2F0aW9ucyA9IG1peGluQXBwbGljYXRpb25zOwogICAgfQogICAgLy8gbWFpbnRhaW4gYSB1bmlxdWUgaWQgZm9yIGVhY2ggbWl4aW4KICAgIGxldCBtaXhpbkRlZHVwZUlkID0gZGVkdXBlSWQrKzsKICAgIGZ1bmN0aW9uIGRlZHVwaW5nTWl4aW4oYmFzZSkgewogICAgICBsZXQgYmFzZVNldCA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKGJhc2UpLl9fbWl4aW5TZXQ7CiAgICAgIGlmIChiYXNlU2V0ICYmIGJhc2VTZXRbbWl4aW5EZWR1cGVJZF0pIHsKICAgICAgICByZXR1cm4gYmFzZTsKICAgICAgfQogICAgICBsZXQgbWFwID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICAgIGxldCBleHRlbmRlZCA9IG1hcC5nZXQoYmFzZSk7CiAgICAgIGlmICghZXh0ZW5kZWQpIHsKICAgICAgICBleHRlbmRlZCA9IC8qKiBAdHlwZSB7IUZ1bmN0aW9ufSAqLyhtaXhpbikoYmFzZSk7CiAgICAgICAgbWFwLnNldChiYXNlLCBleHRlbmRlZCk7CiAgICAgIH0KICAgICAgLy8gY29weSBpbmhlcml0ZWQgbWl4aW4gc2V0IGZyb20gdGhlIGV4dGVuZGVkIGNsYXNzLCBvciB0aGUgYmFzZSBjbGFzcwogICAgICAvLyBOT1RFOiB3ZSBhdm9pZCB1c2Ugb2YgU2V0IGhlcmUgYmVjYXVzZSBzb21lIGJyb3dzZXIgKElFMTEpCiAgICAgIC8vIGNhbm5vdCBleHRlbmQgYSBiYXNlIFNldCB2aWEgdGhlIGNvbnN0cnVjdG9yLgogICAgICBsZXQgbWl4aW5TZXQgPSBPYmplY3QuY3JlYXRlKC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKGV4dGVuZGVkKS5fX21peGluU2V0IHx8IGJhc2VTZXQgfHwgbnVsbCk7CiAgICAgIG1peGluU2V0W21peGluRGVkdXBlSWRdID0gdHJ1ZTsKICAgICAgLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgPSBtaXhpblNldDsKICAgICAgcmV0dXJuIGV4dGVuZGVkOwogICAgfQoKICAgIHJldHVybiAvKiogQHR5cGUge1R9ICovIChkZWR1cGluZ01peGluKTsKICB9OwogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCn0pKCk7Cgo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBNT0RVTEVfU1RZTEVfTElOS19TRUxFQ1RPUiA9ICdsaW5rW3JlbD1pbXBvcnRdW3R5cGV+PWNzc10nOwogIGNvbnN0IElOQ0xVREVfQVRUUiA9ICdpbmNsdWRlJzsKICBjb25zdCBTSEFEWV9VTlNDT1BFRF9BVFRSID0gJ3NoYWR5LXVuc2NvcGVkJzsKCiAgZnVuY3Rpb24gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKSB7CiAgICBjb25zdCAvKiogUG9seW1lci5Eb21Nb2R1bGUgKi8gUG9seW1lckRvbU1vZHVsZSA9IGN1c3RvbUVsZW1lbnRzLmdldCgnZG9tLW1vZHVsZScpOwogICAgaWYgKCFQb2x5bWVyRG9tTW9kdWxlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIFBvbHltZXJEb21Nb2R1bGUuaW1wb3J0KG1vZHVsZUlkKTsKICB9CgogIGZ1bmN0aW9uIHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYykgewogICAgLy8gTk9URTogcG9seWZpbGwgYWZmb3JkYW5jZS4KICAgIC8vIHVuZGVyIHRoZSBIVE1MSW1wb3J0cyBwb2x5ZmlsbCwgdGhlcmUgd2lsbCBiZSBubyAnYm9keScsCiAgICAvLyBidXQgdGhlIGltcG9ydCBwc2V1ZG8tZG9jIGNhbiBiZSB1c2VkIGRpcmVjdGx5LgogICAgbGV0IGNvbnRhaW5lciA9IGltcG9ydERvYy5ib2R5ID8gaW1wb3J0RG9jLmJvZHkgOiBpbXBvcnREb2M7CiAgICBjb25zdCBpbXBvcnRDc3MgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZUNzcyhjb250YWluZXIudGV4dENvbnRlbnQsCiAgICAgIGltcG9ydERvYy5iYXNlVVJJKTsKICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgIHN0eWxlLnRleHRDb250ZW50ID0gaW1wb3J0Q3NzOwogICAgcmV0dXJuIHN0eWxlOwogIH0KCiAgLyoqIEB0eXBlZGVmIHt7YXNzZXRwYXRoOiBzdHJpbmd9fSAqLwogIGxldCB0ZW1wbGF0ZVdpdGhBc3NldFBhdGg7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgLyoqCiAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb2xsZWN0aW9uIENTUyB0ZXh0IGZyb20gYDx0ZW1wbGF0ZXM+YCwgZXh0ZXJuYWwKICAgKiBzdHlsZXNoZWV0cywgYW5kIGBkb20tbW9kdWxlYHMuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIGNvbGxlY3Rpb24gQ1NTIHRleHQgZnJvbSB2YXJpb3VzIHNvdXJjZXMuCiAgICovCiAgY29uc3QgU3R5bGVHYXRoZXIgPSB7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzIGluIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgYGRvbS1tb2R1bGVgcy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIDxzdHlsZT4gZWxlbWVudHMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgIHN0eWxlc0Zyb21Nb2R1bGVzKG1vZHVsZUlkcykgewogICAgICBjb25zdCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICBmb3IgKGxldCBpPTA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tTW9kdWxlKG1vZHVsZXNbaV0pKTsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIDxzdHlsZT4gZWxlbWVudHMgaW4gYSBnaXZlbiBgZG9tLW1vZHVsZWAuCiAgICAgKiBTdHlsZXMgaW4gYSBgZG9tLW1vZHVsZWAgY2FuIGNvbWUgZWl0aGVyIGZyb20gYDxzdHlsZT5gcyB3aXRoaW4gdGhlCiAgICAgKiBmaXJzdCBgPHRlbXBsYXRlPmAsIG9yIGVsc2UgZnJvbSBvbmUgb3IgbW9yZQogICAgICogYDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPmAgbGlua3Mgb3V0c2lkZSB0aGUgdGVtcGxhdGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcy4KICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgc3R5bGVzRnJvbU1vZHVsZShtb2R1bGVJZCkgewogICAgICBjb25zdCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKCiAgICAgIGlmICghbSkgewogICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGZpbmQgc3R5bGUgZGF0YSBpbiBtb2R1bGUgbmFtZWQnLCBtb2R1bGVJZCk7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CgogICAgICBpZiAobS5fc3R5bGVzID09PSB1bmRlZmluZWQpIHsKICAgICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkpOwogICAgICAgIC8vIGluY2x1ZGUgY3NzIGZyb20gdGhlIGZpcnN0IHRlbXBsYXRlIGluIHRoZSBtb2R1bGUKICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IG0ucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLAogICAgICAgICAgICAvKiogQHR5cGUge3RlbXBsYXRlV2l0aEFzc2V0UGF0aH0gKi8obSkuYXNzZXRwYXRoKSk7CiAgICAgICAgfQoKICAgICAgICBtLl9zdHlsZXMgPSBzdHlsZXM7CiAgICAgIH0KCiAgICAgIHJldHVybiBtLl9zdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgYDxzdHlsZT5gIGVsZW1lbnRzIHdpdGhpbiBhIGdpdmVuIHRlbXBsYXRlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIGJhc2VVUkkgZm9yIHN0eWxlIGNvbnRlbnQKICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIHN0eWxlcwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBzdHlsZXNGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpIHsKICAgICAgaWYgKCF0ZW1wbGF0ZS5fc3R5bGVzKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gaWYgZWxlbWVudCBpcyBhIHRlbXBsYXRlLCBnZXQgY29udGVudCBmcm9tIGl0cyAuY29udGVudAogICAgICAgIGNvbnN0IGUkID0gdGVtcGxhdGUuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZScpOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGUkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgZSA9IGUkW2ldOwogICAgICAgICAgLy8gc3VwcG9ydCBzdHlsZSBzaGFyaW5nIGJ5IGFsbG93aW5nIHN0eWxlcyB0byAiaW5jbHVkZSIKICAgICAgICAgIC8vIG90aGVyIGRvbS1tb2R1bGVzIHRoYXQgY29udGFpbiBzdHlsaW5nCiAgICAgICAgICBsZXQgaW5jbHVkZSA9IGUuZ2V0QXR0cmlidXRlKElOQ0xVREVfQVRUUik7CiAgICAgICAgICBpZiAoaW5jbHVkZSkgewogICAgICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21Nb2R1bGVzKGluY2x1ZGUpLmZpbHRlcihmdW5jdGlvbihpdGVtLCBpbmRleCwgc2VsZikgewogICAgICAgICAgICAgIHJldHVybiBzZWxmLmluZGV4T2YoaXRlbSkgPT09IGluZGV4OwogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYmFzZVVSSSkgewogICAgICAgICAgICBlLnRleHRDb250ZW50ID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoZS50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZXMucHVzaChlKTsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGUuX3N0eWxlcyA9IHN0eWxlczsKICAgICAgfQogICAgICByZXR1cm4gdGVtcGxhdGUuX3N0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzICBmcm9tIHN0eWxlc2hlZXRzIGxvYWRlZCB2aWEgYDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPmAgbGlua3Mgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcy4KICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgIHN0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgcmV0dXJuIG0gPyB0aGlzLl9zdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtKSA6IFtdOwogICAgfSwKCiAgICAvKioKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbW9kdWxlIGRvbS1tb2R1bGUgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPmAgc3R5bGVzCiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBjb250YWluZWQgc3R5bGVzCiAgICAgKi8KICAgIF9zdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGUpIHsKICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgIGNvbnN0IHAkID0gbW9kdWxlLnF1ZXJ5U2VsZWN0b3JBbGwoTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IpOwogICAgICBmb3IgKGxldCBpPTA7IGkgPCBwJC5sZW5ndGg7IGkrKykgewogICAgICAgIGxldCBwID0gcCRbaV07CiAgICAgICAgaWYgKHAuaW1wb3J0KSB7CiAgICAgICAgICBjb25zdCBpbXBvcnREb2MgPSBwLmltcG9ydDsKICAgICAgICAgIGNvbnN0IHVuc2NvcGVkID0gcC5oYXNBdHRyaWJ1dGUoU0hBRFlfVU5TQ09QRURfQVRUUik7CiAgICAgICAgICBpZiAodW5zY29wZWQgJiYgIWltcG9ydERvYy5fdW5zY29wZWRTdHlsZSkgewogICAgICAgICAgICBjb25zdCBzdHlsZSA9IHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYyk7CiAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZShTSEFEWV9VTlNDT1BFRF9BVFRSLCAnJyk7CiAgICAgICAgICAgIGltcG9ydERvYy5fdW5zY29wZWRTdHlsZSA9IHN0eWxlOwogICAgICAgICAgfSBlbHNlIGlmICghaW1wb3J0RG9jLl9zdHlsZSkgewogICAgICAgICAgICBpbXBvcnREb2MuX3N0eWxlID0gc3R5bGVGb3JJbXBvcnQoaW1wb3J0RG9jKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0eWxlcy5wdXNoKHVuc2NvcGVkID8gaW1wb3J0RG9jLl91bnNjb3BlZFN0eWxlIDogaW1wb3J0RG9jLl9zdHlsZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICoKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2Ygc3R5bGVzIGluIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgYGRvbS1tb2R1bGVgcy4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVzRnJvbU1vZHVsZXNgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWRzIExpc3Qgb2YgZG9tLW1vZHVsZSBpZCdzIHdpdGhpbiB3aGljaCB0bwogICAgICogc2VhcmNoIGZvciBjc3MuCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCBgZG9tLW1vZHVsZWBzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBjc3NGcm9tTW9kdWxlcyhtb2R1bGVJZHMpIHsKICAgICAgbGV0IG1vZHVsZXMgPSBtb2R1bGVJZHMudHJpbSgpLnNwbGl0KC9ccysvKTsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNzc1RleHQgKz0gdGhpcy5jc3NGcm9tTW9kdWxlKG1vZHVsZXNbaV0pOwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2Ygc3R5bGVzIGluIGEgZ2l2ZW4gYGRvbS1tb2R1bGVgLiAgQ1NTIGluIGEgYGRvbS1tb2R1bGVgCiAgICAgKiBjYW4gY29tZSBlaXRoZXIgZnJvbSBgPHN0eWxlPmBzIHdpdGhpbiB0aGUgZmlyc3QgYDx0ZW1wbGF0ZT5gLCBvciBlbHNlCiAgICAgKiBmcm9tIG9uZSBvciBtb3JlIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIG91dHNpZGUgdGhlCiAgICAgKiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBBbnkgYDxzdHlsZXM+YCBwcm9jZXNzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbi4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVGcm9tTW9kdWxlYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIGRvbS1tb2R1bGUgaWQgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgY3NzRnJvbU1vZHVsZShtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIGlmIChtICYmIG0uX2Nzc1RleHQgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIG1vZHVsZSBpbXBvcnRzOiA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj4KICAgICAgICBsZXQgY3NzVGV4dCA9IHRoaXMuX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG0pOwogICAgICAgIC8vIGluY2x1ZGUgY3NzIGZyb20gdGhlIGZpcnN0IHRlbXBsYXRlIGluIHRoZSBtb2R1bGUKICAgICAgICBsZXQgdCA9IG0ucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAgICBpZiAodCkgewogICAgICAgICAgY3NzVGV4dCArPSB0aGlzLmNzc0Zyb21UZW1wbGF0ZSh0LAogICAgICAgICAgICAvKiogQHR5cGUge3RlbXBsYXRlV2l0aEFzc2V0UGF0aH0gKi8obSkuYXNzZXRwYXRoKTsKICAgICAgICB9CiAgICAgICAgbS5fY3NzVGV4dCA9IGNzc1RleHQgfHwgbnVsbDsKICAgICAgfQogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICB9CiAgICAgIHJldHVybiBtICYmIG0uX2Nzc1RleHQgfHwgJyc7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBDU1MgdGV4dCBvZiBgPHN0eWxlcz5gIHdpdGhpbiBhIGdpdmVuIHRlbXBsYXRlLgogICAgICoKICAgICAqIEFueSBgPHN0eWxlcz5gIHByb2Nlc3NlZCBhcmUgcmVtb3ZlZCBmcm9tIHRoZWlyIG9yaWdpbmFsIGxvY2F0aW9uLgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZUZyb21UZW1wbGF0ZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gQ29uY2F0ZW5hdGVkIENTUyBjb250ZW50IGZyb20gc3BlY2lmaWVkIHRlbXBsYXRlCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSkgewogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBjb25zdCBlJCA9IHRoaXMuc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKTsKICAgICAgLy8gaWYgZWxlbWVudCBpcyBhIHRlbXBsYXRlLCBnZXQgY29udGVudCBmcm9tIGl0cyAuY29udGVudAogICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgIGxldCBlID0gZSRbaV07CiAgICAgICAgaWYgKGUucGFyZW50Tm9kZSkgewogICAgICAgICAgZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpOwogICAgICAgIH0KICAgICAgICBjc3NUZXh0ICs9IGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBDU1MgdGV4dCBmcm9tIHN0eWxlc2hlZXRzIGxvYWRlZCB2aWEgYDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPmAKICAgICAqIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBJZCBvZiBgZG9tLW1vZHVsZWAgdG8gZ2F0aGVyIENTUyBmcm9tCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIGxpbmtzIGluIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgY3NzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICByZXR1cm4gbSA/IHRoaXMuX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG0pIDogJyc7CiAgICB9LAoKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbW9kdWxlIGRvbS1tb2R1bGUgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPmAgc3R5bGVzCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIGxpbmtzIGluIHRoZSBkb20tbW9kdWxlCiAgICAgKi8KICAgICBfY3NzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGxldCBzdHlsZXMgPSB0aGlzLl9zdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGUpOwogICAgICBmb3IgKGxldCBpPTA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjc3NUZXh0ICs9IHN0eWxlc1tpXS50ZXh0Q29udGVudDsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0KICB9OwoKICBQb2x5bWVyLlN0eWxlR2F0aGVyID0gU3R5bGVHYXRoZXI7Cn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+CihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtb2R1bGVzID0ge307CiAgbGV0IGxjTW9kdWxlcyA9IHt9OwogIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAvLyBzdG9yZSBpZCBzZXBhcmF0ZSBmcm9tIGxvd2VyY2FzZWQgaWQgc28gdGhhdAogICAgLy8gaW4gYWxsIGNhc2VzIG1peGVkQ2FzZSBpZCB3aWxsIHN0b3JlZCBkaXN0aW5jdGx5CiAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgbW9kdWxlc1tpZF0gPSBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV0gPSBtb2R1bGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRNb2R1bGUoaWQpIHsKICAgIHJldHVybiBtb2R1bGVzW2lkXSB8fCBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV07CiAgfQoKICBmdW5jdGlvbiBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKGluc3QpIHsKICAgIGlmIChpbnN0LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpIHsKICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgYGRvbS1tb2R1bGVgIGVsZW1lbnQgcmVnaXN0ZXJzIHRoZSBkb20gaXQgY29udGFpbnMgdG8gdGhlIG5hbWUgZ2l2ZW4KICAgKiBieSB0aGUgbW9kdWxlJ3MgaWQgYXR0cmlidXRlLiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgZGF0YWJhc2Ugb2YgZG9tCiAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICoKICAgKiBBIGtleSB1c2UgY2FzZSBvZiBgZG9tLW1vZHVsZWAgaXMgZm9yIHByb3ZpZGluZyBjdXN0b20gZWxlbWVudCBgPHRlbXBsYXRlPmBzCiAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgKiByZWxvY2F0ZWQgZHVyaW5nIGEgYnVuZGxpbmcgcGFzcyBhbmQgc3RpbGwgbG9va2VkIHVwIGJ5IGBpZGAuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIDxkb20tbW9kdWxlIGlkPSJmb28iPgogICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAqICAgICA8L2RvbS1tb2R1bGU+CiAgICoKICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgKgogICAqICAgICBsZXQgaW1nID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJykuaW1wb3J0KCdmb28nLCAnaW1nJyk7CiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgb2YgcmVsb2NhdGFibGUgRE9NIGNvbnRlbnQKICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydpZCddOyB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBjc3MgYHNlbGVjdG9yYCBpbiB0aGUgbW9kdWxlCiAgICAgKiByZWdpc3RlcmVkIGJ5IGBpZGAuIEZvciBleGFtcGxlLCB0aGlzLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yIFRoZSBjc3Mgc2VsZWN0b3IgYnkgd2hpY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIGVsZW1lbnQgd2hpY2ggbWF0Y2hlcyBgc2VsZWN0b3JgIGluIHRoZQogICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICovCiAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICBpZiAoaWQpIHsKICAgICAgICBsZXQgbSA9IGZpbmRNb2R1bGUoaWQpOwogICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgdGhpcy5yZWdpc3RlcigpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1hcmdzICovCgogICAgLyoqCiAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIHdpbGwgZGlmZmVyIGZyb20gdGhpcyBlbGVtZW50J3MgYG93bmVyRG9jdW1lbnRgIGluIHRoZQogICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgKiAtIFRha2VzIGludG8gYWNjb3VudCBhbnkgYGFzc2V0cGF0aGAgYXR0cmlidXRlIGFkZGVkIGR1cmluZyBidW5kbGluZwogICAgICogICB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYWwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZWQgbG9jYXRpb24KICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICogICB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IGRvY3VtZW50J3MgbG9jYXRpb24gc2luY2UKICAgICAqICAgYG93bmVyRG9jdW1lbnRgIGlzIG5vdCBjdXJyZW50bHkgcG9seWZpbGxlZAogICAgICovCiAgICBnZXQgYXNzZXRwYXRoKCkgewogICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBhc3NldHBhdGguCiAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgIC8vIG5vdGU6IGFzc2V0cGF0aCBzZXQgdmlhIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMKICAgICAgICAvLyBlbGVtZW50J3MgbG9jYXRpb247IGFjY29tb2RhdGUgcG9seWZpbGxlZCBIVE1MSW1wb3J0cwogICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgSFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKSB8fCBkb2N1bWVudCA6IHRoaXMub3duZXJEb2N1bWVudDsKICAgICAgICBjb25zdCB1cmwgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCgKICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhc3NldHBhdGgnKSB8fCAnJywgb3duZXIuYmFzZVVSSSk7CiAgICAgICAgdGhpcy5fX2Fzc2V0cGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybCh1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9fYXNzZXRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoZSBkb20tbW9kdWxlIGF0IGEgZ2l2ZW4gaWQuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICogZXhhbXBsZSwgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKS5yZWdpc3RlcignZm9vJylgLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBpZCBUaGUgaWQgYXQgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGRvbS1tb2R1bGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZWdpc3RlcihpZCkgewogICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgIGlmIChpZCkgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZWplY3QgYW5kIG51bGwgb3V0IGFueSByZS1yZWdpc3RlcmVkCiAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQgCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgZmluZE1vZHVsZShpZCkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc2V0TW9kdWxlKGlkLCBudWxsKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBEb21Nb2R1bGUucHJvdG90eXBlWydtb2R1bGVzJ10gPSBtb2R1bGVzOwoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21Nb2R1bGUgPSBEb21Nb2R1bGU7Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBtYW5pcHVsYXRpbmcgc3RydWN0dXJlZCBkYXRhIHBhdGggc3RyaW5ncy4KICAgKi8KICBjb25zdCBQYXRoID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNQYXRoKCdmb28uYmFyLmJheicpIC8vIHRydWUKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBzdHJpbmcgY29udGFpbmVkIG9uZSBvciBtb3JlIGRvdHMKICAgICAqLwogICAgaXNQYXRoOiBmdW5jdGlvbihwYXRoKSB7CiAgICAgIHJldHVybiBwYXRoLmluZGV4T2YoJy4nKSA+PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3QgcHJvcGVydHkgbmFtZSBmb3IgdGhlIGdpdmVuIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28uYmFyLmJheicpIC8vICdmb28nCiAgICAgKiBQb2x5bWVyLlBhdGgucm9vdCgnZm9vJykgICAgICAgICAvLyAnZm9vJwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge3N0cmluZ30gUm9vdCBwcm9wZXJ0eSBuYW1lCiAgICAgKi8KICAgIHJvb3Q6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgbGV0IGRvdEluZGV4ID0gcGF0aC5pbmRleE9mKCcuJyk7CiAgICAgIGlmIChkb3RJbmRleCA9PT0gLTEpIHsKICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgfQogICAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBkb3RJbmRleCk7CiAgICB9LAoKICAgIC8qKgogICAgICogR2l2ZW4gYGJhc2VgIGlzIGBmb28uYmFyYCwgYGZvb2AgaXMgYW4gYW5jZXN0b3IsIGBmb28uYmFyYCBpcyBub3QKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgYmFzZSBwYXRoLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNBbmNlc3RvcignZm9vLmJhcicsICdmb28nKSAgICAgICAgIC8vIHRydWUKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2Zvby5iYXInKSAgICAgLy8gZmFsc2UKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhbiBhbmNlc3RvciBvZiBgYmFzZWAuCiAgICAgKi8KICAgIGlzQW5jZXN0b3I6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIGJhc2Uuc3RhcnRzV2l0aChwYXRoICsgJy4nKTsKICAgICAgcmV0dXJuIGJhc2UuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vLmJhci5iYXpgIGlzIGFuIGRlc2NlbmRhbnQKICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyLmJheicpIC8vIHRydWUKICAgICAqIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28nKSAgICAgICAgIC8vIGZhbHNlCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZSBQYXRoIHN0cmluZyB0byB0ZXN0IGFnYWluc3QuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZyB0byB0ZXN0LgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgYSBkZXNjZW5kYW50IG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNEZXNjZW5kYW50OiBmdW5jdGlvbihiYXNlLCBwYXRoKSB7CiAgICAgIC8vICAgICBwYXRoLnN0YXJ0c1dpdGgoYmFzZSArICcuJyk7CiAgICAgIHJldHVybiBwYXRoLmluZGV4T2YoYmFzZSArICcuJykgPT09IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmVwbGFjZXMgYSBwcmV2aW91cyBiYXNlIHBhdGggd2l0aCBhIG5ldyBiYXNlIHBhdGgsIHByZXNlcnZpbmcgdGhlCiAgICAgKiByZW1haW5kZXIgb2YgdGhlIHBhdGguCiAgICAgKgogICAgICogVXNlciBtdXN0IGVuc3VyZSBgcGF0aGAgaGFzIGEgcHJlZml4IG9mIGBiYXNlYC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnRyYW5zbGF0ZSgnZm9vLmJhcicsICd6b3QnLCAnZm9vLmJhci5iYXonKSAvLyAnem90LmJheicKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIEN1cnJlbnQgYmFzZSBzdHJpbmcgdG8gcmVtb3ZlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3QmFzZSBOZXcgYmFzZSBzdHJpbmcgdG8gcmVwbGFjZSB3aXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHRvIHRyYW5zbGF0ZQogICAgICogQHJldHVybiB7c3RyaW5nfSBUcmFuc2xhdGVkIHN0cmluZwogICAgICovCiAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uKGJhc2UsIG5ld0Jhc2UsIHBhdGgpIHsKICAgICAgcmV0dXJuIG5ld0Jhc2UgKyBwYXRoLnNsaWNlKGJhc2UubGVuZ3RoKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZSBQYXRoIHN0cmluZyB0byB0ZXN0IGFnYWluc3QKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGVxdWFsIHRvIGBiYXNlYAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIG1hdGNoZXM6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgcmV0dXJuIChiYXNlID09PSBwYXRoKSB8fAogICAgICAgICAgICAgdGhpcy5pc0FuY2VzdG9yKGJhc2UsIHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzRGVzY2VuZGFudChiYXNlLCBwYXRoKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhcnJheS1iYXNlZCBwYXRocyB0byBmbGF0dGVuZWQgcGF0aC4gIFN0cmluZy1iYXNlZCBwYXRocwogICAgICogYXJlIHJldHVybmVkIGFzLWlzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKFsnZm9vLmJhcicsIDAsICdiYXonXSkgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogUG9seW1lci5QYXRoLm5vcm1hbGl6ZSgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyAnZm9vLmJhci4wLmJheicKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIElucHV0IHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZ30gRmxhdHRlbmVkIHBhdGgKICAgICAqLwogICAgbm9ybWFsaXplOiBmdW5jdGlvbihwYXRoKSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSB7CiAgICAgICAgbGV0IHBhcnRzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBhcmdzID0gcGF0aFtpXS50b1N0cmluZygpLnNwbGl0KCcuJyk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8YXJncy5sZW5ndGg7IGorKykgewogICAgICAgICAgICBwYXJ0cy5wdXNoKGFyZ3Nbal0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFydHMuam9pbignLicpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogU3BsaXRzIGEgcGF0aCBpbnRvIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLiBBY2NlcHRzIGVpdGhlciBhcnJheXMKICAgICAqIG9mIHBhdGggcGFydHMgb3Igc3RyaW5ncy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnNwbGl0KFsnZm9vLmJhcicsIDAsICdiYXonXSkgIC8vIFsnZm9vJywgJ2JhcicsICcwJywgJ2JheiddCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoJ2Zvby5iYXIuMC5iYXonKSAgICAgICAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIElucHV0IHBhdGgKICAgICAqIEByZXR1cm4geyFBcnJheTxzdHJpbmc+fSBBcnJheSBvZiBwYXRoIHBhcnRzCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlc30KICAgICAqLwogICAgc3BsaXQ6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUocGF0aCkuc3BsaXQoJy4nKTsKICAgICAgfQogICAgICByZXR1cm4gcGF0aC50b1N0cmluZygpLnNwbGl0KCcuJyk7CiAgICB9LAoKICAgIC8qKgogICAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgICh3aWxsIG5ldmVyIHRocm93LgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byByZWFkCiAgICAgKiBAcGFyYW0ge09iamVjdD19IGluZm8gSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIHRvIGBpbmZvYCwgdGhlIG5vcm1hbGl6ZWQKICAgICAqICAoZmxhdHRlbmVkKSBwYXRoIHdpbGwgYmUgc2V0IHRvIGBpbmZvLnBhdGhgLgogICAgICogQHJldHVybiB7Kn0gVmFsdWUgYXQgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHBhdGggY291bGQgbm90IGJlCiAgICAgKiAgZnVsbHkgZGVyZWZlcmVuY2VkLgogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIGdldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgaW5mbykgewogICAgICBsZXQgcHJvcCA9IHJvb3Q7CiAgICAgIGxldCBwYXJ0cyA9IHRoaXMuc3BsaXQocGF0aCk7CiAgICAgIC8vIExvb3Agb3ZlciBwYXRoIHBhcnRzWzAuLm4tMV0gYW5kIGRlcmVmZXJlbmNlCiAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICghcHJvcCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgIHByb3AgPSBwcm9wW3BhcnRdOwogICAgICB9CiAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgaW5mby5wYXRoID0gcGFydHMuam9pbignLicpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9wOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgYSB2YWx1ZSB0byBhIHBhdGguICBJZiBhbnkgc3ViLXByb3BlcnR5IGluIHRoZSBwYXRoIGlzIGB1bmRlZmluZWRgLAogICAgICogdGhpcyBtZXRob2Qgd2lsbCBuby1vcC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge09iamVjdH0gcm9vdCBPYmplY3QgZnJvbSB3aGljaCB0byBkZXJlZmVyZW5jZSBwYXRoIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gc2V0CiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCB0byBwYXRoCiAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIGlucHV0IHBhdGgKICAgICAqIEB0aGlzIHtQYXRofQogICAgICovCiAgICBzZXQ6IGZ1bmN0aW9uKHJvb3QsIHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgbGV0IGxhc3QgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07CiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CiAgICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0yXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGFydHMubGVuZ3RoLTE7IGkrKykgewogICAgICAgICAgbGV0IHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgICAgIHByb3AgPSBwcm9wW3BhcnRdOwogICAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gU2V0IHZhbHVlIHRvIG9iamVjdCBhdCBlbmQgb2YgcGF0aAogICAgICAgIHByb3BbbGFzdF0gPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBTaW1wbGUgcHJvcGVydHkgc2V0CiAgICAgICAgcHJvcFtwYXRoXSA9IHZhbHVlOwogICAgICB9CiAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICB9CgogIH07CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgc3RydWN0dXJlZCBkYXRhIHBhdGggKGhhcyBkb3RzKS4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gIFVzZSBgUG9seW1lci5QYXRoLmlzUGF0aGAgaW5zdGVhZC4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGAKICAgKiBQb2x5bWVyLlBhdGguaXNEZWVwKCdmb28uYmFyLmJheicpIC8vIHRydWUKICAgKiBQb2x5bWVyLlBhdGguaXNEZWVwKCdmb28nKSAgICAgICAgIC8vIGZhbHNlCiAgICogYGBgCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAqLwogIFBhdGguaXNEZWVwID0gUGF0aC5pc1BhdGg7CgogIFBvbHltZXIuUGF0aCA9IFBhdGg7Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBjYXNlTWFwID0ge307CiAgY29uc3QgREFTSF9UT19DQU1FTCA9IC8tW2Etel0vZzsKICBjb25zdCBDQU1FTF9UT19EQVNIID0gLyhbQS1aXSkvZzsKCiAgLyoqCiAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gImRhc2gtY2FzZSIgYW5kICJjYW1lbENhc2UiCiAgICogaWRlbnRpZmllcnMuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiAiZGFzaC1jYXNlIgogICAqICAgYW5kICJjYW1lbENhc2UiLgogICAqLwogIGNvbnN0IENhc2VNYXAgPSB7CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyAiZGFzaC1jYXNlIiBpZGVudGlmaWVyIChlLmcuIGBmb28tYmFyLWJhemApIHRvICJjYW1lbENhc2UiCiAgICAgKiAoZS5nLiBgZm9vQmFyQmF6YCkuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuQ2FzZU1hcAogICAgICogQHBhcmFtIHtzdHJpbmd9IGRhc2ggRGFzaC1jYXNlIGlkZW50aWZpZXIKICAgICAqIEByZXR1cm4ge3N0cmluZ30gQ2FtZWwtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBkYXNoVG9DYW1lbENhc2UoZGFzaCkgewogICAgICByZXR1cm4gY2FzZU1hcFtkYXNoXSB8fCAoCiAgICAgICAgY2FzZU1hcFtkYXNoXSA9IGRhc2guaW5kZXhPZignLScpIDwgMCA/IGRhc2ggOiBkYXNoLnJlcGxhY2UoREFTSF9UT19DQU1FTCwKICAgICAgICAgIChtKSA9PiBtWzFdLnRvVXBwZXJDYXNlKCkKICAgICAgICApCiAgICAgICk7CiAgICB9LAoKICAgIC8qKgogICAgICogQ29udmVydHMgImNhbWVsQ2FzZSIgaWRlbnRpZmllciAoZS5nLiBgZm9vQmFyQmF6YCkgdG8gImRhc2gtY2FzZSIKICAgICAqIChlLmcuIGBmb28tYmFyLWJhemApLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkNhc2VNYXAKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjYW1lbCBDYW1lbC1jYXNlIGlkZW50aWZpZXIKICAgICAqIEByZXR1cm4ge3N0cmluZ30gRGFzaC1jYXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpZGVudGlmaWVyCiAgICAgKi8KICAgIGNhbWVsVG9EYXNoQ2FzZShjYW1lbCkgewogICAgICByZXR1cm4gY2FzZU1hcFtjYW1lbF0gfHwgKAogICAgICAgIGNhc2VNYXBbY2FtZWxdID0gY2FtZWwucmVwbGFjZShDQU1FTF9UT19EQVNILCAnLSQxJykudG9Mb3dlckNhc2UoKQogICAgICApOwogICAgfQoKICB9OwoKICBQb2x5bWVyLkNhc2VNYXAgPSBDYXNlTWFwOwp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyCiAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogIGxldCBtaWNyb3Rhc2tMYXN0SGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107CiAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICBsZXQgbWljcm90YXNrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsKCiAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07CiAgICAgIGlmIChjYikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTsKICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91cwogICAqIHRhc2tzLiAgRWFjaCBzdWItbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgYHJ1bihmbilgIGludGVyZmFjZSB0aGF0IHJldHVybnMgYQogICAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmUKICAgKiB0aGV5IHJ1bi4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4KICAgKi8KICBQb2x5bWVyLkFzeW5jID0gewoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqLwogICAgdGltZU91dDogewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzIGluIG1zCiAgICAgICAqIEByZXR1cm4geyFBc3luY0ludGVyZmFjZX0gQW4gYXN5bmMgdGltZW91dCBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGFmdGVyKGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJ1bihmbikgeyByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsgfSwKICAgICAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgbmV4dCB0YXNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtaWxsaXNlY29uZHMKICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbiwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGB0aW1lT3V0YCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICBhbmltYXRpb25GcmFtZTogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4pIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4gIEZhbGxzIGJhY2sgdG8KICAgICAqIGBzZXRUaW1lb3V0YCBvbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqLwogICAgaWRsZVBlcmlvZDogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5pZGxlUGVyaW9kCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOgogICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IG1pY3JvdGFzayB0aW1pbmcgaXMgYWNoaWV2ZWQgdmlhIGEgc2luZ2xlIGBNdXRhdGlvbk9ic2VydmVyYCwKICAgICAqIGFuZCB0aHVzIGNhbGxiYWNrcyBlbnF1ZXVlZCB3aXRoIHRoaXMgQVBJIHdpbGwgYWxsIHJ1biBpbiBhIHNpbmdsZQogICAgICogYmF0Y2gsIGFuZCBub3QgaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBtaWNyb3Rhc2tzIHN1Y2ggYXMgcHJvbWlzZXMuCiAgICAgKiBQcm9taXNlcyBhcmUgYXZvaWRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAgKiBkdWUgdG8gU2FmYXJpIGJ1Z3MgdGhhdCBjYXVzZSBQcm9taXNlcyB0byBsYWNrIG1pY3JvdGFzayBndWFyYW50ZWVzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgbWljcm9UYXNrOiB7CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9uPX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oY2FsbGJhY2spIHsKICAgICAgICBtaWNyb3Rhc2tOb2RlLnRleHRDb250ZW50ID0gbWljcm90YXNrTm9kZUNvbnRlbnQrKzsKICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIG1pY3JvdGFza0N1cnJIYW5kbGUrKzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgbWljcm9UYXNrYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfQogIH07Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgogIChmdW5jdGlvbiAoKSB7CgogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKiBAY29uc3QgeyFBc3luY0ludGVyZmFjZX0gKi8KICAgIGNvbnN0IG1pY3JvdGFzayA9IFBvbHltZXIuQXN5bmMubWljcm9UYXNrOwoKICAgIC8qKgogICAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAgICogb3IgbW9yZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgKGdldHRlci9zZXR0ZXIgcGFpcikgdGhhdCBlbnF1ZXVlIGFuIGFzeW5jCiAgICAgKiAoYmF0Y2hlZCkgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgKgogICAgICogRm9yIGJhc2ljIHVzYWdlIG9mIHRoaXMgbWl4aW4sIGNhbGwgYE15Q2xhc3MuY3JlYXRlUHJvcGVydGllcyhwcm9wcylgCiAgICAgKiBvbmNlIGF0IGNsYXNzIGRlZmluaXRpb24gdGltZSB0byBjcmVhdGUgcHJvcGVydHkgYWNjZXNzb3JzIGZvciBwcm9wZXJ0aWVzCiAgICAgKiBuYW1lZCBpbiBwcm9wcywgaW1wbGVtZW50IGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHJlYWN0IGFzIGRlc2lyZWQgdG8KICAgICAqIHByb3BlcnR5IGNoYW5nZXMsIGFuZCBpbXBsZW1lbnQgYHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKClgIGFuZAogICAgICogaW5jbHVkZSBsb3dlcmNhc2UgdmVyc2lvbnMgb2YgYW55IHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNldCBmcm9tCiAgICAgKiBhdHRyaWJ1dGVzLiBMYXN0LCBjYWxsIGB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKClgIGluIHRoZSBlbGVtZW50J3MKICAgICAqIGBjb25uZWN0ZWRDYWxsYmFja2AgdG8gZW5hYmxlIHRoZSBhY2Nlc3NvcnMuCiAgICAgKgogICAgICogQG1peGluRnVuY3Rpb24KICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICAgKiAgIGdlbmVyYXRlZCBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgKi8KICAgIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgICAvKioKICAgICAgICogQHBvbHltZXIKICAgICAgICogQG1peGluQ2xhc3MKICAgICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNDaGFuZ2VkfQogICAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgICAqLwogICAgICBjbGFzcyBQcm9wZXJ0aWVzQ2hhbmdlZCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IG5hbWVzLgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gcHJvcHMgT2JqZWN0IHdob3NlIGtleXMgYXJlIG5hbWVzIG9mIGFjY2Vzc29ycy4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgICAgY29uc3QgcHJvdG8gPSB0aGlzLnByb3RvdHlwZTsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgICAgLy8gZG9uJ3Qgc3RvbXAgYW4gZXhpc3RpbmcgYWNjZXNzb3IKICAgICAgICAgICAgaWYgKCEocHJvcCBpbiBwcm90bykpIHsKICAgICAgICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhbiBhdHRyaWJ1dGUgbmFtZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKiBUaGUgYXR0cmlidXRlIG5hbWUgaXMgdGhlIGxvd2VyY2FzZWQgcHJvcGVydHkgbmFtZS4gT3ZlcnJpZGUgdG8KICAgICAgICAgKiBjdXN0b21pemUgdGhpcyBtYXBwaW5nLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBjb252ZXJ0CiAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBBdHRyaWJ1dGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgICByZXR1cm4gcHJvcGVydHkudG9Mb3dlckNhc2UoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlIHBvaW50IHRvIHByb3ZpZGUgYSB0eXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGEgdmFsdWUgdG8KICAgICAgICAgKiBhIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgcHJvcGVydHkKICAgICAgICAgKgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsgfSAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHNldHRlci9nZXR0ZXIgcGFpciBmb3IgdGhlIG5hbWVkIHByb3BlcnR5IHdpdGggaXRzIG93bgogICAgICAgICAqIGxvY2FsIHN0b3JhZ2UuICBUaGUgZ2V0dGVyIHJldHVybnMgdGhlIHZhbHVlIGluIHRoZSBsb2NhbCBzdG9yYWdlLAogICAgICAgICAqIGFuZCB0aGUgc2V0dGVyIGNhbGxzIGBfc2V0UHJvcGVydHlgLCB3aGljaCB1cGRhdGVzIHRoZSBsb2NhbCBzdG9yYWdlCiAgICAgICAgICogZm9yIHRoZSBwcm9wZXJ0eSBhbmQgZW5xdWV1ZXMgYSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgb24gYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuICBDYWxsaW5nCiAgICAgICAgICogdGhpcyBtZXRob2QgbWF5IG92ZXJ3cml0ZSBhIHByb3BlcnR5IHZhbHVlIHRoYXQgYWxyZWFkeSBleGlzdHMgb24KICAgICAgICAgKiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGJ5IGNyZWF0aW5nIHRoZSBhY2Nlc3Nvci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQ7IHRoZQogICAgICAgICAqICAgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBzZXQgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IocHJvcGVydHksIHJlYWRPbmx5KSB7CiAgICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKHByb3BlcnR5KTsKICAgICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19kYXRhSGFzQWNjZXNzb3InKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyB0aGUgZ2l2ZW4gYHByb3BlcnR5YCB0byBhIG1hcCBtYXRjaGluZyBhdHRyaWJ1dGUgbmFtZXMKICAgICAgICAgKiB0byBwcm9wZXJ0eSBuYW1lcywgdXNpbmcgYGF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eWAuIFRoaXMgbWFwIGlzCiAgICAgICAgICogdXNlZCB3aGVuIGRlc2VyaWFsaXppbmcgYXR0cmlidXRlIHZhbHVlcyB0byBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICovCiAgICAgICAgX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpIHsKICAgICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19kYXRhQXR0cmlidXRlcycpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhQXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX19kYXRhQXR0cmlidXRlcyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhQXR0cmlidXRlc1twcm9wZXJ0eV0pIHsKICAgICAgICAgICAgY29uc3QgYXR0ciA9IHRoaXMuY29uc3RydWN0b3IuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW2F0dHJdID0gcHJvcGVydHk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGEgcHJvcGVydHkgYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICAgX2RlZmluZVByb3BlcnR5QWNjZXNzb3IocHJvcGVydHksIHJlYWRPbmx5KSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHksIHsKICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi8KICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8qKiBAdGhpcyB7UHJvcGVydGllc0NoYW5nZWR9ICovCiAgICAgICAgICAgIHNldDogcmVhZE9ubHkgPyBmdW5jdGlvbiAoKSB7fSA6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqLwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX19kYXRhSW52YWxpZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGEgPSB7fTsKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSBudWxsOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHByb3BlcnRpZXMgYXJlIGVuYWJsZWQgdmlhCiAgICAgICAgICogYF9lbmFibGVQcm9wZXJ0aWVzYC4KICAgICAgICAgKgogICAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBiZWhhdmlvciB0aGF0IGlzCiAgICAgICAgICogZGVwZW5kZW50IG9uIHRoZSBlbGVtZW50IGhhdmluZyBpdHMgcHJvcGVydHkgZGF0YSBpbml0aWFsaXplZCwgZS5nLgogICAgICAgICAqIGZyb20gZGVmYXVsdHMgKGluaXRpYWxpemVkIGZyb20gYGNvbnN0cnVjdG9yYCwgYF9pbml0aWFsaXplUHJvcGVydGllc2ApLAogICAgICAgICAqIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLCBvciB2YWx1ZXMgcHJvcGFnYXRlZCBmcm9tIGhvc3QgZS5nLiB2aWEKICAgICAgICAgKiBiaW5kaW5ncy4gIGBzdXBlci5yZWFkeSgpYCBtdXN0IGJlIGNhbGxlZCB0byBlbnN1cmUgdGhlIGRhdGEgc3lzdGVtCiAgICAgICAgICogYmVjb21lcyBlbmFibGVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHVibGljCiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVJlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICAgKgogICAgICAgICAqIFByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlIHBvaW50IGZvciBwZXJmb3JtaW5nIGFueSBzZXR1cCB3b3JrIHByaW9yCiAgICAgICAgICogdG8gaW5pdGlhbGl6aW5nIHRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBzeXN0ZW0uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICAvLyBDYXB0dXJlIGluc3RhbmNlIHByb3BlcnRpZXM7IHRoZXNlIHdpbGwgYmUgc2V0IGludG8gYWNjZXNzb3JzCiAgICAgICAgICAvLyBkdXJpbmcgZmlyc3QgZmx1c2guIERvbid0IHNldCB0aGVtIGhlcmUsIHNpbmNlIHdlIHdhbnQKICAgICAgICAgIC8vIHRoZXNlIHRvIG92ZXJ3cml0ZSBkZWZhdWx0cy9jb25zdHJ1Y3RvciBhc3NpZ25tZW50cwogICAgICAgICAgZm9yIChsZXQgcCBpbiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzID0gdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzIHx8IHt9OwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wc1twXSA9IHRoaXNbcF07CiAgICAgICAgICAgICAgZGVsZXRlIHRoaXNbcF07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBhdCByZWFkeSB0aW1lIHdpdGggYmFnIG9mIGluc3RhbmNlIHByb3BlcnRpZXMgdGhhdCBvdmVyd3JvdGUKICAgICAgICAgKiBhY2Nlc3NvcnMgd2hlbiB0aGUgZWxlbWVudCB1cGdyYWRlZC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNldHMgdGhlc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlCiAgICAgICAgICogc2V0dGVyIGF0IHJlYWR5IHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgICAqIHBvaW50IGZvciBjdXN0b21pemluZyBvciBwcm92aWRpbmcgbW9yZSBlZmZpY2llbnQgaW5pdGlhbGl6YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICAgKiAgIHdoZW4gY3JlYXRpbmcgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHByb3BzKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHkgKHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWApCiAgICAgICAgICogYW5kIGVucXVldWVzIGEgYF9wcm9lcHJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpIHsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKSkgewogICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2dldFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgIH0KCiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBsb2NhbCBzdG9yYWdlIGZvciBhIHByb3BlcnR5LCByZWNvcmRzIHRoZSBwcmV2aW91cyB2YWx1ZSwKICAgICAgICAgKiBhbmQgYWRkcyBpdCB0byB0aGUgc2V0IG9mICJwZW5kaW5nIGNoYW5nZXMiIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suICBUaGlzIG1ldGhvZCBkb2VzIG5vdCBlbnF1ZXVlIHRoZQogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBleHQgTm90IHVzZWQgaGVyZTsgYWZmb3JkYW5jZSBmb3IgY2xvc3VyZQogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgY2hhbmdlZAogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgZXh0KSB7CiAgICAgICAgICBsZXQgb2xkID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgbGV0IGNoYW5nZWQgPSB0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCk7CiAgICAgICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHt9OwogICAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRW5zdXJlIG9sZCBpcyBjYXB0dXJlZCBmcm9tIHRoZSBsYXN0IHR1cm4KICAgICAgICAgICAgaWYgKHRoaXMuX19kYXRhT2xkICYmICEocHJvcGVydHkgaW4gdGhpcy5fX2RhdGFPbGQpKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gb2xkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX19kYXRhW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY2hhbmdlZDsKICAgICAgICB9CiAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBNYXJrcyB0aGUgcHJvcGVydGllcyBhcyBpbnZhbGlkLCBhbmQgZW5xdWV1ZXMgYW4gYXN5bmMKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbnZhbGlkYXRlUHJvcGVydGllcygpIHsKICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFJbnZhbGlkICYmIHRoaXMuX19kYXRhUmVhZHkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgbWljcm90YXNrLnJ1bigoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuX19kYXRhSW52YWxpZCkgewogICAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbCB0byBlbmFibGUgcHJvcGVydHkgYWNjZXNzb3IgcHJvY2Vzc2luZy4gQmVmb3JlIHRoaXMgbWV0aG9kIGlzCiAgICAgICAgICogY2FsbGVkIGFjY2Vzc29yIHZhbHVlcyB3aWxsIGJlIHNldCBidXQgc2lkZSBlZmZlY3RzIGFyZQogICAgICAgICAqIHF1ZXVlZC4gV2hlbiBjYWxsZWQsIGFueSBwZW5kaW5nIHNpZGUgZWZmZWN0cyBvY2N1ciBpbW1lZGlhdGVseS4KICAgICAgICAgKiBGb3IgZWxlbWVudHMsIGdlbmVyYWxseSBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGEgbm9ybWFsIHNwb3QgdG8gZG8gc28uCiAgICAgICAgICogSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzIGFzIGl0IG9ubHkgdHVybnMgb24KICAgICAgICAgKiBwcm9wZXJ0eSBhY2Nlc3NvcnMgb25jZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9lbmFibGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFFbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcykgewogICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXModGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKTsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucmVhZHkoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxzIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjayB3aXRoIHRoZSBjdXJyZW50IHNldCBvZgogICAgICAgICAqIHBlbmRpbmcgY2hhbmdlcyAoYW5kIG9sZCB2YWx1ZXMgcmVjb3JkZWQgd2hlbiBwZW5kaW5nIGNoYW5nZXMgd2VyZQogICAgICAgICAqIHNldCksIGFuZCByZXNldHMgdGhlIHBlbmRpbmcgc2V0IG9mIGNoYW5nZXMuIEdlbmVyYWxseSwgdGhpcyBtZXRob2QKICAgICAgICAgKiBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiB1c2VyIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZmx1c2hQcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9fZGF0YTsKICAgICAgICAgIGNvbnN0IGNoYW5nZWRQcm9wcyA9IHRoaXMuX19kYXRhUGVuZGluZzsKICAgICAgICAgIGNvbnN0IG9sZCA9IHRoaXMuX19kYXRhT2xkOwogICAgICAgICAgaWYgKHRoaXMuX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNDaGFuZ2VkKHByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgaW4gYF9mbHVzaFByb3BlcnRpZXNgIHRvIGRldGVybWluZSBpZiBgX3Byb3BlcnRpZXNDaGFuZ2VkYAogICAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBpZgogICAgICAgICAqIHByb3BlcnRpZXMgYXJlIHBlbmRpbmcuIE92ZXJyaWRlIHRvIGN1c3RvbWl6ZSB3aGVuCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaXMgY2FsbGVkLgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgY2hhbmdlZFByb3BzIGlzIHRydXRoeQogICAgICAgICAqLwogICAgICAgIF9zaG91bGRQcm9wZXJ0aWVzQ2hhbmdlKGN1cnJlbnRQcm9wcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgICByZXR1cm4gQm9vbGVhbihjaGFuZ2VkUHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gYW55IHByb3BlcnRpZXMgd2l0aCBhY2Nlc3NvcnMgY3JlYXRlZCB2aWEKICAgICAgICAgKiBgX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3JgIGhhdmUgYmVlbiBzZXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjaGFuZ2VkUHJvcHMgQmFnIG9mIHByb3BlcnRpZXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdAogICAgICAgICAqICAgY2FsbCB0byBgX3Byb3BlcnRpZXNDaGFuZ2VkYAogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgICAqICAgaW4gYGNoYW5nZWRQcm9wc2AKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE1ldGhvZCBjYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUKICAgICAgICAgKiBjb25zaWRlcmVkIGFzIGEgY2hhbmdlIGFuZCBjYXVzZSB0aGUgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2sKICAgICAgICAgKiB0byBiZSBlbnF1ZXVlZC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgYHRydWVgIGlmIGEgc3RyaWN0IGVxdWFsaXR5CiAgICAgICAgICogY2hlY2sgZmFpbHMuIFRoZSBtZXRob2QgYWx3YXlzIHJldHVybnMgZmFsc2UgZm9yIGBOYU5gLgogICAgICAgICAqCiAgICAgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZS5nLiBwcm92aWRlIHN0cmljdGVyIGNoZWNraW5nIGZvcgogICAgICAgICAqIE9iamVjdHMvQXJyYXlzIHdoZW4gdXNpbmcgaW1tdXRhYmxlIHBhdHRlcm5zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UKICAgICAgICAgKiAgIGFuZCBlbnF1ZXVlIGEgYF9wcm9lcHJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2sKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKSB7CiAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAvLyBTdHJpY3QgZXF1YWxpdHkgY2hlY2sKICAgICAgICAgICAgKG9sZCAhPT0gdmFsdWUgJiYKICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgKG9sZD09TmFOLCB2YWx1ZT09TmFOKSBhbHdheXMgcmV0dXJucyBmYWxzZQogICAgICAgICAgICAgIChvbGQgPT09IG9sZCB8fCB2YWx1ZSA9PT0gdmFsdWUpKQogICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudHMgbmF0aXZlIEN1c3RvbSBFbGVtZW50cyBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0bwogICAgICAgICAqIHNldCBhbiBhdHRyaWJ1dGUgdmFsdWUgdG8gYSBwcm9wZXJ0eSB2aWEgYF9hdHRyaWJ1dGVUb1Byb3BlcnR5YC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlIHRoYXQgY2hhbmdlZAogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIE5ldyBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgICAqLwogICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2F0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlc2VyaWFsaXplcyBhbiBhdHRyaWJ1dGUgdG8gaXRzIGFzc29jaWF0ZWQgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QgdG8gY29udmVydCB0aGUgc3RyaW5nIHRvCiAgICAgICAgICogYSB0eXBlZCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgdHlwZSB0byBkZXNlcmlhbGl6ZSB0bywgZGVmYXVsdHMgdG8gdGhlIHZhbHVlCiAgICAgICAgICogcmV0dXJuZWQgZnJvbSBgdHlwZUZvclByb3BlcnR5YAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX2F0dHJpYnV0ZVRvUHJvcGVydHkoYXR0cmlidXRlLCB2YWx1ZSwgdHlwZSkgewogICAgICAgICAgaWYgKCF0aGlzLl9fc2VyaWFsaXppbmcpIHsKICAgICAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fX2RhdGFBdHRyaWJ1dGVzOwogICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IG1hcCAmJiBtYXBbYXR0cmlidXRlXSB8fCBhdHRyaWJ1dGU7CiAgICAgICAgICAgIHRoaXNbcHJvcGVydHldID0gdGhpcy5fZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSB8fAogICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IudHlwZUZvclByb3BlcnR5KHByb3BlcnR5KSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXJpYWxpemVzIGEgcHJvcGVydHkgdG8gaXRzIGFzc29jaWF0ZWQgYXR0cmlidXRlLgogICAgICAgICAqCiAgICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IENsb3N1cmUgY2FuJ3QgZmlndXJlIG91dCBgdGhpc2AgaXMgYW4gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lIHRvIHJlZmxlY3QuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUgdG8gcmVmbGVjdCB0by4KICAgICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZlY3QuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfcHJvcGVydHlUb0F0dHJpYnV0ZShwcm9wZXJ0eSwgYXR0cmlidXRlLCB2YWx1ZSkgewogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gdHJ1ZTsKICAgICAgICAgIHZhbHVlID0gKGFyZ3VtZW50cy5sZW5ndGggPCAzKSA/IHRoaXNbcHJvcGVydHldIDogdmFsdWU7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHZhbHVlLAogICAgICAgICAgICBhdHRyaWJ1dGUgfHwgdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIHRoaXMuX19zZXJpYWxpemluZyA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBhIHR5cGVkIHZhbHVlIHRvIGFuIEhUTUwgYXR0cmlidXRlIG9uIGEgbm9kZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgdG8gY29udmVydCB0aGUgdHlwZWQKICAgICAgICAgKiB2YWx1ZSB0byBhIHN0cmluZy4gIElmIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYCwKICAgICAgICAgKiB0aGUgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgYm9vbGVhbgogICAgICAgICAqIHR5cGUgYGZhbHNlYCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgRWxlbWVudCB0byBzZXQgYXR0cmlidXRlIHRvLgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUgdG8gc2VyaWFsaXplIHRvLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKG5vZGUsIHZhbHVlLCBhdHRyaWJ1dGUpIHsKICAgICAgICAgIGNvbnN0IHN0ciA9IHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBzdHIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSB0eXBlZCBKYXZhU2NyaXB0IHZhbHVlIHRvIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gc2V0dGluZyBKUyBwcm9wZXJ0eSB2YWx1ZXMgdG8KICAgICAgICAgKiBIVE1MIGF0dHJpYnV0ZXMuICBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZQogICAgICAgICAqIHNlcmlhbGl6YXRpb24gZm9yIGN1c3RvbSB0eXBlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgUHJvcGVydHkgdmFsdWUgdG8gc2VyaWFsaXplLgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU3RyaW5nIHNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQKICAgICAgICAgKiBwcm9wZXJ0eSAgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyAnJyA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgICAqIEpTIHByb3BlcnRpZXMuICBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZQogICAgICAgICAqIGRlc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIGB0eXBlYHMuIFR5cGVzIGZvciBgQm9vbGVhbmAsIGBTdHJpbmdgLAogICAgICAgICAqIGFuZCBgTnVtYmVyYCBjb252ZXJ0IGF0dHJpYnV0ZXMgdG8gdGhlIGV4cGVjdGVkIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0geyo9fSB0eXBlIFR5cGUgdG8gZGVzZXJpYWxpemUgdGhlIHN0cmluZyB0by4KICAgICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIF9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgY2FzZSBCb29sZWFuOgogICAgICAgICAgICAgIHJldHVybiAodmFsdWUgIT09IG51bGwpOwogICAgICAgICAgICBjYXNlIE51bWJlcjoKICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgfQoKICAgICAgcmV0dXJuIFByb3BlcnRpZXNDaGFuZ2VkOwogICAgfSk7CgoKICB9KSgpOwoKPC9zY3JpcHQ+PHNjcmlwdD4KKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIGxldCBjYXNlTWFwID0gUG9seW1lci5DYXNlTWFwOwoKICAvLyBTYXZlIG1hcCBvZiBuYXRpdmUgcHJvcGVydGllczsgdGhpcyBmb3JtcyBhIGJsYWNrbGlzdCBvciBwcm9wZXJ0aWVzCiAgLy8gdGhhdCB3b24ndCBoYXZlIHRoZWlyIHZhbHVlcyAic2F2ZWQiIGJ5IGBzYXZlQWNjZXNzb3JWYWx1ZWAsIHNpbmNlCiAgLy8gcmVhZGluZyBmcm9tIGFuIEhUTUxFbGVtZW50IGFjY2Vzc29yIGZyb20gdGhlIGNvbnRleHQgb2YgYSBwcm90b3R5cGUgdGhyb3dzCiAgY29uc3QgbmF0aXZlUHJvcGVydGllcyA9IHt9OwogIGxldCBwcm90byA9IEhUTUxFbGVtZW50LnByb3RvdHlwZTsKICB3aGlsZSAocHJvdG8pIHsKICAgIGxldCBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKTsKICAgIGZvciAobGV0IGk9MDsgaTxwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICBuYXRpdmVQcm9wZXJ0aWVzW3Byb3BzW2ldXSA9IHRydWU7CiAgICB9CiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7CiAgfQoKICAvKioKICAgKiBVc2VkIHRvIHNhdmUgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgdGhhdCB3aWxsIGJlIG92ZXJyaWRkZW4gd2l0aAogICAqIGFuIGFjY2Vzc29yLiBJZiB0aGUgYG1vZGVsYCBpcyBhIHByb3RvdHlwZSwgdGhlIHZhbHVlcyB3aWxsIGJlIHNhdmVkCiAgICogaW4gYF9fZGF0YVByb3RvYCwgYW5kIGl0J3MgdXAgdG8gdGhlIHVzZXIgKG9yIGRvd25zdHJlYW0gbWl4aW4pIHRvCiAgICogZGVjaWRlIGhvdy93aGVuIHRvIHNldCB0aGVzZSB2YWx1ZXMgYmFjayBpbnRvIHRoZSBhY2Nlc3NvcnMuCiAgICogSWYgYG1vZGVsYCBpcyBhbHJlYWR5IGFuIGluc3RhbmNlIChpdCBoYXMgYSBgX19kYXRhYCBwcm9wZXJ0eSksIHRoZW4KICAgKiB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgYXMgYSBwZW5kaW5nIHByb3BlcnR5LCBtZWFuaW5nIHRoZSB1c2VyIHNob3VsZAogICAqIGNhbGwgYF9pbnZhbGlkYXRlUHJvcGVydGllc2Agb3IgYF9mbHVzaFByb3BlcnRpZXNgIHRvIHRha2UgZWZmZWN0CiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbW9kZWwgUHJvdG90eXBlIG9yIGluc3RhbmNlCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gc2F2ZUFjY2Vzc29yVmFsdWUobW9kZWwsIHByb3BlcnR5KSB7CiAgICAvLyBEb24ndCByZWFkL3N0b3JlIHZhbHVlIGZvciBhbnkgbmF0aXZlIHByb3BlcnRpZXMgc2luY2UgdGhleSBjb3VsZCB0aHJvdwogICAgaWYgKCFuYXRpdmVQcm9wZXJ0aWVzW3Byb3BlcnR5XSkgewogICAgICBsZXQgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV07CiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgaWYgKG1vZGVsLl9fZGF0YSkgewogICAgICAgICAgLy8gQWRkaW5nIGFjY2Vzc29yIHRvIGluc3RhbmNlOyB1cGRhdGUgdGhlIHByb3BlcnR5CiAgICAgICAgICAvLyBJdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGwgX2ZsdXNoUHJvcGVydGllcwogICAgICAgICAgbW9kZWwuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBBZGRpbmcgYWNjZXNzb3IgdG8gcHJvdG87IHNhdmUgcHJvdG8ncyB2YWx1ZSBmb3IgaW5zdGFuY2UtdGltZSB1c2UKICAgICAgICAgIGlmICghbW9kZWwuX19kYXRhUHJvdG8pIHsKICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG8gPSB7fTsKICAgICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZGF0YVByb3RvJywgbW9kZWwpKSkgewogICAgICAgICAgICBtb2RlbC5fX2RhdGFQcm90byA9IE9iamVjdC5jcmVhdGUobW9kZWwuX19kYXRhUHJvdG8pOwogICAgICAgICAgfQogICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG9bcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICogb3IgbW9yZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgKGdldHRlci9zZXR0ZXIgcGFpcikgdGhhdCBlbnF1ZXVlIGFuIGFzeW5jCiAgICogKGJhdGNoZWQpIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAqCiAgICogRm9yIGJhc2ljIHVzYWdlIG9mIHRoaXMgbWl4aW46CiAgICogCiAgICogLSAgIERlY2xhcmUgYXR0cmlidXRlcyB0byBvYnNlcnZlIHZpYSB0aGUgc3RhbmRhcmQgYHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKClgLiBVc2UKICAgKiAgICAgYGRhc2gtY2FzZWAgYXR0cmlidXRlIG5hbWVzIHRvIHJlcHJlc2VudCBgY2FtZWxDYXNlYCBwcm9wZXJ0eSBuYW1lcy4gCiAgICogLSAgIEltcGxlbWVudCB0aGUgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2sgb24gdGhlIGNsYXNzLgogICAqIC0gICBDYWxsIGBNeUNsYXNzLmNyZWF0ZVByb3BlcnRpZXNGb3JBdHRyaWJ1dGVzKClgICoqb25jZSoqIG9uIHRoZSBjbGFzcyB0byBnZW5lcmF0ZSAKICAgKiAgICAgcHJvcGVydHkgYWNjZXNzb3JzIGZvciBlYWNoIG9ic2VydmVkIGF0dHJpYnV0ZS4gVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IAogICAqICAgICBpbnN0YW5jZSBpcyBjcmVhdGVkLCBmb3IgZXhhbXBsZSwgYnkgY2FsbGluZyBpdCBiZWZvcmUgY2FsbGluZyBgY3VzdG9tRWxlbWVudHMuZGVmaW5lYC4KICAgKiAgICAgSXQgY2FuIGFsc28gYmUgY2FsbGVkIGxhemlseSBmcm9tIHRoZSBlbGVtZW50J3MgYGNvbnN0cnVjdG9yYCwgYXMgbG9uZyBhcyBpdCdzIGd1YXJkZWQgc28KICAgKiAgICAgdGhhdCB0aGUgY2FsbCBpcyBvbmx5IG1hZGUgb25jZSwgd2hlbiB0aGUgZmlyc3QgaW5zdGFuY2UgaXMgY3JlYXRlZC4KICAgKiAtICAgQ2FsbCBgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpYCBpbiB0aGUgZWxlbWVudCdzIGBjb25uZWN0ZWRDYWxsYmFja2AgdG8gZW5hYmxlIAogICAqICAgICB0aGUgYWNjZXNzb3JzLgogICAqCiAgICogQW55IGBvYnNlcnZlZEF0dHJpYnV0ZXNgIHdpbGwgYXV0b21hdGljYWxseSBiZQogICAqIGRlc2VyaWFsaXplZCB2aWEgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AgYW5kIHNldCB0byB0aGUgYXNzb2NpYXRlZAogICAqIHByb3BlcnR5IHVzaW5nIGBkYXNoLWNhc2VgLXRvLWBjYW1lbENhc2VgIGNvbnZlbnRpb24uCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIGZvciByZWFjdGluZyB0byBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20KICAgKiAgIGdlbmVyYXRlZCBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICovCiAgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgICBjb25zdCBiYXNlID0gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZChzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlBY2Nlc3NvcnN9CiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgUHJvcGVydHlBY2Nlc3NvcnMgZXh0ZW5kcyBiYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciBhbGwgYXR0cmlidXRlcyBpbiB0aGUgc3RhbmRhcmQKICAgICAgICogc3RhdGljIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGFycmF5LgogICAgICAgKgogICAgICAgKiBBdHRyaWJ1dGUgbmFtZXMgYXJlIG1hcHBlZCB0byBwcm9wZXJ0eSBuYW1lcyB1c2luZyB0aGUgYGRhc2gtY2FzZWAgdG8KICAgICAgICogYGNhbWVsQ2FzZWAgY29udmVudGlvbgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXNGb3JBdHRyaWJ1dGVzKCkgewogICAgICAgIGxldCBhJCA9IHRoaXMub2JzZXJ2ZWRBdHRyaWJ1dGVzOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGEkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUHJvcGVydHlBY2Nlc3NvcihjYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZShhJFtpXSkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYW4gYXR0cmlidXRlIG5hbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEJ5IGRlZmF1bHQsIGNvbnZlcnRzIGNhbWVsIHRvIGRhc2ggY2FzZSwgZS5nLiBgZm9vQmFyYCB0byBgZm9vLWJhcmAuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBjb252ZXJ0CiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gQXR0cmlidXRlIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gY2FzZU1hcC5jYW1lbFRvRGFzaENhc2UocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGF0aW9uIHRvIGluaXRpYWxpemUgdmFsdWVzIGZvcgogICAgICAgKiBhY2Nlc3NvcnMgY3JlYXRlZCBmb3IgdmFsdWVzIHRoYXQgYWxyZWFkeSBleGlzdGVkIG9uIHRoZSBlbGVtZW50CiAgICAgICAqIHByb3RvdHlwZS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICh0aGlzLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICB0aGlzLl9pbml0aWFsaXplUHJvdG9Qcm9wZXJ0aWVzKHRoaXMuX19kYXRhUHJvdG8pOwogICAgICAgICAgdGhpcy5fX2RhdGFQcm90byA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIGF0IGluc3RhbmNlIHRpbWUgd2l0aCBiYWcgb2YgcHJvcGVydGllcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICogYnkgYWNjZXNzb3JzIG9uIHRoZSBwcm90b3R5cGUgd2hlbiBhY2Nlc3NvcnMgd2VyZSBjcmVhdGVkLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZXRzIHRoZXNlIHByb3BlcnRpZXMgYmFjayBpbnRvIHRoZQogICAgICAgKiBzZXR0ZXIgYXQgaW5zdGFuY2UgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAqIHBvaW50IGZvciBjdXN0b21pemluZyBvciBwcm92aWRpbmcgbW9yZSBlZmZpY2llbnQgaW5pdGlhbGl6YXRpb24uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgKiAgIHdoZW4gY3JlYXRpbmcgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHAsIHByb3BzW3BdKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIHRoZSBlbGVtZW50IGhhcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBJZiBpdCBkb2VzIG5vdCwKICAgICAgICogYXNzaWducyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGF0dHJpYnV0ZS4KICAgICAgICoKICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IENsb3N1cmUgY2FuJ3QgZmlndXJlIG91dCBgdGhpc2AgaXMgaW5mYWN0IGFuIGVsZW1lbnQKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBOYW1lIG9mIGF0dHJpYnV0ZSB0byBlbnN1cmUgaXMgc2V0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9lbnN1cmVBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSkgewogICAgICAgIGNvbnN0IGVsID0gLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgIGlmICghZWwuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpIHsKICAgICAgICAgIHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKGVsLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50aW9uIHRvIHNlcmlhbGl6ZSBvYmplY3RzIGFzIEpTT04uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgUHJvcGVydHkgdmFsdWUgdG8gc2VyaWFsaXplLgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFN0cmluZyBzZXJpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIHByb3BlcnR5IHZhbHVlLgogICAgICAgKi8KICAgICAgX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tZmFsbHRocm91Z2ggKi8KICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7CiAgICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLl9zZXJpYWxpemVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVydHMgYSBzdHJpbmcgdG8gYSB0eXBlZCBKYXZhU2NyaXB0IHZhbHVlLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgUG9seW1lciB3aGVuIHJlYWRpbmcgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIHRvCiAgICAgICAqIEpTIHByb3BlcnRpZXMuICBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb24gUG9seW1lciBlbGVtZW50CiAgICAgICAqIHByb3RvdHlwZXMgdG8gcHJvdmlkZSBkZXNlcmlhbGl6YXRpb24gZm9yIGN1c3RvbSBgdHlwZWBzLiAgTm90ZSwKICAgICAgICogdGhlIGB0eXBlYCBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGB0eXBlYCBmaWVsZCBwcm92aWRlZCBpbiB0aGUKICAgICAgICogYHByb3BlcnRpZXNgIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBhIGdpdmVuIHByb3BlcnR5LCBhbmQgaXMKICAgICAgICogYnkgY29udmVudGlvbiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0eXBlIHRvIGRlc2VyaWFsaXplLgogICAgICAgKgogICAgICAgKgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICogQHBhcmFtIHsqPX0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8uCiAgICAgICAqIEByZXR1cm4geyp9IFR5cGVkIHZhbHVlIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBzdHJpbmcuCiAgICAgICAqLwogICAgICBfZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEB0eXBlIHsqfQogICAgICAgICAqLwogICAgICAgIGxldCBvdXRWYWx1ZTsKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgIGNhc2UgT2JqZWN0OgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgLy8gYWxsb3cgbm9uLUpTT04gbGl0ZXJhbHMgbGlrZSBTdHJpbmdzIGFuZCBOdW1iZXJzCiAgICAgICAgICAgICAgb3V0VmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQXJyYXk6CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBKU09OLnBhcnNlKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyh2YWx1ZSkpOwogICAgICAgICAgICB9IGNhdGNoKHgpIHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBQb2x5bWVyOjpBdHRyaWJ1dGVzOiBjb3VsZG4ndCBkZWNvZGUgQXJyYXkgYXMgSlNPTjogJHt2YWx1ZX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgRGF0ZToKICAgICAgICAgICAgb3V0VmFsdWUgPSBpc05hTih2YWx1ZSkgPyBTdHJpbmcodmFsdWUpIDogTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgb3V0VmFsdWUgPSBuZXcgRGF0ZShvdXRWYWx1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgb3V0VmFsdWUgPSBzdXBlci5fZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0VmFsdWU7CiAgICAgIH0KICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1mYWxsdGhyb3VnaCAqLwoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBzYXZlIGV4aXN0aW5nIHByb3RvdHlwZQogICAgICAgKiBwcm9wZXJ0eSB2YWx1ZSBzbyB0aGF0IGl0IGNhbiBiZSByZXNldC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQKICAgICAgICoKICAgICAgICogV2hlbiBjYWxsaW5nIG9uIGEgcHJvdG90eXBlLCBhbnkgb3ZlcndyaXR0ZW4gdmFsdWVzIGFyZSBzYXZlZCBpbgogICAgICAgKiBgX19kYXRhUHJvdG9gLCBhbmQgaXQgaXMgdXAgdG8gdGhlIHN1YmNsYXNzZXIgdG8gZGVjaWRlIGhvdy93aGVuCiAgICAgICAqIHRvIHNldCB0aG9zZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3IuICBXaGVuIGNhbGxpbmcgb24gYW4KICAgICAgICogaW5zdGFuY2UsIHRoZSBvdmVyd3JpdHRlbiB2YWx1ZSBpcyBzZXQgdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCwKICAgICAgICogYW5kIHRoZSB1c2VyIHNob3VsZCBjYWxsIGBfaW52YWxpZGF0ZVByb3BlcnRpZXNgIG9yIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgKiBmb3IgdGhlIHZhbHVlcyB0byB0YWtlIGVmZmVjdC4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2RlZmluZVByb3BlcnR5QWNjZXNzb3IocHJvcGVydHksIHJlYWRPbmx5KSB7CiAgICAgICAgc2F2ZUFjY2Vzc29yVmFsdWUodGhpcywgcHJvcGVydHkpOwogICAgICAgIHN1cGVyLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBsaWJyYXJ5IGNyZWF0ZWQgYW4gYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbiBhY2Nlc3NvciB3YXMgY3JlYXRlZAogICAgICAgKi8KICAgICAgX2hhc0FjY2Vzc29yKHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHByb3BlcnR5IGhhcyBhIHBlbmRpbmcgY2hhbmdlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pc1Byb3BlcnR5UGVuZGluZyhwcm9wKSB7CiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fX2RhdGFQZW5kaW5nICYmIChwcm9wIGluIHRoaXMuX19kYXRhUGVuZGluZykpOwogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0eUFjY2Vzc29yczsKCiAgfSk7Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCwgTm9kZUZpbHRlci5TSE9XX0FMTCwKICAgICAgbnVsbCwgZmFsc2UpOwoKICAvLyAxLnggYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by13cmFwcGVyIGZvciB0ZW1wbGF0ZSB0eXBlIGV4dGVuc2lvbnMKICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAvLyBkb20taWYgYW5kIGRvbS1yZXBlYXQgdGVtcGxhdGVzLiAgVGhpcyBpcyBhIGNvbmNlaXQgd2UncmUgY2hvb3NpbmcgdG8ga2VlcAogIC8vIGEuKSB0byBlYXNlIDEueCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBkdWUgdG8gbG9zcyBvZiBgaXNgLCBhbmQKICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgLy8gICAgIChlLmcuIHRhYmxlLCBzZWxlY3QpIGluIGxpZXUgb2YgbmF0aXZlIENFIHR5cGUgZXh0ZW5zaW9ucyB3aXRob3V0CiAgLy8gICAgIG1hc3NpdmUgbmV3IGludmVudGlvbiBpbiB0aGlzIHNwYWNlIChlLmcuIGRpcmVjdGl2ZSBzeXN0ZW0pCiAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgJ2RvbS1pZic6IHRydWUsCiAgICAnZG9tLXJlcGVhdCc6IHRydWUKICB9OwogIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICBsZXQgaXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnaXMnKTsKICAgIGlmIChpcyAmJiB0ZW1wbGF0ZUV4dGVuc2lvbnNbaXNdKSB7CiAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUoJ2lzJyk7CiAgICAgIG5vZGUgPSB0Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChpcyk7CiAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodCk7CiAgICAgIHdoaWxlKHQuYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgLy8gcmVjdXJzaXZlbHkgYXNjZW5kIHRyZWUgdW50aWwgd2UgaGl0IHJvb3QKICAgIGxldCBwYXJlbnQgPSBub2RlSW5mby5wYXJlbnRJbmZvICYmIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8ucGFyZW50SW5mbyk7CiAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICBpZiAocGFyZW50KSB7CiAgICAgIC8vIG5vdGU6IG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4gaW5kZXhpbmcgdmlhIGNoaWxkTm9kZXMKICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBwYXJlbnQ7CiAgICAgIGZvciAobGV0IG49d2Fsa2VyLmZpcnN0Q2hpbGQoKSwgaT0wOyBuOyBuPXdhbGtlci5uZXh0U2libGluZygpKSB7CiAgICAgICAgaWYgKG5vZGVJbmZvLnBhcmVudEluZGV4ID09PSBpKyspIHsKICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgfQoKICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICBmdW5jdGlvbiBhcHBseUlkVG9NYXAoaW5zdCwgbWFwLCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmlkKSB7CiAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlFdmVudExpc3RlbmVyKGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8uZXZlbnRzICYmIG5vZGVJbmZvLmV2ZW50cy5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICBpbnN0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGUubmFtZSwgZS52YWx1ZSwgaW5zdCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIHB1c2ggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzIGF0IGNvbmZpZ3VyZSB0aW1lCiAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUNvbnRlbnQoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby50ZW1wbGF0ZUluZm8pIHsKICAgICAgbm9kZS5fdGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICBsZXQgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGNvbnRleHRbbWV0aG9kTmFtZV0pIHsKICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2xpc3RlbmVyIG1ldGhvZCBgJyArIG1ldGhvZE5hbWUgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGhhbmRsZXI7CiAgfQoKICAvKioKICAgKiBFbGVtZW50IG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcsIGluY2x1ZGluZwogICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICoKICAgKiAtIERlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLWV2ZW50bmFtZT0ibGlzdGVuZXIiYCkKICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICogLSBOZXN0ZWQgdGVtcGxhdGUgY29udGVudCBjYWNoaW5nL3JlbW92YWwgYW5kIHJlLWluc3RhbGxhdGlvbiAocGVyZm9ybWFuY2UKICAgKiAgIG9wdGltaXphdGlvbikKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyB0ZW1wbGF0ZSBwYXJzaW5nIGFuZCBzdGFtcGluZwogICAqLwogIFBvbHltZXIuVGVtcGxhdGVTdGFtcCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVTdGFtcCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgLyoqCiAgICAgICAqIFNjYW5zIGEgdGVtcGxhdGUgdG8gcHJvZHVjZSB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICogc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiBvYmplY3RzIGluIGl0cyBmbGF0dGVuZWQgYG5vZGVJbmZvTGlzdGAKICAgICAgICogYXJyYXkuICBPbmx5IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlcmUgcGFyc2VkIGFzIG5vZGVzIG9mCiAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgKiBjb250YWlucyBhbiBgaW5kZXhgIChgY2hpbGROb2Rlc2AgaW5kZXggaW4gcGFyZW50KSBhbmQgb3B0aW9uYWxseQogICAgICAgKiBgcGFyZW50YCwgd2hpY2ggcG9pbnRzIHRvIG5vZGUgaW5mbyBvZiBpdHMgcGFyZW50IChpbmNsdWRpbmcgaXRzIGluZGV4KS4KICAgICAgICoKICAgICAgICogVGhlIHRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nCiAgICAgICAqIHN0cnVjdHVyZSAobWFueSBmaWVsZHMgb3B0aW9uYWwpOgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiAgIHsKICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICogICAgIG5vZGVJbmZvTGlzdDogWwogICAgICAgKiAgICAgICB7CiAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgKiAgICAgICAgIGlkOiB7c3RyaW5nfSwKICAgICAgICogICAgICAgICAvLyBgb24tZXZlbnQ9ImhhbmRsZXIiYCBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgKiAgICAgICAgICAgewogICAgICAgKiAgICAgICAgICAgICBuYW1lOiB7c3RyaW5nfSwgICAvLyBldmVudCBuYW1lCiAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICogICAgICAgICAgIH0sIC4uLgogICAgICAgKiAgICAgICAgIF0sCiAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgKiAgICAgICAgIC8vIG9wdGltaXphdGlvbiBwdXJwb3NlcwogICAgICAgKiAgICAgICAgIGhhc0luc2VydGlvblBvaW50OiB7Ym9vbGVhbn0sCiAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICB0ZW1wbGF0ZUluZm86IHtvYmplY3R9LCAvLyBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICAvLyBNZXRhZGF0YSB0byBhbGxvdyBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGluc3RhbmNlZCBub2RlCiAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgcGFyZW50SW5mbzoge251bWJlcn0sICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlSW5mbz4KICAgICAgICogICAgICAgICBwYXJlbnRJbmRleDoge251bWJlcn0sICAvLyBpbmRleCBpbiBwYXJlbnQncyBgY2hpbGROb2Rlc2AgY29sbGVjdGlvbgogICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICogICAgICAgfSwKICAgICAgICogICAgICAgLi4uCiAgICAgICAqICAgICBdLAogICAgICAgKiAgICAgLy8gV2hlbiB0cnVlLCB0aGUgdGVtcGxhdGUgaGFkIHRoZSBgc3RyaXAtd2hpdGVzcGFjZWAgYXR0cmlidXRlCiAgICAgICAqICAgICAvLyBvciB3YXMgbmVzdGVkIGluIGEgdGVtcGxhdGUgd2l0aCB0aGF0IHNldHRpbmcKICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgKiAgICAgLy8gRm9yIG5lc3RlZCB0ZW1wbGF0ZXMsIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGlzIG1vdmVkIGludG8KICAgICAgICogICAgIC8vIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGhlcmU7IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvCiAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgKiAgICAgY29udGVudDoge0RvY3VtZW50RnJhZ21lbnR9CiAgICAgICAqICAgfQogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qga2lja3Mgb2ZmIGEgcmVjdXJzaXZlIHRyZWV3YWxrIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKiAgICBfcGFyc2VUZW1wbGF0ZSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgKiAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlICA8LS0tLS0tLS0tLS0tfC0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlIC0tKyAgfAogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzCiAgICAgICAqICAgICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlCiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAqIHRvIGVpdGhlciBgdGVtcGxhdGVJbmZvYCBvciBgbm9kZUluZm9gLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgKiBlLmcuIGV2ZW50IGFubm90YXRpb25zIG1heSBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm89fSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBvdXRlcgogICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFBhcnNlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCBvdXRlclRlbXBsYXRlSW5mbykgewogICAgICAgIC8vIHNpbmNlIGEgdGVtcGxhdGUgbWF5IGJlIHJlLXVzZWQsIG1lbW8taXplIG1ldGFkYXRhCiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdCA9IFtdOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICB0ZW1wbGF0ZS5oYXNBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnKTsKICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIHtwYXJlbnQ6IG51bGx9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUodGVtcGxhdGUuY29udGVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhbmQgYWRkcyB0ZW1wbGF0ZSBhbmQgbm9kZSBtZXRhZGF0YSBiYXNlZCBvbgogICAgICAgKiB0aGUgY3VycmVudCBub2RlLCBhbmQgaXRzIGBjaGlsZE5vZGVzYCBhbmQgYGF0dHJpYnV0ZXNgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG5vZGUgb3IgdGVtcGxhdGUgc3BlY2lmaWMKICAgICAgICogbWV0YWRhdGEgYmFzZWQgb24gdGhpcyBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZDsKICAgICAgICBsZXQgZWxlbWVudCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSk7CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdwcmVzZXJ2ZS1jb250ZW50JykpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgLy8gRm9yIFNoYWR5RG9tIG9wdGltaXphdGlvbiwgaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgaWYgKHdhbGtlci5maXJzdENoaWxkKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMoZWxlbWVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZXMgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY2hpbGQgbm9kZXMgZm9yIHRoZSBnaXZlbiByb290IG5vZGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICogKGBpcz0iZG9tLWlmImAgYW5kIGBpcz0iZG9tLXJlcGVhdCJgKSB3aXRoIHRoZWlyIGVxdWl2YWxlbnQgZWxlbWVudAogICAgICAgKiB3cmFwcGVycywgY29sbGFwc2VzIHRleHQgbm9kZXMsIGFuZCBzdHJpcHMgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgUm9vdCBub2RlIHdob3NlIGBjaGlsZE5vZGVzYCB3aWxsIGJlIHBhcnNlZAogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMocm9vdCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGlmIChyb290LmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcgfHwgcm9vdC5sb2NhbE5hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcm9vdDsKICAgICAgICBmb3IgKGxldCBub2RlPXdhbGtlci5maXJzdENoaWxkKCksIHBhcmVudEluZGV4PTAsIG5leHQ7IG5vZGU7IG5vZGU9bmV4dCkgewogICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnKSB7CiAgICAgICAgICAgIG5vZGUgPSB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBjb2xsYXBzZSBhZGphY2VudCB0ZXh0Tm9kZXM6IGZpeGVzIGFuIElFIGlzc3VlIHRoYXQgY2FuIGNhdXNlCiAgICAgICAgICAvLyB0ZXh0IG5vZGVzIHRvIGJlIGluZXhwbGljYWJseSBzcGxpdCA9KAogICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgIC8vIG1hbnVhbGx5LgogICAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gbm9kZTsKICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgIHdoaWxlIChuICYmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ICs9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgbmV4dCA9IHdhbGtlci5uZXh0U2libGluZygpOwogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBzdHJpcCB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBjaGlsZEluZm8gPSB7IHBhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mbyB9OwogICAgICAgICAgaWYgKHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgY2hpbGRJbmZvKSkgewogICAgICAgICAgICBjaGlsZEluZm8uaW5mb0luZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5wdXNoKC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyhjaGlsZEluZm8pKSAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudE5vZGUoKSkgewogICAgICAgICAgICBwYXJlbnRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICoKICAgICAgICogTmVzdGVkIHRlbXBsYXRlIGluZm8gaXMgc3RvcmVkIGFzIGB0ZW1wbGF0ZUluZm9gIGluIHRoZSBjdXJyZW50IG5vZGUncwogICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgKiBJdCB3aWxsIHRoZW4gYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBob3N0IHRvIHNldCBpdCBiYWNrIHRvIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgZm9yIHVzZXJzIHN0YW1waW5nIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gdXNlIHRoZQogICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAqIChhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiAgIHRoYXQgaW5jbHVkZXMgdGhlIHRlbXBsYXRlIGBub2RlYAogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLl9wYXJzZVRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvKTsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50ID0KICAgICAgICAgIG5vZGUuY29udGVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKG5vZGUuY29udGVudCk7CiAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYXR0cmlidXRlcyBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogZm9yIG5vZGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgLy8gTWFrZSBjb3B5IG9mIG9yaWdpbmFsIGF0dHJpYnV0ZSBsaXN0LCBzaW5jZSB0aGUgb3JkZXIgbWF5IGNoYW5nZQogICAgICAgIC8vIGFzIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCiAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgbGV0IGF0dHJzID0gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpOwogICAgICAgIGZvciAobGV0IGk9YXR0cnMubGVuZ3RoLTEsIGE7IChhPWF0dHJzW2ldKTsgaS0tKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyBhIHNpbmdsZSB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZSBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvCiAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAqCiAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBtZXRhZGF0YSBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICBpZiAobmFtZS5zbGljZSgwLCAzKSA9PT0gJ29uLScpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lOiBuYW1lLnNsaWNlKDMpLAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gc3RhdGljIGlkCiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2lkJykgewogICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBQb2x5bWVyIHBlcmZvcm1zIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSBuZXN0ZWQKICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBjb250ZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH0gQ29udGVudCBmcmFnbWVudAogICAgICAgKi8KICAgICAgc3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50V2l0aEluZm99ICovICh0ZW1wbGF0ZSkuX3RlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGNvbnRhaW5pbmcgdGhlIGNsb25lZCBkb20uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgKiB0ZW1wbGF0ZSBwYXJzaW5nIGZlYXR1cmVzLCBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS1hZGRlZAogICAgICAgKiBmZWF0dXJlczoKICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiAqIEdlbmVyYXRlcyBhbiAiaWQgbWFwIiBmb3IgYWxsIG5vZGVzIHdpdGggaWQncyB1bmRlciBgJGAgb24gcmV0dXJuZWQKICAgICAgICogICBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICogICBgX3RlbXBsYXRlSW5mb2AgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGRlZXAgdGVtcGxhdGUKICAgICAgICogICBjbG9uaW5nKQogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhlIG1lbW9pemVkIHRlbXBsYXRlIHBhcnNpbmcgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZSB0byB0aGUKICAgICAgICogdGVtcGxhdGU6IGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmdzIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgYXJlCiAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAqIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBub3RlcyBhcyB3ZWxsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5jb250ZW50ICYmCiAgICAgICAgICAgIHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50ICYmIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUpIHsKICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IG5vZGVJbmZvID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdDsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgbGV0IGRvbSA9IC8qKiBAdHlwZSB7RG9jdW1lbnRGcmFnbWVudH0gKi8gKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIC8vIE5PVEU6IFNoYWR5RG9tIG9wdGltaXphdGlvbiBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgIGxldCBub2RlcyA9IGRvbS5ub2RlTGlzdCA9IG5ldyBBcnJheShub2RlSW5mby5sZW5ndGgpOwogICAgICAgIGRvbS4kID0ge307CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV0gPSBmaW5kVGVtcGxhdGVOb2RlKGRvbSwgaW5mbyk7CiAgICAgICAgICBhcHBseUlkVG9NYXAodGhpcywgZG9tLiQsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlUZW1wbGF0ZUNvbnRlbnQodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgICBhcHBseUV2ZW50TGlzdGVuZXIodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgfQogICAgICAgIGRvbSA9IC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8oZG9tKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IG1ldGhvZCBuYW1lIGZvciB0aGUgZXZlbnQgcHJvdmlkZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBsb29rcyB1cCB0aGUgbWV0aG9kCiAgICAgICAqIG5hbWUgYXQgaGFuZGxpbmcgdGltZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBtZXRob2QKICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAqICAgdG8gYG5vZGVgKQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gR2VuZXJhdGVkIGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICovCiAgICAgIF9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG5vZGU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gVGVtcGxhdGVTdGFtcDsKCiAgfSk7Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIEBjb25zdCB7T2JqZWN0fSAqLwogIGNvbnN0IENhc2VNYXAgPSBQb2x5bWVyLkNhc2VNYXA7CgogIC8vIE1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB1bmlxdWUgSUQgdXNlZCBmb3IgZGUtZHVwaW5nIGVmZmVjdHMgdHJpZ2dlcmVkCiAgLy8gZnJvbSBtdWx0aXBsZSBwcm9wZXJ0aWVzIGluIHRoZSBzYW1lIHR1cm4KICBsZXQgZGVkdXBlSWQgPSAwOwoKICAvKioKICAgKiBQcm9wZXJ0eSBlZmZlY3QgdHlwZXM7IGVmZmVjdHMgYXJlIHN0b3JlZCBvbiB0aGUgcHJvdG90eXBlIHVzaW5nIHRoZXNlIGtleXMKICAgKiBAZW51bSB7c3RyaW5nfQogICAqLwogIGNvbnN0IFRZUEVTID0gewogICAgQ09NUFVURTogJ19fY29tcHV0ZUVmZmVjdHMnLAogICAgUkVGTEVDVDogJ19fcmVmbGVjdEVmZmVjdHMnLAogICAgTk9USUZZOiAnX19ub3RpZnlFZmZlY3RzJywKICAgIFBST1BBR0FURTogJ19fcHJvcGFnYXRlRWZmZWN0cycsCiAgICBPQlNFUlZFOiAnX19vYnNlcnZlRWZmZWN0cycsCiAgICBSRUFEX09OTFk6ICdfX3JlYWRPbmx5JwogIH07CgogIC8qKiBAY29uc3Qge1JlZ0V4cH0gKi8KICBjb25zdCBjYXBpdGFsQXR0cmlidXRlUmVnZXggPSAvW0EtWl0vOwoKICAvKioKICAgKiBAdHlwZWRlZiB7ewogICAqIG5hbWU6IChzdHJpbmcgfCB1bmRlZmluZWQpLAogICAqIHN0cnVjdHVyZWQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSwKICAgKiB3aWxkY2FyZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpCiAgICogfX0KICAgKi8KICBsZXQgRGF0YVRyaWdnZXI7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBAdHlwZWRlZiB7ewogICAqIGluZm86ID8sCiAgICogdHJpZ2dlcjogKCFEYXRhVHJpZ2dlciB8IHVuZGVmaW5lZCksCiAgICogZm46ICghRnVuY3Rpb24gfCB1bmRlZmluZWQpCiAgICogfX0KICAgKi8KICBsZXQgRGF0YUVmZmVjdDsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIGxldCBQcm9wZXJ0eUVmZmVjdHNUeXBlOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgLyoqCiAgICogRW5zdXJlcyB0aGF0IHRoZSBtb2RlbCBoYXMgYW4gb3duLXByb3BlcnR5IG1hcCBvZiBlZmZlY3RzIGZvciB0aGUgZ2l2ZW4gdHlwZS4KICAgKiBUaGUgbW9kZWwgbWF5IGJlIGEgcHJvdG90eXBlIG9yIGFuIGluc3RhbmNlLgogICAqCiAgICogUHJvcGVydHkgZWZmZWN0cyBhcmUgc3RvcmVkIGFzIGFycmF5cyBvZiBlZmZlY3RzIGJ5IHByb3BlcnR5IGluIGEgbWFwLAogICAqIGJ5IG5hbWVkIHR5cGUgb24gdGhlIG1vZGVsLiBlLmcuCiAgICoKICAgKiAgIF9fY29tcHV0ZUVmZmVjdHM6IHsKICAgKiAgICAgZm9vOiBbIC4uLiBdLAogICAqICAgICBiYXI6IFsgLi4uIF0KICAgKiAgIH0KICAgKgogICAqIElmIHRoZSBtb2RlbCBkb2VzIG5vdCB5ZXQgaGF2ZSBhbiBlZmZlY3QgbWFwIGZvciB0aGUgdHlwZSwgb25lIGlzIGNyZWF0ZWQKICAgKiBhbmQgcmV0dXJuZWQuICBJZiBpdCBkb2VzLCBidXQgaXQgaXMgbm90IGFuIG93biBwcm9wZXJ0eSAoaS5lLiB0aGUKICAgKiBwcm90b3R5cGUgaGFkIGVmZmVjdHMpLCB0aGUgdGhlIG1hcCBpcyBkZWVwbHkgY2xvbmVkIGFuZCB0aGUgY29weSBpcwogICAqIHNldCBvbiB0aGUgbW9kZWwgYW5kIHJldHVybmVkLCByZWFkeSBmb3IgbmV3IGVmZmVjdHMgdG8gYmUgYWRkZWQuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbW9kZWwgUHJvdG90eXBlIG9yIGluc3RhbmNlCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgUHJvcGVydHkgZWZmZWN0IHR5cGUKICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBlbnN1cmVPd25FZmZlY3RNYXAobW9kZWwsIHR5cGUpIHsKICAgIGxldCBlZmZlY3RzID0gbW9kZWxbdHlwZV07CiAgICBpZiAoIWVmZmVjdHMpIHsKICAgICAgZWZmZWN0cyA9IG1vZGVsW3R5cGVdID0ge307CiAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSBPYmplY3QuY3JlYXRlKG1vZGVsW3R5cGVdKTsKICAgICAgZm9yIChsZXQgcCBpbiBlZmZlY3RzKSB7CiAgICAgICAgbGV0IHByb3RvRnggPSBlZmZlY3RzW3BdOwogICAgICAgIGxldCBpbnN0RnggPSBlZmZlY3RzW3BdID0gQXJyYXkocHJvdG9GeC5sZW5ndGgpOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxwcm90b0Z4Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpbnN0RnhbaV0gPSBwcm90b0Z4W2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGVmZmVjdHM7CiAgfQoKICAvLyAtLSBlZmZlY3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLyoqCiAgICogUnVucyBhbGwgZWZmZWN0cyBvZiBhIGdpdmVuIHR5cGUgZm9yIHRoZSBnaXZlbiBzZXQgb2YgcHJvcGVydHkgY2hhbmdlcwogICAqIG9uIGFuIGluc3RhbmNlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBlZmZlY3RzIE9iamVjdCBtYXAgb2YgcHJvcGVydHktdG8tQXJyYXkgb2YgZWZmZWN0cwogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3Q9fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7Kj19IGV4dHJhQXJncyBBZGRpdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gZWZmZWN0IGZ1bmN0aW9uCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbiBlZmZlY3QgcmFuIGZvciB0aGlzIHByb3BlcnR5CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5FZmZlY3RzKGluc3QsIGVmZmVjdHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMsIGV4dHJhQXJncykgewogICAgaWYgKGVmZmVjdHMpIHsKICAgICAgbGV0IHJhbiA9IGZhbHNlOwogICAgICBsZXQgaWQgPSBkZWR1cGVJZCsrOwogICAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKSB7CiAgICAgICAgaWYgKHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBpZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSkgewogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJhbjsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8qKgogICAqIFJ1bnMgYSBsaXN0IG9mIGVmZmVjdHMgZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtudW1iZXJ9IGRlZHVwZUlkIENvdW50ZXIgdXNlZCBmb3IgZGUtZHVwaW5nIGVmZmVjdHMKICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBOYW1lIG9mIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0geyp9IHByb3BzIENoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Kn0gb2xkUHJvcHMgT2xkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7Kj19IGV4dHJhQXJncyBBZGRpdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gZWZmZWN0IGZ1bmN0aW9uCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbiBlZmZlY3QgcmFuIGZvciB0aGlzIHByb3BlcnR5CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5FZmZlY3RzRm9yUHJvcGVydHkoaW5zdCwgZWZmZWN0cywgZGVkdXBlSWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMsIGV4dHJhQXJncykgewogICAgbGV0IHJhbiA9IGZhbHNlOwogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IGhhc1BhdGhzID8gUG9seW1lci5QYXRoLnJvb3QocHJvcCkgOiBwcm9wOwogICAgbGV0IGZ4cyA9IGVmZmVjdHNbcm9vdFByb3BlcnR5XTsKICAgIGlmIChmeHMpIHsKICAgICAgZm9yIChsZXQgaT0wLCBsPWZ4cy5sZW5ndGgsIGZ4OyAoaTxsKSAmJiAoZng9ZnhzW2ldKTsgaSsrKSB7CiAgICAgICAgaWYgKCghZnguaW5mbyB8fCBmeC5pbmZvLmxhc3RSdW4gIT09IGRlZHVwZUlkKSAmJgogICAgICAgICAgICAoIWhhc1BhdGhzIHx8IHBhdGhNYXRjaGVzVHJpZ2dlcihwcm9wLCBmeC50cmlnZ2VyKSkpIHsKICAgICAgICAgIGlmIChmeC5pbmZvKSB7CiAgICAgICAgICAgIGZ4LmluZm8ubGFzdFJ1biA9IGRlZHVwZUlkOwogICAgICAgICAgfQogICAgICAgICAgZnguZm4oaW5zdCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBmeC5pbmZvLCBoYXNQYXRocywgZXh0cmFBcmdzKTsKICAgICAgICAgIHJhbiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmFuOwogIH0KCiAgLyoqCiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcHJvcGVydHkvcGF0aCB0aGF0IGhhcyBjaGFuZ2VkIG1hdGNoZXMgdGhlIHRyaWdnZXIKICAgKiBjcml0ZXJpYSBmb3IgYW4gZWZmZWN0LiAgQSB0cmlnZ2VyIGlzIGEgZGVzY3JpcHRvciB3aXRoIHRoZSBmb2xsb3dpbmcKICAgKiBzdHJ1Y3R1cmUsIHdoaWNoIG1hdGNoZXMgdGhlIGRlc2NyaXB0b3JzIHJldHVybmVkIGZyb20gYHBhcnNlQXJnYC4KICAgKiBlLmcuIGZvciBgZm9vLmJhci4qYDoKICAgKiBgYGAKICAgKiB0cmlnZ2VyOiB7CiAgICogICBuYW1lOiAnYS5iJywKICAgKiAgIHN0cnVjdHVyZWQ6IHRydWUsCiAgICogICB3aWxkY2FyZDogdHJ1ZQogICAqIH0KICAgKiBgYGAKICAgKiBJZiBubyB0cmlnZ2VyIGlzIGdpdmVuLCB0aGUgcGF0aCBpcyBkZWVtZWQgdG8gbWF0Y2guCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIG9yIHByb3BlcnR5IHRoYXQgY2hhbmdlZAogICAqIEBwYXJhbSB7RGF0YVRyaWdnZXJ9IHRyaWdnZXIgRGVzY3JpcHRvcgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHBhdGggbWF0Y2hlZCB0aGUgdHJpZ2dlcgogICAqLwogIGZ1bmN0aW9uIHBhdGhNYXRjaGVzVHJpZ2dlcihwYXRoLCB0cmlnZ2VyKSB7CiAgICBpZiAodHJpZ2dlcikgewogICAgICBsZXQgdHJpZ2dlclBhdGggPSB0cmlnZ2VyLm5hbWU7CiAgICAgIHJldHVybiAodHJpZ2dlclBhdGggPT0gcGF0aCkgfHwKICAgICAgICAodHJpZ2dlci5zdHJ1Y3R1cmVkICYmIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKHRyaWdnZXJQYXRoLCBwYXRoKSkgfHwKICAgICAgICAodHJpZ2dlci53aWxkY2FyZCAmJiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KHRyaWdnZXJQYXRoLCBwYXRoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJvYnNlcnZlciIgZWZmZWN0LgogICAqCiAgICogQ2FsbHMgdGhlIG1ldGhvZCB3aXRoIGBpbmZvLm1ldGhvZE5hbWVgIG9uIHRoZSBpbnN0YW5jZSwgcGFzc2luZyB0aGUKICAgKiBuZXcgYW5kIG9sZCB2YWx1ZXMuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk9ic2VydmVyRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCBmbiA9IHR5cGVvZiBpbmZvLm1ldGhvZCA9PT0gInN0cmluZyIgPyBpbnN0W2luZm8ubWV0aG9kXSA6IGluZm8ubWV0aG9kOwogICAgbGV0IGNoYW5nZWRQcm9wID0gaW5mby5wcm9wZXJ0eTsKICAgIGlmIChmbikgewogICAgICBmbi5jYWxsKGluc3QsIGluc3QuX19kYXRhW2NoYW5nZWRQcm9wXSwgb2xkUHJvcHNbY2hhbmdlZFByb3BdKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2Fybignb2JzZXJ2ZXIgbWV0aG9kIGAnICsgaW5mby5tZXRob2QgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgfQogIH0KCiAgLyoqCiAgICogUnVucyAibm90aWZ5IiBlZmZlY3RzIGZvciBhIHNldCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gdGhlIGdlbmVyaWMgYHJ1bkVmZmVjdHNgIG1ldGhvZCBpbiB0aGF0IGl0CiAgICogd2lsbCBkaXNwYXRjaCBwYXRoIG5vdGlmaWNhdGlvbiBldmVudHMgaW4gdGhlIGNhc2UgdGhhdCB0aGUgcHJvcGVydHkKICAgKiBjaGFuZ2VkIHdhcyBhIHBhdGggYW5kIHRoZSByb290IHByb3BlcnR5IGZvciB0aGF0IHBhdGggZGlkbid0IGhhdmUgYQogICAqICJub3RpZnkiIGVmZmVjdC4gIFRoaXMgaXMgdG8gbWFpbnRhaW4gMS4wIGJlaGF2aW9yIHRoYXQgZGlkIG5vdCByZXF1aXJlCiAgICogYG5vdGlmeTogdHJ1ZWAgdG8gZW5zdXJlIG9iamVjdCBzdWItcHJvcGVydHkgbm90aWZpY2F0aW9ucyB3ZXJlCiAgICogc2VudC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gbm90aWZ5UHJvcHMgQmFnIG9mIHByb3BlcnRpZXMgdG8gbm90aWZ5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3RzKGluc3QsIG5vdGlmeVByb3BzLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAvLyBOb3RpZnkKICAgIGxldCBmeHMgPSBpbnN0W1RZUEVTLk5PVElGWV07CiAgICBsZXQgbm90aWZpZWQ7CiAgICBsZXQgaWQgPSBkZWR1cGVJZCsrOwogICAgLy8gVHJ5IG5vcm1hbCBub3RpZnkgZWZmZWN0czsgaWYgbm9uZSwgZmFsbCBiYWNrIHRvIHRyeSBwYXRoIG5vdGlmaWNhdGlvbgogICAgZm9yIChsZXQgcHJvcCBpbiBub3RpZnlQcm9wcykgewogICAgICBpZiAobm90aWZ5UHJvcHNbcHJvcF0pIHsKICAgICAgICBpZiAoZnhzICYmIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBmeHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoaGFzUGF0aHMgJiYgbm90aWZ5UGF0aChpbnN0LCBwcm9wLCBwcm9wcykpIHsKICAgICAgICAgIG5vdGlmaWVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vIEZsdXNoIGhvc3QgaWYgd2UgYWN0dWFsbHkgbm90aWZpZWQgYW5kIGhvc3Qgd2FzIGJhdGNoaW5nCiAgICAvLyBBbmQgdGhlIGhvc3QgaGFzIGFscmVhZHkgaW5pdGlhbGl6ZWQgY2xpZW50czsgdGhpcyBwcmV2ZW50cwogICAgLy8gYW4gaXNzdWUgd2l0aCBhIGhvc3Qgb2JzZXJ2aW5nIGRhdGEgY2hhbmdlcyBiZWZvcmUgY2xpZW50cyBhcmUgcmVhZHkuCiAgICBsZXQgaG9zdDsKICAgIGlmIChub3RpZmllZCAmJiAoaG9zdCA9IGluc3QuX19kYXRhSG9zdCkgJiYgaG9zdC5faW52YWxpZGF0ZVByb3BlcnRpZXMpIHsKICAgICAgaG9zdC5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgIH0KICB9CgogIC8qKgogICAqIERpc3BhdGNoZXMge3Byb3BlcnR5fS1jaGFuZ2VkIGV2ZW50cyB3aXRoIHBhdGggaW5mb3JtYXRpb24gaW4gdGhlIGRldGFpbAogICAqIG9iamVjdCB0byBpbmRpY2F0ZSBhIHN1Yi1wYXRoIG9mIHRoZSBwcm9wZXJ0eSB3YXMgY2hhbmdlZC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGVsZW1lbnQgZnJvbSB3aGljaCB0byBmaXJlIHRoZSBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRoYXQgd2FzIGNoYW5nZWQKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aCB3YXMgbm90aWZpZWQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIG5vdGlmeVBhdGgoaW5zdCwgcGF0aCwgcHJvcHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBQb2x5bWVyLlBhdGgucm9vdChwYXRoKTsKICAgIGlmIChyb290UHJvcGVydHkgIT09IHBhdGgpIHsKICAgICAgbGV0IGV2ZW50TmFtZSA9IFBvbHltZXIuQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2Uocm9vdFByb3BlcnR5KSArICctY2hhbmdlZCc7CiAgICAgIGRpc3BhdGNoTm90aWZ5RXZlbnQoaW5zdCwgZXZlbnROYW1lLCBwcm9wc1twYXRoXSwgcGF0aCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHRvIGluZGljYXRlIGEgcHJvcGVydHkgKG9yIHBhdGgpCiAgICogY2hhbmdlZC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGVsZW1lbnQgZnJvbSB3aGljaCB0byBmaXJlIHRoZSBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQgKCd7cHJvcGVydHl9LWNoYW5nZWQnKQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5CiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXRoIElmIGEgc3ViLXBhdGggb2YgdGhpcyBwcm9wZXJ0eSBjaGFuZ2VkLCB0aGUgcGF0aAogICAqICAgdGhhdCBjaGFuZ2VkIChvcHRpb25hbCkuCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAqLwogIGZ1bmN0aW9uIGRpc3BhdGNoTm90aWZ5RXZlbnQoaW5zdCwgZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCkgewogICAgbGV0IGRldGFpbCA9IHsKICAgICAgdmFsdWU6IHZhbHVlLAogICAgICBxdWV1ZVByb3BlcnR5OiB0cnVlCiAgICB9OwogICAgaWYgKHBhdGgpIHsKICAgICAgZGV0YWlsLnBhdGggPSBwYXRoOwogICAgfQogICAgLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKGluc3QpLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBkZXRhaWwgfSkpOwogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm5vdGlmeSIgZWZmZWN0LgogICAqCiAgICogRGlzcGF0Y2hlcyBhIG5vbi1idWJibGluZyBldmVudCBuYW1lZCBgaW5mby5ldmVudE5hbWVgIG9uIHRoZSBpbnN0YW5jZQogICAqIHdpdGggYSBkZXRhaWwgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5ldyBgdmFsdWVgLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHs/fSBpbmZvIEVmZmVjdCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBwcm9wc2AgY29udGFpbnMgb25lIG9yIG1vcmUgcGF0aHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuTm90aWZ5RWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8sIGhhc1BhdGhzKSB7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wZXJ0eSkgOiBwcm9wZXJ0eTsKICAgIGxldCBwYXRoID0gcm9vdFByb3BlcnR5ICE9IHByb3BlcnR5ID8gcHJvcGVydHkgOiBudWxsOwogICAgbGV0IHZhbHVlID0gcGF0aCA/IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCkgOiBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAocGF0aCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gcHJvcHNbcHJvcGVydHldOyAgLy8gc3BlY2lmaWNhbGx5IGZvciAuc3BsaWNlcwogICAgfQogICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBpbmZvLmV2ZW50TmFtZSwgdmFsdWUsIHBhdGgpOwogIH0KCiAgLyoqCiAgICogSGFuZGxlciBmdW5jdGlvbiBmb3IgMi13YXkgbm90aWZpY2F0aW9uIGV2ZW50cy4gUmVjZWl2ZXMgY29udGV4dAogICAqIGluZm9ybWF0aW9uIGNhcHR1cmVkIGluIHRoZSBgYWRkTm90aWZ5TGlzdGVuZXJgIGNsb3N1cmUgZnJvbSB0aGUKICAgKiBgX19ub3RpZnlMaXN0ZW5lcnNgIG1ldGFkYXRhLgogICAqCiAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5vdGlmaWVkIHByb3BlcnR5IHRvIHRoZSBob3N0IHByb3BlcnR5IG9yIHBhdGguICBJZgogICAqIHRoZSBldmVudCBjb250YWluZWQgcGF0aCBpbmZvcm1hdGlvbiwgdHJhbnNsYXRlIHRoYXQgcGF0aCB0byB0aGUgaG9zdAogICAqIHNjb3BlJ3MgbmFtZSBmb3IgdGhhdCBwYXRoIGZpcnN0LgogICAqCiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgTm90aWZpY2F0aW9uIGV2ZW50IChlLmcuICc8cHJvcGVydHk+LWNoYW5nZWQnKQogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIGhhbmRsaW5nIHRoZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVByb3AgQ2hpbGQgZWxlbWVudCBwcm9wZXJ0eSB0aGF0IHdhcyBib3VuZAogICAqIEBwYXJhbSB7c3RyaW5nfSB0b1BhdGggSG9zdCBwcm9wZXJ0eS9wYXRoIHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtib29sZWFufSBuZWdhdGUgV2hldGhlciB0aGUgYmluZGluZyB3YXMgbmVnYXRlZAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBoYW5kbGVOb3RpZmljYXRpb24oZXZlbnQsIGluc3QsIGZyb21Qcm9wLCB0b1BhdGgsIG5lZ2F0ZSkgewogICAgbGV0IHZhbHVlOwogICAgbGV0IGRldGFpbCA9IC8qKiBAdHlwZSB7T2JqZWN0fSAqLyhldmVudC5kZXRhaWwpOwogICAgbGV0IGZyb21QYXRoID0gZGV0YWlsICYmIGRldGFpbC5wYXRoOwogICAgaWYgKGZyb21QYXRoKSB7CiAgICAgIHRvUGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUoZnJvbVByb3AsIHRvUGF0aCwgZnJvbVBhdGgpOwogICAgICB2YWx1ZSA9IGRldGFpbCAmJiBkZXRhaWwudmFsdWU7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXRbZnJvbVByb3BdOwogICAgfQogICAgdmFsdWUgPSBuZWdhdGUgPyAhdmFsdWUgOiB2YWx1ZTsKICAgIGlmICghaW5zdFtUWVBFUy5SRUFEX09OTFldIHx8ICFpbnN0W1RZUEVTLlJFQURfT05MWV1bdG9QYXRoXSkgewogICAgICBpZiAoaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHRvUGF0aCwgdmFsdWUsIHRydWUsIEJvb2xlYW4oZnJvbVBhdGgpKQogICAgICAgICYmICghZGV0YWlsIHx8ICFkZXRhaWwucXVldWVQcm9wZXJ0eSkpIHsKICAgICAgICBpbnN0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAicmVmbGVjdCIgZWZmZWN0LgogICAqCiAgICogU2V0cyB0aGUgYXR0cmlidXRlIG5hbWVkIGBpbmZvLmF0dHJOYW1lYCB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgdmFsdWUuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1blJlZmxlY3RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IHZhbHVlID0gaW5zdC5fX2RhdGFbcHJvcGVydHldOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgaW5mby5hdHRyTmFtZSwgJ2F0dHJpYnV0ZScsIC8qKiBAdHlwZSB7Tm9kZX0gKi8oaW5zdCkpOwogICAgfQogICAgaW5zdC5fcHJvcGVydHlUb0F0dHJpYnV0ZShwcm9wZXJ0eSwgaW5mby5hdHRyTmFtZSwgdmFsdWUpOwogIH0KCiAgLyoqCiAgICogUnVucyAiY29tcHV0ZWQiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiBjb250aW51ZXMgdG8gcnVuIGNvbXB1dGVkIGVmZmVjdHMgYmFzZWQgb24gdGhlIG91dHB1dCBvZiBlYWNoIHBhc3MgdW50aWwKICAgKiB0aGVyZSBhcmUgbm8gbW9yZSBuZXdseSBjb21wdXRlZCBwcm9wZXJ0aWVzLiAgVGhpcyBlbnN1cmVzIHRoYXQgYWxsCiAgICogcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgY29tcHV0ZWQgYnkgdGhlIGluaXRpYWwgc2V0IG9mIGNoYW5nZXMgYXJlCiAgICogY29tcHV0ZWQgYmVmb3JlIG90aGVyIGVmZmVjdHMgKGJpbmRpbmcgcHJvcGFnYXRpb24sIG9ic2VydmVycywgYW5kIG5vdGlmeSkKICAgKiBydW4uCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHshT2JqZWN0fSBjaGFuZ2VkUHJvcHMgQmFnIG9mIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Db21wdXRlZEVmZmVjdHMoaW5zdCwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIGxldCBjb21wdXRlRWZmZWN0cyA9IGluc3RbVFlQRVMuQ09NUFVURV07CiAgICBpZiAoY29tcHV0ZUVmZmVjdHMpIHsKICAgICAgbGV0IGlucHV0UHJvcHMgPSBjaGFuZ2VkUHJvcHM7CiAgICAgIHdoaWxlIChydW5FZmZlY3RzKGluc3QsIGNvbXB1dGVFZmZlY3RzLCBpbnB1dFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgT2JqZWN0LmFzc2lnbihvbGRQcm9wcywgaW5zdC5fX2RhdGFPbGQpOwogICAgICAgIE9iamVjdC5hc3NpZ24oY2hhbmdlZFByb3BzLCBpbnN0Ll9fZGF0YVBlbmRpbmcpOwogICAgICAgIGlucHV0UHJvcHMgPSBpbnN0Ll9fZGF0YVBlbmRpbmc7CiAgICAgICAgaW5zdC5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgImNvbXB1dGVkIHByb3BlcnR5IiBlZmZlY3QgYnkgcnVubmluZyB0aGUgbWV0aG9kIHdpdGggdGhlCiAgICogdmFsdWVzIG9mIHRoZSBhcmd1bWVudHMgc3BlY2lmaWVkIGluIHRoZSBgaW5mb2Agb2JqZWN0IGFuZCBzZXR0aW5nIHRoZQogICAqIHJldHVybiB2YWx1ZSB0byB0aGUgY29tcHV0ZWQgcHJvcGVydHkgc3BlY2lmaWVkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHs/fSBpbmZvIEVmZmVjdCBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Db21wdXRlZEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgcmVzdWx0ID0gcnVuTWV0aG9kRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pOwogICAgbGV0IGNvbXB1dGVkUHJvcCA9IGluZm8ubWV0aG9kSW5mbzsKICAgIGlmIChpbnN0Ll9fZGF0YUhhc0FjY2Vzc29yICYmIGluc3QuX19kYXRhSGFzQWNjZXNzb3JbY29tcHV0ZWRQcm9wXSkgewogICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkoY29tcHV0ZWRQcm9wLCByZXN1bHQsIHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgaW5zdFtjb21wdXRlZFByb3BdID0gcmVzdWx0OwogICAgfQogIH0KCiAgLyoqCiAgICogQ29tcHV0ZXMgcGF0aCBjaGFuZ2VzIGJhc2VkIG9uIHBhdGggbGlua3Mgc2V0IHVwIHVzaW5nIHRoZSBgbGlua1BhdGhzYAogICAqIEFQSS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdob3NlIHByb3BzIGFyZSBjaGFuZ2luZwogICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PChzdHJpbmd8bnVtYmVyKT59IHBhdGggUGF0aCB0aGF0IGhhcyBjaGFuZ2VkCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSBvZiBjaGFuZ2VkIHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY29tcHV0ZUxpbmtlZFBhdGhzKGluc3QsIHBhdGgsIHZhbHVlKSB7CiAgICBsZXQgbGlua3MgPSBpbnN0Ll9fZGF0YUxpbmtlZFBhdGhzOwogICAgaWYgKGxpbmtzKSB7CiAgICAgIGxldCBsaW5rOwogICAgICBmb3IgKGxldCBhIGluIGxpbmtzKSB7CiAgICAgICAgbGV0IGIgPSBsaW5rc1thXTsKICAgICAgICBpZiAoUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudChhLCBwYXRoKSkgewogICAgICAgICAgbGluayA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUoYSwgYiwgcGF0aCk7CiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobGluaywgdmFsdWUsIHRydWUsIHRydWUpOwogICAgICAgIH0gZWxzZSBpZiAoUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudChiLCBwYXRoKSkgewogICAgICAgICAgbGluayA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUoYiwgYSwgcGF0aCk7CiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobGluaywgdmFsdWUsIHRydWUsIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8gLS0gYmluZGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIGJpbmRpbmcgbWV0YWRhdGEgdG8gdGhlIGN1cnJlbnQgYG5vZGVJbmZvYCwgYW5kIGJpbmRpbmcgZWZmZWN0cwogICAqIGZvciBhbGwgcGFydCBkZXBlbmRlbmNpZXMgdG8gYHRlbXBsYXRlSW5mb2AuCiAgICoKICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBDbGFzcyB0aGF0IGBfcGFyc2VUZW1wbGF0ZWAgaXMgY3VycmVudGx5CiAgICogICBydW5uaW5nIG9uCiAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kIEJpbmRpbmcga2luZCwgZWl0aGVyICdwcm9wZXJ0eScsICdhdHRyaWJ1dGUnLCBvciAndGV4dCcKICAgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IFRhcmdldCBwcm9wZXJ0eSBuYW1lCiAgICogQHBhcmFtIHshQXJyYXk8IUJpbmRpbmdQYXJ0Pn0gcGFydHMgQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmc9fSBsaXRlcmFsIExpdGVyYWwgdGV4dCBzdXJyb3VuZGluZyBiaW5kaW5nIHBhcnRzIChzcGVjaWZpZWQKICAgKiAgIG9ubHkgZm9yICdwcm9wZXJ0eScgYmluZGluZ3MsIHNpbmNlIHRoZXNlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYXMgcGFydAogICAqICAgb2YgYm9vdC11cCkKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gYWRkQmluZGluZyhjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgdGFyZ2V0LCBwYXJ0cywgbGl0ZXJhbCkgewogICAgLy8gQ3JlYXRlIGJpbmRpbmcgbWV0YWRhdGEgYW5kIGFkZCB0byBub2RlSW5mbwogICAgbm9kZUluZm8uYmluZGluZ3MgPSBub2RlSW5mby5iaW5kaW5ncyB8fCBbXTsKICAgIGxldCAvKiogQmluZGluZyAqLyBiaW5kaW5nID0geyBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsLCBpc0NvbXBvdW5kOiAocGFydHMubGVuZ3RoICE9PSAxKSB9OwogICAgbm9kZUluZm8uYmluZGluZ3MucHVzaChiaW5kaW5nKTsKICAgIC8vIEFkZCBsaXN0ZW5lciBpbmZvIHRvIGJpbmRpbmcgbWV0YWRhdGEKICAgIGlmIChzaG91bGRBZGRMaXN0ZW5lcihiaW5kaW5nKSkgewogICAgICBsZXQge2V2ZW50LCBuZWdhdGV9ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgYmluZGluZy5saXN0ZW5lckV2ZW50ID0gZXZlbnQgfHwgKENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHRhcmdldCkgKyAnLWNoYW5nZWQnKTsKICAgICAgYmluZGluZy5saXN0ZW5lck5lZ2F0ZSA9IG5lZ2F0ZTsKICAgIH0KICAgIC8vIEFkZCAicHJvcGFnYXRlIiBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRlbXBsYXRlSW5mbwogICAgbGV0IGluZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5sZW5ndGg7CiAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZy5wYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBsZXQgcGFydCA9IGJpbmRpbmcucGFydHNbaV07CiAgICAgIHBhcnQuY29tcG91bmRJbmRleCA9IGk7CiAgICAgIGFkZEVmZmVjdEZvckJpbmRpbmdQYXJ0KGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIGJpbmRpbmcsIHBhcnQsIGluZGV4KTsKICAgIH0KICB9CgogIC8qKgogICAqIEFkZHMgcHJvcGVydHkgZWZmZWN0cyB0byB0aGUgZ2l2ZW4gYHRlbXBsYXRlSW5mb2AgZm9yIHRoZSBnaXZlbiBiaW5kaW5nCiAgICogcGFydC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHshQmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHBhcmFtIHshQmluZGluZ1BhcnR9IHBhcnQgQmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IGludG8gYG5vZGVJbmZvTGlzdGAgZm9yIHRoaXMgbm9kZQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpIHsKICAgIGlmICghcGFydC5saXRlcmFsKSB7CiAgICAgIGlmIChiaW5kaW5nLmtpbmQgPT09ICdhdHRyaWJ1dGUnICYmIGJpbmRpbmcudGFyZ2V0WzBdID09PSAnLScpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzZXQgYXR0cmlidXRlICcgKyBiaW5kaW5nLnRhcmdldCArCiAgICAgICAgICAnIGJlY2F1c2UgIi0iIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZSBzdGFydGluZyBjaGFyYWN0ZXInKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgZGVwZW5kZW5jaWVzID0gcGFydC5kZXBlbmRlbmNpZXM7CiAgICAgICAgbGV0IGluZm8gPSB7IGluZGV4LCBiaW5kaW5nLCBwYXJ0LCBldmFsdWF0b3I6IGNvbnN0cnVjdG9yIH07CiAgICAgICAgZm9yIChsZXQgaj0wOyBqPGRlcGVuZGVuY2llcy5sZW5ndGg7IGorKykgewogICAgICAgICAgbGV0IHRyaWdnZXIgPSBkZXBlbmRlbmNpZXNbal07CiAgICAgICAgICBpZiAodHlwZW9mIHRyaWdnZXIgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgdHJpZ2dlciA9IHBhcnNlQXJnKHRyaWdnZXIpOwogICAgICAgICAgICB0cmlnZ2VyLndpbGRjYXJkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0cnVjdG9yLl9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0KHRlbXBsYXRlSW5mbywgdHJpZ2dlci5yb290UHJvcGVydHksIHsKICAgICAgICAgICAgZm46IHJ1bkJpbmRpbmdFZmZlY3QsCiAgICAgICAgICAgIGluZm8sIHRyaWdnZXIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgImJpbmRpbmciIChwcm9wZXJ0eS9wYXRoIGJpbmRpbmcpIGVmZmVjdC4KICAgKgogICAqIE5vdGUgdGhhdCBiaW5kaW5nIHN5bnRheCBpcyBvdmVycmlkYWJsZSB2aWEgYF9wYXJzZUJpbmRpbmdzYCBhbmQKICAgKiBgX2V2YWx1YXRlQmluZGluZ2AuICBUaGlzIG1ldGhvZCB3aWxsIGNhbGwgYF9ldmFsdWF0ZUJpbmRpbmdgIGZvciBhbnkKICAgKiBub24tbGl0ZXJhbCBwYXJ0cyByZXR1cm5lZCBmcm9tIGBfcGFyc2VCaW5kaW5nc2AuICBIb3dldmVyLAogICAqIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIF9wYXRoXyBiaW5kaW5ncyB2aWEgY3VzdG9tIGJpbmRpbmcgcGFydHMsCiAgICogYXMgdGhpcyBpcyBzcGVjaWZpYyB0byBQb2x5bWVyJ3MgcGF0aCBiaW5kaW5nIHN5bnRheC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBOYW1lIG9mIHByb3BlcnR5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHs/fSBpbmZvIEVmZmVjdCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBwcm9wc2AgY29udGFpbnMgb25lIG9yIG1vcmUgcGF0aHMKICAgKiBAcGFyYW0ge0FycmF5fSBub2RlTGlzdCBMaXN0IG9mIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBgbm9kZUluZm9MaXN0YCB0ZW1wbGF0ZQogICAqICAgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuQmluZGluZ0VmZmVjdChpbnN0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGluZm8sIGhhc1BhdGhzLCBub2RlTGlzdCkgewogICAgbGV0IG5vZGUgPSBub2RlTGlzdFtpbmZvLmluZGV4XTsKICAgIGxldCBiaW5kaW5nID0gaW5mby5iaW5kaW5nOwogICAgbGV0IHBhcnQgPSBpbmZvLnBhcnQ7CiAgICAvLyBTdWJwYXRoIG5vdGlmaWNhdGlvbjogdHJhbnNmb3JtIHBhdGggYW5kIHNldCB0byBjbGllbnQKICAgIC8vIGUuZy46IGZvbz0ie3tvYmouc3VifX0iLCBwYXRoOiAnb2JqLnN1Yi5wcm9wJywgc2V0ICdmb28ucHJvcCc9b2JqLnN1Yi5wcm9wCiAgICBpZiAoaGFzUGF0aHMgJiYgcGFydC5zb3VyY2UgJiYgKHBhdGgubGVuZ3RoID4gcGFydC5zb3VyY2UubGVuZ3RoKSAmJgogICAgICAgIChiaW5kaW5nLmtpbmQgPT0gJ3Byb3BlcnR5JykgJiYgIWJpbmRpbmcuaXNDb21wb3VuZCAmJgogICAgICAgIG5vZGUuX19pc1Byb3BlcnR5RWZmZWN0c0NsaWVudCAmJgogICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvcltiaW5kaW5nLnRhcmdldF0pIHsKICAgICAgbGV0IHZhbHVlID0gcHJvcHNbcGF0aF07CiAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKHBhcnQuc291cmNlLCBiaW5kaW5nLnRhcmdldCwgcGF0aCk7CiAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocGF0aCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCB2YWx1ZSA9IGluZm8uZXZhbHVhdG9yLl9ldmFsdWF0ZUJpbmRpbmcoaW5zdCwgcGFydCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgIC8vIFByb3BhZ2F0ZSB2YWx1ZSB0byBjaGlsZAogICAgICBhcHBseUJpbmRpbmdWYWx1ZShpbnN0LCBub2RlLCBiaW5kaW5nLCBwYXJ0LCB2YWx1ZSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYW4gImJpbmRpbmciIChiaW5kaW5nKSBlZmZlY3QgdG8gYSBub2RlLAogICAqIGVpdGhlciBhcyBhIHByb3BlcnR5IG9yIGF0dHJpYnV0ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIG93bmluZyB0aGUgYmluZGluZyBlZmZlY3QKICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgVGFyZ2V0IG5vZGUgZm9yIGJpbmRpbmcKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhcHBseUJpbmRpbmdWYWx1ZShpbnN0LCBub2RlLCBiaW5kaW5nLCBwYXJ0LCB2YWx1ZSkgewogICAgdmFsdWUgPSBjb21wdXRlQmluZGluZ1ZhbHVlKG5vZGUsIHZhbHVlLCBiaW5kaW5nLCBwYXJ0KTsKICAgIGlmIChQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUpIHsKICAgICAgdmFsdWUgPSBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUodmFsdWUsIGJpbmRpbmcudGFyZ2V0LCBiaW5kaW5nLmtpbmQsIG5vZGUpOwogICAgfQogICAgaWYgKGJpbmRpbmcua2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBBdHRyaWJ1dGUgYmluZGluZwogICAgICBpbnN0Ll92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovKG5vZGUpLCB2YWx1ZSwgYmluZGluZy50YXJnZXQpOwogICAgfSBlbHNlIHsKICAgICAgLy8gUHJvcGVydHkgYmluZGluZwogICAgICBsZXQgcHJvcCA9IGJpbmRpbmcudGFyZ2V0OwogICAgICBpZiAobm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgICBub2RlLl9fZGF0YUhhc0FjY2Vzc29yICYmIG5vZGUuX19kYXRhSGFzQWNjZXNzb3JbcHJvcF0pIHsKICAgICAgICBpZiAoIW5vZGVbVFlQRVMuUkVBRF9PTkxZXSB8fCAhbm9kZVtUWVBFUy5SRUFEX09OTFldW3Byb3BdKSB7CiAgICAgICAgICBpZiAobm9kZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHZhbHVlKSkgewogICAgICAgICAgICBpbnN0Ll9lbnF1ZXVlQ2xpZW50KG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlICB7CiAgICAgICAgaW5zdC5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBUcmFuc2Zvcm1zIGFuICJiaW5kaW5nIiBlZmZlY3QgdmFsdWUgYmFzZWQgb24gY29tcG91bmQgJiBuZWdhdGlvbgogICAqIGVmZmVjdCBtZXRhZGF0YSwgYXMgd2VsbCBhcyBoYW5kbGluZyBmb3Igc3BlY2lhbC1jYXNlIHByb3BlcnRpZXMKICAgKgogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRoZSB2YWx1ZSB3aWxsIGJlIHNldCB0bwogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHBhcmFtIHshQmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHBhcmFtIHshQmluZGluZ1BhcnR9IHBhcnQgQmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gVHJhbnNmb3JtZWQgdmFsdWUgdG8gc2V0CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlQmluZGluZ1ZhbHVlKG5vZGUsIHZhbHVlLCBiaW5kaW5nLCBwYXJ0KSB7CiAgICBpZiAoYmluZGluZy5pc0NvbXBvdW5kKSB7CiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2VbYmluZGluZy50YXJnZXRdOwogICAgICBzdG9yYWdlW3BhcnQuY29tcG91bmRJbmRleF0gPSB2YWx1ZTsKICAgICAgdmFsdWUgPSBzdG9yYWdlLmpvaW4oJycpOwogICAgfQogICAgaWYgKGJpbmRpbmcua2luZCAhPT0gJ2F0dHJpYnV0ZScpIHsKICAgICAgLy8gU29tZSBicm93c2VycyBzZXJpYWxpemUgYHVuZGVmaW5lZGAgdG8gYCJ1bmRlZmluZWQiYAogICAgICBpZiAoYmluZGluZy50YXJnZXQgPT09ICd0ZXh0Q29udGVudCcgfHwKICAgICAgICAgIChiaW5kaW5nLnRhcmdldCA9PT0gJ3ZhbHVlJyAmJgogICAgICAgICAgICAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgfHwgbm9kZS5sb2NhbE5hbWUgPT09ICd0ZXh0YXJlYScpKSkgewogICAgICAgIHZhbHVlID0gdmFsdWUgPT0gdW5kZWZpbmVkID8gJycgOiB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGEgYmluZGluZydzIG1ldGFkYXRhIG1lZXRzIGFsbCB0aGUgcmVxdWlyZW1lbnRzIHRvIGFsbG93CiAgICogMi13YXkgYmluZGluZywgYW5kIHRoZXJlZm9yZSBhIGA8cHJvcGVydHk+LWNoYW5nZWRgIGV2ZW50IGxpc3RlbmVyIHNob3VsZCBiZQogICAqIGFkZGVkOgogICAqIC0gdXNlZCBjdXJseSBicmFjZXMKICAgKiAtIGlzIGEgcHJvcGVydHkgKG5vdCBhdHRyaWJ1dGUpIGJpbmRpbmcKICAgKiAtIGlzIG5vdCBhIHRleHRDb250ZW50IGJpbmRpbmcKICAgKiAtIGlzIG5vdCBjb21wb3VuZAogICAqCiAgICogQHBhcmFtIHshQmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiAyLXdheSBsaXN0ZW5lciBzaG91bGQgYmUgYWRkZWQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpIHsKICAgIHJldHVybiBCb29sZWFuKGJpbmRpbmcudGFyZ2V0KSAmJgogICAgICAgICAgIGJpbmRpbmcua2luZCAhPSAnYXR0cmlidXRlJyAmJgogICAgICAgICAgIGJpbmRpbmcua2luZCAhPSAndGV4dCcgJiYKICAgICAgICAgICAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgICAgYmluZGluZy5wYXJ0c1swXS5tb2RlID09PSAneyc7CiAgfQoKICAvKioKICAgKiBTZXR1cCBjb21wb3VuZCBiaW5kaW5nIHN0b3JhZ2Ugc3RydWN0dXJlcywgbm90aWZ5IGxpc3RlbmVycywgYW5kIGRhdGFIb3N0CiAgICogcmVmZXJlbmNlcyBvbnRvIHRoZSBib3VuZCBub2RlTGlzdC4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdGhhdCBiYXMgYmVlbiBwcmV2aW91c2x5IGJvdW5kCiAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBzZXR1cEJpbmRpbmdzKGluc3QsIHRlbXBsYXRlSW5mbykgewogICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgZGF0YUhvc3QsIGFuZCBub3RpZnkgbGlzdGVuZXJzCiAgICBsZXQge25vZGVMaXN0LCBub2RlSW5mb0xpc3R9ID0gdGVtcGxhdGVJbmZvOwogICAgaWYgKG5vZGVJbmZvTGlzdC5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUluZm9MaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IGluZm8gPSBub2RlSW5mb0xpc3RbaV07CiAgICAgICAgbGV0IG5vZGUgPSBub2RlTGlzdFtpXTsKICAgICAgICBsZXQgYmluZGluZ3MgPSBpbmZvLmJpbmRpbmdzOwogICAgICAgIGlmIChiaW5kaW5ncykgewogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBiaW5kaW5nID0gYmluZGluZ3NbaV07CiAgICAgICAgICAgIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpOwogICAgICAgICAgICBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbm9kZS5fX2RhdGFIb3N0ID0gaW5zdDsKICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogSW5pdGlhbGl6ZXMgYF9fZGF0YUNvbXBvdW5kU3RvcmFnZWAgbG9jYWwgc3RvcmFnZSBvbiBhIGJvdW5kIG5vZGUgd2l0aAogICAqIGluaXRpYWwgbGl0ZXJhbCBkYXRhIGZvciBjb21wb3VuZCBiaW5kaW5ncywgYW5kIHNldHMgdGhlIGpvaW5lZAogICAqIGxpdGVyYWwgcGFydHMgdG8gdGhlIGJvdW5kIHByb3BlcnR5LgogICAqCiAgICogV2hlbiBjaGFuZ2VzIHRvIGNvbXBvdW5kIHBhcnRzIG9jY3VyLCB0aGV5IGFyZSBmaXJzdCBzZXQgaW50byB0aGUgY29tcG91bmQKICAgKiBzdG9yYWdlIGFycmF5IGZvciB0aGF0IHByb3BlcnR5LCBhbmQgdGhlbiB0aGUgYXJyYXkgaXMgam9pbmVkIHRvIHJlc3VsdCBpbgogICAqIHRoZSBmaW5hbCB2YWx1ZSBzZXQgdG8gdGhlIHByb3BlcnR5L2F0dHJpYnV0ZS4KICAgKgogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBCb3VuZCBub2RlIHRvIGluaXRpYWxpemUKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBzZXR1cENvbXBvdW5kU3RvcmFnZShub2RlLCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5pc0NvbXBvdW5kKSB7CiAgICAgIC8vIENyZWF0ZSBjb21wb3VuZCBzdG9yYWdlIG1hcAogICAgICBsZXQgc3RvcmFnZSA9IG5vZGUuX19kYXRhQ29tcG91bmRTdG9yYWdlIHx8CiAgICAgICAgKG5vZGUuX19kYXRhQ29tcG91bmRTdG9yYWdlID0ge30pOwogICAgICBsZXQgcGFydHMgPSBiaW5kaW5nLnBhcnRzOwogICAgICAvLyBDb3B5IGxpdGVyYWxzIGZyb20gcGFydHMgaW50byBzdG9yYWdlIGZvciB0aGlzIGJpbmRpbmcKICAgICAgbGV0IGxpdGVyYWxzID0gbmV3IEFycmF5KHBhcnRzLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGo9MDsgajxwYXJ0cy5sZW5ndGg7IGorKykgewogICAgICAgIGxpdGVyYWxzW2pdID0gcGFydHNbal0ubGl0ZXJhbDsKICAgICAgfQogICAgICBsZXQgdGFyZ2V0ID0gYmluZGluZy50YXJnZXQ7CiAgICAgIHN0b3JhZ2VbdGFyZ2V0XSA9IGxpdGVyYWxzOwogICAgICAvLyBDb25maWd1cmUgcHJvcGVydGllcyB3aXRoIHRoZWlyIGxpdGVyYWwgcGFydHMKICAgICAgaWYgKGJpbmRpbmcubGl0ZXJhbCAmJiBiaW5kaW5nLmtpbmQgPT0gJ3Byb3BlcnR5JykgewogICAgICAgIG5vZGVbdGFyZ2V0XSA9IGJpbmRpbmcubGl0ZXJhbDsKICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBhIDItd2F5IGJpbmRpbmcgbm90aWZpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIHNwZWNpZmllZAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG5vZGUgQ2hpbGQgZWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG8KICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IEhvc3QgZWxlbWVudCBpbnN0YW5jZSB0byBoYW5kbGUgbm90aWZpY2F0aW9uIGV2ZW50CiAgICogQHBhcmFtIHtCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gYWRkTm90aWZ5TGlzdGVuZXIobm9kZSwgaW5zdCwgYmluZGluZykgewogICAgaWYgKGJpbmRpbmcubGlzdGVuZXJFdmVudCkgewogICAgICBsZXQgcGFydCA9IGJpbmRpbmcucGFydHNbMF07CiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihiaW5kaW5nLmxpc3RlbmVyRXZlbnQsIGZ1bmN0aW9uKGUpIHsKICAgICAgICBoYW5kbGVOb3RpZmljYXRpb24oZSwgaW5zdCwgYmluZGluZy50YXJnZXQsIHBhcnQuc291cmNlLCBwYXJ0Lm5lZ2F0ZSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gLS0gZm9yIG1ldGhvZC1iYXNlZCBlZmZlY3RzIChjb21wbGV4T2JzZXJ2ZXIgJiBjb21wdXRlZCkgLS0tLS0tLS0tLS0tLS0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIGZvciBlYWNoIGFyZ3VtZW50IGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlIChhbmQKICAgKiBvcHRpb25hbGx5LCBmb3IgdGhlIG1ldGhvZCBuYW1lIGlmIGBkeW5hbWljYCBpcyB0cnVlKSB0aGF0IGNhbGxzIHRoZQogICAqIHByb3ZpZGVkIGVmZmVjdCBmdW5jdGlvbi4KICAgKgogICAqIEBwYXJhbSB7RWxlbWVudCB8IE9iamVjdH0gbW9kZWwgUHJvdG90eXBlIG9yIGluc3RhbmNlCiAgICogQHBhcmFtIHshTWV0aG9kU2lnbmF0dXJlfSBzaWcgTWV0aG9kIHNpZ25hdHVyZSBtZXRhZGF0YQogICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFR5cGUgb2YgcHJvcGVydHkgZWZmZWN0IHRvIGFkZAogICAqIEBwYXJhbSB7RnVuY3Rpb259IGVmZmVjdEZuIEZ1bmN0aW9uIHRvIHJ1biB3aGVuIGFyZ3VtZW50cyBjaGFuZ2UKICAgKiBAcGFyYW0geyo9fSBtZXRob2RJbmZvIEVmZmVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBiZSBpbmNsdWRlZCBpbgogICAqICAgbWV0aG9kIGVmZmVjdCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcgd2hldGhlcgogICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4gTm90ZSwKICAgKiAgIGRlZmF1bHRzIHRvIHRydWUgaWYgdGhlIHNpZ25hdHVyZSBpcyBzdGF0aWMgKHNpZy5zdGF0aWMgaXMgdHJ1ZSkuCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZEVmZmVjdChtb2RlbCwgc2lnLCB0eXBlLCBlZmZlY3RGbiwgbWV0aG9kSW5mbywgZHluYW1pY0ZuKSB7CiAgICBkeW5hbWljRm4gPSBzaWcuc3RhdGljIHx8IChkeW5hbWljRm4gJiYKICAgICAgKHR5cGVvZiBkeW5hbWljRm4gIT09ICdvYmplY3QnIHx8IGR5bmFtaWNGbltzaWcubWV0aG9kTmFtZV0pKTsKICAgIGxldCBpbmZvID0gewogICAgICBtZXRob2ROYW1lOiBzaWcubWV0aG9kTmFtZSwKICAgICAgYXJnczogc2lnLmFyZ3MsCiAgICAgIG1ldGhvZEluZm8sCiAgICAgIGR5bmFtaWNGbgogICAgfTsKICAgIGZvciAobGV0IGk9MCwgYXJnOyAoaTxzaWcuYXJncy5sZW5ndGgpICYmIChhcmc9c2lnLmFyZ3NbaV0pOyBpKyspIHsKICAgICAgaWYgKCFhcmcubGl0ZXJhbCkgewogICAgICAgIG1vZGVsLl9hZGRQcm9wZXJ0eUVmZmVjdChhcmcucm9vdFByb3BlcnR5LCB0eXBlLCB7CiAgICAgICAgICBmbjogZWZmZWN0Rm4sIGluZm86IGluZm8sIHRyaWdnZXI6IGFyZwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBpZiAoZHluYW1pY0ZuKSB7CiAgICAgIG1vZGVsLl9hZGRQcm9wZXJ0eUVmZmVjdChzaWcubWV0aG9kTmFtZSwgdHlwZSwgewogICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbwogICAgICB9KTsKICAgIH0KICB9CgogIC8qKgogICAqIENhbGxzIGEgbWV0aG9kIHdpdGggYXJndW1lbnRzIG1hcnNoYWxlZCBmcm9tIHByb3BlcnRpZXMgb24gdGhlIGluc3RhbmNlCiAgICogYmFzZWQgb24gdGhlIG1ldGhvZCBzaWduYXR1cmUgY29udGFpbmVkIGluIHRoZSBlZmZlY3QgbWV0YWRhdGEuCiAgICoKICAgKiBNdWx0aS1wcm9wZXJ0eSBvYnNlcnZlcnMsIGNvbXB1dGVkIHByb3BlcnRpZXMsIGFuZCBpbmxpbmUgY29tcHV0aW5nCiAgICogZnVuY3Rpb25zIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBpbnZva2UgdGhlIG1ldGhvZCwgdGhlbiB1c2UgdGhlIHJldHVybgogICAqIHZhbHVlIGFjY29yZGluZ2x5LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHs/fSBpbmZvIEVmZmVjdCBtZXRhZGF0YQogICAqIEByZXR1cm4geyp9IFJldHVybnMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBtZXRob2QgaW52b2NhdGlvbgogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuTWV0aG9kRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGxldCBjb250ZXh0ID0gaW5zdC5fbWV0aG9kSG9zdCB8fCBpbnN0OwogICAgbGV0IGZuID0gY29udGV4dFtpbmZvLm1ldGhvZE5hbWVdOwogICAgaWYgKGZuKSB7CiAgICAgIGxldCBhcmdzID0gaW5zdC5fbWFyc2hhbEFyZ3MoaW5mby5hcmdzLCBwcm9wZXJ0eSwgcHJvcHMpOwogICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJncyk7CiAgICB9IGVsc2UgaWYgKCFpbmZvLmR5bmFtaWNGbikgewogICAgICBjb25zb2xlLndhcm4oJ21ldGhvZCBgJyArIGluZm8ubWV0aG9kTmFtZSArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICBjb25zdCBlbXB0eUFycmF5ID0gW107CgogIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCBmb3IgYmluZGluZwogIGNvbnN0IElERU5UICA9ICcoPzonICsgJ1thLXpBLVpfJF1bXFx3LjokXFwtKl0qJyArICcpJzsKICBjb25zdCBOVU1CRVIgPSAnKD86JyArICdbLStdP1swLTldKlxcLj9bMC05XSsoPzpbZUVdWy0rXT9bMC05XSspPycgKyAnKSc7CiAgY29uc3QgU1FVT1RFX1NUUklORyA9ICcoPzonICsgJ1wnKD86W15cJ1xcXFxdfFxcXFwuKSpcJycgKyAnKSc7CiAgY29uc3QgRFFVT1RFX1NUUklORyA9ICcoPzonICsgJyIoPzpbXiJcXFxcXXxcXFxcLikqIicgKyAnKSc7CiAgY29uc3QgU1RSSU5HID0gJyg/OicgKyBTUVVPVEVfU1RSSU5HICsgJ3wnICsgRFFVT1RFX1NUUklORyArICcpJzsKICBjb25zdCBBUkdVTUVOVCA9ICcoPzooJyArIElERU5UICsgJ3wnICsgTlVNQkVSICsgJ3wnICsgIFNUUklORyArICcpXFxzKicgKyAnKSc7CiAgY29uc3QgQVJHVU1FTlRTID0gJyg/OicgKyBBUkdVTUVOVCArICcoPzosXFxzKicgKyBBUkdVTUVOVCArICcpKicgKyAnKSc7CiAgY29uc3QgQVJHVU1FTlRfTElTVCA9ICcoPzonICsgJ1xcKFxccyonICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKD86JyArIEFSR1VNRU5UUyArICc/JyArICcpJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXClcXHMqJyArICcpJzsKICBjb25zdCBCSU5ESU5HID0gJygnICsgSURFTlQgKyAnXFxzKicgKyBBUkdVTUVOVF9MSVNUICsgJz8nICsgJyknOyAvLyBHcm91cCAzCiAgY29uc3QgT1BFTl9CUkFDS0VUID0gJyhcXFtcXFt8e3spJyArICdcXHMqJzsKICBjb25zdCBDTE9TRV9CUkFDS0VUID0gJyg/Ol1dfH19KSc7CiAgY29uc3QgTkVHQVRFID0gJyg/OighKVxccyopPyc7IC8vIEdyb3VwIDIKICBjb25zdCBFWFBSRVNTSU9OID0gT1BFTl9CUkFDS0VUICsgTkVHQVRFICsgQklORElORyArIENMT1NFX0JSQUNLRVQ7CiAgY29uc3QgYmluZGluZ1JlZ2V4ID0gbmV3IFJlZ0V4cChFWFBSRVNTSU9OLCAiZyIpOwoKICAvKioKICAgKiBDcmVhdGUgYSBzdHJpbmcgZnJvbSBiaW5kaW5nIHBhcnRzIG9mIGFsbCB0aGUgbGl0ZXJhbCBwYXJ0cwogICAqCiAgICogQHBhcmFtIHshQXJyYXk8QmluZGluZ1BhcnQ+fSBwYXJ0cyBBbGwgcGFydHMgdG8gc3RyaW5naWZ5CiAgICogQHJldHVybiB7c3RyaW5nfSBTdHJpbmcgbWFkZSBmcm9tIHRoZSBsaXRlcmFsIHBhcnRzCiAgICovCiAgZnVuY3Rpb24gbGl0ZXJhbEZyb21QYXJ0cyhwYXJ0cykgewogICAgbGV0IHMgPSAnJzsKICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBsZXQgbGl0ZXJhbCA9IHBhcnRzW2ldLmxpdGVyYWw7CiAgICAgIHMgKz0gbGl0ZXJhbCB8fCAnJzsKICAgIH0KICAgIHJldHVybiBzOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGFuIGV4cHJlc3Npb24gc3RyaW5nIGZvciBhIG1ldGhvZCBzaWduYXR1cmUsIGFuZCByZXR1cm5zIGEgbWV0YWRhdGEKICAgKiBkZXNjcmliaW5nIHRoZSBtZXRob2QgaW4gdGVybXMgb2YgYG1ldGhvZE5hbWVgLCBgc3RhdGljYCAod2hldGhlciBhbGwgdGhlCiAgICogYXJndW1lbnRzIGFyZSBsaXRlcmFscyksIGFuZCBhbiBhcnJheSBvZiBgYXJnc2AKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIHBhcnNlCiAgICogQHJldHVybiB7P01ldGhvZFNpZ25hdHVyZX0gVGhlIG1ldGhvZCBtZXRhZGF0YSBvYmplY3QgaWYgYSBtZXRob2QgZXhwcmVzc2lvbiB3YXMKICAgKiAgIGZvdW5kLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlTWV0aG9kKGV4cHJlc3Npb24pIHsKICAgIC8vIHRyaWVzIHRvIG1hdGNoIHZhbGlkIGphdmFzY3JpcHQgcHJvcGVydHkgbmFtZXMKICAgIGxldCBtID0gZXhwcmVzc2lvbi5tYXRjaCgvKFteXHNdKz8pXCgoW1xzXFNdKilcKS8pOwogICAgaWYgKG0pIHsKICAgICAgbGV0IG1ldGhvZE5hbWUgPSBtWzFdOwogICAgICBsZXQgc2lnID0geyBtZXRob2ROYW1lLCBzdGF0aWM6IHRydWUsIGFyZ3M6IGVtcHR5QXJyYXkgfTsKICAgICAgaWYgKG1bMl0udHJpbSgpKSB7CiAgICAgICAgLy8gcmVwbGFjZSBlc2NhcGVkIGNvbW1hcyB3aXRoIGNvbW1hIGVudGl0eSwgc3BsaXQgb24gdW4tZXNjYXBlZCBjb21tYXMKICAgICAgICBsZXQgYXJncyA9IG1bMl0ucmVwbGFjZSgvXFwsL2csICcmY29tbWE7Jykuc3BsaXQoJywnKTsKICAgICAgICByZXR1cm4gcGFyc2VBcmdzKGFyZ3MsIHNpZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHNpZzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIGFuZCBzZXRzIHRoZSBgYXJnc2AgcHJvcGVydHkgb2YgdGhlIHN1cHBsaWVkCiAgICogc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdC4gU2V0cyB0aGUgYHN0YXRpY2AgcHJvcGVydHkgdG8gZmFsc2UgaWYgYW55CiAgICogYXJndW1lbnQgaXMgYSBub24tbGl0ZXJhbC4KICAgKgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IGFyZ0xpc3QgQXJyYXkgb2YgYXJndW1lbnQgbmFtZXMKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEByZXR1cm4geyFNZXRob2RTaWduYXR1cmV9IFRoZSB1cGRhdGVkIHNpZ25hdHVyZSBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJncyhhcmdMaXN0LCBzaWcpIHsKICAgIHNpZy5hcmdzID0gYXJnTGlzdC5tYXAoZnVuY3Rpb24ocmF3QXJnKSB7CiAgICAgIGxldCBhcmcgPSBwYXJzZUFyZyhyYXdBcmcpOwogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgc2lnLnN0YXRpYyA9IGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiBhcmc7CiAgICB9LCB0aGlzKTsKICAgIHJldHVybiBzaWc7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gaW5kaXZpZHVhbCBhcmd1bWVudCwgYW5kIHJldHVybnMgYW4gYXJndW1lbnQgbWV0YWRhdGEgb2JqZWN0CiAgICogd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgKgogICAqICAgewogICAqICAgICB2YWx1ZTogJ3Byb3AnLCAgICAgICAgLy8gcHJvcGVydHkvcGF0aCBvciBsaXRlcmFsIHZhbHVlCiAgICogICAgIGxpdGVyYWw6IGZhbHNlLCAgICAgICAvLyB3aGV0aGVyIGFyZ3VtZW50IGlzIGEgbGl0ZXJhbAogICAqICAgICBzdHJ1Y3R1cmVkOiBmYWxzZSwgICAgLy8gd2hldGhlciB0aGUgcHJvcGVydHkgaXMgYSBwYXRoCiAgICogICAgIHJvb3RQcm9wZXJ0eTogJ3Byb3AnLCAvLyB0aGUgcm9vdCBwcm9wZXJ0eSBvZiB0aGUgcGF0aAogICAqICAgICB3aWxkY2FyZDogZmFsc2UgICAgICAgLy8gd2hldGhlciB0aGUgYXJndW1lbnQgd2FzIGEgd2lsZGNhcmQgJy4qJyBwYXRoCiAgICogICB9CiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3QXJnIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGFyZ3VtZW50CiAgICogQHJldHVybiB7IU1ldGhvZEFyZ30gQXJndW1lbnQgbWV0YWRhdGEgb2JqZWN0CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBwYXJzZUFyZyhyYXdBcmcpIHsKICAgIC8vIGNsZWFuIHVwIHdoaXRlc3BhY2UKICAgIGxldCBhcmcgPSByYXdBcmcudHJpbSgpCiAgICAgIC8vIHJlcGxhY2UgY29tbWEgZW50aXR5IHdpdGggY29tbWEKICAgICAgLnJlcGxhY2UoLyZjb21tYTsvZywgJywnKQogICAgICAvLyByZXBhaXIgZXh0cmEgZXNjYXBlIHNlcXVlbmNlczsgbm90ZSBvbmx5IGNvbW1hcyBzdHJpY3RseSBuZWVkCiAgICAgIC8vIGVzY2FwaW5nLCBidXQgd2UgYWxsb3cgYW55IG90aGVyIGNoYXIgdG8gYmUgZXNjYXBlZCBzaW5jZSBpdHMKICAgICAgLy8gbGlrZWx5IHVzZXJzIHdpbGwgZG8gdGhpcwogICAgICAucmVwbGFjZSgvXFwoLikvZywgJ1wkMScpCiAgICAgIDsKICAgIC8vIGJhc2ljIGFyZ3VtZW50IGRlc2NyaXB0b3IKICAgIGxldCBhID0gewogICAgICBuYW1lOiBhcmcsCiAgICAgIHZhbHVlOiAnJywKICAgICAgbGl0ZXJhbDogZmFsc2UKICAgIH07CiAgICAvLyBkZXRlY3QgbGl0ZXJhbCB2YWx1ZSAobXVzdCBiZSBTdHJpbmcgb3IgTnVtYmVyKQogICAgbGV0IGZjID0gYXJnWzBdOwogICAgaWYgKGZjID09PSAnLScpIHsKICAgICAgZmMgPSBhcmdbMV07CiAgICB9CiAgICBpZiAoZmMgPj0gJzAnICYmIGZjIDw9ICc5JykgewogICAgICBmYyA9ICcjJzsKICAgIH0KICAgIHN3aXRjaChmYykgewogICAgICBjYXNlICInIjoKICAgICAgY2FzZSAnIic6CiAgICAgICAgYS52YWx1ZSA9IGFyZy5zbGljZSgxLCAtMSk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnIyc6CiAgICAgICAgYS52YWx1ZSA9IE51bWJlcihhcmcpOwogICAgICAgIGEubGl0ZXJhbCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICAvLyBpZiBub3QgbGl0ZXJhbCwgbG9vayBmb3Igc3RydWN0dXJlZCBwYXRoCiAgICBpZiAoIWEubGl0ZXJhbCkgewogICAgICBhLnJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KGFyZyk7CiAgICAgIC8vIGRldGVjdCBzdHJ1Y3R1cmVkIHBhdGggKGhhcyBkb3RzKQogICAgICBhLnN0cnVjdHVyZWQgPSBQb2x5bWVyLlBhdGguaXNQYXRoKGFyZyk7CiAgICAgIGlmIChhLnN0cnVjdHVyZWQpIHsKICAgICAgICBhLndpbGRjYXJkID0gKGFyZy5zbGljZSgtMikgPT0gJy4qJyk7CiAgICAgICAgaWYgKGEud2lsZGNhcmQpIHsKICAgICAgICAgIGEubmFtZSA9IGFyZy5zbGljZSgwLCAtMik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gYTsKICB9CgogIC8vIGRhdGEgYXBpCgogIC8qKgogICAqIFNlbmRzIGFycmF5IHNwbGljZSBub3RpZmljYXRpb25zIChgLnNwbGljZXNgIGFuZCBgLmxlbmd0aGApCiAgICoKICAgKiBOb3RlOiB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgYWNjZXB0cyBub3JtYWxpemVkIHBhdGhzCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IEluc3RhbmNlIHRvIHNlbmQgbm90aWZpY2F0aW9ucyB0bwogICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0aGUgbXV0YXRpb25zIG9jY3VycmVkIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gdGhlIGFycmF5IHRoYXQgd2FzIG11dGF0ZWQKICAgKiBAcGFyYW0ge0FycmF5fSBzcGxpY2VzIEFycmF5IG9mIHNwbGljZSByZWNvcmRzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIG5vdGlmeVNwbGljZXMoaW5zdCwgYXJyYXksIHBhdGgsIHNwbGljZXMpIHsKICAgIGxldCBzcGxpY2VzUGF0aCA9IHBhdGggKyAnLnNwbGljZXMnOwogICAgaW5zdC5ub3RpZnlQYXRoKHNwbGljZXNQYXRoLCB7IGluZGV4U3BsaWNlczogc3BsaWNlcyB9KTsKICAgIGluc3Qubm90aWZ5UGF0aChwYXRoICsgJy5sZW5ndGgnLCBhcnJheS5sZW5ndGgpOwogICAgLy8gTnVsbCBoZXJlIHRvIGFsbG93IHBvdGVudGlhbGx5IGxhcmdlIHNwbGljZSByZWNvcmRzIHRvIGJlIEdDJ2VkLgogICAgaW5zdC5fX2RhdGFbc3BsaWNlc1BhdGhdID0ge2luZGV4U3BsaWNlczogbnVsbH07CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgc3BsaWNlIHJlY29yZCBhbmQgc2VuZHMgYW4gYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbiBmb3IKICAgKiB0aGUgZGVzY3JpYmVkIG11dGF0aW9uCiAgICoKICAgKiBOb3RlOiB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgYWNjZXB0cyBub3JtYWxpemVkIHBhdGhzCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IEluc3RhbmNlIHRvIHNlbmQgbm90aWZpY2F0aW9ucyB0bwogICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0aGUgbXV0YXRpb25zIG9jY3VycmVkIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gdGhlIGFycmF5IHRoYXQgd2FzIG11dGF0ZWQKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggYXQgd2hpY2ggdGhlIGFycmF5IG11dGF0aW9uIG9jY3VycmVkCiAgICogQHBhcmFtIHtudW1iZXJ9IGFkZGVkQ291bnQgTnVtYmVyIG9mIGFkZGVkIGl0ZW1zCiAgICogQHBhcmFtIHtBcnJheX0gcmVtb3ZlZCBBcnJheSBvZiByZW1vdmVkIGl0ZW1zCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIG5vdGlmeVNwbGljZShpbnN0LCBhcnJheSwgcGF0aCwgaW5kZXgsIGFkZGVkQ291bnQsIHJlbW92ZWQpIHsKICAgIG5vdGlmeVNwbGljZXMoaW5zdCwgYXJyYXksIHBhdGgsIFt7CiAgICAgIGluZGV4OiBpbmRleCwKICAgICAgYWRkZWRDb3VudDogYWRkZWRDb3VudCwKICAgICAgcmVtb3ZlZDogcmVtb3ZlZCwKICAgICAgb2JqZWN0OiBhcnJheSwKICAgICAgdHlwZTogJ3NwbGljZScKICAgIH1dKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYW4gdXBwZXItY2FzZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgU3RyaW5nIHRvIHVwcGVyY2FzZQogICAqIEByZXR1cm4ge3N0cmluZ30gVXBwZXJjYXNlZCBzdHJpbmcKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHVwcGVyKG5hbWUpIHsKICAgIHJldHVybiBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cmluZygxKTsKICB9CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MgdGVtcGxhdGUKICAgKiBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIChjb2xsZWN0aXZlbHksICJwcm9wZXJ0eSBlZmZlY3RzIikgc3lzdGVtLgogICAqCiAgICogVGhpcyBtaXhpbiB1c2VzIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcga2V5IHN0YXRpYyBtZXRob2RzIGZvciBhZGRpbmcKICAgKiBwcm9wZXJ0eSBlZmZlY3RzIHRvIGFuIGVsZW1lbnQgY2xhc3M6CiAgICogLSBgYWRkUHJvcGVydHlFZmZlY3RgCiAgICogLSBgY3JlYXRlUHJvcGVydHlPYnNlcnZlcmAKICAgKiAtIGBjcmVhdGVNZXRob2RPYnNlcnZlcmAKICAgKiAtIGBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eWAKICAgKiAtIGBjcmVhdGVSZWFkT25seVByb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YAogICAqIC0gYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgCiAgICogLSBgYmluZFRlbXBsYXRlYAogICAqCiAgICogRWFjaCBtZXRob2QgY3JlYXRlcyBvbmUgb3IgbW9yZSBwcm9wZXJ0eSBhY2Nlc3NvcnMsIGFsb25nIHdpdGggbWV0YWRhdGEKICAgKiB1c2VkIGJ5IHRoaXMgbWl4aW4ncyBpbXBsZW1lbnRhdGlvbiBvZiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCB0byBwZXJmb3JtCiAgICogdGhlIHByb3BlcnR5IGVmZmVjdHMuCiAgICoKICAgKiBVbmRlcnNjb3JlZCB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgbWV0aG9kcyBhbHNvIGV4aXN0IG9uIHRoZSBlbGVtZW50CiAgICogcHJvdG90eXBlIGZvciBhZGRpbmcgcHJvcGVydHkgZWZmZWN0cyBvbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KICAgKgogICAqIE5vdGUgdGhhdCB0aGlzIG1peGluIG92ZXJyaWRlcyBzZXZlcmFsIGBQcm9wZXJ0eUFjY2Vzc29yc2AgbWV0aG9kcywgaW4KICAgKiBtYW55IGNhc2VzIHRvIG1haW50YWluIGd1YXJhbnRlZXMgcHJvdmlkZWQgYnkgdGhlIFBvbHltZXIgMS54IGZlYXR1cmVzOwogICAqIG5vdGFibHkgaXQgY2hhbmdlcyBwcm9wZXJ0eSBhY2Nlc3NvcnMgdG8gYmUgc3luY2hyb25vdXMgYnkgZGVmYXVsdAogICAqIHdoZXJlYXMgdGhlIGRlZmF1bHQgd2hlbiB1c2luZyBgUHJvcGVydHlBY2Nlc3NvcnNgIHN0YW5kYWxvbmUgaXMgdG8gYmUKICAgKiBhc3luYyBieSBkZWZhdWx0LgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5UZW1wbGF0ZVN0YW1wCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgbWV0YS1wcm9ncmFtbWluZyBmb3IgUG9seW1lcidzCiAgICogdGVtcGxhdGUgYmluZGluZyBhbmQgZGF0YSBvYnNlcnZhdGlvbiBzeXN0ZW0uCiAgICovCiAgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlBY2Nlc3NvcnN9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9UZW1wbGF0ZVN0YW1wfQogICAgICogQHVucmVzdHJpY3RlZAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgcHJvcGVydHlFZmZlY3RzQmFzZSA9IFBvbHltZXIuVGVtcGxhdGVTdGFtcChQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKHN1cGVyQ2xhc3MpKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlFZmZlY3RzfQogICAgICogQGV4dGVuZHMge3Byb3BlcnR5RWZmZWN0c0Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5RWZmZWN0cyBleHRlbmRzIHByb3BlcnR5RWZmZWN0c0Jhc2UgewoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgLy8gVXNlZCB0byBpZGVudGlmeSB1c2VycyBvZiB0aGlzIG1peGluLCBhbGEgaW5zdGFuY2VvZgogICAgICAgIHRoaXMuX19pc1Byb3BlcnR5RWZmZWN0c0NsaWVudCA9IHRydWU7CiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovCiAgICAgICAgLy8gTk9URTogdXNlZCB0byB0cmFjayByZS1lbnRyYW50IGNhbGxzIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIC8vIHBhdGggY2hhbmdlcyBkaXJ0eSBjaGVjayBhZ2FpbnN0IGBfX2RhdGFUZW1wYCBvbmx5IGR1cmluZyBvbmUgInR1cm4iCiAgICAgICAgLy8gYW5kIGFyZSBjbGVhcmVkIHdoZW4gYF9fZGF0YUNvdW50ZXJgIHJldHVybnMgdG8gMC4KICAgICAgICB0aGlzLl9fZGF0YUNvdW50ZXIgPSAwOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLl9fZGF0YUNsaWVudHNSZWFkeTsKICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLwogICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeTsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhQ29tcG91bmRTdG9yYWdlOwogICAgICAgIC8qKiBAdHlwZSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICAgICAgdGhpcy5fX2RhdGFIb3N0OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRlbXA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YTsKICAgICAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YU9sZDsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fY29tcHV0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3JlZmxlY3RFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19ub3RpZnlFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19wcm9wYWdhdGVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19vYnNlcnZlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVhZE9ubHk7CiAgICAgICAgLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLwogICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIGdldCBQUk9QRVJUWV9FRkZFQ1RfVFlQRVMoKSB7CiAgICAgICAgcmV0dXJuIFRZUEVTOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgICBob3N0U3RhY2sucmVnaXN0ZXJIb3N0KHRoaXMpOwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gZmFsc2U7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IG51bGw7CiAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2RhdGFMaW5rZWRQYXRocyA9IG51bGw7CiAgICAgICAgdGhpcy5fX2RhdGFIYXNQYXRocyA9IGZhbHNlOwogICAgICAgIC8vIE1heSBiZSBzZXQgb24gaW5zdGFuY2UgcHJpb3IgdG8gdXBncmFkZQogICAgICAgIHRoaXMuX19kYXRhQ29tcG91bmRTdG9yYWdlID0gdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwgbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhvc3QgPSB0aGlzLl9fZGF0YUhvc3QgfHwgbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRlbXAgPSB7fTsKICAgICAgICB0aGlzLl9fZGF0YUNsaWVudHNJbml0aWFsaXplZCA9IGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzYCBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGEKICAgICAgICogbW9yZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gb2YgaW5pdGlhbGl6aW5nIHByb3BlcnRpZXMgZnJvbQogICAgICAgKiB0aGUgcHJvdG90eXBlIG9uIHRoZSBpbnN0YW5jZS4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIGluaXRpYWxpemUgb24gdGhlIHByb3RvdHlwZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICB0aGlzLl9fZGF0YSA9IE9iamVjdC5jcmVhdGUocHJvcHMpOwogICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IE9iamVjdC5jcmVhdGUocHJvcHMpOwogICAgICAgIHRoaXMuX19kYXRhT2xkID0ge307CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIGF2b2lkIHNldHRpbmcKICAgICAgICogYF9zZXRQcm9wZXJ0eWAncyBgc2hvdWxkTm90aWZ5OiB0cnVlYC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIGluaXRpYWxpemUgb24gdGhlIGluc3RhbmNlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCByZWFkT25seSA9IHRoaXNbVFlQRVMuUkVBRF9PTkxZXTsKICAgICAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICBpZiAoIXJlYWRPbmx5IHx8ICFyZWFkT25seVtwcm9wXSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB0aGlzLl9fZGF0YVBlbmRpbmcgfHwge307CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gdGhpcy5fX2RhdGFPbGQgfHwge307CiAgICAgICAgICAgIHRoaXMuX19kYXRhW3Byb3BdID0gdGhpcy5fX2RhdGFQZW5kaW5nW3Byb3BdID0gcHJvcHNbcHJvcF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBQcm90b3R5cGUgc2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBhZGRQcm9wZXJ0eUVmZmVjdGAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIHRoaXMuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IocHJvcGVydHksIHR5cGUgPT0gVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgICAvLyBlZmZlY3RzIGFyZSBhY2N1bXVsYXRlZCBpbnRvIGFycmF5cyBwZXIgcHJvcGVydHkgYmFzZWQgb24gdHlwZQogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBpZiAoIWVmZmVjdHMpIHsKICAgICAgICAgIGVmZmVjdHMgPSB0aGlzW3R5cGVdW3Byb3BlcnR5XSA9IFtdOwogICAgICAgIH0KICAgICAgICBlZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIHByb3BlcnR5IGVmZmVjdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoZSBlZmZlY3Qgd2FzIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0IHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZVByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpIHsKICAgICAgICBsZXQgZWZmZWN0cyA9IGVuc3VyZU93bkVmZmVjdE1hcCh0aGlzLCB0eXBlKVtwcm9wZXJ0eV07CiAgICAgICAgbGV0IGlkeCA9IGVmZmVjdHMuaW5kZXhPZihlZmZlY3QpOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgZWZmZWN0cy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhIHByb3BlcnR5IGVmZmVjdAogICAgICAgKiBvZiBhIGNlcnRhaW4gdHlwZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUpIHsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRoaXNbdHlwZV07CiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZWZmZWN0cyAmJiBlZmZlY3RzW3Byb3BlcnR5XSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhICJyZWFkIG9ubHkiCiAgICAgICAqIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzUmVhZE9ubHlFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFQURfT05MWSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhICJub3RpZnkiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc05vdGlmeUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlZmxlY3QgdG8gYXR0cmlidXRlIgogICAgICAgKiBwcm9wZXJ0eSBlZmZlY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWZsZWN0RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNUKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgImNvbXB1dGVkIgogICAgICAgKiBwcm9wZXJ0eSBlZmZlY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNDb21wdXRlZEVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuQ09NUFVURSk7CiAgICAgIH0KCiAgICAgIC8vIFJ1bnRpbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBwZW5kaW5nIHByb3BlcnR5IG9yIHBhdGguICBJZiB0aGUgcm9vdCBwcm9wZXJ0eSBvZiB0aGUgcGF0aCBpbgogICAgICAgKiBxdWVzdGlvbiBoYWQgbm8gYWNjZXNzb3IsIHRoZSBwYXRoIGlzIHNldCwgb3RoZXJ3aXNlIGl0IGlzIGVucXVldWVkCiAgICAgICAqIHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXNvbGF0ZXMgcmVsYXRpdmVseSBleHBlbnNpdmUgZnVuY3Rpb25hbGl0eSBuZWNlc3NhcnkKICAgICAgICogZm9yIHRoZSBwdWJsaWMgQVBJIChgc2V0YCwgYHNldFByb3BlcnRpZXNgLCBgbm90aWZ5UGF0aGAsIGFuZCBwcm9wZXJ0eQogICAgICAgKiBjaGFuZ2UgbGlzdGVuZXJzIHZpYSB7ey4uLn19IGJpbmRpbmdzKSwgc3VjaCB0aGF0IGl0IGlzIG9ubHkgZG9uZQogICAgICAgKiB3aGVuIHBhdGhzIGVudGVyIHRoZSBzeXN0ZW0sIGFuZCBub3QgYXQgZXZlcnkgcHJvcGFnYXRpb24gc3RlcC4gIEl0CiAgICAgICAqIGFsc28gc2V0cyBhIGBfX2RhdGFIYXNQYXRoc2AgZmxhZyBvbiB0aGUgaW5zdGFuY2Ugd2hpY2ggaXMgdXNlZCB0bwogICAgICAgKiBmYXN0LXBhdGggc2xvd2VyIHBhdGgtbWF0Y2hpbmcgY29kZSBpbiB0aGUgcHJvcGVydHkgZWZmZWN0cyBob3N0IHBhdGhzLgogICAgICAgKgogICAgICAgKiBgcGF0aGAgY2FuIGJlIGEgcGF0aCBzdHJpbmcgb3IgYXJyYXkgb2YgcGF0aCBwYXJ0cyBhcyBhY2NlcHRlZCBieSB0aGUKICAgICAgICogcHVibGljIEFQSS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8bnVtYmVyfHN0cmluZz59IHBhdGggUGF0aCB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFNldCB0byB0cnVlIGlmIHRoaXMgY2hhbmdlIHNob3VsZAogICAgICAgKiAgY2F1c2UgYSBwcm9wZXJ0eSBub3RpZmljYXRpb24gZXZlbnQgZGlzcGF0Y2gKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gaXNQYXRoTm90aWZpY2F0aW9uIElmIHRoZSBwYXRoIGJlaW5nIHNldCBpcyBhIHBhdGgKICAgICAgICogICBub3RpZmljYXRpb24gb2YgYW4gYWxyZWFkeSBjaGFuZ2VkIHZhbHVlLCBhcyBvcHBvc2VkIHRvIGEgcmVxdWVzdAogICAgICAgKiAgIHRvIHNldCBhbmQgbm90aWZ5IHRoZSBjaGFuZ2UuICBJbiB0aGUgbGF0dGVyIGBmYWxzZWAgY2FzZSwgYSBkaXJ0eQogICAgICAgKiAgIGNoZWNrIGlzIHBlcmZvcm1lZCBhbmQgdGhlbiB0aGUgdmFsdWUgaXMgc2V0IHRvIHRoZSBwYXRoIGJlZm9yZQogICAgICAgKiAgIGVucXVldWluZyB0aGUgcGVuZGluZyBwcm9wZXJ0eSBjaGFuZ2UuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkvcGF0aCB3YXMgZW5xdWV1ZWQgaW4KICAgICAgICogICB0aGUgcGVuZGluZyBjaGFuZ2VzIGJhZy4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgc2hvdWxkTm90aWZ5LCBpc1BhdGhOb3RpZmljYXRpb24pIHsKICAgICAgICBpZiAoaXNQYXRoTm90aWZpY2F0aW9uIHx8CiAgICAgICAgICAgIFBvbHltZXIuUGF0aC5yb290KEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoWzBdIDogcGF0aCkgIT09IHBhdGgpIHsKICAgICAgICAgIC8vIERpcnR5IGNoZWNrIGNoYW5nZXMgYmVpbmcgc2V0IHRvIGEgcGF0aCBhZ2FpbnN0IHRoZSBhY3R1YWwgb2JqZWN0LAogICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHBhdGhzIGludG8gdGhlIHN5c3RlbTsgZnJvbSBoZXJlCiAgICAgICAgICAvLyB0aGUgb25seSBkaXJ0eSBjaGVja3MgYXJlIGFnYWluc3QgdGhlIGBfX2RhdGFUZW1wYCBjYWNoZSB0byBwcmV2ZW50CiAgICAgICAgICAvLyBkdXBsaWNhdGUgd29yayBpbiB0aGUgc2FtZSB0dXJuIG9ubHkuIE5vdGUsIGlmIHRoaXMgd2FzIGEgbm90aWZpY2F0aW9uCiAgICAgICAgICAvLyBvZiBhIGNoYW5nZSBhbHJlYWR5IHNldCB0byBhIHBhdGggKGlzUGF0aE5vdGlmaWNhdGlvbjogdHJ1ZSksCiAgICAgICAgICAvLyB3ZSBhbHdheXMgbGV0IHRoZSBjaGFuZ2UgdGhyb3VnaCBhbmQgc2tpcCB0aGUgYHNldGAgc2luY2UgaXQgd2FzCiAgICAgICAgICAvLyBhbHJlYWR5IGRpcnR5IGNoZWNrZWQgYXQgdGhlIHBvaW50IG9mIGVudHJ5IGFuZCB0aGUgdW5kZXJseWluZwogICAgICAgICAgLy8gb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZAogICAgICAgICAgaWYgKCFpc1BhdGhOb3RpZmljYXRpb24pIHsKICAgICAgICAgICAgbGV0IG9sZCA9IFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCk7CiAgICAgICAgICAgIHBhdGggPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKFBvbHltZXIuUGF0aC5zZXQodGhpcywgcGF0aCwgdmFsdWUpKTsKICAgICAgICAgICAgLy8gVXNlIHByb3BlcnR5LWFjY2Vzc29yJ3Mgc2ltcGxlciBkaXJ0eSBjaGVjawogICAgICAgICAgICBpZiAoIXBhdGggfHwgIXN1cGVyLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwYXRoLCB2YWx1ZSwgb2xkKSkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2RhdGFIYXNQYXRocyA9IHRydWU7CiAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSkpIHsKICAgICAgICAgICAgY29tcHV0ZUxpbmtlZFBhdGhzKHRoaXMsIHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcGF0aF0pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eSgvKipAdHlwZXtzdHJpbmd9Ki8ocGF0aCksIHZhbHVlLCBzaG91bGROb3RpZnkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpc1twYXRoXSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBcHBsaWVzIGEgdmFsdWUgdG8gYSBub24tUG9seW1lciBlbGVtZW50L25vZGUncyBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIG1ha2VzIGEgYmVzdC1lZmZvcnQgYXQgYmluZGluZyBpbnRlcm9wOgogICAgICAgKiBTb21lIG5hdGl2ZSBlbGVtZW50IHByb3BlcnRpZXMgaGF2ZSBzaWRlLWVmZmVjdHMgd2hlbgogICAgICAgKiByZS1zZXR0aW5nIHRoZSBzYW1lIHZhbHVlIChlLmcuIHNldHRpbmcgYDxpbnB1dD4udmFsdWVgIHJlc2V0cyB0aGUKICAgICAgICogY3Vyc29yIHBvc2l0aW9uKSwgc28gd2UgZG8gYSBkaXJ0eS1jaGVjayBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUuCiAgICAgICAqIEhvd2V2ZXIsIGZvciBiZXR0ZXIgaW50ZXJvcCB3aXRoIG5vbi1Qb2x5bWVyIGN1c3RvbSBlbGVtZW50cyB0aGF0CiAgICAgICAqIGFjY2VwdCBvYmplY3RzLCB3ZSBleHBsaWNpdGx5IHJlLXNldCBvYmplY3QgY2hhbmdlcyBjb21pbmcgZnJvbSB0aGUKICAgICAgICogUG9seW1lciB3b3JsZCAod2hpY2ggbWF5IGluY2x1ZGUgZGVlcCBvYmplY3QgY2hhbmdlcyB3aXRob3V0IHRoZQogICAgICAgKiB0b3AgcmVmZXJlbmNlIGNoYW5naW5nKSwgZXJyaW5nIG9uIHRoZSBzaWRlIG9mIHByb3ZpZGluZyBtb3JlCiAgICAgICAqIGluZm9ybWF0aW9uLgogICAgICAgKgogICAgICAgKiBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhbHRlcm5hdGUgYXBwcm9hY2hlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICAvLyBJdCBpcyBhIGp1ZGdtZW50IGNhbGwgdGhhdCByZXNldHRpbmcgcHJpbWl0aXZlcyBpcwogICAgICAgIC8vICJiYWQiIGFuZCByZXNldHRpbmdzIG9iamVjdHMgaXMgYWxzbyAiZ29vZCI7IGFsdGVybmF0aXZlbHkgd2UgY291bGQKICAgICAgICAvLyBpbXBsZW1lbnQgYSB3aGl0ZWxpc3Qgb2YgdGFnICYgcHJvcGVydHkgdmFsdWVzIHRoYXQgc2hvdWxkIG5ldmVyCiAgICAgICAgLy8gYmUgcmVzZXQgKGUuZy4gPGlucHV0Pi52YWx1ZSAmJiA8c2VsZWN0Pi52YWx1ZSkKICAgICAgICBpZiAodmFsdWUgIT09IG5vZGVbcHJvcF0gfHwgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7CiAgICAgICAgICBub2RlW3Byb3BdID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBgUHJvcGVydGllc0NoYW5nZWRgIGltcGxlbWVudGF0aW9uIHRvIGludHJvZHVjZSBzcGVjaWFsCiAgICAgICAqIGRpcnR5IGNoZWNrIGxvZ2ljIGRlcGVuZGluZyBvbiB0aGUgcHJvcGVydHkgJiB2YWx1ZSBiZWluZyBzZXQ6CiAgICAgICAqCiAgICAgICAqIDEuIEFueSB2YWx1ZSBzZXQgdG8gYSBwYXRoIChlLmcuICdvYmoucHJvcCc6IDQyIG9yICdvYmoucHJvcCc6IHsuLi59KQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YVRlbXBgLCBkaXJ0eSBjaGVja2VkIGFnYWluc3QgYF9fZGF0YVRlbXBgCiAgICAgICAqIDIuIE9iamVjdCBzZXQgdG8gc2ltcGxlIHByb3BlcnR5IChlLmcuICdwcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAgYW5kIGBfX2RhdGFgLCBkaXJ0eSBjaGVja2VkIGFnYWluc3QKICAgICAgICogICAgYF9fZGF0YVRlbXBgIGJ5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYF9zaG91bGRQcm9wZXJ0eUNoYW5nZWAKICAgICAgICogMy4gUHJpbWl0aXZlIHZhbHVlIHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiA0MikKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFgLCBkaXJ0eSBjaGVja2VkIGFnYWluc3QgYF9fZGF0YWAKICAgICAgICoKICAgICAgICogVGhlIGRpcnR5LWNoZWNrIGlzIGltcG9ydGFudCB0byBwcmV2ZW50IGN5Y2xlcyBkdWUgdG8gdHdvLXdheQogICAgICAgKiBub3RpZmljYXRpb24sIGJ1dCBwYXRocyBhbmQgb2JqZWN0cyBhcmUgb25seSBkaXJ0eSBjaGVja2VkIGFnYWluc3QgYW55CiAgICAgICAqIHByZXZpb3VzIHZhbHVlIHNldCBkdXJpbmcgdGhpcyB0dXJuIHZpYSBhICJ0ZW1wb3JhcnkgY2FjaGUiIHRoYXQgaXMKICAgICAgICogY2xlYXJlZCB3aGVuIHRoZSBsYXN0IGBfcHJvcGVydGllc0NoYW5nZWRgIGV4aXRzLiBUaGlzIGlzIHNvOgogICAgICAgKiBhLiBhbnkgY2FjaGVkIGFycmF5IHBhdGhzIChlLmcuICdhcnJheS4zLnByb3AnKSBtYXkgYmUgaW52YWxpZGF0ZWQKICAgICAgICogICAgZHVlIHRvIGFycmF5IG11dGF0aW9ucyBsaWtlIHNoaWZ0L3Vuc2hpZnQvc3BsaWNlOyB0aGlzIGlzIGZpbmUKICAgICAgICogICAgc2luY2UgcGF0aCBjaGFuZ2VzIGFyZSBkaXJ0eS1jaGVja2VkIGF0IHVzZXIgZW50cnkgcG9pbnRzIGxpa2UgYHNldGAKICAgICAgICogYi4gZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgb25seSBsYXN0cyBvbmUgdHVybiB0byBhbGxvdyB0aGUgdXNlcgogICAgICAgKiAgICB0byBtdXRhdGUgdGhlIG9iamVjdCBpbi1wbGFjZSBhbmQgcmUtc2V0IGl0IHdpdGggdGhlIHNhbWUgaWRlbnRpdHkKICAgICAgICogICAgYW5kIGhhdmUgYWxsIHN1Yi1wcm9wZXJ0aWVzIHJlLXByb3BhZ2F0ZWQgaW4gYSBzdWJzZXF1ZW50IHR1cm4uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wIGNhY2hlIGlzIG5vdCBuZWNlc3NhcmlseSBzdWZmaWNpZW50IHRvIHByZXZlbnQgaW52YWxpZCBhcnJheQogICAgICAgKiBwYXRocywgc2luY2UgYSBzcGxpY2UgY2FuIGhhcHBlbiBkdXJpbmcgdGhlIHNhbWUgdHVybiAod2l0aCBwYXRob2xvZ2ljYWwKICAgICAgICogdXNlciBjb2RlKTsgd2UgY291bGQgaW50cm9kdWNlIGEgImZpeHVwIiBmb3IgdGVtcG9yYXJpbHkgY2FjaGVkIGFycmF5CiAgICAgICAqIHBhdGhzIGlmIG5lZWRlZDogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci9pc3N1ZXMvNDIyNwogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZE5vdGlmeSBUcnVlIGlmIHByb3BlcnR5IHNob3VsZCBmaXJlIG5vdGlmaWNhdGlvbgogICAgICAgKiAgIGV2ZW50IChhcHBsaWVzIG9ubHkgZm9yIGBub3RpZnk6IHRydWVgIHByb3BlcnRpZXMpCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgY2hhbmdlZAogICAgICAgKi8KICAgICAgX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHNob3VsZE5vdGlmeSkgewogICAgICAgIGxldCBpc1BhdGggPSB0aGlzLl9fZGF0YUhhc1BhdGhzICYmIFBvbHltZXIuUGF0aC5pc1BhdGgocHJvcGVydHkpOwogICAgICAgIGxldCBwcmV2UHJvcHMgPSBpc1BhdGggPyB0aGlzLl9fZGF0YVRlbXAgOiB0aGlzLl9fZGF0YTsKICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBwcmV2UHJvcHNbcHJvcGVydHldKSkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0ge307CiAgICAgICAgICB9CiAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgaWYgKCEocHJvcGVydHkgaW4gdGhpcy5fX2RhdGFPbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkW3Byb3BlcnR5XSA9IHRoaXMuX19kYXRhW3Byb3BlcnR5XTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFBhdGhzIGFyZSBzdG9yZWQgaW4gdGVtcG9yYXJ5IGNhY2hlIChjbGVhcmVkIGF0IGVuZCBvZiB0dXJuKSwKICAgICAgICAgIC8vIHdoaWNoIGlzIHVzZWQgZm9yIGRpcnR5LWNoZWNraW5nLCBhbGwgb3RoZXJzIHN0b3JlZCBpbiBfX2RhdGEKICAgICAgICAgIGlmIChpc1BhdGgpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUZW1wW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBBbGwgY2hhbmdlcyBnbyBpbnRvIHBlbmRpbmcgcHJvcGVydHkgYmFnLCBwYXNzZWQgdG8gX3Byb3BlcnRpZXNDaGFuZ2VkCiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAvLyBUcmFjayBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIG5vdGlmeSBzZXBhcmF0ZWx5CiAgICAgICAgICBpZiAoaXNQYXRoIHx8ICh0aGlzW1RZUEVTLk5PVElGWV0gJiYgdGhpc1tUWVBFUy5OT1RJRlldW3Byb3BlcnR5XSkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeSA9IHRoaXMuX19kYXRhVG9Ob3RpZnkgfHwge307CiAgICAgICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnlbcHJvcGVydHldID0gc2hvdWxkTm90aWZ5OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBiYXNlIGltcGxlbWVudGF0aW9uIHRvIGVuc3VyZSBhbGwgYWNjZXNzb3JzIHNldCBgc2hvdWxkTm90aWZ5YAogICAgICAgKiB0byB0cnVlLCBmb3IgcGVyLXByb3BlcnR5IG5vdGlmaWNhdGlvbiB0cmFja2luZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnR5QWNjZXNzb3JgJ3MgZGVmYXVsdCBhc3luYyBxdWV1aW5nIG9mCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgOiBpZiBgX19kYXRhUmVhZHlgIGlzIGZhbHNlIChoYXMgbm90IHlldCBiZWVuCiAgICAgICAqIG1hbnVhbGx5IGZsdXNoZWQpLCB0aGUgZnVuY3Rpb24gbm8tb3BzOyBvdGhlcndpc2UgZmx1c2hlcwogICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbnZhbGlkYXRlUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgdGhlIGdpdmVuIGNsaWVudCBvbiBhIGxpc3Qgb2YgcGVuZGluZyBjbGllbnRzLCB3aG9zZQogICAgICAgKiBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZXMgY2FuIGxhdGVyIGJlIGZsdXNoZWQgdmlhIGEgY2FsbCB0bwogICAgICAgKiBgX2ZsdXNoQ2xpZW50c2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjbGllbnQgUHJvcGVydHlFZmZlY3RzIGNsaWVudCB0byBlbnF1ZXVlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9lbnF1ZXVlQ2xpZW50KGNsaWVudCkgewogICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzIHx8IFtdOwogICAgICAgIGlmIChjbGllbnQgIT09IHRoaXMpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMucHVzaChjbGllbnQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuX19kYXRhQ291bnRlcisrOwogICAgICAgIHN1cGVyLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB0aGlzLl9fZGF0YUNvdW50ZXItLTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZsdXNoZXMgYW55IGNsaWVudHMgcHJldmlvdXNseSBlbnF1ZXVlZCB2aWEgYF9lbnF1ZXVlQ2xpZW50YCwgY2F1c2luZwogICAgICAgKiB0aGVpciBgX2ZsdXNoUHJvcGVydGllc2AgbWV0aG9kIHRvIHJ1bi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2ZsdXNoQ2xpZW50cygpIHsKICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9fZGF0YUNsaWVudHNSZWFkeSA9IHRydWU7CiAgICAgICAgICB0aGlzLl9yZWFkeUNsaWVudHMoKTsKICAgICAgICAgIC8vIE92ZXJyaWRlIHBvaW50IHdoZXJlIGFjY2Vzc29ycyBhcmUgdHVybmVkIG9uOyBpbXBvcnRhbnRseSwKICAgICAgICAgIC8vIHRoaXMgaXMgYWZ0ZXIgY2xpZW50cyBoYXZlIGZ1bGx5IHJlYWRpZWQsIHByb3ZpZGluZyBhIGd1YXJhbnRlZQogICAgICAgICAgLy8gdGhhdCBhbnkgcHJvcGVydHkgZWZmZWN0cyBvY2N1ciBvbmx5IGFmdGVyIGFsbCBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIE5PVEU6IFdlIGVuc3VyZSBjbGllbnRzIGVpdGhlciBlbmFibGUgb3IgZmx1c2ggYXMgYXBwcm9wcmlhdGUuIFRoaXMKICAgICAgLy8gaGFuZGxlcyB0d28gY29ybmVyIGNhc2VzOgogICAgICAvLyAoMSkgY2xpZW50cyBmbHVzaCBwcm9wZXJseSB3aGVuIGNvbm5lY3RlZC9lbmFibGVkIGJlZm9yZSB0aGUgaG9zdAogICAgICAvLyBlbmFibGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIFRlbXBsYXRpemUgc3RhbXBzIHdpdGggbm8gcHJvcGVydGllcyBhbmQgZG9lcyBub3QgZmx1c2ggYW5kCiAgICAgIC8vICAgKGIpIHRoZSBpbnN0YW5jZSBpcyBpbnNlcnRlZCBpbnRvIGRvbSBhbmQKICAgICAgLy8gICAoYykgdGhlbiB0aGUgaW5zdGFuY2UgZmx1c2hlcy4KICAgICAgLy8gKDIpIGNsaWVudHMgZW5hYmxlIHByb3Blcmx5IHdoZW4gbm90IGNvbm5lY3RlZC9lbmFibGVkIHdoZW4gdGhlIGhvc3QKICAgICAgLy8gZmx1c2hlczsgZS5nLgogICAgICAvLyAgIChhKSBhIHRlbXBsYXRlIGlzIHJ1bnRpbWUgc3RhbXBlZCBhbmQgbm90IHlldCBjb25uZWN0ZWQvZW5hYmxlZAogICAgICAvLyAgIChiKSBhIGhvc3Qgc2V0cyBhIHByb3BlcnR5LCBjYXVzaW5nIHN0YW1wZWQgZG9tIHRvIGZsdXNoCiAgICAgIC8vICAgKGMpIHRoZSBzdGFtcGVkIGRvbSBlbmFibGVzLgogICAgICBfX2VuYWJsZU9yRmx1c2hDbGllbnRzKCkgewogICAgICAgIGxldCBjbGllbnRzID0gdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICBpZiAoY2xpZW50cykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IG51bGw7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBjbGllbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBjbGllbnQgPSBjbGllbnRzW2ldOwogICAgICAgICAgICBpZiAoIWNsaWVudC5fX2RhdGFFbmFibGVkKSB7CiAgICAgICAgICAgICAgY2xpZW50Ll9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpZW50Ll9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgICAgICBjbGllbnQuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUGVyZm9ybSBhbnkgaW5pdGlhbCBzZXR1cCBvbiBjbGllbnQgZG9tLiBDYWxsZWQgYmVmb3JlIHRoZSBmaXJzdAogICAgICAgKiBgX2ZsdXNoUHJvcGVydGllc2AgY2FsbCBvbiBjbGllbnQgZG9tIGFuZCBiZWZvcmUgYW55IGVsZW1lbnQKICAgICAgICogb2JzZXJ2ZXJzIGFyZSBjYWxsZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9yZWFkeUNsaWVudHMoKSB7CiAgICAgICAgdGhpcy5fX2VuYWJsZU9yRmx1c2hDbGllbnRzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGEgYmFnIG9mIHByb3BlcnR5IGNoYW5nZXMgdG8gdGhpcyBpbnN0YW5jZSwgYW5kCiAgICAgICAqIHN5bmNocm9ub3VzbHkgcHJvY2Vzc2VzIGFsbCBlZmZlY3RzIG9mIHRoZSBwcm9wZXJ0aWVzIGFzIGEgYmF0Y2guCiAgICAgICAqCiAgICAgICAqIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgc2ltcGxlIHByb3BlcnRpZXMsIG5vdCBwYXRocy4gIEJhdGNoZWQKICAgICAgICogcGF0aCBwcm9wYWdhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIG9uZSBvciBtb3JlIGtleS12YWx1ZSBwYWlycyB3aG9zZSBrZXkgaXMKICAgICAgICogICBhIHByb3BlcnR5IGFuZCB2YWx1ZSBpcyB0aGUgbmV3IHZhbHVlIHRvIHNldCBmb3IgdGhhdCBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2V0UmVhZE9ubHkgV2hlbiB0cnVlLCBhbnkgcHJpdmF0ZSB2YWx1ZXMgc2V0IGluCiAgICAgICAqICAgYHByb3BzYCB3aWxsIGJlIHNldC4gQnkgZGVmYXVsdCwgYHNldFByb3BlcnRpZXNgIHdpbGwgbm90IHNldAogICAgICAgKiAgIGByZWFkT25seTogdHJ1ZWAgcm9vdCBwcm9wZXJ0aWVzLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBzZXRQcm9wZXJ0aWVzKHByb3BzLCBzZXRSZWFkT25seSkgewogICAgICAgIGZvciAobGV0IHBhdGggaW4gcHJvcHMpIHsKICAgICAgICAgIGlmIChzZXRSZWFkT25seSB8fCAhdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bcGF0aF0pIHsKICAgICAgICAgICAgLy9UT0RPKGtzY2hhYWYpOiBleHBsaWNpdGx5IGRpc2FsbG93IHBhdGhzIGluIHNldFByb3BlcnR5PwogICAgICAgICAgICAvLyB3aWxkY2FyZCBvYnNlcnZlcnMgY3VycmVudGx5IG9ubHkgcGFzcyB0aGUgZmlyc3QgY2hhbmdlZCBwYXRoCiAgICAgICAgICAgIC8vIGluIHRoZSBgaW5mb2Agb2JqZWN0LCBhbmQgeW91IGNvdWxkIGRvIHNvbWUgb2RkIHRoaW5ncyBiYXRjaGluZwogICAgICAgICAgICAvLyBwYXRocywgZS5nLiB7J2Zvby5iYXInOiB7Li4ufSwgJ2Zvbyc6IG51bGx9CiAgICAgICAgICAgIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCBwcm9wc1twYXRoXSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnR5QWNjZXNzb3JzYCBzbyB0aGF0IHByb3BlcnR5IGFjY2Vzc29yCiAgICAgICAqIHNpZGUgZWZmZWN0cyBhcmUgbm90IGVuYWJsZWQgdW50aWwgYWZ0ZXIgY2xpZW50IGRvbSBpcyBmdWxseSByZWFkeS4KICAgICAgICogQWxzbyBjYWxscyBgX2ZsdXNoQ2xpZW50c2AgY2FsbGJhY2sgdG8gZW5zdXJlIGNsaWVudCBkb20gaXMgZW5hYmxlZAogICAgICAgKiB0aGF0IHdhcyBub3QgZW5hYmxlZCBhcyBhIHJlc3VsdCBvZiBmbHVzaGluZyBwcm9wZXJ0aWVzLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIC8vIEl0IGlzIGltcG9ydGFudCB0aGF0IGBzdXBlci5yZWFkeSgpYCBpcyBub3QgY2FsbGVkIGhlcmUgYXMgaXQKICAgICAgICAvLyBpbW1lZGlhdGVseSB0dXJucyBvbiBhY2Nlc3NvcnMuIEluc3RlYWQsIHdlIHdhaXQgdW50aWwgYHJlYWR5Q2xpZW50c2AKICAgICAgICAvLyB0byBlbmFibGUgYWNjZXNzb3JzIHRvIHByb3ZpZGUgYSBndWFyYW50ZWUgdGhhdCBjbGllbnRzIGFyZSByZWFkeQogICAgICAgIC8vIGJlZm9yZSBwcm9jZXNzaW5nIGFueSBhY2Nlc3NvcnMgc2lkZSBlZmZlY3RzLgogICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIC8vIElmIG5vIGRhdGEgd2FzIHBlbmRpbmcsIGBfZmx1c2hQcm9wZXJ0aWVzYCB3aWxsIG5vdCBgZmx1c2hDbGllbnRzYAogICAgICAgIC8vIHNvIGVuc3VyZSB0aGlzIGlzIGRvbmUuCiAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUNsaWVudHNSZWFkeSkgewogICAgICAgICAgdGhpcy5fZmx1c2hDbGllbnRzKCk7CiAgICAgICAgfQogICAgICAgIC8vIEJlZm9yZSByZWFkeSwgY2xpZW50IG5vdGlmaWNhdGlvbnMgZG8gbm90IHRyaWdnZXIgX2ZsdXNoUHJvcGVydGllcy4KICAgICAgICAvLyBUaGVyZWZvcmUgYSBmbHVzaCBpcyBuZWNlc3NhcnkgaGVyZSBpZiBkYXRhIGhhcyBiZWVuIHNldC4KICAgICAgICBpZiAodGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJbXBsZW1lbnRzIGBQcm9wZXJ0eUFjY2Vzc29yc2AncyBwcm9wZXJ0aWVzIGNoYW5nZWQgY2FsbGJhY2suCiAgICAgICAqCiAgICAgICAqIFJ1bnMgZWFjaCBjbGFzcyBvZiBlZmZlY3RzIGZvciB0aGUgYmF0Y2ggb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIGluCiAgICAgICAqIGEgc3BlY2lmaWMgb3JkZXIgKGNvbXB1dGUsIHByb3BhZ2F0ZSwgcmVmbGVjdCwgb2JzZXJ2ZSwgbm90aWZ5KS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAqICAgY2FsbCB0byBgX3Byb3BlcnRpZXNDaGFuZ2VkYAogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3Byb3BlcnRpZXNDaGFuZ2VkKGN1cnJlbnRQcm9wcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcykgewogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyBsZXQgYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNoYW5nZWRQcm9wcyB8fCB7fSk7CiAgICAgICAgLy8gd2luZG93LmRlYnVnICYmIGNvbnNvbGUuZ3JvdXAodGhpcy5sb2NhbE5hbWUgKyAnIycgKyB0aGlzLmlkICsgJzogJyArIGMpOwogICAgICAgIC8vIGlmICh3aW5kb3cuZGVidWcpIHsgZGVidWdnZXI7IH0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgbGV0IGhhc1BhdGhzID0gdGhpcy5fX2RhdGFIYXNQYXRoczsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gQ29tcHV0ZSBwcm9wZXJ0aWVzCiAgICAgICAgcnVuQ29tcHV0ZWRFZmZlY3RzKHRoaXMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBDbGVhciBub3RpZnkgcHJvcGVydGllcyBwcmlvciB0byBwb3NzaWJsZSByZWVudHJ5IChwcm9wYWdhdGUsIG9ic2VydmUpLAogICAgICAgIC8vIGJ1dCBhZnRlciBjb21wdXRpbmcgZWZmZWN0cyBoYXZlIGEgY2hhbmNlIHRvIGFkZCB0byB0aGVtCiAgICAgICAgbGV0IG5vdGlmeVByb3BzID0gdGhpcy5fX2RhdGFUb05vdGlmeTsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICAvLyBQcm9wYWdhdGUgcHJvcGVydGllcyB0byBjbGllbnRzCiAgICAgICAgdGhpcy5fcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBGbHVzaCBjbGllbnRzCiAgICAgICAgdGhpcy5fZmx1c2hDbGllbnRzKCk7CiAgICAgICAgLy8gUmVmbGVjdCBwcm9wZXJ0aWVzCiAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0aGlzW1RZUEVTLlJFRkxFQ1RdLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgLy8gT2JzZXJ2ZSBwcm9wZXJ0aWVzCiAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0aGlzW1RZUEVTLk9CU0VSVkVdLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgLy8gTm90aWZ5IHByb3BlcnRpZXMgdG8gaG9zdAogICAgICAgIGlmIChub3RpZnlQcm9wcykgewogICAgICAgICAgcnVuTm90aWZ5RWZmZWN0cyh0aGlzLCBub3RpZnlQcm9wcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICAvLyBDbGVhciB0ZW1wb3JhcnkgY2FjaGUgYXQgZW5kIG9mIHR1cm4KICAgICAgICBpZiAodGhpcy5fX2RhdGFDb3VudGVyID09IDEpIHsKICAgICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIH0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgLy8gd2luZG93LmRlYnVnICYmIGNvbnNvbGUuZ3JvdXBFbmQodGhpcy5sb2NhbE5hbWUgKyAnIycgKyB0aGlzLmlkICsgJzogJyArIGMpOwogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBwcm9wYWdhdGUgYW55IHByb3BlcnR5IGNoYW5nZXMgdG8gc3RhbXBlZCB0ZW1wbGF0ZSBub2RlcwogICAgICAgKiBtYW5hZ2VkIGJ5IHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgaWYgKHRoaXNbVFlQRVMuUFJPUEFHQVRFXSkgewogICAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0aGlzW1RZUEVTLlBST1BBR0FURV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICB9CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgd2hpbGUgKHRlbXBsYXRlSW5mbykgewogICAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLAogICAgICAgICAgICBoYXNQYXRocywgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICAgIHRlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFsaWFzZXMgb25lIGRhdGEgcGF0aCBhcyBhbm90aGVyLCBzdWNoIHRoYXQgcGF0aCBub3RpZmljYXRpb25zIGZyb20gb25lCiAgICAgICAqIGFyZSByb3V0ZWQgdG8gdGhlIG90aGVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gdG8gVGFyZ2V0IHBhdGggdG8gbGluay4KICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IGZyb20gU291cmNlIHBhdGggdG8gbGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgbGlua1BhdGhzKHRvLCBmcm9tKSB7CiAgICAgICAgdG8gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHRvKTsKICAgICAgICBmcm9tID0gUG9seW1lci5QYXRoLm5vcm1hbGl6ZShmcm9tKTsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gdGhpcy5fX2RhdGFMaW5rZWRQYXRocyB8fCB7fTsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzW3RvXSA9IGZyb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGEgZGF0YSBwYXRoIGFsaWFzIHByZXZpb3VzbHkgZXN0YWJsaXNoZWQgd2l0aCBgX2xpbmtQYXRoc2AuCiAgICAgICAqCiAgICAgICAqIE5vdGUsIHRoZSBwYXRoIHRvIHVubGluayBzaG91bGQgYmUgdGhlIHRhcmdldCAoYHRvYCkgdXNlZCB3aGVuCiAgICAgICAqIGxpbmtpbmcgdGhlIHBhdGhzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBUYXJnZXQgcGF0aCB0byB1bmxpbmsuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVubGlua1BhdGhzKHBhdGgpIHsKICAgICAgICBwYXRoID0gUG9seW1lci5QYXRoLm5vcm1hbGl6ZShwYXRoKTsKICAgICAgICBpZiAodGhpcy5fX2RhdGFMaW5rZWRQYXRocykgewogICAgICAgICAgZGVsZXRlIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbcGF0aF07CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTm90aWZ5IHRoYXQgYW4gYXJyYXkgaGFzIGNoYW5nZWQuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgICB0aGlzLml0ZW1zID0gWyB7bmFtZTogJ0ppbSd9LCB7bmFtZTogJ1RvZGQnfSwge25hbWU6ICdCaWxsJ30gXTsKICAgICAgICogICAgIC4uLgogICAgICAgKiAgICAgdGhpcy5pdGVtcy5zcGxpY2UoMSwgMSwge25hbWU6ICdTYW0nfSk7CiAgICAgICAqICAgICB0aGlzLml0ZW1zLnB1c2goe25hbWU6ICdCb2InfSk7CiAgICAgICAqICAgICB0aGlzLm5vdGlmeVNwbGljZXMoJ2l0ZW1zJywgWwogICAgICAgKiAgICAgICB7IGluZGV4OiAxLCByZW1vdmVkOiBbe25hbWU6ICdUb2RkJ31dLCBhZGRlZENvdW50OiAxLCBvYmplY3Q6IHRoaXMuaXRlbXMsIHR5cGU6ICdzcGxpY2UnIH0sCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDMsIHJlbW92ZWQ6IFtdLCBhZGRlZENvdW50OiAxLCBvYmplY3Q6IHRoaXMuaXRlbXMsIHR5cGU6ICdzcGxpY2UnfQogICAgICAgKiAgICAgXSk7CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdGhhdCBzaG91bGQgYmUgbm90aWZpZWQuCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyBvcmRlcmVkCiAgICAgICAqICAgY2hhbmdlcyB0aGF0IG9jY3VycmVkIHRvIHRoZSBhcnJheS4gRWFjaCByZWNvcmQgc2hvdWxkIGhhdmUgdGhlCiAgICAgICAqICAgZm9sbG93aW5nIGZpZWxkczoKICAgICAgICogICAgKiBpbmRleDogaW5kZXggYXQgd2hpY2ggdGhlIGNoYW5nZSBvY2N1cnJlZAogICAgICAgKiAgICAqIHJlbW92ZWQ6IGFycmF5IG9mIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkIGZyb20gdGhpcyBpbmRleAogICAgICAgKiAgICAqIGFkZGVkQ291bnQ6IG51bWJlciBvZiBuZXcgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICAgKiAgICAqIG9iamVjdDogYSByZWZlcmVuY2UgdG8gdGhlIGFycmF5IGluIHF1ZXN0aW9uCiAgICAgICAqICAgICogdHlwZTogdGhlIHN0cmluZyBsaXRlcmFsICdzcGxpY2UnCiAgICAgICAqCiAgICAgICAqICAgTm90ZSB0aGF0IHNwbGljZSByZWNvcmRzIF9tdXN0XyBiZSBub3JtYWxpemVkIHN1Y2ggdGhhdCB0aGV5IGFyZQogICAgICAgKiAgIHJlcG9ydGVkIGluIGluZGV4IG9yZGVyIChyYXcgcmVzdWx0cyBmcm9tIGBPYmplY3Qub2JzZXJ2ZWAgYXJlIG5vdAogICAgICAgKiAgIG9yZGVyZWQgYW5kIG11c3QgYmUgbm9ybWFsaXplZC9tZXJnZWQgYmVmb3JlIG5vdGlmeWluZykuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgKi8KICAgICAgbm90aWZ5U3BsaWNlcyhwYXRoLCBzcGxpY2VzKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIG5vdGlmeVNwbGljZXModGhpcywgYXJyYXksIGluZm8ucGF0aCwgc3BsaWNlcyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHJlYWRpbmcgYSB2YWx1ZSBmcm9tIGEgcGF0aC4KICAgICAgICoKICAgICAgICogTm90ZSwgaWYgYW55IHBhcnQgaW4gdGhlIHBhdGggaXMgdW5kZWZpbmVkLCB0aGlzIG1ldGhvZCByZXR1cm5zCiAgICAgICAqIGB1bmRlZmluZWRgICh0aGlzIG1ldGhvZCBkb2VzIG5vdCB0aHJvdyB3aGVuIGRlcmVmZXJlbmNpbmcgdW5kZWZpbmVkCiAgICAgICAqIHBhdGhzKS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsoc3RyaW5nfCFBcnJheTwoc3RyaW5nfG51bWJlcik+KX0gcGF0aCBQYXRoIHRvIHRoZSB2YWx1ZQogICAgICAgKiAgIHRvIHJlYWQuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGBmb28uYmFyLmJhemApCiAgICAgICAqICAgb3IgYW4gYXJyYXkgb2YgcGF0aCBwYXJ0cyAoZS5nLiBgWydmb28uYmFyJywgJ2JheiddYCkuICBOb3RlIHRoYXQKICAgICAgICogICBicmFja2V0ZWQgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQ7IHN0cmluZy1iYXNlZCBwYXRoIHBhcnRzCiAgICAgICAqICAgKm11c3QqIGJlIHNlcGFyYXRlZCBieSBkb3RzLiAgTm90ZSB0aGF0IHdoZW4gZGVyZWZlcmVuY2luZyBhcnJheQogICAgICAgKiAgIGluZGljZXMsIHRoZSBpbmRleCBtYXkgYmUgdXNlZCBhcyBhIGRvdHRlZCBwYXJ0IGRpcmVjdGx5CiAgICAgICAqICAgKGUuZy4gYHVzZXJzLjEyLm5hbWVgIG9yIGBbJ3VzZXJzJywgMTIsICduYW1lJ11gKS4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCB0aGUgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgYW55IHBhcnQgb2YgdGhlIHBhdGgKICAgICAgICogICBpcyB1bmRlZmluZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIGdldChwYXRoLCByb290KSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuUGF0aC5nZXQocm9vdCB8fCB0aGlzLCBwYXRoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBhIHZhbHVlIHRvIGEgcGF0aCBhbmQgbm90aWZ5aW5nIGFueQogICAgICAgKiBlbGVtZW50cyBib3VuZCB0byB0aGUgc2FtZSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBleGNlcHQgZm9yIHRoZSBsYXN0IGlzIHVuZGVmaW5lZCwKICAgICAgICogdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nICh0aGlzIG1ldGhvZCBkb2VzIG5vdCB0aHJvdyB3aGVuCiAgICAgICAqIGRlcmVmZXJlbmNpbmcgdW5kZWZpbmVkIHBhdGhzKS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsoc3RyaW5nfCFBcnJheTwoc3RyaW5nfG51bWJlcik+KX0gcGF0aCBQYXRoIHRvIHRoZSB2YWx1ZQogICAgICAgKiAgIHRvIHdyaXRlLiAgVGhlIHBhdGggbWF5IGJlIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoZS5nLiBgJ2Zvby5iYXIuYmF6J2ApCiAgICAgICAqICAgb3IgYW4gYXJyYXkgb2YgcGF0aCBwYXJ0cyAoZS5nLiBgWydmb28uYmFyJywgJ2JheiddYCkuICBOb3RlIHRoYXQKICAgICAgICogICBicmFja2V0ZWQgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQ7IHN0cmluZy1iYXNlZCBwYXRoIHBhcnRzCiAgICAgICAqICAgKm11c3QqIGJlIHNlcGFyYXRlZCBieSBkb3RzLiAgTm90ZSB0aGF0IHdoZW4gZGVyZWZlcmVuY2luZyBhcnJheQogICAgICAgKiAgIGluZGljZXMsIHRoZSBpbmRleCBtYXkgYmUgdXNlZCBhcyBhIGRvdHRlZCBwYXJ0IGRpcmVjdGx5CiAgICAgICAqICAgKGUuZy4gYCd1c2Vycy4xMi5uYW1lJ2Agb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBhdCB0aGUgc3BlY2lmaWVkIHBhdGguCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gcm9vdCBSb290IG9iamVjdCBmcm9tIHdoaWNoIHRoZSBwYXRoIGlzIGV2YWx1YXRlZC4KICAgICAgICogICBXaGVuIHNwZWNpZmllZCwgbm8gbm90aWZpY2F0aW9uIHdpbGwgb2NjdXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgKi8KICAgICAgc2V0KHBhdGgsIHZhbHVlLCByb290KSB7CiAgICAgICAgaWYgKHJvb3QpIHsKICAgICAgICAgIFBvbHltZXIuUGF0aC5zZXQocm9vdCwgcGF0aCwgdmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIXRoaXNbVFlQRVMuUkVBRF9PTkxZXSB8fCAhdGhpc1tUWVBFUy5SRUFEX09OTFldWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyhwYXRoKV0pIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgdHJ1ZSkpIHsKICAgICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIHB1c2ggb250byBhcnJheQogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IE5ldyBsZW5ndGggb2YgdGhlIGFycmF5LgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwdXNoKHBhdGgsIC4uLml0ZW1zKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9Ki8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGxlbiA9IGFycmF5Lmxlbmd0aDsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkucHVzaCguLi5pdGVtcyk7CiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkgewogICAgICAgICAgbm90aWZ5U3BsaWNlKHRoaXMsIGFycmF5LCBpbmZvLnBhdGgsIGxlbiwgaXRlbXMubGVuZ3RoLCBbXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgZW5kIG9mIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucG9wYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEByZXR1cm4geyp9IEl0ZW0gdGhhdCB3YXMgcmVtb3ZlZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgcG9wKHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkucG9wKCk7CiAgICAgICAgaWYgKGhhZExlbmd0aCkgewogICAgICAgICAgbm90aWZ5U3BsaWNlKHRoaXMsIGFycmF5LCBpbmZvLnBhdGgsIGFycmF5Lmxlbmd0aCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhcnRpbmcgZnJvbSB0aGUgc3RhcnQgaW5kZXggc3BlY2lmaWVkLCByZW1vdmVzIDAgb3IgbW9yZSBpdGVtcwogICAgICAgKiBmcm9tIHRoZSBhcnJheSBhbmQgaW5zZXJ0cyAwIG9yIG1vcmUgbmV3IGl0ZW1zIGluIHRoZWlyIHBsYWNlLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IEluZGV4IGZyb20gd2hpY2ggdG8gc3RhcnQgcmVtb3ZpbmcvaW5zZXJ0aW5nLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsZXRlQ291bnQgTnVtYmVyIG9mIGl0ZW1zIHRvIHJlbW92ZS4KICAgICAgICogQHBhcmFtIHsuLi4qfSBpdGVtcyBJdGVtcyB0byBpbnNlcnQgaW50byBhcnJheS4KICAgICAgICogQHJldHVybiB7QXJyYXl9IEFycmF5IG9mIHJlbW92ZWQgaXRlbXMuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNwbGljZShwYXRoLCBzdGFydCwgZGVsZXRlQ291bnQsIC4uLml0ZW1zKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aCA6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICAvLyBOb3JtYWxpemUgZmFuY3kgbmF0aXZlIHNwbGljZSBoYW5kbGluZyBvZiBjcmF6eSBzdGFydCB2YWx1ZXMKICAgICAgICBpZiAoc3RhcnQgPCAwKSB7CiAgICAgICAgICBzdGFydCA9IGFycmF5Lmxlbmd0aCAtIE1hdGguZmxvb3IoLXN0YXJ0KTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7CiAgICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQpOwogICAgICAgIH0KICAgICAgICAvLyBhcnJheS5zcGxpY2UgZG9lcyBkaWZmZXJlbnQgdGhpbmdzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCiAgICAgICAgLy8geW91IHBhc3MgaW4uIFRoZXJlZm9yZSwgYXJyYXkuc3BsaWNlKDApIGFuZCBhcnJheS5zcGxpY2UoMCwgdW5kZWZpbmVkKQogICAgICAgIC8vIGRvIGRpZmZlcmVudCB0aGluZ3MuIEluIHRoZSBmb3JtZXIsIHRoZSB3aG9sZSBhcnJheSBpcyBjbGVhcmVkLiBJbiB0aGUKICAgICAgICAvLyBsYXR0ZXIsIG5vIGl0ZW1zIGFyZSByZW1vdmVkLgogICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGRldGVjdCB3aGV0aGVyIDEuIG9uZSBvZiB0aGUgYXJndW1lbnRzCiAgICAgICAgLy8gaXMgYWN0dWFsbHkgcGFzc2VkIGluIGFuZCB0aGVuIDIuIGRldGVybWluZSBob3cgbWFueSBhcmd1bWVudHMKICAgICAgICAvLyB3ZSBzaG91bGQgcGFzcyBvbiB0byB0aGUgbmF0aXZlIGFycmF5LnNwbGljZQogICAgICAgIC8vCiAgICAgICAgbGV0IHJldDsKICAgICAgICAvLyBPbWl0IGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBpZiB0aGV5IHdlcmUgbm90IHBhc3NlZCBpbgogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQpOwogICAgICAgIC8vIEVpdGhlciBzdGFydCB3YXMgdW5kZWZpbmVkIGFuZCB0aGUgb3RoZXJzIHdlcmUgZGVmaW5lZCwgYnV0IGluIHRoaXMKICAgICAgICAvLyBjYXNlIHdlIGNhbiBzYWZlbHkgcGFzcyBvbiBhbGwgYXJndW1lbnRzCiAgICAgICAgLy8KICAgICAgICAvLyBOb3RlOiB0aGlzIGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIG5vbmUgb2YgdGhlIGFyZ3VtZW50cyB3ZXJlIHBhc3NlZCBpbiwKICAgICAgICAvLyBlLmcuIHRoaXMuc3BsaWNlKCdhcnJheScpLiBIb3dldmVyLCBpZiBib3RoIHN0YXJ0IGFuZCBkZWxldGVDb3VudAogICAgICAgIC8vIGFyZSB1bmRlZmluZWQsIGFycmF5LnNwbGljZSB3aWxsIG5vdCBtb2RpZnkgdGhlIGFycmF5IChhcyBleHBlY3RlZCkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0ID0gYXJyYXkuc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpOwogICAgICAgIH0KICAgICAgICAvLyBBdCB0aGUgZW5kLCBjaGVjayB3aGV0aGVyIGFueSBpdGVtcyB3ZXJlIHBhc3NlZCBpbiAoZS5nLiBpbnNlcnRpb25zKQogICAgICAgIC8vIG9yIGlmIHRoZSByZXR1cm4gYXJyYXkgY29udGFpbnMgaXRlbXMgKGUuZy4gZGVsZXRpb25zKS4KICAgICAgICAvLyBPbmx5IG5vdGlmeSBpZiBpdGVtcyB3ZXJlIGFkZGVkIG9yIGRlbGV0ZWQuCiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCB8fCByZXQubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgc3RhcnQsIGl0ZW1zLmxlbmd0aCwgcmV0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBzaGlmdChwYXRoKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIGxldCBoYWRMZW5ndGggPSBCb29sZWFuKGFycmF5Lmxlbmd0aCk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnNoaWZ0KCk7CiAgICAgICAgaWYgKGhhZExlbmd0aCkgewogICAgICAgICAgbm90aWZ5U3BsaWNlKHRoaXMsIGFycmF5LCBpbmZvLnBhdGgsIDAsIDAsIFtyZXRdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgaXRlbXMgb250byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnB1c2hgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHBhcmFtIHsuLi4qfSBpdGVtcyBJdGVtcyB0byBpbnNlcnQgaW5mbyBhcnJheQogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IE5ldyBsZW5ndGggb2YgdGhlIGFycmF5LgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICB1bnNoaWZ0KHBhdGgsIC4uLml0ZW1zKSB7CiAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIGxldCByZXQgPSBhcnJheS51bnNoaWZ0KC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgaXRlbXMubGVuZ3RoLCBbXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhIHBhdGggaGFzIGNoYW5nZWQuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgICB0aGlzLml0ZW0udXNlci5uYW1lID0gJ0JvYic7CiAgICAgICAqICAgICB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW0udXNlci5uYW1lJyk7CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdGhhdCBzaG91bGQgYmUgbm90aWZpZWQuCiAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFZhbHVlIGF0IHRoZSBwYXRoIChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgKi8KICAgICAgbm90aWZ5UGF0aChwYXRoLCB2YWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIGxldCBwcm9wUGF0aDsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAvLyBHZXQgdmFsdWUgaWYgbm90IHN1cHBsaWVkCiAgICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbyk7CiAgICAgICAgICBwcm9wUGF0aCA9IGluZm8ucGF0aDsKICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwYXRoIGlmIG5lZWRlZAogICAgICAgICAgcHJvcFBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9wUGF0aCA9IC8qKiBAdHlwZXtzdHJpbmd9ICovKHBhdGgpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHByb3BQYXRoLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSkpIHsKICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBwcm90ZWN0ZWRTZXR0ZXIgQ3JlYXRlcyBhIGN1c3RvbSBwcm90ZWN0ZWQgc2V0dGVyCiAgICAgICAqICAgd2hlbiBgdHJ1ZWAuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9jcmVhdGVSZWFkT25seVByb3BlcnR5KHByb3BlcnR5LCBwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgICBpZiAocHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgICB0aGlzWydfc2V0JyArIHVwcGVyKHByb3BlcnR5KV0gPSAvKiogQHRoaXMge1Byb3BlcnR5RWZmZWN0c30gKi9mdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUHJvcGVydHlPYnNlcnZlcmAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9uKCosKil9IG1ldGhvZCBGdW5jdGlvbiBvciBuYW1lIG9mIG9ic2VydmVyIG1ldGhvZCB0byBjYWxsCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGR5bmFtaWNGbiBXaGV0aGVyIHRoZSBtZXRob2QgbmFtZSBzaG91bGQgYmUgaW5jbHVkZWQgYXMKICAgICAgICogICBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIocHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuKSB7CiAgICAgICAgbGV0IGluZm8gPSB7IHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbjogQm9vbGVhbihkeW5hbWljRm4pIH07CiAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgIGZuOiBydW5PYnNlcnZlckVmZmVjdCwgaW5mbywgdHJpZ2dlcjoge25hbWU6IHByb3BlcnR5fQogICAgICAgIH0pOwogICAgICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyhtZXRob2QpLCBUWVBFUy5PQlNFUlZFLCB7CiAgICAgICAgICAgIGZuOiBydW5PYnNlcnZlckVmZmVjdCwgaW5mbywgdHJpZ2dlcjoge25hbWU6IG1ldGhvZH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVNZXRob2RPYnNlcnZlcmAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIE1ldGhvZCBleHByZXNzaW9uCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcKICAgICAgICogICB3aGV0aGVyIG1ldGhvZCBuYW1lcyBzaG91bGQgYmUgaW5jbHVkZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9jcmVhdGVNZXRob2RPYnNlcnZlcihleHByZXNzaW9uLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgc2lnID0gcGFyc2VNZXRob2QoZXhwcmVzc2lvbik7CiAgICAgICAgaWYgKCFzaWcpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIG9ic2VydmVyIGV4cHJlc3Npb24gJyIgKyBleHByZXNzaW9uICsgIiciKTsKICAgICAgICB9CiAgICAgICAgY3JlYXRlTWV0aG9kRWZmZWN0KHRoaXMsIHNpZywgVFlQRVMuT0JTRVJWRSwgcnVuTWV0aG9kRWZmZWN0LCBudWxsLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLk5PVElGWSwgewogICAgICAgICAgZm46IHJ1bk5vdGlmeUVmZmVjdCwKICAgICAgICAgIGluZm86IHsKICAgICAgICAgICAgZXZlbnROYW1lOiBDYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShwcm9wZXJ0eSkgKyAnLWNoYW5nZWQnLAogICAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHkKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVSZWZsZWN0ZWRQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9jcmVhdGVSZWZsZWN0ZWRQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIGxldCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgIGlmIChhdHRyWzBdID09PSAnLScpIHsKICAgICAgICAgIGNvbnNvbGUud2FybignUHJvcGVydHkgJyArIHByb3BlcnR5ICsgJyBjYW5ub3QgYmUgcmVmbGVjdGVkIHRvIGF0dHJpYnV0ZSAnICsKICAgICAgICAgICAgYXR0ciArICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgc3RhcnRpbmcgYXR0cmlidXRlIG5hbWUuIFVzZSBhIGxvd2VyY2FzZSBmaXJzdCBsZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSBpbnN0ZWFkLicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVGTEVDVCwgewogICAgICAgICAgICBmbjogcnVuUmVmbGVjdEVmZmVjdCwKICAgICAgICAgICAgaW5mbzogewogICAgICAgICAgICAgIGF0dHJOYW1lOiBhdHRyCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVDb21wdXRlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgY29tcHV0ZWQgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIE1ldGhvZCBleHByZXNzaW9uCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcKICAgICAgICogICB3aGV0aGVyIG1ldGhvZCBuYW1lcyBzaG91bGQgYmUgaW5jbHVkZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgc2lnID0gcGFyc2VNZXRob2QoZXhwcmVzc2lvbik7CiAgICAgICAgaWYgKCFzaWcpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIGNvbXB1dGVkIGV4cHJlc3Npb24gJyIgKyBleHByZXNzaW9uICsgIiciKTsKICAgICAgICB9CiAgICAgICAgY3JlYXRlTWV0aG9kRWZmZWN0KHRoaXMsIHNpZywgVFlQRVMuQ09NUFVURSwgcnVuQ29tcHV0ZWRFZmZlY3QsIHByb3BlcnR5LCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogR2F0aGVyIHRoZSBhcmd1bWVudCB2YWx1ZXMgZm9yIGEgbWV0aG9kIHNwZWNpZmllZCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkKICAgICAgICogb2YgYXJndW1lbnQgbWV0YWRhdGEuCiAgICAgICAqCiAgICAgICAqIFRoZSBgcGF0aGAgYW5kIGB2YWx1ZWAgYXJndW1lbnRzIGFyZSB1c2VkIHRvIGZpbGwgaW4gd2lsZGNhcmQgZGVzY3JpcHRvcgogICAgICAgKiB3aGVuIHRoZSBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGEgcGF0aCBub3RpZmljYXRpb24uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUFycmF5PCFNZXRob2RBcmc+fSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50IG1ldGFkYXRhCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFByb3BlcnR5L3BhdGggbmFtZSB0aGF0IHRyaWdnZXJlZCB0aGUgbWV0aG9kIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAgICAgKiBAcmV0dXJuIHtBcnJheTwqPn0gQXJyYXkgb2YgYXJndW1lbnQgdmFsdWVzCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfbWFyc2hhbEFyZ3MoYXJncywgcGF0aCwgcHJvcHMpIHsKICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fX2RhdGE7CiAgICAgICAgbGV0IHZhbHVlcyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgbD1hcmdzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgIGxldCBhcmcgPSBhcmdzW2ldOwogICAgICAgICAgbGV0IG5hbWUgPSBhcmcubmFtZTsKICAgICAgICAgIGxldCB2OwogICAgICAgICAgaWYgKGFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgIHYgPSBhcmcudmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoYXJnLnN0cnVjdHVyZWQpIHsKICAgICAgICAgICAgICB2ID0gUG9seW1lci5QYXRoLmdldChkYXRhLCBuYW1lKTsKICAgICAgICAgICAgICAvLyB3aGVuIGRhdGEgaXMgbm90IHN0b3JlZCBlLmcuIGBzcGxpY2VzYAogICAgICAgICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHYgPSBwcm9wc1tuYW1lXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdiA9IGRhdGFbbmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChhcmcud2lsZGNhcmQpIHsKICAgICAgICAgICAgLy8gT25seSBzZW5kIHRoZSBhY3R1YWwgcGF0aCBjaGFuZ2VkIGluZm8gaWYgdGhlIGNoYW5nZSB0aGF0CiAgICAgICAgICAgIC8vIGNhdXNlZCB0aGUgb2JzZXJ2ZXIgdG8gcnVuIG1hdGNoZWQgdGhlIHdpbGRjYXJkCiAgICAgICAgICAgIGxldCBiYXNlQ2hhbmdlZCA9IChuYW1lLmluZGV4T2YocGF0aCArICcuJykgPT09IDApOwogICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IChwYXRoLmluZGV4T2YobmFtZSkgPT09IDAgJiYgIWJhc2VDaGFuZ2VkKTsKICAgICAgICAgICAgdmFsdWVzW2ldID0gewogICAgICAgICAgICAgIHBhdGg6IG1hdGNoZXMgPyBwYXRoIDogbmFtZSwKICAgICAgICAgICAgICB2YWx1ZTogbWF0Y2hlcyA/IHByb3BzW3BhdGhdIDogdiwKICAgICAgICAgICAgICBiYXNlOiB2CiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZXNbaV0gPSB2OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICB9CgogICAgICAvLyAtLSBzdGF0aWMgY2xhc3MgbWV0aG9kcyAtLS0tLS0tLS0tLS0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGFjY2Vzc29yIGV4aXN0cyBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSwgYW5kIGFkZHMKICAgICAgICogdG8gYSBsaXN0IG9mICJwcm9wZXJ0eSBlZmZlY3RzIiB0aGF0IHdpbGwgcnVuIHdoZW4gdGhlIGFjY2Vzc29yIGZvcgogICAgICAgKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIHNldC4gIEVmZmVjdHMgYXJlIGdyb3VwZWQgYnkgInR5cGUiLCB3aGljaAogICAgICAgKiByb3VnaGx5IGNvcnJlc3BvbmRzIHRvIGEgcGhhc2UgaW4gZWZmZWN0IHByb2Nlc3NpbmcuICBUaGUgZWZmZWN0CiAgICAgICAqIG1ldGFkYXRhIHNob3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm06CiAgICAgICAqCiAgICAgICAqICAgICB7CiAgICAgICAqICAgICAgIGZuOiBlZmZlY3RGdW5jdGlvbiwgLy8gUmVmZXJlbmNlIHRvIGZ1bmN0aW9uIHRvIGNhbGwgdG8gcGVyZm9ybSBlZmZlY3QKICAgICAgICogICAgICAgaW5mbzogeyAuLi4gfSAgICAgICAvLyBFZmZlY3QgbWV0YWRhdGEgcGFzc2VkIHRvIGZ1bmN0aW9uCiAgICAgICAqICAgICAgIHRyaWdnZXI6IHsgICAgICAgICAgLy8gT3B0aW9uYWwgdHJpZ2dlcmluZyBtZXRhZGF0YTsgaWYgbm90IHByb3ZpZGVkCiAgICAgICAqICAgICAgICAgbmFtZTogc3RyaW5nICAgICAgLy8gdGhlIHByb3BlcnR5IGlzIHRyZWF0ZWQgYXMgYSB3aWxkY2FyZAogICAgICAgKiAgICAgICAgIHN0cnVjdHVyZWQ6IGJvb2xlYW4KICAgICAgICogICAgICAgICB3aWxkY2FyZDogYm9vbGVhbgogICAgICAgKiAgICAgICB9CiAgICAgICAqICAgICB9CiAgICAgICAqCiAgICAgICAqIEVmZmVjdHMgYXJlIGNhbGxlZCBmcm9tIGBfcHJvcGVydGllc0NoYW5nZWRgIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgYnkKICAgICAgICogdHlwZToKICAgICAgICoKICAgICAgICogMS4gQ09NUFVURQogICAgICAgKiAyLiBQUk9QQUdBVEUKICAgICAgICogMy4gUkVGTEVDVAogICAgICAgKiA0LiBPQlNFUlZFCiAgICAgICAqIDUuIE5PVElGWQogICAgICAgKgogICAgICAgKiBFZmZlY3QgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKICAgICAgICoKICAgICAgICogICAgIGVmZmVjdEZ1bmN0aW9uKGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYSBzaW5nbGUtcHJvcGVydHkgb2JzZXJ2ZXIgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIG11bHRpLXByb3BlcnR5ICJtZXRob2Qgb2JzZXJ2ZXIiIGJhc2VkIG9uIHRoZSBwcm92aWRlZAogICAgICAgKiBleHByZXNzaW9uLCB3aGljaCBzaG91bGQgYmUgYSBzdHJpbmcgaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdAogICAgICAgKiBmdW5jdGlvbiBzaWduYXR1cmU6IGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYC4gIEVhY2ggYXJndW1lbnQKICAgICAgICogc2hvdWxkIGNvcnJlc3BvbmQgdG8gYSBwcm9wZXJ0eSBvciBwYXRoIGluIHRoZSBjb250ZXh0IG9mIHRoaXMKICAgICAgICogcHJvdG90eXBlIChvciBpbnN0YW5jZSksIG9yIG1heSBiZSBhIGxpdGVyYWwgc3RyaW5nIG9yIG51bWJlci4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVNZXRob2RPYnNlcnZlcihleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2F1c2VzIHRoZSBzZXR0ZXIgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSB0byBkaXNwYXRjaCBgPHByb3BlcnR5Pi1jaGFuZ2VkYAogICAgICAgKiBldmVudHMgdG8gbm90aWZ5IG9mIGNoYW5nZXMgdG8gdGhlIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUbyBzZXQgdGhlIHByb3BlcnR5LCB1c2UgdGhlIHByb3RlY3RlZCBgX3NldFByb3BlcnR5YCBBUEkuCiAgICAgICAqIFRvIGNyZWF0ZSBhIGN1c3RvbSBwcm90ZWN0ZWQgc2V0dGVyIChlLmcuIGBfc2V0TXlQcm9wKClgIGZvcgogICAgICAgKiBwcm9wZXJ0eSBgbXlQcm9wYCksIHBhc3MgYHRydWVgIGZvciBgcHJvdGVjdGVkU2V0dGVyYC4KICAgICAgICoKICAgICAgICogTm90ZSwgaWYgdGhlIHByb3BlcnR5IHdpbGwgaGF2ZSBvdGhlciBwcm9wZXJ0eSBlZmZlY3RzLCB0aGlzIG1ldGhvZAogICAgICAgKiBzaG91bGQgYmUgY2FsbGVkIGZpcnN0LCBiZWZvcmUgYWRkaW5nIG90aGVyIGVmZmVjdHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVSZWFkT25seVByb3BlcnR5KHByb3BlcnR5LCBwcm90ZWN0ZWRTZXR0ZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2F1c2VzIHRoZSBzZXR0ZXIgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSB0byByZWZsZWN0IHRoZSBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiB0byBhIChkYXNoLWNhc2VkKSBhdHRyaWJ1dGUgb2YgdGhlIHNhbWUgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYSBjb21wdXRlZCBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHJlc3VsdCBvZiB0aGUKICAgICAgICogbWV0aG9kIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gYGV4cHJlc3Npb25gIGVhY2ggdGltZSBvbmUgb3IgbW9yZQogICAgICAgKiBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZCBjaGFuZ2VzLiAgVGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIGEgc3RyaW5nCiAgICAgICAqIGluIHRoZSBmb3JtIG9mIGEgbm9ybWFsIEphdmFTY3JpcHQgZnVuY3Rpb24gc2lnbmF0dXJlOgogICAgICAgKiBgJ21ldGhvZE5hbWUoYXJnMSwgWy4uLiwgYXJnbl0pJ2AKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgY29tcHV0ZWQgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIE1ldGhvZCBleHByZXNzaW9uCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcgd2hldGhlcgogICAgICAgKiAgIG1ldGhvZCBuYW1lcyBzaG91bGQgYmUgaW5jbHVkZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eShwcm9wZXJ0eSwgZXhwcmVzc2lvbiwgZHluYW1pY0ZuKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgdG8gZW5zdXJlIGJpbmRpbmcgZWZmZWN0cyBhcmUgY3JlYXRlZAogICAgICAgKiBmb3IgdGhlbSwgYW5kIHRoZW4gZW5zdXJlcyBwcm9wZXJ0eSBhY2Nlc3NvcnMgYXJlIGNyZWF0ZWQgZm9yIGFueQogICAgICAgKiBkZXBlbmRlbnQgcHJvcGVydGllcyBpbiB0aGUgdGVtcGxhdGUuICBCaW5kaW5nIGVmZmVjdHMgZm9yIGJvdW5kCiAgICAgICAqIHRlbXBsYXRlcyBhcmUgc3RvcmVkIGluIGEgbGlua2VkIGxpc3Qgb24gdGhlIGluc3RhbmNlIHNvIHRoYXQKICAgICAgICogdGVtcGxhdGVzIGNhbiBiZSBlZmZpY2llbnRseSBzdGFtcGVkIGFuZCB1bnN0YW1wZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYmluZFRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICB9CgogICAgICAvLyAtLSBiaW5kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgYmluZFRlbXBsYXRlYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiB0aGUgcHJvdG90eXBlIChmb3IgcHJvdG90eXBpY2FsIHRlbXBsYXRlCiAgICAgICAqIGJpbmRpbmcsIHRvIGF2b2lkIGNyZWF0aW5nIGFjY2Vzc29ycyBldmVyeSBpbnN0YW5jZSkgb25jZSBwZXIgcHJvdG90eXBlLAogICAgICAgKiBhbmQgd2lsbCBiZSBjYWxsZWQgd2l0aCBgcnVudGltZUJpbmRpbmc6IHRydWVgIGJ5IGBfc3RhbXBUZW1wbGF0ZWAgdG8KICAgICAgICogY3JlYXRlIGFuZCBsaW5rIGFuIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggYQogICAgICAgKiBwYXJ0aWN1bGFyIHN0YW1waW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSBjb250YWluaW5nIGJpbmRpbmcKICAgICAgICogICBiaW5kaW5ncwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpbnN0YW5jZUJpbmRpbmcgV2hlbiBmYWxzZSAoZGVmYXVsdCksIHBlcmZvcm1zCiAgICAgICAqICAgInByb3RvdHlwaWNhbCIgYmluZGluZyBvZiB0aGUgdGVtcGxhdGUgYW5kIG92ZXJ3cml0ZXMgYW55IHByZXZpb3VzbHkKICAgICAgICogICBib3VuZCB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLiBXaGVuIHRydWUgKGFzIHBhc3NlZCBmcm9tCiAgICAgICAqICAgYF9zdGFtcFRlbXBsYXRlYCksIHRoZSB0ZW1wbGF0ZSBpbmZvIGlzIGluc3RhbmNlZCBhbmQgbGlua2VkIGludG8KICAgICAgICogICB0aGUgbGlzdCBvZiBib3VuZCB0ZW1wbGF0ZXMuCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdDsgZm9yIGBydW50aW1lQmluZGluZ2AsCiAgICAgICAqICAgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlIGluZm8KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSwgaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IHRoaXMuY29uc3RydWN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCB3YXNQcmVCb3VuZCA9IHRoaXMuX190ZW1wbGF0ZUluZm8gPT0gdGVtcGxhdGVJbmZvOwogICAgICAgIC8vIE9wdGltaXphdGlvbjogc2luY2UgdGhpcyBpcyBjYWxsZWQgdHdpY2UgZm9yIHByb3RvLWJvdW5kIHRlbXBsYXRlcywKICAgICAgICAvLyBkb24ndCBhdHRlbXB0IHRvIHJlY3JlYXRlIGFjY2Vzc29ycyBpZiB0aGlzIHRlbXBsYXRlIHdhcyBwcmUtYm91bmQKICAgICAgICBpZiAoIXdhc1ByZUJvdW5kKSB7CiAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMpIHsKICAgICAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGluc3RhbmNlQmluZGluZykgewogICAgICAgICAgLy8gRm9yIGluc3RhbmNlLXRpbWUgYmluZGluZywgY3JlYXRlIGluc3RhbmNlIG9mIHRlbXBsYXRlIG1ldGFkYXRhCiAgICAgICAgICAvLyBhbmQgbGluayBpbnRvIGxpc3Qgb2YgdGVtcGxhdGVzIGlmIG5lY2Vzc2FyeQogICAgICAgICAgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyhPYmplY3QuY3JlYXRlKHRlbXBsYXRlSW5mbykpOwogICAgICAgICAgdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kID0gd2FzUHJlQm91bmQ7CiAgICAgICAgICBpZiAoIXdhc1ByZUJvdW5kICYmIHRoaXMuX190ZW1wbGF0ZUluZm8pIHsKICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCB8fCB0aGlzLl9fdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IGxhc3QubmV4dFRlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gbGFzdDsKICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlSW5mbzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX190ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGEgcHJvcGVydHkgZWZmZWN0IHRvIHRoZSBnaXZlbiB0ZW1wbGF0ZSBtZXRhZGF0YSwgd2hpY2ggaXMgcnVuCiAgICAgICAqIGF0IHRoZSAicHJvcGFnYXRlIiBzdGFnZSBvZiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCB3aGVuIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBoYXMgYmVlbiBib3VuZCB0byB0aGUgZWxlbWVudCB2aWEgYF9iaW5kVGVtcGxhdGVgLgogICAgICAgKgogICAgICAgKiBUaGUgYGVmZmVjdGAgb2JqZWN0IHNob3VsZCBtYXRjaCB0aGUgZm9ybWF0IGluIGBfYWRkUHJvcGVydHlFZmZlY3RgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIHRvIGFkZCBlZmZlY3QgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdGhhdCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0KHRlbXBsYXRlSW5mbywgcHJvcCwgZWZmZWN0KSB7CiAgICAgICAgbGV0IGhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICAgIGhvc3RQcm9wc1twcm9wXSA9IHRydWU7CiAgICAgICAgbGV0IGVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzID0gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cyB8fCB7fTsKICAgICAgICBsZXQgcHJvcEVmZmVjdHMgPSBlZmZlY3RzW3Byb3BdID0gZWZmZWN0c1twcm9wXSB8fCBbXTsKICAgICAgICBwcm9wRWZmZWN0cy5wdXNoKGVmZmVjdCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFtcHMgdGhlIHByb3ZpZGVkIHRlbXBsYXRlIGFuZCBwZXJmb3JtcyBpbnN0YW5jZS10aW1lIHNldHVwIGZvcgogICAgICAgKiBQb2x5bWVyIHRlbXBsYXRlIGZlYXR1cmVzLCBpbmNsdWRpbmcgZGF0YSBiaW5kaW5ncywgZGVjbGFyYXRpdmUgZXZlbnQKICAgICAgICogbGlzdGVuZXJzLCBhbmQgdGhlIGB0aGlzLiRgIG1hcCBvZiBgaWRgJ3MgdG8gbm9kZXMuICBBIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGlzIHJldHVybmVkIGNvbnRhaW5pbmcgdGhlIHN0YW1wZWQgRE9NLCByZWFkeSBmb3IgaW5zZXJ0aW9uIGludG8gdGhlCiAgICAgICAqIERPTS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZTsgaG93ZXZlciBub3RlIHRoYXQgZHVlIHRvCiAgICAgICAqIGBzaGFkeWNzc2AgcG9seWZpbGwgbGltaXRhdGlvbnMsIG9ubHkgc3R5bGVzIGZyb20gdGVtcGxhdGVzIHByZXBhcmVkCiAgICAgICAqIHVzaW5nIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIHdpbGwgYmUgY29ycmVjdGx5IHBvbHlmaWxsZWQgKHNjb3BlZAogICAgICAgKiB0byB0aGUgc2hhZG93IHJvb3QgYW5kIHN1cHBvcnQgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzKSwgYW5kIG5vdGUgdGhhdAogICAgICAgKiBgU2hhZHlDU1MucHJlcGFyZVRlbXBsYXRlYCBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgZWxlbWVudC4gQXMgc3VjaCwKICAgICAgICogYW55IHN0eWxlcyByZXF1aXJlZCBieSBpbiBydW50aW1lLXN0YW1wZWQgdGVtcGxhdGVzIG11c3QgYmUgaW5jbHVkZWQKICAgICAgICogaW4gdGhlIG1haW4gZWxlbWVudCB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gc3RhbXAKICAgICAgICogQHJldHVybiB7IVN0YW1wZWRUZW1wbGF0ZX0gQ2xvbmVkIHRlbXBsYXRlIGNvbnRlbnQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgLy8gRW5zdXJlcyB0aGF0IGNyZWF0ZWQgZG9tIGlzIGBfZW5xdWV1ZUNsaWVudGAnZCB0byB0aGlzIGVsZW1lbnQgc28KICAgICAgICAvLyB0aGF0IGl0IGNhbiBiZSBmbHVzaGVkIG9uIG5leHQgY2FsbCB0byBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICBob3N0U3RhY2suYmVnaW5Ib3N0aW5nKHRoaXMpOwogICAgICAgIGxldCBkb20gPSBzdXBlci5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgaG9zdFN0YWNrLmVuZEhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IC8qKiBAdHlwZSB7IVRlbXBsYXRlSW5mb30gKi8odGhpcy5fYmluZFRlbXBsYXRlKHRlbXBsYXRlLCB0cnVlKSk7CiAgICAgICAgLy8gQWRkIHRlbXBsYXRlLWluc3RhbmNlLXNwZWNpZmljIGRhdGEgdG8gaW5zdGFuY2VkIHRlbXBsYXRlSW5mbwogICAgICAgIHRlbXBsYXRlSW5mby5ub2RlTGlzdCA9IGRvbS5ub2RlTGlzdDsKICAgICAgICAvLyBDYXB0dXJlIGNoaWxkIG5vZGVzIHRvIGFsbG93IHVuc3RhbXBpbmcgb2Ygbm9uLXByb3RvdHlwaWNhbCB0ZW1wbGF0ZXMKICAgICAgICBpZiAoIXRlbXBsYXRlSW5mby53YXNQcmVCb3VuZCkgewogICAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXMgPSBbXTsKICAgICAgICAgIGZvciAobGV0IG49ZG9tLmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgICBub2Rlcy5wdXNoKG4pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkb20udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIC8vIFNldHVwIGNvbXBvdW5kIHN0b3JhZ2UsIDItd2F5IGxpc3RlbmVycywgYW5kIGRhdGFIb3N0IGZvciBiaW5kaW5ncwogICAgICAgIHNldHVwQmluZGluZ3ModGhpcywgdGVtcGxhdGVJbmZvKTsKICAgICAgICAvLyBGbHVzaCBwcm9wZXJ0aWVzIGludG8gdGVtcGxhdGUgbm9kZXMgaWYgYWxyZWFkeSBib290ZWQKICAgICAgICBpZiAodGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgcnVuRWZmZWN0cyh0aGlzLCB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzLCB0aGlzLl9fZGF0YSwgbnVsbCwKICAgICAgICAgICAgZmFsc2UsIHRlbXBsYXRlSW5mby5ub2RlTGlzdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuZCB1bmJpbmRzIHRoZSBub2RlcyBwcmV2aW91c2x5IGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQKICAgICAgICogRG9jdW1lbnRGcmFnbWVudCByZXR1cm5lZCBmcm9tIGBfc3RhbXBUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IVN0YW1wZWRUZW1wbGF0ZX0gZG9tIERvY3VtZW50RnJhZ21lbnQgcHJldmlvdXNseSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYF9zdGFtcFRlbXBsYXRlYCBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGVzIHRvIGJlIHJlbW92ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlbW92ZUJvdW5kRG9tKGRvbSkgewogICAgICAgIC8vIFVubGluayB0ZW1wbGF0ZSBpbmZvCiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGRvbS50ZW1wbGF0ZUluZm87CiAgICAgICAgaWYgKHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbykgewogICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPQogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID09IHRlbXBsYXRlSW5mbykgewogICAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPSB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvID0gbnVsbDsKICAgICAgICAvLyBSZW1vdmUgc3RhbXBlZCBub2RlcwogICAgICAgIGxldCBub2RlcyA9IHRlbXBsYXRlSW5mby5jaGlsZE5vZGVzOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1tpXTsKICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBgVGV4dE5vZGVgJ3MnIGB0ZXh0Q29udGVudGAuICBBIGBiaW5kaW5nc2AKICAgICAgICogYXJyYXkgaXMgYWRkZWQgdG8gYG5vZGVJbmZvYCBhbmQgcG9wdWxhdGVkIHdpdGggYmluZGluZyBtZXRhZGF0YQogICAgICAgKiB3aXRoIGluZm9ybWF0aW9uIGNhcHR1cmluZyB0aGUgYmluZGluZyB0YXJnZXQsIGFuZCBhIGBwYXJ0c2AgYXJyYXkKICAgICAgICogd2l0aCBvbmUgb3IgbW9yZSBtZXRhZGF0YSBvYmplY3RzIGNhcHR1cmluZyB0aGUgc291cmNlKHMpIG9mIHRoZQogICAgICAgKiBiaW5kaW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGVJbmZvfSBub2RlSW5mbyBOb2RlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlIG5vZGUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZCA9IHN1cGVyLl9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IHRoaXMuX3BhcnNlQmluZGluZ3Mobm9kZS50ZXh0Q29udGVudCwgdGVtcGxhdGVJbmZvKTsKICAgICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0ZXh0Q29udGVudCB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICAgIC8vIE5PVEU6IGRlZmF1bHQgdG8gYSBzcGFjZSBoZXJlIHNvIHRoZSB0ZXh0Tm9kZSByZW1haW5zOyBzb21lIGJyb3dzZXJzCiAgICAgICAgICAgIC8vIChJRSkgb21pdCBhbiBlbXB0eSB0ZXh0Tm9kZSBmb2xsb3dpbmcgY2xvbmVOb2RlL2ltcG9ydE5vZGUuCiAgICAgICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB8fCAnICc7CiAgICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3RleHQnLCAndGV4dENvbnRlbnQnLCBwYXJ0cyk7CiAgICAgICAgICAgIG5vdGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgYFRlbXBsYXRlU3RhbXBgIGltcGxlbWVudGF0aW9uIHRvIGFkZCBzdXBwb3J0IGZvcgogICAgICAgKiBwYXJzaW5nIGJpbmRpbmdzIGZyb20gYXR0cmlidXRlcy4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBBdHRyaWJ1dGUgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgQXR0cmlidXRlIHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIG5hbWUsIHZhbHVlKSB7CiAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyh2YWx1ZSwgdGVtcGxhdGVJbmZvKTsKICAgICAgICBpZiAocGFydHMpIHsKICAgICAgICAgIC8vIEF0dHJpYnV0ZSBvciBwcm9wZXJ0eQogICAgICAgICAgbGV0IG9yaWdOYW1lID0gbmFtZTsKICAgICAgICAgIGxldCBraW5kID0gJ3Byb3BlcnR5JzsKICAgICAgICAgIC8vIFRoZSBvbmx5IHdheSB3ZSBzZWUgYSBjYXBpdGFsIGxldHRlciBoZXJlIGlzIGlmIHRoZSBhdHRyIGhhcwogICAgICAgICAgLy8gYSBjYXBpdGFsIGxldHRlciBpbiBpdCBwZXIgc3BlYy4gSW4gdGhpcyBjYXNlLCB0byBtYWtlIHN1cmUKICAgICAgICAgIC8vIHRoaXMgYmluZGluZyB3b3Jrcywgd2UgZ28gYWhlYWQgYW5kIG1ha2UgdGhlIGJpbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZS4KICAgICAgICAgIGlmIChjYXBpdGFsQXR0cmlidXRlUmVnZXgudGVzdChuYW1lKSkgewogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVbbmFtZS5sZW5ndGgtMV0gPT0gJyQnKSB7CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0xKTsKICAgICAgICAgICAga2luZCA9ICdhdHRyaWJ1dGUnOwogICAgICAgICAgfQogICAgICAgICAgLy8gSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgYmluZGluZ3Mgd2l0aCBhbnkgbGl0ZXJhbCBwYXJ0cwogICAgICAgICAgbGV0IGxpdGVyYWwgPSBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKTsKICAgICAgICAgIGlmIChsaXRlcmFsICYmIGtpbmQgPT0gJ2F0dHJpYnV0ZScpIHsKICAgICAgICAgICAgLy8gRW5zdXJlIGEgU2hhZHlDU1MgdGVtcGxhdGUgc2NvcGVkIHN0eWxlIGlzIG5vdCByZW1vdmVkCiAgICAgICAgICAgIC8vIHdoZW4gYSBjbGFzcyQgYmluZGluZydzIGluaXRpYWwgbGl0ZXJhbCB2YWx1ZSBpcyBzZXQuCiAgICAgICAgICAgIGlmIChuYW1lID09ICdjbGFzcycgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoJ2NsYXNzJykpIHsKICAgICAgICAgICAgICBsaXRlcmFsICs9ICcgJyArIG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIGxpdGVyYWwpOwogICAgICAgICAgfQogICAgICAgICAgLy8gQ2xlYXIgYXR0cmlidXRlIGJlZm9yZSByZW1vdmluZywgc2luY2UgSUUgd29uJ3QgYWxsb3cgcmVtb3ZpbmcKICAgICAgICAgIC8vIGB2YWx1ZWAgYXR0cmlidXRlIGlmIGl0IHByZXZpb3VzbHkgaGFkIGEgdmFsdWUgKGNhbid0CiAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHkgc2V0ICcnIGJlZm9yZSByZW1vdmluZyBzaW5jZSBhdHRyaWJ1dGVzIHdpdGggYCRgCiAgICAgICAgICAvLyBjYW4ndCBiZSBzZXQgdXNpbmcgc2V0QXR0cmlidXRlKQogICAgICAgICAgaWYgKG5vZGUubG9jYWxOYW1lID09PSAnaW5wdXQnICYmIG9yaWdOYW1lID09PSAndmFsdWUnKSB7CiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG9yaWdOYW1lLCAnJyk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBSZW1vdmUgYW5ub3RhdGlvbgogICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUob3JpZ05hbWUpOwogICAgICAgICAgLy8gQ2FzZSBoYWNrZXJ5OiBhdHRyaWJ1dGVzIGFyZSBsb3dlci1jYXNlLCBidXQgYmluZCB0YXJnZXRzCiAgICAgICAgICAvLyAocHJvcGVydGllcykgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBHYW1iaXQgaXMgdG8gbWFwIGRhc2gtY2FzZSB0bwogICAgICAgICAgLy8gY2FtZWwtY2FzZTogYGZvby1iYXJgIGJlY29tZXMgYGZvb0JhcmAuCiAgICAgICAgICAvLyBBdHRyaWJ1dGUgYmluZGluZ3MgYXJlIGV4Y2VwdGVkLgogICAgICAgICAgaWYgKGtpbmQgPT09ICdwcm9wZXJ0eScpIHsKICAgICAgICAgICAgbmFtZSA9IFBvbHltZXIuQ2FzZU1hcC5kYXNoVG9DYW1lbENhc2UobmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgICBhZGRCaW5kaW5nKHRoaXMsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGtpbmQsIG5hbWUsIHBhcnRzLCBsaXRlcmFsKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIGJpbmRpbmcgdGhlIHByb3BlcnRpZXMgdGhhdCBhIG5lc3RlZCB0ZW1wbGF0ZSBkZXBlbmRzIG9uIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBhcyBgX2hvc3RfPHByb3BlcnR5PmAuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTmVzdGVkVGVtcGxhdGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZCA9IHN1cGVyLl9wYXJzZVRlbXBsYXRlTmVzdGVkVGVtcGxhdGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgICAgLy8gTWVyZ2UgaG9zdCBwcm9wcyBpbnRvIG91dGVyIHRlbXBsYXRlIGFuZCBhZGQgYmluZGluZ3MKICAgICAgICBsZXQgaG9zdFByb3BzID0gbm9kZUluZm8udGVtcGxhdGVJbmZvLmhvc3RQcm9wczsKICAgICAgICBsZXQgbW9kZSA9ICd7JzsKICAgICAgICBmb3IgKGxldCBzb3VyY2UgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBsZXQgcGFydHMgPSBbeyBtb2RlLCBzb3VyY2UsIGRlcGVuZGVuY2llczogW3NvdXJjZV0gfV07CiAgICAgICAgICBhZGRCaW5kaW5nKHRoaXMsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sICdwcm9wZXJ0eScsICdfaG9zdF8nICsgc291cmNlLCBwYXJ0cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBwYXJzZSB0ZXh0IGluIGEgdGVtcGxhdGUgKGVpdGhlciBhdHRyaWJ1dGUgdmFsdWVzIG9yCiAgICAgICAqIHRleHRDb250ZW50KSBpbnRvIGJpbmRpbmcgbWV0YWRhdGEuCiAgICAgICAqCiAgICAgICAqIEFueSBvdmVycmlkZXMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBiaW5kaW5nIHBhcnQKICAgICAgICogbWV0YWRhdGEgIHJlcHJlc2VudGluZyBvbmUgb3IgbW9yZSBiaW5kaW5ncyBmb3VuZCBpbiB0aGUgcHJvdmlkZWQgdGV4dAogICAgICAgKiBhbmQgYW55ICJsaXRlcmFsIiB0ZXh0IGluIGJldHdlZW4uICBBbnkgbm9uLWxpdGVyYWwgcGFydHMgd2lsbCBiZSBwYXNzZWQKICAgICAgICogdG8gYF9ldmFsdWF0ZUJpbmRpbmdgIHdoZW4gYW55IGRlcGVuZGVuY2llcyBjaGFuZ2UuICBUaGUgb25seSByZXF1aXJlZAogICAgICAgKiBmaWVsZHMgb2YgZWFjaCAicGFydCIgaW4gdGhlIHJldHVybmVkIGFycmF5IGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBkZXBlbmRlbmNpZXNgIC0gQXJyYXkgY29udGFpbmluZyB0cmlnZ2VyIG1ldGFkYXRhIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAqICAgdGhhdCBzaG91bGQgdHJpZ2dlciB0aGUgYmluZGluZyB0byB1cGRhdGUKICAgICAgICogLSBgbGl0ZXJhbGAgLSBTdHJpbmcgY29udGFpbmluZyB0ZXh0IGlmIHRoZSBwYXJ0IHJlcHJlc2VudHMgYSBsaXRlcmFsOwogICAgICAgKiAgIGluIHRoaXMgY2FzZSBubyBgZGVwZW5kZW5jaWVzYCBhcmUgbmVlZGVkCiAgICAgICAqCiAgICAgICAqIEFkZGl0aW9uYWwgbWV0YWRhdGEgZm9yIHVzZSBieSBgX2V2YWx1YXRlQmluZGluZ2AgbWF5IGJlIHByb3ZpZGVkIGluCiAgICAgICAqIGVhY2ggcGFydCBvYmplY3QgYXMgbmVlZGVkLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgYmluZGluZ3MKICAgICAgICogKG9uZSBvciBtb3JlIG1heSBiZSBpbnRlcm1peGVkIHdpdGggbGl0ZXJhbCBzdHJpbmdzKToKICAgICAgICogLSBQcm9wZXJ0eSBiaW5kaW5nOiBgW1twcm9wXV1gCiAgICAgICAqIC0gUGF0aCBiaW5kaW5nOiBgW1tvYmplY3QucHJvcF1dYAogICAgICAgKiAtIE5lZ2F0ZWQgcHJvcGVydHkgb3IgcGF0aCBiaW5kaW5nczogYFtbIXByb3BdXWAgb3IgYFtbIW9iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gVHdvLXdheSBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzIChzdXBwb3J0cyBuZWdhdGlvbik6CiAgICAgICAqICAgYHt7cHJvcH19YCwgYHt7b2JqZWN0LnByb3B9fWAsIGB7eyFwcm9wfX1gIG9yIGB7eyFvYmplY3QucHJvcH19YAogICAgICAgKiAtIElubGluZSBjb21wdXRlZCBtZXRob2QgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBgW1tjb21wdXRlKGEsICdsaXRlcmFsJywgYildXWAsIGBbWyFjb21wdXRlKGEsICdsaXRlcmFsJywgYildXWAKICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdXNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgYmVzdAogICAgICAgKiBwZXJmb3JtYW5jZS4gSG93ZXZlciwgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VzIGEgd2hpdGUtbGlzdCBvZgogICAgICAgKiBhbGxvd2VkIGNoYXJhY3RlcnMgaW4gYSBkYXRhLWJpbmRpbmcsIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBmb3IKICAgICAgICogZGF0YS1iaW5kaW5ncyB0aGF0IGRvIHVzZSBjaGFyYWN0ZXJzIG5vdCBpbiB0aGlzIHdoaXRlLWxpc3QuCiAgICAgICAqCiAgICAgICAqIEluc3RlYWQgb2YgdXBkYXRpbmcgdGhlIHdoaXRlLWxpc3Qgd2l0aCBhbGwgYWxsb3dlZCBjaGFyYWN0ZXJzLAogICAgICAgKiB0aGVyZSBpcyBhIFN0cmljdEJpbmRpbmdQYXJzZXIgKHNlZSBsaWIvbWl4aW5zL3N0cmljdC1iaW5kaW5nLXBhcnNlcikKICAgICAgICogdGhhdCB1c2VzIGEgc3RhdGUgbWFjaGluZSBpbnN0ZWFkLiBUaGlzIHN0YXRlIG1hY2hpbmUgaXMgYWJsZSB0byBoYW5kbGUKICAgICAgICogYWxsIGNoYXJhY3RlcnMuIEhvd2V2ZXIsIGl0IGlzIHNsaWdodGx5IGxlc3MgcGVyZm9ybWFudCwgdGhlcmVmb3JlIHdlCiAgICAgICAqIGV4dHJhY3RlZCBpdCBpbnRvIGEgc2VwYXJhdGUgb3B0aW9uYWwgbWl4aW4uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRleHQgdG8gcGFyc2UgZnJvbSBhdHRyaWJ1dGUgb3IgdGV4dENvbnRlbnQKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlSW5mbyBDdXJyZW50IHRlbXBsYXRlIG1ldGFkYXRhCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCFCaW5kaW5nUGFydD59IEFycmF5IG9mIGJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlQmluZGluZ3ModGV4dCwgdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgbGV0IHBhcnRzID0gW107CiAgICAgICAgbGV0IGxhc3RJbmRleCA9IDA7CiAgICAgICAgbGV0IG07CiAgICAgICAgLy8gRXhhbXBsZTogImxpdGVyYWwxe3twcm9wfX1saXRlcmFsMltbIWNvbXB1dGUoZm9vLGJhcildXWZpbmFsIgogICAgICAgIC8vIFJlZ2V4IG1hdGNoZXM6CiAgICAgICAgLy8gICAgICAgIEl0ZXJhdGlvbiAxOiAgSXRlcmF0aW9uIDI6CiAgICAgICAgLy8gbVsxXTogJ3t7JyAgICAgICAgICAnW1snCiAgICAgICAgLy8gbVsyXTogJycgICAgICAgICAgICAnIScKICAgICAgICAvLyBtWzNdOiAncHJvcCcgICAgICAgICdjb21wdXRlKGZvbyxiYXIpJwogICAgICAgIHdoaWxlICgobSA9IGJpbmRpbmdSZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkgewogICAgICAgICAgLy8gQWRkIGxpdGVyYWwgcGFydAogICAgICAgICAgaWYgKG0uaW5kZXggPiBsYXN0SW5kZXgpIHsKICAgICAgICAgICAgcGFydHMucHVzaCh7bGl0ZXJhbDogdGV4dC5zbGljZShsYXN0SW5kZXgsIG0uaW5kZXgpfSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBBZGQgYmluZGluZyBwYXJ0CiAgICAgICAgICBsZXQgbW9kZSA9IG1bMV1bMF07CiAgICAgICAgICBsZXQgbmVnYXRlID0gQm9vbGVhbihtWzJdKTsKICAgICAgICAgIGxldCBzb3VyY2UgPSBtWzNdLnRyaW0oKTsKICAgICAgICAgIGxldCBjdXN0b21FdmVudCA9IGZhbHNlLCBub3RpZnlFdmVudCA9ICcnLCBjb2xvbiA9IC0xOwogICAgICAgICAgaWYgKG1vZGUgPT0gJ3snICYmIChjb2xvbiA9IHNvdXJjZS5pbmRleE9mKCc6OicpKSA+IDApIHsKICAgICAgICAgICAgbm90aWZ5RXZlbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKGNvbG9uICsgMik7CiAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgY29sb24pOwogICAgICAgICAgICBjdXN0b21FdmVudCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgc2lnbmF0dXJlID0gcGFyc2VNZXRob2Qoc291cmNlKTsKICAgICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBbXTsKICAgICAgICAgIGlmIChzaWduYXR1cmUpIHsKICAgICAgICAgICAgLy8gSW5saW5lIGNvbXB1dGVkIGZ1bmN0aW9uCiAgICAgICAgICAgIGxldCB7YXJncywgbWV0aG9kTmFtZX0gPSBzaWduYXR1cmU7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICAgICAgaWYgKCFhcmcubGl0ZXJhbCkgewogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYXJnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGR5bmFtaWNGbnMgPSB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZuczsKICAgICAgICAgICAgaWYgKGR5bmFtaWNGbnMgJiYgZHluYW1pY0Zuc1ttZXRob2ROYW1lXSB8fCBzaWduYXR1cmUuc3RhdGljKSB7CiAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2gobWV0aG9kTmFtZSk7CiAgICAgICAgICAgICAgc2lnbmF0dXJlLmR5bmFtaWNGbiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFByb3BlcnR5IG9yIHBhdGgKICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goc291cmNlKTsKICAgICAgICAgIH0KICAgICAgICAgIHBhcnRzLnB1c2goewogICAgICAgICAgICBzb3VyY2UsIG1vZGUsIG5lZ2F0ZSwgY3VzdG9tRXZlbnQsIHNpZ25hdHVyZSwgZGVwZW5kZW5jaWVzLAogICAgICAgICAgICBldmVudDogbm90aWZ5RXZlbnQKICAgICAgICAgIH0pOwogICAgICAgICAgbGFzdEluZGV4ID0gYmluZGluZ1JlZ2V4Lmxhc3RJbmRleDsKICAgICAgICB9CiAgICAgICAgLy8gQWRkIGEgZmluYWwgbGl0ZXJhbCBwYXJ0CiAgICAgICAgaWYgKGxhc3RJbmRleCAmJiBsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgICAgICAgbGV0IGxpdGVyYWwgPSB0ZXh0LnN1YnN0cmluZyhsYXN0SW5kZXgpOwogICAgICAgICAgaWYgKGxpdGVyYWwpIHsKICAgICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgICAgbGl0ZXJhbDogbGl0ZXJhbAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgdG8gZXZhbHVhdGUgYSBwcmV2aW91c2x5IHBhcnNlZCBiaW5kaW5nIHBhcnQgYmFzZWQgb24gYSBzZXQgb2YKICAgICAgICogb25lIG9yIG1vcmUgY2hhbmdlZCBkZXBlbmRlbmNpZXMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7dGhpc30gaW5zdCBFbGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgc2NvcGUgZm9yCiAgICAgICAqICAgYmluZGluZyBkZXBlbmRlbmNpZXMKICAgICAgICogQHBhcmFtIHtCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCB0aGF0IHRyaWdnZXJlZCB0aGlzIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBwcm9wc2AgY29udGFpbnMgb25lIG9yIG1vcmUgcGF0aHMKICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgdGhlIGJpbmRpbmcgcGFydCBldmFsdWF0ZWQgdG8KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9ldmFsdWF0ZUJpbmRpbmcoaW5zdCwgcGFydCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgICAgIGxldCB2YWx1ZTsKICAgICAgICBpZiAocGFydC5zaWduYXR1cmUpIHsKICAgICAgICAgIHZhbHVlID0gcnVuTWV0aG9kRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgcGFydC5zaWduYXR1cmUpOwogICAgICAgIH0gZWxzZSBpZiAocGF0aCAhPSBwYXJ0LnNvdXJjZSkgewogICAgICAgICAgdmFsdWUgPSBQb2x5bWVyLlBhdGguZ2V0KGluc3QsIHBhcnQuc291cmNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGhhc1BhdGhzICYmIFBvbHltZXIuUGF0aC5pc1BhdGgocGF0aCkpIHsKICAgICAgICAgICAgdmFsdWUgPSBQb2x5bWVyLlBhdGguZ2V0KGluc3QsIHBhdGgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwYXRoXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBhcnQubmVnYXRlKSB7CiAgICAgICAgICB2YWx1ZSA9ICF2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CgogICAgfQoKICAgIC8vIG1ha2UgYSB0eXBpbmcgZm9yIGNsb3N1cmUgOlAKICAgIFByb3BlcnR5RWZmZWN0c1R5cGUgPSBQcm9wZXJ0eUVmZmVjdHM7CgogICAgcmV0dXJuIFByb3BlcnR5RWZmZWN0czsKICB9KTsKCiAgLyoqCiAgICogSGVscGVyIGFwaSBmb3IgZW5xdWV1aW5nIGNsaWVudCBkb20gY3JlYXRlZCBieSBhIGhvc3QgZWxlbWVudC4KICAgKgogICAqIEJ5IGRlZmF1bHQgZWxlbWVudHMgYXJlIGZsdXNoZWQgdmlhIGBfZmx1c2hQcm9wZXJ0aWVzYCB3aGVuCiAgICogYGNvbm5lY3RlZENhbGxiYWNrYCBpcyBjYWxsZWQuIEVsZW1lbnRzIGF0dGFjaCB0aGVpciBjbGllbnQgZG9tIHRvCiAgICogdGhlbXNlbHZlcyBhdCBgcmVhZHlgIHRpbWUgd2hpY2ggcmVzdWx0cyBmcm9tIHRoaXMgZmlyc3QgZmx1c2guCiAgICogVGhpcyBwcm92aWRlcyBhbiBvcmRlcmluZyBndWFyYW50ZWUgdGhhdCB0aGUgY2xpZW50IGRvbSBhbiBlbGVtZW50CiAgICogY3JlYXRlcyBpcyBmbHVzaGVkIGJlZm9yZSB0aGUgZWxlbWVudCBpdHNlbGYgKGkuZS4gY2xpZW50IGByZWFkeWAKICAgKiBmaXJlcyBiZWZvcmUgaG9zdCBgcmVhZHlgKS4KICAgKgogICAqIEhvd2V2ZXIsIGlmIGBfZmx1c2hQcm9wZXJ0aWVzYCBpcyBjYWxsZWQgKmJlZm9yZSogYW4gZWxlbWVudCBpcyBjb25uZWN0ZWQsCiAgICogYXMgZm9yIGV4YW1wbGUgYFRlbXBsYXRpemVgIGRvZXMsIHRoaXMgb3JkZXJpbmcgZ3VhcmFudGVlIGNhbm5vdCBiZQogICAqIHNhdGlzZmllZCBiZWNhdXNlIG5vIGVsZW1lbnRzIGFyZSBjb25uZWN0ZWQuIChOb3RlOiBCb3VuZCBlbGVtZW50cyB0aGF0CiAgICogcmVjZWl2ZSBkYXRhIGRvIGJlY29tZSBlbnF1ZXVlZCBjbGllbnRzIGFuZCBhcmUgcHJvcGVybHkgb3JkZXJlZCBidXQKICAgKiB1bmJvdW5kIGVsZW1lbnRzIGFyZSBub3QuKQogICAqCiAgICogVG8gbWFpbnRhaW4gdGhlIGRlc2lyZWQgImNsaWVudCBiZWZvcmUgaG9zdCIgb3JkZXJpbmcgZ3VhcmFudGVlIGZvciB0aGlzCiAgICogY2FzZSB3ZSByZWx5IG9uIHRoZSAiaG9zdCBzdGFjay4gQ2xpZW50IG5vZGVzIHJlZ2lzdGVycyB0aGVtc2VsdmVzIHdpdGgKICAgKiB0aGUgY3JlYXRpbmcgaG9zdCBlbGVtZW50IHdoZW4gY3JlYXRlZC4gVGhpcyBlbnN1cmVzIHRoYXQgYWxsIGNsaWVudCBkb20KICAgKiBpcyByZWFkaWVkIGluIHRoZSBwcm9wZXIgb3JkZXIsIG1haW50YWluaW5nIHRoZSBkZXNpcmVkIGd1YXJhbnRlZS4KICAgKgogICAqIEBwcml2YXRlCiAgICovCiAgbGV0IGhvc3RTdGFjayA9IHsKCiAgICBzdGFjazogW10sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYWRkIHRvIGhvc3RTdGFjawogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIHJlZ2lzdGVySG9zdChpbnN0KSB7CiAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCkgewogICAgICAgIGxldCBob3N0ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXTsKICAgICAgICBob3N0Ll9lbnF1ZXVlQ2xpZW50KGluc3QpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSBpbnN0IEluc3RhbmNlIHRvIGJlZ2luIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBiZWdpbkhvc3RpbmcoaW5zdCkgewogICAgICB0aGlzLnN0YWNrLnB1c2goaW5zdCk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSBpbnN0IEluc3RhbmNlIHRvIGVuZCBob3N0aW5nCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgZW5kSG9zdGluZyhpbnN0KSB7CiAgICAgIGxldCBzdGFja0xlbiA9IHRoaXMuc3RhY2subGVuZ3RoOwogICAgICBpZiAoc3RhY2tMZW4gJiYgdGhpcy5zdGFja1tzdGFja0xlbi0xXSA9PSBpbnN0KSB7CiAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKICAgICAgfQogICAgfQoKICB9OwoKfSkoKTsKPC9zY3JpcHQ+PHNjcmlwdD4KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUHJvdmlkZXMgYmFzaWMgdHJhY2tpbmcgb2YgZWxlbWVudCBkZWZpbml0aW9ucyAocmVnaXN0cmF0aW9ucykgYW5kCiAgICogaW5zdGFuY2UgY291bnRzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGJhc2ljIHRyYWNraW5nIG9mIGVsZW1lbnQgZGVmaW5pdGlvbnMgKHJlZ2lzdHJhdGlvbnMpIGFuZAogICAqIGluc3RhbmNlIGNvdW50cy4KICAgKi8KICBQb2x5bWVyLnRlbGVtZXRyeSA9IHsKICAgIC8qKgogICAgICogVG90YWwgbnVtYmVyIG9mIFBvbHltZXIgZWxlbWVudCBpbnN0YW5jZXMgY3JlYXRlZC4KICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgKi8KICAgIGluc3RhbmNlQ291bnQ6IDAsCiAgICAvKioKICAgICAqIEFycmF5IG9mIFBvbHltZXIgZWxlbWVudCBjbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGZpbmFsaXplZC4KICAgICAqIEB0eXBlIHtBcnJheTxQb2x5bWVyLkVsZW1lbnQ+fQogICAgICovCiAgICByZWdpc3RyYXRpb25zOiBbXSwKICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gcHJvdG90eXBlIEVsZW1lbnQgcHJvdG90eXBlIHRvIGxvZwogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcmVnTG9nOiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgY29uc29sZS5sb2coJ1snICsgcHJvdG90eXBlLmlzICsgJ106IHJlZ2lzdGVyZWQnKTsKICAgIH0sCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIGNsYXNzIHByb3RvdHlwZSBmb3IgdGVsZW1ldHJ5IHB1cnBvc2VzLgogICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcHJvdG90eXBlIEVsZW1lbnQgcHJvdG90eXBlIHRvIHJlZ2lzdGVyCiAgICAgKiBAdGhpcyB7dGhpc30KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKHByb3RvdHlwZSkgewogICAgICB0aGlzLnJlZ2lzdHJhdGlvbnMucHVzaChwcm90b3R5cGUpOwogICAgICBQb2x5bWVyLmxvZyAmJiB0aGlzLl9yZWdMb2cocHJvdG90eXBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIExvZ3MgYWxsIGVsZW1lbnRzIHJlZ2lzdGVyZWQgd2l0aCBhbiBgaXNgIHRvIHRoZSBjb25zb2xlLgogICAgICogQHB1YmxpYwogICAgICogQHRoaXMge3RoaXN9CiAgICAgKi8KICAgIGR1bXBSZWdpc3RyYXRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLmZvckVhY2godGhpcy5fcmVnTG9nKTsKICAgIH0KICB9OwoKfSkoKTsKPC9zY3JpcHQ+PHNjcmlwdD4KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZQogICAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXQKICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICBjb25zdCBvdXRwdXQgPSB7fTsKICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICBvdXRwdXRbcF0gPSAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpID8ge3R5cGU6IG99IDogbzsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvKioKICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgKiBtaXhpbiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gdG8gZGVjbGFyZSBwcm9wZXJ0aWVzIGluIGEgc3RhdGljCiAgICogZ2V0dGVyIChlLmcuIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsgcmV0dXJuIHsgZm9vOiBTdHJpbmcgfSB9KS4gQ2hhbmdlcwogICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgKgogICAqIFRoaXMgbWl4aW4gcHJvdmlkZXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgcmVuZGVyaW5nLiBVc2VycyBhcmUgZXhwZWN0ZWQKICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgKiB3YXkgbWFrZXMgc2Vuc2UuIFRoaXMgY2FuIGJlIGRvbmUgaW4gcmVhY3Rpb24gdG8gcHJvcGVydGllcyBjaGFuZ2luZyBieQogICAqIGltcGxlbWVudGluZyBgX3Byb3BlcnRpZXNDaGFuZ2VkYC4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1peGluIHRoYXQgcHJvdmlkZXMgYSBtaW5pbWFsIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZwogICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAqLwogICBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW4KICAgICAqIGluc3RhbmNlIG9mIHRoZSBQcm9wZXJ0aWVzTWl4aW4uCiAgICAgKgogICAgICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cGVyUHJvcGVydGllc0NsYXNzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAvLyBOb3RlLCB0aGUgYFByb3BlcnRpZXNNaXhpbmAgY2xhc3MgYmVsb3cgb25seSByZWZlcnMgdG8gdGhlIGNsYXNzCiAgICAgIC8vIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwgdG8gdGhlIG1peGluOyB0aGUgaW5zdGFuY2VvZiB0ZXN0IG9ubHkgd29ya3MKICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgIC8vIGFsbCBjb25zdHJ1Y3RvcnMgaW4gYSBwcm90byBjaGFpbiB3aWxsIHNlZSB0aGUgc2FtZSBgUHJvcGVydGllc01peGluYAogICAgICByZXR1cm4gKHN1cGVyQ3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzTWl4aW4pID8KICAgICAgICAvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyAoc3VwZXJDdG9yKSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlCiAgICAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0CiAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgKgogICAgICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgbGV0IHByb3BzID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKICAgICAgICAgIAogICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlcwogICAgICAgKiBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgLgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnKSkgewogICAgICAgICAgUG9seW1lci50ZWxlbWV0cnkucmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyA9IHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLm1hcChwID0+IHRoaXMuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHApKSA6IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgY2FsbHMKICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICBpZiAoc3VwZXJDdG9yKSB7CiAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eQogICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkCiAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAqIGF0IGxlYXN0IHt0eXBlfS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgX3Byb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KAogICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgIHN1cGVyQ3RvciAmJiBzdXBlckN0b3IuX3Byb3BlcnRpZXMsCiAgICAgICAgICAgIG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIHRvIHJldHVybiB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fcHJvcGVydGllc1tuYW1lXTsKICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnR5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvCiAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIFBvbHltZXIudGVsZW1ldHJ5Lmluc3RhbmNlQ291bnQrKzsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byBhIGRvY3VtZW50LgogICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0aWVzTWl4aW47CgogIH0pOwoKfSkoKTsKCjwvc2NyaXB0PjxzY3JpcHQ+CihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGJ1aWx0Q1NTID0gd2luZG93LlNoYWR5Q1NTICYmIHdpbmRvdy5TaGFkeUNTU1snY3NzQnVpbGQnXTsKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcKICAgKiBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywgYXR0cmlidXRlIGRlc2VyaWFsaXphdGlvbiwKICAgKiBhbmQgcHJvcGVydHkgY2hhbmdlIG9ic2VydmF0aW9uLgogICAqCiAgICogU3ViY2xhc3NlcnMgbWF5IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBzdGF0aWMgZ2V0dGVycyB0byByZXR1cm4gbWV0YWRhdGEKICAgKiB1c2VkIHRvIGNvbmZpZ3VyZSBQb2x5bWVyJ3MgZmVhdHVyZXMgZm9yIHRoZSBjbGFzczoKICAgKgogICAqIC0gYHN0YXRpYyBnZXQgaXMoKWA6IFdoZW4gdGhlIHRlbXBsYXRlIGlzIHByb3ZpZGVkIHZpYSBhIGBkb20tbW9kdWxlYCwKICAgKiAgIHVzZXJzIHNob3VsZCByZXR1cm4gdGhlIGBkb20tbW9kdWxlYCBpZCBmcm9tIGEgc3RhdGljIGBpc2AgZ2V0dGVyLiAgSWYKICAgKiAgIG5vIHRlbXBsYXRlIGlzIG5lZWRlZCBvciB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgZGlyZWN0bHkgdmlhIHRoZQogICAqICAgYHRlbXBsYXRlYCBnZXR0ZXIsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZGVmaW5lIGBpc2AgZm9yIHRoZSBlbGVtZW50LgogICAqCiAgICogLSBgc3RhdGljIGdldCB0ZW1wbGF0ZSgpYDogVXNlcnMgbWF5IHByb3ZpZGUgdGhlIHRlbXBsYXRlIGRpcmVjdGx5IChhcwogICAqICAgb3Bwb3NlZCB0byB2aWEgYGRvbS1tb2R1bGVgKSBieSBpbXBsZW1lbnRpbmcgYSBzdGF0aWMgYHRlbXBsYXRlYCBnZXR0ZXIuCiAgICogICBUaGUgZ2V0dGVyIG1heSByZXR1cm4gYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nLCB3aGljaCB3aWxsCiAgICogICBhdXRvbWF0aWNhbGx5IGJlIHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKWA6IFNob3VsZCByZXR1cm4gYW4gb2JqZWN0IGRlc2NyaWJpbmcKICAgKiAgIHByb3BlcnR5LXJlbGF0ZWQgbWV0YWRhdGEgdXNlZCBieSBQb2x5bWVyIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWUKICAgKiAgIHZhbHVlOiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0eSBtZXRhZGF0YSkuIFZhbGlkIGtleXMgaW4gcGVyLXByb3BlcnR5CiAgICogICBtZXRhZGF0YSBpbmNsdWRlOgogICAqICAgLSBgdHlwZWAgKFN0cmluZ3xOdW1iZXJ8T2JqZWN0fEFycmF5fC4uLik6IFVzZWQgYnkKICAgKiAgICAgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AgdG8gZGV0ZXJtaW5lIGhvdyBzdHJpbmctYmFzZWQgYXR0cmlidXRlcwogICAqICAgICBhcmUgZGVzZXJpYWxpemVkIHRvIEphdmFTY3JpcHQgcHJvcGVydHkgdmFsdWVzLgogICAqICAgLSBgbm90aWZ5YCAoYm9vbGVhbik6IENhdXNlcyBhIGNoYW5nZSBpbiB0aGUgcHJvcGVydHkgdG8gZmlyZSBhCiAgICogICAgIG5vbi1idWJibGluZyBldmVudCBjYWxsZWQgYDxwcm9wZXJ0eT4tY2hhbmdlZGAuIEVsZW1lbnRzIHRoYXQgaGF2ZQogICAqICAgICBlbmFibGVkIHR3by13YXkgYmluZGluZyB0byB0aGUgcHJvcGVydHkgdXNlIHRoaXMgZXZlbnQgdG8gb2JzZXJ2ZSBjaGFuZ2VzLgogICAqICAgLSBgcmVhZE9ubHlgIChib29sZWFuKTogQ3JlYXRlcyBhIGdldHRlciBmb3IgdGhlIHByb3BlcnR5LCBidXQgbm8gc2V0dGVyLgogICAqICAgICBUbyBzZXQgYSByZWFkLW9ubHkgcHJvcGVydHksIHVzZSB0aGUgcHJpdmF0ZSBzZXR0ZXIgbWV0aG9kCiAgICogICAgIGBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKWAuCiAgICogICAtIGBvYnNlcnZlcmAgKHN0cmluZyk6IE9ic2VydmVyIG1ldGhvZCBuYW1lIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgogICAqICAgICB0aGUgcHJvcGVydHkgY2hhbmdlcy4gVGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kIGFyZQogICAqICAgICBgKHZhbHVlLCBwcmV2aW91c1ZhbHVlKWAuCiAgICogICAtIGBjb21wdXRlZGAgKHN0cmluZyk6IFN0cmluZyBkZXNjcmliaW5nIG1ldGhvZCBhbmQgZGVwZW5kZW50IHByb3BlcnRpZXMKICAgKiAgICAgZm9yIGNvbXB1dGluZyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSAoZS5nLiBgJ2NvbXB1dGVGb28oYmFyLCB6b3QpJ2ApLgogICAqICAgICBDb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkgYnkgZGVmYXVsdCBhbmQgY2FuIG9ubHkgYmUgY2hhbmdlZAogICAqICAgICB2aWEgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY29tcHV0aW5nIG1ldGhvZC4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKClgOiBBcnJheSBvZiBzdHJpbmdzIGRlc2NyaWJpbmcgbXVsdGktcHJvcGVydHkKICAgKiAgIG9ic2VydmVyIG1ldGhvZHMgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuCiAgICogICBgJ29ic2VydmVBQkMoYSwgYiwgYyknYCkuCiAgICoKICAgKiBUaGUgYmFzZSBjbGFzcyBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBzdGFuZGFyZAogICAqIGN1c3RvbSBlbGVtZW50IGxpZmVjeWNsZSBjYWxsYmFja3M7IHVzZXJzIG1heSBvdmVycmlkZSB0aGVzZSwgYnV0IHNob3VsZAogICAqIGNhbGwgdGhlIHN1cGVyIG1ldGhvZCB0byBlbnN1cmUKICAgKiAtIGBjb25zdHJ1Y3RvcmA6IFJ1biB3aGVuIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQgb3IgdXBncmFkZWQKICAgKiAtIGBjb25uZWN0ZWRDYWxsYmFja2A6IFJ1biBlYWNoIHRpbWUgdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZQogICAqICAgZG9jdW1lbnQKICAgKiAtIGBkaXNjb25uZWN0ZWRDYWxsYmFja2A6IFJ1biBlYWNoIHRpbWUgdGhlIGVsZW1lbnQgaXMgZGlzY29ubmVjdGVkIGZyb20KICAgKiAgIHRoZSBkb2N1bWVudAogICAqIC0gYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2A6IFJ1biBlYWNoIHRpbWUgYW4gYXR0cmlidXRlIGluCiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpcyBzZXQgb3IgcmVtb3ZlZCAobm90ZTogdGhpcyBlbGVtZW50J3MgZGVmYXVsdAogICAqICAgYG9ic2VydmVkQXR0cmlidXRlc2AgaW1wbGVtZW50YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiBhbiBhcnJheQogICAqICAgb2YgZGFzaC1jYXNlZCBhdHRyaWJ1dGVzIGJhc2VkIG9uIGBwcm9wZXJ0aWVzYCkKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHByb3BlcnR5IHJvb3RQYXRoIHtzdHJpbmd9IFNldCB0byB0aGUgdmFsdWUgb2YgYFBvbHltZXIucm9vdFBhdGhgLAogICAqICAgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIG1haW4gZG9jdW1lbnQgcGF0aAogICAqIEBwcm9wZXJ0eSBpbXBvcnRQYXRoIHtzdHJpbmd9IFNldCB0byB0aGUgdmFsdWUgb2YgdGhlIGNsYXNzJ3Mgc3RhdGljCiAgICogICBgaW1wb3J0UGF0aGAgcHJvcGVydHksIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBwYXRoIG9mIHRoaXMgZWxlbWVudCdzCiAgICogICBgZG9tLW1vZHVsZWAgKHdoZW4gYGlzYCBpcyB1c2VkKSwgYnV0IGNhbiBiZSBvdmVycmlkZGVuIGZvciBvdGhlcgogICAqICAgaW1wb3J0IHN0cmF0ZWdpZXMuCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcy4KICAgKi8KICBQb2x5bWVyLkVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihiYXNlID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwb2x5bWVyRWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbihQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhiYXNlKSk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIHdpdGggZGVmYXVsdCB2YWx1ZXMuCiAgICAgKiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBhcyBhbiBvcHRpbWl6YXRpb24gc2luY2UgaXQgaXMgYSBzdWJzZXQgb2YKICAgICAqIHRoZSBsaXN0IHJldHVybmVkIGZyb20gYF9wcm9wZXJ0aWVzYC4KICAgICAqIFRoaXMgbGlzdCBpcyB1c2VkIGluIGBfaW5pdGlhbGl6ZVByb3BlcnRpZXNgIHRvIHNldCBwcm9wZXJ0eSBkZWZhdWx0cy4KICAgICAqCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge1BvbHltZXJFbGVtZW50UHJvcGVydGllc30gRmxhdHRlbmVkIHByb3BlcnRpZXMgZm9yIHRoaXMgY2xhc3MKICAgICAqICAgdGhhdCBoYXZlIGRlZmF1bHQgdmFsdWVzCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBwcm9wZXJ0eURlZmF1bHRzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGlmICghY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoCiAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0eURlZmF1bHRzJywgY29uc3RydWN0b3IpKSkgewogICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0cyA9IG51bGw7CiAgICAgICAgbGV0IHByb3BzID0gY29uc3RydWN0b3IuX3Byb3BlcnRpZXM7CiAgICAgICAgZm9yIChsZXQgcCBpbiBwcm9wcykgewogICAgICAgICAgbGV0IGluZm8gPSBwcm9wc1twXTsKICAgICAgICAgIGlmICgndmFsdWUnIGluIGluZm8pIHsKICAgICAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzIHx8IHt9OwogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHNbcF0gPSBpbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvciBFbGVtZW50IGNsYXNzCiAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgY29udGFpbmluZyBvd24gb2JzZXJ2ZXJzIGZvciB0aGUgZ2l2ZW4gY2xhc3MKICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgZnVuY3Rpb24gb3duT2JzZXJ2ZXJzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGlmICghY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoCiAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19vd25PYnNlcnZlcnMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdHJ1Y3Rvci5fX293bk9ic2VydmVycyA9CiAgICAgICAgICBjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdvYnNlcnZlcnMnLCBjb25zdHJ1Y3RvcikpID8KICAgICAgICAgIC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gKi8gKGNvbnN0cnVjdG9yKS5vYnNlcnZlcnMgOiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX293bk9ic2VydmVyczsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgZWZmZWN0cyBmb3IgYSBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiBOb3RlLCBvbmNlIGEgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRvCiAgICAgKiBgcmVhZE9ubHlgLCBgY29tcHV0ZWRgLCBgcmVmbGVjdFRvQXR0cmlidXRlYCwgb3IgYG5vdGlmeWAKICAgICAqIHRoZXNlIHZhbHVlcyBtYXkgbm90IGJlIGNoYW5nZWQuIEZvciBleGFtcGxlLCBhIHN1YmNsYXNzIGNhbm5vdAogICAgICogYWx0ZXIgdGhlc2Ugc2V0dGluZ3MuIEhvd2V2ZXIsIGFkZGl0aW9uYWwgYG9ic2VydmVyc2AgbWF5IGJlIGFkZGVkCiAgICAgKiBieSBzdWJjbGFzc2VzLgogICAgICoKICAgICAqIFRoZSBpbmZvIG9iamVjdCBzaG91bGQgY29udGFpbiBwcm9wZXJ0eSBtZXRhZGF0YSBhcyBmb2xsb3dzOgogICAgICoKICAgICAqICogYHR5cGVgOiB7ZnVuY3Rpb259IHR5cGUgdG8gd2hpY2ggYW4gYXR0cmlidXRlIG1hdGNoaW5nIHRoZSBwcm9wZXJ0eQogICAgICogaXMgZGVzZXJpYWxpemVkLiBOb3RlIHRoZSBwcm9wZXJ0eSBpcyBjYW1lbC1jYXNlZCBmcm9tIGEgZGFzaC1jYXNlZAogICAgICogYXR0cmlidXRlLiBGb3IgZXhhbXBsZSwgJ2Zvby1iYXInIGF0dHJpYnV0ZSBpcyBkZXNlcmlhbGl6ZWQgdG8gYQogICAgICogcHJvcGVydHkgbmFtZWQgJ2Zvb0JhcicuCiAgICAgKgogICAgICogKiBgcmVhZE9ubHlgOiB7Ym9vbGVhbn0gY3JlYXRlcyBhIHJlYWRPbmx5IHByb3BlcnR5IGFuZAogICAgICogbWFrZXMgYSBwcml2YXRlIHNldHRlciBmb3IgdGhlIHByaXZhdGUgb2YgdGhlIGZvcm0gJ19zZXRGb28nIGZvciBhCiAgICAgKiBwcm9wZXJ0eSAnZm9vJywKICAgICAqCiAgICAgKiAqIGBjb21wdXRlZGA6IHtzdHJpbmd9IGNyZWF0ZXMgYSBjb21wdXRlZCBwcm9wZXJ0eS4gQSBjb21wdXRlZCBwcm9wZXJ0eQogICAgICogaXMgYWxzbyBhdXRvbWF0aWNhbGx5IHNldCB0byBgcmVhZE9ubHk6IHRydWVgLiBUaGUgdmFsdWUgaXMgY2FsY3VsYXRlZAogICAgICogYnkgcnVubmluZyBhIG1ldGhvZCBhbmQgYXJndW1lbnRzIHBhcnNlZCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcuIEZvcgogICAgICogZXhhbXBsZSAnY29tcHV0ZShmb28pJyB3aWxsIGNvbXB1dGUgYSBnaXZlbiBwcm9wZXJ0eSB3aGVuIHRoZQogICAgICogJ2ZvbycgcHJvcGVydHkgY2hhbmdlcyBieSBleGVjdXRpbmcgdGhlICdjb21wdXRlJyBtZXRob2QuIFRoaXMgbWV0aG9kCiAgICAgKiBtdXN0IHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUuCiAgICAgKgogICAgICogKiBgcmVmbGVjdFRvQXR0cmlidXRlYDoge2Jvb2xlYW59IElmIHRydWUsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyByZWZsZWN0ZWQKICAgICAqIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLiBOb3RlLCB0aGUgYXR0cmlidXRlIGlzIGRhc2gtY2FzZWQKICAgICAqIHNvIGEgcHJvcGVydHkgbmFtZWQgJ2Zvb0JhcicgaXMgcmVmbGVjdGVkIGFzICdmb28tYmFyJy4KICAgICAqCiAgICAgKiAqIGBub3RpZnlgOiB7Ym9vbGVhbn0gc2VuZHMgYSBub24tYnViYmxpbmcgbm90aWZpY2F0aW9uIGV2ZW50IHdoZW4KICAgICAqIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lZCAnZm9vJyBzZW5kcyBhbgogICAgICogZXZlbnQgbmFtZWQgJ2Zvby1jaGFuZ2VkJyB3aXRoIGBldmVudC5kZXRhaWxgIHNldCB0byB0aGUgdmFsdWUgb2YKICAgICAqIHRoZSBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiAqIG9ic2VydmVyOiB7c3RyaW5nfSBuYW1lIG9mIGEgbWV0aG9kIHRoYXQgcnVucyB3aGVuIHRoZSBwcm9wZXJ0eQogICAgICogY2hhbmdlcy4gVGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kIGFyZSAodmFsdWUsIHByZXZpb3VzVmFsdWUpLgogICAgICoKICAgICAqIE5vdGU6IFVzZXJzIG1heSB3YW50IGNvbnRyb2wgb3ZlciBtb2RpZnlpbmcgcHJvcGVydHkKICAgICAqIGVmZmVjdHMgdmlhIHN1YmNsYXNzaW5nLiBGb3IgZXhhbXBsZSwgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gbWFrZSBhCiAgICAgKiByZWZsZWN0VG9BdHRyaWJ1dGUgcHJvcGVydHkgbm90IGRvIHNvIGluIGEgc3ViY2xhc3MuIFdlJ3ZlIGNob3NlbiB0bwogICAgICogZGlzYWJsZSB0aGlzIGJlY2F1c2UgaXQgbGVhZHMgdG8gYWRkaXRpb25hbCBjb21wbGljYXRpb24uCiAgICAgKiBGb3IgZXhhbXBsZSwgYSByZWFkT25seSBlZmZlY3QgZ2VuZXJhdGVzIGEgc3BlY2lhbCBzZXR0ZXIuIElmIGEgc3ViY2xhc3MKICAgICAqIGRpc2FibGVzIHRoZSBlZmZlY3QsIHRoZSBzZXR0ZXIgd291bGQgZmFpbCB1bmV4cGVjdGVkbHkuCiAgICAgKiBCYXNlZCBvbiBmZWVkYmFjaywgd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIG1ha2UgZWZmZWN0cyBtb3JlIG1hbGxlYWJsZQogICAgICogYW5kL29yIHByb3ZpZGUgYW4gYWR2YW5jZWQgYXBpIGZvciBtYW5pcHVsYXRpbmcgdGhlbS4KICAgICAqIEFsc28gY29uc2lkZXIgYWRkaW5nIHdhcm5pbmdzIHdoZW4gYW4gZWZmZWN0IGNhbm5vdCBiZSBjaGFuZ2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50fSBwcm90byBFbGVtZW50IGNsYXNzIHByb3RvdHlwZSB0byBhZGQgYWNjZXNzb3JzCiAgICAgKiAgIGFuZCBlZmZlY3RzIHRvCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIEluZm8gb2JqZWN0IGZyb20gd2hpY2ggdG8gY3JlYXRlIHByb3BlcnR5IGVmZmVjdHMuCiAgICAgKiBTdXBwb3J0ZWQga2V5czoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhbGxQcm9wcyBGbGF0dGVuZWQgbWFwIG9mIGFsbCBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcwogICAgICogICBlbGVtZW50IChpbmNsdWRpbmcgaW5oZXJpdGVkIHByb3BlcnRpZXMpCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlGcm9tQ29uZmlnKHByb3RvLCBuYW1lLCBpbmZvLCBhbGxQcm9wcykgewogICAgICAvLyBjb21wdXRlZCBmb3JjZXMgcmVhZE9ubHkuLi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQpIHsKICAgICAgICBpbmZvLnJlYWRPbmx5ID0gdHJ1ZTsKICAgICAgfQogICAgICAvLyBOb3RlLCBzaW5jZSBhbGwgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZE9ubHksIHRoaXMgcHJldmVudHMKICAgICAgLy8gYWRkaW5nIGFkZGl0aW9uYWwgY29tcHV0ZWQgcHJvcGVydHkgZWZmZWN0cyAod2hpY2ggbGVhZHMgdG8gYSBjb25mdXNpbmcKICAgICAgLy8gc2V0dXAgd2hlcmUgbXVsdGlwbGUgdHJpZ2dlcnMgZm9yIHNldHRpbmcgYSBwcm9wZXJ0eSkKICAgICAgLy8gV2hpbGUgd2UgZG8gaGF2ZSBgaGFzQ29tcHV0ZWRFZmZlY3RgIHRoaXMgaXMgc2V0IG9uIHRoZSBwcm9wZXJ0eSdzCiAgICAgIC8vIGRlcGVuZGVuY2llcyByYXRoZXIgdGhhbiBpdHNlbGYuCiAgICAgIGlmIChpbmZvLmNvbXB1dGVkICYmICFwcm90by5faGFzUmVhZE9ubHlFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eShuYW1lLCBpbmZvLmNvbXB1dGVkLCBhbGxQcm9wcyk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ucmVhZE9ubHkgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVSZWFkT25seVByb3BlcnR5KG5hbWUsICFpbmZvLmNvbXB1dGVkKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWZsZWN0VG9BdHRyaWJ1dGUgJiYgIXByb3RvLl9oYXNSZWZsZWN0RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIGlmIChpbmZvLm5vdGlmeSAmJiAhcHJvdG8uX2hhc05vdGlmeUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShuYW1lKTsKICAgICAgfQogICAgICAvLyBhbHdheXMgYWRkIG9ic2VydmVyCiAgICAgIGlmIChpbmZvLm9ic2VydmVyKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIobmFtZSwgaW5mby5vYnNlcnZlciwgYWxsUHJvcHNbaW5mby5vYnNlcnZlcl0pOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBjcmVhdGUgdGhlIG1hcHBpbmcgZnJvbSBhdHRyaWJ1dGUgYmFjayB0byBwcm9wZXJ0eSBmb3IgZGVzZXJpYWxpemF0aW9uLgogICAgICBwcm90by5fYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChuYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIFByb2Nlc3MgYWxsIHN0eWxlIGVsZW1lbnRzIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLiBTdHlsZXMgd2l0aCB0aGUKICAgICAqIGBpbmNsdWRlYCBhdHRyaWJ1dGUgYXJlIHByb2Nlc3NlZCBzdWNoIHRoYXQgYW55IHN0eWxlcyBpbgogICAgICogdGhlIGFzc29jaWF0ZWQgInN0eWxlIG1vZHVsZXMiIGFyZSBpbmNsdWRlZCBpbiB0aGUgZWxlbWVudCB0ZW1wbGF0ZS4KICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0ga2xhc3MgRWxlbWVudCBjbGFzcwogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcHJvY2VzcwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIE5hbWUgb2YgZWxlbWVudAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkkgQmFzZSBVUkkgZm9yIGVsZW1lbnQKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50U3R5bGVzKGtsYXNzLCB0ZW1wbGF0ZSwgaXMsIGJhc2VVUkkpIHsKICAgICAgaWYgKCFidWlsdENTUykgewogICAgICAgIGNvbnN0IHRlbXBsYXRlU3R5bGVzID0gdGVtcGxhdGUuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZScpOwogICAgICAgIGNvbnN0IHN0eWxlc1dpdGhJbXBvcnRzID0gUG9seW1lci5TdHlsZUdhdGhlci5zdHlsZXNGcm9tVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIGluc2VydCBzdHlsZXMgZnJvbSA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj4gYXQgdGhlIHRvcCBvZiB0aGUgdGVtcGxhdGUKICAgICAgICBjb25zdCBsaW5rZWRTdHlsZXMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKGlzKTsKICAgICAgICBjb25zdCBmaXJzdFRlbXBsYXRlQ2hpbGQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkOwogICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGxpbmtlZFN0eWxlcy5sZW5ndGg7IGlkeCsrKSB7CiAgICAgICAgICBsZXQgcyA9IGxpbmtlZFN0eWxlc1tpZHhdOwogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgdGVtcGxhdGUuY29udGVudC5pbnNlcnRCZWZvcmUocywgZmlyc3RUZW1wbGF0ZUNoaWxkKTsKICAgICAgICB9CiAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCAiY29uY3JldGUiIHN0eWxlIGluIHRoZSB0ZW1wbGF0ZSB3ZSBoYXZlIGVuY291bnRlcmVkCiAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGVJbmRleCA9IDA7CiAgICAgICAgLy8gZW5zdXJlIGFsbCBnYXRoZXJlZCBzdHlsZXMgYXJlIGFjdHVhbGx5IGluIHRoaXMgdGVtcGxhdGUuCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHlsZXNXaXRoSW1wb3J0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IHMgPSBzdHlsZXNXaXRoSW1wb3J0c1tpXTsKICAgICAgICAgIGxldCB0ZW1wbGF0ZVN0eWxlID0gdGVtcGxhdGVTdHlsZXNbdGVtcGxhdGVTdHlsZUluZGV4XTsKICAgICAgICAgIC8vIGlmIHRoZSBzdHlsZSBpcyBub3QgaW4gdGhpcyB0ZW1wbGF0ZSwgaXQncyBiZWVuICJpbmNsdWRlZCIgYW5kCiAgICAgICAgICAvLyB3ZSBwdXQgYSBjbG9uZSBvZiBpdCBpbiB0aGUgdGVtcGxhdGUgYmVmb3JlIHRoZSBzdHlsZSB0aGF0IGluY2x1ZGVkIGl0CiAgICAgICAgICBpZiAodGVtcGxhdGVTdHlsZSAhPT0gcykgewogICAgICAgICAgICBzID0gcy5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocywgdGVtcGxhdGVTdHlsZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZW1wbGF0ZVN0eWxlSW5kZXgrKzsKICAgICAgICAgIH0KICAgICAgICAgIHMudGV4dENvbnRlbnQgPSBrbGFzcy5fcHJvY2Vzc1N0eWxlVGV4dChzLnRleHRDb250ZW50LCBiYXNlVVJJKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgIHdpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUodGVtcGxhdGUsIGlzKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogTG9vayB1cCB0ZW1wbGF0ZSBmcm9tIGRvbS1tb2R1bGUgZm9yIGVsZW1lbnQKICAgICAqCiAgICAgKiBAcGFyYW0geyFzdHJpbmd9IGlzIEVsZW1lbnQgbmFtZSB0byBsb29rIHVwCiAgICAgKiBAcmV0dXJuIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gVGVtcGxhdGUgZm91bmQgaW4gZG9tIG1vZHVsZSwgb3IKICAgICAqICAgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZAogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBnZXRUZW1wbGF0ZUZyb21Eb21Nb2R1bGUoaXMpIHsKICAgICAgbGV0IHRlbXBsYXRlID0gbnVsbDsKICAgICAgaWYgKGlzICYmIFBvbHltZXIuRG9tTW9kdWxlKSB7CiAgICAgICAgdGVtcGxhdGUgPSBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoaXMsICd0ZW1wbGF0ZScpOwogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZXF1aXJlIGFueSBlbGVtZW50IHdpdGggYW4gYGlzYAogICAgICAgIC8vIHNwZWNpZmllZCB0byBoYXZlIGEgZG9tLW1vZHVsZQogICAgICAgIGlmIChQb2x5bWVyLnN0cmljdFRlbXBsYXRlUG9saWN5ICYmICF0ZW1wbGF0ZSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZXhwZWN0aW5nIGRvbS1tb2R1bGUgb3IgbnVsbCB0ZW1wbGF0ZSBmb3IgJHtpc31gKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgfQoKICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHVucmVzdHJpY3RlZAogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAgICovCiAgICBjbGFzcyBQb2x5bWVyRWxlbWVudCBleHRlbmRzIHBvbHltZXJFbGVtZW50QmFzZSB7CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc01peGluIF9maW5hbGl6ZUNsYXNzIHRvIGNyZWF0ZSBvYnNlcnZlcnMgYW5kCiAgICAgICAqIGZpbmQgdGhlIHRlbXBsYXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICBzdXBlci5fZmluYWxpemVDbGFzcygpOwogICAgICAgIGNvbnN0IG9ic2VydmVycyA9IG93bk9ic2VydmVycyh0aGlzKTsKICAgICAgICBpZiAob2JzZXJ2ZXJzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIHRoaXMuX3Byb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9wcmVwYXJlVGVtcGxhdGUoKTsKICAgICAgfQoKICAgICAgc3RhdGljIF9wcmVwYXJlVGVtcGxhdGUoKSB7CiAgICAgICAgLy8gbm90ZTogY3JlYXRlICJ3b3JraW5nIiB0ZW1wbGF0ZSB0aGF0IGlzIGZpbmFsaXplZCBhdCBpbnN0YW5jZSB0aW1lCiAgICAgICAgbGV0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykudGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICBsZXQgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gdGVtcGxhdGU7CiAgICAgICAgICAgIHRlbXBsYXRlID0gdDsKICAgICAgICAgIH0gZWxzZSBpZiAoIVBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGUgPSB0ZW1wbGF0ZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIG9mIFByb3BlcnRpZXNDaGFuZ2VkIGNyZWF0ZVByb3BlcnRpZXMgdG8gY3JlYXRlIGFjY2Vzc29ycwogICAgICAgKiBhbmQgcHJvcGVydHkgZWZmZWN0cyBmb3IgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcodGhpcy5wcm90b3R5cGUsIHAsIHByb3BzW3BdLCBwcm9wcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBgb2JzZXJ2ZXJzYCBhcnJheS4KICAgICAgICogTGV2ZXJhZ2VzIGBQcm9wZXJ0eUVmZmVjdHNgIHRvIGNyZWF0ZSBvYnNlcnZlcnMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYnNlcnZlcnMgQXJyYXkgb2Ygb2JzZXJ2ZXIgZGVzY3JpcHRvcnMgZm9yCiAgICAgICAqICAgdGhpcyBjbGFzcwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gZHluYW1pY0ZucyBPYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBhbnkgcHJvcGVydGllcwogICAgICAgKiAgIHRoYXQgYXJlIGZ1bmN0aW9ucyBhbmQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdCB3aGVuIHRoZSBmdW5jdGlvbgogICAgICAgKiAgIHJlZmVyZW5jZSBpcyBjaGFuZ2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVPYnNlcnZlcnMob2JzZXJ2ZXJzLCBkeW5hbWljRm5zKSB7CiAgICAgICAgY29uc3QgcHJvdG8gPSB0aGlzLnByb3RvdHlwZTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBvYnNlcnZlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHByb3RvLl9jcmVhdGVNZXRob2RPYnNlcnZlcihvYnNlcnZlcnNbaV0sIGR5bmFtaWNGbnMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHRoYXQgd2lsbCBiZSBzdGFtcGVkIGludG8gdGhpcyBlbGVtZW50J3Mgc2hhZG93IHJvb3QuCiAgICAgICAqCiAgICAgICAqIElmIGEgYHN0YXRpYyBnZXQgaXMoKWAgZ2V0dGVyIGlzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgICAqIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBgPHRlbXBsYXRlPmAgaW4gYSBgZG9tLW1vZHVsZWAgd2hvc2UgYGlkYAogICAgICAgKiBtYXRjaGVzIHRoaXMgZWxlbWVudCdzIGBpc2AuCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIGdldHRlciB0byByZXR1cm4gYW4gYXJiaXRyYXJ5IHRlbXBsYXRlCiAgICAgICAqIChpbiB3aGljaCBjYXNlIHRoZSBgaXNgIGdldHRlciBpcyB1bm5lY2Vzc2FyeSkuIFRoZSB0ZW1wbGF0ZSByZXR1cm5lZAogICAgICAgKiBtYXkgYmUgZWl0aGVyIGFuIGBIVE1MVGVtcGxhdGVFbGVtZW50YCBvciBhIHN0cmluZyB0aGF0IHdpbGwgYmUKICAgICAgICogYXV0b21hdGljYWxseSBwYXJzZWQgaW50byBhIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgd2hlbiBzdWJjbGFzc2luZywgaWYgdGhlIHN1cGVyIGNsYXNzIG92ZXJyb2RlIHRoZSBkZWZhdWx0CiAgICAgICAqIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBwcm92aWRlIGFuIGFsdGVybmF0ZQogICAgICAgKiB0ZW1wbGF0ZSB2aWEgYSBgZG9tLW1vZHVsZWAsIGl0IHNob3VsZCBvdmVycmlkZSB0aGlzIGdldHRlciBhbmQKICAgICAgICogcmV0dXJuIGBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQodGhpcy5pcywgJ3RlbXBsYXRlJylgLgogICAgICAgKgogICAgICAgKiBJZiBhIHN1YmNsYXNzIHdvdWxkIGxpa2UgdG8gbW9kaWZ5IHRoZSBzdXBlciBjbGFzcyB0ZW1wbGF0ZSwgaXQgc2hvdWxkCiAgICAgICAqIGNsb25lIGl0IHJhdGhlciB0aGFuIG1vZGlmeSBpdCBpbiBwbGFjZS4gIElmIHRoZSBnZXR0ZXIgZG9lcyBleHBlbnNpdmUKICAgICAgICogd29yayBzdWNoIGFzIGNsb25pbmcvbW9kaWZ5aW5nIGEgdGVtcGxhdGUsIGl0IHNob3VsZCBtZW1vaXplIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZToKICAgICAgICoKICAgICAgICogICBsZXQgbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICBjbGFzcyBNeVN1YkNsYXNzIGV4dGVuZHMgTXlTdXBlckNsYXNzIHsKICAgICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgICAqICAgICAgIGlmICghbWVtb2l6ZWRUZW1wbGF0ZSkgewogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUgPSBNeVN1cGVyQ2xhc3MudGVtcGxhdGUuY2xvbmVOb2RlKHRydWUpOwogICAgICAgKiAgICAgICAgIGxldCBzdWJDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAqICAgICAgICAgc3ViQ29udGVudC50ZXh0Q29udGVudCA9ICdUaGlzIGNhbWUgZnJvbSBNeVN1YkNsYXNzJzsKICAgICAgICogICAgICAgICBtZW1vaXplZFRlbXBsYXRlLmNvbnRlbnQuYXBwZW5kQ2hpbGQoc3ViQ29udGVudCk7CiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgICAgcmV0dXJuIG1lbW9pemVkVGVtcGxhdGU7CiAgICAgICAqICAgICB9CiAgICAgICAqICAgfQogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gVGVtcGxhdGUgdG8gYmUgc3RhbXBlZAogICAgICAgKi8KICAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICAvLyBFeHBsYW5hdGlvbiBvZiB0ZW1wbGF0ZS1yZWxhdGVkIHByb3BlcnRpZXM6CiAgICAgICAgLy8gLSBjb25zdHJ1Y3Rvci50ZW1wbGF0ZSAodGhpcyBnZXR0ZXIpOiB0aGUgdGVtcGxhdGUgZm9yIHRoZSBjbGFzcy4KICAgICAgICAvLyAgICAgVGhpcyBjYW4gY29tZSBmcm9tIHRoZSBwcm90b3R5cGUgKGZvciBsZWdhY3kgZWxlbWVudHMpLCBmcm9tIGEKICAgICAgICAvLyAgICAgZG9tLW1vZHVsZSwgb3IgZnJvbSB0aGUgc3VwZXIgY2xhc3MncyB0ZW1wbGF0ZSAob3IgY2FuIGJlIG92ZXJyaWRkZW4KICAgICAgICAvLyAgICAgYWx0b2dldGhlciBieSB0aGUgdXNlcikKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLl90ZW1wbGF0ZTogbWVtb2l6ZWQgdmVyc2lvbiBvZiBjb25zdHJ1Y3Rvci50ZW1wbGF0ZQogICAgICAgIC8vIC0gcHJvdG90eXBlLl90ZW1wbGF0ZTogd29ya2luZyB0ZW1wbGF0ZSBmb3IgdGhlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUKICAgICAgICAvLyAgICAgcGFyc2VkIGFuZCBtb2RpZmllZCBpbiBwbGFjZS4gSXQgaXMgYSBjbG9uZWQgdmVyc2lvbiBvZgogICAgICAgIC8vICAgICBjb25zdHJ1Y3Rvci50ZW1wbGF0ZSwgc2F2ZWQgaW4gX2ZpbmFsaXplQ2xhc3MoKS4gTm90ZSB0aGF0IGJlZm9yZQogICAgICAgIC8vICAgICB0aGlzIGdldHRlciBpcyBjYWxsZWQsIGZvciBsZWdhY3kgZWxlbWVudHMgdGhpcyBjb3VsZCBiZSBmcm9tIGEKICAgICAgICAvLyAgICAgX3RlbXBsYXRlIGZpZWxkIG9uIHRoZSBpbmZvIG9iamVjdCBwYXNzZWQgdG8gUG9seW1lcigpLCBhIGJlaGF2aW9yLAogICAgICAgIC8vICAgICBvciBzZXQgaW4gcmVnaXN0ZXJlZCgpOyBvbmNlIHRoZSBzdGF0aWMgZ2V0dGVyIHJ1bnMsIGEgY2xvbmUgb2YgaXQKICAgICAgICAvLyAgICAgd2lsbCBvdmVyd3JpdGUgaXQgb24gdGhlIHByb3RvdHlwZSBhcyB0aGUgd29ya2luZyB0ZW1wbGF0ZS4KICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX3RlbXBsYXRlJywgdGhpcykpKSB7CiAgICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9CiAgICAgICAgICAgIC8vIElmIHVzZXIgaGFzIHB1dCB0ZW1wbGF0ZSBvbiBwcm90b3R5cGUgKGUuZy4gaW4gbGVnYWN5IHZpYSByZWdpc3RlcmVkCiAgICAgICAgICAgIC8vIGNhbGxiYWNrIG9yIGluZm8gb2JqZWN0KSwgcHJlZmVyIHRoYXQgZmlyc3QKICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX3RlbXBsYXRlJywgdGhpcy5wcm90b3R5cGUpKSA/CiAgICAgICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA6CiAgICAgICAgICAgIC8vIExvb2sgaW4gZG9tLW1vZHVsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50J3MgaXMKICAgICAgICAgICAgKGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZSgvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLmlzKSB8fAogICAgICAgICAgICAvLyBOZXh0IGxvb2sgZm9yIHN1cGVyY2xhc3MgdGVtcGxhdGUgKGNhbGwgdGhlIHN1cGVyIGltcGwgdGhpcwogICAgICAgICAgICAvLyB3YXkgc28gdGhhdCBgdGhpc2AgcG9pbnRzIHRvIHRoZSBzdXBlcmNsYXNzKQogICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSovICh0aGlzKS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yLnRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0IHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudHxzdHJpbmd9IHZhbHVlIFRlbXBsYXRlIHRvIHNldC4KICAgICAgICovCiAgICAgIHN0YXRpYyBzZXQgdGVtcGxhdGUodmFsdWUpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IHZhbHVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGF0aCBtYXRjaGluZyB0aGUgdXJsIGZyb20gd2hpY2ggdGhlIGVsZW1lbnQgd2FzIGltcG9ydGVkLgogICAgICAgKgogICAgICAgKiBUaGlzIHBhdGggaXMgdXNlZCB0byByZXNvbHZlIHVybCdzIGluIHRlbXBsYXRlIHN0eWxlIGNzc1RleHQuCiAgICAgICAqIFRoZSBgaW1wb3J0UGF0aGAgcHJvcGVydHkgaXMgYWxzbyBzZXQgb24gZWxlbWVudCBpbnN0YW5jZXMgYW5kIGNhbiBiZQogICAgICAgKiB1c2VkIHRvIGNyZWF0ZSBiaW5kaW5ncyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IHBhdGguCiAgICAgICAqCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEVTIG1vZHVsZXMsIHVzZXJzIHNob3VsZCBpbXBsZW1lbnQKICAgICAgICogYHN0YXRpYyBnZXQgaW1wb3J0TWV0YSgpIHsgcmV0dXJuIGltcG9ydC5tZXRhOyB9YCwgYW5kIHRoZSBkZWZhdWx0CiAgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIGBpbXBvcnRQYXRoYCB3aWxsICByZXR1cm4gYGltcG9ydC5tZXRhLnVybGAncyBwYXRoLgogICAgICAgKiBGb3IgZWxlbWVudHMgZGVmaW5lZCBpbiBIVE1MIGltcG9ydHMsIHRoaXMgZ2V0dGVyIHdpbGwgcmV0dXJuIHRoZSBwYXRoCiAgICAgICAqIHRvIHRoZSBkb2N1bWVudCBjb250YWluaW5nIGEgYGRvbS1tb2R1bGVgIGVsZW1lbnQgbWF0Y2hpbmcgdGhpcwogICAgICAgKiBlbGVtZW50J3Mgc3RhdGljIGBpc2AgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIE5vdGUsIHRoaXMgcGF0aCBzaG91bGQgY29udGFpbiBhIHRyYWlsaW5nIGAvYC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW1wb3J0IHBhdGggZm9yIHRoaXMgZWxlbWVudCBjbGFzcwogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfQogICAgICAgKi8KICAgICAgc3RhdGljIGdldCBpbXBvcnRQYXRoKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfaW1wb3J0UGF0aCcsIHRoaXMpKSkgewogICAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuaW1wb3J0TWV0YTsKICAgICAgICAgIGlmIChtZXRhKSB7CiAgICAgICAgICAgIHRoaXMuX2ltcG9ydFBhdGggPSBQb2x5bWVyLlJlc29sdmVVcmwucGF0aEZyb21VcmwobWV0YS51cmwpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gUG9seW1lci5Eb21Nb2R1bGUgJiYgUG9seW1lci5Eb21Nb2R1bGUuaW1wb3J0KC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gKi8gKHRoaXMpLmlzKTsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IChtb2R1bGUgJiYgbW9kdWxlLmFzc2V0cGF0aCkgfHwKICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSovICh0aGlzKS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9pbXBvcnRQYXRoOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8KICAgICAgICB0aGlzLl90ZW1wbGF0ZTsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLl9pbXBvcnRQYXRoOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMucm9vdFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5pbXBvcnRQYXRoOwogICAgICAgIC8qKiBAdHlwZSB7U3RhbXBlZFRlbXBsYXRlIHwgSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290fSAqLwogICAgICAgIHRoaXMucm9vdDsKICAgICAgICAvKiogQHR5cGUgeyFPYmplY3Q8c3RyaW5nLCAhRWxlbWVudD59ICovCiAgICAgICAgdGhpcy4kOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzYCB0byBlbnN1cmUgY2xhc3MKICAgICAgICogbWV0YXByb2dyYW1taW5nIHJlbGF0ZWQgdG8gcHJvcGVydHkgYWNjZXNzb3JzIGFuZCBlZmZlY3RzIGhhcwogICAgICAgKiBjb21wbGV0ZWQgKGNhbGxzIGBmaW5hbGl6ZWApLgogICAgICAgKgogICAgICAgKiBJdCBhbHNvIGluaXRpYWxpemVzIGFueSBwcm9wZXJ0eSBkZWZhdWx0cyBwcm92aWRlZCB2aWEgYHZhbHVlYCBpbgogICAgICAgKiBgcHJvcGVydGllc2AgbWV0YWRhdGEuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgLy8gbm90ZTogZmluYWxpemUgdGVtcGxhdGUgd2hlbiB3ZSBoYXZlIGFjY2VzcyB0byBgbG9jYWxOYW1lYCB0bwogICAgICAgIC8vIGF2b2lkIGRlcGVuZGVuY2Ugb24gYGlzYCBmb3IgcG9seWZpbGxpbmcgc3R5bGluZy4KICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLl9maW5hbGl6ZVRlbXBsYXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKS5sb2NhbE5hbWUpOwogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIC8vIHNldCBwYXRoIGRlZmF1bHRzCiAgICAgICAgdGhpcy5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGg7CiAgICAgICAgdGhpcy5pbXBvcnRQYXRoID0gdGhpcy5jb25zdHJ1Y3Rvci5pbXBvcnRQYXRoOwogICAgICAgIC8vIGFwcGx5IHByb3BlcnR5IGRlZmF1bHRzLi4uCiAgICAgICAgbGV0IHAkID0gcHJvcGVydHlEZWZhdWx0cyh0aGlzLmNvbnN0cnVjdG9yKTsKICAgICAgICBpZiAoIXAkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IHAgaW4gcCQpIHsKICAgICAgICAgIGxldCBpbmZvID0gcCRbcF07CiAgICAgICAgICAvLyBEb24ndCBzZXQgZGVmYXVsdCB2YWx1ZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIG93biBwcm9wZXJ0eSwgd2hpY2gKICAgICAgICAgIC8vIGhhcHBlbnMgd2hlbiBhIGBwcm9wZXJ0aWVzYCBwcm9wZXJ0eSB3aXRoIGRlZmF1bHQgYnV0IG5vIGVmZmVjdHMgaGFkCiAgICAgICAgICAvLyBhIHByb3BlcnR5IHNldCAoZS5nLiBib3VuZCkgYnkgaXRzIGhvc3QgYmVmb3JlIHVwZ3JhZGUKICAgICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShwKSkgewogICAgICAgICAgICBsZXQgdmFsdWUgPSB0eXBlb2YgaW5mby52YWx1ZSA9PSAnZnVuY3Rpb24nID8KICAgICAgICAgICAgICBpbmZvLnZhbHVlLmNhbGwodGhpcykgOgogICAgICAgICAgICAgIGluZm8udmFsdWU7CiAgICAgICAgICAgIC8vIFNldCB2aWEgYF9zZXRQcm9wZXJ0eWAgaWYgdGhlcmUgaXMgYW4gYWNjZXNzb3IsIHRvIGVuYWJsZQogICAgICAgICAgICAvLyBpbml0aWFsaXppbmcgcmVhZE9ubHkgcHJvcGVydHkgZGVmYXVsdHMKICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0FjY2Vzc29yKHApKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KHAsIHZhbHVlLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzW3BdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgc3R5bGUgdGV4dCBmb3IgYSBzdHlsZSBlbGVtZW50IGluIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNzc1RleHQgVGV4dCBjb250YWluaW5nIHN0eWxpbmcgdG8gcHJvY2VzcwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSB0byByZWJhc2UgQ1NTIHBhdGhzIGFnYWluc3QKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcHJvY2Vzc2VkIENTUyB0ZXh0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcHJvY2Vzc1N0eWxlVGV4dChjc3NUZXh0LCBiYXNlVVJJKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGNzc1RleHQsIGJhc2VVUkkpOwogICAgICB9CgogICAgICAvKioKICAgICAgKiBDb25maWd1cmVzIGFuIGVsZW1lbnQgYHByb3RvYCB0byBmdW5jdGlvbiB3aXRoIGEgZ2l2ZW4gYHRlbXBsYXRlYC4KICAgICAgKiBUaGUgZWxlbWVudCBuYW1lIGBpc2AgYW5kIGV4dGVuZHMgYGV4dGAgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIFNoYWR5Q1NTCiAgICAgICogc3R5bGUgc2NvcGluZy4KICAgICAgKgogICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpcyBUYWcgbmFtZSAob3IgdHlwZSBleHRlbnNpb24gbmFtZSkgZm9yIHRoaXMgZWxlbWVudAogICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICogQHByb3RlY3RlZAogICAgICAqLwogICAgICBzdGF0aWMgX2ZpbmFsaXplVGVtcGxhdGUoaXMpIHsKICAgICAgICAvKiogQGNvbnN0IHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlOwogICAgICAgIGlmICh0ZW1wbGF0ZSAmJiAhdGVtcGxhdGUuX19wb2x5bWVyRmluYWxpemVkKSB7CiAgICAgICAgICB0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQgPSB0cnVlOwogICAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IHRoaXMuaW1wb3J0UGF0aDsKICAgICAgICAgIGNvbnN0IGJhc2VVUkkgPSBpbXBvcnRQYXRoID8gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVVcmwoaW1wb3J0UGF0aCkgOiAnJzsKICAgICAgICAgIC8vIGUuZy4gc3VwcG9ydCBgaW5jbHVkZT0ibW9kdWxlLW5hbWUiYCwgYW5kIFNoYWR5Q1NTCiAgICAgICAgICBwcm9jZXNzRWxlbWVudFN0eWxlcyh0aGlzLCB0ZW1wbGF0ZSwgaXMsIGJhc2VVUkkpOwogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdGFuZGFyZCBDdXN0b20gRWxlbWVudHMKICAgICAgICogYGNvbm5lY3RlZENhbGxiYWNrYC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZW5hYmxlcyB0aGUgcHJvcGVydHkgZWZmZWN0cyBzeXN0ZW0gYW5kCiAgICAgICAqIGZsdXNoZXMgYW55IHBlbmRpbmcgcHJvcGVydGllcywgYW5kIHVwZGF0ZXMgc2hpbW1lZCBDU1MgcHJvcGVydGllcwogICAgICAgKiB3aGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nL2N1c3RvbSBwcm9wZXJ0aWVzIHBvbHlmaWxsLgogICAgICAgKgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzLCBpbnZhbGlkQ2FzdHN9IFN1cGVyIG1heSBvciBtYXkgbm90IGltcGxlbWVudCB0aGUgY2FsbGJhY2sKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIGlmICh3aW5kb3cuU2hhZHlDU1MgJiYgdGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZUVsZW1lbnQoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgZWxlbWVudCB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICByZWFkeSgpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fdGVtcGxhdGUpOwogICAgICAgICAgdGhpcy4kID0gdGhpcy5yb290LiQ7CiAgICAgICAgfQogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJbXBsZW1lbnRzIGBQcm9wZXJ0eUVmZmVjdHNgJ3MgYF9yZWFkeUNsaWVudHNgIGNhbGwuIEF0dGFjaGVzCiAgICAgICAqIGVsZW1lbnQgZG9tIGJ5IGNhbGxpbmcgYF9hdHRhY2hEb21gIHdpdGggdGhlIGRvbSBzdGFtcGVkIGZyb20gdGhlCiAgICAgICAqIGVsZW1lbnQncyB0ZW1wbGF0ZSB2aWEgYF9zdGFtcFRlbXBsYXRlYC4gTm90ZSB0aGF0IHRoaXMgYWxsb3dzCiAgICAgICAqIGNsaWVudCBkb20gdG8gYmUgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQgcHJpb3IgdG8gYW55IG9ic2VydmVycwogICAgICAgKiBydW5uaW5nLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIF9yZWFkeUNsaWVudHMoKSB7CiAgICAgICAgaWYgKHRoaXMuX3RlbXBsYXRlKSB7CiAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLl9hdHRhY2hEb20oLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGV9ICovKHRoaXMucm9vdCkpOwogICAgICAgIH0KICAgICAgICAvLyBUaGUgc3VwZXIuX3JlYWR5Q2xpZW50cyBoZXJlIHNldHMgdGhlIGNsaWVudHMgaW5pdGlhbGl6ZWQgZmxhZy4KICAgICAgICAvLyBXZSBtdXN0IHdhaXQgdG8gZG8gdGhpcyB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGNyZWF0ZWQvYXR0YWNoZWQKICAgICAgICAvLyBzbyB0aGF0IHRoaXMgZmxhZyBjYW4gYmUgY2hlY2tlZCB0byBwcmV2ZW50IG5vdGlmaWNhdGlvbnMgZmlyZWQKICAgICAgICAvLyBkdXJpbmcgdGhpcyBwcm9jZXNzIGZyb20gYmVpbmcgaGFuZGxlZCBiZWZvcmUgY2xpZW50cyBhcmUgcmVhZHkuCiAgICAgICAgc3VwZXIuX3JlYWR5Q2xpZW50cygpOwogICAgICB9CgoKICAgICAgLyoqCiAgICAgICAqIEF0dGFjaGVzIGFuIGVsZW1lbnQncyBzdGFtcGVkIGRvbSB0byBpdHNlbGYuIEJ5IGRlZmF1bHQsCiAgICAgICAqIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBgc2hhZG93Um9vdGAgYW5kIGFkZHMgdGhlIGRvbSB0byBpdC4KICAgICAgICogSG93ZXZlciwgdGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gdG8gYWxsb3cgYW4gZWxlbWVudAogICAgICAgKiB0byBwdXQgaXRzIGRvbSBpbiBhbm90aGVyIGxvY2F0aW9uLgogICAgICAgKgogICAgICAgKiBAdGhyb3dzIHtFcnJvcn0KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUmV0dXJufQogICAgICAgKiBAcGFyYW0ge1N0YW1wZWRUZW1wbGF0ZX0gZG9tIHRvIGF0dGFjaCB0byB0aGUgZWxlbWVudC4KICAgICAgICogQHJldHVybiB7U2hhZG93Um9vdH0gbm9kZSB0byB3aGljaCB0aGUgZG9tIGhhcyBiZWVuIGF0dGFjaGVkLgogICAgICAgKi8KICAgICAgX2F0dGFjaERvbShkb20pIHsKICAgICAgICBpZiAodGhpcy5hdHRhY2hTaGFkb3cpIHsKICAgICAgICAgIGlmIChkb20pIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZTogJ29wZW4nfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGRvbSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3Q7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFkb3dET00gbm90IGF2YWlsYWJsZS4gJyArCiAgICAgICAgICAgIC8vIFRPRE8oc29ydmVsbCk6IG1vdmUgdG8gY29tcGlsZS10aW1lIGNvbmRpdGlvbmFsIHdoZW4gc3VwcG9ydGVkCiAgICAgICAgICAnUG9seW1lci5FbGVtZW50IGNhbiBjcmVhdGUgZG9tIGFzIGNoaWxkcmVuIGluc3RlYWQgb2YgaW4gJyArCiAgICAgICAgICAnU2hhZG93RE9NIGJ5IHNldHRpbmcgYHRoaXMucm9vdCA9IHRoaXM7XGAgYmVmb3JlIFxgcmVhZHlcYC4nKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAgICAgKiBzaGltbWVkIHN0eWxlcyBpbiB0aGlzIGVsZW1lbnQgKGFuZCBpdHMgc3VidHJlZSkgdG8gYmUgdXBkYXRlZAogICAgICAgKiBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICAgICAqCiAgICAgICAqIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgb3ZlcnJpZGVzIGlubGluZSBjdXN0b20gcHJvcGVydHkgc3R5bGVzIHdpdGggYW4KICAgICAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAgICAgKiBhcmUgc3RyaW5ncy4KICAgICAgICoKICAgICAgICogRXhhbXBsZTogYHRoaXMudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAgICAgKgogICAgICAgKiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSByZXRhaW5lZCB1bmxlc3MgYSB2YWx1ZSBvZiBgbnVsbGAgaXMgc2V0LgogICAgICAgKgogICAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgdXBkYXRpbmcgQ1NTIG1peGlucy4KICAgICAgICogWW91IGNhbiBub3QgZHluYW1pY2FsbHkgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhbiBgQGFwcGx5YC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wZXJ0aWVzIEJhZyBvZiBjdXN0b20gcHJvcGVydHkga2V5L3ZhbHVlcyB0bwogICAgICAgKiAgIGFwcGx5IHRvIHRoaXMgZWxlbWVudC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICAgICAqLwogICAgICB1cGRhdGVTdHlsZXMocHJvcGVydGllcykgewogICAgICAgIGlmICh3aW5kb3cuU2hhZHlDU1MpIHsKICAgICAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZVN1YnRyZWUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLCBwcm9wZXJ0aWVzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXdyaXRlcyBhIGdpdmVuIFVSTCByZWxhdGl2ZSB0byBhIGJhc2UgVVJMLiBUaGUgYmFzZSBVUkwgZGVmYXVsdHMgdG8KICAgICAgICogdGhlIG9yaWdpbmFsIGxvY2F0aW9uIG9mIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBgZG9tLW1vZHVsZWAgZm9yCiAgICAgICAqIHRoaXMgZWxlbWVudC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNhbWUgVVJMIGJlZm9yZSBhbmQgYWZ0ZXIKICAgICAgICogYnVuZGxpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIG5vIHJlc29sdXRpb24gZm9yIFVSTHMgdGhhdCBzdGFydAogICAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAgICogVVJMIHJlc29sdXRpb24sIHVzZSBgd2luZG93LlVSTGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHRvIHJlc29sdmUuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYmFzZSBPcHRpb25hbCBiYXNlIFVSTCB0byByZXNvbHZlIGFnYWluc3QsIGRlZmF1bHRzCiAgICAgICAqIHRvIHRoZSBlbGVtZW50J3MgYGltcG9ydFBhdGhgCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV3cml0dGVuIFVSTCByZWxhdGl2ZSB0byBiYXNlCiAgICAgICAqLwogICAgICByZXNvbHZlVXJsKHVybCwgYmFzZSkgewogICAgICAgIGlmICghYmFzZSAmJiB0aGlzLmltcG9ydFBhdGgpIHsKICAgICAgICAgIGJhc2UgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh0aGlzLmltcG9ydFBhdGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVVcmwodXJsLCBiYXNlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGFkZCBtYXAgb2YgZHluYW1pYyBmdW5jdGlvbnMgb24KICAgICAgICogdGVtcGxhdGUgaW5mbywgZm9yIGNvbnN1bXB0aW9uIGJ5IGBQcm9wZXJ0eUVmZmVjdHNgIHRlbXBsYXRlIGJpbmRpbmcKICAgICAgICogY29kZS4gVGhpcyBtYXAgZGV0ZXJtaW5lcyB3aGljaCBtZXRob2QgdGVtcGxhdGVzIHNob3VsZCBoYXZlIGFjY2Vzc29ycwogICAgICAgKiBjcmVhdGVkIGZvciB0aGVtLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgdGVtcGxhdGVJbmZvLmR5bmFtaWNGbnMgPSB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyB8fCB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQb2x5bWVyRWxlbWVudDsKICB9KTsKCiAgLyoqCiAgICogV2hlbiB1c2luZyB0aGUgU2hhZHlDU1Mgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnR5IHNoaW0sIGNhdXNlcyBhbGwKICAgKiBzaGltbWVkIGBzdHlsZXNgICh2aWEgYGN1c3RvbS1zdHlsZWApIGluIHRoZSBkb2N1bWVudCAoYW5kIGl0cyBzdWJ0cmVlKQogICAqIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gY3VycmVudCBjdXN0b20gcHJvcGVydHkgdmFsdWVzLgogICAqCiAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAqIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHdoZXJlIHRoZSBrZXlzIGFyZSBDU1MgcHJvcGVydGllcywgYW5kIHRoZSB2YWx1ZXMKICAgKiBhcmUgc3RyaW5ncy4KICAgKgogICAqIEV4YW1wbGU6IGBQb2x5bWVyLnVwZGF0ZVN0eWxlcyh7Jy0tY29sb3InOiAnYmx1ZSd9KWAKICAgKgogICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIEJhZyBvZiBjdXN0b20gcHJvcGVydHkga2V5L3ZhbHVlcyB0bwogICAqICAgYXBwbHkgdG8gdGhlIGRvY3VtZW50LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci51cGRhdGVTdHlsZXMgPSBmdW5jdGlvbihwcm9wcykgewogICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICB3aW5kb3cuU2hhZHlDU1Muc3R5bGVEb2N1bWVudChwcm9wcyk7CiAgICB9CiAgfTsKCn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+CihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEBzdW1tYXJ5IENvbGxhcHNlIG11bHRpcGxlIGNhbGxiYWNrcyBpbnRvIG9uZSBpbnZvY2F0aW9uIGFmdGVyIGEgdGltZXIuCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEZWJvdW5jZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHRoaXMuX2FzeW5jTW9kdWxlID0gbnVsbDsKICAgICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsOwogICAgICB0aGlzLl90aW1lciA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIHNjaGVkdWxlcjsgdGhhdCBpcywgYSBtb2R1bGUgd2l0aCB0aGUgQXN5bmMgaW50ZXJmYWNlLAogICAgICogYSBjYWxsYmFjayBhbmQgb3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgcnVuIGZ1bmN0aW9uCiAgICAgKiBmcm9tIHRoZSBhc3luYyBtb2R1bGUuCiAgICAgKgogICAgICogQHBhcmFtIHshQXN5bmNJbnRlcmZhY2V9IGFzeW5jTW9kdWxlIE9iamVjdCB3aXRoIEFzeW5jIGludGVyZmFjZS4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2V0Q29uZmlnKGFzeW5jTW9kdWxlLCBjYWxsYmFjaykgewogICAgICB0aGlzLl9hc3luY01vZHVsZSA9IGFzeW5jTW9kdWxlOwogICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICB0aGlzLl90aW1lciA9IHRoaXMuX2FzeW5jTW9kdWxlLnJ1bigoKSA9PiB7CiAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgICAgIHRoaXMuX2NhbGxiYWNrKCk7CiAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBDYW5jZWxzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNhbmNlbCgpIHsKICAgICAgaWYgKHRoaXMuaXNBY3RpdmUoKSkgewogICAgICAgIHRoaXMuX2FzeW5jTW9kdWxlLmNhbmNlbCh0aGlzLl90aW1lcik7CiAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEZsdXNoZXMgYW4gYWN0aXZlIGRlYm91bmNlciBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZmx1c2goKSB7CiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICB0aGlzLmNhbmNlbCgpOwogICAgICAgIHRoaXMuX2NhbGxiYWNrKCk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkZWJvdW5jZXIgaXMgYWN0aXZlLgogICAgICoKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYWN0aXZlLgogICAgICovCiAgICBpc0FjdGl2ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3RpbWVyICE9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBkZWJvdW5jZXIgaWYgbm8gZGVib3VuY2VyIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlcgogICAgICogb3IgaXQgY2FuY2VscyBhbiBhY3RpdmUgZGVib3VuY2VyIG90aGVyd2lzZS4gVGhlIGZvbGxvd2luZwogICAgICogZXhhbXBsZSBzaG93cyBob3cgYSBkZWJvdW5jZXIgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYQogICAgICogbWljcm90YXNrIGFuZCAiZGVib3VuY2VkIiBzdWNoIHRoYXQgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIGlzCiAgICAgKiBjYWxsZWQgb25jZS4gQWRkIHRoaXMgbWV0aG9kIHRvIGEgY3VzdG9tIGVsZW1lbnQ6CiAgICAgKgogICAgICogX2RlYm91bmNlV29yaygpIHsKICAgICAqICAgdGhpcy5fZGVib3VuY2VKb2IgPSBQb2x5bWVyLkRlYm91bmNlci5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZUpvYiwKICAgICAqICAgICAgIFBvbHltZXIuQXN5bmMubWljcm9UYXNrLCAoKSA9PiB7CiAgICAgKiAgICAgdGhpcy5fZG9Xb3JrKCk7CiAgICAgKiAgIH0pOwogICAgICogfQogICAgICoKICAgICAqIElmIHRoZSBgX2RlYm91bmNlV29ya2AgbWV0aG9kIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUKICAgICAqIG1pY3JvdGFzaywgdGhlIGBfZG9Xb3JrYCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UgYXQgdGhlIG5leHQKICAgICAqIG1pY3JvdGFzayBjaGVja3BvaW50LgogICAgICoKICAgICAqIE5vdGU6IEluIHRlc3RpbmcgaXQgaXMgb2Z0ZW4gY29udmVuaWVudCB0byBhdm9pZCBhc3luY2hyb255LiBUbyBhY2NvbXBsaXNoCiAgICAgKiB0aGlzIHdpdGggYSBkZWJvdW5jZXIsIHlvdSBjYW4gdXNlIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXJgIGFuZAogICAgICogYFBvbHltZXIuZmx1c2hgLiBGb3IgZXhhbXBsZSwgZXh0ZW5kIHRoZSBhYm92ZSBleGFtcGxlIGJ5IGFkZGluZwogICAgICogYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9kZWJvdW5jZUpvYilgIGF0IHRoZSBlbmQgb2YgdGhlCiAgICAgKiBgX2RlYm91bmNlV29ya2AgbWV0aG9kLiBUaGVuIGluIGEgdGVzdCwgY2FsbCBgUG9seW1lci5mbHVzaGAgdG8gZW5zdXJlCiAgICAgKiB0aGUgZGVib3VuY2VyIGhhcyBjb21wbGV0ZWQuCiAgICAgKgogICAgICogQHBhcmFtIHtEZWJvdW5jZXI/fSBkZWJvdW5jZXIgRGVib3VuY2VyIG9iamVjdC4KICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuLgogICAgICogQHJldHVybiB7IURlYm91bmNlcn0gUmV0dXJucyBhIGRlYm91bmNlciBvYmplY3QuCiAgICAgKi8KICAgIHN0YXRpYyBkZWJvdW5jZShkZWJvdW5jZXIsIGFzeW5jTW9kdWxlLCBjYWxsYmFjaykgewogICAgICBpZiAoZGVib3VuY2VyIGluc3RhbmNlb2YgRGVib3VuY2VyKSB7CiAgICAgICAgZGVib3VuY2VyLmNhbmNlbCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGRlYm91bmNlciA9IG5ldyBEZWJvdW5jZXIoKTsKICAgICAgfQogICAgICBkZWJvdW5jZXIuc2V0Q29uZmlnKGFzeW5jTW9kdWxlLCBjYWxsYmFjayk7CiAgICAgIHJldHVybiBkZWJvdW5jZXI7CiAgICB9CiAgfQoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5EZWJvdW5jZXIgPSBEZWJvdW5jZXI7Cn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+CihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgbGV0IEhBU19OQVRJVkVfVEEgPSB0eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ3N0cmluZyc7CiAgbGV0IEdFU1RVUkVfS0VZID0gJ19fcG9seW1lckdlc3R1cmVzJzsKICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICBsZXQgVE9VQ0hfQUNUSU9OID0gJ19fcG9seW1lckdlc3R1cmVzVG91Y2hBY3Rpb24nOwogIC8vIHJhZGl1cyBmb3IgdGFwIGFuZCB0cmFjawogIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICBsZXQgVFJBQ0tfRElTVEFOQ0UgPSA1OwogIC8vIG51bWJlciBvZiBsYXN0IE4gdHJhY2sgcG9zaXRpb25zIHRvIGtlZXAKICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgLy8gRGlzYWJsaW5nICJtb3VzZSIgaGFuZGxlcnMgZm9yIDI1MDBtcyBpcyBlbm91Z2gKICBsZXQgTU9VU0VfVElNRU9VVCA9IDI1MDA7CiAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgLy8gYW4gYXJyYXkgb2YgYml0bWFzayB2YWx1ZXMgZm9yIG1hcHBpbmcgTW91c2VFdmVudC53aGljaCB0byBNb3VzZUV2ZW50LmJ1dHRvbnMKICBsZXQgTU9VU0VfV0hJQ0hfVE9fQlVUVE9OUyA9IFswLCAxLCA0LCAyXTsKICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gbmV3IE1vdXNlRXZlbnQoJ3Rlc3QnLCB7YnV0dG9uczogMX0pLmJ1dHRvbnMgPT09IDE7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KSgpOwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQb3NzaWJsZSBtb3VzZSBldmVudCBuYW1lCiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICovCiAgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KG5hbWUpIHsKICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogIH0KCiAgLyogZXNsaW50IG5vLWVtcHR5OiBbImVycm9yIiwgeyAiYWxsb3dFbXB0eUNhdGNoIjogdHJ1ZSB9XSAqLwogIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogIGxldCBTVVBQT1JUU19QQVNTSVZFID0gZmFsc2U7CiAgKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgbGV0IG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge2dldCgpIHtTVVBQT1JUU19QQVNTSVZFID0gdHJ1ZTt9fSk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB9IGNhdGNoKGUpIHt9CiAgfSkoKTsKCiAgLyoqCiAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCBuYW1lIHRvIGRldGVybWluZSBpZiBge3Bhc3NpdmV9YCBvcHRpb24gaXMgbmVlZGVkCiAgICogQHJldHVybiB7e3Bhc3NpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkfSBPcHRpb25zIHRvIHVzZSBmb3IgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAqLwogIGZ1bmN0aW9uIFBBU1NJVkVfVE9VQ0goZXZlbnROYW1lKSB7CiAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50TmFtZSkgfHwgZXZlbnROYW1lID09PSAndG91Y2hlbmQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIFNVUFBPUlRTX1BBU1NJVkUgJiYgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcykgewogICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gQ2hlY2sgZm9yIHRvdWNoLW9ubHkgZGV2aWNlcwogIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogIGxldCBHZXN0dXJlUmVjb2duaXplciA9IGZ1bmN0aW9uKCl7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTogdm9pZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUucmVzZXQ7CiAgLyoqIEB0eXBlIHtmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vkb3duOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vtb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2V1cDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihUb3VjaEV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnRvdWNoc3RhcnQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaG1vdmU7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaGVuZDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLmNsaWNrOwoKICAvLyBrZWVwIHRyYWNrIG9mIGFueSBsYWJlbHMgaGl0IGJ5IHRoZSBtb3VzZUNhbmNlbGxlcgogIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICBjb25zdCBjbGlja2VkTGFiZWxzID0gW107CgogIC8qKiBAdHlwZSB7IU9iamVjdDxib29sZWFuPn0gKi8KICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgJ2J1dHRvbic6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnbWV0ZXInOiB0cnVlLAogICAgJ291dHB1dCc6IHRydWUsCiAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgJ3Byb2dyZXNzJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlCiAgfTsKCiAgLy8gRGVmaW5lZCBhdCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNlbmFibGluZy1hbmQtZGlzYWJsaW5nLWZvcm0tY29udHJvbHM6LXRoZS1kaXNhYmxlZC1hdHRyaWJ1dGUKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2NvbW1hbmQnOiB0cnVlLAogICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICdpbnB1dCc6IHRydWUsCiAgICAna2V5Z2VuJzogdHJ1ZSwKICAgICdvcHRncm91cCc6IHRydWUsCiAgICAnb3B0aW9uJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAqIEByZXR1cm4ge2Jvb2xlYW59IGVsZW1lbnQgY2FuIGhhdmUgbGFiZWxzCiAgICovCiAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgcmV0dXJuIGxhYmVsbGFibGVbZWwubG9jYWxOYW1lXSB8fCBmYWxzZTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdGhhdCBtYXkgYmUgbGFiZWxsZWQuCiAgICogQHJldHVybiB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gUmVsZXZhbnQgbGFiZWwgZm9yIGBlbGAKICAgKi8KICBmdW5jdGlvbiBtYXRjaGluZ0xhYmVscyhlbCkgewogICAgbGV0IGxhYmVscyA9IEFycmF5LmZyb20oLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyhlbCkubGFiZWxzIHx8IFtdKTsKICAgIC8vIElFIGRvZXNuJ3QgaGF2ZSBgbGFiZWxzYCBhbmQgU2FmYXJpIGRvZXNuJ3QgcG9wdWxhdGUgYGxhYmVsc2AKICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgZmluZGluZyB0aGUgbm9uLWFuY2VzdG9yIGxhYmVscyBpcyBlbm91Z2gsCiAgICAvLyBhcyB0aGUgbW91c2VDYW5jZWxsb3IgY29kZSB3aWxsIGhhbmRsZSBhbmNzdG9yIGxhYmVscwogICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgIGxhYmVscyA9IFtdOwogICAgICBsZXQgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7CiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgaWYgKGVsLmlkKSB7CiAgICAgICAgbGV0IG1hdGNoaW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke2VsLmlkfV1gKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyhtYXRjaGluZ1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGxhYmVsczsKICB9CgogIC8vIHRvdWNoIHdpbGwgbWFrZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgLy8gYHByZXZlbnREZWZhdWx0YCBvbiB0b3VjaGVuZCB3aWxsIGNhbmNlbCB0aGVtLAogIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgLy8gZGlzYWJsZSBtb3VzZSBoYW5kbGVycyBmb3IgTU9VU0VfVElNRU9VVCBtcyBhZnRlcgogIC8vIGEgdG91Y2hlbmQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAvLyBDaGVjayBmb3Igc291cmNlQ2FwYWJpbGl0aWVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHN5bnRoZXRpYyBldmVudHMKICAgIC8vIGlmIG1vdXNlRXZlbnQgZGlkIG5vdCBjb21lIGZyb20gYSBkZXZpY2UgdGhhdCBmaXJlcyB0b3VjaCBldmVudHMsCiAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAvLyBodHRwOi8vd2ljZy5naXRodWIuaW8vSW5wdXREZXZpY2VDYXBhYmlsaXRpZXMvI2RvbS1pbnB1dGRldmljZWNhcGFiaWxpdGllcy1maXJlc3RvdWNoZXZlbnRzCiAgICBsZXQgc2MgPSBtb3VzZUV2ZW50LnNvdXJjZUNhcGFiaWxpdGllczsKICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIG1vdXNlRXZlbnRbSEFORExFRF9PQkpdID0ge3NraXA6IHRydWV9OwogICAgLy8gZGlzYWJsZSAiZ2hvc3QgY2xpY2tzIgogICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICBsZXQgY2xpY2tGcm9tTGFiZWwgPSBmYWxzZTsKICAgICAgbGV0IHBhdGggPSBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCAmJiBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAocGF0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaChwYXRoW2ldKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5CZUxhYmVsbGVkKHBhdGhbaV0pKSB7CiAgICAgICAgICAgICAgbGV0IG93bmVyTGFiZWxzID0gbWF0Y2hpbmdMYWJlbHMocGF0aFtpXSk7CiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyBpcyBsYWJlbGxpbmcgdGhpcyBlbGVtZW50CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lckxhYmVscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY2xpY2tGcm9tTGFiZWwgPSBjbGlja0Zyb21MYWJlbCB8fCBjbGlja2VkTGFiZWxzLmluZGV4T2Yob3duZXJMYWJlbHNbal0pID4gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0aFtpXSA9PT0gUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgd2FzIGxhYmVsbGluZyB0aGUgdGFyZ2V0IGVsZW1lbnQsCiAgICAgIC8vIHRoaXMgaXMgbm90IGEgZ2hvc3QgY2xpY2sKICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXR1cCBUcnVlIHRvIGFkZCwgZmFsc2UgdG8gcmVtb3ZlLgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHNldHVwKSB7CiAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgIGZvciAobGV0IGkgPSAwLCBlbjsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICBlbiA9IGV2ZW50c1tpXTsKICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgLy8gcmVzZXQgY2xpY2tMYWJlbHMgYXJyYXkKICAgICAgICBjbGlja2VkTGFiZWxzLmxlbmd0aCA9IDA7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgaWYgKCFQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IpIHsKICAgICAgc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHRydWUpOwogICAgfQogICAgbGV0IHVuc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcigpOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iID0gbnVsbDsKICAgIH07CiAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iCiAgICAgICAgLCBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoTU9VU0VfVElNRU9VVCkKICAgICAgICAsIHVuc2V0KTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqIEByZXR1cm4ge2Jvb2xlYW59IGhhcyBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duCiAgICovCiAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAvLyBleGl0IGVhcmx5IGlmIHRoZSBldmVudCBpcyBub3QgYSBtb3VzZSBldmVudAogICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgIC8vIGluc3RlYWQgd2UgdXNlIGV2LmJ1dHRvbnMgKGJpdG1hc2sgb2YgYnV0dG9ucykgb3IgZmFsbCBiYWNrIHRvIGV2LndoaWNoIChkZXByZWNhdGVkLCAwIGZvciBubyBidXR0b25zLCAxIGZvciBsZWZ0IGJ1dHRvbikKICAgIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b25zID0gZXYuYnV0dG9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IGV2LmJ1dHRvbnM7CiAgICAgIGlmICgoZXYgaW5zdGFuY2VvZiB3aW5kb3cuTW91c2VFdmVudCkgJiYgIU1PVVNFX0hBU19CVVRUT05TKSB7CiAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgIH0KICAgICAgLy8gYnV0dG9ucyBpcyBhIGJpdG1hc2ssIGNoZWNrIHRoYXQgdGhlIGxlZnQgYnV0dG9uIGJpdCBpcyBzZXQgKDEpCiAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBmb3IgdGVzdGluZyBldmVudHMKICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgLy8gZXYuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duL21vdXNldXAvY2xpY2sgZm9yIGxlZnQgYnV0dG9uIGFjdGl2YXRpb24KICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gMDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU3ludGhldGljQ2xpY2soZXYpIHsKICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgIC8vIGV2LmRldGFpbCBpcyAwIGZvciBIVE1MRWxlbWVudC5jbGljayBpbiBtb3N0IGJyb3dzZXJzCiAgICAgIGlmIChldi5kZXRhaWwgPT09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpbiB0aGUgd29yc3QgY2FzZSwgY2hlY2sgdGhhdCB0aGUgeC95IHBvc2l0aW9uIG9mIHRoZSBjbGljayBpcyB3aXRoaW4KICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAvLyBUaGFua3MgSUUgMTAgPjooCiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChldik7CiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAvLyBpZiBub3QsIGp1c3QgYXNzdW1lIGl0IGlzIGEgc3ludGhldGljIGNsaWNrCiAgICAgIGlmICghdC5ub2RlVHlwZSB8fCAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBiY3IgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgIGxldCB4ID0gZXYucGFnZVgsIHkgPSBldi5wYWdlWTsKICAgICAgLy8gZXYgaXMgYSBzeW50aGV0aWMgY2xpY2sgaWYgdGhlIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0CiAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IFBPSU5URVJTVEFURSA9IHsKICAgIG1vdXNlOiB7CiAgICAgIHRhcmdldDogbnVsbCwKICAgICAgbW91c2VJZ25vcmVKb2I6IG51bGwKICAgIH0sCiAgICB0b3VjaDogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBpZDogLTEsCiAgICAgIHNjcm9sbERlY2lkZWQ6IGZhbHNlCiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZmlyc3RUb3VjaEFjdGlvbihldikgewogICAgbGV0IHRhID0gJ2F1dG8nOwogICAgbGV0IHBhdGggPSBldi5jb21wb3NlZFBhdGggJiYgZXYuY29tcG9zZWRQYXRoKCk7CiAgICBpZiAocGF0aCkgewogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBtb3ZlZm47CiAgICBzdGF0ZU9iai51cGZuID0gdXBmbjsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBmbik7CiAgfQoKICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXRlT2JqLm1vdmVmbik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RhdGVPYmoudXBmbik7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgc3RhdGVPYmoudXBmbiA9IG51bGw7CiAgfQoKICAvLyB1c2UgYSBkb2N1bWVudC13aWRlIHRvdWNoZW5kIGxpc3RlbmVyIHRvIHN0YXJ0IHRoZSBnaG9zdC1jbGljayBwcmV2ZW50aW9uIG1lY2hhbmlzbQogIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaWdub3JlTW91c2UsIFNVUFBPUlRTX1BBU1NJVkUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CgogIC8qKgogICAqIE1vZHVsZSBmb3IgYWRkaW5nIGxpc3RlbmVycyB0byBhIG5vZGUgZm9yIHRoZSBmb2xsb3dpbmcgbm9ybWFsaXplZAogICAqIGNyb3NzLXBsYXRmb3JtICJnZXN0dXJlIiBldmVudHM6CiAgICogLSBgZG93bmAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IGRvd24KICAgKiAtIGB1cGAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IHVwCiAgICogLSBgdGFwYCAtIG1vdXNlIGNsaWNrIG9yIGZpbmdlciB0YXAKICAgKiAtIGB0cmFja2AgLSBtb3VzZSBkcmFnIG9yIHRvdWNoIG1vdmUKICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgYWRkaW5nIGNyb3NzLXBsYXRmb3JtIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJzLgogICAqLwogIGNvbnN0IEdlc3R1cmVzID0gewogICAgZ2VzdHVyZXM6IHt9LAogICAgcmVjb2duaXplcnM6IFtdLAoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGVsZW1lbnQgcmVuZGVyZWQgb24gdGhlIHNjcmVlbiBhdCB0aGUgcHJvdmlkZWQgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogU2ltaWxhciB0byBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAsIGJ1dCBwaWVyY2VzIHRocm91Z2gKICAgICAqIHNoYWRvdyByb290cy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG9yaXpvbnRhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBkZWVwZXN0IHNoYWRvd1Jvb3QgaW5jbHVzaXZlIGVsZW1lbnQKICAgICAqIGZvdW5kIGF0IHRoZSBzY3JlZW4gcG9zaXRpb24gZ2l2ZW4uCiAgICAgKi8KICAgIGRlZXBUYXJnZXRGaW5kOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBfZmluZE9yaWdpbmFsVGFyZ2V0OiBmdW5jdGlvbihldikgewogICAgICAvLyBzaGFkb3dkb20KICAgICAgaWYgKGV2LmNvbXBvc2VkUGF0aCkgewogICAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUgeyFBcnJheTwhRXZlbnRUYXJnZXQ+fSAqLyhldi5jb21wb3NlZFBhdGgoKSk7CiAgICAgICAgLy8gSXQgc2hvdWxkbid0IGJlLCBidXQgc29tZXRpbWVzIHRhcmdldHMgaXMgZW1wdHkgKHdpbmRvdyBvbiBTYWZhcmkpLgogICAgICAgIHJldHVybiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzWzBdIDogZXYudGFyZ2V0OwogICAgICB9CiAgICAgIC8vIHNoYWR5ZG9tCiAgICAgIHJldHVybiBldi50YXJnZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZU5hdGl2ZTogZnVuY3Rpb24oZXYpIHsKICAgICAgbGV0IGhhbmRsZWQ7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgbGV0IG5vZGUgPSBldi5jdXJyZW50VGFyZ2V0OwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGdzID0gZ29ialt0eXBlXTsKICAgICAgaWYgKCFncykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWV2W0hBTkRMRURfT0JKXSkgewogICAgICAgIGV2W0hBTkRMRURfT0JKXSA9IHt9OwogICAgICAgIGlmICh0eXBlLnNsaWNlKDAsIDUpID09PSAndG91Y2gnKSB7CiAgICAgICAgICBldiA9IC8qKiBAdHlwZSB7VG91Y2hFdmVudH0gKi8oZXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgZmlyc3QgZmluZ2VyCiAgICAgICAgICAgIGlmIChldi50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5pZCA9IHQuaWRlbnRpZmllcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5pZCAhPT0gdC5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghSEFTX05BVElWRV9UQSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgICAgICAgR2VzdHVyZXMuX2hhbmRsZVRvdWNoQWN0aW9uKGV2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVkID0gZXZbSEFORExFRF9PQkpdOwogICAgICAvLyB1c2VkIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICAgIGlmIChoYW5kbGVkLnNraXApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gcmVzZXQgcmVjb2duaXplciBzdGF0ZQogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IEdlc3R1cmVzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IEdlc3R1cmVzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGlmIChyLmZsb3cgJiYgci5mbG93LnN0YXJ0LmluZGV4T2YoZXYudHlwZSkgPiAtMSAmJiByLnJlc2V0KSB7CiAgICAgICAgICAgIHIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZW5mb3JjZSBnZXN0dXJlIHJlY29nbml6ZXIgb3JkZXIKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBoYW5kbGVkW3IubmFtZV0gPSB0cnVlOwogICAgICAgICAgclt0eXBlXShldik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfaGFuZGxlVG91Y2hBY3Rpb246IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBwcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIHsKICAgICAgICAgIC8vIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAnbm9uZScpIHsKICAgICAgICAgIHByZXZlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teCcpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeSA+IGR4OwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teScpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeCA+IGR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJldmVudCkgewogICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndHJhY2snKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbm9kZSBmb3IgdGhlIGdpdmVuIGdlc3R1cmUgdHlwZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyBhZGRlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fYWRkKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgbGlzdGVuZXIgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcmV2aW91c2x5IHBhc3NlZCB0bwogICAgICogIGBhZGRMaXN0ZW5lcmAuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmICh0aGlzLmdlc3R1cmVzW2V2VHlwZV0pIHsKICAgICAgICB0aGlzLl9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIGFkZC4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2FkZDogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIG5vZGVbR0VTVFVSRV9LRVldID0gZ29iaiA9IHt9OwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgLy8gZG9uJ3QgYWRkIG1vdXNlIGhhbmRsZXJzIG9uIGlPUyBiZWNhdXNlIHRoZXkgY2F1c2UgZ3JheSBzZWxlY3Rpb24gb3ZlcmxheXMKICAgICAgICBpZiAoSVNfVE9VQ0hfT05MWSAmJiBpc01vdXNlRXZlbnQoZGVwKSAmJiBkZXAgIT09ICdjbGljaycpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICBnb2JqW2RlcF0gPSBnZCA9IHtfY291bnQ6IDB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZGVwLCB0aGlzLl9oYW5kbGVOYXRpdmUsIFBBU1NJVkVfVE9VQ0goZGVwKSk7CiAgICAgICAgfQogICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDApICsgMTsKICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDApICsgMTsKICAgICAgfQogICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgaWYgKHJlY29nbml6ZXIudG91Y2hBY3Rpb24pIHsKICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgZXZlbnQgbGlzdGVuZXIgcmVtb3ZhbCBmb3IgbmF0aXZlIGV2ZW50cwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbm9kZSBOb2RlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgZXZlbnQuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZUeXBlIEV2ZW50IHR5cGUgdG8gcmVtb3ZlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihFdmVudD8pfSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfcmVtb3ZlOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLmdlc3R1cmVzW2V2VHlwZV07CiAgICAgIGxldCBkZXBzID0gcmVjb2duaXplci5kZXBzOwogICAgICBsZXQgbmFtZSA9IHJlY29nbml6ZXIubmFtZTsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKGdvYmopIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICAgIGlmIChnZCAmJiBnZFtuYW1lXSkgewogICAgICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAxKSAtIDE7CiAgICAgICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMSkgLSAxOwogICAgICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIG5ldyBnZXN0dXJlIGV2ZW50IHJlY29nbml6ZXIgZm9yIGFkZGluZyBuZXcgY3VzdG9tCiAgICAgKiBnZXN0dXJlIGV2ZW50IHR5cGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlUmVjb2duaXplcn0gcmVjb2cgR2VzdHVyZSByZWNvZ25pemVyIGRlc2NyaXB0b3IKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZWNvZykgewogICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXN0dXJlc1tyZWNvZy5lbWl0c1tpXV0gPSByZWNvZzsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfZmluZFJlY29nbml6ZXJCeUV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCB0aGlzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHRoaXMucmVjb2duaXplcnNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG47IGogPCByLmVtaXRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBuID0gci5lbWl0c1tqXTsKICAgICAgICAgIGlmIChuID09PSBldk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldFRvdWNoQWN0aW9uOiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgICBpZiAoSEFTX05BVElWRV9UQSkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgIG5vZGUuc3R5bGUudG91Y2hBY3Rpb24gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBub2RlW1RPVUNIX0FDVElPTl0gPSB2YWx1ZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHsKICAgICAgbGV0IGV2ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7CiAgICAgIGV2LmRldGFpbCA9IGRldGFpbDsKICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByZXZlbnRzIHRoZSBkaXNwYXRjaCBhbmQgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldk5hbWUgRXZlbnQgbmFtZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuX2ZpbmRSZWNvZ25pemVyQnlFdmVudChldk5hbWUpOwogICAgICBpZiAocmVjb2duaXplci5pbmZvKSB7CiAgICAgICAgcmVjb2duaXplci5pbmZvLnByZXZlbnQgPSB0cnVlOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUmVzZXQgdGhlIDI1MDBtcyB0aW1lb3V0IG9uIHByb2Nlc3NpbmcgbW91c2UgaW5wdXQgYWZ0ZXIgZGV0ZWN0aW5nIHRvdWNoIGlucHV0LgogICAgICoKICAgICAqIFRvdWNoIGlucHV0cyBjcmVhdGUgc3ludGhlc2l6ZWQgbW91c2UgaW5wdXRzIGFueXdoZXJlIGZyb20gMCB0byAyMDAwbXMgYWZ0ZXIgdGhlIHRvdWNoLgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0ZXN0aW5nIHdpdGggc2ltdWxhdGVkIHRvdWNoIGlucHV0cy4KICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW4gcHJvZHVjdGlvbiBtYXkgY2F1c2UgZHVwbGljYXRlIHRhcHMgb3Igb3RoZXIgR2VzdHVyZXMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0TW91c2VDYW5jZWxsZXI6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAnZG93bnVwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ2Rvd24nLCAndXAnXSwKCiAgICBpbmZvOiB7CiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbAogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgc2VsZiA9IHRoaXM7CiAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHNlbGYuX2ZpcmUoJ3VwJywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5fZmlyZSgnZG93bicsIHQsIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5fZmlyZSgndXAnLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLnByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RyYWNrJywKICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCddLAogICAgZmxvdzogewogICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICBlbmQ6IFsnbW91c2V1cCcsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndHJhY2snXSwKCiAgICBpbmZvOiB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHN0YXRlOiAnc3RhcnQnLAogICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgbW92ZXM6IFtdLAogICAgICAvKiogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfSAqLwogICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgaWYgKHRoaXMubW92ZXMubGVuZ3RoID4gVFJBQ0tfTEVOR1RIKSB7CiAgICAgICAgICB0aGlzLm1vdmVzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubW92ZXMucHVzaChtb3ZlKTsKICAgICAgfSwKICAgICAgbW92ZWZuOiBudWxsLAogICAgICB1cGZuOiBudWxsLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvLm1vdmVzID0gW107CiAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgdGhpcy5pbmZvLnkgPSAwOwogICAgICB0aGlzLmluZm8ucHJldmVudCA9IGZhbHNlOwogICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge251bWJlcn0geAogICAgICogQHBhcmFtIHtudW1iZXJ9IHkKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc01vdmVkRW5vdWdoOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgZHggPSBNYXRoLmFicyh0aGlzLmluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyh0aGlzLmluZm8ueSAtIHkpOwogICAgICByZXR1cm4gKGR4ID49IFRSQUNLX0RJU1RBTkNFIHx8IGR5ID49IFRSQUNLX0RJU1RBTkNFKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBsZXQgeCA9IGUuY2xpZW50WCwgeSA9IGUuY2xpZW50WTsKICAgICAgICBpZiAoc2VsZi5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgICAgLy8gZmlyc3QgbW92ZSBpcyAnc3RhcnQnLCBzdWJzZXF1ZW50IG1vdmVzIGFyZSAnbW92ZScsIG1vdXNldXAgaXMgJ2VuZCcKICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9IHNlbGYuaW5mby5zdGFydGVkID8gKGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2VuZCcgOiAndHJhY2snKSA6ICdzdGFydCc7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndGFwJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgLy8gYWx3YXlzIF9maXJlICJlbmQiCiAgICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGYuX2ZpcmUodCwgZSk7CiAgICAgICAgICBzZWxmLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChzZWxmLmluZm8uc3RhcnRlZCkgewogICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgbGlzdGVuZXJzCiAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgIH07CiAgICAgIC8vIGFkZCB0ZW1wb3JhcnkgZG9jdW1lbnQgbGlzdGVuZXJzIGFzIG1vdXNlIHJldGFyZ2V0cwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHRoaXMuaW5mby54ID0gY3QuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgeCA9IGN0LmNsaWVudFgsIHkgPSBjdC5jbGllbnRZOwogICAgICBpZiAodGhpcy5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgIGlmICh0aGlzLmluZm8uc3RhdGUgPT09ICdzdGFydCcpIHsKICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QpOwogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgLy8gcmVzZXQgc3RhcnRlZCBzdGF0ZSBvbiB1cAogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgIHRoaXMuaW5mby5hZGRNb3ZlKHt4OiBjdC5jbGllbnRYLCB5OiBjdC5jbGllbnRZfSk7CiAgICAgICAgdGhpcy5fZmlyZSh0LCBjdCwgZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdG91Y2gpIHsKICAgICAgbGV0IHNlY29uZGxhc3QgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDFdOwogICAgICBsZXQgZHggPSBsYXN0bW92ZS54IC0gdGhpcy5pbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSB0aGlzLmluZm8ueTsKICAgICAgbGV0IGRkeCwgZGR5ID0gMDsKICAgICAgaWYgKHNlY29uZGxhc3QpIHsKICAgICAgICBkZHggPSBsYXN0bW92ZS54IC0gc2Vjb25kbGFzdC54OwogICAgICAgIGRkeSA9IGxhc3Rtb3ZlLnkgLSBzZWNvbmRsYXN0Lnk7CiAgICAgIH0KICAgICAgR2VzdHVyZXMuX2ZpcmUodGFyZ2V0LCAndHJhY2snLCB7CiAgICAgICAgc3RhdGU6IHRoaXMuaW5mby5zdGF0ZSwKICAgICAgICB4OiB0b3VjaC5jbGllbnRYLAogICAgICAgIHk6IHRvdWNoLmNsaWVudFksCiAgICAgICAgZHg6IGR4LAogICAgICAgIGR5OiBkeSwKICAgICAgICBkZHg6IGRkeCwKICAgICAgICBkZHk6IGRkeSwKICAgICAgICBzb3VyY2VFdmVudDogdG91Y2gsCiAgICAgICAgaG92ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLmRlZXBUYXJnZXRGaW5kKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0pOwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAndGFwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWyd0YXAnXSwKICAgIGluZm86IHsKICAgICAgeDogTmFOLAogICAgICB5OiBOYU4sCiAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby54ID0gTmFOOwogICAgICB0aGlzLmluZm8ueSA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2F2ZTogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBlLmNsaWVudFk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5zYXZlKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICB0aGlzLmZvcndhcmQoZSk7CiAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLnNhdmUoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuZm9yd2FyZChlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7RXZlbnQgfCBUb3VjaH0gZQogICAgICogQHBhcmFtIHtFdmVudD19IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZm9yd2FyZDogZnVuY3Rpb24oZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIHRoaXMuaW5mby54KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnMoZS5jbGllbnRZIC0gdGhpcy5pbmZvLnkpOwogICAgICAvLyBmaW5kIG9yaWdpbmFsIHRhcmdldCBmcm9tIGBwcmV2ZW50ZXJgIGZvciBUb3VjaEV2ZW50cywgb3IgYGVgIGZvciBNb3VzZUV2ZW50cwogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoLyoqIEB0eXBlIHtFdmVudH0gKi8ocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCF0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgICAgR2VzdHVyZXMuX2ZpcmUodCwgJ3RhcCcsIHsKICAgICAgICAgICAgeDogZS5jbGllbnRYLAogICAgICAgICAgICB5OiBlLmNsaWVudFksCiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBlLAogICAgICAgICAgICBwcmV2ZW50ZXI6IHByZXZlbnRlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CgogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldDsKCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuYWRkID0gR2VzdHVyZXMuYWRkTGlzdGVuZXI7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLnJlbW92ZSA9IEdlc3R1cmVzLnJlbW92ZUxpc3RlbmVyOwoKICBQb2x5bWVyLkdlc3R1cmVzID0gR2VzdHVyZXM7Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQGNvbnN0IHtQb2x5bWVyLkdlc3R1cmVzfQogICAqLwogIGNvbnN0IGdlc3R1cmVzID0gUG9seW1lci5HZXN0dXJlczsKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIEFQSSBmb3IgYWRkaW5nIFBvbHltZXIncyBjcm9zcy1wbGF0Zm9ybQogICAqIGdlc3R1cmUgZXZlbnRzIHRvIG5vZGVzLgogICAqCiAgICogVGhlIEFQSSBpcyBkZXNpZ25lZCB0byBiZSBjb21wYXRpYmxlIHdpdGggb3ZlcnJpZGUgcG9pbnRzIGltcGxlbWVudGVkCiAgICogaW4gYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAgc3VjaCB0aGF0IGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBpbgogICAqIHRlbXBsYXRlcyB3aWxsIHN1cHBvcnQgZ2VzdHVyZSBldmVudHMgd2hlbiB0aGlzIG1peGluIGlzIGFwcGxpZWQgYWxvbmcgd2l0aAogICAqIGBQb2x5bWVyLlRlbXBsYXRlU3RhbXBgLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIEFQSSBmb3IgYWRkaW5nIFBvbHltZXIncyBjcm9zcy1wbGF0Zm9ybQogICAqIGdlc3R1cmUgZXZlbnRzIHRvIG5vZGVzCiAgICovCiAgUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqLwogICAgY2xhc3MgR2VzdHVyZUV2ZW50TGlzdGVuZXJzIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAvKioKICAgICAgICogQWRkIHRoZSBldmVudCBsaXN0ZW5lciB0byB0aGUgbm9kZSBpZiBpdCBpcyBhIGdlc3R1cmVzIGV2ZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIGlmICghZ2VzdHVyZXMuYWRkTGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSkgewogICAgICAgICAgc3VwZXIuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXIgZnJvbQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIGlmICghZ2VzdHVyZXMucmVtb3ZlTGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSkgewogICAgICAgICAgc3VwZXIuX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gR2VzdHVyZUV2ZW50TGlzdGVuZXJzOwoKICB9KTsKCn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+CiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGNvbnN0IEhPU1RfRElSID0gLzpob3N0XCg6ZGlyXCgobHRyfHJ0bClcKVwpL2c7CiAgICBjb25zdCBIT1NUX0RJUl9SRVBMQUNNRU5UID0gJzpob3N0KFtkaXI9IiQxIl0pJzsKCiAgICBjb25zdCBFTF9ESVIgPSAvKFtcc1x3LSNcLlxbXF1cKl0qKTpkaXJcKChsdHJ8cnRsKVwpL2c7CiAgICBjb25zdCBFTF9ESVJfUkVQTEFDTUVOVCA9ICc6aG9zdChbZGlyPSIkMiJdKSAkMSc7CgogICAgY29uc3QgRElSX0NIRUNLID0gLzpkaXJcKCg/Omx0cnxydGwpXCkvOwogICAgCiAgICBjb25zdCBTSElNX1NIQURPVyA9IEJvb2xlYW4od2luZG93WydTaGFkeURPTSddICYmIHdpbmRvd1snU2hhZHlET00nXVsnaW5Vc2UnXSk7CgogICAgLyoqCiAgICAgKiBAdHlwZSB7IUFycmF5PCFQb2x5bWVyX0Rpck1peGluPn0KICAgICAqLwogICAgY29uc3QgRElSX0lOU1RBTkNFUyA9IFtdOwoKICAgIC8qKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0gKi8KICAgIGxldCBvYnNlcnZlciA9IG51bGw7CgogICAgbGV0IERPQ1VNRU5UX0RJUiA9ICcnOwoKICAgIGZ1bmN0aW9uIGdldFJUTCgpIHsKICAgICAgRE9DVU1FTlRfRElSID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlyJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyX0Rpck1peGlufSBpbnN0YW5jZSBJbnN0YW5jZSB0byBzZXQgUlRMIHN0YXR1cyBvbgogICAgICovCiAgICBmdW5jdGlvbiBzZXRSVEwoaW5zdGFuY2UpIHsKICAgICAgaWYgKCFpbnN0YW5jZS5fX2F1dG9EaXJPcHRPdXQpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhpbnN0YW5jZSk7CiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkaXInLCBET0NVTUVOVF9ESVIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlRGlyZWN0aW9uKCkgewogICAgICBnZXRSVEwoKTsKICAgICAgRE9DVU1FTlRfRElSID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlyJyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRElSX0lOU1RBTkNFUy5sZW5ndGg7IGkrKykgewogICAgICAgIHNldFJUTChESVJfSU5TVEFOQ0VTW2ldKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRha2VSZWNvcmRzKCkgewogICAgICBpZiAob2JzZXJ2ZXIgJiYgb2JzZXJ2ZXIudGFrZVJlY29yZHMoKS5sZW5ndGgpIHsKICAgICAgICB1cGRhdGVEaXJlY3Rpb24oKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IGFsbG93cyBlbGVtZW50cyB0byB1c2UgdGhlIGA6ZGlyYCBDU1MgU2VsZWN0b3IgdG8gaGF2ZQogICAgICogdGV4dCBkaXJlY3Rpb24gc3BlY2lmaWMgc3R5bGluZy4KICAgICAqCiAgICAgKiBXaXRoIHRoaXMgbWl4aW4sIGFueSBzdHlsZXNoZWV0IHByb3ZpZGVkIGluIHRoZSB0ZW1wbGF0ZSB3aWxsIHRyYW5zZm9ybSBgOmRpcmAgaW50bwogICAgICogYDpob3N0KFtkaXJdKWAgYW5kIHN5bmMgZGlyZWN0aW9uIHdpdGggdGhlIHBhZ2UgdmlhIHRoZSBlbGVtZW50J3MgYGRpcmAgYXR0cmlidXRlLgogICAgICoKICAgICAqIEVsZW1lbnRzIGNhbiBvcHQgb3V0IG9mIHRoZSBnbG9iYWwgcGFnZSB0ZXh0IGRpcmVjdGlvbiBieSBzZXR0aW5nIHRoZSBgZGlyYCBhdHRyaWJ1dGUKICAgICAqIGRpcmVjdGx5IGluIGByZWFkeSgpYCBvciBpbiBIVE1MLgogICAgICoKICAgICAqIENhdmVhdHM6CiAgICAgKiAtIEFwcGxpY2F0aW9ucyBtdXN0IHNldCBgPGh0bWwgZGlyPSJsdHIiPmAgb3IgYDxodG1sIGRpcj0icnRsIj5gIHRvIHN5bmMgZGlyZWN0aW9uCiAgICAgKiAtIEF1dG9tYXRpYyBsZWZ0LXRvLXJpZ2h0IG9yIHJpZ2h0LXRvLWxlZnQgc3R5bGluZyBpcyBzeW5jJ2Qgd2l0aCB0aGUgYDxodG1sPmAgZWxlbWVudCBvbmx5LgogICAgICogLSBDaGFuZ2luZyBgZGlyYCBhdCBydW50aW1lIGlzIHN1cHBvcnRlZC4KICAgICAqIC0gT3B0aW5nIG91dCBvZiB0aGUgZ2xvYmFsIGRpcmVjdGlvbiBzdHlsaW5nIGlzIHBlcm1hbmVudAogICAgICoKICAgICAqIEBtaXhpbkZ1bmN0aW9uCiAgICAgKiBAcG9seW1lcgogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICovCiAgICBQb2x5bWVyLkRpck1peGluID0gUG9seW1lci5kZWR1cGluZ01peGluKChiYXNlKSA9PiB7CgogICAgICBpZiAoIVNISU1fU0hBRE9XKSB7CiAgICAgICAgaWYgKCFvYnNlcnZlcikgewogICAgICAgICAgZ2V0UlRMKCk7CiAgICAgICAgICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHVwZGF0ZURpcmVjdGlvbik7CiAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwge2F0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydkaXInXX0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlBY2Nlc3NvcnN9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBjb25zdCBlbGVtZW50QmFzZSA9IFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMoYmFzZSk7CgogICAgICAvKioKICAgICAgICogQHBvbHltZXIKICAgICAgICogQG1peGluQ2xhc3MKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfRGlyTWl4aW59CiAgICAgICAqLwogICAgICBjbGFzcyBEaXIgZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfcHJvY2Vzc1N0eWxlVGV4dChjc3NUZXh0LCBiYXNlVVJJKSB7CiAgICAgICAgICBjc3NUZXh0ID0gc3VwZXIuX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgICAgICBpZiAoIVNISU1fU0hBRE9XICYmIERJUl9DSEVDSy50ZXN0KGNzc1RleHQpKSB7CiAgICAgICAgICAgIGNzc1RleHQgPSB0aGlzLl9yZXBsYWNlRGlySW5Dc3NUZXh0KGNzc1RleHQpOwogICAgICAgICAgICB0aGlzLl9fYWN0aXZhdGVEaXIgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXBsYWNlIGA6ZGlyYCBpbiB0aGUgZ2l2ZW4gQ1NTIHRleHQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IENTUyB0ZXh0IHRvIHJlcGxhY2UgRElSCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBNb2RpZmllZCBDU1MKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3JlcGxhY2VEaXJJbkNzc1RleHQodGV4dCkgewogICAgICAgICAgbGV0IHJlcGxhY2VkVGV4dCA9IHRleHQ7CiAgICAgICAgICByZXBsYWNlZFRleHQgPSByZXBsYWNlZFRleHQucmVwbGFjZShIT1NUX0RJUiwgSE9TVF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXBsYWNlZFRleHQgPSByZXBsYWNlZFRleHQucmVwbGFjZShFTF9ESVIsIEVMX0RJUl9SRVBMQUNNRU5UKTsKICAgICAgICAgIHJldHVybiByZXBsYWNlZFRleHQ7CiAgICAgICAgfQoKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgICB0aGlzLl9fYXV0b0Rpck9wdE91dCA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IENsb3N1cmUgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgYHRoaXNgIGlzIGFuIEhUTUxFbGVtZW50CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICB0aGlzLl9fYXV0b0Rpck9wdE91dCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKS5oYXNBdHRyaWJ1dGUoJ2RpcicpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSWYgaXQgZXhpc3RzIG9uIGVsZW1lbnRCYXNlLCBpdCBjYW4gYmUgc3VwZXInZAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICBpZiAoZWxlbWVudEJhc2UucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5fX2FjdGl2YXRlRGlyKSB7CiAgICAgICAgICAgIHRha2VSZWNvcmRzKCk7CiAgICAgICAgICAgIERJUl9JTlNUQU5DRVMucHVzaCh0aGlzKTsKICAgICAgICAgICAgc2V0UlRMKHRoaXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSWYgaXQgZXhpc3RzIG9uIGVsZW1lbnRCYXNlLCBpdCBjYW4gYmUgc3VwZXInZAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICBpZiAoZWxlbWVudEJhc2UucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5fX2FjdGl2YXRlRGlyKSB7CiAgICAgICAgICAgIGNvbnN0IGlkeCA9IERJUl9JTlNUQU5DRVMuaW5kZXhPZih0aGlzKTsKICAgICAgICAgICAgaWYgKGlkeCA+IC0xKSB7CiAgICAgICAgICAgICAgRElSX0lOU1RBTkNFUy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgRGlyLl9fYWN0aXZhdGVEaXIgPSBmYWxzZTsKCiAgICAgIHJldHVybiBEaXI7CiAgICB9KTsKICB9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHJ1biBhIGNhbGxiYWNrIHdoZW4gSFRNTEltcG9ydHMgYXJlIHJlYWR5IG9yIGltbWVkaWF0ZWx5IGlmCiAgLy8gdGhpcyBhcGkgaXMgbm90IGF2YWlsYWJsZS4KICBmdW5jdGlvbiB3aGVuSW1wb3J0c1JlYWR5KGNiKSB7CiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7CiAgICAgIEhUTUxJbXBvcnRzLndoZW5SZWFkeShjYik7CiAgICB9IGVsc2UgewogICAgICBjYigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGA8bGluayByZWw9ImltcG9ydCI+YCBlbGVtZW50IHdpdGgKICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgKiBlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgY29udGVudHMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIFVSTCB0byBkb2N1bWVudCB0byBsb2FkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICogICBsb2FkZWQuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUVycm9yRXZlbnQpOnZvaWQ9fSBvbmVycm9yIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydAogICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICogICBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAqLwogIFBvbHltZXIuaW1wb3J0SHJlZiA9IGZ1bmN0aW9uKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsKICAgIGxldCBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovCiAgICAgIChkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj0iJyArIGhyZWYgKyAnIl1baW1wb3J0LWhyZWZdJykpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIGxpbmsgPSAvKiogQHR5cGUge0hUTUxMaW5rRWxlbWVudH0gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7CiAgICAgIGxpbmsucmVsID0gJ2ltcG9ydCc7CiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7CiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpbXBvcnQtaHJlZicsICcnKTsKICAgIH0KICAgIC8vIGFsd2F5cyBlbnN1cmUgbGluayBoYXMgYGFzeW5jYCBhdHRyaWJ1dGUgaWYgdXNlciBzcGVjaWZpZWQgb25lLAogICAgLy8gZXZlbiBpZiBpdCB3YXMgcHJldmlvdXNseSBub3QgYXN5bmMuIFRoaXMgaXMgY29uc2lkZXJlZCBsZXNzIGNvbmZ1c2luZy4KICAgIGlmIChvcHRBc3luYykgewogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXN5bmMnLCAnJyk7CiAgICB9CiAgICAvLyBOT1RFOiB0aGUgbGluayBtYXkgbm93IGJlIGluIDMgc3RhdGVzOiAoMSkgcGVuZGluZyBpbnNlcnRpb24sCiAgICAvLyAoMikgaW5mbGlnaHQsICgzKSBhbHJlYWR5IGxvYWRlZC4gSW4gZWFjaCBjYXNlLCB3ZSBuZWVkIHRvIGFkZAogICAgLy8gZXZlbnQgbGlzdGVuZXJzIHRvIHByb2Nlc3MgY2FsbGJhY2tzLgogICAgbGV0IGNsZWFudXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgfTsKICAgIGxldCBsb2FkTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGxvYWQsIGNhY2hlIHRoZSBsb2FkIGV2ZW50IG9uIHRoZSBsaW5rIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlIHdoZW4KICAgICAgLy8gaXQgaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgaHJlZiBwYXJhbS4KICAgICAgbGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQgPSB0cnVlOwogICAgICBpZiAob25sb2FkKSB7CiAgICAgICAgd2hlbkltcG9ydHNSZWFkeSgoKSA9PiB7CiAgICAgICAgICBvbmxvYWQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGV0IGVycm9yTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHJlbW92ZSB0aGUgbGluayBmcm9tIHRoZSBkb2N1bWVudCBzbyB0aGF0IGl0CiAgICAgIC8vIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgYGltcG9ydEhyZWZgIGlzCiAgICAgIC8vIGNhbGxlZC4KICAgICAgaWYgKGxpbmsucGFyZW50Tm9kZSkgewogICAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTsKICAgICAgfQogICAgICBpZiAob25lcnJvcikgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25lcnJvcihldmVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkTGlzdGVuZXIpOwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgaWYgKGxpbmsucGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAvLyBpZiB0aGUgbGluayBhbHJlYWR5IGxvYWRlZCwgZGlzcGF0Y2ggYSBmYWtlIGxvYWQgZXZlbnQKICAgIC8vIHNvIHRoYXQgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYW5kIGdldCBhIHByb3BlciBldmVudCBhcmd1bWVudC4KICAgIH0gZWxzZSBpZiAobGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQpIHsKICAgICAgbGluay5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcpKTsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH07Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IHNjaGVkdWxlZCA9IGZhbHNlOwogIGxldCBiZWZvcmVSZW5kZXJRdWV1ZSA9IFtdOwogIGxldCBhZnRlclJlbmRlclF1ZXVlID0gW107CgogIGZ1bmN0aW9uIHNjaGVkdWxlKCkgewogICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgIC8vIGJlZm9yZSBuZXh0IHJlbmRlcgogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkgewogICAgICBzY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgZmx1c2hRdWV1ZShiZWZvcmVSZW5kZXJRdWV1ZSk7CiAgICAgIC8vIGFmdGVyIHRoZSByZW5kZXIKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBydW5RdWV1ZShhZnRlclJlbmRlclF1ZXVlKTsKICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGZsdXNoUXVldWUocXVldWUpIHsKICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJ1blF1ZXVlKHF1ZXVlKSB7CiAgICBmb3IgKGxldCBpPTAsIGw9cXVldWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGNhbGxNZXRob2QocXVldWUuc2hpZnQoKSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjYWxsTWV0aG9kKGluZm8pIHsKICAgIGNvbnN0IGNvbnRleHQgPSBpbmZvWzBdOwogICAgY29uc3QgY2FsbGJhY2sgPSBpbmZvWzFdOwogICAgY29uc3QgYXJncyA9IGluZm9bMl07CiAgICB0cnkgewogICAgICBjYWxsYmFjay5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gY2F0Y2goZSkgewogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aHJvdyBlOwogICAgICB9KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZsdXNoKCkgewogICAgd2hpbGUgKGJlZm9yZVJlbmRlclF1ZXVlLmxlbmd0aCB8fCBhZnRlclJlbmRlclF1ZXVlLmxlbmd0aCkgewogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgZmx1c2hRdWV1ZShhZnRlclJlbmRlclF1ZXVlKTsKICAgIH0KICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3Igc2NoZWR1bGluZyBmbHVzaGFibGUgcHJlLXJlbmRlciBhbmQgcG9zdC1yZW5kZXIgdGFza3MuCiAgICovCiAgUG9seW1lci5SZW5kZXJTdGF0dXMgPSB7CgogICAgLyoqCiAgICAgKiBFbnF1ZXVlcyBhIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgbmV4dCByZW5kZXIsIGF0CiAgICAgKiBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCB0aW1pbmcuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBlbnF1ZXVpbmcgd29yayB0aGF0IHJlcXVpcmVzIERPTSBtZWFzdXJlbWVudCwKICAgICAqIHNpbmNlIG1lYXN1cmVtZW50IG1heSBub3QgYmUgcmVsaWFibGUgaW4gY3VzdG9tIGVsZW1lbnQgY2FsbGJhY2tzIGJlZm9yZQogICAgICogdGhlIGZpcnN0IHJlbmRlciwgYXMgd2VsbCBhcyBmb3IgYmF0Y2hpbmcgbWVhc3VyZW1lbnQgdGFza3MgaW4gZ2VuZXJhbC4KICAgICAqCiAgICAgKiBUYXNrcyBpbiB0aGlzIHF1ZXVlIG1heSBiZSBmbHVzaGVkIGJ5IGNhbGxpbmcgYFBvbHltZXIuUmVuZGVyU3RhdHVzLmZsdXNoKClgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGJlZm9yZU5leHRSZW5kZXI6IGZ1bmN0aW9uKGNvbnRleHQsIGNhbGxiYWNrLCBhcmdzKSB7CiAgICAgIGlmICghc2NoZWR1bGVkKSB7CiAgICAgICAgc2NoZWR1bGUoKTsKICAgICAgfQogICAgICBiZWZvcmVSZW5kZXJRdWV1ZS5wdXNoKFtjb250ZXh0LCBjYWxsYmFjaywgYXJnc10pOwogICAgfSwKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYWZ0ZXIgdGhlIG5leHQgcmVuZGVyLCBlcXVpdmFsZW50CiAgICAgKiB0byBvbmUgdGFzayAoYHNldFRpbWVvdXRgKSBhZnRlciB0aGUgbmV4dCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIHR1bmluZyB0aGUgZmlyc3QtcmVuZGVyIHBlcmZvcm1hbmNlIG9mIGFuCiAgICAgKiBlbGVtZW50IG9yIGFwcGxpY2F0aW9uIGJ5IGRlZmVycmluZyBub24tY3JpdGljYWwgd29yayB1bnRpbCBhZnRlciB0aGUKICAgICAqIGZpcnN0IHBhaW50LiAgVHlwaWNhbCBub24tcmVuZGVyLWNyaXRpY2FsIHdvcmsgbWF5IGluY2x1ZGUgYWRkaW5nIFVJCiAgICAgKiBldmVudCBsaXN0ZW5lcnMgYW5kIGFyaWEgYXR0cmlidXRlcy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5SZW5kZXJTdGF0dXMKICAgICAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IG9iamVjdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBib3VuZCB0bwogICAgICogQHBhcmFtIHtmdW5jdGlvbiguLi4qKTp2b2lkfSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbgogICAgICogQHBhcmFtIHshQXJyYXk9fSBhcmdzIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhZnRlck5leHRSZW5kZXI6IGZ1bmN0aW9uKGNvbnRleHQsIGNhbGxiYWNrLCBhcmdzKSB7CiAgICAgIGlmICghc2NoZWR1bGVkKSB7CiAgICAgICAgc2NoZWR1bGUoKTsKICAgICAgfQogICAgICBhZnRlclJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRmx1c2hlcyBhbGwgYGJlZm9yZU5leHRSZW5kZXJgIHRhc2tzLCBmb2xsb3dlZCBieSBhbGwgYGFmdGVyTmV4dFJlbmRlcmAKICAgICAqIHRhc2tzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZmx1c2g6IGZsdXNoCgogIH07Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvLyB1bnJlc29sdmVkCgogIGZ1bmN0aW9uIHJlc29sdmUoKSB7CiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgndW5yZXNvbHZlZCcpOwogIH0KCiAgaWYgKHdpbmRvdy5XZWJDb21wb25lbnRzKSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignV2ViQ29tcG9uZW50c1JlYWR5JywgcmVzb2x2ZSk7CiAgfSBlbHNlIHsKICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKICAgICAgcmVzb2x2ZSgpOwogICAgfSBlbHNlIHsKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCByZXNvbHZlKTsKICAgIH0KICB9Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gbmV3U3BsaWNlKGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50KSB7CiAgICByZXR1cm4gewogICAgICBpbmRleDogaW5kZXgsCiAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsCiAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgIH07CiAgfQoKICBjb25zdCBFRElUX0xFQVZFID0gMDsKICBjb25zdCBFRElUX1VQREFURSA9IDE7CiAgY29uc3QgRURJVF9BREQgPSAyOwogIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyAqYmFzZWQqIG9uIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgTGV2ZW5zaHRlaW4KICAvLyAiZWRpdCIgZGlzdGFuY2UuIFRoZSBvbmUgY2hhbmdlIGlzIHRoYXQgInVwZGF0ZXMiIGFyZSB0cmVhdGVkIGFzIHR3bwogIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgLy8gZm9sbG93ZWQgYnkgYW4gYWRkLiBCeSByZXRhaW5pbmcgdGhpcywgd2Ugb3B0aW1pemUgZm9yICJrZWVwaW5nIiB0aGUKICAvLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgICd4eHh4MTIzJyAtPiAnMTIzeXl5eScKICAvLwogIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogIC8vIGNoYXJhY3RlcnMuIFdpdGggMi1lZGl0IHVwZGF0ZXMsIHdlIGRlbGV0ZSA0LCBsZWF2ZSAzLCBhbmQgYWRkIDQuIFRoaXMKICAvLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuCiAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpIHsKICAgIC8vICJEZWxldGlvbiIgY29sdW1ucwogICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7CiAgICBsZXQgZGlzdGFuY2VzID0gbmV3IEFycmF5KHJvd0NvdW50KTsKCiAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKICAgICAgZGlzdGFuY2VzW2ldID0gbmV3IEFycmF5KGNvbHVtbkNvdW50KTsKICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIG51bGwgcm93CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgIGRpc3RhbmNlc1swXVtqXSA9IGo7CgogICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgIGlmIChlcXVhbHMoY3VycmVudFtjdXJyZW50U3RhcnQgKyBqIC0gMV0sIG9sZFtvbGRTdGFydCArIGkgLSAxXSkpCiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpIC0gMV1bal0gKyAxOwogICAgICAgICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaV1baiAtIDFdICsgMTsKICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdGFuY2VzOwogIH0KCiAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogIC8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHQKICAvLyBtYXRyaXguCiAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTsKICAgIGxldCBqID0gZGlzdGFuY2VzWzBdLmxlbmd0aCAtIDE7CiAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgIGxldCBlZGl0cyA9IFtdOwogICAgd2hpbGUgKGkgPiAwIHx8IGogPiAwKSB7CiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGogPT0gMCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqXTsKICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgIGxldCBtaW47CiAgICAgIGlmICh3ZXN0IDwgbm9ydGgpCiAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgIGVsc2UKICAgICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0OwoKICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICBpZiAobm9ydGhXZXN0ID09IGN1cnJlbnQpIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9MRUFWRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9VUERBVEUpOwogICAgICAgICAgY3VycmVudCA9IG5vcnRoV2VzdDsKICAgICAgICB9CiAgICAgICAgaS0tOwogICAgICAgIGotLTsKICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY3VycmVudCA9IG5vcnRoOwogICAgICB9CiAgICB9CgogICAgZWRpdHMucmV2ZXJzZSgpOwogICAgcmV0dXJuIGVkaXRzOwogIH0KCiAgLyoqCiAgICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOgogICAqCiAgICogQSBzcGxpY2UgbWFwIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgaG93IGEgcHJldmlvdXMgYXJyYXkgb2YgaXRlbXMKICAgKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZgogICAqIHR1cGxlcyBvZgogICAqCiAgICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+CiAgICoKICAgKiB3aGljaCBhcmUga2VwdCBpbiBhc2NlbmRpbmcgaW5kZXggb3JkZXIgb2YuIFRoZSB0dXBsZSByZXByZXNlbnRzIHRoYXQgYXQKICAgKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmQKICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAqLwoKICAvKioKICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgKiBzcGxpY2VzIGNhbiBiZSBzeW50aGVzaXplZCBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIGZpbmFsIHN0YXRlIG9mIGFuCiAgICogYXJyYXkuIFRoZSBiYXNpYyBhcHByb2FjaCBpcyB0byBjYWxjdWxhdGUgdGhlIGVkaXQgZGlzdGFuY2UgbWF0cml4IGFuZAogICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAqCiAgICogQ29tcGxleGl0eTogTyhsICogcCkKICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgKiAgIHA6IFRoZSBsZW5ndGggb2YgdGhlIG9sZCBhcnJheQogICAqCiAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAqIGNhbGN1bGF0ZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50RW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYGN1cnJlbnRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRTdGFydCBTdGFydGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAqIHRoZSBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBsb2NhdGlvbjsgYGFkZGVkQ291bnRgIHRoZSBudW1iZXIKICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAqLwogIGZ1bmN0aW9uIGNhbGNTcGxpY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICBsZXQgcHJlZml4Q291bnQgPSAwOwogICAgbGV0IHN1ZmZpeENvdW50ID0gMDsKICAgIGxldCBzcGxpY2U7CgogICAgbGV0IG1pbkxlbmd0aCA9IE1hdGgubWluKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKICAgIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKQogICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgaWYgKGN1cnJlbnRFbmQgPT0gY3VycmVudC5sZW5ndGggJiYgb2xkRW5kID09IG9sZC5sZW5ndGgpCiAgICAgIHN1ZmZpeENvdW50ID0gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoIC0gcHJlZml4Q291bnQpOwoKICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50OwogICAgY3VycmVudEVuZCAtPSBzdWZmaXhDb3VudDsKICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICBpZiAoY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCA9PSAwICYmIG9sZEVuZCAtIG9sZFN0YXJ0ID09IDApCiAgICAgIHJldHVybiBbXTsKCiAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIDApOwogICAgICB3aGlsZSAob2xkU3RhcnQgPCBvbGRFbmQpCiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgcmV0dXJuIFsgc3BsaWNlIF07CiAgICB9IGVsc2UgaWYgKG9sZFN0YXJ0ID09IG9sZEVuZCkKICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgbGV0IG9wcyA9IHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcygKICAgICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICBsZXQgc3BsaWNlcyA9IFtdOwogICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgbGV0IG9sZEluZGV4ID0gb2xkU3RhcnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgY2FzZSBFRElUX0xFQVZFOgogICAgICAgICAgaWYgKHNwbGljZSkgewogICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgaW5kZXgrKzsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9BREQ6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfREVMRVRFOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3BsaWNlKSB7CiAgICAgIHNwbGljZXMucHVzaChzcGxpY2UpOwogICAgfQogICAgcmV0dXJuIHNwbGljZXM7CiAgfQoKICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspCiAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRbaV0sIG9sZFtpXSkpCiAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gc2VhcmNoTGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBsZXQgaW5kZXgxID0gY3VycmVudC5sZW5ndGg7CiAgICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBzZWFyY2hMZW5ndGggJiYgZXF1YWxzKGN1cnJlbnRbLS1pbmRleDFdLCBvbGRbLS1pbmRleDJdKSkKICAgICAgY291bnQrKzsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICByZXR1cm4gY2FsY1NwbGljZXMoY3VycmVudCwgMCwgY3VycmVudC5sZW5ndGgsIHByZXZpb3VzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpIHsKICAgIHJldHVybiBjdXJyZW50VmFsdWUgPT09IHByZXZpb3VzVmFsdWU7CiAgfQoKICAvKioKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGRpZmZpbmcgYXJyYXlzLgogICAqLwogIFBvbHltZXIuQXJyYXlTcGxpY2UgPSB7CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyB0aGUgbWluaW11bSBlZGl0cyByZXF1aXJlZAogICAgICogdG8gdHJhbnNmb3JtIHRoZSBgcHJldmlvdXNgIGFycmF5IGludG8gdGhlIGBjdXJyZW50YCBhcnJheS4KICAgICAqCiAgICAgKiBTcGxpY2UgcmVjb3JkcyBhcmUgb3JkZXJlZCBieSBpbmRleCBhbmQgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqIC0gYGluZGV4YDogaW5kZXggd2hlcmUgZWRpdCBzdGFydGVkCiAgICAgKiAtIGByZW1vdmVkYDogYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgaW5kZXgKICAgICAqIC0gYGFkZGVkQ291bnRgOiBudW1iZXIgb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIExldmVuc2h0ZWluICJtaW5pbXVtIGVkaXQgZGlzdGFuY2UiCiAgICAgKiBhbGdvcml0aG0uIE5vdGUgdGhhdCB1cGRhdGVzIGFyZSB0cmVhdGVkIGFzIHJlbW92YWwgZm9sbG93ZWQgYnkgYWRkaXRpb24uCiAgICAgKgogICAgICogVGhlIHdvcnN0LWNhc2UgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIGBPKGwgKiBwKWAKICAgICAqICAgbDogVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBhcnJheQogICAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBhcnJheQogICAgICoKICAgICAqIEhvd2V2ZXIsIHRoZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkgaXMgcmVkdWNlZCBieSBhbiBgTyhuKWAgb3B0aW1pemF0aW9uCiAgICAgKiB0byBkZXRlY3QgYW55IHNoYXJlZCBwcmVmaXggJiBzdWZmaXggYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBhbmQgb25seQogICAgICogcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgbWluaW11bSBlZGl0IGRpc3RhbmNlIGNhbGN1bGF0aW9uIG92ZXIgdGhlCiAgICAgKiBub24tc2hhcmVkIHBvcnRpb25zIG9mIHRoZSBhcnJheXMuCiAgICAgKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5BcnJheVNwbGljZQogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBjYWxjdWxhdGVTcGxpY2VzCiAgfTsKCn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+CihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiBgbm9kZWAgaXMgYSBzbG90IGVsZW1lbnQKICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0LgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYG5vZGVgIGlzIGEgc2xvdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gaXNTbG90KG5vZGUpIHsKICAgIHJldHVybiAobm9kZS5sb2NhbE5hbWUgPT09ICdzbG90Jyk7CiAgfQoKICAvKioKICAgKiBDbGFzcyB0aGF0IGxpc3RlbnMgZm9yIGNoYW5nZXMgKGFkZGl0aW9ucyBvciByZW1vdmFscykgdG8KICAgKiAiZmxhdHRlbmVkIG5vZGVzIiBvbiBhIGdpdmVuIGBub2RlYC4gVGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzIGNvbnNpc3RzCiAgICogb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuIHRoYXQgYXJlIGA8c2xvdD5gIGVsZW1lbnRzLAogICAqIHRoZSBleHBhbmRlZCBmbGF0dGVuZWQgbGlzdCBvZiBgYXNzaWduZWROb2Rlc2AuCiAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBvYnNlcnZlZCBub2RlIGhhcyBjaGlsZHJlbiBgPGE+PC9hPjxzbG90Pjwvc2xvdD48Yj48L2I+YAogICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgKiBub2RlcyBsaXN0IGlzIGA8YT48L2E+PGRpdj48L2Rpdj48Yj48L2I+YC4gSWYgdGhlIGA8c2xvdD5gIGhhcyBvdGhlcgogICAqIGA8c2xvdD5gIGVsZW1lbnRzIGFzc2lnbmVkIHRvIGl0LCB0aGVzZSBhcmUgZmxhdHRlbmVkIGFzIHdlbGwuCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgYGNhbGxiYWNrYCBpcyBjYWxsZWQgd2hlbmV2ZXIgYW55IGNoYW5nZSB0byB0aGlzIGxpc3QKICAgKiBvZiBmbGF0dGVuZWQgbm9kZXMgb2NjdXJzLCB3aGVyZSBhbiBhZGRpdGlvbiBvciByZW1vdmFsIG9mIGEgbm9kZSBpcwogICAqIGNvbnNpZGVyZWQgYSBjaGFuZ2UuIFRoZSBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCwgYW4gb2JqZWN0CiAgICogY29udGFpbmluZyBhbiBhcnJheSBvZiBhbnkgYGFkZGVkTm9kZXNgIGFuZCBgcmVtb3ZlZE5vZGVzYC4KICAgKgogICAqIE5vdGU6IHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgYXN5bmNocm9ub3VzIHRvIGFueSBjaGFuZ2VzCiAgICogYXQgYSBtaWNyb3Rhc2sgY2hlY2twb2ludC4gVGhpcyBpcyBiZWNhdXNlIG9ic2VydmF0aW9uIGlzIHBlcmZvcm1lZCB1c2luZwogICAqIGBNdXRhdGlvbk9ic2VydmVyYCBhbmQgdGhlIGA8c2xvdD5gIGVsZW1lbnQncyBgc2xvdGNoYW5nZWAgZXZlbnQgd2hpY2gKICAgKiBhcmUgYXN5bmNocm9ub3VzLgogICAqCiAgICogQW4gZXhhbXBsZToKICAgKiBgYGBqcwogICAqIGNsYXNzIFRlc3RTZWxmT2JzZXJ2ZSBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CiAgICogICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ3Rlc3Qtc2VsZi1vYnNlcnZlJzt9CiAgICogICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgKiAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgKiAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyKHRoaXMsIChpbmZvKSA9PiB7CiAgICogICAgICAgdGhpcy5pbmZvID0gaW5mbzsKICAgKiAgICAgfSk7CiAgICogICB9CiAgICogICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgKiAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgKiAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAqICAgfQogICAqIH0KICAgKiBjdXN0b21FbGVtZW50cy5kZWZpbmUoVGVzdFNlbGZPYnNlcnZlLmlzLCBUZXN0U2VsZk9ic2VydmUpOwogICAqIGBgYAogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDbGFzcyB0aGF0IGxpc3RlbnMgZm9yIGNoYW5nZXMgKGFkZGl0aW9ucyBvciByZW1vdmFscykgdG8KICAgKiAiZmxhdHRlbmVkIG5vZGVzIiBvbiBhIGdpdmVuIGBub2RlYC4KICAgKi8KICBjbGFzcyBGbGF0dGVuZWROb2Rlc09ic2VydmVyIHsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzIGZvciB0aGUgZ2l2ZW4gYG5vZGVgLgogICAgICogVGhpcyBsaXN0IGNvbnNpc3RzIG9mIGEgbm9kZSdzIGNoaWxkcmVuIGFuZCwgZm9yIGFueSBjaGlsZHJlbgogICAgICogdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsIHRoZSBleHBhbmRlZCBmbGF0dGVuZWQgbGlzdCBvZiBgYXNzaWduZWROb2Rlc2AuCiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICAgKiBhbmQgdGhlIGA8c2xvdD5gIGhhcyBvbmUgYDxkaXY+YCBhc3NpZ25lZCB0byBpdCwgdGhlbiB0aGUgZmxhdHRlbmVkCiAgICAgKiBub2RlcyBsaXN0IGlzIGA8YT48L2E+PGRpdj48L2Rpdj48Yj48L2I+YC4gSWYgdGhlIGA8c2xvdD5gIGhhcyBvdGhlcgogICAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgICAqCiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fEhUTUxTbG90RWxlbWVudH0gbm9kZSBUaGUgbm9kZSBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAqLwogICAgc3RhdGljIGdldEZsYXR0ZW5lZE5vZGVzKG5vZGUpIHsKICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgIG5vZGUgPSAvKiogQHR5cGUge0hUTUxTbG90RWxlbWVudH0gKi8obm9kZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1hc3NpZ24KICAgICAgICByZXR1cm4gbm9kZS5hc3NpZ25lZE5vZGVzKHtmbGF0dGVuOiB0cnVlfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKS5tYXAoKG5vZGUpID0+IHsKICAgICAgICAgIGlmIChpc1Nsb3Qobm9kZSkpIHsKICAgICAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgICAgICByZXR1cm4gbm9kZS5hc3NpZ25lZE5vZGVzKHtmbGF0dGVuOiB0cnVlfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gW25vZGVdOwogICAgICAgICAgfQogICAgICAgIH0pLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgTm9kZSBvbiB3aGljaCB0byBsaXN0ZW4gZm9yIGNoYW5nZXMuCiAgICAgKiBAcGFyYW0gez9mdW5jdGlvbighRWxlbWVudCwgeyB0YXJnZXQ6ICFFbGVtZW50LCBhZGRlZE5vZGVzOiAhQXJyYXk8IUVsZW1lbnQ+LCByZW1vdmVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4gfSk6dm9pZH0gY2FsbGJhY2sgRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlcmUgYXJlIGFkZGl0aW9ucwogICAgICogb3IgcmVtb3ZhbHMgZnJvbSB0aGUgdGFyZ2V0J3MgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMuCiAgICAqLwogICAgY29uc3RydWN0b3IodGFyZ2V0LCBjYWxsYmFjaykgewogICAgICAvKioKICAgICAgICogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAvKioKICAgICAgICogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7RWxlbWVudH0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3RhcmdldCA9IHRhcmdldDsKICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICB0aGlzLl9lZmZlY3RpdmVOb2RlcyA9IFtdOwogICAgICB0aGlzLl9vYnNlcnZlciA9IG51bGw7CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICAvKioKICAgICAgICogQHR5cGUge2Z1bmN0aW9uKCl9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICB0aGlzLl9ib3VuZFNjaGVkdWxlID0gKCkgPT4gewogICAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICAgIH07CiAgICAgIHRoaXMuY29ubmVjdCgpOwogICAgICB0aGlzLl9zY2hlZHVsZSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWN0aXZhdGVzIGFuIG9ic2VydmVyLiBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuCiAgICAgKiBhIGBGbGF0dGVuZWROb2Rlc09ic2VydmVyYCBpcyBjcmVhdGVkLiBJdCBzaG91bGQgb25seSBiZSBjYWxsZWQgdG8KICAgICAqIHJlLWFjdGl2YXRlIGFuIG9ic2VydmVyIHRoYXQgaGFzIGJlZW4gZGVhY3RpdmF0ZWQgdmlhIHRoZSBgZGlzY29ubmVjdGAgbWV0aG9kLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3QoKSB7CiAgICAgIGlmIChpc1Nsb3QodGhpcy5fdGFyZ2V0KSkgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl9saXN0ZW5TbG90cyh0aGlzLl90YXJnZXQuY2hpbGRyZW4pOwogICAgICAgIGlmICh3aW5kb3cuU2hhZHlET00pIHsKICAgICAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9CiAgICAgICAgICAgIFNoYWR5RE9NLm9ic2VydmVDaGlsZHJlbih0aGlzLl90YXJnZXQsIChtdXRhdGlvbnMpID0+IHsKICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyLm9ic2VydmUodGhpcy5fdGFyZ2V0LCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZWFjdGl2YXRlcyB0aGUgZmxhdHRlbmVkIG5vZGVzIG9ic2VydmVyLiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kCiAgICAgKiB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4gY2hhbmdlcyB0byBmbGF0dGVuZWQgbm9kZXMKICAgICAqIG9jY3VyLiBUaGUgYGNvbm5lY3RgIG1ldGhvZCBtYXkgYmUgc3Vic2VxdWVudGx5IGNhbGxlZCB0byByZWFjdGl2YXRlCiAgICAgKiB0aGUgb2JzZXJ2ZXIuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fdW5saXN0ZW5TbG90cyhbdGhpcy5fdGFyZ2V0XSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFyZ2V0LmNoaWxkcmVuKSB7CiAgICAgICAgdGhpcy5fdW5saXN0ZW5TbG90cyh0aGlzLl90YXJnZXQuY2hpbGRyZW4pOwogICAgICAgIGlmICh3aW5kb3cuU2hhZHlET00gJiYgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgICBTaGFkeURPTS51bm9ic2VydmVDaGlsZHJlbih0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpOwogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9zY2hlZHVsZSgpIHsKICAgICAgaWYgKCF0aGlzLl9zY2hlZHVsZWQpIHsKICAgICAgICB0aGlzLl9zY2hlZHVsZWQgPSB0cnVlOwogICAgICAgIFBvbHltZXIuQXN5bmMubWljcm9UYXNrLnJ1bigoKSA9PiB0aGlzLmZsdXNoKCkpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpIHsKICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgdGhpcy5mbHVzaCgpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtBcnJheTxNdXRhdGlvblJlY29yZD59IG11dGF0aW9ucyBNdXRhdGlvbnMgc2lnbmFsZWQgYnkgdGhlIG11dGF0aW9uIG9ic2VydmVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3Byb2Nlc3NTbG90TXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICBpZiAobXV0YXRpb25zKSB7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbXV0YXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07CiAgICAgICAgICBpZiAobXV0YXRpb24uYWRkZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl9saXN0ZW5TbG90cyhtdXRhdGlvbi5hZGRlZE5vZGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtdXRhdGlvbi5yZW1vdmVkTm9kZXMpIHsKICAgICAgICAgICAgdGhpcy5fdW5saXN0ZW5TbG90cyhtdXRhdGlvbi5yZW1vdmVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRmx1c2hlcyB0aGUgb2JzZXJ2ZXIgY2F1c2luZyBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIGJlIGltbWVkaWF0ZWx5CiAgICAgKiBkZWxpdmVyZWQgdGhlIG9ic2VydmVyIGNhbGxiYWNrLiBCeSBkZWZhdWx0IHRoZXNlIGNoYW5nZXMgYXJlIGRlbGl2ZXJlZAogICAgICogYXN5bmNocm9ub3VzbHkgYXQgdGhlIG5leHQgbWljcm90YXNrIGNoZWNrcG9pbnQuCiAgICAgKgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwZW5kaW5nIGNoYW5nZXMgY2F1c2VkIHRoZSBvYnNlcnZlcgogICAgICogY2FsbGJhY2sgdG8gcnVuLgogICAgICovCiAgICBmbHVzaCgpIHsKICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyh0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlci50YWtlUmVjb3JkcygpKTsKICAgICAgfQogICAgICB0aGlzLl9zY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgbGV0IGluZm8gPSB7CiAgICAgICAgdGFyZ2V0OiB0aGlzLl90YXJnZXQsCiAgICAgICAgYWRkZWROb2RlczogW10sCiAgICAgICAgcmVtb3ZlZE5vZGVzOiBbXQogICAgICB9OwogICAgICBsZXQgbmV3Tm9kZXMgPSB0aGlzLmNvbnN0cnVjdG9yLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMuX3RhcmdldCk7CiAgICAgIGxldCBzcGxpY2VzID0gUG9seW1lci5BcnJheVNwbGljZS5jYWxjdWxhdGVTcGxpY2VzKG5ld05vZGVzLAogICAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzKTsKICAgICAgLy8gcHJvY2VzcyByZW1vdmFscwogICAgICBmb3IgKGxldCBpPTAsIHM7IChpPHNwbGljZXMubGVuZ3RoKSAmJiAocz1zcGxpY2VzW2ldKTsgaSsrKSB7CiAgICAgICAgZm9yIChsZXQgaj0wLCBuOyAoaiA8IHMucmVtb3ZlZC5sZW5ndGgpICYmIChuPXMucmVtb3ZlZFtqXSk7IGorKykgewogICAgICAgICAgaW5mby5yZW1vdmVkTm9kZXMucHVzaChuKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gcHJvY2VzcyBhZGRzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPXMuaW5kZXg7IGogPCBzLmluZGV4ICsgcy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgIGluZm8uYWRkZWROb2Rlcy5wdXNoKG5ld05vZGVzW2pdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gdXBkYXRlIGNhY2hlCiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gbmV3Tm9kZXM7CiAgICAgIGxldCBkaWRGbHVzaCA9IGZhbHNlOwogICAgICBpZiAoaW5mby5hZGRlZE5vZGVzLmxlbmd0aCB8fCBpbmZvLnJlbW92ZWROb2Rlcy5sZW5ndGgpIHsKICAgICAgICBkaWRGbHVzaCA9IHRydWU7CiAgICAgICAgdGhpcy5jYWxsYmFjay5jYWxsKHRoaXMuX3RhcmdldCwgaW5mbyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGRpZEZsdXNoOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX2xpc3RlblNsb3RzKG5vZGVMaXN0KSB7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG5vZGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IG4gPSBub2RlTGlzdFtpXTsKICAgICAgICBpZiAoaXNTbG90KG4pKSB7CiAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9ib3VuZFNjaGVkdWxlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7IUFycmF5PEVsZW1lbnR8Tm9kZT58IU5vZGVMaXN0PE5vZGU+fSBub2RlTGlzdCBOb2RlcyB0aGF0IGNvdWxkIGNoYW5nZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF91bmxpc3RlblNsb3RzKG5vZGVMaXN0KSB7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG5vZGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IG4gPSBub2RlTGlzdFtpXTsKICAgICAgICBpZiAoaXNTbG90KG4pKSB7CiAgICAgICAgICBuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9ib3VuZFNjaGVkdWxlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgfQoKICBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgPSBGbGF0dGVuZWROb2Rlc09ic2VydmVyOwoKfSkoKTsKPC9zY3JpcHQ+PHNjcmlwdD4KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IGRlYm91bmNlclF1ZXVlID0gW107CgogIC8qKgogICAqIEFkZHMgYSBgUG9seW1lci5EZWJvdW5jZXJgIHRvIGEgbGlzdCBvZiBnbG9iYWxseSBmbHVzaGFibGUgdGFza3MuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7IVBvbHltZXIuRGVib3VuY2VyfSBkZWJvdW5jZXIgRGVib3VuY2VyIHRvIGVucXVldWUKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlciA9IGZ1bmN0aW9uKGRlYm91bmNlcikgewogICAgZGVib3VuY2VyUXVldWUucHVzaChkZWJvdW5jZXIpOwogIH07CgogIGZ1bmN0aW9uIGZsdXNoRGVib3VuY2VycygpIHsKICAgIGNvbnN0IGRpZEZsdXNoID0gQm9vbGVhbihkZWJvdW5jZXJRdWV1ZS5sZW5ndGgpOwogICAgd2hpbGUgKGRlYm91bmNlclF1ZXVlLmxlbmd0aCkgewogICAgICB0cnkgewogICAgICAgIGRlYm91bmNlclF1ZXVlLnNoaWZ0KCkuZmx1c2goKTsKICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGlkRmx1c2g7CiAgfQoKICAvKioKICAgKiBGb3JjZXMgc2V2ZXJhbCBjbGFzc2VzIG9mIGFzeW5jaHJvbm91c2x5IHF1ZXVlZCB0YXNrcyB0byBmbHVzaDoKICAgKiAtIERlYm91bmNlcnMgYWRkZWQgdmlhIGBlbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5mbHVzaCA9IGZ1bmN0aW9uKCkgewogICAgbGV0IHNoYWR5RE9NLCBkZWJvdW5jZXJzOwogICAgZG8gewogICAgICBzaGFkeURPTSA9IHdpbmRvdy5TaGFkeURPTSAmJiBTaGFkeURPTS5mbHVzaCgpOwogICAgICBpZiAod2luZG93LlNoYWR5Q1NTICYmIHdpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbSkgewogICAgICAgIHdpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbS5mbHVzaCgpOwogICAgICB9CiAgICAgIGRlYm91bmNlcnMgPSBmbHVzaERlYm91bmNlcnMoKTsKICAgIH0gd2hpbGUgKHNoYWR5RE9NIHx8IGRlYm91bmNlcnMpOwogIH07Cgp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBwID0gRWxlbWVudC5wcm90b3R5cGU7CiAgLyoqCiAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICovCiAgY29uc3Qgbm9ybWFsaXplZE1hdGNoZXNTZWxlY3RvciA9IHAubWF0Y2hlcyB8fCBwLm1hdGNoZXNTZWxlY3RvciB8fAogICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgcC5vTWF0Y2hlc1NlbGVjdG9yIHx8IHAud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAvKioKICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAqCiAgICogQGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIG1hdGNoCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBub2RlIG1hdGNoZWQgc2VsZWN0b3IKICAgKi8KICBjb25zdCBtYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbihub2RlLCBzZWxlY3RvcikgewogICAgcmV0dXJuIG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IuY2FsbChub2RlLCBzZWxlY3Rvcik7CiAgfTsKCiAgLyoqCiAgICogTm9kZSBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEb21BcGkgewoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIFBvbHltZXIuZG9tIGhlbHBlciBvYmplY3QuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5vZGUpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcmAgdGhhdAogICAgICogbGlzdGVucyBmb3Igbm9kZSBjaGFuZ2VzIG9uIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBDYWxsZWQgd2hlbiBkaXJlY3Qgb3IgZGlzdHJpYnV0ZWQgY2hpbGRyZW4KICAgICAqICAgb2YgdGhpcyBlbGVtZW50IGNoYW5nZXMKICAgICAqIEByZXR1cm4geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgKi8KICAgIG9ic2VydmVOb2RlcyhjYWxsYmFjaykgewogICAgICByZXR1cm4gbmV3IFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLm5vZGUsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGFuIG9ic2VydmVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEgYG9ic2VydmVOb2Rlc2AKICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgKiAgIHRvIGRpc2Nvbm5lY3QuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICBvYnNlcnZlckhhbmRsZS5kaXNjb25uZWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm92aWRlZCBhcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIEFQSSBvbmx5LiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbm90aWZ5T2JzZXJ2ZXIoKSB7fQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgKiBsaWdodC1ET00gY2hpbGRyZW4gb3Igc2hhZG93IHJvb3QsIGluY2x1ZGluZyBhbnkgbmVzdGVkIHNoYWRvdyByb290cwogICAgICogb2YgY2hpbGRyZW4gdGhlcmVpbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBjb250YWluZWQgd2l0aGluCiAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgKi8KICAgIGRlZXBDb250YWlucyhub2RlKSB7CiAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMobm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbiA9IG5vZGU7CiAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIC8vIHdhbGsgZnJvbSBub2RlIHRvIGB0aGlzYCBvciBgZG9jdW1lbnRgCiAgICAgIHdoaWxlIChuICYmIG4gIT09IGRvYyAmJiBuICE9PSB0aGlzLm5vZGUpIHsKICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZSB8fCBuLmhvc3Q7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb29kTm9kZSgpYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtOb2RlfSBUb3AgbW9zdCBlbGVtZW50IGluIHRoZSBkb20gdHJlZSBpbiB3aGljaCB0aGUgbm9kZQogICAgICogZXhpc3RzLiBJZiB0aGUgbm9kZSBpcyBjb25uZWN0ZWQgdG8gYSBkb2N1bWVudCB0aGlzIGlzIGVpdGhlciBhCiAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAqIGl0c2VsZiBvciBhIG5vZGUgb3IgZG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyBpdC4KICAgICAqLwogICAgZ2V0T3duZXJSb290KCkgewogICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFJvb3ROb2RlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICogYW4gZW1wdHkgYXJyYXkuIEl0IGlzIGVxdWl2YWxlbnQgdG8gYDxzbG90Pi5hZGRpZ25lZE5vZGVzKHtmbGF0dGVuOnRydWV9KWAuCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAqLwogICAgZ2V0RGlzdHJpYnV0ZWROb2RlcygpIHsKICAgICAgcmV0dXJuICh0aGlzLm5vZGUubG9jYWxOYW1lID09PSAnc2xvdCcpID8KICAgICAgICB0aGlzLm5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHNsb3RzIHRoaXMgZWxlbWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICovCiAgICBnZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpIHsKICAgICAgbGV0IGlwJCA9IFtdOwogICAgICBsZXQgbiA9IHRoaXMubm9kZS5hc3NpZ25lZFNsb3Q7CiAgICAgIHdoaWxlIChuKSB7CiAgICAgICAgaXAkLnB1c2gobik7CiAgICAgICAgbiA9IG4uYXNzaWduZWRTbG90OwogICAgICB9CiAgICAgIHJldHVybiBpcCQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBvd25lckRvY3VtZW50YCBmb3IgdGhpcyBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBpbXBvcnQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCBUcnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbG9uZWQgZGVlcGx5IGR1cmluZwogICAgICogICBpbXBvcnQKICAgICAqIEByZXR1cm4ge05vZGV9IENsb25lIG9mIGdpdmVuIG5vZGUgaW1wb3J0ZWQgdG8gdGhpcyBvd25lciBkb2N1bWVudAogICAgICovCiAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgbGV0IGRvYyA9IHRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50ID8gdGhpcy5ub2RlIDoKICAgICAgICB0aGlzLm5vZGUub3duZXJEb2N1bWVudDsKICAgICAgcmV0dXJuIGRvYy5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAqIG5vZGVzIGFzc2lnbmVkIHRvIGNoaWxkIHNsb3RzLgogICAgICovCiAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICByZXR1cm4gUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMubm9kZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBmbGF0dGVuZWQgY2hpbGQgZWxlbWVudHMgZm9yIHRoaXMgZWxlbWVudCBiYXNlZAogICAgICogb24gdGhlIGdpdmVuIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBmaWx0ZXIgbm9kZXMgYWdhaW5zdAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzCiAgICAgKi8KICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICBsZXQgYyQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgbGV0IGxpc3QgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKGMubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJgogICAgICAgICAgICBtYXRjaGVzU2VsZWN0b3IoYywgc2VsZWN0b3IpKSB7CiAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICogc2hhZG93IHJvb3QuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZXx1bmRlZmluZWR9IEN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQKICAgICAqLwogICAgZ2V0IGFjdGl2ZUVsZW1lbnQoKSB7CiAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICByZXR1cm4gbm9kZS5fYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gbm9kZS5fYWN0aXZlRWxlbWVudCA6IG5vZGUuYWN0aXZlRWxlbWVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRNZXRob2RzKHByb3RvLCBtZXRob2RzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICBwcm90b1ttZXRob2RdID0gLyoqIEB0aGlzIHtEb21BcGl9ICovIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtEb21BcGl9ICovICh0aGlzKS5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQoKICBmb3J3YXJkTWV0aG9kcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAnY2xvbmVOb2RlJywgJ2FwcGVuZENoaWxkJywgJ2luc2VydEJlZm9yZScsICdyZW1vdmVDaGlsZCcsCiAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgJ3F1ZXJ5U2VsZWN0b3InLCAncXVlcnlTZWxlY3RvckFsbCcKICBdKTsKCiAgZm9yd2FyZFJlYWRPbmx5UHJvcGVydGllcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAncGFyZW50Tm9kZScsICdmaXJzdENoaWxkJywgJ2xhc3RDaGlsZCcsCiAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICdsYXN0RWxlbWVudENoaWxkJywgJ25leHRFbGVtZW50U2libGluZycsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywKICAgICdjaGlsZE5vZGVzJywgJ2NoaWxkcmVuJywgJ2NsYXNzTGlzdCcKICBdKTsKCiAgZm9yd2FyZFByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3RleHRDb250ZW50JywgJ2lubmVySFRNTCcKICBdKTsKCgogIC8qKgogICAqIEV2ZW50IEFQSSB3cmFwcGVyIGNsYXNzIHJldHVybmVkIGZyb20gYFBvbHltZXIuZG9tLih0YXJnZXQpYCB3aGVuCiAgICogYHRhcmdldGAgaXMgYW4gYEV2ZW50YC4KICAgKi8KICBjbGFzcyBFdmVudEFwaSB7CiAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICoKICAgICAqIEByZXR1cm4geyFFdmVudFRhcmdldH0gVGhlIG5vZGUgdGhpcyBldmVudCB3YXMgZGlzcGF0Y2hlZCB0bwogICAgICovCiAgICBnZXQgcm9vdFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKClbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqLwogICAgZ2V0IGxvY2FsVGFyZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC50YXJnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgY29tcG9zZWRQYXRoYCBmb3IgdGhpcyBldmVudC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgfQogIH0KCiAgUG9seW1lci5Eb21BcGkgPSBEb21BcGk7CgogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGRlZXAKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuY2xvbmVOb2RlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcGFyYW0ge05vZGV9IHJlZkNoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmluc2VydEJlZm9yZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG9sZENoaWxkCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVwbGFjZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuc2V0QXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4gez9FbGVtZW50fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4geyFOb2RlTGlzdDwhRWxlbWVudD59CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7CgogIC8qKgogICAqIExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8gYWJzdHJhY3QKICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICogb2xkZXIgYnJvd3NlcnMuCiAgICoKICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAqIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcyBzaW1wbHkgZmFjYWRlcyBkaXJlY3RseSB0byB0aGUgc3RhbmRhcmQgbmF0aXZlCiAgICogQVBJLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8KICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KE5vZGV8RXZlbnQpPX0gb2JqIE5vZGUgb3IgZXZlbnQgdG8gb3BlcmF0ZSBvbgogICAqIEByZXR1cm4geyFEb21BcGl8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICovCiAgUG9seW1lci5kb20gPSBmdW5jdGlvbihvYmopIHsKICAgIG9iaiA9IG9iaiB8fCBkb2N1bWVudDsKICAgIGlmICghb2JqLl9fZG9tQXBpKSB7CiAgICAgIGxldCBoZWxwZXI7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFdmVudCkgewogICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlciA9IG5ldyBEb21BcGkob2JqKTsKICAgICAgfQogICAgICBvYmouX19kb21BcGkgPSBoZWxwZXI7CiAgICB9CiAgICByZXR1cm4gb2JqLl9fZG9tQXBpOwogIH07CgogIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmZsdXNoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqLwogIFBvbHltZXIuZG9tLmZsdXNoID0gUG9seW1lci5mbHVzaDsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGZhY2FkZXMgdG8gYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICovCiAgUG9seW1lci5kb20uYWRkRGVib3VuY2VyID0gUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyOwp9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IHN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgUG9seW1lcidzICJsZWdhY3kiIEFQSSBpbnRlbmRlZCB0byBiZQogICAqIGJhY2t3YXJkLWNvbXBhdGlibGUgdG8gdGhlIGdyZWF0ZXN0IGV4dGVudCBwb3NzaWJsZSB3aXRoIHRoZSBBUEkKICAgKiBmb3VuZCBvbiB0aGUgUG9seW1lciAxLnggYFBvbHltZXIuQmFzZWAgcHJvdG90eXBlIGFwcGxpZWQgdG8gYWxsIGVsZW1lbnRzCiAgICogZGVmaW5lZCB1c2luZyB0aGUgYFBvbHltZXIoey4uLn0pYCBmdW5jdGlvbi4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycwogICAqIEBwcm9wZXJ0eSBpc0F0dGFjaGVkIHtib29sZWFufSBTZXQgdG8gYHRydWVgIGluIHRoaXMgZWxlbWVudCdzCiAgICogICBgY29ubmVjdGVkQ2FsbGJhY2tgIGFuZCBgZmFsc2VgIGluIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJCiAgICovCiAgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4gPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oKGJhc2UpID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9EaXJNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGxlZ2FjeUVsZW1lbnRCYXNlID0gUG9seW1lci5EaXJNaXhpbihQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyhQb2x5bWVyLkVsZW1lbnRNaXhpbihiYXNlKSkpOwoKICAgIC8qKgogICAgICogTWFwIG9mIHNpbXBsZSBuYW1lcyB0byB0b3VjaCBhY3Rpb24gbmFtZXMKICAgICAqIEBkaWN0CiAgICAgKi8KICAgIGNvbnN0IERJUkVDVElPTl9NQVAgPSB7CiAgICAgICd4JzogJ3Bhbi14JywKICAgICAgJ3knOiAncGFuLXknLAogICAgICAnbm9uZSc6ICdub25lJywKICAgICAgJ2FsbCc6ICdhdXRvJwogICAgfTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2xlZ2FjeUVsZW1lbnRCYXNlfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfTGVnYWN5RWxlbWVudE1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBMZWdhY3lFbGVtZW50IGV4dGVuZHMgbGVnYWN5RWxlbWVudEJhc2UgewoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5pc0F0dGFjaGVkOwogICAgICAgIC8qKiBAdHlwZSB7V2Vha01hcDwhRWxlbWVudCwgIU9iamVjdDxzdHJpbmcsICFGdW5jdGlvbj4+fSAqLwogICAgICAgIHRoaXMuX19ib3VuZExpc3RlbmVyczsKICAgICAgICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEZ1bmN0aW9uPn0gKi8KICAgICAgICB0aGlzLl9kZWJvdW5jZXJzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yd2FyZHMgYGltcG9ydE1ldGFgIGZyb20gdGhlIHByb3RvdHlwZSAoaS5lLiBmcm9tIHRoZSBpbmZvIG9iamVjdAogICAgICAgKiBwYXNzZWQgdG8gYFBvbHltZXIoey4uLn0pYCkgdG8gdGhlIHN0YXRpYyBBUEkuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRoZSBgaW1wb3J0Lm1ldGFgIG9iamVjdCBzZXQgb24gdGhlIHByb3RvdHlwZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBgdGhpc2AgaXMgYWx3YXlzIGluIHRoZSBpbnN0YW5jZSBpbgogICAgICAgKiAgY2xvc3VyZSBmb3Igc29tZSByZWFzb24gZXZlbiBpbiBhIHN0YXRpYyBtZXRob2QsIHJhdGhlciB0aGFuIHRoZSBjbGFzcwogICAgICAgKi8KICAgICAgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5pbXBvcnRNZXRhOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgdGhlIGBjb25zdHJ1Y3RvcmAsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY3JlYXRlZCgpIHt9CgogICAgICAvKioKICAgICAgICogUHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICAgKiB3aGljaCBhZGRzIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRhY2hlZGAgbWV0aG9kLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgdGhpcy5pc0F0dGFjaGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmF0dGFjaGVkKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyBgY29ubmVjdGVkQ2FsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGF0dGFjaGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgZGlzY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGRldGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmRldGFjaGVkKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyBgZGlzY29ubmVjdGVkQ2FsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGRldGFjaGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBvdmVycmlkZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYAogICAgICAgKiB3aGljaCBhZGRzIHRoZSBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgYXR0cmlidXRlQ2hhbmdlZGAgbWV0aG9kLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIGF0dHJpYnV0ZS4KICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lc3BhY2UgQXR0cmlidXRlIG5hbWVzcGFjZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBhdHRyaWJ1dGVDaGFuZ2VkQ2hhbGxiYWNrYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGNsYXNzIGluaXRpYWxpemF0aW9uIHZpYSB0aGUgYF9yZWdpc3RlcmVkYCBjYWxsYmFjay4KICAgICAgICogVGhpcyBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CiAgICAgICAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpOwogICAgICAgIGlmICghcHJvdG8uaGFzT3duUHJvcGVydHkoJ19faGFzUmVnaXN0ZXJGaW5pc2hlZCcpKSB7CiAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkKCk7CiAgICAgICAgICAvLyBiYWNrc3RvcCBpbiBjYXNlIHRoZSBgX3JlZ2lzdGVyZWRgIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNldCB0aGlzCiAgICAgICAgICBwcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgICB0aGlzLnJvb3QgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICB0aGlzLmNyZWF0ZWQoKTsKICAgICAgICAvLyBFbnN1cmUgbGlzdGVuZXJzIGFyZSBhcHBsaWVkIGltbWVkaWF0ZWx5IHNvIHRoYXQgdGhleSBhcmUKICAgICAgICAvLyBhZGRlZCBiZWZvcmUgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLiBUaGlzIGFsbG93cyBhbiBlbGVtZW50IHRvCiAgICAgICAgLy8gZGVjb3JhdGUgaXRzZWxmIHZpYSBhbiBldmVudCBwcmlvciB0byBhbnkgZGVjbGFyYXRpdmUgbGlzdGVuZXJzCiAgICAgICAgLy8gc2VlaW5nIHRoZSBldmVudC4gTm90ZSwgdGhpcyBlbnN1cmVzIGNvbXBhdGliaWxpdHkgd2l0aCAxLnggb3JkZXJpbmcuCiAgICAgICAgdGhpcy5fYXBwbHlMaXN0ZW5lcnMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gZWxlbWVudCBpcyBpbml0aWFsaXppbmcuCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGNsYXNzIHJlZ2lzdHJhdGlvbiB0aW1lCiAgICAgICAqIHdvcmsuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZW5zdXJlIHRoZSB3b3JrIGlzIHBlcmZvcm1lZAogICAgICAgKiBvbmx5IG9uY2UgZm9yIHRoZSBjbGFzcy4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlZ2lzdGVyZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIGltcGxlbWVudGF0aW9uIHRvCiAgICAgICAqIGFkZCBzdXBwb3J0IGZvciBpbnN0YWxsaW5nIGBob3N0QXR0cmlidXRlc2AgYW5kIGBsaXN0ZW5lcnNgLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIHRoaXMuX2Vuc3VyZUF0dHJpYnV0ZXMoKTsKICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyBhbiBlbGVtZW50IGhhcyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudAogICAgICAgKiBpcyBiZWluZyByZWFkaWVkIHZpYSBgcmVhZHlgLiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdG8gc2V0IHRoZQogICAgICAgKiBlbGVtZW50J3MgcmVxdWlyZWQgYXR0cmlidXRlcy4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBzdXJlCiAgICAgICAqIHRvIGNoZWNrIGFuZCBub3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYXR0cmlidXRlcyBhZGRlZCBieQogICAgICAgKiB0aGUgdXNlciBvZiB0aGUgZWxlbWVudC4gVHlwaWNhbGx5LCBzZXR0aW5nIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxlZnQKICAgICAgICogdG8gdGhlIGVsZW1lbnQgdXNlciBhbmQgbm90IGRvbmUgaGVyZTsgcmVhc29uYWJsZSBleGNlcHRpb25zIGluY2x1ZGUKICAgICAgICogc2V0dGluZyBhcmlhIHJvbGVzIGFuZCBmb2N1c2FiaWxpdHkuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudAogICAgICAgKiBpcyBiZWluZyByZWFkaWVkIHZpYSBgcmVhZHlgLiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdG8KICAgICAgICogYWRkIGFueSByZXF1aXJlZCBlbGVtZW50IGV2ZW50IGxpc3RlbmVycy4KICAgICAgICogSW4gcGVyZm9ybWFuY2UgY3JpdGljYWwgZWxlbWVudHMsIHRoZSB3b3JrIGRvbmUgaGVyZSBzaG91bGQgYmUga2VwdAogICAgICAgKiB0byBhIG1pbmltdW0gc2luY2UgaXQgaXMgZG9uZSBiZWZvcmUgdGhlIGVsZW1lbnQgaXMgcmVuZGVyZWQuIEluCiAgICAgICAqIHRoZXNlIGVsZW1lbnRzLCBjb25zaWRlciBhZGRpbmcgbGlzdGVuZXJzIGFzeW5jaHJvbm91c2x5IHNvIGFzIG5vdCB0bwogICAgICAgKiBibG9jayByZW5kZXIuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hcHBseUxpc3RlbmVycygpIHt9CgogICAgICAvKioKICAgICAgICogQ29udmVydHMgYSB0eXBlZCBKYXZhU2NyaXB0IHZhbHVlIHRvIGEgc3RyaW5nLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGJhY2t3YXJkLWNvbXBhdGlibGUgbGVnYWN5IEFQSQogICAgICAgKiBvbmx5LiAgSXQgaXMgbm90IGRpcmVjdGx5IGNhbGxlZCBieSBhbnkgUG9seW1lciBmZWF0dXJlcy4gVG8gY3VzdG9taXplCiAgICAgICAqIGhvdyBwcm9wZXJ0aWVzIGFyZSBzZXJpYWxpemVkIHRvIGF0dHJpYnV0ZXMgZm9yIGF0dHJpYnV0ZSBiaW5kaW5ncyBhbmQKICAgICAgICogYHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZWAgcHJvcGVydGllcyBhcyB3ZWxsIGFzIHRoaXMgbWV0aG9kLCBvdmVycmlkZQogICAgICAgKiB0aGUgYF9zZXJpYWxpemVWYWx1ZWAgbWV0aG9kIHByb3ZpZGVkIGJ5IGBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBkZXNlcmlhbGl6ZQogICAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFNlcmlhbGl6ZWQgdmFsdWUKICAgICAgICovCiAgICAgIHNlcmlhbGl6ZSh2YWx1ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVWYWx1ZSh2YWx1ZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiAgVG8gY3VzdG9taXplCiAgICAgICAqIGhvdyBhdHRyaWJ1dGVzIGFyZSBkZXNlcmlhbGl6ZWQgdG8gcHJvcGVydGllcyBmb3IgaW4KICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG92ZXJyaWRlIGBfZGVzZXJpYWxpemVWYWx1ZWAgbWV0aG9kCiAgICAgICAqIHByb3ZpZGVkIGJ5IGBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFN0cmluZyB0byBkZXNlcmlhbGl6ZQogICAgICAgKiBAcGFyYW0geyp9IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvCiAgICAgICAqIEByZXR1cm4geyp9IFJldHVybnMgdGhlIGRlc2VyaWFsaXplZCB2YWx1ZSBpbiB0aGUgYHR5cGVgIGdpdmVuLgogICAgICAgKi8KICAgICAgZGVzZXJpYWxpemUodmFsdWUsIHR5cGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXJpYWxpemVzIGEgcHJvcGVydHkgdG8gaXRzIGFzc29jaWF0ZWQgYXR0cmlidXRlLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGJhY2t3YXJkLWNvbXBhdGlibGUgbGVnYWN5IEFQSQogICAgICAgKiBvbmx5LiAgSXQgaXMgbm90IGRpcmVjdGx5IGNhbGxlZCBieSBhbnkgUG9seW1lciBmZWF0dXJlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgUHJvcGVydHkgdmFsdWUgdG8gcmVmbGVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHJlZmxlY3RQcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgdGhpcy5fcHJvcGVydHlUb0F0dHJpYnV0ZShwcm9wZXJ0eSwgYXR0cmlidXRlLCB2YWx1ZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGJhY2t3YXJkLWNvbXBhdGlibGUgbGVnYWN5IEFQSQogICAgICAgKiBvbmx5LiAgSXQgaXMgbm90IGRpcmVjdGx5IGNhbGxlZCBieSBhbnkgUG9seW1lciBmZWF0dXJlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUgdG8gc2VyaWFsaXplIHRvLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgRWxlbWVudCB0byBzZXQgYXR0cmlidXRlIHRvLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VyaWFsaXplVmFsdWVUb0F0dHJpYnV0ZSh2YWx1ZSwgYXR0cmlidXRlLCBub2RlKSB7CiAgICAgICAgdGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUoLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgb3duIHByb3BlcnRpZXMgKGluY2x1ZGluZyBhY2Nlc3NvciBkZXNjcmlwdG9ycykgZnJvbSBhIHNvdXJjZQogICAgICAgKiBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRhcmdldCBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gYXBpIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gcHJvdG90eXBlIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgYXMgZmlyc3QgYXJndW1lbnQuCiAgICAgICAqLwogICAgICBleHRlbmQocHJvdG90eXBlLCBhcGkpIHsKICAgICAgICBpZiAoIShwcm90b3R5cGUgJiYgYXBpKSkgewogICAgICAgICAgcmV0dXJuIHByb3RvdHlwZSB8fCBhcGk7CiAgICAgICAgfQogICAgICAgIGxldCBuJCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFwaSk7CiAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxuJC5sZW5ndGgpICYmIChuPW4kW2ldKTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFwaSwgbik7CiAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgbiwgcGQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvdG90eXBlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29waWVzIHByb3BzIGZyb20gYSBzb3VyY2Ugb2JqZWN0IHRvIGEgdGFyZ2V0IG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBtZXRob2QgdXNlcyBhIHNpbXBsZSBgZm9yLi4uaW5gIHN0cmF0ZWd5IGZvciBlbnVtZXJhdGluZwogICAgICAgKiBwcm9wZXJ0aWVzLiAgVG8gZW5zdXJlIG9ubHkgYG93blByb3BlcnRpZXNgIGFyZSBjb3BpZWQgZnJvbSBzb3VyY2UKICAgICAgICogdG8gdGFyZ2V0IGFuZCB0aGF0IGFjY2Vzc29yIGltcGxlbWVudGF0aW9ucyBhcmUgY29waWVkLCB1c2UgYGV4dGVuZGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gdGFyZ2V0IFRhcmdldCBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IHNvdXJjZSBTb3VyY2Ugb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBUYXJnZXQgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIG1peGluKHRhcmdldCwgc291cmNlKSB7CiAgICAgICAgZm9yIChsZXQgaSBpbiBzb3VyY2UpIHsKICAgICAgICAgIHRhcmdldFtpXSA9IHNvdXJjZVtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgdGhlIHByb3RvdHlwZSBvZiBhbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3Qgb24gd2hpY2ggdG8gc2V0IHRoZSBwcm90b3R5cGUuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIHByb3RvdHlwZSB0aGF0IHdpbGwgYmUgc2V0IG9uIHRoZSBnaXZlbgogICAgICAgKiBgb2JqZWN0YC4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIHRoZSBnaXZlbiBgb2JqZWN0YCB3aXRoIGl0cyBwcm90b3R5cGUgc2V0CiAgICAgICAqIHRvIHRoZSBnaXZlbiBgcHJvdG90eXBlYCBvYmplY3QuCiAgICAgICAqLwogICAgICBjaGFpbk9iamVjdChvYmplY3QsIHByb3RvdHlwZSkgewogICAgICAgIGlmIChvYmplY3QgJiYgcHJvdG90eXBlICYmIG9iamVjdCAhPT0gcHJvdG90eXBlKSB7CiAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICB9CgogICAgICAvKiAqKioqIEJlZ2luIFRlbXBsYXRlICoqKiogKi8KCiAgICAgIC8qKgogICAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBjb250ZW50YCBvZiB0aGUgYHRlbXBsYXRlYCBzcGVjaWZpZWQgYW5kCiAgICAgICAqIHJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudCBjb250YWluaW5nIHRoZSBpbXBvcnRlZCBjb250ZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIEhUTUwgdGVtcGxhdGUgZWxlbWVudCB0byBpbnN0YW5jZS4KICAgICAgICogQHJldHVybiB7IURvY3VtZW50RnJhZ21lbnR9IERvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkCiAgICAgICAqICAgdGVtcGxhdGUgY29udGVudC4KICAgICAgKi8KICAgICAgaW5zdGFuY2VUZW1wbGF0ZSh0ZW1wbGF0ZSkgewogICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5jb25zdHJ1Y3Rvci5fY29udGVudEZvclRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBsZXQgZG9tID0gLyoqIEB0eXBlIHshRG9jdW1lbnRGcmFnbWVudH0gKi8KICAgICAgICAgIChkb2N1bWVudC5pbXBvcnROb2RlKGNvbnRlbnQsIHRydWUpKTsKICAgICAgICByZXR1cm4gZG9tOwogICAgICB9CgogICAgICAvKiAqKioqIEJlZ2luIEV2ZW50cyAqKioqICovCgoKCiAgICAgIC8qKgogICAgICAgKiBEaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggYW4gb3B0aW9uYWwgZGV0YWlsIHZhbHVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBOYW1lIG9mIGV2ZW50IHR5cGUuCiAgICAgICAqIEBwYXJhbSB7Kj19IGRldGFpbCBEZXRhaWwgdmFsdWUgY29udGFpbmluZyBldmVudC1zcGVjaWZpYwogICAgICAgKiAgIHBheWxvYWQuCiAgICAgICAqIEBwYXJhbSB7eyBidWJibGVzOiAoYm9vbGVhbnx1bmRlZmluZWQpLCBjYW5jZWxhYmxlOiAoYm9vbGVhbnx1bmRlZmluZWQpLCBjb21wb3NlZDogKGJvb2xlYW58dW5kZWZpbmVkKSB9PX0KICAgICAgICogIG9wdGlvbnMgT2JqZWN0IHNwZWNpZnlpbmcgb3B0aW9ucy4gIFRoZXNlIG1heSBpbmNsdWRlOgogICAgICAgKiAgYGJ1YmJsZXNgIChib29sZWFuLCBkZWZhdWx0cyB0byBgdHJ1ZWApLAogICAgICAgKiAgYGNhbmNlbGFibGVgIChib29sZWFuLCBkZWZhdWx0cyB0byBmYWxzZSksIGFuZAogICAgICAgKiAgYG5vZGVgIG9uIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50IChIVE1MRWxlbWVudCwgZGVmYXVsdHMgdG8gYHRoaXNgKS4KICAgICAgICogQHJldHVybiB7IUV2ZW50fSBUaGUgbmV3IGV2ZW50IHRoYXQgd2FzIGZpcmVkLgogICAgICAgKi8KICAgICAgZmlyZSh0eXBlLCBkZXRhaWwsIG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICBkZXRhaWwgPSAoZGV0YWlsID09PSBudWxsIHx8IGRldGFpbCA9PT0gdW5kZWZpbmVkKSA/IHt9IDogZGV0YWlsOwogICAgICAgIGxldCBldmVudCA9IG5ldyBFdmVudCh0eXBlLCB7CiAgICAgICAgICBidWJibGVzOiBvcHRpb25zLmJ1YmJsZXMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBvcHRpb25zLmJ1YmJsZXMsCiAgICAgICAgICBjYW5jZWxhYmxlOiBCb29sZWFuKG9wdGlvbnMuY2FuY2VsYWJsZSksCiAgICAgICAgICBjb21wb3NlZDogb3B0aW9ucy5jb21wb3NlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZTogb3B0aW9ucy5jb21wb3NlZAogICAgICAgIH0pOwogICAgICAgIGV2ZW50LmRldGFpbCA9IGRldGFpbDsKICAgICAgICBsZXQgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCB0aGlzOwogICAgICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCBhbiBldmVudCBsaXN0ZW5lciBvbiBhIGdpdmVuIGVsZW1lbnQsCiAgICAgICAqIGxhdGUgYm91bmQgdG8gYSBuYW1lZCBtZXRob2Qgb24gdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgRWxlbWVudCB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBOYW1lIG9mIGhhbmRsZXIgbWV0aG9kIG9uIGB0aGlzYCB0byBjYWxsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgbGlzdGVuKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSkgewogICAgICAgIG5vZGUgPSAvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBsZXQgaGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzIHx8CiAgICAgICAgICAodGhpcy5fX2JvdW5kTGlzdGVuZXJzID0gbmV3IFdlYWtNYXAoKSk7CiAgICAgICAgbGV0IGJsID0gaGJsLmdldChub2RlKTsKICAgICAgICBpZiAoIWJsKSB7CiAgICAgICAgICBibCA9IHt9OwogICAgICAgICAgaGJsLnNldChub2RlLCBibCk7CiAgICAgICAgfQogICAgICAgIGxldCBrZXkgPSBldmVudE5hbWUgKyBtZXRob2ROYW1lOwogICAgICAgIGlmICghYmxba2V5XSkgewogICAgICAgICAgYmxba2V5XSA9IHRoaXMuX2FkZE1ldGhvZEV2ZW50TGlzdGVuZXJUb05vZGUoCiAgICAgICAgICAgIG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgdGhpcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIG5vdCBjYWxsCiAgICAgICBhbnltb3JlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdW5saXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBibCA9IHRoaXMuX19ib3VuZExpc3RlbmVycyAmJiB0aGlzLl9fYm91bmRMaXN0ZW5lcnMuZ2V0KG5vZGUpOwogICAgICAgIGxldCBrZXkgPSBldmVudE5hbWUgKyBtZXRob2ROYW1lOwogICAgICAgIGxldCBoYW5kbGVyID0gYmwgJiYgYmxba2V5XTsKICAgICAgICBpZiAoaGFuZGxlcikgewogICAgICAgICAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgICBibFtrZXldID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBzY3JvbGxpbmcgYmVoYXZpb3IgdG8gYWxsIGRpcmVjdGlvbiwgb25lIGRpcmVjdGlvbiwgb3Igbm9uZS4KICAgICAgICoKICAgICAgICogVmFsaWQgc2Nyb2xsIGRpcmVjdGlvbnM6CiAgICAgICAqICAgLSAnYWxsJzogc2Nyb2xsIGluIGFueSBkaXJlY3Rpb24KICAgICAgICogICAtICd4Jzogc2Nyb2xsIG9ubHkgaW4gdGhlICd4JyBkaXJlY3Rpb24KICAgICAgICogICAtICd5Jzogc2Nyb2xsIG9ubHkgaW4gdGhlICd5JyBkaXJlY3Rpb24KICAgICAgICogICAtICdub25lJzogZGlzYWJsZSBzY3JvbGxpbmcgZm9yIHRoaXMgbm9kZQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gYWxsb3cgc2Nyb2xsaW5nCiAgICAgICAqIERlZmF1bHRzIHRvIGBhbGxgLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gYXBwbHkgc2Nyb2xsIGRpcmVjdGlvbiBzZXR0aW5nLgogICAgICAgKiBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXRTY3JvbGxEaXJlY3Rpb24oZGlyZWN0aW9uLCBub2RlKSB7CiAgICAgICAgUG9seW1lci5HZXN0dXJlcy5zZXRUb3VjaEFjdGlvbigvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCBESVJFQ1RJT05fTUFQW2RpcmVjdGlvbl0gfHwgJ2F1dG8nKTsKICAgICAgfQogICAgICAvKiAqKioqIEVuZCBFdmVudHMgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBydW4gYHF1ZXJ5U2VsZWN0b3JgIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlLgogICAgICAgKgogICAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGBQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3Ioc2xjdHIpYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNsY3RyIFNlbGVjdG9yIHRvIHJ1biBvbiB0aGlzIGxvY2FsIERPTSBzY29wZQogICAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBFbGVtZW50IGZvdW5kIGJ5IHRoZSBzZWxlY3Rvciwgb3IgbnVsbCBpZiBub3QgZm91bmQuCiAgICAgICAqLwogICAgICAkJChzbGN0cikgewogICAgICAgIHJldHVybiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0cik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgd2hvc2UgbG9jYWwgZG9tIHdpdGhpbiB3aGljaCB0aGlzIGVsZW1lbnQKICAgICAgICogaXMgY29udGFpbmVkLiBUaGlzIGlzIGEgc2hvcnRoYW5kIGZvcgogICAgICAgKiBgdGhpcy5nZXRSb290Tm9kZSgpLmhvc3RgLgogICAgICAgKiBAdGhpcyB7RWxlbWVudH0KICAgICAgICovCiAgICAgIGdldCBkb21Ib3N0KCkgewogICAgICAgIGxldCByb290ID0gdGhpcy5nZXRSb290Tm9kZSgpOwogICAgICAgIHJldHVybiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpID8gLyoqIEB0eXBlIHtTaGFkb3dSb290fSAqLyAocm9vdCkuaG9zdCA6IHJvb3Q7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3JjZSB0aGlzIGVsZW1lbnQgdG8gZGlzdHJpYnV0ZSBpdHMgY2hpbGRyZW4gdG8gaXRzIGxvY2FsIGRvbS4KICAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBhcyBvZiBQb2x5bWVyIDIuMC4yIGFuZCBpcyBwcm92aWRlZCBvbmx5CiAgICAgICAqIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGRpc3RyaWJ1dGVDb250ZW50KCkgewogICAgICAgIGlmICh3aW5kb3cuU2hhZHlET00gJiYgdGhpcy5zaGFkb3dSb290KSB7CiAgICAgICAgICBTaGFkeURPTS5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG5vZGVzIHRoYXQgYXJlIHRoZSBlZmZlY3RpdmUgY2hpbGROb2Rlcy4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZE5vZGVzIGxpc3QgaXMgdGhlIHNhbWUgYXMgdGhlIGVsZW1lbnQncyBjaGlsZE5vZGVzIGV4Y2VwdCB0aGF0CiAgICAgICAqIGFueSBgPGNvbnRlbnQ+YCBlbGVtZW50cyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZAogICAgICAgKiB0byB0aGUgYDxjb250ZW50PmAsIHRoZSByZXN1bHQgb2YgaXRzIGBnZXREaXN0cmlidXRlZE5vZGVzYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZWZmZWN0aXZlIGNoaWxkIG5vZGVzLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpIHsKICAgICAgICBjb25zdCB0aGlzRWwgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovICh0aGlzKTsKICAgICAgICBjb25zdCBkb21BcGkgPSAvKiogQHR5cGUge1BvbHltZXIuRG9tQXBpfSAqLyhQb2x5bWVyLmRvbSh0aGlzRWwpKTsKICAgICAgICByZXR1cm4gZG9tQXBpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkIHdpdGhpbiB0aGlzIGVsZW1lbnQgdGhhdCBtYXRjaAogICAgICAgKiBgc2VsZWN0b3JgLiBUaGVzZSBjYW4gYmUgZG9tIGNoaWxkcmVuIG9yIGVsZW1lbnRzIGRpc3RyaWJ1dGVkIHRvCiAgICAgICAqIGNoaWxkcmVuIHRoYXQgYXJlIGluc2VydGlvbiBwb2ludHMuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBydW4uCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgZWxlbWVudHMgdGhhdCBtYXRjaCBzZWxlY3Rvci4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHRoZSBlZmZlY3RpdmUgY2hpbGRyZW4uIFRoZSBlZmZlY3RpdmUKICAgICAgICogY2hpbGRyZW4gbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkcmVuIGV4Y2VwdCB0aGF0CiAgICAgICAqIGFueSBgPGNvbnRlbnQ+YCBlbGVtZW50cyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgbGlzdCBvZiBlbGVtZW50cwogICAgICAgKiBkaXN0cmlidXRlZCB0byB0aGUgYDxjb250ZW50PmAuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZWZmZWN0aXZlIGNoaWxkcmVuLgogICAgICAgKi8KICAgICAgZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKSB7CiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgICByZXR1cm4gbGlzdC5maWx0ZXIoZnVuY3Rpb24oLyoqIEB0eXBlIHshTm9kZX0gKi8gbikgewogICAgICAgICAgcmV0dXJuIChuLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIHRleHQgY29udGVudCB0aGF0IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZQogICAgICAgKiB0ZXh0IGNvbnRlbnQncyBvZiB0aGUgZWxlbWVudCdzIGVmZmVjdGl2ZSBjaGlsZE5vZGVzICh0aGUgZWxlbWVudHMKICAgICAgICogcmV0dXJuZWQgYnkgPGEgaHJlZj0iI2dldEVmZmVjdGl2ZUNoaWxkTm9kZXM+Z2V0RWZmZWN0aXZlQ2hpbGROb2RlczwvYT4uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVUZXh0Q29udGVudCgpIHsKICAgICAgICBsZXQgY24gPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgICBsZXQgdGMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTAsIGM7IChjID0gY25baV0pOyBpKyspIHsKICAgICAgICAgIGlmIChjLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewogICAgICAgICAgICB0Yy5wdXNoKGMudGV4dENvbnRlbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGMuam9pbignJyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlZmZlY3RpdmUgY2hpbGROb2RlIHdpdGhpbiB0aGlzIGVsZW1lbnQgdGhhdAogICAgICAgKiBtYXRjaCBgc2VsZWN0b3JgLiBUaGVzZSBjYW4gYmUgZG9tIGNoaWxkIG5vZGVzIG9yIGVsZW1lbnRzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIGNoaWxkcmVuIHRoYXQgYXJlIGluc2VydGlvbiBwb2ludHMuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBydW4uCiAgICAgICAqIEByZXR1cm4ge05vZGV9IEZpcnN0IGVmZmVjdGl2ZSBjaGlsZCBub2RlIHRoYXQgbWF0Y2hlcyBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIHF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oc2VsZWN0b3IpIHsKICAgICAgICBsZXQgZSQgPSB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgICAgcmV0dXJuIGUkICYmIGUkWzBdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWZmZWN0aXZlIGNoaWxkTm9kZXMgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMgdGhhdCBtYXRjaCBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIHF1ZXJ5QWxsRWZmZWN0aXZlQ2hpbGRyZW4oc2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gdGhpcy5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgdG8gdGhpcyBlbGVtZW50J3MgYDxzbG90PmAuCiAgICAgICAqCiAgICAgICAqIElmIHRoaXMgZWxlbWVudCBjb250YWlucyBtb3JlIHRoYW4gb25lIGA8c2xvdD5gIGluIGl0cyBsb2NhbCBET00sCiAgICAgICAqIGFuIG9wdGlvbmFsIHNlbGVjdG9yIG1heSBiZSBwYXNzZWQgdG8gY2hvb3NlIHRoZSBkZXNpcmVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8c2xvdD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGRpc3RyaWJ1dGVkIG5vZGVzIGZvciB0aGUgYDxzbG90PmAuCiAgICAgICAqLwogICAgICBnZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikgewogICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3Ioc2xjdHIgfHwgJ3Nsb3QnKTsKICAgICAgICByZXR1cm4gY29udGVudCA/IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKGNvbnRlbnQpKS5nZXREaXN0cmlidXRlZE5vZGVzKCkgOiBbXTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGVsZW1lbnQgY2hpbGRyZW4gZGlzdHJpYnV0ZWQgdG8gdGhpcyBlbGVtZW50J3MKICAgICAgICogYDxzbG90PmAuCiAgICAgICAqCiAgICAgICAqIElmIHRoaXMgZWxlbWVudCBjb250YWlucyBtb3JlIHRoYW4gb25lIGA8c2xvdD5gIGluIGl0cwogICAgICAgKiBsb2NhbCBET00sIGFuIG9wdGlvbmFsIHNlbGVjdG9yIG1heSBiZSBwYXNzZWQgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqIGNvbnRlbnQuICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gYGdldENvbnRlbnRDaGlsZE5vZGVzYCBpbiB0aGF0IG9ubHkKICAgICAgICogZWxlbWVudHMgYXJlIHJldHVybmVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNsY3RyIENTUyBzZWxlY3RvciB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogICBgPGNvbnRlbnQ+YC4gIERlZmF1bHRzIHRvIGBjb250ZW50YC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZQogICAgICAgKiAgIGA8c2xvdD5gLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZHJlbihzbGN0cikgewogICAgICAgIGxldCBjaGlsZHJlbiA9IC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MRWxlbWVudD59ICovKHRoaXMuZ2V0Q29udGVudENoaWxkTm9kZXMoc2xjdHIpLmZpbHRlcihmdW5jdGlvbihuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHs/Tm9kZX0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbGlnaHQgRE9NIHRyZWUuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBpc0xpZ2h0RGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgY29uc3QgdGhpc05vZGUgPSAvKiogQHR5cGUge05vZGV9ICovICh0aGlzKTsKICAgICAgICByZXR1cm4gdGhpc05vZGUgIT09IG5vZGUgJiYgdGhpc05vZGUuY29udGFpbnMobm9kZSkgJiYKICAgICAgICAgIHRoaXNOb2RlLmdldFJvb3ROb2RlKCkgPT09IG5vZGUuZ2V0Um9vdE5vZGUoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENoZWNrcyB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgVGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBub2RlIGlzIGluIHRoaXMgZWxlbWVudCdzIGxvY2FsIERPTSB0cmVlLgogICAgICAgKi8KICAgICAgaXNMb2NhbERlc2NlbmRhbnQobm9kZSkgewogICAgICAgIHJldHVybiB0aGlzLnJvb3QgPT09IG5vZGUuZ2V0Um9vdE5vZGUoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vLW9wIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhpcyBzaG91bGQgbm93IGJlIGhhbmRsZWQgYnkKICAgICAgICogU2hhZHlDc3MgbGlicmFyeS4KICAgICAgICogQHBhcmFtICB7Kn0gY29udGFpbmVyIFVudXNlZAogICAgICAgKiBAcGFyYW0gIHsqfSBzaG91bGRPYnNlcnZlIFVudXNlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2NvcGVTdWJ0cmVlKGNvbnRhaW5lciwgc2hvdWxkT2JzZXJ2ZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBjb21wdXRlZCBzdHlsZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgVGhlIGNzcyBwcm9wZXJ0eSBuYW1lLgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbXB1dGVkIGNzcyBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGdpdmVuCiAgICAgICAqIGBwcm9wZXJ0eWAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRDb21wdXRlZFN0eWxlVmFsdWUocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gc3R5bGVJbnRlcmZhY2UuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovKHRoaXMpLCBwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8vIGRlYm91bmNlCgogICAgICAvKioKICAgICAgICogQ2FsbCBgZGVib3VuY2VgIHRvIGNvbGxhcHNlIG11bHRpcGxlIHJlcXVlc3RzIGZvciBhIG5hbWVkIHRhc2sgaW50bwogICAgICAgKiBvbmUgaW52b2NhdGlvbiB3aGljaCBpcyBtYWRlIGFmdGVyIHRoZSB3YWl0IHRpbWUgaGFzIGVsYXBzZWQgd2l0aAogICAgICAgKiBubyBuZXcgcmVxdWVzdC4gIElmIG5vIHdhaXQgdGltZSBpcyBnaXZlbiwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCiAgICAgICAqIGF0IG1pY3JvdGFzayB0aW1pbmcgKGd1YXJhbnRlZWQgYmVmb3JlIHBhaW50KS4KICAgICAgICoKICAgICAgICogICAgIGRlYm91bmNlZENsaWNrQWN0aW9uKGUpIHsKICAgICAgICogICAgICAgLy8gd2lsbCBub3QgY2FsbCBgcHJvY2Vzc0NsaWNrYCBtb3JlIHRoYW4gb25jZSBwZXIgMTAwbXMKICAgICAgICogICAgICAgdGhpcy5kZWJvdW5jZSgnY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICogICAgICAgIHRoaXMucHJvY2Vzc0NsaWNrKCk7CiAgICAgICAqICAgICAgIH0gMTAwKTsKICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgU3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBkZWJvdW5jZSBqb2IuCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCAod2l0aCBgdGhpc2AKICAgICAgICogICBjb250ZXh0KSB3aGVuIHRoZSB3YWl0IHRpbWUgZWxhcHNlcy4KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgT3B0aW9uYWwgd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyAobXMpIGFmdGVyIHRoZQogICAgICAgKiAgIGxhc3Qgc2lnbmFsIHRoYXQgbXVzdCBlbGFwc2UgYmVmb3JlIGludm9raW5nIGBjYWxsYmFja2AKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGRlYm91bmNlciBvYmplY3Qgb24gd2hpY2ggZXhpc3RzIHRoZQogICAgICAgKiBmb2xsb3dpbmcgbWV0aG9kczogYGlzQWN0aXZlKClgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzCiAgICAgICAqIGFjdGl2ZTsgYGNhbmNlbCgpYCBjYW5jZWxzIHRoZSBkZWJvdW5jZXIgaWYgaXQgaXMgYWN0aXZlOwogICAgICAgKiBgZmx1c2goKWAgaW1tZWRpYXRlbHkgaW52b2tlcyB0aGUgZGVib3VuY2VkIGNhbGxiYWNrIGlmIHRoZSBkZWJvdW5jZXIKICAgICAgICogaXMgYWN0aXZlLgogICAgICAgKi8KICAgICAgZGVib3VuY2Uoam9iTmFtZSwgY2FsbGJhY2ssIHdhaXQpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICByZXR1cm4gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXSA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlcnNbam9iTmFtZV0KICAgICAgICAgICAgLCB3YWl0ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcih3YWl0KSA6IFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAgICwgY2FsbGJhY2suYmluZCh0aGlzKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuYW1lZCBkZWJvdW5jZXIgaXMgYWN0aXZlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBUaGUgbmFtZSBvZiB0aGUgZGVib3VuY2VyIHN0YXJ0ZWQgd2l0aCBgZGVib3VuY2VgCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGRlYm91bmNlciBpcyBhY3RpdmUgKGhhcyBub3QgeWV0IGZpcmVkKS4KICAgICAgICovCiAgICAgIGlzRGVib3VuY2VyQWN0aXZlKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICByZXR1cm4gISEoZGVib3VuY2VyICYmIGRlYm91bmNlci5pc0FjdGl2ZSgpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltbWVkaWF0ZWx5IGNhbGxzIHRoZSBkZWJvdW5jZXIgYGNhbGxiYWNrYCBhbmQgaW5hY3RpdmF0ZXMgaXQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZsdXNoRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuZmx1c2goKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGFuIGFjdGl2ZSBkZWJvdW5jZXIuICBUaGUgYGNhbGxiYWNrYCB3aWxsIG5vdCBiZSBjYWxsZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNhbmNlbERlYm91bmNlcihqb2JOYW1lKSB7CiAgICAgICAgdGhpcy5fZGVib3VuY2VycyA9IHRoaXMuX2RlYm91bmNlcnMgfHwge307CiAgICAgICAgbGV0IGRlYm91bmNlciA9IHRoaXMuX2RlYm91bmNlcnNbam9iTmFtZV07CiAgICAgICAgaWYgKGRlYm91bmNlcikgewogICAgICAgICAgZGVib3VuY2VyLmNhbmNlbCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJ1bnMgYSBjYWxsYmFjayBmdW5jdGlvbiBhc3luY2hyb25vdXNseS4KICAgICAgICoKICAgICAgICogQnkgZGVmYXVsdCAoaWYgbm8gd2FpdFRpbWUgaXMgc3BlY2lmaWVkKSwgYXN5bmMgY2FsbGJhY2tzIGFyZSBydW4gYXQKICAgICAgICogbWljcm90YXNrIHRpbWluZywgd2hpY2ggd2lsbCBvY2N1ciBiZWZvcmUgcGFpbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcnVuLCBib3VuZCB0byBgdGhpc2AuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gd2FpdFRpbWUgVGltZSB0byB3YWl0IGJlZm9yZSBjYWxsaW5nIHRoZQogICAgICAgKiAgIGBjYWxsYmFja2AuICBJZiB1bnNwZWNpZmllZCBvciAwLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBydW4gYXQgbWljcm90YXNrCiAgICAgICAqICAgdGltaW5nIChiZWZvcmUgcGFpbnQpLgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB0aGF0IG1heSBiZSB1c2VkIHRvIGNhbmNlbCB0aGUgYXN5bmMgam9iLgogICAgICAgKi8KICAgICAgYXN5bmMoY2FsbGJhY2ssIHdhaXRUaW1lKSB7CiAgICAgICAgcmV0dXJuIHdhaXRUaW1lID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5ydW4oY2FsbGJhY2suYmluZCh0aGlzKSwgd2FpdFRpbWUpIDoKICAgICAgICAgICAgflBvbHltZXIuQXN5bmMubWljcm9UYXNrLnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYXN5bmMgb3BlcmF0aW9uIHN0YXJ0ZWQgd2l0aCBgYXN5bmNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIG9yaWdpbmFsIGBhc3luY2AgY2FsbCB0bwogICAgICAgKiAgIGNhbmNlbC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNhbmNlbEFzeW5jKGhhbmRsZSkgewogICAgICAgIGhhbmRsZSA8IDAgPyBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzay5jYW5jZWwofmhhbmRsZSkgOgogICAgICAgICAgICBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuY2FuY2VsKGhhbmRsZSk7CiAgICAgIH0KCiAgICAgIC8vIG90aGVyCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBlbGVtZW50IGFuZCBjb25maWd1cmluZyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBIVE1MIGVsZW1lbnQgdGFnIHRvIGNyZWF0ZS4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydGllcyB0byBjb25maWd1cmUgb24gdGhlCiAgICAgICAqICAgIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRWxlbWVudH0gTmV3bHkgY3JlYXRlZCBhbmQgY29uZmlndXJlZCBlbGVtZW50LgogICAgICAgKi8KICAgICAgY3JlYXRlKHRhZywgcHJvcHMpIHsKICAgICAgICBsZXQgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgICAgIGlmIChwcm9wcykgewogICAgICAgICAgaWYgKGVsdC5zZXRQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgIGVsdC5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAobGV0IG4gaW4gcHJvcHMpIHsKICAgICAgICAgICAgICBlbHRbbl0gPSBwcm9wc1tuXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZWx0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgYDxsaW5rIHJlbD0iaW1wb3J0Ij5gIGVsZW1lbnQgd2l0aAogICAgICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAgICAgKiBJbiB0aGUgYG9ubG9hZGAgY2FsbGJhY2ssIHRoZSBgaW1wb3J0YCBwcm9wZXJ0eSBvZiB0aGUgYGxpbmtgCiAgICAgICAqIGVsZW1lbnQgd2lsbCBjb250YWluIHRoZSBpbXBvcnRlZCBkb2N1bWVudCBjb250ZW50cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGhyZWYgVVJMIHRvIGRvY3VtZW50IHRvIGxvYWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICAgICAqICAgbG9hZGVkLgogICAgICAgKiBAcGFyYW0gez9mdW5jdGlvbighRXJyb3JFdmVudCk6dm9pZD19IG9uZXJyb3IgQ2FsbGJhY2sgdG8gbm90aWZ5IHdoZW4gYW4gaW1wb3J0CiAgICAgICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRBc3luYyBUcnVlIGlmIHRoZSBpbXBvcnQgc2hvdWxkIGJlIGxvYWRlZCBgYXN5bmNgLgogICAgICAgKiAgIERlZmF1bHRzIHRvIGBmYWxzZWAuCiAgICAgICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAgICAgKi8KICAgICAgaW1wb3J0SHJlZihocmVmLCBvbmxvYWQsIG9uZXJyb3IsIG9wdEFzeW5jKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICBsZXQgbG9hZEZuID0gb25sb2FkID8gb25sb2FkLmJpbmQodGhpcykgOiBudWxsOwogICAgICAgIGxldCBlcnJvckZuID0gb25lcnJvciA/IG9uZXJyb3IuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuaW1wb3J0SHJlZihocmVmLCBsb2FkRm4sIGVycm9yRm4sIG9wdEFzeW5jKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBvbHlmaWxsIGZvciBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzLCB3aGljaCBpcyBzb21ldGltZXMgc3RpbGwKICAgICAgICogcHJlZml4ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byB0ZXN0LgogICAgICAgKiBAcGFyYW0geyFFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIHRlc3QgdGhlIHNlbGVjdG9yIGFnYWluc3QuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuCiAgICAgICAqLwogICAgICBlbGVtZW50TWF0Y2hlcyhzZWxlY3Rvciwgbm9kZSkgewogICAgICAgIHJldHVybiBQb2x5bWVyLmRvbS5tYXRjaGVzU2VsZWN0b3IoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIHNlbGVjdG9yKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRvZ2dsZXMgYW4gSFRNTCBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBIVE1MIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgYXR0cmlidXRlIG9uIG9yIG9mZi4KICAgICAgICogICAgV2hlbiB1bnNwZWNpZmllZCwgdGhlIHN0YXRlIG9mIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZXZlcnNlZC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBOb2RlIHRvIHRhcmdldC4gIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRvZ2dsZUF0dHJpYnV0ZShuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsICcnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgfQogICAgICB9CgoKICAgICAgLyoqCiAgICAgICAqIFRvZ2dsZXMgYSBDU1MgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDU1MgY2xhc3MgbmFtZQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBib29sIEJvb2xlYW4gdG8gZm9yY2UgdGhlIGNsYXNzIG9uIG9yIG9mZi4KICAgICAgICogICAgV2hlbiB1bnNwZWNpZmllZCwgdGhlIHN0YXRlIG9mIHRoZSBjbGFzcyB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQ2xhc3MobmFtZSwgYm9vbCwgbm9kZSkgewogICAgICAgIG5vZGUgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIGJvb2wgPSAhbm9kZS5jbGFzc0xpc3QuY29udGFpbnMobmFtZSk7CiAgICAgICAgfQogICAgICAgIGlmIChib29sKSB7CiAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQobmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcm9zcy1wbGF0Zm9ybSBoZWxwZXIgZm9yIHNldHRpbmcgYW4gZWxlbWVudCdzIENTUyBgdHJhbnNmb3JtYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zZm9ybVRleHQgVHJhbnNmb3JtIHNldHRpbmcuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSB0aGUgdHJhbnNmb3JtIHRvLgogICAgICAgKiBEZWZhdWx0cyB0byBgdGhpc2AKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm1UZXh0LCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbm9kZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtVGV4dDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2xhdGUzZGAKICAgICAgICogcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFggb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geSBZIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHogWiBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSB0aGUgdHJhbnNmb3JtIHRvLgogICAgICAgKiBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0cmFuc2xhdGUzZCh4LCB5LCB6LCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgdGhpcy50cmFuc2Zvcm0oJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJywnICsgeSArICcsJyArIHogKyAnKScsIG5vZGUpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gYW4gYXJyYXksIGlmIGl0IGV4aXN0cy4KICAgICAgICoKICAgICAgICogSWYgdGhlIGFycmF5IGlzIHNwZWNpZmllZCBieSBwYXRoLCBhIGNoYW5nZSBub3RpZmljYXRpb24gaXMKICAgICAgICogZ2VuZXJhdGVkLCBzbyB0aGF0IG9ic2VydmVycywgZGF0YSBiaW5kaW5ncyBhbmQgY29tcHV0ZWQKICAgICAgICogcHJvcGVydGllcyB3YXRjaGluZyB0aGF0IHBhdGggY2FuIHVwZGF0ZS4KICAgICAgICoKICAgICAgICogSWYgdGhlIGFycmF5IGlzIHBhc3NlZCBkaXJlY3RseSwgKipubyBjaGFuZ2UKICAgICAgICogbm90aWZpY2F0aW9uIGlzIGdlbmVyYXRlZCoqLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gYXJyYXlPclBhdGggUGF0aCB0byBhcnJheSBmcm9tIHdoaWNoIHRvIHJlbW92ZSB0aGUgaXRlbQogICAgICAgKiAgIChvciB0aGUgYXJyYXkgaXRzZWxmKS4KICAgICAgICogQHBhcmFtIHsqfSBpdGVtIEl0ZW0gdG8gcmVtb3ZlLgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgY29udGFpbmluZyBpdGVtIHJlbW92ZWQuCiAgICAgICAqLwogICAgICBhcnJheURlbGV0ZShhcnJheU9yUGF0aCwgaXRlbSkgewogICAgICAgIGxldCBpbmRleDsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheU9yUGF0aCkpIHsKICAgICAgICAgIGluZGV4ID0gYXJyYXlPclBhdGguaW5kZXhPZihpdGVtKTsKICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheU9yUGF0aC5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZXQgYXJyID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBhcnJheU9yUGF0aCk7CiAgICAgICAgICBpbmRleCA9IGFyci5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKGFycmF5T3JQYXRoLCBpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICAvLyBsb2dnaW5nCgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5sb2dgL2B3YXJuYC9gZXJyb3JgIGFzIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWwgT25lIG9mICdsb2cnLCAnd2FybicsICdlcnJvcicKICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfbG9nZ2VyKGxldmVsLCBhcmdzKSB7CiAgICAgICAgLy8gYWNjZXB0IFsnZm9vJywgJ2JhciddIGFuZCBbWydmb28nLCAnYmFyJ11dCiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncykgJiYgYXJncy5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcmdzWzBdKSkgewogICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgfQogICAgICAgIHN3aXRjaChsZXZlbCkgewogICAgICAgICAgY2FzZSAnbG9nJzoKICAgICAgICAgIGNhc2UgJ3dhcm4nOgogICAgICAgICAgY2FzZSAnZXJyb3InOgogICAgICAgICAgICBjb25zb2xlW2xldmVsXSguLi5hcmdzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfbG9nKC4uLmFyZ3MpIHsKICAgICAgICB0aGlzLl9sb2dnZXIoJ2xvZycsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS53YXJuYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF93YXJuKC4uLmFyZ3MpIHsKICAgICAgICB0aGlzLl9sb2dnZXIoJ3dhcm4nLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUuZXJyb3JgIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vycm9yKC4uLmFyZ3MpIHsKICAgICAgICB0aGlzLl9sb2dnZXIoJ2Vycm9yJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3JtYXRzIGEgbWVzc2FnZSB1c2luZyB0aGUgZWxlbWVudCB0eXBlIGFuIGEgbWV0aG9kIG5hbWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIG1lc3NhZ2UKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7QXJyYXl9IEFycmF5IHdpdGggZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBmb3IgYGNvbnNvbGVgCiAgICAgICAqICAgbG9nZ2luZy4KICAgICAgICovCiAgICAgIF9sb2dmKG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gWydbJXM6OiVzXScsIHRoaXMuaXMsIG1ldGhvZE5hbWUsIC4uLmFyZ3NdOwogICAgICB9CgogICAgfQoKICAgIExlZ2FjeUVsZW1lbnQucHJvdG90eXBlLmlzID0gJyc7CgogICAgcmV0dXJuIExlZ2FjeUVsZW1lbnQ7CgogIH0pOwoKfSkoKTsKPC9zY3JpcHQ+PHNjcmlwdD4KCiAgKGZ1bmN0aW9uKCkgewoKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zdCBsaWZlY3ljbGVQcm9wcyA9IHsKICAgICAgYXR0YWNoZWQ6IHRydWUsCiAgICAgIGRldGFjaGVkOiB0cnVlLAogICAgICByZWFkeTogdHJ1ZSwKICAgICAgY3JlYXRlZDogdHJ1ZSwKICAgICAgYmVmb3JlUmVnaXN0ZXI6IHRydWUsCiAgICAgIHJlZ2lzdGVyZWQ6IHRydWUsCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWQ6IHRydWUsCiAgICAgIGxpc3RlbmVyczogdHJ1ZSwKICAgICAgaG9zdEF0dHJpYnV0ZXM6IHRydWUKICAgIH07CgogICAgY29uc3QgZXhjbHVkZU9uSW5mbyA9IHsKICAgICAgYXR0YWNoZWQ6IHRydWUsCiAgICAgIGRldGFjaGVkOiB0cnVlLAogICAgICByZWFkeTogdHJ1ZSwKICAgICAgY3JlYXRlZDogdHJ1ZSwKICAgICAgYmVmb3JlUmVnaXN0ZXI6IHRydWUsCiAgICAgIHJlZ2lzdGVyZWQ6IHRydWUsCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWQ6IHRydWUsCiAgICAgIGJlaGF2aW9yczogdHJ1ZSwKICAgICAgX25vQWNjZXNzb3JzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkJlaGF2aW9ycyA9IE9iamVjdC5hc3NpZ24oewogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlLAogICAgICBwcm9wZXJ0aWVzOiB0cnVlLAogICAgICBvYnNlcnZlcnM6IHRydWUsCiAgICB9LCBleGNsdWRlT25JbmZvKTsKCiAgICBmdW5jdGlvbiBjb3B5UHJvcGVydGllcyhzb3VyY2UsIHRhcmdldCwgZXhjbHVkZVByb3BzKSB7CiAgICAgIGNvbnN0IG5vQWNjZXNzb3JzID0gc291cmNlLl9ub0FjY2Vzc29yczsKICAgICAgZm9yIChsZXQgcCBpbiBzb3VyY2UpIHsKICAgICAgICBpZiAoIShwIGluIGV4Y2x1ZGVQcm9wcykpIHsKICAgICAgICAgIGlmIChub0FjY2Vzc29ycykgewogICAgICAgICAgICB0YXJnZXRbcF0gPSBzb3VyY2VbcF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZXQgcGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgcCk7CiAgICAgICAgICAgIGlmIChwZCkgewogICAgICAgICAgICAgIC8vIGVuc3VyZSBwcm9wZXJ0eSBpcyBjb25maWd1cmFibGUgc28gdGhhdCBhIGxhdGVyIGJlaGF2aW9yIGNhbgogICAgICAgICAgICAgIC8vIHJlLWNvbmZpZ3VyZSBpdC4KICAgICAgICAgICAgICBwZC5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHAsIHBkKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXBwbGllcyBhICJsZWdhY3kiIGJlaGF2aW9yIG9yIGFycmF5IG9mIGJlaGF2aW9ycyB0byB0aGUgcHJvdmlkZWQgY2xhc3MuCiAgICAgKgogICAgICogTm90ZTogdGhpcyBtZXRob2Qgd2lsbCBhdXRvbWF0aWNhbGx5IGFsc28gYXBwbHkgdGhlIGBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbmAKICAgICAqIHRvIGVuc3VyZSB0aGF0IGFueSBsZWdhY3kgYmVoYXZpb3JzIGNhbiByZWx5IG9uIGxlZ2FjeSBQb2x5bWVyIEFQSSBvbgogICAgICogdGhlIHVuZGVybHlpbmcgZWxlbWVudC4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHshT2JqZWN0fCFBcnJheTwhT2JqZWN0Pn0gYmVoYXZpb3JzIEJlaGF2aW9yIG9iamVjdCBvciBhcnJheSBvZiBiZWhhdmlvcnMuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ldzpUKX0ga2xhc3MgRWxlbWVudCBjbGFzcy4KICAgICAqIEByZXR1cm4ge2Z1bmN0aW9uKG5ldzpUKX0gUmV0dXJucyBhIG5ldyBFbGVtZW50IGNsYXNzIGV4dGVuZGVkIGJ5IHRoZQogICAgICogcGFzc2VkIGluIGBiZWhhdmlvcnNgIGFuZCBhbHNvIGJ5IGBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbmAuCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHMsIGNoZWNrVHlwZXN9CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1peGluQmVoYXZpb3JzKGJlaGF2aW9ycywga2xhc3MpIHsKICAgICAgcmV0dXJuIEdlbmVyYXRlQ2xhc3NGcm9tSW5mbyh7fSwgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oa2xhc3MpLCBiZWhhdmlvcnMpOwogICAgfQoKICAgIC8vIE5PVEU6CiAgICAvLyAxLngKICAgIC8vIEJlaGF2aW9ycyB3ZXJlIG1peGVkIGluICppbiByZXZlcnNlIG9yZGVyKiBhbmQgZGUtZHVwZWQgb24gdGhlIGZseS4KICAgIC8vIFRoZSBydWxlIHdhcyB0aGF0IGJlaGF2aW9yIHByb3BlcnRpZXMgd2VyZSBjb3BpZWQgb250byB0aGUgZWxlbWVudAogICAgLy8gcHJvdG90eXBlIGlmIGFuZCBvbmx5IGlmIHRoZSBwcm9wZXJ0eSBkaWQgbm90IGFscmVhZHkgZXhpc3QuCiAgICAvLyBHaXZlbjogUG9seW1lcnsgYmVoYXZpb3JzOiBbQSwgQiwgQywgQSwgQl19LCBwcm9wZXJ0eSBjb3B5IG9yZGVyIHdhczoKICAgIC8vICgxKSwgQiwgKDIpLCBBLCAoMykgQy4gVGhpcyBtZWFucyBwcm90b3R5cGUgcHJvcGVydGllcyB3aW4gb3ZlcgogICAgLy8gQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luIG92ZXIgQy4gVGhpcyBtaXJyb3JzIHdoYXQgd291bGQgaGFwcGVuCiAgICAvLyB3aXRoIGluaGVyaXRhbmNlIGlmIGVsZW1lbnQgZXh0ZW5kZWQgQiBleHRlbmRlZCBBIGV4dGVuZGVkIEMuCiAgICAvLwogICAgLy8gQWdhaW4gZ2l2ZW4sIFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgdGhlIHJlc3VsdGluZwogICAgLy8gYGJlaGF2aW9yc2AgYXJyYXkgd2FzIFtDLCBBLCBCXS4KICAgIC8vIEJlaGF2aW9yIGxpZmVjeWNsZSBtZXRob2RzIHdlcmUgY2FsbGVkIGluIGJlaGF2aW9yIGFycmF5IG9yZGVyCiAgICAvLyBmb2xsb3dlZCBieSB0aGUgZWxlbWVudCwgZS5nLiAoMSkgQy5jcmVhdGVkLCAoMikgQS5jcmVhdGVkLAogICAgLy8gKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZC4gVGhlcmUgd2FzIG5vIHN1cHBvcnQgZm9yCiAgICAvLyBzdXBlciwgYW5kICJzdXBlci1iZWhhdmlvciIgbWV0aG9kcyB3ZXJlIGNhbGxhYmxlIG9ubHkgYnkgbmFtZSkuCiAgICAvLwogICAgLy8gMi54CiAgICAvLyBCZWhhdmlvcnMgYXJlIG1hZGUgaW50byBwcm9wZXIgbWl4aW5zIHdoaWNoIGxpdmUgaW4gdGhlCiAgICAvLyBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluLiBCZWhhdmlvcnMgYXJlIHBsYWNlZCBpbiB0aGUgZWxlbWVudCBwcm90b3R5cGUKICAgIC8vIGVsZGVzdCB0byB5b3VuZ2VzdCBhbmQgZGUtZHVwZWQgeW91bmdlc3QgdG8gb2xkZXN0OgogICAgLy8gU28sIGZpcnN0IFtBLCBCLCBDLCBBLCBCXSBiZWNvbWVzIFtDLCBBLCBCXSB0aGVuLAogICAgLy8gdGhlIGVsZW1lbnQgcHJvdG90eXBlIGJlY29tZXMgKG9sZGVzdCkgKDEpIFBvbHltZXIuRWxlbWVudCwgKDIpIGNsYXNzKEMpLAogICAgLy8gKDMpIGNsYXNzKEEpLCAoNCkgY2xhc3MoQiksICg1KSBjbGFzcyhQb2x5bWVyKHsuLi59KSkuCiAgICAvLyBSZXN1bHQ6CiAgICAvLyBUaGlzIG1lYW5zIGVsZW1lbnQgcHJvcGVydGllcyB3aW4gb3ZlciBCIHByb3BlcnRpZXMgd2luIG92ZXIgQSB3aW4KICAgIC8vIG92ZXIgQy4gKHNhbWUgYXMgMS54KQogICAgLy8gSWYgbGlmZWN5Y2xlIGlzIGNhbGxlZCAoc3VwZXIgdGhlbiBtZSksIG9yZGVyIGlzCiAgICAvLyAoMSkgQy5jcmVhdGVkLCAoMikgQS5jcmVhdGVkLCAoMykgQi5jcmVhdGVkLCAoNCkgZWxlbWVudC5jcmVhdGVkCiAgICAvLyAoYWdhaW4gc2FtZSBhcyAxLngpCiAgICBmdW5jdGlvbiBhcHBseUJlaGF2aW9ycyhwcm90bywgYmVoYXZpb3JzLCBsaWZlY3ljbGUpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpPGJlaGF2aW9ycy5sZW5ndGg7IGkrKykgewogICAgICAgIGFwcGx5SW5mbyhwcm90bywgYmVoYXZpb3JzW2ldLCBsaWZlY3ljbGUsIGV4Y2x1ZGVPbkJlaGF2aW9ycyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBseUluZm8ocHJvdG8sIGluZm8sIGxpZmVjeWNsZSwgZXhjbHVkZVByb3BzKSB7CiAgICAgIGNvcHlQcm9wZXJ0aWVzKGluZm8sIHByb3RvLCBleGNsdWRlUHJvcHMpOwogICAgICBmb3IgKGxldCBwIGluIGxpZmVjeWNsZVByb3BzKSB7CiAgICAgICAgaWYgKGluZm9bcF0pIHsKICAgICAgICAgIGxpZmVjeWNsZVtwXSA9IGxpZmVjeWNsZVtwXSB8fCBbXTsKICAgICAgICAgIGxpZmVjeWNsZVtwXS5wdXNoKGluZm9bcF0pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtBcnJheX0gYmVoYXZpb3JzIExpc3Qgb2YgYmVoYXZpb3JzIHRvIGZsYXR0ZW4uCiAgICAgKiBAcGFyYW0ge0FycmF5PX0gbGlzdCBUYXJnZXQgbGlzdCB0byBmbGF0dGVuIGJlaGF2aW9ycyBpbnRvLgogICAgICogQHBhcmFtIHtBcnJheT19IGV4Y2x1ZGUgTGlzdCBvZiBiZWhhdmlvcnMgdG8gZXhjbHVkZSBmcm9tIHRoZSBsaXN0LgogICAgICogQHJldHVybiB7IUFycmF5fSBSZXR1cm5zIHRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBiZWhhdmlvcnMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZsYXR0ZW5CZWhhdmlvcnMoYmVoYXZpb3JzLCBsaXN0LCBleGNsdWRlKSB7CiAgICAgIGxpc3QgPSBsaXN0IHx8IFtdOwogICAgICBmb3IgKGxldCBpPWJlaGF2aW9ycy5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBsZXQgYiA9IGJlaGF2aW9yc1tpXTsKICAgICAgICBpZiAoYikgewogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYikpIHsKICAgICAgICAgICAgZmxhdHRlbkJlaGF2aW9ycyhiLCBsaXN0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGRlZHVwCiAgICAgICAgICAgIGlmIChsaXN0LmluZGV4T2YoYikgPCAwICYmICghZXhjbHVkZSB8fCBleGNsdWRlLmluZGV4T2YoYikgPCAwKSkgewogICAgICAgICAgICAgIGxpc3QudW5zaGlmdChiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oJ2JlaGF2aW9yIGlzIG51bGwsIGNoZWNrIGZvciBtaXNzaW5nIG9yIDQwNCBpbXBvcnQnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9CgogICAgLyogTm90ZSBhYm91dCBjb25zdHJ1Y3Rpb24gYW5kIGV4dGVuc2lvbiBvZiBsZWdhY3kgY2xhc3Nlcy4KICAgICAgW0NoYW5nZWQgaW4gUTQgMjAxOCB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZS5dCgogICAgICBXaGVuIGNhbGxpbmcgYFBvbHltZXJgIG9yIGBtaXhpbkJlaGF2aW9yc2AsIHRoZSBnZW5lcmF0ZWQgY2xhc3MgYmVsb3cgaXMKICAgICAgbWFkZS4gVGhlIGxpc3Qgb2YgYmVoYXZpb3JzIHdhcyBwcmV2aW91c2x5IG1hZGUgaW50byBvbmUgZ2VuZXJhdGVkIGNsYXNzIHBlcgogICAgICBiZWhhdmlvciwgYnV0IHRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlIGFzIGJlaGF2aW9ycyBhcmUgbm93IGNhbGxlZAogICAgICBtYW51YWxseS4gTm90ZSwgdGhlcmUgbWF5ICpzdGlsbCogYmUgbXVsdGlwbGUgZ2VuZXJhdGVkIGNsYXNzZXMgaW4gdGhlCiAgICAgIGVsZW1lbnQncyBwcm90b3R5cGUgY2hhaW4gaWYgZXh0ZW5zaW9uIGlzIHVzZWQgd2l0aCBgbWl4aW5CZWhhdmlvcnNgLgoKICAgICAgVGhlIGdlbmVyYXRlZCBjbGFzcyBpcyBkaXJlY3RseSB0aWVkIHRvIHRoZSBpbmZvIG9iamVjdCBhbmQgYmVoYXZpb3JzCiAgICAgIHVzZWQgdG8gY3JlYXRlIGl0LiBUaGF0IGxpc3Qgb2YgYmVoYXZpb3JzIGlzIGZpbHRlcmVkIHNvIGl0J3Mgb25seSB0aGUKICAgICAgYmVoYXZpb3JzIG5vdCBhY3RpdmUgb24gdGhlIHN1cGVyY2xhc3MuIEluIG9yZGVyIHRvIGNhbGwgdGhyb3VnaCB0byB0aGUKICAgICAgZW50aXJlIGxpc3Qgb2YgbGlmZWN5Y2xlIG1ldGhvZHMsIGl0J3MgaW1wb3J0YW50IHRvIGNhbGwgYHN1cGVyYC4KCiAgICAgIFRoZSBlbGVtZW50J3MgYHByb3BlcnRpZXNgIGFuZCBgb2JzZXJ2ZXJzYCBhcmUgY29udHJvbGxlZCB2aWEgdGhlIGZpbmFsaXphdGlvbgogICAgICBtZWNoYW5pc20gcHJvdmlkZWQgYnkgYFByb3BlcnRpZXNNaXhpbmAuIGBQcm9wZXJ0aWVzYCBhbmQgYG9ic2VydmVyc2AgYXJlCiAgICAgIGNvbGxlY3RlZCBieSBtYW51YWxseSB0cmF2ZXJzaW5nIHRoZSBwcm90b3R5cGUgY2hhaW4gYW5kIG1lcmdpbmcuCgogICAgICBUbyBsaW1pdCBjaGFuZ2VzLCB0aGUgYF9yZWdpc3RlcmVkYCBtZXRob2QgaXMgY2FsbGVkIHZpYSBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYAogICAgICBhbmQgbm90IGBfZmluYWxpemVDbGFzc2AuCiAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQb2x5bWVyIGluZm8gb2JqZWN0CiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ldzpIVE1MRWxlbWVudCl9IEJhc2UgYmFzZSBjbGFzcyB0byBleHRlbmQgd2l0aCBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IGJlaGF2aW9ycyBiZWhhdmlvcnMgdG8gY29weSBpbnRvIHRoZSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBHZW5lcmF0ZWQgY2xhc3MKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlc30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdlbmVyYXRlQ2xhc3NGcm9tSW5mbyhpbmZvLCBCYXNlLCBiZWhhdmlvcnMpIHsKCiAgICAgIC8vIG1hbmFnZXMgYmVoYXZpb3IgYW5kIGxpZmVjeWNsZSBwcm9jZXNzaW5nIChmaWxsZWQgaW4gYWZ0ZXIgY2xhc3MgZGVmaW5pdGlvbikKICAgICAgbGV0IGJlaGF2aW9yTGlzdDsKICAgICAgY29uc3QgbGlmZWN5Y2xlID0ge307CgogICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgY2xhc3MgUG9seW1lckdlbmVyYXRlZCBleHRlbmRzIEJhc2UgewoKICAgICAgICAvLyBleHBsaWNpdGx5IG5vdCBjYWxsaW5nIHN1cGVyLl9maW5hbGl6ZUNsYXNzCiAgICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgICAgLy8gaWYgY2FsbGluZyB2aWEgYSBzdWJjbGFzcyB0aGF0IGhhc24ndCBiZWVuIGdlbmVyYXRlZCwgcGFzcyB0aHJvdWdoIHRvIHN1cGVyCiAgICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkod2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2dlbmVyYXRlZEZyb20nLCB0aGlzKSkpIHsKICAgICAgICAgICAgc3VwZXIuX2ZpbmFsaXplQ2xhc3MoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGludGVybGVhdmUgcHJvcGVydGllcyBhbmQgb2JzZXJ2ZXJzIHBlciBiZWhhdmlvciBhbmQgYGluZm9gCiAgICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgICBmb3IgKGxldCBpPTAsIGI7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGIgPSBiZWhhdmlvckxpc3RbaV07CiAgICAgICAgICAgICAgICBpZiAoYi5wcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydGllcyhiLnByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGIub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKGIub2JzZXJ2ZXJzLCBiLnByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW5mby5wcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQcm9wZXJ0aWVzKGluZm8ucHJvcGVydGllcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8ub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPYnNlcnZlcnMoaW5mby5vYnNlcnZlcnMsIGluZm8ucHJvcGVydGllcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRvIHByZXBhcmUgdGhlIGVsZW1lbnQgdGVtcGxhdGUKICAgICAgICAgICAgdGhpcy5fcHJlcGFyZVRlbXBsYXRlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge307CiAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGJlaGF2aW9yTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcywgYmVoYXZpb3JMaXN0W2ldLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIGluZm8ucHJvcGVydGllcyk7CiAgICAgICAgICByZXR1cm4gcHJvcGVydGllczsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgICAgbGV0IG9ic2VydmVycyA9IFtdOwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTAsIGI7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzLmNvbmNhdChiLm9ic2VydmVycyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaW5mby5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgb2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzLmNvbmNhdChpbmZvLm9ic2VydmVycyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXJzOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVkKCkgewogICAgICAgICAgc3VwZXIuY3JlYXRlZCgpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5jcmVhdGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfcmVnaXN0ZXJlZCgpIHsKICAgICAgICAgIC8qIE5PVEU6IGBiZWZvcmVSZWdpc3RlcmAgaXMgY2FsbGVkIGhlcmUgZm9yIGJjLCBidXQgdGhlIGJlaGF2aW9yCiAgICAgICAgICAgIGlzIGRpZmZlcmVudCB0aGFuIGluIDEueC4gSW4gMS4wLCB0aGUgbWV0aG9kIHdhcyBjYWxsZWQgKmFmdGVyKgogICAgICAgICAgICBtaXhpbmcgcHJvdG90eXBlcyB0b2dldGhlciBidXQgKmJlZm9yZSogcHJvY2Vzc2luZyBvZiBtZXRhLW9iamVjdHMuCiAgICAgICAgICAgIEhvd2V2ZXIsIGR5bmFtaWMgZWZmZWN0cyBjYW4gc3RpbGwgYmUgc2V0IGhlcmUgYW5kIGNhbiBiZSBkb25lIGVpdGhlcgogICAgICAgICAgICBpbiBgYmVmb3JlUmVnaXN0ZXJgIG9yIGByZWdpc3RlcmVkYC4gSXQgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvIHNldAogICAgICAgICAgICBgaXNgIGluIGBiZWZvcmVSZWdpc3RlcmAgYXMgeW91IGNvdWxkIGluIDEueC4KICAgICAgICAgICovCiAgICAgICAgICAvLyBvbmx5IHByb2NlZWQgaWYgdGhlIGdlbmVyYXRlZCBjbGFzcycgcHJvdG90eXBlIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLgogICAgICAgICAgY29uc3QgZ2VuZXJhdGVkUHJvdG8gPSBQb2x5bWVyR2VuZXJhdGVkLnByb3RvdHlwZTsKICAgICAgICAgIGlmICghZ2VuZXJhdGVkUHJvdG8uaGFzT3duUHJvcGVydHkoJ19faGFzUmVnaXN0ZXJGaW5pc2hlZCcpKSB7CiAgICAgICAgICAgIGdlbmVyYXRlZFByb3RvLl9faGFzUmVnaXN0ZXJGaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgIC8vIGVuc3VyZSBzdXBlcmNsYXNzIGlzIHJlZ2lzdGVyZWQgZmlyc3QuCiAgICAgICAgICAgIHN1cGVyLl9yZWdpc3RlcmVkKCk7CiAgICAgICAgICAgIC8vIGNvcHkgcHJvcGVydGllcyBvbnRvIHRoZSBnZW5lcmF0ZWQgY2xhc3MgbGF6aWx5IGlmIHdlJ3JlIG9wdGltaXppbmcsCiAgICAgICAgICAgIGlmIChQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgICAgICAgICAgICBjb3B5UHJvcGVydGllc1RvUHJvdG8oZ2VuZXJhdGVkUHJvdG8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBsZWdhY3kgbGlmZWN5Y2xlIGlzIGNhbGxlZCBvbiB0aGUgKmVsZW1lbnQqJ3MgcHJvdG90eXBlCiAgICAgICAgICAgIC8vIGFuZCBub3QgdGhlIGdlbmVyYXRlZCBjbGFzcyBwcm90b3R5cGU7IGlmIHRoZSBlbGVtZW50IGhhcyBiZWVuCiAgICAgICAgICAgIC8vIGV4dGVuZGVkLCB0aGVzZSBhcmUgKm5vdCogdGhlIHNhbWUuCiAgICAgICAgICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpOwogICAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5iZWZvcmVSZWdpc3RlcjsKICAgICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwocHJvdG8pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsaXN0ID0gbGlmZWN5Y2xlLnJlZ2lzdGVyZWQ7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHByb3RvKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX2FwcGx5TGlzdGVuZXJzKCkgewogICAgICAgICAgc3VwZXIuX2FwcGx5TGlzdGVuZXJzKCk7CiAgICAgICAgICBjb25zdCBsaXN0ID0gbGlmZWN5Y2xlLmxpc3RlbmVyczsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBsaXN0W2ldOwogICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGwgaW4gbGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZE1ldGhvZEV2ZW50TGlzdGVuZXJUb05vZGUodGhpcywgbCwgbGlzdGVuZXJzW2xdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIG5vdGU6IGV4Y2VwdGlvbiB0byAic3VwZXIgdGhlbiBtZSIgcnVsZTsKICAgICAgICAvLyBkbyB3b3JrIGJlZm9yZSBjYWxsaW5nIHN1cGVyIHNvIHRoYXQgc3VwZXIgYXR0cmlidXRlcwogICAgICAgIC8vIG9ubHkgYXBwbHkgaWYgbm90IGFscmVhZHkgc2V0LgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX2Vuc3VyZUF0dHJpYnV0ZXMoKSB7CiAgICAgICAgICBjb25zdCBsaXN0ID0gbGlmZWN5Y2xlLmhvc3RBdHRyaWJ1dGVzOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT1saXN0Lmxlbmd0aC0xOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgIGNvbnN0IGhvc3RBdHRyaWJ1dGVzID0gbGlzdFtpXTsKICAgICAgICAgICAgICBmb3IgKGxldCBhIGluIGhvc3RBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX2Vuc3VyZUF0dHJpYnV0ZShhLCBob3N0QXR0cmlidXRlc1thXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHN1cGVyLl9lbnN1cmVBdHRyaWJ1dGVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIHJlYWR5KCkgewogICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLnJlYWR5OwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBhdHRhY2hlZCgpIHsKICAgICAgICAgIHN1cGVyLmF0dGFjaGVkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5hdHRhY2hlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgZGV0YWNoZWQoKSB7CiAgICAgICAgICBzdXBlci5kZXRhY2hlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuZGV0YWNoZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRzIG5hdGl2ZSBDdXN0b20gRWxlbWVudHMgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AgdG8KICAgICAgICAgKiBzZXQgYW4gYXR0cmlidXRlIHZhbHVlIHRvIGEgcHJvcGVydHkgdmlhIGBfYXR0cmlidXRlVG9Qcm9wZXJ0eWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIGF0dHJpYnV0ZSB0aGF0IGNoYW5nZWQKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgYXR0cmlidXRlIHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBOZXcgYXR0cmlidXRlIHZhbHVlCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpIHsKICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmF0dHJpYnV0ZUNoYW5nZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMsIG5hbWUsIG9sZCwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBhcHBseSBiZWhhdmlvcnMsIG5vdGUgYWN0dWFsIGNvcHlpbmcgaXMgZG9uZSBsYXppbHkgYXQgZmlyc3QgaW5zdGFuY2UgY3JlYXRpb24KICAgICAgaWYgKGJlaGF2aW9ycykgewogICAgICAgIC8vIE5PVEU6IGVuc3VyZSB0aGUgYmVoYXZpb3IgaXMgZXh0ZW5kaW5nIGEgY2xhc3Mgd2l0aAogICAgICAgIC8vIGxlZ2FjeSBlbGVtZW50IGFwaS4gVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgYmVoYXZpb3JzIGV4cGVjdCB0byBiZSBhYmxlCiAgICAgICAgLy8gdG8gYWNjZXNzIDEueCBsZWdhY3kgYXBpLgogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShiZWhhdmlvcnMpKSB7CiAgICAgICAgICBiZWhhdmlvcnMgPSBbYmVoYXZpb3JzXTsKICAgICAgICB9CiAgICAgICAgbGV0IHN1cGVyQmVoYXZpb3JzID0gQmFzZS5wcm90b3R5cGUuYmVoYXZpb3JzOwogICAgICAgIC8vIGdldCBmbGF0dGVuZWQsIGRlZHVwZWQgbGlzdCBvZiBiZWhhdmlvcnMgKm5vdCogYWxyZWFkeSBvbiBzdXBlciBjbGFzcwogICAgICAgIGJlaGF2aW9yTGlzdCA9IGZsYXR0ZW5CZWhhdmlvcnMoYmVoYXZpb3JzLCBudWxsLCBzdXBlckJlaGF2aW9ycyk7CiAgICAgICAgUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGUuYmVoYXZpb3JzID0gc3VwZXJCZWhhdmlvcnMgPwogICAgICAgICAgc3VwZXJCZWhhdmlvcnMuY29uY2F0KGJlaGF2aW9ycykgOiBiZWhhdmlvckxpc3Q7CiAgICAgIH0KCiAgICAgIGNvbnN0IGNvcHlQcm9wZXJ0aWVzVG9Qcm90byA9IChwcm90bykgPT4gewogICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgIGFwcGx5QmVoYXZpb3JzKHByb3RvLCBiZWhhdmlvckxpc3QsIGxpZmVjeWNsZSk7CiAgICAgICAgfQogICAgICAgIGFwcGx5SW5mbyhwcm90bywgaW5mbywgbGlmZWN5Y2xlLCBleGNsdWRlT25JbmZvKTsKICAgICAgfTsKCiAgICAgIC8vIGNvcHkgcHJvcGVydGllcyBpZiB3ZSdyZSBub3Qgb3B0aW1pemluZwogICAgICBpZiAoIVBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgICAgIGNvcHlQcm9wZXJ0aWVzVG9Qcm90byhQb2x5bWVyR2VuZXJhdGVkLnByb3RvdHlwZSk7CiAgICAgIH0KCiAgICAgIFBvbHltZXJHZW5lcmF0ZWQuZ2VuZXJhdGVkRnJvbSA9IGluZm87CgogICAgICByZXR1cm4gUG9seW1lckdlbmVyYXRlZDsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBgUG9seW1lci5MZWdhY3lFbGVtZW50YCBiYXNlZCBvbiB0aGUKICAgICAqIHByb3ZpZGVkIGluZm8gb2JqZWN0LiAgTWV0YWRhdGEgb2JqZWN0cyBvbiB0aGUgYGluZm9gIG9iamVjdAogICAgICogKGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBsaXN0ZW5lcnNgLCBgYmVoYXZpb3JzYCwgYGlzYCkgYXJlIHVzZWQKICAgICAqIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZyBzeXN0ZW1zLCBhbmQgYW55IGZ1bmN0aW9ucyBhcmUgY29waWVkCiAgICAgKiB0byB0aGUgZ2VuZXJhdGVkIGNsYXNzLgogICAgICoKICAgICAqIFZhbGlkICJtZXRhZGF0YSIgdmFsdWVzIGFyZSBhcyBmb2xsb3dzOgogICAgICoKICAgICAqIGBpc2A6IFN0cmluZyBwcm92aWRpbmcgdGhlIHRhZyBuYW1lIHRvIHJlZ2lzdGVyIHRoZSBlbGVtZW50IHVuZGVyLiBJbgogICAgICogYWRkaXRpb24sIGlmIGEgYGRvbS1tb2R1bGVgIHdpdGggdGhlIHNhbWUgaWQgZXhpc3RzLCB0aGUgZmlyc3QgdGVtcGxhdGUKICAgICAqIGluIHRoYXQgYGRvbS1tb2R1bGVgIHdpbGwgYmUgc3RhbXBlZCBpbnRvIHRoZSBzaGFkb3cgcm9vdCBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiB3aXRoIHN1cHBvcnQgZm9yIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLS4uLmApLCBQb2x5bWVyIGRhdGEKICAgICAqIGJpbmRpbmdzIChgW1suLi5dXWAgYW5kIGB7ey4uLn19YCksIGFuZCBpZC1iYXNlZCBub2RlIGZpbmRpbmcgaW50bwogICAgICogYHRoaXMuJGAuCiAgICAgKgogICAgICogYHByb3BlcnRpZXNgOiBPYmplY3QgZGVzY3JpYmluZyBwcm9wZXJ0eS1yZWxhdGVkIG1ldGFkYXRhIHVzZWQgYnkgUG9seW1lcgogICAgICogZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZXMsIHZhbHVlOiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0eSBtZXRhZGF0YSkuCiAgICAgKiBWYWxpZCBrZXlzIGluIHBlci1wcm9wZXJ0eSBtZXRhZGF0YSBpbmNsdWRlOgogICAgICogLSBgdHlwZWAgKFN0cmluZ3xOdW1iZXJ8T2JqZWN0fEFycmF5fC4uLik6IFVzZWQgYnkKICAgICAqICAgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AgdG8gZGV0ZXJtaW5lIGhvdyBzdHJpbmctYmFzZWQgYXR0cmlidXRlcwogICAgICogICBhcmUgZGVzZXJpYWxpemVkIHRvIEphdmFTY3JpcHQgcHJvcGVydHkgdmFsdWVzLgogICAgICogLSBgbm90aWZ5YCAoYm9vbGVhbik6IENhdXNlcyBhIGNoYW5nZSBpbiB0aGUgcHJvcGVydHkgdG8gZmlyZSBhCiAgICAgKiAgIG5vbi1idWJibGluZyBldmVudCBjYWxsZWQgYDxwcm9wZXJ0eT4tY2hhbmdlZGAuIEVsZW1lbnRzIHRoYXQgaGF2ZQogICAgICogICBlbmFibGVkIHR3by13YXkgYmluZGluZyB0byB0aGUgcHJvcGVydHkgdXNlIHRoaXMgZXZlbnQgdG8gb2JzZXJ2ZSBjaGFuZ2VzLgogICAgICogLSBgcmVhZE9ubHlgIChib29sZWFuKTogQ3JlYXRlcyBhIGdldHRlciBmb3IgdGhlIHByb3BlcnR5LCBidXQgbm8gc2V0dGVyLgogICAgICogICBUbyBzZXQgYSByZWFkLW9ubHkgcHJvcGVydHksIHVzZSB0aGUgcHJpdmF0ZSBzZXR0ZXIgbWV0aG9kCiAgICAgKiAgIGBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKWAuCiAgICAgKiAtIGBvYnNlcnZlcmAgKHN0cmluZyk6IE9ic2VydmVyIG1ldGhvZCBuYW1lIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgogICAgICogICB0aGUgcHJvcGVydHkgY2hhbmdlcy4gVGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kIGFyZQogICAgICogICBgKHZhbHVlLCBwcmV2aW91c1ZhbHVlKWAuCiAgICAgKiAtIGBjb21wdXRlZGAgKHN0cmluZyk6IFN0cmluZyBkZXNjcmliaW5nIG1ldGhvZCBhbmQgZGVwZW5kZW50IHByb3BlcnRpZXMKICAgICAqICAgZm9yIGNvbXB1dGluZyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSAoZS5nLiBgJ2NvbXB1dGVGb28oYmFyLCB6b3QpJ2ApLgogICAgICogICBDb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkgYnkgZGVmYXVsdCBhbmQgY2FuIG9ubHkgYmUgY2hhbmdlZAogICAgICogICB2aWEgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY29tcHV0aW5nIG1ldGhvZC4KICAgICAqCiAgICAgKiBgb2JzZXJ2ZXJzYDogQXJyYXkgb2Ygc3RyaW5ncyBkZXNjcmliaW5nIG11bHRpLXByb3BlcnR5IG9ic2VydmVyIG1ldGhvZHMKICAgICAqICBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4gYCdvYnNlcnZlQUJDKGEsIGIsIGMpJ2ApLgogICAgICoKICAgICAqIGBsaXN0ZW5lcnNgOiBPYmplY3QgZGVzY3JpYmluZyBldmVudCBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQgdG8gZWFjaAogICAgICogIGluc3RhbmNlIG9mIHRoaXMgZWxlbWVudCAoa2V5OiBldmVudCBuYW1lLCB2YWx1ZTogbWV0aG9kIG5hbWUpLgogICAgICoKICAgICAqIGBiZWhhdmlvcnNgOiBBcnJheSBvZiBhZGRpdGlvbmFsIGBpbmZvYCBvYmplY3RzIGNvbnRhaW5pbmcgbWV0YWRhdGEKICAgICAqIGFuZCBjYWxsYmFja3MgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBgaW5mb2Agb2JqZWN0IGhlcmUgd2hpY2ggYXJlCiAgICAgKiBtZXJnZWQgaW50byB0aGlzIGVsZW1lbnQuCiAgICAgKgogICAgICogYGhvc3RBdHRyaWJ1dGVzYDogT2JqZWN0IGxpc3RpbmcgYXR0cmlidXRlcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBob3N0CiAgICAgKiAgb25jZSBjcmVhdGVkIChrZXk6IGF0dHJpYnV0ZSBuYW1lLCB2YWx1ZTogYXR0cmlidXRlIHZhbHVlKS4gIFZhbHVlcwogICAgICogIGFyZSBzZXJpYWxpemVkIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZS4gIEhvc3QgYXR0cmlidXRlcyBzaG91bGQKICAgICAqICBnZW5lcmFsbHkgYmUgbGltaXRlZCB0byBhdHRyaWJ1dGVzIHN1Y2ggYXMgYHRhYkluZGV4YCBhbmQgYGFyaWEtLi4uYC4KICAgICAqICBBdHRyaWJ1dGVzIGluIGBob3N0QXR0cmlidXRlc2AgYXJlIG9ubHkgYXBwbGllZCBpZiBhIHVzZXItc3VwcGxpZWQKICAgICAqICBhdHRyaWJ1dGUgaXMgbm90IGFscmVhZHkgcHJlc2VudCAoYXR0cmlidXRlcyBpbiBtYXJrdXAgb3ZlcnJpZGUKICAgICAqICBgaG9zdEF0dHJpYnV0ZXNgKS4KICAgICAqCiAgICAgKiBJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBQb2x5bWVyLXNwZWNpZmljIGNhbGxiYWNrcyBtYXkgYmUgcHJvdmlkZWQ6CiAgICAgKiAtIGByZWdpc3RlcmVkYDogY2FsbGVkIGFmdGVyIGZpcnN0IGluc3RhbmNlIG9mIHRoaXMgZWxlbWVudCwKICAgICAqIC0gYGNyZWF0ZWRgOiBjYWxsZWQgZHVyaW5nIGBjb25zdHJ1Y3RvcmAKICAgICAqIC0gYGF0dGFjaGVkYDogY2FsbGVkIGR1cmluZyBgY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgKiAtIGBkZXRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgcmVhZHlgOiBjYWxsZWQgYmVmb3JlIGZpcnN0IGBhdHRhY2hlZGAsIGFmdGVyIGFsbCBwcm9wZXJ0aWVzIG9mCiAgICAgKiAgIHRoaXMgZWxlbWVudCBoYXZlIGJlZW4gcHJvcGFnYXRlZCB0byBpdHMgdGVtcGxhdGUgYW5kIGFsbCBvYnNlcnZlcnMKICAgICAqICAgaGF2ZSBydW4KICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHtmdW5jdGlvbihUKTpUfSBtaXhpbiBPcHRpb25hbCBtaXhpbiB0byBhcHBseSB0byBsZWdhY3kgYmFzZSBjbGFzcwogICAgICogICBiZWZvcmUgZXh0ZW5kaW5nIHdpdGggUG9seW1lciBtZXRhcHJvZ3JhbW1pbmcuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBHZW5lcmF0ZWQgY2xhc3MKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKi8KICAgIFBvbHltZXIuQ2xhc3MgPSBmdW5jdGlvbihpbmZvLCBtaXhpbikgewogICAgICBpZiAoIWluZm8pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ1BvbHltZXIuQ2xhc3MgcmVxdWlyZXMgYGluZm9gIGFyZ3VtZW50Jyk7CiAgICAgIH0KICAgICAgbGV0IGtsYXNzID0gbWl4aW4gPyBtaXhpbihQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCkpIDoKICAgICAgICAgIFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KTsKICAgICAga2xhc3MgPSBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywga2xhc3MsIGluZm8uYmVoYXZpb3JzKTsKICAgICAgaWYgKGluZm8uX2VuYWJsZURpc2FibGVVcGdyYWRlKSB7CiAgICAgICAga2xhc3MgPSBQb2x5bWVyLkRpc2FibGVVcGdyYWRlTWl4aW4oa2xhc3MpOwogICAgICB9CiAgICAgIC8vIGRlY29yYXRlIGtsYXNzIHdpdGggcmVnaXN0cmF0aW9uIGluZm8KICAgICAga2xhc3MuaXMgPSBrbGFzcy5wcm90b3R5cGUuaXMgPSBpbmZvLmlzOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICAgIFBvbHltZXIubWl4aW5CZWhhdmlvcnMgPSBtaXhpbkJlaGF2aW9yczsKCiAgfSkoKTsKCjwvc2NyaXB0PjxzY3JpcHQ+CgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKiBgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIFBvbHltZXIuQ2xhc3MoaW5mbykpO2AKICAgICAqCiAgICAgKiBTZWUgYFBvbHltZXIuQ2xhc3NgIGZvciBkZXRhaWxzIG9uIHZhbGlkIGxlZ2FjeSBtZXRhZGF0YSBmb3JtYXQgZm9yIGBpbmZvYC4KICAgICAqCiAgICAgKiBAZ2xvYmFsCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBmdW5jdGlvbiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6IEhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZSwgaW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgewogICAgICAvLyBpZiBpbnB1dCBpcyBhIGBjbGFzc2AgKGFrYSBhIGZ1bmN0aW9uIHdpdGggYSBwcm90b3R5cGUpLCB1c2UgdGhlIHByb3RvdHlwZQogICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBgY29uc3RydWN0b3JgIHdpbGwgbmV2ZXIgYmUgY2FsbGVkCiAgICAgIGxldCBrbGFzczsKICAgICAgaWYgKHR5cGVvZiBpbmZvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAga2xhc3MgPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGtsYXNzID0gUG9seW1lci5DbGFzcyhpbmZvKTsKICAgICAgfQogICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoa2xhc3MuaXMsIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhrbGFzcykpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICB9KSgpOwoKPC9zY3JpcHQ+PHNjcmlwdD4KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gQ29tbW9uIGltcGxlbWVudGF0aW9uIGZvciBtaXhpbiAmIGJlaGF2aW9yCiAgZnVuY3Rpb24gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKGluc3QsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCBtdXRhYmxlRGF0YSkgewogICAgbGV0IGlzT2JqZWN0OwogICAgaWYgKG11dGFibGVEYXRhKSB7CiAgICAgIGlzT2JqZWN0ID0gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpOwogICAgICAvLyBQdWxsIGBvbGRgIGZvciBPYmplY3RzIGZyb20gdGVtcCBjYWNoZSwgYnV0IHRyZWF0IGBudWxsYCBhcyBhIHByaW1pdGl2ZQogICAgICBpZiAoaXNPYmplY3QpIHsKICAgICAgICBvbGQgPSBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldOwogICAgICB9CiAgICB9CiAgICAvLyBTdHJpY3QgZXF1YWxpdHkgY2hlY2ssIGJ1dCByZXR1cm4gZmFsc2UgZm9yIE5hTj09PU5hTgogICAgbGV0IHNob3VsZENoYW5nZSA9IChvbGQgIT09IHZhbHVlICYmIChvbGQgPT09IG9sZCB8fCB2YWx1ZSA9PT0gdmFsdWUpKTsKICAgIC8vIE9iamVjdHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mCiAgICAvLyB0dXJuKSwgd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcKICAgIGlmIChpc09iamVjdCAmJiBzaG91bGRDaGFuZ2UpIHsKICAgICAgaW5zdC5fX2RhdGFUZW1wW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHNob3VsZENoYW5nZTsKICB9CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAqIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKSwgZm9yIHVzZSBvbiBlbGVtZW50cyB1dGlsaXppbmcKICAgKiBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGNhdXNlIFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBhcHBseSB0aGlzIG1peGluIG9yIGVuYWJsZSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YWAuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGFzIG9wcG9zZWQgdG8gdXNpbmcgc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlCiAgICogcGF0dGVybnMgb3IgUG9seW1lcidzIHBhdGggbm90aWZpY2F0aW9uIEFQSS4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMKICAgKiAgIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhID0gUG9seW1lci5kZWR1cGluZ01peGluKHN1cGVyQ2xhc3MgPT4gewoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqLwogICAgY2xhc3MgTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHByb3ZpZGUgb3B0aW9uIGZvciBza2lwcGluZwogICAgICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2tpbmcgZm9yIE9iamVjdHMgYW5kIEFycmF5cy4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgcHVsbHMgdGhlIHZhbHVlIHRvIGRpcnR5IGNoZWNrIGFnYWluc3QgZnJvbSB0aGUgYF9fZGF0YVRlbXBgCiAgICAgICAqIGNhY2hlIChyYXRoZXIgdGhhbiB0aGUgbm9ybWFsIGBfX2RhdGFgIGNhY2hlKSBmb3IgT2JqZWN0cy4gIFNpbmNlIHRoZSB0ZW1wCiAgICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgICAqIHNpZGUtZWZmZWN0cyBvZiBkZWVwIG9iamVjdCBjaGFuZ2VzIHRvIGJlIHByb2Nlc3NlZCBieSByZS1zZXR0aW5nIHRoZQogICAgICAgKiBzYW1lIG9iamVjdCAodXNpbmcgdGhlIHRlbXAgY2FjaGUgYXMgYW4gaW4tdHVybiBiYWNrc3RvcCB0byBwcmV2ZW50CiAgICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKSB7CiAgICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIE11dGFibGVEYXRhOwoKICB9KTsKCgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBtaXhpbiBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5NdXRhYmxlRGF0YWAgbWl4aW4uCiAgICoKICAgKiBXaGlsZSB0aGlzIG1peGluIGFkZHMgdGhlIGFiaWxpdHkgdG8gZm9yZ28gT2JqZWN0L0FycmF5IGRpcnR5IGNoZWNraW5nLAogICAqIHRoZSBgbXV0YWJsZURhdGFgIGZsYWcgZGVmYXVsdHMgdG8gZmFsc2UgYW5kIG11c3QgYmUgc2V0IG9uIHRoZSBpbnN0YW5jZS4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYnkgcmVseWluZyBvbiBgbXV0YWJsZURhdGE6IHRydWVgIGFzIG9wcG9zZWQgdG8gdXNpbmcKICAgKiBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUgcGF0dGVybnMgb3IgUG9seW1lcidzIHBhdGggbm90aWZpY2F0aW9uCiAgICogQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBvcHRpb25hbGx5IHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nCiAgICogICBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICovCiAgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhID0gUG9seW1lci5kZWR1cGluZ01peGluKHN1cGVyQ2xhc3MgPT4gewoKICAgIC8qKgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBPcHRpb25hbE11dGFibGVEYXRhIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogSW5zdGFuY2UtbGV2ZWwgZmxhZyBmb3IgY29uZmlndXJpbmcgdGhlIGRpcnR5LWNoZWNraW5nIHN0cmF0ZWd5CiAgICAgICAgICAgKiBmb3IgdGhpcyBlbGVtZW50LiAgV2hlbiB0cnVlLCBPYmplY3RzIGFuZCBBcnJheXMgd2lsbCBza2lwIGRpcnR5CiAgICAgICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuCiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHByb3ZpZGUgb3B0aW9uIGZvciBza2lwcGluZwogICAgICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2tpbmcgZm9yIE9iamVjdHMgYW5kIEFycmF5cy4KICAgICAgICoKICAgICAgICogV2hlbiBgdGhpcy5tdXRhYmxlRGF0YWAgaXMgdHJ1ZSBvbiB0aGlzIGluc3RhbmNlLCB0aGlzIG1ldGhvZAogICAgICAgKiBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAgY2FjaGUKICAgICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBPcHRpb25hbE11dGFibGVEYXRhOwoKICB9KTsKCiAgLy8gRXhwb3J0IGZvciB1c2UgYnkgbGVnYWN5IGJlaGF2aW9yCiAgUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwoKfSkoKTsKPC9zY3JpcHQ+PHNjcmlwdD4KICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gQmFzZSBjbGFzcyBmb3IgSFRNTFRlbXBsYXRlRWxlbWVudCBleHRlbnNpb24gdGhhdCBoYXMgcHJvcGVydHkgZWZmZWN0cwogICAgLy8gbWFjaGluZXJ5IGZvciBwcm9wYWdhdGluZyBob3N0IHByb3BlcnRpZXMgdG8gY2hpbGRyZW4uIFRoaXMgaXMgYW4gRVM1CiAgICAvLyBjbGFzcyBvbmx5IGJlY2F1c2UgQmFiZWwgKGluY29ycmVjdGx5KSByZXF1aXJlcyBzdXBlcigpIGluIHRoZSBjbGFzcwogICAgLy8gY29uc3RydWN0b3IgZXZlbiB0aG91Z2ggbm8gYHRoaXNgIGlzIHVzZWQgYW5kIGl0IHJldHVybnMgYW4gaW5zdGFuY2UuCiAgICBsZXQgbmV3SW5zdGFuY2UgPSBudWxsOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24oKSB7IHJldHVybiBuZXdJbnN0YW5jZTsgfQogICAgSFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24sCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBleHRlbmRzIHtIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9ufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgRGF0YVRlbXBsYXRlID0gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMoSFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbik7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICogQGV4dGVuZHMge0RhdGFUZW1wbGF0ZX0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IE11dGFibGVEYXRhVGVtcGxhdGUgPSBQb2x5bWVyLk11dGFibGVEYXRhKERhdGFUZW1wbGF0ZSk7CgogICAgLy8gQXBwbGllcyBhIERhdGFUZW1wbGF0ZSBzdWJjbGFzcyB0byBhIDx0ZW1wbGF0ZT4gaW5zdGFuY2UKICAgIGZ1bmN0aW9uIHVwZ3JhZGVUZW1wbGF0ZSh0ZW1wbGF0ZSwgY29uc3RydWN0b3IpIHsKICAgICAgbmV3SW5zdGFuY2UgPSB0ZW1wbGF0ZTsKICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRlbXBsYXRlLCBjb25zdHJ1Y3Rvci5wcm90b3R5cGUpOwogICAgICBuZXcgY29uc3RydWN0b3IoKTsKICAgICAgbmV3SW5zdGFuY2UgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQmFzZSBjbGFzcyBmb3IgVGVtcGxhdGVJbnN0YW5jZS4KICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlFZmZlY3RzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgYmFzZSA9IFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKGNsYXNzIHt9KTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cwogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlQmFzZSBleHRlbmRzIGJhc2UgewogICAgICBjb25zdHJ1Y3Rvcihwcm9wcykgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fY29uZmlndXJlUHJvcGVydGllcyhwcm9wcyk7CiAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl9fZGF0YUhvc3QpOwogICAgICAgIC8vIFNhdmUgbGlzdCBvZiBzdGFtcGVkIGNoaWxkcmVuCiAgICAgICAgbGV0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICAgIGZvciAobGV0IG4gPSB0aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKG4pOwogICAgICAgICAgbi5fX3RlbXBsYXRpemVJbnN0YW5jZSA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9fdGVtcGxhdGl6ZU93bmVyICYmCiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGl6ZU93bmVyLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXykgewogICAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbih0cnVlKTsKICAgICAgICB9CiAgICAgICAgLy8gRmx1c2ggcHJvcHMgb25seSB3aGVuIHByb3BzIGFyZSBwYXNzZWQgaWYgaW5zdGFuY2UgcHJvcHMgZXhpc3QKICAgICAgICAvLyBvciB3aGVuIHRoZXJlIGlzbid0IGluc3RhbmNlIHByb3BzLgogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmICgocHJvcHMgJiYgb3B0aW9ucy5pbnN0YW5jZVByb3BzKSB8fCAhb3B0aW9ucy5pbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDb25maWd1cmUgdGhlIGdpdmVuIGBwcm9wc2AgYnkgY2FsbGluZyBgX3NldFBlbmRpbmdQcm9wZXJ0eWAuIEFsc28KICAgICAgICogc2V0cyBhbnkgcHJvcGVydGllcyBzdG9yZWQgaW4gYF9faG9zdFByb3BzYC4KICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0eSBuYW1lLXZhbHVlIHBhaXJzIHRvIHNldC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9jb25maWd1cmVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnM7CiAgICAgICAgaWYgKG9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wKSB7CiAgICAgICAgICBmb3IgKGxldCBocHJvcCBpbiB0aGlzLl9faG9zdFByb3BzKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShocHJvcCwgdGhpcy5fX2RhdGFIb3N0WydfaG9zdF8nICsgaHByb3BdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gQW55IGluc3RhbmNlIHByb3BzIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3Igd2lsbCBvdmVyd3JpdGUgaG9zdCBwcm9wczsKICAgICAgICAvLyBub3JtYWxseSB0aGlzIHdvdWxkIGJlIGEgdXNlciBlcnJvciBidXQgd2UgZG9uJ3Qgc3BlY2lmaWNhbGx5IGZpbHRlciB0aGVtCiAgICAgICAgZm9yIChsZXQgaXByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShpcHJvcCwgcHJvcHNbaXByb3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZvcndhcmRzIGEgaG9zdCBwcm9wZXJ0eSB0byB0aGlzIGluc3RhbmNlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlCiAgICAgICAqIGNhbGxlZCBvbiBpbnN0YW5jZXMgZnJvbSB0aGUgYG9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wYCBjYWxsYmFjawogICAgICAgKiB0byBwcm9wYWdhdGUgY2hhbmdlcyBvZiBob3N0IHByb3BlcnRpZXMgdG8gZWFjaCBpbnN0YW5jZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBlbnF1ZXVlcyB0aGUgY2hhbmdlLCB3aGljaCBhcmUgZmx1c2hlZCBhcyBhIGJhdGNoLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSBvciBwYXRoIG5hbWUKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwcm9wLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YUhvc3QuX2VucXVldWVDbGllbnQodGhpcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIGlmICh0aGlzLl9tZXRob2RIb3N0ICYmIHRoaXMuX190ZW1wbGF0aXplT3B0aW9ucy5wYXJlbnRNb2RlbCkgewogICAgICAgICAgLy8gSWYgdGhpcyBpbnN0YW5jZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHBhcmVudCBtb2RlbCwgZGVjb3JhdGUKICAgICAgICAgIC8vIGV2ZW50cyB0aGlzIHRlbXBsYXRlIGluc3RhbmNlIGFzIGBtb2RlbGAKICAgICAgICAgIHRoaXMuX21ldGhvZEhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCAoZSkgPT4gewogICAgICAgICAgICBlLm1vZGVsID0gdGhpczsKICAgICAgICAgICAgaGFuZGxlcihlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBPdGhlcndpc2UgZGVsZWdhdGUgdG8gdGhlIHRlbXBsYXRlJ3MgaG9zdCAod2hpY2ggY291bGQgYmUpCiAgICAgICAgICAvLyBhbm90aGVyIHRlbXBsYXRlIGluc3RhbmNlCiAgICAgICAgICBsZXQgdGVtcGxhdGVIb3N0ID0gdGhpcy5fX2RhdGFIb3N0Ll9fZGF0YUhvc3Q7CiAgICAgICAgICBpZiAodGVtcGxhdGVIb3N0KSB7CiAgICAgICAgICAgIHRlbXBsYXRlSG9zdC5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogU2hvd3Mgb3IgaGlkZXMgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRvcCBsZXZlbCBjaGlsZCBlbGVtZW50cy4gRm9yCiAgICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICAgKiAic2hvd24uIgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhpZGUgU2V0IHRvIHRydWUgdG8gaGlkZSB0aGUgY2hpbGRyZW47CiAgICAgICAqIHNldCB0byBmYWxzZSB0byBzaG93IHRoZW0uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zaG93SGlkZUNoaWxkcmVuKGhpZGUpIHsKICAgICAgICBsZXQgYyA9IHRoaXMuY2hpbGRyZW47CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPGMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBuID0gY1tpXTsKICAgICAgICAgIC8vIElnbm9yZSBub24tY2hhbmdlcwogICAgICAgICAgaWYgKEJvb2xlYW4oaGlkZSkgIT0gQm9vbGVhbihuLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXykpIHsKICAgICAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyVGV4dENvbnRlbnRfXyA9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG4udGV4dENvbnRlbnQgPSBuLl9fcG9seW1lclRleHRDb250ZW50X187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAvLyByZW1vdmUgYW5kIHJlcGxhY2Ugc2xvdAogICAgICAgICAgICB9IGVsc2UgaWYgKG4ubG9jYWxOYW1lID09PSAnc2xvdCcpIHsKICAgICAgICAgICAgICBpZiAoaGlkZSkgewogICAgICAgICAgICAgICAgbi5fX3BvbHltZXJSZXBsYWNlZF9fID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnaGlkZGVuLXNsb3QnKTsKICAgICAgICAgICAgICAgIG4ucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobi5fX3BvbHltZXJSZXBsYWNlZF9fLCBuKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZSA9IG4uX19wb2x5bWVyUmVwbGFjZWRfXzsKICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlKSB7CiAgICAgICAgICAgICAgICAgIHJlcGxhY2UucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobiwgcmVwbGFjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNlIGlmIChuLnN0eWxlKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyRGlzcGxheV9fID0gbi5zdHlsZS5kaXNwbGF5OwogICAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuLnN0eWxlLmRpc3BsYXkgPSBuLl9fcG9seW1lckRpc3BsYXlfXzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG4uX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fID0gaGlkZTsKICAgICAgICAgIGlmIChuLl9zaG93SGlkZUNoaWxkcmVuKSB7CiAgICAgICAgICAgIG4uX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBwcm9wZXJ0eS1lZmZlY3RzIGltcGxlbWVudGF0aW9uIHRvIGludGVyY2VwdAogICAgICAgKiB0ZXh0Q29udGVudCBiaW5kaW5ncyB3aGlsZSBjaGlsZHJlbiBhcmUgImhpZGRlbiIgYW5kIGNhY2hlIGluCiAgICAgICAqIHByaXZhdGUgc3RvcmFnZSBmb3IgbGF0ZXIgcmV0cmlldmFsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBub2RlIHRvIHNldCBhIHByb3BlcnR5IG9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmIChub2RlLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyAmJgogICAgICAgICAgICBub2RlLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFICYmIHByb3AgPT0gJ3RleHRDb250ZW50JykgewogICAgICAgICAgbm9kZS5fX3BvbHltZXJUZXh0Q29udGVudF9fID0gdmFsdWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN1cGVyLl9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGaW5kIHRoZSBwYXJlbnQgbW9kZWwgb2YgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZS4gIFRoZSBwYXJlbnQgbW9kZWwKICAgICAgICogaXMgZWl0aGVyIGFub3RoZXIgdGVtcGxhdGl6ZSBpbnN0YW5jZSB0aGF0IGhhZCBvcHRpb24gYHBhcmVudE1vZGVsOiB0cnVlYCwKICAgICAgICogb3IgZWxzZSB0aGUgaG9zdCBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9IFRoZSBwYXJlbnQgbW9kZWwgb2YgdGhpcyBpbnN0YW5jZQogICAgICAgKi8KICAgICAgZ2V0IHBhcmVudE1vZGVsKCkgewogICAgICAgIGxldCBtb2RlbCA9IHRoaXMuX19wYXJlbnRNb2RlbDsKICAgICAgICBpZiAoIW1vZGVsKSB7CiAgICAgICAgICBsZXQgb3B0aW9uczsKICAgICAgICAgIG1vZGVsID0gdGhpczsKICAgICAgICAgIGRvIHsKICAgICAgICAgICAgLy8gQSB0ZW1wbGF0ZSBpbnN0YW5jZSdzIGBfX2RhdGFIb3N0YCBpcyBhIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgLy8gYG1vZGVsLl9fZGF0YUhvc3QuX19kYXRhSG9zdGAgaXMgdGhlIHRlbXBsYXRlJ3MgaG9zdAogICAgICAgICAgICBtb2RlbCA9IG1vZGVsLl9fZGF0YUhvc3QuX19kYXRhSG9zdDsKICAgICAgICAgIH0gd2hpbGUgKChvcHRpb25zID0gbW9kZWwuX190ZW1wbGF0aXplT3B0aW9ucykgJiYgIW9wdGlvbnMucGFyZW50TW9kZWwpOwogICAgICAgICAgdGhpcy5fX3BhcmVudE1vZGVsID0gbW9kZWw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0dWIgb2YgSFRNTEVsZW1lbnQncyBgZGlzcGF0Y2hFdmVudGAsIHNvIHRoYXQgZWZmZWN0cyB0aGF0IG1heQogICAgICAgKiBkaXNwYXRjaCBldmVudHMgc2FmZWx5IG5vLW9wLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCBFdmVudCB0byBkaXNwYXRjaAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBBbHdheXMgdHJ1ZS4KICAgICAgICovCiAgICAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKiogQHR5cGUgeyFEYXRhVGVtcGxhdGV9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX19kYXRhSG9zdDsKICAgIC8qKiBAdHlwZSB7IVRlbXBsYXRpemVPcHRpb25zfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fdGVtcGxhdGl6ZU9wdGlvbnM7CiAgICAvKiogQHR5cGUgeyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fbWV0aG9kSG9zdDsKICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPd25lcjsKICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX2hvc3RQcm9wczsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge1RlbXBsYXRlSW5zdGFuY2VCYXNlfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfTXV0YWJsZURhdGF9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBQb2x5bWVyLk11dGFibGVEYXRhKFRlbXBsYXRlSW5zdGFuY2VCYXNlKTsKCiAgICBmdW5jdGlvbiBmaW5kTWV0aG9kSG9zdCh0ZW1wbGF0ZSkgewogICAgICAvLyBUZWNobmljYWxseSB0aGlzIHNob3VsZCBiZSB0aGUgb3duZXIgb2YgdGhlIG91dGVybW9zdCB0ZW1wbGF0ZS4KICAgICAgLy8gSW4gc2hhZG93IGRvbSwgdGhpcyBpcyBhbHdheXMgZ2V0Um9vdE5vZGUoKS5ob3N0LCBidXQgd2UgY2FuCiAgICAgIC8vIGFwcHJveGltYXRlIHRoaXMgdmlhIGNvb3BlcmF0aW9uIHdpdGggb3VyIGRhdGFIb3N0IGFsd2F5cyBzZXR0aW5nCiAgICAgIC8vIGBfbWV0aG9kSG9zdGAgYXMgbG9uZyBhcyB0aGVyZSB3ZXJlIGJpbmRpbmdzIChvciBpZCdzKSBvbiB0aGlzCiAgICAgIC8vIGluc3RhbmNlIGNhdXNpbmcgaXQgdG8gZ2V0IGEgZGF0YUhvc3QuCiAgICAgIGxldCB0ZW1wbGF0ZUhvc3QgPSB0ZW1wbGF0ZS5fX2RhdGFIb3N0OwogICAgICByZXR1cm4gdGVtcGxhdGVIb3N0ICYmIHRlbXBsYXRlSG9zdC5fbWV0aG9kSG9zdCB8fCB0ZW1wbGF0ZUhvc3Q7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MgKi8KICAgIC8qKgogICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gY2xhc3MucHJvdG90eXBlIGlzIG5vdCBkZWZpbmVkIGZvciBzb21lIHJlYXNvbgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVUZW1wbGF0aXplckNsYXNzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgLy8gQW5vbnltb3VzIGNsYXNzIGNyZWF0ZWQgYnkgdGhlIHRlbXBsYXRpemUKICAgICAgbGV0IGJhc2UgPSBvcHRpb25zLm11dGFibGVEYXRhID8KICAgICAgICBNdXRhYmxlVGVtcGxhdGVJbnN0YW5jZUJhc2UgOiBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKICAgICAgLy8gQWZmb3JkYW5jZSBmb3IgZ2xvYmFsIG1peGlucyBvbnRvIFRlbXBsYXRpemVJbnN0YW5jZQogICAgICBpZiAoUG9seW1lci5UZW1wbGF0aXplLm1peGluKSB7CiAgICAgICAgYmFzZSA9IFBvbHltZXIuVGVtcGxhdGl6ZS5taXhpbihiYXNlKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAqIEBleHRlbmRzIHtiYXNlfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgbGV0IGtsYXNzID0gY2xhc3MgZXh0ZW5kcyBiYXNlIHsgfTsKICAgICAga2xhc3MucHJvdG90eXBlLl9fdGVtcGxhdGl6ZU9wdGlvbnMgPSBvcHRpb25zOwogICAgICBrbGFzcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgIGFkZE5vdGlmeUVmZmVjdHMoa2xhc3MsIHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBjbGFzcy5wcm90b3R5cGUgaXMgbm90IGRlZmluZWQgZm9yIHNvbWUgcmVhc29uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZFByb3BhZ2F0ZUVmZmVjdHModGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucykgewogICAgICBsZXQgdXNlckZvcndhcmRIb3N0UHJvcCA9IG9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wOwogICAgICBpZiAodXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICAgIC8vIFByb3ZpZGUgZGF0YSBBUEkgYW5kIHByb3BlcnR5IGVmZmVjdHMgb24gbWVtb2l6ZWQgdGVtcGxhdGUgY2xhc3MKICAgICAgICBsZXQga2xhc3MgPSB0ZW1wbGF0ZUluZm8udGVtcGxhdGl6ZVRlbXBsYXRlQ2xhc3M7CiAgICAgICAgaWYgKCFrbGFzcykgewogICAgICAgICAgbGV0IGJhc2UgPSBvcHRpb25zLm11dGFibGVEYXRhID8gTXV0YWJsZURhdGFUZW1wbGF0ZSA6IERhdGFUZW1wbGF0ZTsKICAgICAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICAgICAga2xhc3MgPSB0ZW1wbGF0ZUluZm8udGVtcGxhdGl6ZVRlbXBsYXRlQ2xhc3MgPQogICAgICAgICAgICBjbGFzcyBUZW1wbGF0aXplZFRlbXBsYXRlIGV4dGVuZHMgYmFzZSB7fTsKICAgICAgICAgIC8vIEFkZCB0ZW1wbGF0ZSAtID5pbnN0YW5jZXMgZWZmZWN0cwogICAgICAgICAgLy8gYW5kIGhvc3QgPC0gdGVtcGxhdGUgZWZmZWN0cwogICAgICAgICAgbGV0IGhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHM7CiAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIGhvc3RQcm9wcykgewogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KCdfaG9zdF8nICsgcHJvcCwKICAgICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLlBST1BBR0FURSwKICAgICAgICAgICAgICB7Zm46IGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChwcm9wLCB1c2VyRm9yd2FyZEhvc3RQcm9wKX0pOwogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KCdfaG9zdF8nICsgcHJvcCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHVwZ3JhZGVUZW1wbGF0ZSh0ZW1wbGF0ZSwga2xhc3MpOwogICAgICAgIC8vIE1peCBhbnkgcHJlLWJvdW5kIGRhdGEgaW50byBfX2RhdGE7IG5vIG5lZWQgdG8gZmx1c2ggdGhpcyB0bwogICAgICAgIC8vIGluc3RhbmNlcyBzaW5jZSB0aGV5IHB1bGwgZnJvbSB0aGUgdGVtcGxhdGUgYXQgaW5zdGFuY2UtdGltZQogICAgICAgIGlmICh0ZW1wbGF0ZS5fX2RhdGFQcm90bykgewogICAgICAgICAgLy8gTm90ZSwgZ2VuZXJhbGx5IGBfX2RhdGFQcm90b2AgY291bGQgYmUgY2hhaW5lZCwgYnV0IGl0J3MgZ3VhcmFudGVlZAogICAgICAgICAgLy8gdG8gbm90IGJlIHNpbmNlIHRoaXMgaXMgYSB2YW5pbGxhIHRlbXBsYXRlIHdlIGp1c3QgYWRkZWQgZWZmZWN0cyB0bwogICAgICAgICAgT2JqZWN0LmFzc2lnbih0ZW1wbGF0ZS5fX2RhdGEsIHRlbXBsYXRlLl9fZGF0YVByb3RvKTsKICAgICAgICB9CiAgICAgICAgLy8gQ2xlYXIgYW55IHBlbmRpbmcgZGF0YSBmb3IgcGVyZm9ybWFuY2UKICAgICAgICB0ZW1wbGF0ZS5fX2RhdGFUZW1wID0ge307CiAgICAgICAgdGVtcGxhdGUuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgdGVtcGxhdGUuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICB0ZW1wbGF0ZS5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIHZhbGlkLWpzZG9jICovCgogICAgZnVuY3Rpb24gY3JlYXRlRm9yd2FyZEhvc3RQcm9wRWZmZWN0KGhvc3RQcm9wLCB1c2VyRm9yd2FyZEhvc3RQcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBmb3J3YXJkSG9zdFByb3AodGVtcGxhdGUsIHByb3AsIHByb3BzKSB7CiAgICAgICAgdXNlckZvcndhcmRIb3N0UHJvcC5jYWxsKHRlbXBsYXRlLl9fdGVtcGxhdGl6ZU93bmVyLAogICAgICAgICAgcHJvcC5zdWJzdHJpbmcoJ19ob3N0XycubGVuZ3RoKSwgcHJvcHNbcHJvcF0pOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZE5vdGlmeUVmZmVjdHMoa2xhc3MsIHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgbGV0IGhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgfHwge307CiAgICAgIGZvciAobGV0IGlwcm9wIGluIG9wdGlvbnMuaW5zdGFuY2VQcm9wcykgewogICAgICAgIGRlbGV0ZSBob3N0UHJvcHNbaXByb3BdOwogICAgICAgIGxldCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wID0gb3B0aW9ucy5ub3RpZnlJbnN0YW5jZVByb3A7CiAgICAgICAgaWYgKHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApIHsKICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoaXByb3AsCiAgICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuTk9USUZZLAogICAgICAgICAgICB7Zm46IGNyZWF0ZU5vdGlmeUluc3RhbmNlUHJvcEVmZmVjdChpcHJvcCwgdXNlck5vdGlmeUluc3RhbmNlUHJvcCl9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wICYmIHRlbXBsYXRlLl9fZGF0YUhvc3QpIHsKICAgICAgICBmb3IgKGxldCBocHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoaHByb3AsCiAgICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuTk9USUZZLAogICAgICAgICAgICB7Zm46IGNyZWF0ZU5vdGlmeUhvc3RQcm9wRWZmZWN0KCl9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaW5zdFByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdGlmeUluc3RhbmNlUHJvcChpbnN0LCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJOb3RpZnlJbnN0YW5jZVByb3AuY2FsbChpbnN0Ll9fdGVtcGxhdGl6ZU93bmVyLAogICAgICAgICAgaW5zdCwgcHJvcCwgcHJvcHNbcHJvcF0pOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmeUhvc3RQcm9wRWZmZWN0KCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gbm90aWZ5SG9zdFByb3AoaW5zdCwgcHJvcCwgcHJvcHMpIHsKICAgICAgICBpbnN0Ll9fZGF0YUhvc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aCgnX2hvc3RfJyArIHByb3AsIHByb3BzW3Byb3BdLCB0cnVlLCB0cnVlKTsKICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIE1vZHVsZSBmb3IgcHJlcGFyaW5nIGFuZCBzdGFtcGluZyBpbnN0YW5jZXMgb2YgdGVtcGxhdGVzIHRoYXQgdXRpbGl6ZQogICAgICogUG9seW1lcidzIGRhdGEtYmluZGluZyBhbmQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXIgZmVhdHVyZXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgbGV0IFRlbXBsYXRlQ2xhc3MgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSk7CiAgICAgKiAgICAgLy8gSW5zdGFuY2UgdGhlIHRlbXBsYXRlIHdpdGggYW4gaW5pdGlhbCBkYXRhIG1vZGVsCiAgICAgKiAgICAgbGV0IGluc3RhbmNlID0gbmV3IFRlbXBsYXRlQ2xhc3Moe215UHJvcDogJ2luaXRpYWwnfSk7CiAgICAgKiAgICAgLy8gSW5zZXJ0IHRoZSBpbnN0YW5jZSdzIERPTSBzb21ld2hlcmUsIGUuZy4gZWxlbWVudCdzIHNoYWRvdyBET00KICAgICAqICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoaW5zdGFuY2Uucm9vdCk7CiAgICAgKiAgICAgLy8gQ2hhbmdpbmcgYSBwcm9wZXJ0eSBvbiB0aGUgaW5zdGFuY2Ugd2lsbCBwcm9wYWdhdGUgdG8gYmluZGluZ3MKICAgICAqICAgICAvLyBpbiB0aGUgdGVtcGxhdGUKICAgICAqICAgICBpbnN0YW5jZS5teVByb3AgPSAnbmV3IHZhbHVlJzsKICAgICAqCiAgICAgKiBUaGUgYG9wdGlvbnNgIGRpY3Rpb25hcnkgcGFzc2VkIHRvIGB0ZW1wbGF0aXplYCBhbGxvd3MgZm9yIGN1c3RvbWl6aW5nCiAgICAgKiBmZWF0dXJlcyBvZiB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIGNsYXNzLCBpbmNsdWRpbmcgaG93IG91dGVyLXNjb3BlIGhvc3QKICAgICAqIHByb3BlcnRpZXMgc2hvdWxkIGJlIGZvcndhcmRlZCBpbnRvIHRlbXBsYXRlIGluc3RhbmNlcywgaG93IGFueSBpbnN0YW5jZQogICAgICogcHJvcGVydGllcyBhZGRlZCBpbnRvIHRoZSB0ZW1wbGF0ZSdzIHNjb3BlIHNob3VsZCBiZSBub3RpZmllZCBvdXQgdG8KICAgICAqIHRoZSBob3N0LCBhbmQgd2hldGhlciB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlIGRlY29yYXRlZCBhcyBhICJwYXJlbnQgbW9kZWwiCiAgICAgKiBvZiBhbnkgZXZlbnQgaGFuZGxlcnMuCiAgICAgKgogICAgICogICAgIC8vIEN1c3RvbWl6ZSBwcm9wZXJ0eSBmb3J3YXJkaW5nIGFuZCBldmVudCBtb2RlbCBkZWNvcmF0aW9uCiAgICAgKiAgICAgbGV0IFRlbXBsYXRlQ2xhc3MgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICogICAgICAgcGFyZW50TW9kZWw6IHRydWUsCiAgICAgKiAgICAgICBmb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKSB7Li4ufSwKICAgICAqICAgICAgIGluc3RhbmNlUHJvcHM6IHsuLi59LAogICAgICogICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wKGluc3RhbmNlLCBwcm9wZXJ0eSwgdmFsdWUpIHsuLi59LAogICAgICogICAgIH0pOwogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBNb2R1bGUgZm9yIHByZXBhcmluZyBhbmQgc3RhbXBpbmcgaW5zdGFuY2VzIG9mIHRlbXBsYXRlcwogICAgICogICB1dGlsaXppbmcgUG9seW1lciB0ZW1wbGF0aW5nIGZlYXR1cmVzLgogICAgICovCiAgICBQb2x5bWVyLlRlbXBsYXRpemUgPSB7CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBjbGFzcyBib3VuZCB0byB0aGUKICAgICAgICogYDx0ZW1wbGF0ZT5gIHByb3ZpZGVkLiAgSW5zdGFuY2luZyB0aGUgY2xhc3Mgd2lsbCByZXN1bHQgaW4gdGhlCiAgICAgICAqIHRlbXBsYXRlIGJlaW5nIHN0YW1wZWQgaW50byBhIGRvY3VtZW50IGZyYWdtZW50IHN0b3JlZCBhcyB0aGUgaW5zdGFuY2UncwogICAgICAgKiBgcm9vdGAgcHJvcGVydHksIGFmdGVyIHdoaWNoIGl0IGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgRE9NLgogICAgICAgKgogICAgICAgKiBUZW1wbGF0ZXMgbWF5IHV0aWxpemUgYWxsIFBvbHltZXIgZGF0YS1iaW5kaW5nIGZlYXR1cmVzIGFzIHdlbGwgYXMKICAgICAgICogZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLiAgRXZlbnQgbGlzdGVuZXJzIGFuZCBpbmxpbmUgY29tcHV0aW5nCiAgICAgICAqIGZ1bmN0aW9ucyBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBjYWxsZWQgb24gdGhlIGhvc3Qgb2YgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBUaGUgY29uc3RydWN0b3IgcmV0dXJuZWQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgZGljdGlvbmFyeSBvZiBpbml0aWFsCiAgICAgICAqIHByb3BlcnR5IHZhbHVlcyB0byBwcm9wYWdhdGUgaW50byB0ZW1wbGF0ZSBiaW5kaW5ncy4gIEFkZGl0aW9uYWxseQogICAgICAgKiBob3N0IHByb3BlcnRpZXMgY2FuIGJlIGZvcndhcmRlZCBpbiwgYW5kIGluc3RhbmNlIHByb3BlcnRpZXMgY2FuIGJlCiAgICAgICAqIG5vdGlmaWVkIG91dCBieSBwcm92aWRpbmcgb3B0aW9uYWwgY2FsbGJhY2tzIGluIHRoZSBgb3B0aW9uc2AgZGljdGlvbmFyeS4KICAgICAgICoKICAgICAgICogVmFsaWQgY29uZmlndXJhdGlvbiBpbiBgb3B0aW9uc2AgYXJlIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIC0gYGZvcndhcmRIb3N0UHJvcChwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSByZWZlcmVuY2VkCiAgICAgICAqICAgaW4gdGhlIHRlbXBsYXRlIGNoYW5nZWQgb24gdGhlIHRlbXBsYXRlJ3MgaG9zdC4gQXMgdGhpcyBsaWJyYXJ5IGRvZXMKICAgICAgICogICBub3QgcmV0YWluIHJlZmVyZW5jZXMgdG8gdGVtcGxhdGVzIGluc3RhbmNlZCBieSB0aGUgdXNlciwgaXQgaXMgdGhlCiAgICAgICAqICAgdGVtcGxhdGl6ZSBvd25lcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZvcndhcmQgaG9zdCBwcm9wZXJ0eSBjaGFuZ2VzIGludG8KICAgICAgICogICB1c2VyLXN0YW1wZWQgaW5zdGFuY2VzLiAgVGhlIGBpbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKWAKICAgICAgICogICAgbWV0aG9kIG9uIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgc2hvdWxkIGJlIGNhbGxlZCB0byBmb3J3YXJkIGhvc3QKICAgICAgICogICBwcm9wZXJ0aWVzIGludG8gdGhlIHRlbXBsYXRlIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcHJvcGVydHktY2hhbmdlZAogICAgICAgKiAgIG5vdGlmaWNhdGlvbnMuIEFueSBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdAogICAgICAgKiAgIGRlZmluZWQgaW4gYGluc3RhbmNlUHJvcHNgIHdpbGwgYmUgbm90aWZpZWQgdXAgdG8gdGhlIHRlbXBsYXRlJ3MgaG9zdAogICAgICAgKiAgIGF1dG9tYXRpY2FsbHkuCiAgICAgICAqIC0gYGluc3RhbmNlUHJvcHNgOiBEaWN0aW9uYXJ5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgd2lsbCBiZSBhZGRlZAogICAgICAgKiAgIHRvIHRoZSBpbnN0YW5jZSBieSB0aGUgdGVtcGxhdGl6ZSBvd25lci4gIFRoZXNlIHByb3BlcnRpZXMgc2hhZG93IGFueQogICAgICAgKiAgIGhvc3QgcHJvcGVydGllcywgYW5kIGNoYW5nZXMgd2l0aGluIHRoZSB0ZW1wbGF0ZSB0byB0aGVzZSBwcm9wZXJ0aWVzCiAgICAgICAqICAgd2lsbCByZXN1bHQgaW4gYG5vdGlmeUluc3RhbmNlUHJvcGAgYmVpbmcgY2FsbGVkLgogICAgICAgKiAtIGBtdXRhYmxlRGF0YWA6IFdoZW4gYHRydWVgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIHdpbGwgc2tpcCBzdHJpY3QKICAgICAgICogICBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAgICAgKiAgICJkaXJ0eSIpLgogICAgICAgKiAtIGBub3RpZnlJbnN0YW5jZVByb3AoaW5zdGFuY2UsIHByb3BlcnR5LCB2YWx1ZSlgOiBDYWxsZWQgd2hlbgogICAgICAgKiAgIGFuIGluc3RhbmNlIHByb3BlcnR5IGNoYW5nZXMuICBVc2VycyBtYXkgY2hvb3NlIHRvIGNhbGwgYG5vdGlmeVBhdGhgCiAgICAgICAqICAgb24gZS5nLiB0aGUgb3duZXIgdG8gbm90aWZ5IHRoZSBjaGFuZ2UuCiAgICAgICAqIC0gYHBhcmVudE1vZGVsYDogV2hlbiBgdHJ1ZWAsIGV2ZW50cyBoYW5kbGVkIGJ5IGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycwogICAgICAgKiAgIChgb24tZXZlbnQ9ImhhbmRsZXIiYCkgd2lsbCBiZSBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHkgcG9pbnRpbmcKICAgICAgICogICB0byB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhhdCBzdGFtcGVkIGl0LiAgSXQgd2lsbCBhbHNvIGJlIHJldHVybmVkCiAgICAgICAqICAgZnJvbSBgaW5zdGFuY2UucGFyZW50TW9kZWxgIGluIGNhc2VzIHdoZXJlIHRlbXBsYXRlIGluc3RhbmNlIG5lc3RpbmcKICAgICAgICogICBjYXVzZXMgYW4gaW5uZXIgbW9kZWwgdG8gc2hhZG93IGFuIG91dGVyIG1vZGVsLgogICAgICAgKgogICAgICAgKiBBbGwgY2FsbGJhY2tzIGFyZSBjYWxsZWQgYm91bmQgdG8gdGhlIGBvd25lcmAuIEFueSBjb250ZXh0CiAgICAgICAqIG5lZWRlZCBmb3IgdGhlIGNhbGxiYWNrcyAoc3VjaCBhcyByZWZlcmVuY2VzIHRvIGBpbnN0YW5jZXNgIHN0YW1wZWQpCiAgICAgICAqIHNob3VsZCBiZSBzdG9yZWQgb24gdGhlIGBvd25lcmAgc3VjaCB0aGF0IHRoZXkgY2FuIGJlIHJldHJpZXZlZCB2aWEKICAgICAgICogYHRoaXNgLgogICAgICAgKgogICAgICAgKiBXaGVuIGBvcHRpb25zLmZvcndhcmRIb3N0UHJvcGAgaXMgZGVjbGFyZWQgYXMgYW4gb3B0aW9uLCBhbnkgcHJvcGVydGllcwogICAgICAgKiByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZm9yd2FyZGVkIGZyb20gdGhlIGhvc3Qgb2YKICAgICAgICogdGhlIGA8dGVtcGxhdGU+YCB0byBpbnN0YW5jZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhbnkgcHJvcGVydGllcyBsaXN0ZWQgaW4KICAgICAgICogdGhlIGBvcHRpb25zLmluc3RhbmNlUHJvcHNgIG9iamVjdC4gIGBpbnN0YW5jZVByb3BzYCBhcmUgYXNzdW1lZCB0byBiZQogICAgICAgKiBtYW5hZ2VkIGJ5IHRoZSBvd25lciBvZiB0aGUgaW5zdGFuY2VzLCBlaXRoZXIgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yCiAgICAgICAqIG9yIHNldCBhZnRlciB0aGUgZmFjdC4gIE5vdGUsIGFueSBwcm9wZXJ0aWVzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsCiAgICAgICAqIGFsd2F5cyBiZSBzZXQgdG8gdGhlIGluc3RhbmNlIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSB3b3VsZCBub3JtYWxseQogICAgICAgKiBiZSBmb3J3YXJkZWQgZnJvbSB0aGUgaG9zdCkuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCBgdGVtcGxhdGl6ZSgpYCBjYW4gYmUgcnVuIG9ubHkgb25jZSBmb3IgYSBnaXZlbiBgPHRlbXBsYXRlPmAuCiAgICAgICAqIEZ1cnRoZXIgY2FsbHMgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuIEFsc28sIHRoZXJlIGlzIGEgc3BlY2lhbAogICAgICAgKiBiZWhhdmlvciBpZiB0aGUgdGVtcGxhdGUgd2FzIGR1cGxpY2F0ZWQgdGhyb3VnaCBhIG1lY2hhbmlzbSBzdWNoIGFzCiAgICAgICAqIGA8ZG9tLXJlcGVhdD5gIG9yIGA8dGVzdC1maXh0dXJlPmAuIEluIHRoaXMgY2FzZSwgYWxsIGNhbGxzIHRvCiAgICAgICAqIGB0ZW1wbGF0aXplKClgIHJldHVybiB0aGUgc2FtZSBjbGFzcyBmb3IgYWxsIGR1cGxpY2F0ZXMgb2YgYSB0ZW1wbGF0ZS4KICAgICAgICogVGhlIGNsYXNzIHJldHVybmVkIGZyb20gYHRlbXBsYXRpemUoKWAgaXMgZ2VuZXJhdGVkIG9ubHkgb25jZSB1c2luZwogICAgICAgKiB0aGUgYG9wdGlvbnNgIGZyb20gdGhlIGZpcnN0IGNhbGwuIFRoaXMgbWVhbnMgdGhhdCBhbnkgYG9wdGlvbnNgCiAgICAgICAqIHByb3ZpZGVkIHRvIHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGVyZWZvcmUsIGl0IGlzIHZlcnkKICAgICAgICogaW1wb3J0YW50IG5vdCB0byBjbG9zZSBvdmVyIGFueSB2YXJpYWJsZXMgaW5zaWRlIHRoZSBjYWxsYmFja3MuIEFsc28sCiAgICAgICAqIGFycm93IGZ1bmN0aW9ucyBtdXN0IGJlIGF2b2lkZWQgYmVjYXVzZSB0aGV5IGJpbmQgdGhlIG91dGVyIGB0aGlzYC4KICAgICAgICogSW5zaWRlIHRoZSBjYWxsYmFja3MsIGFueSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGNhbiBiZSBhY2Nlc3NlZAogICAgICAgKiB0aHJvdWdoIGB0aGlzYCwgd2hpY2ggcG9pbnRzIHRvIHRoZSBgb3duZXJgLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5UZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0cz19IG93bmVyIE93bmVyIG9mIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZXM7CiAgICAgICAqICAgYW55IG9wdGlvbmFsIGNhbGxiYWNrcyB3aWxsIGJlIGJvdW5kIHRvIHRoaXMgb3duZXIuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBPcHRpb25zIGRpY3Rpb25hcnkgKHNlZSBzdW1tYXJ5IGZvciBkZXRhaWxzKQogICAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VGVtcGxhdGVJbnN0YW5jZUJhc2UpfSBHZW5lcmF0ZWQgY2xhc3MgYm91bmQgdG8gdGhlIHRlbXBsYXRlCiAgICAgICAqICAgcHJvdmlkZWQKICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICAgICAqLwogICAgICB0ZW1wbGF0aXplKHRlbXBsYXRlLCBvd25lciwgb3B0aW9ucykgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCB0aGUgdGVtcGxhdGl6ZWQgZWxlbWVudCBtdXN0IGJlIG93bmVkCiAgICAgICAgLy8gYnkgYSAodHJ1c3RlZCkgUG9seW1lciBlbGVtZW50LCBpbmRpY2F0ZWQgYnkgZXhpc3RlbmNlIG9mIF9tZXRob2RIb3N0OwogICAgICAgIC8vIGUuZy4gZm9yIGRvbS1pZiAmIGRvbS1yZXBlYXQgaW4gbWFpbiBkb2N1bWVudCwgX21ldGhvZEhvc3QgaXMgbnVsbAogICAgICAgIGlmIChQb2x5bWVyLnN0cmljdFRlbXBsYXRlUG9saWN5ICYmICFmaW5kTWV0aG9kSG9zdCh0ZW1wbGF0ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaWN0VGVtcGxhdGVQb2xpY3k6IHRlbXBsYXRlIG93bmVyIG5vdCB0cnVzdGVkJyk7CiAgICAgICAgfQogICAgICAgIG9wdGlvbnMgPSAvKiogQHR5cGUgeyFUZW1wbGF0aXplT3B0aW9uc30gKi8ob3B0aW9ucyB8fCB7fSk7CiAgICAgICAgaWYgKHRlbXBsYXRlLl9fdGVtcGxhdGl6ZU93bmVyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgPHRlbXBsYXRlPiBjYW4gb25seSBiZSB0ZW1wbGF0aXplZCBvbmNlJyk7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlLl9fdGVtcGxhdGl6ZU93bmVyID0gb3duZXI7CiAgICAgICAgY29uc3QgY3RvciA9IG93bmVyID8gb3duZXIuY29uc3RydWN0b3IgOiBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gY3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgLy8gR2V0IG1lbW9pemVkIGJhc2UgY2xhc3MgZm9yIHRoZSBwcm90b3R5cGljYWwgdGVtcGxhdGUsIHdoaWNoCiAgICAgICAgLy8gaW5jbHVkZXMgcHJvcGVydHkgZWZmZWN0cyBmb3IgYmluZGluZyB0ZW1wbGF0ZSAmIGZvcndhcmRpbmcKICAgICAgICBsZXQgYmFzZUNsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVJbnN0YW5jZUNsYXNzOwogICAgICAgIGlmICghYmFzZUNsYXNzKSB7CiAgICAgICAgICBiYXNlQ2xhc3MgPSBjcmVhdGVUZW1wbGF0aXplckNsYXNzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVJbnN0YW5jZUNsYXNzID0gYmFzZUNsYXNzOwogICAgICAgIH0KICAgICAgICAvLyBIb3N0IHByb3BlcnR5IGZvcndhcmRpbmcgbXVzdCBiZSBpbnN0YWxsZWQgb250byB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgIGFkZFByb3BhZ2F0ZUVmZmVjdHModGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucyk7CiAgICAgICAgLy8gU3ViY2xhc3MgYmFzZSBjbGFzcyBhbmQgYWRkIHJlZmVyZW5jZSBmb3IgdGhpcyBzcGVjaWZpYyB0ZW1wbGF0ZQogICAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICAgIGxldCBrbGFzcyA9IGNsYXNzIFRlbXBsYXRlSW5zdGFuY2UgZXh0ZW5kcyBiYXNlQ2xhc3Mge307CiAgICAgICAga2xhc3MucHJvdG90eXBlLl9tZXRob2RIb3N0ID0gZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX2RhdGFIb3N0ID0gdGVtcGxhdGU7CiAgICAgICAga2xhc3MucHJvdG90eXBlLl9fdGVtcGxhdGl6ZU93bmVyID0gb3duZXI7CiAgICAgICAga2xhc3MucHJvdG90eXBlLl9faG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wczsKICAgICAgICBrbGFzcyA9IC8qKiBAdHlwZSB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlKX0gKi8oa2xhc3MpOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1hc3NpZ24KICAgICAgICByZXR1cm4ga2xhc3M7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICAgKiBzZXJ2ZXMgYXMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0aGUgZWxlbWVudCBpcwogICAgICAgKiBjb250YWluZWQgaW4uIEEgdGVtcGxhdGUgbW9kZWwgaXMgYW4gaW5zdGFuY2Ugb2YKICAgICAgICogYFRlbXBsYXRlSW5zdGFuY2VCYXNlYCwgYW5kIHNob3VsZCBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YQogICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZS4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICBsZXQgbW9kZWwgPSBtb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgICAqICAgICBtb2RlbC5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpOwogICAgICAgKiAgIH0KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuVGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRoZSBtb2RlbCB3aWxsIGJlIHJldHVybmVkIGZvcgogICAgICAgKiAgIGVsZW1lbnRzIHN0YW1wZWQgZnJvbSB0aGlzIHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZT19IG5vZGUgTm9kZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGEgdGVtcGxhdGUgbW9kZWwuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBUZW1wbGF0ZSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlCiAgICAgICAqICAgYmluZGluZyBzY29wZSBmb3IgdGhlIGVsZW1lbnQKICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudCh0ZW1wbGF0ZSwgbm9kZSkgewogICAgICAgIGxldCBtb2RlbDsKICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgLy8gQW4gZWxlbWVudCB3aXRoIGEgX190ZW1wbGF0aXplSW5zdGFuY2UgbWFya3MgdGhlIHRvcCBib3VuZGFyeQogICAgICAgICAgLy8gb2YgYSBzY29wZTsgd2FsayB1cCB1bnRpbCB3ZSBmaW5kIG9uZSwgYW5kIHRoZW4gZW5zdXJlIHRoYXQKICAgICAgICAgIC8vIGl0cyBfX2RhdGFIb3N0IG1hdGNoZXMgYHRoaXNgLCBtZWFuaW5nIHRoaXMgZG9tLXJlcGVhdCBzdGFtcGVkIGl0CiAgICAgICAgICBpZiAoKG1vZGVsID0gbm9kZS5fX3RlbXBsYXRpemVJbnN0YW5jZSkpIHsKICAgICAgICAgICAgLy8gRm91bmQgYW4gZWxlbWVudCBzdGFtcGVkIGJ5IGFub3RoZXIgdGVtcGxhdGU7IGtlZXAgd2Fsa2luZyB1cAogICAgICAgICAgICAvLyBmcm9tIGl0cyBfX2RhdGFIb3N0CiAgICAgICAgICAgIGlmIChtb2RlbC5fX2RhdGFIb3N0ICE9IHRlbXBsYXRlKSB7CiAgICAgICAgICAgICAgbm9kZSA9IG1vZGVsLl9fZGF0YUhvc3Q7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBTdGlsbCBpbiBhIHRlbXBsYXRlIHNjb3BlLCBrZWVwIGdvaW5nIHVwIHVudGlsCiAgICAgICAgICAgIC8vIGEgX190ZW1wbGF0aXplSW5zdGFuY2UgaXMgZm91bmQKICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH07CgogICAgUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZSA9IFRlbXBsYXRlSW5zdGFuY2VCYXNlOwoKICB9KSgpOwoKPC9zY3JpcHQ+PHNjcmlwdD4KICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIC8qKgogICAgICogQHR5cGVkZWYge3sKICAgICAqICAgX3RlbXBsYXRpemVyVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQsCiAgICAgKiAgIF9wYXJlbnRNb2RlbDogYm9vbGVhbiwKICAgICAqICAgX2luc3RhbmNlUHJvcHM6IE9iamVjdCwKICAgICAqICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgY3RvcjogVGVtcGxhdGVJbnN0YW5jZUJhc2UKICAgICAqIH19CiAgICAgKi8KICAgIGxldCBUZW1wbGF0aXplclVzZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIFRoZSBgUG9seW1lci5UZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYAogICAgICogaW5zdGFuY2Ugd2hlcmUgZGF0YS1iaW5kaW5ncyBpbiB0aGUgc3RhbXBlZCB0ZW1wbGF0ZSBjb250ZW50IGFyZSBib3VuZCB0bwogICAgICogYWNjZXNzb3JzIG9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIHByb3ZpZGVkIGluIFBvbHltZXIgMi54IGFzIGEgaHlicmlkLWVsZW1lbnQgY29udmVuaWVuY2UKICAgICAqIG9ubHkuICBGb3Igbm9uLWh5YnJpZCB1c2FnZSwgdGhlIGBQb2x5bWVyLlRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVXNlcnMgb2YgYFRlbXBsYXRpemVyYCBtYXkgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhYnN0cmFjdAogICAgICogQVBJJ3MgdG8gZGV0ZXJtaW5lIGhvdyBwcm9wZXJ0aWVzIGFuZCBwYXRocyBmcm9tIHRoZSBob3N0IHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIGludG8gdG8gaW5zdGFuY2VzOgogICAgICoKICAgICAqICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIExpa2V3aXNlLCB1c2VycyBtYXkgaW1wbGVtZW50IHRoZXNlIGFkZGl0aW9uYWwgYWJzdHJhY3QgQVBJJ3MgdG8gZGV0ZXJtaW5lCiAgICAgKiBob3cgaW5zdGFuY2Utc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNoYW5nZSBvbiB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCiAgICAgKiBmb3J3YXJkZWQgb3V0IHRvIHRoZSBob3N0LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogICAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljIGFuZCByZXF1aXJlCiAgICAgKiBjdXN0b20gbm90aWZpY2F0aW9uIHZpYSBgX25vdGlmeUluc3RhbmNlUHJvcGAsIGRlZmluZSBhbiBgX2luc3RhbmNlUHJvcHNgCiAgICAgKiBvYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBlYWNoIGluc3RhbmNlIHByb3AsIGZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICBfaW5zdGFuY2VQcm9wczogewogICAgICogICAgICAgaXRlbTogdHJ1ZSwKICAgICAqICAgICAgIGluZGV4OiB0cnVlCiAgICAgKiAgICAgfQogICAgICoKICAgICAqIEFueSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIF9pbnN0YW5jZVByb3AKICAgICAqIHdpbGwgYmUgZm9yd2FyZGVkIG91dCB0byB0aGUgVGVtcGxhdGl6ZSBgb3duZXJgIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogVXNlcnMgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgZnVuY3Rpb24gdG8gc2hvdyBvcgogICAgICogaGlkZSBhbnkgRE9NIGdlbmVyYXRlZCB1c2luZyBgc3RhbXBgOgogICAgICoKICAgICAqICAgICBfc2hvd0hpZGVDaGlsZHJlbjogZnVuY3Rpb24oc2hvdWxkSGlkZSkKICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBjYWxsYmFja3MgYXJlIHN1ZmZpeGVkIHdpdGggYFYyYCBpbiB0aGUgUG9seW1lciAyLnggYmVoYXZpb3IKICAgICAqIGFzIHRoZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIGRpZmZlciBmcm9tIHRoZSBjYWxsYmFja3MgcmVxdWlyZWQKICAgICAqIGJ5IHRoZSAxLnggVGVtcGxhdGl6ZXIgQVBJIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgQVBJCiAgICAgKiBiZXR3ZWVuIHZlcnNpb25zIDEueCBhbmQgMi54LgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplciA9IHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgYW4gYW5vbnltb3VzIGBUZW1wbGF0ZUluc3RhbmNlYCBjbGFzcyAoc3RvcmVkIGFzIGB0aGlzLmN0b3JgKQogICAgICAgKiBmb3IgdGhlIHByb3ZpZGVkIHRlbXBsYXRlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlcgogICAgICAgKiB0ZW1wbGF0ZSB0byBwcmVwYXJlIGFuIGVsZW1lbnQgZm9yIHN0YW1waW5nIHRoZSB0ZW1wbGF0ZSwgZm9sbG93ZWQKICAgICAgICogYnkgYHN0YW1wYCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHByZXBhcmUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gbXV0YWJsZURhdGEgV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwCiAgICAgICAqICAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvCiAgICAgICAqICAgYmUgImRpcnR5IikuIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgbXV0YWJsZURhdGEpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgdGhpcy5jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuKG11dGFibGVEYXRhKSwKICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHRoaXMuX2luc3RhbmNlUHJvcHMsCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IHRoaXMuX2ZvcndhcmRIb3N0UHJvcFYyLAogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHByZXBhcmVkIGJ5IGB0ZW1wbGF0aXplYC4gIFRoZSBvYmplY3QKICAgICAgICogcmV0dXJuZWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFub255bW91cyBjbGFzcyBnZW5lcmF0ZWQgYnkgYHRlbXBsYXRpemVgCiAgICAgICAqIHdob3NlIGByb290YCBwcm9wZXJ0eSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgbmV3bHkgY2xvbmVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCB3aGljaCBoYXMgcHJvcGVydHkgYWNjZXNzb3JzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICogcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG1vZGVsIE9iamVjdCBjb250YWluaW5nIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzIHRvCiAgICAgICAqICAgcG9wdWxhdGUgaW50byB0aGUgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBSZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlIG9mCiAgICAgICAqIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBzdGFtcChtb2RlbCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jdG9yKG1vZGVsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIChgVGVtcGxhdGVJbnN0YW5jZWApIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbi4gIEEgdGVtcGxhdGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQKICAgICAgICogdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IE1vZGVsIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAgICogICB0aGUgZWxlbWVudC4KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgfSkoKTsKPC9zY3JpcHQ+PHNjcmlwdD4KCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7SFRNTEVsZW1lbnR9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgZG9tQmluZEJhc2UgPQogICAgICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycygKICAgICAgICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEoCiAgICAgICAgICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhIVE1MRWxlbWVudCkpKTsKCiAgICAvKioKICAgICAqIEN1c3RvbSBlbGVtZW50IHRvIGFsbG93IHVzaW5nIFBvbHltZXIncyB0ZW1wbGF0ZSBmZWF0dXJlcyAoZGF0YSBiaW5kaW5nLAogICAgICogZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudCB3aXRob3V0IGRlZmluaW5nCiAgICAgKiBhIG5ldyBjdXN0b20gZWxlbWVudC4KICAgICAqCiAgICAgKiBgPHRlbXBsYXRlPmAgdGFncyB1dGlsaXppbmcgYmluZGluZ3MgbWF5IGJlIHdyYXBwZWQgd2l0aCB0aGUgYDxkb20tYmluZD5gCiAgICAgKiBlbGVtZW50LCB3aGljaCB3aWxsIGltbWVkaWF0ZWx5IHN0YW1wIHRoZSB3cmFwcGVkIHRlbXBsYXRlIGludG8gdGhlIG1haW4KICAgICAqIGRvY3VtZW50IGFuZCBiaW5kIGVsZW1lbnRzIHRvIHRoZSBgZG9tLWJpbmRgIGVsZW1lbnQgaXRzZWxmIGFzIHRoZQogICAgICogYmluZGluZyBzY29wZS4KICAgICAqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhCiAgICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICAgKiBAZXh0ZW5kcyB7ZG9tQmluZEJhc2V9CiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhCiAgICAgKiAgIGJpbmRpbmcsIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycywgZXRjLikgaW4gdGhlIG1haW4gZG9jdW1lbnQuCiAgICAgKi8KICAgIGNsYXNzIERvbUJpbmQgZXh0ZW5kcyBkb21CaW5kQmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsgcmV0dXJuIFsnbXV0YWJsZS1kYXRhJ107IH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1iaW5kIG5vdCBhbGxvd2VkYCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucm9vdCA9IG51bGw7CiAgICAgICAgdGhpcy4kID0gbnVsbDsKICAgICAgICB0aGlzLl9fY2hpbGRyZW4gPSBudWxsOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCkgewogICAgICAgIC8vIGFzc3VtZXMgb25seSBvbmUgb2JzZXJ2ZWQgYXR0cmlidXRlCiAgICAgICAgdGhpcy5tdXRhYmxlRGF0YSA9IHRydWU7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuX19yZW1vdmVDaGlsZHJlbigpOwogICAgICB9CgogICAgICBfX2luc2VydENoaWxkcmVuKCkgewogICAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5yb290LCB0aGlzKTsKICAgICAgfQoKICAgICAgX19yZW1vdmVDaGlsZHJlbigpIHsKICAgICAgICBpZiAodGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLl9fY2hpbGRyZW5baV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlcyB0aGUgZWxlbWVudCB0byByZW5kZXIgaXRzIGNvbnRlbnQuIFRoaXMgaXMgdHlwaWNhbGx5IG9ubHkKICAgICAgICogbmVjZXNzYXJ5IHRvIGNhbGwgaWYgSFRNTEltcG9ydHMgd2l0aCB0aGUgYXN5bmMgYXR0cmlidXRlIGFyZSB1c2VkLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVuZGVyKCkgewogICAgICAgIGxldCB0ZW1wbGF0ZTsKICAgICAgICBpZiAoIXRoaXMuX19jaGlsZHJlbikgewogICAgICAgICAgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRlbXBsYXRlIHx8IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWJpbmQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgICAgdGhpcy4kID0gdGhpcy5yb290LiQ7CiAgICAgICAgICB0aGlzLl9fY2hpbGRyZW4gPSBbXTsKICAgICAgICAgIGZvciAobGV0IG49dGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgICB0aGlzLl9fY2hpbGRyZW5bdGhpcy5fX2NoaWxkcmVuLmxlbmd0aF0gPSBuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9faW5zZXJ0Q2hpbGRyZW4oKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb20tY2hhbmdlJywgewogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9CgogICAgfQoKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZG9tLWJpbmQnLCBEb21CaW5kKTsKCiAgICAvKiogQGNvbnN0ICovCiAgICBQb2x5bWVyLkRvbUJpbmQgPSBEb21CaW5kOwoKICB9KSgpOwoKPC9zY3JpcHQ+PHNjcmlwdD4KICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBDbGFzcyByZXByZXNlbnRpbmcgYSBzdGF0aWMgc3RyaW5nIHZhbHVlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbHRlcgogICAgICogc3RyaW5ncyBieSBhc3NldGluZyB0aGF0IHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQgdmlhIHRoaXMgY2xhc3MuIFRoZQogICAgICogYHZhbHVlYCBwcm9wZXJ0eSByZXR1cm5zIHRoZSBzdHJpbmcgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KICAgICAqLwogICAgY2xhc3MgTGl0ZXJhbFN0cmluZyB7CiAgICAgIGNvbnN0cnVjdG9yKHN0cmluZykgewogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMudmFsdWUgPSBzdHJpbmcudG9TdHJpbmcoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXRlcmFsU3RyaW5nIHN0cmluZyB2YWx1ZQogICAgICAgKi8KICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgT2JqZWN0IHRvIHN0cmluZ2lmeSBpbnRvIEhUTUwKICAgICAqIEByZXR1cm4ge3N0cmluZ30gSFRNTCBzdHJpbmdpZmllZCBmb3JtIG9mIGBvYmpgCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxpdGVyYWxWYWx1ZSh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7IUxpdGVyYWxTdHJpbmd9ICovKHZhbHVlKS52YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vbi1saXRlcmFsIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyLmh0bWxMaXRlcmFsOiAke3ZhbHVlfWApOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYAogICAgICovCiAgICBmdW5jdGlvbiBodG1sVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50IH0gKi8odmFsdWUpLmlubmVySFRNTDsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpdGVyYWxTdHJpbmcpIHsKICAgICAgICByZXR1cm4gbGl0ZXJhbFZhbHVlKHZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vbi10ZW1wbGF0ZSB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lci5odG1sOiAke3ZhbHVlfWApOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHRoYXQgY3JlYXRlcyBhbiBIVE1MIDx0ZW1wbGF0ZT4gZWxlbWVudCBmcm9tIHRoZQogICAgICogY29udGVudHMgb2YgdGhlIHN0cmluZy4KICAgICAqCiAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gd3JpdGUgYSBQb2x5bWVyIFRlbXBsYXRlIGluIEphdmFTY3JpcHQuCiAgICAgKgogICAgICogVGVtcGxhdGVzIGNhbiBiZSBjb21wb3NlZCBieSBpbnRlcnBvbGF0aW5nIGBIVE1MVGVtcGxhdGVFbGVtZW50YHMgaW4KICAgICAqIGV4cHJlc3Npb25zIGluIHRoZSBKYXZhU2NyaXB0IHRlbXBsYXRlIGxpdGVyYWwuIFRoZSBuZXN0ZWQgdGVtcGxhdGUncwogICAgICogYGlubmVySFRNTGAgaXMgaW5jbHVkZWQgaW4gdGhlIGNvbnRhaW5pbmcgdGVtcGxhdGUuICBUaGUgb25seSBvdGhlcgogICAgICogdmFsdWVzIGFsbG93ZWQgaW4gZXhwcmVzc2lvbnMgYXJlIHRob3NlIHJldHVybmVkIGZyb20gYFBvbHltZXIuaHRtbExpdGVyYWxgCiAgICAgKiB3aGljaCBlbnN1cmVzIG9ubHkgbGl0ZXJhbCB2YWx1ZXMgZnJvbSBKUyBzb3VyY2UgZXZlciByZWFjaCB0aGUgSFRNTCwgdG8KICAgICAqIGd1YXJkIGFnYWluc3QgWFNTIHJpc2tzLgogICAgICoKICAgICAqIEFsbCBvdGhlciB2YWx1ZXMgYXJlIGRpc2FsbG93ZWQgaW4gZXhwcmVzc2lvbnMgdG8gaGVscCBwcmV2ZW50IFhTUwogICAgICogYXR0YWNrczsgaG93ZXZlciwgYFBvbHltZXIuaHRtbExpdGVyYWxgIGNhbiBiZSB1c2VkIHRvIGNvbXBvc2Ugc3RhdGljCiAgICAgKiBzdHJpbmcgdmFsdWVzIGludG8gdGVtcGxhdGVzLiBUaGlzIGlzIHVzZWZ1bCB0byBjb21wb3NlIHN0cmluZ3MgaW50bwogICAgICogcGxhY2VzIHRoYXQgZG8gbm90IGFjY2VwdCBodG1sLCBsaWtlIHRoZSBjc3MgdGV4dCBvZiBhIGBzdHlsZWAKICAgICAqIGVsZW1lbnQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAqICAgICAgIHJldHVybiBQb2x5bWVyLmh0bWxgCiAgICAgKiAgICAgICAgIDxzdHlsZT46aG9zdHsgY29udGVudDoiLi4uIiB9PC9zdHlsZT4KICAgICAqICAgICAgICAgPGRpdiBjbGFzcz0ic2hhZG93ZWQiPiR7dGhpcy5wYXJ0aWFsVGVtcGxhdGV9PC9kaXY+CiAgICAgKiAgICAgICAgICR7c3VwZXIudGVtcGxhdGV9CiAgICAgKiAgICAgICBgOwogICAgICogICAgIH0KICAgICAqICAgICBzdGF0aWMgZ2V0IHBhcnRpYWxUZW1wbGF0ZSgpIHsgcmV0dXJuIFBvbHltZXIuaHRtbGA8c3Bhbj5QYXJ0aWFsITwvc3Bhbj5gOyB9CiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBwYXJhbSB7IUlUZW1wbGF0ZUFycmF5fSBzdHJpbmdzIENvbnN0YW50IHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsCiAgICAgKiBAcGFyYW0gey4uLip9IHZhbHVlcyBWYXJpYWJsZSBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHJldHVybiB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IENvbnN0cnVjdGVkIEhUTUxUZW1wbGF0ZUVsZW1lbnQKICAgICAqLwogICAgUG9seW1lci5odG1sID0gZnVuY3Rpb24gaHRtbChzdHJpbmdzLCAuLi52YWx1ZXMpIHsKICAgICAgY29uc3QgdGVtcGxhdGUgPSAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpKTsKICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gdmFsdWVzLnJlZHVjZSgoYWNjLCB2LCBpZHgpID0+CiAgICAgICAgICBhY2MgKyBodG1sVmFsdWUodikgKyBzdHJpbmdzW2lkeCArIDFdLCBzdHJpbmdzWzBdKTsKICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgfTsKCiAgICAvKioKICAgICAqIEFuIGh0bWwgbGl0ZXJhbCB0YWcgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGBQb2x5bWVyLmh0bWxgIHRvIGNvbXBvc2UuCiAgICAgKiBhIGxpdGVyYWwgc3RyaW5nLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gUG9seW1lci5odG1sYAogICAgICogICAgICAgICA8c3R5bGU+CiAgICAgKiAgICAgICAgICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICogICAgICAgICAgICR7c3R5bGVUZW1wbGF0ZX0KICAgICAqICAgICAgICAgPC9zdHlsZT4KICAgICAqICAgICAgICAgPGRpdiBjbGFzcz0ic2hhZG93ZWQiPiR7c3RhdGljVmFsdWV9PC9kaXY+CiAgICAgKiAgICAgICAgICR7c3VwZXIudGVtcGxhdGV9CiAgICAgKiAgICAgICBgOwogICAgICogICAgIH0KICAgICAqICAgICBzdGF0aWMgZ2V0IHN0eWxlVGVtcGxhdGUoKSB7IHJldHVybiBQb2x5bWVyLmh0bWxMaXRlcmFsYC5zaGFkb3dlZCB7IGJhY2tncm91bmQ6IGdyYXk7IH1gOyB9CiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBwYXJhbSB7IUlUZW1wbGF0ZUFycmF5fSBzdHJpbmdzIENvbnN0YW50IHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsCiAgICAgKiBAcGFyYW0gey4uLip9IHZhbHVlcyBWYXJpYWJsZSBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHJldHVybiB7IUxpdGVyYWxTdHJpbmd9IENvbnN0cnVjdGVkIGxpdGVyYWwgc3RyaW5nCiAgICAgKi8KICAgIFBvbHltZXIuaHRtbExpdGVyYWwgPSBmdW5jdGlvbihzdHJpbmdzLCAuLi52YWx1ZXMpIHsKICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsU3RyaW5nKHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PgogICAgICAgICAgYWNjICsgbGl0ZXJhbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSkpOwogICAgfTsKICB9KSgpOwo8L3NjcmlwdD48c2NyaXB0PgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogICBrZXkgbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywKICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgKi8KICBQb2x5bWVyLkVsZW1lbnQgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7Cn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+CihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBUZW1wbGF0ZUluc3RhbmNlQmFzZSA9IFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2U7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfT3B0aW9uYWxNdXRhYmxlRGF0YX0KICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBwcml2YXRlCiAgICovCiAgY29uc3QgZG9tUmVwZWF0QmFzZSA9IFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YShQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBUaGUgYDxkb20tcmVwZWF0PmAgZWxlbWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgc3RhbXAgYW5kIGJpbmRzIG9uZSBpbnN0YW5jZQogICAqIG9mIHRlbXBsYXRlIGNvbnRlbnQgdG8gZWFjaCBvYmplY3QgaW4gYSB1c2VyLXByb3ZpZGVkIGFycmF5LgogICAqIGBkb20tcmVwZWF0YCBhY2NlcHRzIGFuIGBpdGVtc2AgcHJvcGVydHksIGFuZCBvbmUgaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlCiAgICogaXMgc3RhbXBlZCBmb3IgZWFjaCBpdGVtIGludG8gdGhlIERPTSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGBkb20tcmVwZWF0YAogICAqIGVsZW1lbnQuICBUaGUgYGl0ZW1gIHByb3BlcnR5IHdpbGwgYmUgc2V0IG9uIGVhY2ggaW5zdGFuY2UncyBiaW5kaW5nCiAgICogc2NvcGUsIHRodXMgdGVtcGxhdGVzIHNob3VsZCBiaW5kIHRvIHN1Yi1wcm9wZXJ0aWVzIG9mIGBpdGVtYC4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgPGRpdj5MYXN0IG5hbWU6IDxzcGFuPnt7aXRlbS5sYXN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgPC90ZW1wbGF0ZT4KICAgKiAgICAgPC9kb20tcmVwZWF0PgogICAqCiAgICogICA8L3RlbXBsYXRlPgogICAqCiAgICogPC9kb20tbW9kdWxlPgogICAqIGBgYAogICAqCiAgICogV2l0aCB0aGUgZm9sbG93aW5nIGN1c3RvbSBlbGVtZW50IGRlZmluaXRpb246CiAgICoKICAgKiBgYGBqcwogICAqIGNsYXNzIEVtcGxveWVlTGlzdCBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CiAgICogICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2VtcGxveWVlLWxpc3QnOyB9CiAgICogICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgIHJldHVybiB7CiAgICogICAgICAgZW1wbG95ZWVzOiB7CiAgICogICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICAgcmV0dXJuIFsKICAgKiAgICAgICAgICAgICB7Zmlyc3Q6ICdCb2InLCBsYXN0OiAnU21pdGgnfSwKICAgKiAgICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAgLi4uCiAgICogICAgICAgICAgIF07CiAgICogICAgICAgICB9CiAgICogICAgICAgfQogICAqICAgICB9OwogICAqICAgfQogICAqIH0KICAgKiBgYGAKICAgKgogICAqIE5vdGlmaWNhdGlvbnMgZm9yIGNoYW5nZXMgdG8gaXRlbXMgc3ViLXByb3BlcnRpZXMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGVtcGxhdGUKICAgKiBpbnN0YW5jZXMsIHdoaWNoIHdpbGwgdXBkYXRlIHZpYSB0aGUgbm9ybWFsIHN0cnVjdHVyZWQgZGF0YSBub3RpZmljYXRpb24gc3lzdGVtLgogICAqCiAgICogTXV0YXRpb25zIHRvIHRoZSBgaXRlbXNgIGFycmF5IGl0c2VsZiBzaG91bGQgYmUgbWFkZSB1c2luZyB0aGUgQXJyYXkKICAgKiBtdXRhdGlvbiBBUEkncyBvbiBgUG9seW1lci5CYXNlYCAoYHB1c2hgLCBgcG9wYCwgYHNwbGljZWAsIGBzaGlmdGAsCiAgICogYHVuc2hpZnRgKSwgYW5kIHRlbXBsYXRlIGluc3RhbmNlcyB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBkYXRhIGluIHRoZQogICAqIGFycmF5LgogICAqCiAgICogRXZlbnRzIGNhdWdodCBieSBldmVudCBoYW5kbGVycyB3aXRoaW4gdGhlIGBkb20tcmVwZWF0YCB0ZW1wbGF0ZSB3aWxsIGJlCiAgICogZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5LCB3aGljaCByZXByZXNlbnRzIHRoZSBiaW5kaW5nIHNjb3BlIGZvcgogICAqIGVhY2ggdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgbW9kZWwgaXMgYW4gaW5zdGFuY2Ugb2YgUG9seW1lci5CYXNlLCBhbmQgc2hvdWxkCiAgICogYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgb24gdGhlIGluc3RhbmNlLCBmb3IgZXhhbXBsZQogICAqIGBldmVudC5tb2RlbC5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICoKICAgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgbW9kZWwgZm9yIGEgdGVtcGxhdGUgaW5zdGFuY2UgZm9yIGFuIGVsZW1lbnQgc3RhbXBlZCBieQogICAqIGEgYGRvbS1yZXBlYXRgIGNhbiBiZSBvYnRhaW5lZCB1c2luZyB0aGUgYG1vZGVsRm9yRWxlbWVudGAgQVBJIG9uIHRoZQogICAqIGBkb20tcmVwZWF0YCB0aGF0IHN0YW1wZWQgaXQsIGZvciBleGFtcGxlCiAgICogYHRoaXMuJC5kb21SZXBlYXQubW9kZWxGb3JFbGVtZW50KGV2ZW50LnRhcmdldCkuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTtgLgogICAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgbWFuaXB1bGF0aW5nIGluc3RhbmNlIGRhdGEgb2YgZXZlbnQgdGFyZ2V0cyBvYnRhaW5lZAogICAqIGJ5IGV2ZW50IGhhbmRsZXJzIG9uIHBhcmVudHMgb2YgdGhlIGBkb20tcmVwZWF0YCAoZXZlbnQgZGVsZWdhdGlvbikuCiAgICoKICAgKiBBIHZpZXctc3BlY2lmaWMgZmlsdGVyL3NvcnQgbWF5IGJlIGFwcGxpZWQgdG8gZWFjaCBgZG9tLXJlcGVhdGAgYnkgc3VwcGx5aW5nIGEKICAgKiBgZmlsdGVyYCBhbmQvb3IgYHNvcnRgIHByb3BlcnR5LiAgVGhpcyBtYXkgYmUgYSBzdHJpbmcgdGhhdCBuYW1lcyBhIGZ1bmN0aW9uIG9uCiAgICogdGhlIGhvc3QsIG9yIGEgZnVuY3Rpb24gbWF5IGJlIGFzc2lnbmVkIHRvIHRoZSBwcm9wZXJ0eSBkaXJlY3RseS4gIFRoZSBmdW5jdGlvbnMKICAgKiBzaG91bGQgaW1wbGVtZW50ZWQgZm9sbG93aW5nIHRoZSBzdGFuZGFyZCBgQXJyYXlgIGZpbHRlci9zb3J0IEFQSS4KICAgKgogICAqIEluIG9yZGVyIHRvIHJlLXJ1biB0aGUgZmlsdGVyIG9yIHNvcnQgZnVuY3Rpb25zIGJhc2VkIG9uIGNoYW5nZXMgdG8gc3ViLWZpZWxkcwogICAqIG9mIGBpdGVtc2AsIHRoZSBgb2JzZXJ2ZWAgcHJvcGVydHkgbWF5IGJlIHNldCBhcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mCiAgICogYGl0ZW1gIHN1Yi1maWVsZHMgdGhhdCBzaG91bGQgY2F1c2UgYSByZS1maWx0ZXIvc29ydCB3aGVuIG1vZGlmaWVkLiAgSWYKICAgKiB0aGUgZmlsdGVyIG9yIHNvcnQgZnVuY3Rpb24gZGVwZW5kcyBvbiBwcm9wZXJ0aWVzIG5vdCBjb250YWluZWQgaW4gYGl0ZW1zYCwKICAgKiB0aGUgdXNlciBzaG91bGQgb2JzZXJ2ZSBjaGFuZ2VzIHRvIHRob3NlIHByb3BlcnRpZXMgYW5kIGNhbGwgYHJlbmRlcmAgdG8gdXBkYXRlCiAgICogdGhlIHZpZXcgYmFzZWQgb24gdGhlIGRlcGVuZGVuY3kgY2hhbmdlLgogICAqCiAgICogRm9yIGV4YW1wbGUsIGZvciBhbiBgZG9tLXJlcGVhdGAgd2l0aCBhIGZpbHRlciBvZiB0aGUgZm9sbG93aW5nOgogICAqCiAgICogYGBganMKICAgKiBpc0VuZ2luZWVyKGl0ZW0pIHsKICAgKiAgIHJldHVybiBpdGVtLnR5cGUgPT0gJ2VuZ2luZWVyJyB8fCBpdGVtLm1hbmFnZXIudHlwZSA9PSAnZW5naW5lZXInOwogICAqIH0KICAgKiBgYGAKICAgKgogICAqIFRoZW4gdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBzaG91bGQgYmUgY29uZmlndXJlZCBhcyBmb2xsb3dzOgogICAqCiAgICogYGBgaHRtbAogICAqIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e2VtcGxveWVlc319IiBmaWx0ZXI9ImlzRW5naW5lZXIiIG9ic2VydmU9InR5cGUgbWFuYWdlci50eXBlIj4KICAgKiBgYGAKICAgKgogICAqIEBjdXN0b21FbGVtZW50CiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBleHRlbmRzIHtkb21SZXBlYXRCYXNlfQogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgZm9yIHN0YW1waW5nIGluc3RhbmNlIG9mIGEgdGVtcGxhdGUgYm91bmQgdG8KICAgKiAgIGl0ZW1zIGluIGFuIGFycmF5LgogICAqLwogIGNsYXNzIERvbVJlcGVhdCBleHRlbmRzIGRvbVJlcGVhdEJhc2UgewoKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2RvbS1yZXBlYXQnOyB9CgogICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsgcmV0dXJuIG51bGw7IH0KCiAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAvKioKICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQgYnkgdGhpcyB0ZW1wbGF0ZSAoYnkKICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgKiBgcmVuZGVyYC4KICAgICAgICoKICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICovCiAgICAgIHJldHVybiB7CgogICAgICAgIC8qKgogICAgICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgaXRlbXMgZGV0ZXJtaW5pbmcgaG93IG1hbnkgaW5zdGFuY2VzIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgICAqIHRvIHN0YW1wIGFuZCB0aGF0IHRoYXQgZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZSBzaG91bGQgYmluZCB0by4KICAgICAgICAgKi8KICAgICAgICBpdGVtczogewogICAgICAgICAgdHlwZTogQXJyYXkKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgYXJyYXkKICAgICAgICAgKiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGFzOiB7CiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICB2YWx1ZTogJ2l0ZW0nCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLgogICAgICAgICAqIE5vdGUsIGZvciB0aGUgaW5kZXggaW4gdGhlIGB0aGlzLml0ZW1zYCBhcnJheSwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgICAgKiBgaXRlbXNJbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpbmRleEFzOiB7CiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICB2YWx1ZTogJ2luZGV4JwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgd2l0aCB0aGUgaW5kZXgKICAgICAgICAgKiBvZiB0aGUgaW5zdGFuY2UgaW4gdGhlIGB0aGlzLml0ZW1zYCBhcnJheS4gTm90ZSwgZm9yIHRoZSBpbmRleCBvZgogICAgICAgICAqIHRoaXMgaW5zdGFuY2UgaW4gdGhlIHNvcnRlZCBhbmQgZmlsdGVyZWQgbGlzdCBvZiByZW5kZXJlZCBpdGVtcywKICAgICAgICAgKiB1c2UgdGhlIHZhbHVlIG9mIHRoZSBgaW5kZXhBc2AgcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgaXRlbXNJbmRleEFzOiB7CiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICB2YWx1ZTogJ2l0ZW1zSW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBkZXRlcm1pbmUgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIGl0ZW1zLiAgVGhpcwogICAgICAgICAqIHByb3BlcnR5IHNob3VsZCBlaXRoZXIgYmUgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIGluZGljYXRpbmcgYSBtZXRob2QKICAgICAgICAgKiBuYW1lIG9uIHRoZSBlbGVtZW50J3MgaG9zdCwgb3IgZWxzZSBiZSBhbiBhY3R1YWwgZnVuY3Rpb24uICBUaGUKICAgICAgICAgKiBmdW5jdGlvbiBzaG91bGQgbWF0Y2ggdGhlIHNvcnQgZnVuY3Rpb24gcGFzc2VkIHRvIGBBcnJheS5zb3J0YC4KICAgICAgICAgKiBVc2luZyBhIHNvcnQgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIHNvcnQ6IHsKICAgICAgICAgIHR5cGU6IEZ1bmN0aW9uLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX3NvcnRDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgaXRlbXMgb3V0IG9mIHRoZSB2aWV3LiAgVGhpcwogICAgICAgICAqIHByb3BlcnR5IHNob3VsZCBlaXRoZXIgYmUgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIGluZGljYXRpbmcgYSBtZXRob2QKICAgICAgICAgKiBuYW1lIG9uIHRoZSBlbGVtZW50J3MgaG9zdCwgb3IgZWxzZSBiZSBhbiBhY3R1YWwgZnVuY3Rpb24uICBUaGUKICAgICAgICAgKiBmdW5jdGlvbiBzaG91bGQgbWF0Y2ggdGhlIHNvcnQgZnVuY3Rpb24gcGFzc2VkIHRvIGBBcnJheS5maWx0ZXJgLgogICAgICAgICAqIFVzaW5nIGEgZmlsdGVyIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHVuZGVybHlpbmcgYGl0ZW1zYCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBmaWx0ZXI6IHsKICAgICAgICAgIHR5cGU6IEZ1bmN0aW9uLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX2ZpbHRlckNoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiB1c2luZyBhIGBmaWx0ZXJgIG9yIGBzb3J0YCBmdW5jdGlvbiwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eQogICAgICAgICAqIHNob3VsZCBiZSBzZXQgdG8gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgaXRlbQogICAgICAgICAqIHN1Yi1maWVsZHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIHJlLXNvcnQgb3IgcmUtZmlsdGVyIHdoZW4gY2hhbmdlZC4KICAgICAgICAgKiBUaGVzZSBzaG91bGQgZ2VuZXJhbGx5IGJlIGZpZWxkcyBvZiBgaXRlbWAgdGhhdCB0aGUgc29ydCBvciBmaWx0ZXIKICAgICAgICAgKiBmdW5jdGlvbiBkZXBlbmRzIG9uLgogICAgICAgICAqLwogICAgICAgIG9ic2VydmU6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIG9ic2VydmVyOiAnX19vYnNlcnZlQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYGRlbGF5YCBwcm9wZXJ0eQogICAgICAgICAqIGRldGVybWluZXMgYSBkZWJvdW5jZSB0aW1lIGluIG1zIGFmdGVyIGEgY2hhbmdlIHRvIG9ic2VydmVkIGl0ZW0KICAgICAgICAgKiBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBwYXNzIGJlZm9yZSB0aGUgZmlsdGVyIG9yIHNvcnQgaXMgcmUtcnVuLgogICAgICAgICAqIFRoaXMgaXMgdXNlZnVsIGluIHJhdGUtbGltaXRpbmcgc2h1ZmZsaW5nIG9mIHRoZSB2aWV3IHdoZW4KICAgICAgICAgKiBpdGVtIGNoYW5nZXMgbWF5IGJlIGZyZXF1ZW50LgogICAgICAgICAqLwogICAgICAgIGRlbGF5OiBOdW1iZXIsCgogICAgICAgIC8qKgogICAgICAgICAqIENvdW50IG9mIGN1cnJlbnRseSByZW5kZXJlZCBpdGVtcyBhZnRlciBgZmlsdGVyYCAoaWYgYW55KSBoYXMgYmVlbiBhcHBsaWVkLgogICAgICAgICAqIElmICJjaHVua2luZyBtb2RlIiBpcyBlbmFibGVkLCBgcmVuZGVyZWRJdGVtQ291bnRgIGlzIHVwZGF0ZWQgZWFjaCB0aW1lIGEKICAgICAgICAgKiBzZXQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIGlzIHJlbmRlcmVkLgogICAgICAgICAqCiAgICAgICAgICovCiAgICAgICAgcmVuZGVyZWRJdGVtQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgIHJlYWRPbmx5OiB0cnVlCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lcyBhbiBpbml0aWFsIGNvdW50IG9mIHRlbXBsYXRlIGluc3RhbmNlcyB0byByZW5kZXIgYWZ0ZXIgc2V0dGluZwogICAgICAgICAqIHRoZSBgaXRlbXNgIGFycmF5LCBiZWZvcmUgdGhlIG5leHQgcGFpbnQsIGFuZCBwdXRzIHRoZSBgZG9tLXJlcGVhdGAKICAgICAgICAgKiBpbnRvICJjaHVua2luZyBtb2RlIi4gIFRoZSByZW1haW5pbmcgaXRlbXMgd2lsbCBiZSBjcmVhdGVkIGFuZCByZW5kZXJlZAogICAgICAgICAqIGluY3JlbWVudGFsbHkgYXQgZWFjaCBhbmltYXRpb24gZnJhbWUgdGhlcm9mIHVudGlsIGFsbCBpbnN0YW5jZXMgaGF2ZQogICAgICAgICAqIGJlZW4gcmVuZGVyZWQuCiAgICAgICAgICovCiAgICAgICAgaW5pdGlhbENvdW50OiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBvYnNlcnZlcjogJ19faW5pdGlhbGl6ZUNodW5raW5nJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gYGluaXRpYWxDb3VudGAgaXMgdXNlZCwgdGhpcyBwcm9wZXJ0eSBkZWZpbmVzIGEgZnJhbWUgcmF0ZSAoaW4KICAgICAgICAgKiBmcHMpIHRvIHRhcmdldCBieSB0aHJvdHRsaW5nIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHJlbmRlcmVkIGVhY2gKICAgICAgICAgKiBmcmFtZSB0byBub3QgZXhjZWVkIHRoZSBidWRnZXQgZm9yIHRoZSB0YXJnZXQgZnJhbWUgcmF0ZS4gIFRoZQogICAgICAgICAqIGZyYW1lcmF0ZSBpcyBlZmZlY3RpdmVseSB0aGUgbnVtYmVyIG9mIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgcyB0aGF0CiAgICAgICAgICogaXQgdHJpZXMgdG8gYWxsb3cgdG8gYWN0dWFsbHkgZmlyZSBpbiBhIGdpdmVuIHNlY29uZC4gSXQgZG9lcyB0aGlzCiAgICAgICAgICogYnkgbWVhc3VyaW5nIHRoZSB0aW1lIGJldHdlZW4gYHJBRmBzIGFuZCBjb250aW51b3VzbHkgYWRqdXN0aW5nIHRoZQogICAgICAgICAqIG51bWJlciBvZiBpdGVtcyBjcmVhdGVkIGVhY2ggYHJBRmAgdG8gbWFpbnRhaW4gdGhlIHRhcmdldCBmcmFtZXJhdGUuCiAgICAgICAgICogU2V0dGluZyB0aGlzIHRvIGEgaGlnaGVyIG51bWJlciBhbGxvd3MgbG93ZXIgbGF0ZW5jeSBhbmQgaGlnaGVyCiAgICAgICAgICogdGhyb3VnaHB1dCBmb3IgZXZlbnQgaGFuZGxlcnMgYW5kIG90aGVyIHRhc2tzLCBidXQgcmVzdWx0cyBpbiBhCiAgICAgICAgICogbG9uZ2VyIHRpbWUgZm9yIHRoZSByZW1haW5pbmcgaXRlbXMgdG8gY29tcGxldGUgcmVuZGVyaW5nLgogICAgICAgICAqLwogICAgICAgIHRhcmdldEZyYW1lcmF0ZTogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgdmFsdWU6IDIwCiAgICAgICAgfSwKCiAgICAgICAgX3RhcmdldEZyYW1lVGltZTogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgY29tcHV0ZWQ6ICdfX2NvbXB1dGVGcmFtZVRpbWUodGFyZ2V0RnJhbWVyYXRlKScKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgcmV0dXJuIFsgJ19faXRlbXNDaGFuZ2VkKGl0ZW1zLiopJyBdOwogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLl9faW5zdGFuY2VzID0gW107CiAgICAgIHRoaXMuX19saW1pdCA9IEluZmluaXR5OwogICAgICB0aGlzLl9fcG9vbCA9IFtdOwogICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyID0gbnVsbDsKICAgICAgdGhpcy5fX2l0ZW1zSWR4VG9JbnN0SWR4ID0ge307CiAgICAgIHRoaXMuX19jaHVua0NvdW50ID0gbnVsbDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBudWxsOwogICAgICB0aGlzLl9fc29ydEZuID0gbnVsbDsKICAgICAgdGhpcy5fX2ZpbHRlckZuID0gbnVsbDsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IG51bGw7CiAgICAgIHRoaXMuX19jdG9yID0gbnVsbDsKICAgICAgdGhpcy5fX2lzRGV0YWNoZWQgPSB0cnVlOwogICAgICB0aGlzLnRlbXBsYXRlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9faW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5fX2RldGFjaEluc3RhbmNlKGkpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAvLyBvbmx5IHBlcmZvcm0gYXR0YWNobWVudCBpZiB0aGUgZWxlbWVudCB3YXMgcHJldmlvdXNseSBkZXRhY2hlZC4KICAgICAgaWYgKHRoaXMuX19pc0RldGFjaGVkKSB7CiAgICAgICAgdGhpcy5fX2lzRGV0YWNoZWQgPSBmYWxzZTsKICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9faW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLl9fYXR0YWNoSW5zdGFuY2UoaSwgcGFyZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX2Vuc3VyZVRlbXBsYXRpemVkKCkgewogICAgICAvLyBUZW1wbGF0aXppbmcgKGdlbmVyYXRpbmcgdGhlIGluc3RhbmNlIGNvbnN0cnVjdG9yKSBuZWVkcyB0byB3YWl0CiAgICAgIC8vIHVudGlsIHJlYWR5LCBzaW5jZSB3b24ndCBoYXZlIGl0cyB0ZW1wbGF0ZSBjb250ZW50IGhhbmRlZCBiYWNrIHRvCiAgICAgIC8vIGl0IHVudGlsIHRoZW4KICAgICAgaWYgKCF0aGlzLl9fY3RvcikgewogICAgICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgaWYgKCF0ZW1wbGF0ZSkgewogICAgICAgICAgLy8gLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSkgewogICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tcmVwZWF0IHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBUZW1wbGF0ZSBpbnN0YW5jZSBwcm9wcyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGZvcndhcmRpbmcKICAgICAgICBsZXQgaW5zdGFuY2VQcm9wcyA9IHt9OwogICAgICAgIGluc3RhbmNlUHJvcHNbdGhpcy5hc10gPSB0cnVlOwogICAgICAgIGluc3RhbmNlUHJvcHNbdGhpcy5pbmRleEFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLml0ZW1zSW5kZXhBc10gPSB0cnVlOwogICAgICAgIHRoaXMuX19jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiB0aGlzLm11dGFibGVEYXRhLAogICAgICAgICAgcGFyZW50TW9kZWw6IHRydWUsCiAgICAgICAgICBpbnN0YW5jZVByb3BzOiBpbnN0YW5jZVByb3BzLAogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBAdGhpcyB7dGhpc30KICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIHNldAogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQgcHJvcGVydHkgdG8KICAgICAgICAgICAqLwogICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBsZXQgaSQgPSB0aGlzLl9faW5zdGFuY2VzOwogICAgICAgICAgICBmb3IgKGxldCBpPTAsIGluc3Q7IChpPGkkLmxlbmd0aCkgJiYgKGluc3Q9aSRbaV0pOyBpKyspIHsKICAgICAgICAgICAgICBpbnN0LmZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGluc3QgSW5zdGFuY2UgdG8gbm90aWZ5CiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gbm90aWZ5CiAgICAgICAgICAgKi8KICAgICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcDogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKFBvbHltZXIuUGF0aC5tYXRjaGVzKHRoaXMuYXMsIHByb3ApKSB7CiAgICAgICAgICAgICAgbGV0IGlkeCA9IGluc3RbdGhpcy5pdGVtc0luZGV4QXNdOwogICAgICAgICAgICAgIGlmIChwcm9wID09IHRoaXMuYXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsZXQgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUodGhpcy5hcywgJ2l0ZW1zLicgKyBpZHgsIHByb3ApOwogICAgICAgICAgICAgIHRoaXMubm90aWZ5UGF0aChwYXRoLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBfX2dldE1ldGhvZEhvc3QoKSB7CiAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGJlIHRoZSBvd25lciBvZiB0aGUgb3V0ZXJtb3N0IHRlbXBsYXRlLgogICAgICAvLyBJbiBzaGFkb3cgZG9tLCB0aGlzIGlzIGFsd2F5cyBnZXRSb290Tm9kZSgpLmhvc3QsIGJ1dCB3ZSBjYW4KICAgICAgLy8gYXBwcm94aW1hdGUgdGhpcyB2aWEgY29vcGVyYXRpb24gd2l0aCBvdXIgZGF0YUhvc3QgYWx3YXlzIHNldHRpbmcKICAgICAgLy8gYF9tZXRob2RIb3N0YCBhcyBsb25nIGFzIHRoZXJlIHdlcmUgYmluZGluZ3MgKG9yIGlkJ3MpIG9uIHRoaXMKICAgICAgLy8gaW5zdGFuY2UgY2F1c2luZyBpdCB0byBnZXQgYSBkYXRhSG9zdC4KICAgICAgcmV0dXJuIHRoaXMuX19kYXRhSG9zdC5fbWV0aG9kSG9zdCB8fCB0aGlzLl9fZGF0YUhvc3Q7CiAgICB9CgogICAgX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZ1bmN0aW9uT3JNZXRob2ROYW1lKSB7CiAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25Pck1ldGhvZE5hbWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgbGV0IG1ldGhvZE5hbWUgPSBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgICAgICBsZXQgb2JqID0gdGhpcy5fX2dldE1ldGhvZEhvc3QoKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBvYmpbbWV0aG9kTmFtZV0uYXBwbHkob2JqLCBhcmd1bWVudHMpOyB9OwogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb25Pck1ldGhvZE5hbWU7CiAgICB9CgogICAgX19zb3J0Q2hhbmdlZChzb3J0KSB7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSB0aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZShzb3J0KTsKICAgICAgaWYgKHRoaXMuaXRlbXMpIHsgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOyB9CiAgICB9CgogICAgX19maWx0ZXJDaGFuZ2VkKGZpbHRlcikgewogICAgICB0aGlzLl9fZmlsdGVyRm4gPSB0aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZShmaWx0ZXIpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2NvbXB1dGVGcmFtZVRpbWUocmF0ZSkgewogICAgICByZXR1cm4gTWF0aC5jZWlsKDEwMDAvcmF0ZSk7CiAgICB9CgogICAgX19pbml0aWFsaXplQ2h1bmtpbmcoKSB7CiAgICAgIGlmICh0aGlzLmluaXRpYWxDb3VudCkgewogICAgICAgIHRoaXMuX19saW1pdCA9IHRoaXMuaW5pdGlhbENvdW50OwogICAgICAgIHRoaXMuX19jaHVua0NvdW50ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgfQogICAgfQoKICAgIF9fdHJ5UmVuZGVyQ2h1bmsoKSB7CiAgICAgIC8vIERlYm91bmNlZCBzbyB0aGF0IG11bHRpcGxlIGNhbGxzIHRocm91Z2ggYF9yZW5kZXJgIGJldHdlZW4gYW5pbWF0aW9uCiAgICAgIC8vIGZyYW1lcyBvbmx5IHF1ZXVlIG9uZSBuZXcgckFGIChlLmcuIGFycmF5IG11dGF0aW9uICYgY2h1bmtlZCByZW5kZXIpCiAgICAgIGlmICh0aGlzLml0ZW1zICYmIHRoaXMuX19saW1pdCA8IHRoaXMuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZXF1ZXN0UmVuZGVyQ2h1bmspOwogICAgICB9CiAgICB9CgogICAgX19yZXF1ZXN0UmVuZGVyQ2h1bmsoKSB7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy5fX3JlbmRlckNodW5rKCkpOwogICAgfQoKICAgIF9fcmVuZGVyQ2h1bmsoKSB7CiAgICAgIC8vIFNpbXBsZSBhdXRvIGNodW5rU2l6ZSB0aHJvdHRsaW5nIGFsZ29yaXRobSBiYXNlZCBvbiBmZWVkYmFjayBsb29wOgogICAgICAvLyBtZWFzdXJlIGFjdHVhbCB0aW1lIGJldHdlZW4gZnJhbWVzIGFuZCBzY2FsZSBjaHVuayBjb3VudCBieSByYXRpbwogICAgICAvLyBvZiB0YXJnZXQvYWN0dWFsIGZyYW1lIHRpbWUKICAgICAgbGV0IGN1cnJDaHVua1RpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgbGV0IHJhdGlvID0gdGhpcy5fdGFyZ2V0RnJhbWVUaW1lIC8gKGN1cnJDaHVua1RpbWUgLSB0aGlzLl9fbGFzdENodW5rVGltZSk7CiAgICAgIHRoaXMuX19jaHVua0NvdW50ID0gTWF0aC5yb3VuZCh0aGlzLl9fY2h1bmtDb3VudCAqIHJhdGlvKSB8fCAxOwogICAgICB0aGlzLl9fbGltaXQgKz0gdGhpcy5fX2NodW5rQ291bnQ7CiAgICAgIHRoaXMuX19sYXN0Q2h1bmtUaW1lID0gY3VyckNodW5rVGltZTsKICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgfQoKICAgIF9fb2JzZXJ2ZUNoYW5nZWQoKSB7CiAgICAgIHRoaXMuX19vYnNlcnZlUGF0aHMgPSB0aGlzLm9ic2VydmUgJiYKICAgICAgICB0aGlzLm9ic2VydmUucmVwbGFjZSgnLionLCAnLicpLnNwbGl0KCcgJyk7CiAgICB9CgogICAgX19pdGVtc0NoYW5nZWQoY2hhbmdlKSB7CiAgICAgIGlmICh0aGlzLml0ZW1zICYmICFBcnJheS5pc0FycmF5KHRoaXMuaXRlbXMpKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdkb20tcmVwZWF0IGV4cGVjdGVkIGFycmF5IGZvciBgaXRlbXNgLCBmb3VuZCcsIHRoaXMuaXRlbXMpOwogICAgICB9CiAgICAgIC8vIElmIHBhdGggd2FzIHRvIGFuIGl0ZW0gKGUuZy4gJ2l0ZW1zLjMnIG9yICdpdGVtcy4zLmZvbycpLCBmb3J3YXJkIHRoZQogICAgICAvLyBwYXRoIHRvIHRoYXQgaW5zdGFuY2Ugc3luY2hyb25vdXNseSAocmV0dXJucyBmYWxzZSBmb3Igbm9uLWl0ZW0gcGF0aHMpCiAgICAgIGlmICghdGhpcy5fX2hhbmRsZUl0ZW1QYXRoKGNoYW5nZS5wYXRoLCBjaGFuZ2UudmFsdWUpKSB7CiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgYXJyYXkgd2FzIHJlc2V0ICgnaXRlbXMnKSBvciBzcGxpY2VkICgnaXRlbXMuc3BsaWNlcycpLAogICAgICAgIC8vIHNvIHF1ZXVlIGEgZnVsbCByZWZyZXNoCiAgICAgICAgdGhpcy5fX2luaXRpYWxpemVDaHVua2luZygpOwogICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgfQogICAgfQoKICAgIF9faGFuZGxlT2JzZXJ2ZWRQYXRocyhwYXRoKSB7CiAgICAgIC8vIEhhbmRsZSBjYXNlcyB3aGVyZSBwYXRoIGNoYW5nZXMgc2hvdWxkIGNhdXNlIGEgcmUtc29ydC9maWx0ZXIKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4gfHwgdGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgICAvLyBBbHdheXMgcmUtcmVuZGVyIGlmIHRoZSBpdGVtIGl0c2VsZiBjaGFuZ2VkCiAgICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlciwgdGhpcy5kZWxheSk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fb2JzZXJ2ZVBhdGhzKSB7CiAgICAgICAgICAvLyBPdGhlcndpc2UsIHJlLXJlbmRlciBpZiB0aGUgcGF0aCBjaGFuZ2VkIG1hdGNoZXMgYW4gb2JzZXJ2ZWQgcGF0aAogICAgICAgICAgbGV0IHBhdGhzID0gdGhpcy5fX29ic2VydmVQYXRoczsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXRocy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKHBhdGhzW2ldKSA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtmdW5jdGlvbih0aGlzOkRvbVJlcGVhdCl9IGZuIEZ1bmN0aW9uIHRvIGRlYm91bmNlLgogICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtcyB0byBkZWJvdW5jZSBieS4KICAgICAqLwogICAgX19kZWJvdW5jZVJlbmRlcihmbiwgZGVsYXkgPSAwKSB7CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBQb2x5bWVyLkRlYm91bmNlci5kZWJvdW5jZSgKICAgICAgICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlcgogICAgICAgICAgLCBkZWxheSA+IDAgPyBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoZGVsYXkpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICwgZm4uYmluZCh0aGlzKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEZvcmNlcyB0aGUgZWxlbWVudCB0byByZW5kZXIgaXRzIGNvbnRlbnQuIE5vcm1hbGx5IHJlbmRlcmluZyBpcwogICAgICogYXN5bmNocm9ub3VzIHRvIGEgcHJvdm9raW5nIGNoYW5nZS4gVGhpcyBpcyBkb25lIGZvciBlZmZpY2llbmN5IHNvCiAgICAgKiB0aGF0IG11bHRpcGxlIGNoYW5nZXMgdHJpZ2dlciBvbmx5IGEgc2luZ2xlIHJlbmRlci4gVGhlIHJlbmRlciBtZXRob2QKICAgICAqIHNob3VsZCBiZSBjYWxsZWQgaWYsIGZvciBleGFtcGxlLCB0ZW1wbGF0ZSByZW5kZXJpbmcgaXMgcmVxdWlyZWQgdG8KICAgICAqIHZhbGlkYXRlIGFwcGxpY2F0aW9uIHN0YXRlLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgcmVuZGVyKCkgewogICAgICAvLyBRdWV1ZSB0aGlzIHJlcGVhdGVyLCB0aGVuIGZsdXNoIGFsbCBpbiBvcmRlcgogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKCF0aGlzLl9fZW5zdXJlVGVtcGxhdGl6ZWQoKSkgewogICAgICAgIC8vIE5vIHRlbXBsYXRlIGZvdW5kIHlldAogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLl9fYXBwbHlGdWxsUmVmcmVzaCgpOwogICAgICAvLyBSZXNldCB0aGUgcG9vbAogICAgICAvLyBUT0RPKGtzY2hhYWYpOiBSZXVzZSBwb29sIGFjcm9zcyB0dXJucyBhbmQgbmVzdGVkIHRlbXBsYXRlcwogICAgICAvLyBOb3cgdGhhdCBvYmplY3RzL2FycmF5cyBhcmUgcmUtZXZhbHVhdGVkIHdoZW4gc2V0LCB3ZSBjYW4gc2FmZWx5CiAgICAgIC8vIHJldXNlIHBvb2xlZCBpbnN0YW5jZXMgYWNyb3NzIHR1cm5zLCBob3dldmVyIHdlIHN0aWxsIG5lZWQgdG8gZGVjaWRlCiAgICAgIC8vIHNlbWFudGljcyByZWdhcmRpbmcgaG93IGxvbmcgdG8gaG9sZCwgaG93IG1hbnkgdG8gaG9sZCwgZXRjLgogICAgICB0aGlzLl9fcG9vbC5sZW5ndGggPSAwOwogICAgICAvLyBTZXQgcmVuZGVyZWQgaXRlbSBjb3VudAogICAgICB0aGlzLl9zZXRSZW5kZXJlZEl0ZW1Db3VudCh0aGlzLl9faW5zdGFuY2VzLmxlbmd0aCk7CiAgICAgIC8vIE5vdGlmeSB1c2VycwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdkb20tY2hhbmdlJywgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byByZW5kZXIgbW9yZSBpdGVtcwogICAgICB0aGlzLl9fdHJ5UmVuZGVyQ2h1bmsoKTsKICAgIH0KCiAgICBfX2FwcGx5RnVsbFJlZnJlc2goKSB7CiAgICAgIGxldCBpdGVtcyA9IHRoaXMuaXRlbXMgfHwgW107CiAgICAgIGxldCBpc250SWR4VG9JdGVtc0lkeCA9IG5ldyBBcnJheShpdGVtcy5sZW5ndGgpOwogICAgICBmb3IgKGxldCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeFtpXSA9IGk7CiAgICAgIH0KICAgICAgLy8gQXBwbHkgdXNlciBmaWx0ZXIKICAgICAgaWYgKHRoaXMuX19maWx0ZXJGbikgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4ID0gaXNudElkeFRvSXRlbXNJZHguZmlsdGVyKChpLCBpZHgsIGFycmF5KSA9PgogICAgICAgICAgdGhpcy5fX2ZpbHRlckZuKGl0ZW1zW2ldLCBpZHgsIGFycmF5KSk7CiAgICAgIH0KICAgICAgLy8gQXBwbHkgdXNlciBzb3J0CiAgICAgIGlmICh0aGlzLl9fc29ydEZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHguc29ydCgoYSwgYikgPT4gdGhpcy5fX3NvcnRGbihpdGVtc1thXSwgaXRlbXNbYl0pKTsKICAgICAgfQogICAgICAvLyBpdGVtcy0+aW5zdCBtYXAga2VwdCBmb3IgaXRlbSBwYXRoIGZvcndhcmRpbmcKICAgICAgY29uc3QgaXRlbXNJZHhUb0luc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgbGV0IGluc3RJZHggPSAwOwogICAgICAvLyBHZW5lcmF0ZSBpbnN0YW5jZXMgYW5kIGFzc2lnbiBpdGVtcwogICAgICBjb25zdCBsaW1pdCA9IE1hdGgubWluKGlzbnRJZHhUb0l0ZW1zSWR4Lmxlbmd0aCwgdGhpcy5fX2xpbWl0KTsKICAgICAgZm9yICg7IGluc3RJZHg8bGltaXQ7IGluc3RJZHgrKykgewogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBsZXQgaXRlbUlkeCA9IGlzbnRJZHhUb0l0ZW1zSWR4W2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtID0gaXRlbXNbaXRlbUlkeF07CiAgICAgICAgaXRlbXNJZHhUb0luc3RJZHhbaXRlbUlkeF0gPSBpbnN0SWR4OwogICAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5pbmRleEFzLCBpbnN0SWR4KTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLml0ZW1zSW5kZXhBcywgaXRlbUlkeCk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBSZW1vdmUgYW55IGV4dHJhIGluc3RhbmNlcyBmcm9tIHByZXZpb3VzIHN0YXRlCiAgICAgIGZvciAobGV0IGk9dGhpcy5fX2luc3RhbmNlcy5sZW5ndGgtMTsgaT49aW5zdElkeDsgaS0tKSB7CiAgICAgICAgdGhpcy5fX2RldGFjaEFuZFJlbW92ZUluc3RhbmNlKGkpOwogICAgICB9CiAgICB9CgogICAgX19kZXRhY2hJbnN0YW5jZShpZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2lkeF07CiAgICAgIGZvciAobGV0IGk9MDsgaTxpbnN0LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IGVsID0gaW5zdC5jaGlsZHJlbltpXTsKICAgICAgICBpbnN0LnJvb3QuYXBwZW5kQ2hpbGQoZWwpOwogICAgICB9CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIF9fYXR0YWNoSW5zdGFuY2UoaWR4LCBwYXJlbnQpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2lkeF07CiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCB0aGlzKTsKICAgIH0KCiAgICBfX2RldGFjaEFuZFJlbW92ZUluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19kZXRhY2hJbnN0YW5jZShpZHgpOwogICAgICBpZiAoaW5zdCkgewogICAgICAgIHRoaXMuX19wb29sLnB1c2goaW5zdCk7CiAgICAgIH0KICAgICAgdGhpcy5fX2luc3RhbmNlcy5zcGxpY2UoaWR4LCAxKTsKICAgIH0KCiAgICBfX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCkgewogICAgICBsZXQgbW9kZWwgPSB7fTsKICAgICAgbW9kZWxbdGhpcy5hc10gPSBpdGVtOwogICAgICBtb2RlbFt0aGlzLmluZGV4QXNdID0gaW5zdElkeDsKICAgICAgbW9kZWxbdGhpcy5pdGVtc0luZGV4QXNdID0gaXRlbUlkeDsKICAgICAgcmV0dXJuIG5ldyB0aGlzLl9fY3Rvcihtb2RlbCk7CiAgICB9CgogICAgX19pbnNlcnRJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX3Bvb2wucG9wKCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgLy8gVE9ETyhrc2NoYWFmKTogSWYgdGhlIHBvb2wgaXMgc2hhcmVkIGFjcm9zcyB0dXJucywgaG9zdFByb3BzCiAgICAgICAgLy8gbmVlZCB0byBiZSByZS1zZXQgdG8gcmV1c2VkIGluc3RhbmNlcyBpbiBhZGRpdGlvbiB0byBpdGVtCiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuYXMsIGl0ZW0pOwogICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLml0ZW1zSW5kZXhBcywgaXRlbUlkeCk7CiAgICAgICAgaW5zdC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5zdCA9IHRoaXMuX19zdGFtcEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpOwogICAgICB9CiAgICAgIGxldCBiZWZvcmVSb3cgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHggKyAxXTsKICAgICAgbGV0IGJlZm9yZU5vZGUgPSBiZWZvcmVSb3cgPyBiZWZvcmVSb3cuY2hpbGRyZW5bMF0gOiB0aGlzOwogICAgICB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGluc3Qucm9vdCwgYmVmb3JlTm9kZSk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeF0gPSBpbnN0OwogICAgICByZXR1cm4gaW5zdDsKICAgIH0KCiAgICAvLyBJbXBsZW1lbnRzIGV4dGVuc2lvbiBwb2ludCBmcm9tIFRlbXBsYXRpemUgbWl4aW4KICAgIC8qKgogICAgICogU2hvd3Mgb3IgaGlkZXMgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRvcCBsZXZlbCBjaGlsZCBlbGVtZW50cy4gRm9yCiAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAqICJzaG93bi4iCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhpZGRlbiBTZXQgdG8gdHJ1ZSB0byBoaWRlIHRoZSBjaGlsZHJlbjsKICAgICAqIHNldCB0byBmYWxzZSB0byBzaG93IHRoZW0uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pIHsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9faW5zdGFuY2VzW2ldLl9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBDYWxsZWQgYXMgYSBzaWRlIGVmZmVjdCBvZiBhIGhvc3QgaXRlbXMuPGtleT4uPHBhdGg+IHBhdGggY2hhbmdlLAogICAgLy8gcmVzcG9uc2libGUgZm9yIG5vdGlmeWluZyBpdGVtLjxwYXRoPiBjaGFuZ2VzIHRvIGluc3QgZm9yIGtleQogICAgX19oYW5kbGVJdGVtUGF0aChwYXRoLCB2YWx1ZSkgewogICAgICBsZXQgaXRlbXNQYXRoID0gcGF0aC5zbGljZSg2KTsgLy8gJ2l0ZW1zLicubGVuZ3RoID09IDYKICAgICAgbGV0IGRvdCA9IGl0ZW1zUGF0aC5pbmRleE9mKCcuJyk7CiAgICAgIGxldCBpdGVtc0lkeCA9IGRvdCA8IDAgPyBpdGVtc1BhdGggOiBpdGVtc1BhdGguc3Vic3RyaW5nKDAsIGRvdCk7CiAgICAgIC8vIElmIHBhdGggd2FzIGluZGV4IGludG8gYXJyYXkuLi4KICAgICAgaWYgKGl0ZW1zSWR4ID09IHBhcnNlSW50KGl0ZW1zSWR4LCAxMCkpIHsKICAgICAgICBsZXQgaXRlbVN1YlBhdGggPSBkb3QgPCAwID8gJycgOiBpdGVtc1BhdGguc3Vic3RyaW5nKGRvdCsxKTsKICAgICAgICAvLyBJZiB0aGUgcGF0aCBpcyBvYnNlcnZlZCwgaXQgd2lsbCB0cmlnZ2VyIGEgZnVsbCByZWZyZXNoCiAgICAgICAgdGhpcy5fX2hhbmRsZU9ic2VydmVkUGF0aHMoaXRlbVN1YlBhdGgpOwogICAgICAgIC8vIE5vdGUsIGV2ZW4gaWYgYSBydWxsIHJlZnJlc2ggaXMgdHJpZ2dlcmVkLCBhbHdheXMgZG8gdGhlIHBhdGgKICAgICAgICAvLyBub3RpZmljYXRpb24gYmVjYXVzZSB1bmxlc3MgbXV0YWJsZURhdGEgaXMgdXNlZCBmb3IgZG9tLXJlcGVhdAogICAgICAgIC8vIGFuZCBhbGwgZWxlbWVudHMgaW4gdGhlIGluc3RhbmNlIHN1YnRyZWUsIGEgZnVsbCByZWZyZXNoIG1heQogICAgICAgIC8vIG5vdCB0cmlnZ2VyIHRoZSBwcm9wZXIgdXBkYXRlLgogICAgICAgIGxldCBpbnN0SWR4ID0gdGhpcy5fX2l0ZW1zSWR4VG9JbnN0SWR4W2l0ZW1zSWR4XTsKICAgICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeF07CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGxldCBpdGVtUGF0aCA9IHRoaXMuYXMgKyAoaXRlbVN1YlBhdGggPyAnLicgKyBpdGVtU3ViUGF0aCA6ICcnKTsKICAgICAgICAgIC8vIFRoaXMgaXMgZWZmZWN0aXZlbHkgYG5vdGlmeVBhdGhgLCBidXQgYXZvaWRzIHNvbWUgb2YgdGhlIG92ZXJoZWFkCiAgICAgICAgICAvLyBvZiB0aGUgcHVibGljIEFQSQogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKGl0ZW1QYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgaW5zdC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieQogICAgICogdGhpcyBgZG9tLXJlcGVhdGAuCiAgICAgKgogICAgICogTm90ZSwgdG8gbW9kaWZ5IHN1Yi1wcm9wZXJ0aWVzIG9mIHRoZSBpdGVtLAogICAgICogYG1vZGVsRm9yRWxlbWVudChlbCkuc2V0KCdpdGVtLjxzdWItcHJvcD4nLCB2YWx1ZSlgCiAgICAgKiBzaG91bGQgYmUgdXNlZC4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpdGVtLgogICAgICogQHJldHVybiB7Kn0gSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQuCiAgICAgKi8KICAgIGl0ZW1Gb3JFbGVtZW50KGVsKSB7CiAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMubW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW3RoaXMuYXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaW5zdCBpbmRleCBmb3IgYSBnaXZlbiBlbGVtZW50IHN0YW1wZWQgYnkgdGhpcyBgZG9tLXJlcGVhdGAuCiAgICAgKiBJZiBgc29ydGAgaXMgcHJvdmlkZWQsIHRoZSBpbmRleCB3aWxsIHJlZmxlY3QgdGhlIHNvcnRlZCBvcmRlciAocmF0aGVyCiAgICAgKiB0aGFuIHRoZSBvcmlnaW5hbCBhcnJheSBvcmRlcikuCiAgICAgKgogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgaW5kZXguCiAgICAgKiBAcmV0dXJuIHs/bnVtYmVyfSBSb3cgaW5kZXggYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50IChub3RlIHRoaXMgbWF5CiAgICAgKiAgIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBhcnJheSBpbmRleCBpZiBhIHVzZXIgYHNvcnRgIGlzIGFwcGxpZWQpLgogICAgICovCiAgICBpbmRleEZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5pbmRleEFzXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAqIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzCiAgICAgKiBjb250YWluZWQgaW4uIEEgdGVtcGxhdGUgbW9kZWwgaXMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuQmFzZWAsIGFuZAogICAgICogc2hvdWxkIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICBsZXQgbW9kZWwgPSBtb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICogICAgIG1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7CiAgICAgKiAgIH0KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIGEgdGVtcGxhdGUgbW9kZWwuCiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gTW9kZWwgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIHNjb3BlIGZvcgogICAgICogICB0aGUgZWxlbWVudC4KICAgICAqLwogICAgbW9kZWxGb3JFbGVtZW50KGVsKSB7CiAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMudGVtcGxhdGUsIGVsKTsKICAgIH0KCiAgfQoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoRG9tUmVwZWF0LmlzLCBEb21SZXBlYXQpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21SZXBlYXQgPSBEb21SZXBlYXQ7Cgp9KSgpOwoKPC9zY3JpcHQ+PHNjcmlwdD4KCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFRoZSBgPGRvbS1pZj5gIGVsZW1lbnQgd2lsbCBzdGFtcCBhIGxpZ2h0LWRvbSBgPHRlbXBsYXRlPmAgY2hpbGQgd2hlbgogICAqIHRoZSBgaWZgIHByb3BlcnR5IGJlY29tZXMgdHJ1dGh5LCBhbmQgdGhlIHRlbXBsYXRlIGNhbiB1c2UgUG9seW1lcgogICAqIGRhdGEtYmluZGluZyBhbmQgZGVjbGFyYXRpdmUgZXZlbnQgZmVhdHVyZXMgd2hlbiB1c2VkIGluIHRoZSBjb250ZXh0IG9mCiAgICogYSBQb2x5bWVyIGVsZW1lbnQncyB0ZW1wbGF0ZS4KICAgKgogICAqIFdoZW4gYGlmYCBiZWNvbWVzIGZhbHN5LCB0aGUgc3RhbXBlZCBjb250ZW50IGlzIGhpZGRlbiBidXQgbm90CiAgICogcmVtb3ZlZCBmcm9tIGRvbS4gV2hlbiBgaWZgIHN1YnNlcXVlbnRseSBiZWNvbWVzIHRydXRoeSBhZ2FpbiwgdGhlIGNvbnRlbnQKICAgKiBpcyBzaW1wbHkgcmUtc2hvd24uIFRoaXMgYXBwcm9hY2ggaXMgdXNlZCBkdWUgdG8gaXRzIGZhdm9yYWJsZSBwZXJmb3JtYW5jZQogICAqIGNoYXJhY3RlcmlzdGljczogdGhlIGV4cGVuc2Ugb2YgY3JlYXRpbmcgdGVtcGxhdGUgY29udGVudCBpcyBwYWlkIG9ubHkKICAgKiBvbmNlIGFuZCBsYXppbHkuCiAgICoKICAgKiBTZXQgdGhlIGByZXN0YW1wYCBwcm9wZXJ0eSB0byB0cnVlIHRvIGZvcmNlIHRoZSBzdGFtcGVkIGNvbnRlbnQgdG8gYmUKICAgKiBjcmVhdGVkIC8gZGVzdHJveWVkIHdoZW4gdGhlIGBpZmAgY29uZGl0aW9uIGNoYW5nZXMuCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBwb2x5bWVyCiAgICogQGV4dGVuZHMgUG9seW1lci5FbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGNvbmRpdGlvbmFsbHkgc3RhbXBzIGFuZCBoaWRlcyBvciByZW1vdmVzCiAgICogICB0ZW1wbGF0ZSBjb250ZW50IGJhc2VkIG9uIGEgYm9vbGVhbiBmbGFnLgogICAqLwogIGNsYXNzIERvbUlmIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKCiAgICAvLyBOb3QgbmVlZGVkIHRvIGZpbmQgdGVtcGxhdGU7IGNhbiBiZSByZW1vdmVkIG9uY2UgdGhlIGFuYWx5emVyCiAgICAvLyBjYW4gZmluZCB0aGUgdGFnIG5hbWUgZnJvbSBjdXN0b21FbGVtZW50cy5kZWZpbmUgY2FsbAogICAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdkb20taWYnOyB9CgogICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsgcmV0dXJuIG51bGw7IH0KCiAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICByZXR1cm4gewoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlZCB3aGVuZXZlciBET00gaXMgYWRkZWQgb3IgcmVtb3ZlZC9oaWRkZW4gYnkgdGhpcyB0ZW1wbGF0ZSAoYnkKICAgICAgICAgKiBkZWZhdWx0LCByZW5kZXJpbmcgb2NjdXJzIGxhemlseSkuICBUbyBmb3JjZSBpbW1lZGlhdGUgcmVuZGVyaW5nLCBjYWxsCiAgICAgICAgICogYHJlbmRlcmAuCiAgICAgICAgICoKICAgICAgICAgKiBAZXZlbnQgZG9tLWNoYW5nZQogICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgdGVtcGxhdGUgc2hvdWxkIHN0YW1wLgogICAgICAgICAqLwogICAgICAgIGlmOiB7CiAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX2RlYm91bmNlUmVuZGVyJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdHJ1ZSwgZWxlbWVudHMgd2lsbCBiZSByZW1vdmVkIGZyb20gRE9NIGFuZCBkaXNjYXJkZWQgd2hlbiBgaWZgCiAgICAgICAgICogYmVjb21lcyBmYWxzZSBhbmQgcmUtY3JlYXRlZCBhbmQgYWRkZWQgYmFjayB0byB0aGUgRE9NIHdoZW4gYGlmYAogICAgICAgICAqIGJlY29tZXMgdHJ1ZS4gIEJ5IGRlZmF1bHQsIHN0YW1wZWQgZWxlbWVudHMgd2lsbCBiZSBoaWRkZW4gYnV0IGxlZnQKICAgICAgICAgKiBpbiB0aGUgRE9NIHdoZW4gYGlmYCBiZWNvbWVzIGZhbHNlLCB3aGljaCBpcyBnZW5lcmFsbHkgcmVzdWx0cwogICAgICAgICAqIGluIGJldHRlciBwZXJmb3JtYW5jZS4KICAgICAgICAgKi8KICAgICAgICByZXN0YW1wOiB7CiAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX2RlYm91bmNlUmVuZGVyJwogICAgICAgIH0KCiAgICAgIH07CgogICAgfQoKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyID0gbnVsbDsKICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG51bGw7CiAgICAgIHRoaXMuX2xhc3RJZiA9IGZhbHNlOwogICAgICB0aGlzLl9fY3RvciA9IG51bGw7CiAgICB9CgogICAgX19kZWJvdW5jZVJlbmRlcigpIHsKICAgICAgLy8gUmVuZGVyIGlzIGFzeW5jIGZvciAyIHJlYXNvbnM6CiAgICAgIC8vIDEuIFRvIGVsaW1pbmF0ZSBkb20gY3JlYXRpb24gdHJhc2hpbmcgaWYgdXNlciBjb2RlIHRocmFzaGVzIGBpZmAgaW4gdGhlCiAgICAgIC8vICAgIHNhbWUgdHVybi4gVGhpcyB3YXMgbW9yZSBjb21tb24gaW4gMS54IHdoZXJlIGEgY29tcG91bmQgY29tcHV0ZWQKICAgICAgLy8gICAgcHJvcGVydHkgY291bGQgcmVzdWx0IGluIHRoZSByZXN1bHQgY2hhbmdpbmcgbXVsdGlwbGUgdGltZXMsIGJ1dCBpcwogICAgICAvLyAgICBtaXRpZ2F0ZWQgdG8gYSBsYXJnZSBleHRlbnQgYnkgYmF0Y2hlZCBwcm9wZXJ0eSBwcm9jZXNzaW5nIGluIDIueC4KICAgICAgLy8gMi4gVG8gYXZvaWQgZG91YmxlIG9iamVjdCBwcm9wYWdhdGlvbiB3aGVuIGEgYmFnIGluY2x1ZGluZyB2YWx1ZXMgYm91bmQKICAgICAgLy8gICAgdG8gdGhlIGBpZmAgcHJvcGVydHkgYXMgd2VsbCBhcyBvbmUgb3IgbW9yZSBob3N0UHJvcHMgY291bGQgZW5xdWV1ZQogICAgICAvLyAgICB0aGUgPGRvbS1pZj4gdG8gZmx1c2ggYmVmb3JlIHRoZSA8dGVtcGxhdGU+J3MgaG9zdCBwcm9wZXJ0eQogICAgICAvLyAgICBmb3J3YXJkaW5nLiBJbiB0aGF0IHNjZW5hcmlvIGNyZWF0aW5nIGFuIGluc3RhbmNlIHdvdWxkIHJlc3VsdCBpbgogICAgICAvLyAgICB0aGUgaG9zdCBwcm9wcyBiZWluZyBzZXQgb25jZSwgYW5kIHRoZW4gdGhlIGVucXVldWVkIGNoYW5nZXMgb24gdGhlCiAgICAgIC8vICAgIHRlbXBsYXRlIHdvdWxkIHNldCBwcm9wZXJ0aWVzIGEgc2Vjb25kIHRpbWUsIHBvdGVudGlhbGx5IGNhdXNpbmcgYW4KICAgICAgLy8gICAgb2JqZWN0IHRvIGJlIHNldCB0byBhbiBpbnN0YW5jZSBtb3JlIHRoYW4gb25jZS4gIENyZWF0aW5nIHRoZQogICAgICAvLyAgICBpbnN0YW5jZSBhc3luYyBmcm9tIGZsdXNoaW5nIGRhdGEgZW5zdXJlcyB0aGlzIGRvZXNuJ3QgaGFwcGVuLiBJZgogICAgICAvLyAgICB3ZSB3YW50ZWQgYSBzeW5jIG9wdGlvbiBpbiB0aGUgZnV0dXJlLCBzaW1wbHkgaGF2aW5nIDxkb20taWY+IGZsdXNoCiAgICAgIC8vICAgIChvciBjbGVhcikgaXRzIHRlbXBsYXRlJ3MgcGVuZGluZyBob3N0IHByb3BlcnRpZXMgYmVmb3JlIGNyZWF0aW5nCiAgICAgIC8vICAgIHRoZSBpbnN0YW5jZSB3b3VsZCBhbHNvIGF2b2lkIHRoZSBwcm9ibGVtLgogICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIKICAgICAgICAgICwgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICwgKCkgPT4gdGhpcy5fX3JlbmRlcigpKTsKICAgICAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICghdGhpcy5wYXJlbnROb2RlIHx8CiAgICAgICAgICAodGhpcy5wYXJlbnROb2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAmJgogICAgICAgICAgICF0aGlzLnBhcmVudE5vZGUuaG9zdCkpIHsKICAgICAgICB0aGlzLl9fdGVhcmRvd25JbnN0YW5jZSgpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBpZiAodGhpcy5pZikgewogICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcigpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JjZXMgdGhlIGVsZW1lbnQgdG8gcmVuZGVyIGl0cyBjb250ZW50LiBOb3JtYWxseSByZW5kZXJpbmcgaXMKICAgICAqIGFzeW5jaHJvbm91cyB0byBhIHByb3Zva2luZyBjaGFuZ2UuIFRoaXMgaXMgZG9uZSBmb3IgZWZmaWNpZW5jeSBzbwogICAgICogdGhhdCBtdWx0aXBsZSBjaGFuZ2VzIHRyaWdnZXIgb25seSBhIHNpbmdsZSByZW5kZXIuIFRoZSByZW5kZXIgbWV0aG9kCiAgICAgKiBzaG91bGQgYmUgY2FsbGVkIGlmLCBmb3IgZXhhbXBsZSwgdGVtcGxhdGUgcmVuZGVyaW5nIGlzIHJlcXVpcmVkIHRvCiAgICAgKiB2YWxpZGF0ZSBhcHBsaWNhdGlvbiBzdGF0ZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlbmRlcigpIHsKICAgICAgUG9seW1lci5mbHVzaCgpOwogICAgfQoKICAgIF9fcmVuZGVyKCkgewogICAgICBpZiAodGhpcy5pZikgewogICAgICAgIGlmICghdGhpcy5fX2Vuc3VyZUluc3RhbmNlKCkpIHsKICAgICAgICAgIC8vIE5vIHRlbXBsYXRlIGZvdW5kIHlldAogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9zaG93SGlkZUNoaWxkcmVuKCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXN0YW1wKSB7CiAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgfQogICAgICBpZiAoIXRoaXMucmVzdGFtcCAmJiB0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICB0aGlzLl9zaG93SGlkZUNoaWxkcmVuKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuaWYgIT0gdGhpcy5fbGFzdElmKSB7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZG9tLWNoYW5nZScsIHsKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLl9sYXN0SWYgPSB0aGlzLmlmOwogICAgICB9CiAgICB9CgogICAgX19lbnN1cmVJbnN0YW5jZSgpIHsKICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgIC8vIEd1YXJkIGFnYWluc3QgZWxlbWVudCBiZWluZyBkZXRhY2hlZCB3aGlsZSByZW5kZXIgd2FzIHF1ZXVlZAogICAgICBpZiAocGFyZW50Tm9kZSkgewogICAgICAgIGlmICghdGhpcy5fX2N0b3IpIHsKICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIHRoaXMuX19yZW5kZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20taWYgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgICAgLy8gZG9tLWlmIHRlbXBsYXRpemVyIGluc3RhbmNlcyByZXF1aXJlIGBtdXRhYmxlOiB0cnVlYCwgYXMKICAgICAgICAgICAgLy8gYF9fc3luY0hvc3RQcm9wZXJ0aWVzYCByZWxpZXMgb24gdGhhdCBiZWhhdmlvciB0byBzeW5jIG9iamVjdHMKICAgICAgICAgICAgbXV0YWJsZURhdGE6IHRydWUsCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0byBmb3J3YXJkCiAgICAgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb2YgcHJvcGVydHkKICAgICAgICAgICAgICogQHRoaXMge3RoaXN9CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5fX2luc3RhbmNlLmZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluc3RhbmNlIGJ1dCBhcmUgc3F1ZWxjaGluZyBob3N0IHByb3BlcnR5CiAgICAgICAgICAgICAgICAgIC8vIGZvcndhcmRpbmcgZHVlIHRvIGlmIGJlaW5nIGZhbHNlLCBub3RlIHRoZSBpbnZhbGlkYXRlZAogICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIHNvIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgY2FuIHN5bmMgdGhlbSB0aGUgbmV4dAogICAgICAgICAgICAgICAgICAvLyB0aW1lIGBpZmAgYmVjb21lcyB0cnVlCiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSB0aGlzLl9faW52YWxpZFByb3BzIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHNbUG9seW1lci5QYXRoLnJvb3QocHJvcCldID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuX19pbnN0YW5jZSkgewogICAgICAgICAgdGhpcy5fX2luc3RhbmNlID0gbmV3IHRoaXMuX19jdG9yKCk7CiAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLl9faW5zdGFuY2Uucm9vdCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zeW5jSG9zdFByb3BlcnRpZXMoKTsKICAgICAgICAgIGxldCBjJCA9IHRoaXMuX19pbnN0YW5jZS5jaGlsZHJlbjsKICAgICAgICAgIGlmIChjJCAmJiBjJC5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gRGV0ZWN0IGNhc2Ugd2hlcmUgZG9tLWlmIHdhcyByZS1hdHRhY2hlZCBpbiBuZXcgcG9zaXRpb24KICAgICAgICAgICAgbGV0IGxhc3RDaGlsZCA9IHRoaXMucHJldmlvdXNTaWJsaW5nOwogICAgICAgICAgICBpZiAobGFzdENoaWxkICE9PSBjJFtjJC5sZW5ndGgtMV0pIHsKICAgICAgICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPGMkLmxlbmd0aCkgJiYgKG49YyRbaV0pOyBpKyspIHsKICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG4sIHRoaXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBfX3N5bmNIb3N0UHJvcGVydGllcygpIHsKICAgICAgbGV0IHByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wczsKICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgdGhpcy5fX2luc3RhbmNlLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcCwgdGhpcy5fX2RhdGFIb3N0W3Byb3BdKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgICAgdGhpcy5fX2luc3RhbmNlLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgfQogICAgfQoKICAgIF9fdGVhcmRvd25JbnN0YW5jZSgpIHsKICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIGxldCBjJCA9IHRoaXMuX19pbnN0YW5jZS5jaGlsZHJlbjsKICAgICAgICBpZiAoYyQgJiYgYyQubGVuZ3RoKSB7CiAgICAgICAgICAvLyB1c2UgZmlyc3QgY2hpbGQgcGFyZW50LCBmb3IgY2FzZSB3aGVuIGRvbS1pZiBtYXkgaGF2ZSBiZWVuIGRldGFjaGVkCiAgICAgICAgICBsZXQgcGFyZW50ID0gYyRbMF0ucGFyZW50Tm9kZTsKICAgICAgICAgIC8vIEluc3RhbmNlIGNoaWxkcmVuIG1heSBiZSBkaXNjb25uZWN0ZWQgZnJvbSBwYXJlbnRzIHdoZW4gZG9tLWlmCiAgICAgICAgICAvLyBkZXRhY2hlcyBpZiBhIHRyZWUgd2FzIGlubmVySFRNTCdlZAogICAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPGMkLmxlbmd0aCkgJiYgKG49YyRbaV0pOyBpKyspIHsKICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fX2luc3RhbmNlID0gbnVsbDsKICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2hvd3Mgb3IgaGlkZXMgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRvcCBsZXZlbCBjaGlsZCBlbGVtZW50cy4gRm9yCiAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAqICJzaG93bi4iCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvd0hpZGVDaGlsZHJlbigpIHsKICAgICAgbGV0IGhpZGRlbiA9IHRoaXMuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fIHx8ICF0aGlzLmlmOwogICAgICBpZiAodGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgdGhpcy5fX2luc3RhbmNlLl9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbik7CiAgICAgIH0KICAgIH0KCiAgfQoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoRG9tSWYuaXMsIERvbUlmKTsKCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRG9tSWYgPSBEb21JZjsKCn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+CihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgKiBtYXN0ZXIgYXJyYXkgKGF0IHRoZSBob3N0KSBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUKICAgKiBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEBwb2x5bWVyCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5CiAgICovCiAgbGV0IEFycmF5U2VsZWN0b3JNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBsZXQgZWxlbWVudEJhc2UgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBBcnJheVNlbGVjdG9yTWl4aW4gZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGZyb20gd2hpY2ggc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICAgKiBgc2VsZWN0ZWRgIGlzIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcykuICBXaGVuIGBmYWxzZWAsCiAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFueSBzZWxlY3RlZC4KICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/KE9iamVjdHxBcnJheTwhT2JqZWN0Pil9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgKiBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgogICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgKiB3aWxsIGRlc2VsZWN0IHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICB0b2dnbGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbJ19fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSddOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBudWxsOwogICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICBsZXQgcGF0aCA9IGl0ZW1zSW5mby5wYXRoOwogICAgICAgIGlmIChwYXRoID09ICdpdGVtcycpIHsKICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgbGV0IG5ld0l0ZW1zID0gaXRlbXNJbmZvLmJhc2UgfHwgW107CiAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgIGxldCBsYXN0TXVsdGkgPSB0aGlzLl9fbGFzdE11bHRpOwogICAgICAgICAgaWYgKG11bHRpICE9PSBsYXN0TXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxhc3RJdGVtcykgewogICAgICAgICAgICBsZXQgc3BsaWNlcyA9IFBvbHltZXIuQXJyYXlTcGxpY2UuY2FsY3VsYXRlU3BsaWNlcyhuZXdJdGVtcywgbGFzdEl0ZW1zKTsKICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBuZXdJdGVtczsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zSW5mby5wYXRoID09ICdpdGVtcy5zcGxpY2VzJykgewogICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhpdGVtc0luZm8udmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ2FzZSAzIC0gYW4gYXJyYXkgZWxlbWVudCB3YXMgY2hhbmdlZCwgc28gZGVzZWxlY3QgdGhlIHByZXZpb3VzCiAgICAgICAgICAvLyBpdGVtIGZvciB0aGF0IGluZGV4IGlmIGl0IHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkCiAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoJ2l0ZW1zLicubGVuZ3RoKTsKICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChwYXJ0LCAxMCk7CiAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgdGhpcy5fX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19hcHBseVNwbGljZXMoc3BsaWNlcykgewogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAvLyBBZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcyBhbmQgbWFyayByZW1vdmFscwogICAgICAgIGZvciAobGV0IGk9MDsgaTxzcGxpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICBzZWxlY3RlZC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA8IHMuaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UKICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPj0gcy5pbmRleCArIHMucmVtb3ZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBhZGp1c3QgaW5kZXgKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgbGV0IGlkeCA9IHMuaW5kZXggKyBqOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQuaGFzKHRoaXMuaXRlbXNbaWR4XSkpIHsKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgcGF0aHMKICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICBsZXQgc2lkeCA9IDA7CiAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2lkeCsrOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ2l0ZW1zLicgKyBpZHgsICdzZWxlY3RlZC4nICsgc2lkeCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZCcsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ3NlbGVjdGVkSXRlbScsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7CiAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgbWFwIHN0b3JlcyAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgIC8vIHZhbHVlOiBpdGVtcyBhcnJheSBpbmRleAogICAgICAgIC8vIG9yZGVyOiBzZWxlY3RlZCBhcnJheSBpbmRleAogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gW10gOiBudWxsOwogICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byB0ZXN0CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICovCiAgICAgIGlzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc0luZGV4U2VsZWN0ZWQoaWR4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICB9CgogICAgICBfX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpIHsKICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgaWYgKHNpZHggPj0gMCkgewogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoc2lkeCA9PSBpKyspIHsKICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzWydpdGVtcy4nICsgaWR4XTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChzZWxlY3RlZC5zbGljZSgnc2VsZWN0ZWQuJy5sZW5ndGgpLCAxMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpdGVtIGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgIGxldCBpZHggPSB0aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KGl0ZW0pOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIGxldCBzaWR4OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGluZGV4IGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIGRlc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIHRoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07CiAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgIHRoaXMuX191cGRhdGVMaW5rcygpOwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCdzZWxlY3RlZCcsIGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0SW5kZXgoaWR4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgfSk7CgogIC8vIGV4cG9ydCBtaXhpbgogIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluID0gQXJyYXlTZWxlY3Rvck1peGluOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGxldCBiYXNlQXJyYXlTZWxlY3RvciA9IEFycmF5U2VsZWN0b3JNaXhpbihQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBFbGVtZW50IGltcGxlbWVudGluZyB0aGUgYFBvbHltZXIuQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgKiBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYSBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYQogICAqIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUgbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkKICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgKiBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGlkPSJlbXBsb3llZUxpc3QiIGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGJ1dHRvbiBvbi1jbGljaz0idG9nZ2xlU2VsZWN0aW9uIj5TZWxlY3Q8L2J1dHRvbj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAqCiAgICogICAgIDxkaXY+IFNlbGVjdGVkIGVtcGxveWVlczogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e3NlbGVjdGVkfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBgYGBqcwogICAqY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAqICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgcmV0dXJuIHsKICAgKiAgICAgIGVtcGxveWVlczogewogICAqICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICogICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICBdOwogICAqICAgICAgICB9CiAgICogICAgICB9CiAgICogICAgfTsKICAgKiAgfQogICAqICB0b2dnbGVTZWxlY3Rpb24oZSkgewogICAqICAgIGxldCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICogICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgKiAgfQogICAqfQogICAqIGBgYAogICAqCiAgICogQHBvbHltZXIKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIHtiYXNlQXJyYXlTZWxlY3Rvcn0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGxpbmtzIHBhdGhzIGJldHdlZW4gYW4gaW5wdXQgYGl0ZW1zYCBhcnJheSBhbmQKICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICovCiAgY2xhc3MgQXJyYXlTZWxlY3RvciBleHRlbmRzIGJhc2VBcnJheVNlbGVjdG9yIHsKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2FycmF5LXNlbGVjdG9yJzsgfQogIH0KICBjdXN0b21FbGVtZW50cy5kZWZpbmUoQXJyYXlTZWxlY3Rvci5pcywgQXJyYXlTZWxlY3Rvcik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yOwoKfSkoKTsKCjwvc2NyaXB0PjxzY3JpcHQ+KGZ1bmN0aW9uKCl7LyoKCkNvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCid1c2Ugc3RyaWN0Jzt2YXIgYz1udWxsLGY9d2luZG93LkhUTUxJbXBvcnRzJiZ3aW5kb3cuSFRNTEltcG9ydHMud2hlblJlYWR5fHxudWxsLGc7ZnVuY3Rpb24gaChhKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtmP2YoYSk6KGN8fChjPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe2c9YX0pLCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP2coKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbigpeyJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlJiZnKCl9KSksYy50aGVuKGZ1bmN0aW9uKCl7YSYmYSgpfSkpfSl9O3ZhciBrPW51bGwsbD1udWxsO2Z1bmN0aW9uIG0oKXt0aGlzLmN1c3RvbVN0eWxlcz1bXTt0aGlzLmVucXVldWVkPSExO2goZnVuY3Rpb24oKXt3aW5kb3cuU2hhZHlDU1MuZmx1c2hDdXN0b21TdHlsZXMmJndpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcygpfSl9ZnVuY3Rpb24gbihhKXshYS5lbnF1ZXVlZCYmbCYmKGEuZW5xdWV1ZWQ9ITAsaChsKSl9bS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthLl9fc2VlbkJ5U2hhZHlDU1N8fChhLl9fc2VlbkJ5U2hhZHlDU1M9ITAsdGhpcy5jdXN0b21TdHlsZXMucHVzaChhKSxuKHRoaXMpKX07bS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXtpZihhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSlyZXR1cm4gYS5fX3NoYWR5Q1NTQ2FjaGVkU3R5bGU7dmFyIGI7YS5nZXRTdHlsZT9iPWEuZ2V0U3R5bGUoKTpiPWE7cmV0dXJuIGJ9OwptLnByb3RvdHlwZS5hPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuY3VzdG9tU3R5bGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXTtpZighZC5fX3NoYWR5Q1NTQ2FjaGVkU3R5bGUpe3ZhciBlPXRoaXMuYihkKTtlJiYoZT1lLl9fYXBwbGllZEVsZW1lbnR8fGUsayYmayhlKSxkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZT1lKX19cmV0dXJuIGF9O20ucHJvdG90eXBlLmFkZEN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmM7bS5wcm90b3R5cGUuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZT1tLnByb3RvdHlwZS5iO20ucHJvdG90eXBlLnByb2Nlc3NTdHlsZXM9bS5wcm90b3R5cGUuYTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobS5wcm90b3R5cGUse3RyYW5zZm9ybUNhbGxiYWNrOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ga30sc2V0OmZ1bmN0aW9uKGEpe2s9YX19LHZhbGlkYXRlQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBsfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7bHx8KGI9ITApO2w9YTtiJiZuKHRoaXMpfX19KTtmdW5jdGlvbiBwKGEsYil7Zm9yKHZhciBkIGluIGIpbnVsbD09PWQ/YS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShkKTphLnN0eWxlLnNldFByb3BlcnR5KGQsYltkXSl9O3ZhciBxPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHI7ZnVuY3Rpb24gdChhKXtyPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6cXx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdTt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHU9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgdj0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/cj13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzOndpbmRvdy5TaGFkeUNTUz8odCh3aW5kb3cuU2hhZHlDU1MpLHdpbmRvdy5TaGFkeUNTUz12b2lkIDApOnQod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgdz1yLHg9dTt2YXIgeT1uZXcgbTt3aW5kb3cuU2hhZHlDU1N8fCh3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbigpe30scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe3kuYSgpO3AoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKCl7eS5hKCl9LHN0eWxlRG9jdW1lbnQ6ZnVuY3Rpb24oYSl7eS5hKCk7cChkb2N1bWVudC5ib2R5LGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXt9LG5hdGl2ZUNzczp3LG5hdGl2ZVNoYWRvdzpxLGNzc0J1aWxkOngsZGlzYWJsZVJ1bnRpbWU6dn0pO3dpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT15O30pLmNhbGwodGhpcyk7CgoKPC9zY3JpcHQ+PHNjcmlwdD4KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgYXR0ciA9ICdpbmNsdWRlJzsKCiAgY29uc3QgQ3VzdG9tU3R5bGVJbnRlcmZhY2UgPSB3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2U7CgogIC8qKgogICAqIEN1c3RvbSBlbGVtZW50IGZvciBkZWZpbmluZyBzdHlsZXMgaW4gdGhlIG1haW4gZG9jdW1lbnQgdGhhdCBjYW4gdGFrZQogICAqIGFkdmFudGFnZSBvZiBbc2hhZHkgRE9NXShodHRwczovL2dpdGh1Yi5jb20vd2ViY29tcG9uZW50cy9zaGFkeWNzcykgc2hpbXMKICAgKiBmb3Igc3R5bGUgZW5jYXBzdWxhdGlvbiwgY3VzdG9tIHByb3BlcnRpZXMsIGFuZCBjdXN0b20gbWl4aW5zLgogICAqCiAgICogLSBEb2N1bWVudCBzdHlsZXMgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAgYXJlIHNoaW1tZWQgdG8gZW5zdXJlIHRoZXkKICAgKiAgIGRvIG5vdCBsZWFrIGludG8gbG9jYWwgRE9NIHdoZW4gcnVubmluZyBvbiBicm93c2VycyB3aXRob3V0IG5hdGl2ZQogICAqICAgU2hhZG93IERPTS4KICAgKiAtIEN1c3RvbSBwcm9wZXJ0aWVzIGNhbiBiZSBkZWZpbmVkIGluIGEgYDxjdXN0b20tc3R5bGU+YC4gVXNlIHRoZSBgaHRtbGAgc2VsZWN0b3IKICAgKiAgIHRvIGRlZmluZSBjdXN0b20gcHJvcGVydGllcyB0aGF0IGFwcGx5IHRvIGFsbCBjdXN0b20gZWxlbWVudHMuCiAgICogLSBDdXN0b20gbWl4aW5zIGNhbiBiZSBkZWZpbmVkIGluIGEgYDxjdXN0b20tc3R5bGU+YCwgaWYgeW91IGltcG9ydCB0aGUgb3B0aW9uYWwKICAgKiAgIFthcHBseSBzaGltXShodHRwczovL2dpdGh1Yi5jb20vd2ViY29tcG9uZW50cy9zaGFkeWNzcyNhYm91dC1hcHBseXNoaW0pCiAgICogICAoYHNoYWR5Y3NzL2FwcGx5LXNoaW0uaHRtbGApLgogICAqCiAgICogVG8gdXNlOgogICAqCiAgICogLSBJbXBvcnQgYGN1c3RvbS1zdHlsZS5odG1sYC4KICAgKiAtIFBsYWNlIGEgYDxjdXN0b20tc3R5bGU+YCBlbGVtZW50IGluIHRoZSBtYWluIGRvY3VtZW50LCB3cmFwcGluZyBhbiBpbmxpbmUgYDxzdHlsZT5gIHRhZyB0aGF0CiAgICogICBjb250YWlucyB0aGUgQ1NTIHJ1bGVzIHlvdSB3YW50IHRvIHNoaW0uCiAgICoKICAgKiBGb3IgZXhhbXBsZToKICAgKgogICAqIGBgYGh0bWwKICAgKiA8IS0tIGltcG9ydCBhcHBseSBzaGltLS1vbmx5IHJlcXVpcmVkIGlmIHVzaW5nIG1peGlucyAtLT4KICAgKiA8bGluayByZWw9ImltcG9ydCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9zaGFkeWNzcy9hcHBseS1zaGltLmh0bWwiPgogICAqIDwhLS0gaW1wb3J0IGN1c3RvbS1zdHlsZSBlbGVtZW50IC0tPgogICAqIDxsaW5rIHJlbD0iaW1wb3J0IiBocmVmPSJib3dlcl9jb21wb25lbnRzL3BvbHltZXIvbGliL2VsZW1lbnRzL2N1c3RvbS1zdHlsZS5odG1sIj4KICAgKgogICAqIDxjdXN0b20tc3R5bGU+CiAgICogICA8c3R5bGU+CiAgICogICAgIGh0bWwgewogICAqICAgICAgIC0tY3VzdG9tLWNvbG9yOiBibHVlOwogICAqICAgICAgIC0tY3VzdG9tLW1peGluOiB7CiAgICogICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgKiAgICAgICAgIGNvbG9yOiByZWQ7CiAgICogICAgICAgfTsKICAgKiAgICAgfQogICAqICAgPC9zdHlsZT4KICAgKiA8L2N1c3RvbS1zdHlsZT4KICAgKiBgYGAKICAgKgogICAqIEBjdXN0b21FbGVtZW50CiAgICogQGV4dGVuZHMgSFRNTEVsZW1lbnQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEN1c3RvbSBlbGVtZW50IGZvciBkZWZpbmluZyBzdHlsZXMgaW4gdGhlIG1haW4gZG9jdW1lbnQgdGhhdCBjYW4KICAgKiAgIHRha2UgYWR2YW50YWdlIG9mIFBvbHltZXIncyBzdHlsZSBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydGllcyBzaGltcy4KICAgKi8KICBjbGFzcyBDdXN0b21TdHlsZSBleHRlbmRzIEhUTUxFbGVtZW50IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLl9zdHlsZSA9IG51bGw7CiAgICAgIEN1c3RvbVN0eWxlSW50ZXJmYWNlLmFkZEN1c3RvbVN0eWxlKHRoaXMpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsaWdodC1ET00gYDxzdHlsZT5gIGNoaWxkIHRoaXMgZWxlbWVudCB3cmFwcy4gIFVwb24gZmlyc3QKICAgICAqIGNhbGwgYW55IHN0eWxlIG1vZHVsZXMgcmVmZXJlbmNlZCB2aWEgdGhlIGBpbmNsdWRlYCBhdHRyaWJ1dGUgd2lsbCBiZQogICAgICogY29uY2F0ZW5hdGVkIHRvIHRoaXMgZWxlbWVudCdzIGA8c3R5bGU+YC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtIVE1MU3R5bGVFbGVtZW50fSBUaGlzIGVsZW1lbnQncyBsaWdodC1ET00gYDxzdHlsZT5gCiAgICAgKi8KICAgIGdldFN0eWxlKCkgewogICAgICBpZiAodGhpcy5fc3R5bGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGU7CiAgICAgIH0KICAgICAgY29uc3Qgc3R5bGUgPSAvKiogQHR5cGUge0hUTUxTdHlsZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3Rvcignc3R5bGUnKSk7CiAgICAgIGlmICghc3R5bGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICB0aGlzLl9zdHlsZSA9IHN0eWxlOwogICAgICBjb25zdCBpbmNsdWRlID0gc3R5bGUuZ2V0QXR0cmlidXRlKGF0dHIpOwogICAgICBpZiAoaW5jbHVkZSkgewogICAgICAgIHN0eWxlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTsKICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IFBvbHltZXIuU3R5bGVHYXRoZXIuY3NzRnJvbU1vZHVsZXMoaW5jbHVkZSkgKyBzdHlsZS50ZXh0Q29udGVudDsKICAgICAgfQogICAgICAvKgogICAgICBIVE1MIEltcG9ydHMgc3R5bGluZyB0aGUgbWFpbiBkb2N1bWVudCBhcmUgZGVwcmVjYXRlZCBpbiBDaHJvbWUKICAgICAgaHR0cHM6Ly9jcmJ1Zy5jb20vNTIzOTUyCgogICAgICBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IGluIHRoZSBtYWluIGRvY3VtZW50LCB0aGVuIGl0IG11c3QgYmUgaW4gYW4gSFRNTCBJbXBvcnQgZG9jdW1lbnQuCiAgICAgIEluIHRoYXQgY2FzZSwgbW92ZSB0aGUgY3VzdG9tIHN0eWxlIHRvIHRoZSBtYWluIGRvY3VtZW50LgoKICAgICAgVGhlIG9yZGVyaW5nIG9mIGA8Y3VzdG9tLXN0eWxlPmAgc2hvdWxkIHN0YXkgdGhlIHNhbWUgYXMgd2hlbiBsb2FkZWQgYnkgSFRNTCBJbXBvcnRzLCBidXQgdGhlcmUgbWF5IGJlIG9kZAogICAgICBjYXNlcyBvZiBvcmRlcmluZyB3LnIudCB0aGUgbWFpbiBkb2N1bWVudCBzdHlsZXMuCiAgICAgICovCiAgICAgIGlmICh0aGlzLm93bmVyRG9jdW1lbnQgIT09IHdpbmRvdy5kb2N1bWVudCkgewogICAgICAgIHdpbmRvdy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9zdHlsZTsKICAgIH0KICB9CgogIHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2N1c3RvbS1zdHlsZScsIEN1c3RvbVN0eWxlKTsKCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuQ3VzdG9tU3R5bGUgPSBDdXN0b21TdHlsZTsKfSkoKTsKPC9zY3JpcHQ+PHNjcmlwdD4KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZTsKICAvKiogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gKi8KICAoKCkgPT4gewogICAgbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwogIH0pKCk7CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMsCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpIGZvciB1c2Ugb24gbGVnYWN5IEFQSSBQb2x5bWVyIGVsZW1lbnRzLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBjYXVzZSBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgYXBwbHkgdGhpcyBiZWhhdmlvciBvciBlbmFibGUgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQHBvbHltZXJCZWhhdmlvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBwcm92aWRlIG9wdGlvbiBmb3Igc2tpcHBpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYAogICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBiZWhhdmlvciBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAqCiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBhZGRzIHRoZSBhYmlsaXR5IHRvIGZvcmdvIE9iamVjdC9BcnJheSBkaXJ0eSBjaGVja2luZywKICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICogc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlIHBhdHRlcm5zIG9yIFBvbHltZXIncyBwYXRoIG5vdGlmaWNhdGlvbgogICAqIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIC8qKgogICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICogZm9yIHRoaXMgZWxlbWVudC4gIFdoZW4gdHJ1ZSwgT2JqZWN0cyBhbmQgQXJyYXlzIHdpbGwgc2tpcCBkaXJ0eQogICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAqLwogICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbgogICAgfSwKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHNraXAgc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nCiAgICAgKiBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgIH0KICB9OwoKfSkoKTsKCjwvc2NyaXB0PjxzY3JpcHQ+CiAgLy8gYmMKICBQb2x5bWVyLkJhc2UgPSBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCkucHJvdG90eXBlOwoKICAvLyBOT1RFOiB0aGlzIGlzIGhlcmUgZm9yIG1vZHVsaXplciB0byBleHBvcnQgYGh0bWxgIGZvciB0aGUgbW9kdWxlIHZlcnNpb24gb2YgdGhpcyBmaWxlCiAgUG9seW1lci5odG1sID0gUG9seW1lci5odG1sOwo8L3NjcmlwdD48c2NyaXB0Pi8qCgogTG9kYXNoIDxodHRwczovL2xvZGFzaC5jb20vPgogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcy5mb3VuZGF0aW9uLz4KIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT4KIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+CiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnMKKi8KKGZ1bmN0aW9uKCl7dmFyIHVuZGVmaW5lZDt2YXIgVkVSU0lPTj0iNC4xNy41Ijt2YXIgTEFSR0VfQVJSQVlfU0laRT0yMDA7dmFyIENPUkVfRVJST1JfVEVYVD0iVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3FceDNkcG9ueWZpbGwuIixGVU5DX0VSUk9SX1RFWFQ9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO3ZhciBIQVNIX1VOREVGSU5FRD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7dmFyIE1BWF9NRU1PSVpFX1NJWkU9NTAwO3ZhciBQTEFDRUhPTERFUj0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyI7dmFyIENMT05FX0RFRVBfRkxBRz0xLENMT05FX0ZMQVRfRkxBRz0yLENMT05FX1NZTUJPTFNfRkxBRz00O3ZhciBDT01QQVJFX1BBUlRJQUxfRkxBRz0xLENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc9Mjt2YXIgV1JBUF9CSU5EX0ZMQUc9MSxXUkFQX0JJTkRfS0VZX0ZMQUc9MixXUkFQX0NVUlJZX0JPVU5EX0ZMQUc9NCxXUkFQX0NVUlJZX0ZMQUc9CjgsV1JBUF9DVVJSWV9SSUdIVF9GTEFHPTE2LFdSQVBfUEFSVElBTF9GTEFHPTMyLFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHPTY0LFdSQVBfQVJZX0ZMQUc9MTI4LFdSQVBfUkVBUkdfRkxBRz0yNTYsV1JBUF9GTElQX0ZMQUc9NTEyO3ZhciBERUZBVUxUX1RSVU5DX0xFTkdUSD0zMCxERUZBVUxUX1RSVU5DX09NSVNTSU9OPSIuLi4iO3ZhciBIT1RfQ09VTlQ9ODAwLEhPVF9TUEFOPTE2O3ZhciBMQVpZX0ZJTFRFUl9GTEFHPTEsTEFaWV9NQVBfRkxBRz0yLExBWllfV0hJTEVfRkxBRz0zO3ZhciBJTkZJTklUWT0xLzAsTUFYX1NBRkVfSU5URUdFUj05MDA3MTk5MjU0NzQwOTkxLE1BWF9JTlRFR0VSPTEuNzk3NjkzMTM0ODYyMzE1N0UzMDgsTkFOPTAvMDt2YXIgTUFYX0FSUkFZX0xFTkdUSD00Mjk0OTY3Mjk1LE1BWF9BUlJBWV9JTkRFWD1NQVhfQVJSQVlfTEVOR1RILTEsSEFMRl9NQVhfQVJSQVlfTEVOR1RIPU1BWF9BUlJBWV9MRU5HVEg+Pj4xO3ZhciB3cmFwRmxhZ3M9W1siYXJ5IiwKV1JBUF9BUllfRkxBR10sWyJiaW5kIixXUkFQX0JJTkRfRkxBR10sWyJiaW5kS2V5IixXUkFQX0JJTkRfS0VZX0ZMQUddLFsiY3VycnkiLFdSQVBfQ1VSUllfRkxBR10sWyJjdXJyeVJpZ2h0IixXUkFQX0NVUlJZX1JJR0hUX0ZMQUddLFsiZmxpcCIsV1JBUF9GTElQX0ZMQUddLFsicGFydGlhbCIsV1JBUF9QQVJUSUFMX0ZMQUddLFsicGFydGlhbFJpZ2h0IixXUkFQX1BBUlRJQUxfUklHSFRfRkxBR10sWyJyZWFyZyIsV1JBUF9SRUFSR19GTEFHXV07dmFyIGFyZ3NUYWc9IltvYmplY3QgQXJndW1lbnRzXSIsYXJyYXlUYWc9IltvYmplY3QgQXJyYXldIixhc3luY1RhZz0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsYm9vbFRhZz0iW29iamVjdCBCb29sZWFuXSIsZGF0ZVRhZz0iW29iamVjdCBEYXRlXSIsZG9tRXhjVGFnPSJbb2JqZWN0IERPTUV4Y2VwdGlvbl0iLGVycm9yVGFnPSJbb2JqZWN0IEVycm9yXSIsZnVuY1RhZz0iW29iamVjdCBGdW5jdGlvbl0iLGdlblRhZz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLAptYXBUYWc9IltvYmplY3QgTWFwXSIsbnVtYmVyVGFnPSJbb2JqZWN0IE51bWJlcl0iLG51bGxUYWc9IltvYmplY3QgTnVsbF0iLG9iamVjdFRhZz0iW29iamVjdCBPYmplY3RdIixwcm9taXNlVGFnPSJbb2JqZWN0IFByb21pc2VdIixwcm94eVRhZz0iW29iamVjdCBQcm94eV0iLHJlZ2V4cFRhZz0iW29iamVjdCBSZWdFeHBdIixzZXRUYWc9IltvYmplY3QgU2V0XSIsc3RyaW5nVGFnPSJbb2JqZWN0IFN0cmluZ10iLHN5bWJvbFRhZz0iW29iamVjdCBTeW1ib2xdIix1bmRlZmluZWRUYWc9IltvYmplY3QgVW5kZWZpbmVkXSIsd2Vha01hcFRhZz0iW29iamVjdCBXZWFrTWFwXSIsd2Vha1NldFRhZz0iW29iamVjdCBXZWFrU2V0XSI7dmFyIGFycmF5QnVmZmVyVGFnPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsZGF0YVZpZXdUYWc9IltvYmplY3QgRGF0YVZpZXddIixmbG9hdDMyVGFnPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLGZsb2F0NjRUYWc9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsCmludDhUYWc9IltvYmplY3QgSW50OEFycmF5XSIsaW50MTZUYWc9IltvYmplY3QgSW50MTZBcnJheV0iLGludDMyVGFnPSJbb2JqZWN0IEludDMyQXJyYXldIix1aW50OFRhZz0iW29iamVjdCBVaW50OEFycmF5XSIsdWludDhDbGFtcGVkVGFnPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsdWludDE2VGFnPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsdWludDMyVGFnPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7dmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nPS9cYl9fcCBcKz0gJyc7L2cscmVFbXB0eVN0cmluZ01pZGRsZT0vXGIoX19wIFwrPSkgJycgXCsvZyxyZUVtcHR5U3RyaW5nVHJhaWxpbmc9LyhfX2VcKC4qP1wpfFxiX190XCkpIFwrXG4nJzsvZzt2YXIgcmVFc2NhcGVkSHRtbD0vJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2cscmVVbmVzY2FwZWRIdG1sPS9bJjw+IiddL2cscmVIYXNFc2NhcGVkSHRtbD1SZWdFeHAocmVFc2NhcGVkSHRtbC5zb3VyY2UpLHJlSGFzVW5lc2NhcGVkSHRtbD0KUmVnRXhwKHJlVW5lc2NhcGVkSHRtbC5zb3VyY2UpO3ZhciByZUVzY2FwZT0vPCUtKFtcc1xTXSs/KSU+L2cscmVFdmFsdWF0ZT0vPCUoW1xzXFNdKz8pJT4vZyxyZUludGVycG9sYXRlPS88JT0oW1xzXFNdKz8pJT4vZzt2YXIgcmVJc0RlZXBQcm9wPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHJlSXNQbGFpblByb3A9L15cdyokLyxyZVByb3BOYW1lPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nO3ZhciByZVJlZ0V4cENoYXI9L1tcXF4kLiorPygpW1xde318XS9nLHJlSGFzUmVnRXhwQ2hhcj1SZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7dmFyIHJlVHJpbT0vXlxzK3xccyskL2cscmVUcmltU3RhcnQ9L15ccysvLHJlVHJpbUVuZD0vXHMrJC87dmFyIHJlV3JhcENvbW1lbnQ9L1x7KD86XG5cL1wqIFxbd3JhcHBlZCB3aXRoIC4rXF0gXCpcLyk/XG4/LywKcmVXcmFwRGV0YWlscz0vXHtcblwvXCogXFt3cmFwcGVkIHdpdGggKC4rKVxdIFwqLyxyZVNwbGl0RGV0YWlscz0vLD8gJiAvO3ZhciByZUFzY2lpV29yZD0vW15ceDAwLVx4MmZceDNhLVx4NDBceDViLVx4NjBceDdiLVx4N2ZdKy9nO3ZhciByZUVzY2FwZUNoYXI9L1xcKFxcKT8vZzt2YXIgcmVFc1RlbXBsYXRlPS9cJFx7KFteXFx9XSooPzpcXC5bXlxcfV0qKSopXH0vZzt2YXIgcmVGbGFncz0vXHcqJC87dmFyIHJlSXNCYWRIZXg9L15bLStdMHhbMC05YS1mXSskL2k7dmFyIHJlSXNCaW5hcnk9L14wYlswMV0rJC9pO3ZhciByZUlzSG9zdEN0b3I9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC87dmFyIHJlSXNPY3RhbD0vXjBvWzAtN10rJC9pO3ZhciByZUlzVWludD0vXig/OjB8WzEtOV1cZCopJC87dmFyIHJlTGF0aW49L1tceGMwLVx4ZDZceGQ4LVx4ZjZceGY4LVx4ZmZcdTAxMDAtXHUwMTdmXS9nO3ZhciByZU5vTWF0Y2g9LygkXikvO3ZhciByZVVuZXNjYXBlZFN0cmluZz0KL1snXG5cclx1MjAyOFx1MjAyOVxcXS9nO3ZhciByc0FzdHJhbFJhbmdlPSJcXHVkODAwLVxcdWRmZmYiLHJzQ29tYm9NYXJrc1JhbmdlPSJcXHUwMzAwLVxcdTAzNmYiLHJlQ29tYm9IYWxmTWFya3NSYW5nZT0iXFx1ZmUyMC1cXHVmZTJmIixyc0NvbWJvU3ltYm9sc1JhbmdlPSJcXHUyMGQwLVxcdTIwZmYiLHJzQ29tYm9SYW5nZT1yc0NvbWJvTWFya3NSYW5nZStyZUNvbWJvSGFsZk1hcmtzUmFuZ2UrcnNDb21ib1N5bWJvbHNSYW5nZSxyc0RpbmdiYXRSYW5nZT0iXFx1MjcwMC1cXHUyN2JmIixyc0xvd2VyUmFuZ2U9ImEtelxceGRmLVxceGY2XFx4ZjgtXFx4ZmYiLHJzTWF0aE9wUmFuZ2U9IlxceGFjXFx4YjFcXHhkN1xceGY3Iixyc05vbkNoYXJSYW5nZT0iXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4YmYiLHJzUHVuY3R1YXRpb25SYW5nZT0iXFx1MjAwMC1cXHUyMDZmIixyc1NwYWNlUmFuZ2U9IiBcXHRcXHgwYlxcZlxceGEwXFx1ZmVmZlxcblxcclxcdTIwMjhcXHUyMDI5XFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMCIsCnJzVXBwZXJSYW5nZT0iQS1aXFx4YzAtXFx4ZDZcXHhkOC1cXHhkZSIscnNWYXJSYW5nZT0iXFx1ZmUwZVxcdWZlMGYiLHJzQnJlYWtSYW5nZT1yc01hdGhPcFJhbmdlK3JzTm9uQ2hhclJhbmdlK3JzUHVuY3R1YXRpb25SYW5nZStyc1NwYWNlUmFuZ2U7dmFyIHJzQXBvcz0iWydcdTIwMTldIixyc0FzdHJhbD0iWyIrcnNBc3RyYWxSYW5nZSsiXSIscnNCcmVhaz0iWyIrcnNCcmVha1JhbmdlKyJdIixyc0NvbWJvPSJbIityc0NvbWJvUmFuZ2UrIl0iLHJzRGlnaXRzPSJcXGQrIixyc0RpbmdiYXQ9IlsiK3JzRGluZ2JhdFJhbmdlKyJdIixyc0xvd2VyPSJbIityc0xvd2VyUmFuZ2UrIl0iLHJzTWlzYz0iW14iK3JzQXN0cmFsUmFuZ2UrcnNCcmVha1JhbmdlK3JzRGlnaXRzK3JzRGluZ2JhdFJhbmdlK3JzTG93ZXJSYW5nZStyc1VwcGVyUmFuZ2UrIl0iLHJzRml0ej0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixyc01vZGlmaWVyPSIoPzoiK3JzQ29tYm8rInwiK3JzRml0eisiKSIscnNOb25Bc3RyYWw9CiJbXiIrcnNBc3RyYWxSYW5nZSsiXSIscnNSZWdpb25hbD0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIscnNTdXJyUGFpcj0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIscnNVcHBlcj0iWyIrcnNVcHBlclJhbmdlKyJdIixyc1pXSj0iXFx1MjAwZCI7dmFyIHJzTWlzY0xvd2VyPSIoPzoiK3JzTG93ZXIrInwiK3JzTWlzYysiKSIscnNNaXNjVXBwZXI9Iig/OiIrcnNVcHBlcisifCIrcnNNaXNjKyIpIixyc09wdENvbnRyTG93ZXI9Iig/OiIrcnNBcG9zKyIoPzpkfGxsfG18cmV8c3x0fHZlKSk/Iixyc09wdENvbnRyVXBwZXI9Iig/OiIrcnNBcG9zKyIoPzpEfExMfE18UkV8U3xUfFZFKSk/IixyZU9wdE1vZD1yc01vZGlmaWVyKyI/Iixyc09wdFZhcj0iWyIrcnNWYXJSYW5nZSsiXT8iLHJzT3B0Sm9pbj0iKD86Iityc1pXSisiKD86IitbcnNOb25Bc3RyYWwscnNSZWdpb25hbCxyc1N1cnJQYWlyXS5qb2luKCJ8IikrIikiK3JzT3B0VmFyK3JlT3B0TW9kKwoiKSoiLHJzT3JkTG93ZXI9IlxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXGR0aCkoP1x4M2RcXGJ8W0EtWl9dKSIscnNPcmRVcHBlcj0iXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcZFRIKSg/XHgzZFxcYnxbYS16X10pIixyc1NlcT1yc09wdFZhcityZU9wdE1vZCtyc09wdEpvaW4scnNFbW9qaT0iKD86IitbcnNEaW5nYmF0LHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc1NlcSxyc1N5bWJvbD0iKD86IitbcnNOb25Bc3RyYWwrcnNDb21ibysiPyIscnNDb21ibyxyc1JlZ2lvbmFsLHJzU3VyclBhaXIscnNBc3RyYWxdLmpvaW4oInwiKSsiKSI7dmFyIHJlQXBvcz1SZWdFeHAocnNBcG9zLCJnIik7dmFyIHJlQ29tYm9NYXJrPVJlZ0V4cChyc0NvbWJvLCJnIik7dmFyIHJlVW5pY29kZT1SZWdFeHAocnNGaXR6KyIoP1x4M2QiK3JzRml0eisiKXwiK3JzU3ltYm9sK3JzU2VxLCJnIik7dmFyIHJlVW5pY29kZVdvcmQ9UmVnRXhwKFtyc1VwcGVyKyI/IisKcnNMb3dlcisiKyIrcnNPcHRDb250ckxvd2VyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzTWlzY1VwcGVyKyIrIityc09wdENvbnRyVXBwZXIrIig/XHgzZCIrW3JzQnJlYWsscnNVcHBlcityc01pc2NMb3dlciwiJCJdLmpvaW4oInwiKSsiKSIscnNVcHBlcisiPyIrcnNNaXNjTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcixyc1VwcGVyKyIrIityc09wdENvbnRyVXBwZXIscnNPcmRVcHBlcixyc09yZExvd2VyLHJzRGlnaXRzLHJzRW1vamldLmpvaW4oInwiKSwiZyIpO3ZhciByZUhhc1VuaWNvZGU9UmVnRXhwKCJbIityc1pXSityc0FzdHJhbFJhbmdlK3JzQ29tYm9SYW5nZStyc1ZhclJhbmdlKyJdIik7dmFyIHJlSGFzVW5pY29kZVdvcmQ9L1thLXpdW0EtWl18W0EtWl17Mix9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO3ZhciBjb250ZXh0UHJvcHM9WyJBcnJheSIsIkJ1ZmZlciIsIkRhdGFWaWV3IiwKIkRhdGUiLCJFcnJvciIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkZ1bmN0aW9uIiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJNYXAiLCJNYXRoIiwiT2JqZWN0IiwiUHJvbWlzZSIsIlJlZ0V4cCIsIlNldCIsIlN0cmluZyIsIlN5bWJvbCIsIlR5cGVFcnJvciIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJXZWFrTWFwIiwiXyIsImNsZWFyVGltZW91dCIsImlzRmluaXRlIiwicGFyc2VJbnQiLCJzZXRUaW1lb3V0Il07dmFyIHRlbXBsYXRlQ291bnRlcj0tMTt2YXIgdHlwZWRBcnJheVRhZ3M9e307dHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ109dHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ109dHlwZWRBcnJheVRhZ3NbaW50OFRhZ109dHlwZWRBcnJheVRhZ3NbaW50MTZUYWddPXR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXT10eXBlZEFycmF5VGFnc1t1aW50OFRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXT0KdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXT10eXBlZEFycmF5VGFnc1t1aW50MzJUYWddPXRydWU7dHlwZWRBcnJheVRhZ3NbYXJnc1RhZ109dHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXT10eXBlZEFycmF5VGFnc1tib29sVGFnXT10eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ109dHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ109dHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddPXR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddPXR5cGVkQXJyYXlUYWdzW21hcFRhZ109dHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXT10eXBlZEFycmF5VGFnc1tvYmplY3RUYWddPXR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ109dHlwZWRBcnJheVRhZ3Nbc2V0VGFnXT10eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddPXR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddPWZhbHNlO3ZhciBjbG9uZWFibGVUYWdzPXt9O2Nsb25lYWJsZVRhZ3NbYXJnc1RhZ109Y2xvbmVhYmxlVGFnc1thcnJheVRhZ109CmNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddPWNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddPWNsb25lYWJsZVRhZ3NbYm9vbFRhZ109Y2xvbmVhYmxlVGFnc1tkYXRlVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddPWNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQ4VGFnXT1jbG9uZWFibGVUYWdzW2ludDE2VGFnXT1jbG9uZWFibGVUYWdzW2ludDMyVGFnXT1jbG9uZWFibGVUYWdzW21hcFRhZ109Y2xvbmVhYmxlVGFnc1tudW1iZXJUYWddPWNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXT1jbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ109Y2xvbmVhYmxlVGFnc1tzZXRUYWddPWNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXT1jbG9uZWFibGVUYWdzW3N5bWJvbFRhZ109Y2xvbmVhYmxlVGFnc1t1aW50OFRhZ109Y2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddPWNsb25lYWJsZVRhZ3NbdWludDE2VGFnXT1jbG9uZWFibGVUYWdzW3VpbnQzMlRhZ109dHJ1ZTsKY2xvbmVhYmxlVGFnc1tlcnJvclRhZ109Y2xvbmVhYmxlVGFnc1tmdW5jVGFnXT1jbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddPWZhbHNlO3ZhciBkZWJ1cnJlZExldHRlcnM9eyJcdTAwYzAiOiJBIiwiXHUwMGMxIjoiQSIsIlx1MDBjMiI6IkEiLCJcdTAwYzMiOiJBIiwiXHUwMGM0IjoiQSIsIlx1MDBjNSI6IkEiLCJcdTAwZTAiOiJhIiwiXHUwMGUxIjoiYSIsIlx1MDBlMiI6ImEiLCJcdTAwZTMiOiJhIiwiXHUwMGU0IjoiYSIsIlx1MDBlNSI6ImEiLCJcdTAwYzciOiJDIiwiXHUwMGU3IjoiYyIsIlx1MDBkMCI6IkQiLCJcdTAwZjAiOiJkIiwiXHUwMGM4IjoiRSIsIlx1MDBjOSI6IkUiLCJcdTAwY2EiOiJFIiwiXHUwMGNiIjoiRSIsIlx1MDBlOCI6ImUiLCJcdTAwZTkiOiJlIiwiXHUwMGVhIjoiZSIsIlx1MDBlYiI6ImUiLCJcdTAwY2MiOiJJIiwiXHUwMGNkIjoiSSIsIlx1MDBjZSI6IkkiLCJcdTAwY2YiOiJJIiwiXHUwMGVjIjoiaSIsIlx1MDBlZCI6ImkiLCJcdTAwZWUiOiJpIiwKIlx1MDBlZiI6ImkiLCJcdTAwZDEiOiJOIiwiXHUwMGYxIjoibiIsIlx1MDBkMiI6Ik8iLCJcdTAwZDMiOiJPIiwiXHUwMGQ0IjoiTyIsIlx1MDBkNSI6Ik8iLCJcdTAwZDYiOiJPIiwiXHUwMGQ4IjoiTyIsIlx1MDBmMiI6Im8iLCJcdTAwZjMiOiJvIiwiXHUwMGY0IjoibyIsIlx1MDBmNSI6Im8iLCJcdTAwZjYiOiJvIiwiXHUwMGY4IjoibyIsIlx1MDBkOSI6IlUiLCJcdTAwZGEiOiJVIiwiXHUwMGRiIjoiVSIsIlx1MDBkYyI6IlUiLCJcdTAwZjkiOiJ1IiwiXHUwMGZhIjoidSIsIlx1MDBmYiI6InUiLCJcdTAwZmMiOiJ1IiwiXHUwMGRkIjoiWSIsIlx1MDBmZCI6InkiLCJcdTAwZmYiOiJ5IiwiXHUwMGM2IjoiQWUiLCJcdTAwZTYiOiJhZSIsIlx1MDBkZSI6IlRoIiwiXHUwMGZlIjoidGgiLCJcdTAwZGYiOiJzcyIsIlx1MDEwMCI6IkEiLCJcdTAxMDIiOiJBIiwiXHUwMTA0IjoiQSIsIlx1MDEwMSI6ImEiLCJcdTAxMDMiOiJhIiwiXHUwMTA1IjoiYSIsIlx1MDEwNiI6IkMiLCJcdTAxMDgiOiJDIiwKIlx1MDEwYSI6IkMiLCJcdTAxMGMiOiJDIiwiXHUwMTA3IjoiYyIsIlx1MDEwOSI6ImMiLCJcdTAxMGIiOiJjIiwiXHUwMTBkIjoiYyIsIlx1MDEwZSI6IkQiLCJcdTAxMTAiOiJEIiwiXHUwMTBmIjoiZCIsIlx1MDExMSI6ImQiLCJcdTAxMTIiOiJFIiwiXHUwMTE0IjoiRSIsIlx1MDExNiI6IkUiLCJcdTAxMTgiOiJFIiwiXHUwMTFhIjoiRSIsIlx1MDExMyI6ImUiLCJcdTAxMTUiOiJlIiwiXHUwMTE3IjoiZSIsIlx1MDExOSI6ImUiLCJcdTAxMWIiOiJlIiwiXHUwMTFjIjoiRyIsIlx1MDExZSI6IkciLCJcdTAxMjAiOiJHIiwiXHUwMTIyIjoiRyIsIlx1MDExZCI6ImciLCJcdTAxMWYiOiJnIiwiXHUwMTIxIjoiZyIsIlx1MDEyMyI6ImciLCJcdTAxMjQiOiJIIiwiXHUwMTI2IjoiSCIsIlx1MDEyNSI6ImgiLCJcdTAxMjciOiJoIiwiXHUwMTI4IjoiSSIsIlx1MDEyYSI6IkkiLCJcdTAxMmMiOiJJIiwiXHUwMTJlIjoiSSIsIlx1MDEzMCI6IkkiLCJcdTAxMjkiOiJpIiwiXHUwMTJiIjoiaSIsCiJcdTAxMmQiOiJpIiwiXHUwMTJmIjoiaSIsIlx1MDEzMSI6ImkiLCJcdTAxMzQiOiJKIiwiXHUwMTM1IjoiaiIsIlx1MDEzNiI6IksiLCJcdTAxMzciOiJrIiwiXHUwMTM4IjoiayIsIlx1MDEzOSI6IkwiLCJcdTAxM2IiOiJMIiwiXHUwMTNkIjoiTCIsIlx1MDEzZiI6IkwiLCJcdTAxNDEiOiJMIiwiXHUwMTNhIjoibCIsIlx1MDEzYyI6ImwiLCJcdTAxM2UiOiJsIiwiXHUwMTQwIjoibCIsIlx1MDE0MiI6ImwiLCJcdTAxNDMiOiJOIiwiXHUwMTQ1IjoiTiIsIlx1MDE0NyI6Ik4iLCJcdTAxNGEiOiJOIiwiXHUwMTQ0IjoibiIsIlx1MDE0NiI6Im4iLCJcdTAxNDgiOiJuIiwiXHUwMTRiIjoibiIsIlx1MDE0YyI6Ik8iLCJcdTAxNGUiOiJPIiwiXHUwMTUwIjoiTyIsIlx1MDE0ZCI6Im8iLCJcdTAxNGYiOiJvIiwiXHUwMTUxIjoibyIsIlx1MDE1NCI6IlIiLCJcdTAxNTYiOiJSIiwiXHUwMTU4IjoiUiIsIlx1MDE1NSI6InIiLCJcdTAxNTciOiJyIiwiXHUwMTU5IjoiciIsIlx1MDE1YSI6IlMiLAoiXHUwMTVjIjoiUyIsIlx1MDE1ZSI6IlMiLCJcdTAxNjAiOiJTIiwiXHUwMTViIjoicyIsIlx1MDE1ZCI6InMiLCJcdTAxNWYiOiJzIiwiXHUwMTYxIjoicyIsIlx1MDE2MiI6IlQiLCJcdTAxNjQiOiJUIiwiXHUwMTY2IjoiVCIsIlx1MDE2MyI6InQiLCJcdTAxNjUiOiJ0IiwiXHUwMTY3IjoidCIsIlx1MDE2OCI6IlUiLCJcdTAxNmEiOiJVIiwiXHUwMTZjIjoiVSIsIlx1MDE2ZSI6IlUiLCJcdTAxNzAiOiJVIiwiXHUwMTcyIjoiVSIsIlx1MDE2OSI6InUiLCJcdTAxNmIiOiJ1IiwiXHUwMTZkIjoidSIsIlx1MDE2ZiI6InUiLCJcdTAxNzEiOiJ1IiwiXHUwMTczIjoidSIsIlx1MDE3NCI6IlciLCJcdTAxNzUiOiJ3IiwiXHUwMTc2IjoiWSIsIlx1MDE3NyI6InkiLCJcdTAxNzgiOiJZIiwiXHUwMTc5IjoiWiIsIlx1MDE3YiI6IloiLCJcdTAxN2QiOiJaIiwiXHUwMTdhIjoieiIsIlx1MDE3YyI6InoiLCJcdTAxN2UiOiJ6IiwiXHUwMTMyIjoiSUoiLCJcdTAxMzMiOiJpaiIsIlx1MDE1MiI6Ik9lIiwKIlx1MDE1MyI6Im9lIiwiXHUwMTQ5IjoiJ24iLCJcdTAxN2YiOiJzIn07dmFyIGh0bWxFc2NhcGVzPXsiXHgyNiI6Ilx4MjZhbXA7IiwiXHgzYyI6Ilx4MjZsdDsiLCJceDNlIjoiXHgyNmd0OyIsJyInOiJceDI2cXVvdDsiLCInIjoiXHgyNiMzOTsifTt2YXIgaHRtbFVuZXNjYXBlcz17Ilx4MjZhbXA7IjoiXHgyNiIsIlx4MjZsdDsiOiJceDNjIiwiXHgyNmd0OyI6Ilx4M2UiLCJceDI2cXVvdDsiOiciJywiXHgyNiMzOTsiOiInIn07dmFyIHN0cmluZ0VzY2FwZXM9eyJcXCI6IlxcIiwiJyI6IiciLCJcbiI6Im4iLCJcciI6InIiLCJcdTIwMjgiOiJ1MjAyOCIsIlx1MjAyOSI6InUyMDI5In07dmFyIGZyZWVQYXJzZUZsb2F0PXBhcnNlRmxvYXQsZnJlZVBhcnNlSW50PXBhcnNlSW50O3ZhciBmcmVlR2xvYmFsPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbDt2YXIgZnJlZVNlbGY9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiYKc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGY7dmFyIHJvb3Q9ZnJlZUdsb2JhbHx8ZnJlZVNlbGZ8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7dmFyIGZyZWVFeHBvcnRzPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHM7dmFyIGZyZWVNb2R1bGU9ZnJlZUV4cG9ydHMmJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZTt2YXIgbW9kdWxlRXhwb3J0cz1mcmVlTW9kdWxlJiZmcmVlTW9kdWxlLmV4cG9ydHM9PT1mcmVlRXhwb3J0czt2YXIgZnJlZVByb2Nlc3M9bW9kdWxlRXhwb3J0cyYmZnJlZUdsb2JhbC5wcm9jZXNzO3ZhciBub2RlVXRpbD1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnJlZVByb2Nlc3MmJmZyZWVQcm9jZXNzLmJpbmRpbmcmJmZyZWVQcm9jZXNzLmJpbmRpbmcoInV0aWwiKX1jYXRjaChlKXt9fSgpO3ZhciBub2RlSXNBcnJheUJ1ZmZlcj1ub2RlVXRpbCYmCm5vZGVVdGlsLmlzQXJyYXlCdWZmZXIsbm9kZUlzRGF0ZT1ub2RlVXRpbCYmbm9kZVV0aWwuaXNEYXRlLG5vZGVJc01hcD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNNYXAsbm9kZUlzUmVnRXhwPW5vZGVVdGlsJiZub2RlVXRpbC5pc1JlZ0V4cCxub2RlSXNTZXQ9bm9kZVV0aWwmJm5vZGVVdGlsLmlzU2V0LG5vZGVJc1R5cGVkQXJyYXk9bm9kZVV0aWwmJm5vZGVVdGlsLmlzVHlwZWRBcnJheTtmdW5jdGlvbiBhcHBseShmdW5jLHRoaXNBcmcsYXJncyl7c3dpdGNoKGFyZ3MubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtjYXNlIDE6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0pO2Nhc2UgMjpyZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsYXJnc1swXSxhcmdzWzFdKTtjYXNlIDM6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLGFyZ3MpfWZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwKc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO3NldHRlcihhY2N1bXVsYXRvcix2YWx1ZSxpdGVyYXRlZSh2YWx1ZSksYXJyYXkpfXJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpaWYoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KT09PWZhbHNlKWJyZWFrO3JldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSxpdGVyYXRlZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZShsZW5ndGgtLSlpZihpdGVyYXRlZShhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk9PT1mYWxzZSlicmVhazsKcmV0dXJuIGFycmF5fWZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKHByZWRpY2F0ZSh2YWx1ZSxpbmRleCxhcnJheSkpcmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSx2YWx1ZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4hIWxlbmd0aCYmYmFzZUluZGV4T2YoYXJyYXksCnZhbHVlLDApPi0xfWZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LHZhbHVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpaWYoY29tcGFyYXRvcih2YWx1ZSxhcnJheVtpbmRleF0pKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX1mdW5jdGlvbiBhcnJheU1hcChhcnJheSxpdGVyYXRlZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXN1bHQ9QXJyYXkobGVuZ3RoKTt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPWl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVB1c2goYXJyYXksdmFsdWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXZhbHVlcy5sZW5ndGgsb2Zmc2V0PWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtvZmZzZXQraW5kZXhdPQp2YWx1ZXNbaW5kZXhdO3JldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSxpdGVyYXRlZSxhY2N1bXVsYXRvcixpbml0QWNjdW0pe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoaW5pdEFjY3VtJiZsZW5ndGgpYWNjdW11bGF0b3I9YXJyYXlbKytpbmRleF07d2hpbGUoKytpbmRleDxsZW5ndGgpYWNjdW11bGF0b3I9aXRlcmF0ZWUoYWNjdW11bGF0b3IsYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSxpdGVyYXRlZSxhY2N1bXVsYXRvcixpbml0QWNjdW0pe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoaW5pdEFjY3VtJiZsZW5ndGgpYWNjdW11bGF0b3I9YXJyYXlbLS1sZW5ndGhdO3doaWxlKGxlbmd0aC0tKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2xlbmd0aF0sbGVuZ3RoLGFycmF5KTsKcmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5U29tZShhcnJheSxwcmVkaWNhdGUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpaWYocHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIHRydWU7cmV0dXJuIGZhbHNlfXZhciBhc2NpaVNpemU9YmFzZVByb3BlcnR5KCJsZW5ndGgiKTtmdW5jdGlvbiBhc2NpaVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLnNwbGl0KCIiKX1mdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZyl7cmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCl8fFtdfWZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24scHJlZGljYXRlLGVhY2hGdW5jKXt2YXIgcmVzdWx0O2VhY2hGdW5jKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe2lmKHByZWRpY2F0ZSh2YWx1ZSxrZXksY29sbGVjdGlvbikpe3Jlc3VsdD1rZXk7CnJldHVybiBmYWxzZX19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCxmcm9tUmlnaHQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLGluZGV4PWZyb21JbmRleCsoZnJvbVJpZ2h0PzE6LTEpO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiBpbmRleDtyZXR1cm4tMX1mdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3JldHVybiB2YWx1ZT09PXZhbHVlP3N0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KTpiYXNlRmluZEluZGV4KGFycmF5LGJhc2VJc05hTixmcm9tSW5kZXgpfWZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSx2YWx1ZSxmcm9tSW5kZXgsY29tcGFyYXRvcil7dmFyIGluZGV4PWZyb21JbmRleC0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDwKbGVuZ3RoKWlmKGNvbXBhcmF0b3IoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKXtyZXR1cm4gdmFsdWUhPT12YWx1ZX1mdW5jdGlvbiBiYXNlTWVhbihhcnJheSxpdGVyYXRlZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VTdW0oYXJyYXksaXRlcmF0ZWUpL2xlbmd0aDpOQU59ZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV19fWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eU9mKG9iamVjdCl7cmV0dXJuIGZ1bmN0aW9uKGtleSl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV19fWZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcixpbml0QWNjdW0sZWFjaEZ1bmMpe2VhY2hGdW5jKGNvbGxlY3Rpb24sCmZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe2FjY3VtdWxhdG9yPWluaXRBY2N1bT8oaW5pdEFjY3VtPWZhbHNlLHZhbHVlKTppdGVyYXRlZShhY2N1bXVsYXRvcix2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LGNvbXBhcmVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDthcnJheS5zb3J0KGNvbXBhcmVyKTt3aGlsZShsZW5ndGgtLSlhcnJheVtsZW5ndGhdPWFycmF5W2xlbmd0aF0udmFsdWU7cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksaXRlcmF0ZWUpe3ZhciByZXN1bHQsaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGN1cnJlbnQ9aXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtpZihjdXJyZW50IT09dW5kZWZpbmVkKXJlc3VsdD1yZXN1bHQ9PT11bmRlZmluZWQ/Y3VycmVudDpyZXN1bHQrY3VycmVudH1yZXR1cm4gcmVzdWx0fQpmdW5jdGlvbiBiYXNlVGltZXMobixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShuKTt3aGlsZSgrK2luZGV4PG4pcmVzdWx0W2luZGV4XT1pdGVyYXRlZShpbmRleCk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlVG9QYWlycyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybltrZXksb2JqZWN0W2tleV1dfSl9ZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpe3JldHVybiBmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGZ1bmModmFsdWUpfX1mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCxwcm9wcyl7cmV0dXJuIGFycmF5TWFwKHByb3BzLGZ1bmN0aW9uKGtleSl7cmV0dXJuIG9iamVjdFtrZXldfSl9ZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsa2V5KXtyZXR1cm4gY2FjaGUuaGFzKGtleSl9ZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zdHJTeW1ib2xzLmxlbmd0aDsKd2hpbGUoKytpbmRleDxsZW5ndGgmJmJhc2VJbmRleE9mKGNoclN5bWJvbHMsc3RyU3ltYm9sc1tpbmRleF0sMCk+LTEpO3JldHVybiBpbmRleH1mdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scyl7dmFyIGluZGV4PXN0clN5bWJvbHMubGVuZ3RoO3doaWxlKGluZGV4LS0mJmJhc2VJbmRleE9mKGNoclN5bWJvbHMsc3RyU3ltYm9sc1tpbmRleF0sMCk+LTEpO3JldHVybiBpbmRleH1mdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXkscGxhY2Vob2xkZXIpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc3VsdD0wO3doaWxlKGxlbmd0aC0tKWlmKGFycmF5W2xlbmd0aF09PT1wbGFjZWhvbGRlcikrK3Jlc3VsdDtyZXR1cm4gcmVzdWx0fXZhciBkZWJ1cnJMZXR0ZXI9YmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTt2YXIgZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbEVzY2FwZXMpO2Z1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKXtyZXR1cm4iXFwiKwpzdHJpbmdFc2NhcGVzW2Nocl19ZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV19ZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpfWZ1bmN0aW9uIGhhc1VuaWNvZGVXb3JkKHN0cmluZyl7cmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpfWZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcil7dmFyIGRhdGEscmVzdWx0PVtdO3doaWxlKCEoZGF0YT1pdGVyYXRvci5uZXh0KCkpLmRvbmUpcmVzdWx0LnB1c2goZGF0YS52YWx1ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBUb0FycmF5KG1hcCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShtYXAuc2l6ZSk7bWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsa2V5KXtyZXN1bHRbKytpbmRleF09W2tleSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG92ZXJBcmcoZnVuYywKdHJhbnNmb3JtKXtyZXR1cm4gZnVuY3Rpb24oYXJnKXtyZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSl9fWZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZT09PXBsYWNlaG9sZGVyfHx2YWx1ZT09PVBMQUNFSE9MREVSKXthcnJheVtpbmRleF09UExBQ0VIT0xERVI7cmVzdWx0W3Jlc0luZGV4KytdPWluZGV4fX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LGtleSl7cmV0dXJuIGtleT09Il9fcHJvdG9fXyI/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPXZhbHVlfSk7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gc2V0VG9QYWlycyhzZXQpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkoc2V0LnNpemUpO3NldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXtyZXN1bHRbKytpbmRleF09W3ZhbHVlLHZhbHVlXX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGFycmF5W2luZGV4XT09PXZhbHVlKXJldHVybiBpbmRleDtyZXR1cm4tMX1mdW5jdGlvbiBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBpbmRleD1mcm9tSW5kZXgrMTt3aGlsZShpbmRleC0tKWlmKGFycmF5W2luZGV4XT09PXZhbHVlKXJldHVybiBpbmRleDtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpe3JldHVybiBoYXNVbmljb2RlKHN0cmluZyk/dW5pY29kZVNpemUoc3RyaW5nKToKYXNjaWlTaXplKHN0cmluZyl9ZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHJpbmcpe3JldHVybiBoYXNVbmljb2RlKHN0cmluZyk/dW5pY29kZVRvQXJyYXkoc3RyaW5nKTphc2NpaVRvQXJyYXkoc3RyaW5nKX12YXIgdW5lc2NhcGVIdG1sQ2hhcj1iYXNlUHJvcGVydHlPZihodG1sVW5lc2NhcGVzKTtmdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpe3ZhciByZXN1bHQ9cmVVbmljb2RlLmxhc3RJbmRleD0wO3doaWxlKHJlVW5pY29kZS50ZXN0KHN0cmluZykpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB1bmljb2RlVG9BcnJheShzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKXx8W119ZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZyl7cmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKXx8W119dmFyIHJ1bkluQ29udGV4dD1mdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCl7Y29udGV4dD1jb250ZXh0PT1udWxsP3Jvb3Q6Xy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLApjb250ZXh0LF8ucGljayhyb290LGNvbnRleHRQcm9wcykpO3ZhciBBcnJheT1jb250ZXh0LkFycmF5LERhdGU9Y29udGV4dC5EYXRlLEVycm9yPWNvbnRleHQuRXJyb3IsRnVuY3Rpb249Y29udGV4dC5GdW5jdGlvbixNYXRoPWNvbnRleHQuTWF0aCxPYmplY3Q9Y29udGV4dC5PYmplY3QsUmVnRXhwPWNvbnRleHQuUmVnRXhwLFN0cmluZz1jb250ZXh0LlN0cmluZyxUeXBlRXJyb3I9Y29udGV4dC5UeXBlRXJyb3I7dmFyIGFycmF5UHJvdG89QXJyYXkucHJvdG90eXBlLGZ1bmNQcm90bz1GdW5jdGlvbi5wcm90b3R5cGUsb2JqZWN0UHJvdG89T2JqZWN0LnByb3RvdHlwZTt2YXIgY29yZUpzRGF0YT1jb250ZXh0WyJfX2NvcmUtanNfc2hhcmVkX18iXTt2YXIgZnVuY1RvU3RyaW5nPWZ1bmNQcm90by50b1N0cmluZzt2YXIgaGFzT3duUHJvcGVydHk9b2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7dmFyIGlkQ291bnRlcj0wO3ZhciBtYXNrU3JjS2V5PWZ1bmN0aW9uKCl7dmFyIHVpZD0KL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhJiZjb3JlSnNEYXRhLmtleXMmJmNvcmVKc0RhdGEua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB1aWQ/IlN5bWJvbChzcmMpXzEuIit1aWQ6IiJ9KCk7dmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nPW9iamVjdFByb3RvLnRvU3RyaW5nO3ZhciBvYmplY3RDdG9yU3RyaW5nPWZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7dmFyIG9sZERhc2g9cm9vdC5fO3ZhciByZUlzTmF0aXZlPVJlZ0V4cCgiXiIrZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCJcXCRceDI2IikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBCdWZmZXI9bW9kdWxlRXhwb3J0cz9jb250ZXh0LkJ1ZmZlcjp1bmRlZmluZWQsU3ltYm9sPWNvbnRleHQuU3ltYm9sLFVpbnQ4QXJyYXk9Y29udGV4dC5VaW50OEFycmF5LGFsbG9jVW5zYWZlPQpCdWZmZXI/QnVmZmVyLmFsbG9jVW5zYWZlOnVuZGVmaW5lZCxnZXRQcm90b3R5cGU9b3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KSxvYmplY3RDcmVhdGU9T2JqZWN0LmNyZWF0ZSxwcm9wZXJ0eUlzRW51bWVyYWJsZT1vYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxzcGxpY2U9YXJyYXlQcm90by5zcGxpY2Usc3ByZWFkYWJsZVN5bWJvbD1TeW1ib2w/U3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZTp1bmRlZmluZWQsc3ltSXRlcmF0b3I9U3ltYm9sP1N5bWJvbC5pdGVyYXRvcjp1bmRlZmluZWQsc3ltVG9TdHJpbmdUYWc9U3ltYm9sP1N5bWJvbC50b1N0cmluZ1RhZzp1bmRlZmluZWQ7dmFyIGRlZmluZVByb3BlcnR5PWZ1bmN0aW9uKCl7dHJ5e3ZhciBmdW5jPWdldE5hdGl2ZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7ZnVuYyh7fSwiIix7fSk7cmV0dXJuIGZ1bmN9Y2F0Y2goZSl7fX0oKTt2YXIgY3R4Q2xlYXJUaW1lb3V0PWNvbnRleHQuY2xlYXJUaW1lb3V0IT09CnJvb3QuY2xlYXJUaW1lb3V0JiZjb250ZXh0LmNsZWFyVGltZW91dCxjdHhOb3c9RGF0ZSYmRGF0ZS5ub3chPT1yb290LkRhdGUubm93JiZEYXRlLm5vdyxjdHhTZXRUaW1lb3V0PWNvbnRleHQuc2V0VGltZW91dCE9PXJvb3Quc2V0VGltZW91dCYmY29udGV4dC5zZXRUaW1lb3V0O3ZhciBuYXRpdmVDZWlsPU1hdGguY2VpbCxuYXRpdmVGbG9vcj1NYXRoLmZsb29yLG5hdGl2ZUdldFN5bWJvbHM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxuYXRpdmVJc0J1ZmZlcj1CdWZmZXI/QnVmZmVyLmlzQnVmZmVyOnVuZGVmaW5lZCxuYXRpdmVJc0Zpbml0ZT1jb250ZXh0LmlzRmluaXRlLG5hdGl2ZUpvaW49YXJyYXlQcm90by5qb2luLG5hdGl2ZUtleXM9b3ZlckFyZyhPYmplY3Qua2V5cyxPYmplY3QpLG5hdGl2ZU1heD1NYXRoLm1heCxuYXRpdmVNaW49TWF0aC5taW4sbmF0aXZlTm93PURhdGUubm93LG5hdGl2ZVBhcnNlSW50PWNvbnRleHQucGFyc2VJbnQsbmF0aXZlUmFuZG9tPQpNYXRoLnJhbmRvbSxuYXRpdmVSZXZlcnNlPWFycmF5UHJvdG8ucmV2ZXJzZTt2YXIgRGF0YVZpZXc9Z2V0TmF0aXZlKGNvbnRleHQsIkRhdGFWaWV3IiksTWFwPWdldE5hdGl2ZShjb250ZXh0LCJNYXAiKSxQcm9taXNlPWdldE5hdGl2ZShjb250ZXh0LCJQcm9taXNlIiksU2V0PWdldE5hdGl2ZShjb250ZXh0LCJTZXQiKSxXZWFrTWFwPWdldE5hdGl2ZShjb250ZXh0LCJXZWFrTWFwIiksbmF0aXZlQ3JlYXRlPWdldE5hdGl2ZShPYmplY3QsImNyZWF0ZSIpO3ZhciBtZXRhTWFwPVdlYWtNYXAmJm5ldyBXZWFrTWFwO3ZhciByZWFsTmFtZXM9e307dmFyIGRhdGFWaWV3Q3RvclN0cmluZz10b1NvdXJjZShEYXRhVmlldyksbWFwQ3RvclN0cmluZz10b1NvdXJjZShNYXApLHByb21pc2VDdG9yU3RyaW5nPXRvU291cmNlKFByb21pc2UpLHNldEN0b3JTdHJpbmc9dG9Tb3VyY2UoU2V0KSx3ZWFrTWFwQ3RvclN0cmluZz10b1NvdXJjZShXZWFrTWFwKTt2YXIgc3ltYm9sUHJvdG89U3ltYm9sPwpTeW1ib2wucHJvdG90eXBlOnVuZGVmaW5lZCxzeW1ib2xWYWx1ZU9mPXN5bWJvbFByb3RvP3N5bWJvbFByb3RvLnZhbHVlT2Y6dW5kZWZpbmVkLHN5bWJvbFRvU3RyaW5nPXN5bWJvbFByb3RvP3N5bWJvbFByb3RvLnRvU3RyaW5nOnVuZGVmaW5lZDtmdW5jdGlvbiBsb2Rhc2godmFsdWUpe2lmKGlzT2JqZWN0TGlrZSh2YWx1ZSkmJiFpc0FycmF5KHZhbHVlKSYmISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSl7aWYodmFsdWUgaW5zdGFuY2VvZiBMb2Rhc2hXcmFwcGVyKXJldHVybiB2YWx1ZTtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJfX3dyYXBwZWRfXyIpKXJldHVybiB3cmFwcGVyQ2xvbmUodmFsdWUpfXJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSl9dmFyIGJhc2VDcmVhdGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvYmplY3QoKXt9cmV0dXJuIGZ1bmN0aW9uKHByb3RvKXtpZighaXNPYmplY3QocHJvdG8pKXJldHVybnt9O2lmKG9iamVjdENyZWF0ZSlyZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTsKb2JqZWN0LnByb3RvdHlwZT1wcm90bzt2YXIgcmVzdWx0PW5ldyBvYmplY3Q7b2JqZWN0LnByb3RvdHlwZT11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19KCk7ZnVuY3Rpb24gYmFzZUxvZGFzaCgpe31mdW5jdGlvbiBMb2Rhc2hXcmFwcGVyKHZhbHVlLGNoYWluQWxsKXt0aGlzLl9fd3JhcHBlZF9fPXZhbHVlO3RoaXMuX19hY3Rpb25zX189W107dGhpcy5fX2NoYWluX189ISFjaGFpbkFsbDt0aGlzLl9faW5kZXhfXz0wO3RoaXMuX192YWx1ZXNfXz11bmRlZmluZWR9bG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M9eyJlc2NhcGUiOnJlRXNjYXBlLCJldmFsdWF0ZSI6cmVFdmFsdWF0ZSwiaW50ZXJwb2xhdGUiOnJlSW50ZXJwb2xhdGUsInZhcmlhYmxlIjoiIiwiaW1wb3J0cyI6eyJfIjpsb2Rhc2h9fTtsb2Rhc2gucHJvdG90eXBlPWJhc2VMb2Rhc2gucHJvdG90eXBlO2xvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3I9bG9kYXNoO0xvZGFzaFdyYXBwZXIucHJvdG90eXBlPWJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpOwpMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1Mb2Rhc2hXcmFwcGVyO2Z1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKXt0aGlzLl9fd3JhcHBlZF9fPXZhbHVlO3RoaXMuX19hY3Rpb25zX189W107dGhpcy5fX2Rpcl9fPTE7dGhpcy5fX2ZpbHRlcmVkX189ZmFsc2U7dGhpcy5fX2l0ZXJhdGVlc19fPVtdO3RoaXMuX190YWtlQ291bnRfXz1NQVhfQVJSQVlfTEVOR1RIO3RoaXMuX192aWV3c19fPVtdfWZ1bmN0aW9uIGxhenlDbG9uZSgpe3ZhciByZXN1bHQ9bmV3IExhenlXcmFwcGVyKHRoaXMuX193cmFwcGVkX18pO3Jlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7cmVzdWx0Ll9fZGlyX189dGhpcy5fX2Rpcl9fO3Jlc3VsdC5fX2ZpbHRlcmVkX189dGhpcy5fX2ZpbHRlcmVkX187cmVzdWx0Ll9faXRlcmF0ZWVzX189Y29weUFycmF5KHRoaXMuX19pdGVyYXRlZXNfXyk7cmVzdWx0Ll9fdGFrZUNvdW50X189dGhpcy5fX3Rha2VDb3VudF9fOwpyZXN1bHQuX192aWV3c19fPWNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5UmV2ZXJzZSgpe2lmKHRoaXMuX19maWx0ZXJlZF9fKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXN1bHQuX19kaXJfXz0tMTtyZXN1bHQuX19maWx0ZXJlZF9fPXRydWV9ZWxzZXtyZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2Rpcl9fKj0tMX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGxhenlWYWx1ZSgpe3ZhciBhcnJheT10aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksZGlyPXRoaXMuX19kaXJfXyxpc0Fycj1pc0FycmF5KGFycmF5KSxpc1JpZ2h0PWRpcjwwLGFyckxlbmd0aD1pc0Fycj9hcnJheS5sZW5ndGg6MCx2aWV3PWdldFZpZXcoMCxhcnJMZW5ndGgsdGhpcy5fX3ZpZXdzX18pLHN0YXJ0PXZpZXcuc3RhcnQsZW5kPXZpZXcuZW5kLGxlbmd0aD1lbmQtc3RhcnQsaW5kZXg9aXNSaWdodD9lbmQ6c3RhcnQtMSxpdGVyYXRlZXM9dGhpcy5fX2l0ZXJhdGVlc19fLAppdGVyTGVuZ3RoPWl0ZXJhdGVlcy5sZW5ndGgscmVzSW5kZXg9MCx0YWtlQ291bnQ9bmF0aXZlTWluKGxlbmd0aCx0aGlzLl9fdGFrZUNvdW50X18pO2lmKCFpc0Fycnx8IWlzUmlnaHQmJmFyckxlbmd0aD09bGVuZ3RoJiZ0YWtlQ291bnQ9PWxlbmd0aClyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSx0aGlzLl9fYWN0aW9uc19fKTt2YXIgcmVzdWx0PVtdO291dGVyOndoaWxlKGxlbmd0aC0tJiZyZXNJbmRleDx0YWtlQ291bnQpe2luZGV4Kz1kaXI7dmFyIGl0ZXJJbmRleD0tMSx2YWx1ZT1hcnJheVtpbmRleF07d2hpbGUoKytpdGVySW5kZXg8aXRlckxlbmd0aCl7dmFyIGRhdGE9aXRlcmF0ZWVzW2l0ZXJJbmRleF0saXRlcmF0ZWU9ZGF0YS5pdGVyYXRlZSx0eXBlPWRhdGEudHlwZSxjb21wdXRlZD1pdGVyYXRlZSh2YWx1ZSk7aWYodHlwZT09TEFaWV9NQVBfRkxBRyl2YWx1ZT1jb21wdXRlZDtlbHNlIGlmKCFjb21wdXRlZClpZih0eXBlPT1MQVpZX0ZJTFRFUl9GTEFHKWNvbnRpbnVlIG91dGVyOwplbHNlIGJyZWFrIG91dGVyfXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fUxhenlXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TGF6eVdyYXBwZXI7ZnVuY3Rpb24gSGFzaChlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIGhhc2hDbGVhcigpe3RoaXMuX19kYXRhX189bmF0aXZlQ3JlYXRlP25hdGl2ZUNyZWF0ZShudWxsKTp7fTt0aGlzLnNpemU9MH1mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSl7dmFyIHJlc3VsdD10aGlzLmhhcyhrZXkpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO3RoaXMuc2l6ZS09cmVzdWx0PzE6MDsKcmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoYXNoR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztpZihuYXRpdmVDcmVhdGUpe3ZhciByZXN1bHQ9ZGF0YVtrZXldO3JldHVybiByZXN1bHQ9PT1IQVNIX1VOREVGSU5FRD91bmRlZmluZWQ6cmVzdWx0fXJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KT9kYXRhW2tleV06dW5kZWZpbmVkfWZ1bmN0aW9uIGhhc2hIYXMoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO3JldHVybiBuYXRpdmVDcmVhdGU/ZGF0YVtrZXldIT09dW5kZWZpbmVkOmhhc093blByb3BlcnR5LmNhbGwoZGF0YSxrZXkpfWZ1bmN0aW9uIGhhc2hTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO3RoaXMuc2l6ZSs9dGhpcy5oYXMoa2V5KT8wOjE7ZGF0YVtrZXldPW5hdGl2ZUNyZWF0ZSYmdmFsdWU9PT11bmRlZmluZWQ/SEFTSF9VTkRFRklORUQ6dmFsdWU7cmV0dXJuIHRoaXN9SGFzaC5wcm90b3R5cGUuY2xlYXI9aGFzaENsZWFyOwpIYXNoLnByb3RvdHlwZVsiZGVsZXRlIl09aGFzaERlbGV0ZTtIYXNoLnByb3RvdHlwZS5nZXQ9aGFzaEdldDtIYXNoLnByb3RvdHlwZS5oYXM9aGFzaEhhcztIYXNoLnByb3RvdHlwZS5zZXQ9aGFzaFNldDtmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpe3RoaXMuX19kYXRhX189W107dGhpcy5zaXplPTB9ZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO2lmKGluZGV4PDApcmV0dXJuIGZhbHNlO3ZhciBsYXN0SW5kZXg9ZGF0YS5sZW5ndGgtMTtpZihpbmRleD09bGFzdEluZGV4KWRhdGEucG9wKCk7CmVsc2Ugc3BsaWNlLmNhbGwoZGF0YSxpbmRleCwxKTstLXRoaXMuc2l6ZTtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7cmV0dXJuIGluZGV4PDA/dW5kZWZpbmVkOmRhdGFbaW5kZXhdWzFdfWZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpe3JldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXyxrZXkpPi0xfWZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXsrK3RoaXMuc2l6ZTtkYXRhLnB1c2goW2tleSx2YWx1ZV0pfWVsc2UgZGF0YVtpbmRleF1bMV09dmFsdWU7cmV0dXJuIHRoaXN9TGlzdENhY2hlLnByb3RvdHlwZS5jbGVhcj1saXN0Q2FjaGVDbGVhcjtMaXN0Q2FjaGUucHJvdG90eXBlWyJkZWxldGUiXT1saXN0Q2FjaGVEZWxldGU7TGlzdENhY2hlLnByb3RvdHlwZS5nZXQ9Cmxpc3RDYWNoZUdldDtMaXN0Q2FjaGUucHJvdG90eXBlLmhhcz1saXN0Q2FjaGVIYXM7TGlzdENhY2hlLnByb3RvdHlwZS5zZXQ9bGlzdENhY2hlU2V0O2Z1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpe3RoaXMuc2l6ZT0wO3RoaXMuX19kYXRhX189eyJoYXNoIjpuZXcgSGFzaCwibWFwIjpuZXcgKE1hcHx8TGlzdENhY2hlKSwic3RyaW5nIjpuZXcgSGFzaH19ZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KXt2YXIgcmVzdWx0PWdldE1hcERhdGEodGhpcyxrZXkpWyJkZWxldGUiXShrZXkpO3RoaXMuc2l6ZS09cmVzdWx0PzE6MDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSl7cmV0dXJuIGdldE1hcERhdGEodGhpcywKa2V5KS5nZXQoa2V5KX1mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsa2V5KS5oYXMoa2V5KX1mdW5jdGlvbiBtYXBDYWNoZVNldChrZXksdmFsdWUpe3ZhciBkYXRhPWdldE1hcERhdGEodGhpcyxrZXkpLHNpemU9ZGF0YS5zaXplO2RhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplKz1kYXRhLnNpemU9PXNpemU/MDoxO3JldHVybiB0aGlzfU1hcENhY2hlLnByb3RvdHlwZS5jbGVhcj1tYXBDYWNoZUNsZWFyO01hcENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bWFwQ2FjaGVEZWxldGU7TWFwQ2FjaGUucHJvdG90eXBlLmdldD1tYXBDYWNoZUdldDtNYXBDYWNoZS5wcm90b3R5cGUuaGFzPW1hcENhY2hlSGFzO01hcENhY2hlLnByb3RvdHlwZS5zZXQ9bWFwQ2FjaGVTZXQ7ZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXZhbHVlcz09bnVsbD8wOnZhbHVlcy5sZW5ndGg7dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGU7CndoaWxlKCsraW5kZXg8bGVuZ3RoKXRoaXMuYWRkKHZhbHVlc1tpbmRleF0pfWZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKXt0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSxIQVNIX1VOREVGSU5FRCk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSl9U2V0Q2FjaGUucHJvdG90eXBlLmFkZD1TZXRDYWNoZS5wcm90b3R5cGUucHVzaD1zZXRDYWNoZUFkZDtTZXRDYWNoZS5wcm90b3R5cGUuaGFzPXNldENhY2hlSGFzO2Z1bmN0aW9uIFN0YWNrKGVudHJpZXMpe3ZhciBkYXRhPXRoaXMuX19kYXRhX189bmV3IExpc3RDYWNoZShlbnRyaWVzKTt0aGlzLnNpemU9ZGF0YS5zaXplfWZ1bmN0aW9uIHN0YWNrQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGU7dGhpcy5zaXplPTB9ZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLHJlc3VsdD1kYXRhWyJkZWxldGUiXShrZXkpOwp0aGlzLnNpemU9ZGF0YS5zaXplO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gc3RhY2tHZXQoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KX1mdW5jdGlvbiBzdGFja0hhcyhrZXkpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpfWZ1bmN0aW9uIHN0YWNrU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztpZihkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKXt2YXIgcGFpcnM9ZGF0YS5fX2RhdGFfXztpZighTWFwfHxwYWlycy5sZW5ndGg8TEFSR0VfQVJSQVlfU0laRS0xKXtwYWlycy5wdXNoKFtrZXksdmFsdWVdKTt0aGlzLnNpemU9KytkYXRhLnNpemU7cmV0dXJuIHRoaXN9ZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBNYXBDYWNoZShwYWlycyl9ZGF0YS5zZXQoa2V5LHZhbHVlKTt0aGlzLnNpemU9ZGF0YS5zaXplO3JldHVybiB0aGlzfVN0YWNrLnByb3RvdHlwZS5jbGVhcj1zdGFja0NsZWFyO1N0YWNrLnByb3RvdHlwZVsiZGVsZXRlIl09c3RhY2tEZWxldGU7ClN0YWNrLnByb3RvdHlwZS5nZXQ9c3RhY2tHZXQ7U3RhY2sucHJvdG90eXBlLmhhcz1zdGFja0hhcztTdGFjay5wcm90b3R5cGUuc2V0PXN0YWNrU2V0O2Z1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsaW5oZXJpdGVkKXt2YXIgaXNBcnI9aXNBcnJheSh2YWx1ZSksaXNBcmc9IWlzQXJyJiZpc0FyZ3VtZW50cyh2YWx1ZSksaXNCdWZmPSFpc0FyciYmIWlzQXJnJiZpc0J1ZmZlcih2YWx1ZSksaXNUeXBlPSFpc0FyciYmIWlzQXJnJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkodmFsdWUpLHNraXBJbmRleGVzPWlzQXJyfHxpc0FyZ3x8aXNCdWZmfHxpc1R5cGUscmVzdWx0PXNraXBJbmRleGVzP2Jhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsU3RyaW5nKTpbXSxsZW5ndGg9cmVzdWx0Lmxlbmd0aDtmb3IodmFyIGtleSBpbiB2YWx1ZSlpZigoaW5oZXJpdGVkfHxoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLGtleSkpJiYhKHNraXBJbmRleGVzJiYoa2V5PT0ibGVuZ3RoInx8aXNCdWZmJiYoa2V5PT0KIm9mZnNldCJ8fGtleT09InBhcmVudCIpfHxpc1R5cGUmJihrZXk9PSJidWZmZXIifHxrZXk9PSJieXRlTGVuZ3RoInx8a2V5PT0iYnl0ZU9mZnNldCIpfHxpc0luZGV4KGtleSxsZW5ndGgpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5U2FtcGxlKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2FycmF5W2Jhc2VSYW5kb20oMCxsZW5ndGgtMSldOnVuZGVmaW5lZH1mdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksbil7cmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSksYmFzZUNsYW1wKG4sMCxhcnJheS5sZW5ndGgpKX1mdW5jdGlvbiBhcnJheVNodWZmbGUoYXJyYXkpe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpKX1mdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKHZhbHVlIT09dW5kZWZpbmVkJiYhZXEob2JqZWN0W2tleV0sdmFsdWUpfHwKdmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCkpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpfWZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XTtpZighKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkmJmVxKG9ialZhbHVlLHZhbHVlKSl8fHZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksa2V5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZShsZW5ndGgtLSlpZihlcShhcnJheVtsZW5ndGhdWzBdLGtleSkpcmV0dXJuIGxlbmd0aDtyZXR1cm4tMX1mdW5jdGlvbiBiYXNlQWdncmVnYXRvcihjb2xsZWN0aW9uLHNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7c2V0dGVyKGFjY3VtdWxhdG9yLAp2YWx1ZSxpdGVyYXRlZSh2YWx1ZSksY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3Qsc291cmNlKXtyZXR1cm4gb2JqZWN0JiZjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBiYXNlQXNzaWduSW4ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl7aWYoa2V5PT0iX19wcm90b19fIiYmZGVmaW5lUHJvcGVydHkpZGVmaW5lUHJvcGVydHkob2JqZWN0LGtleSx7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6dHJ1ZSwidmFsdWUiOnZhbHVlLCJ3cml0YWJsZSI6dHJ1ZX0pO2Vsc2Ugb2JqZWN0W2tleV09dmFsdWV9ZnVuY3Rpb24gYmFzZUF0KG9iamVjdCxwYXRocyl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PQpBcnJheShsZW5ndGgpLHNraXA9b2JqZWN0PT1udWxsO3doaWxlKCsraW5kZXg8bGVuZ3RoKXJlc3VsdFtpbmRleF09c2tpcD91bmRlZmluZWQ6Z2V0KG9iamVjdCxwYXRoc1tpbmRleF0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNsYW1wKG51bWJlcixsb3dlcix1cHBlcil7aWYobnVtYmVyPT09bnVtYmVyKXtpZih1cHBlciE9PXVuZGVmaW5lZCludW1iZXI9bnVtYmVyPD11cHBlcj9udW1iZXI6dXBwZXI7aWYobG93ZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcj49bG93ZXI/bnVtYmVyOmxvd2VyfXJldHVybiBudW1iZXJ9ZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksb2JqZWN0LHN0YWNrKXt2YXIgcmVzdWx0LGlzRGVlcD1iaXRtYXNrJkNMT05FX0RFRVBfRkxBRyxpc0ZsYXQ9Yml0bWFzayZDTE9ORV9GTEFUX0ZMQUcsaXNGdWxsPWJpdG1hc2smQ0xPTkVfU1lNQk9MU19GTEFHO2lmKGN1c3RvbWl6ZXIpcmVzdWx0PW9iamVjdD8KY3VzdG9taXplcih2YWx1ZSxrZXksb2JqZWN0LHN0YWNrKTpjdXN0b21pemVyKHZhbHVlKTtpZihyZXN1bHQhPT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdDtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgaXNBcnI9aXNBcnJheSh2YWx1ZSk7aWYoaXNBcnIpe3Jlc3VsdD1pbml0Q2xvbmVBcnJheSh2YWx1ZSk7aWYoIWlzRGVlcClyZXR1cm4gY29weUFycmF5KHZhbHVlLHJlc3VsdCl9ZWxzZXt2YXIgdGFnPWdldFRhZyh2YWx1ZSksaXNGdW5jPXRhZz09ZnVuY1RhZ3x8dGFnPT1nZW5UYWc7aWYoaXNCdWZmZXIodmFsdWUpKXJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSxpc0RlZXApO2lmKHRhZz09b2JqZWN0VGFnfHx0YWc9PWFyZ3NUYWd8fGlzRnVuYyYmIW9iamVjdCl7cmVzdWx0PWlzRmxhdHx8aXNGdW5jP3t9OmluaXRDbG9uZU9iamVjdCh2YWx1ZSk7aWYoIWlzRGVlcClyZXR1cm4gaXNGbGF0P2NvcHlTeW1ib2xzSW4odmFsdWUsYmFzZUFzc2lnbkluKHJlc3VsdCwKdmFsdWUpKTpjb3B5U3ltYm9scyh2YWx1ZSxiYXNlQXNzaWduKHJlc3VsdCx2YWx1ZSkpfWVsc2V7aWYoIWNsb25lYWJsZVRhZ3NbdGFnXSlyZXR1cm4gb2JqZWN0P3ZhbHVlOnt9O3Jlc3VsdD1pbml0Q2xvbmVCeVRhZyh2YWx1ZSx0YWcsaXNEZWVwKX19c3RhY2t8fChzdGFjaz1uZXcgU3RhY2spO3ZhciBzdGFja2VkPXN0YWNrLmdldCh2YWx1ZSk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZDtzdGFjay5zZXQodmFsdWUscmVzdWx0KTtpZihpc1NldCh2YWx1ZSkpe3ZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpe3Jlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixzdWJWYWx1ZSx2YWx1ZSxzdGFjaykpfSk7cmV0dXJuIHJlc3VsdH1pZihpc01hcCh2YWx1ZSkpe3ZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUsa2V5KXtyZXN1bHQuc2V0KGtleSxiYXNlQ2xvbmUoc3ViVmFsdWUsYml0bWFzayxjdXN0b21pemVyLGtleSx2YWx1ZSwKc3RhY2spKX0pO3JldHVybiByZXN1bHR9dmFyIGtleXNGdW5jPWlzRnVsbD9pc0ZsYXQ/Z2V0QWxsS2V5c0luOmdldEFsbEtleXM6aXNGbGF0P2tleXNJbjprZXlzO3ZhciBwcm9wcz1pc0Fycj91bmRlZmluZWQ6a2V5c0Z1bmModmFsdWUpO2FycmF5RWFjaChwcm9wc3x8dmFsdWUsZnVuY3Rpb24oc3ViVmFsdWUsa2V5KXtpZihwcm9wcyl7a2V5PXN1YlZhbHVlO3N1YlZhbHVlPXZhbHVlW2tleV19YXNzaWduVmFsdWUocmVzdWx0LGtleSxiYXNlQ2xvbmUoc3ViVmFsdWUsYml0bWFzayxjdXN0b21pemVyLGtleSx2YWx1ZSxzdGFjaykpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlQ29uZm9ybXMoc291cmNlKXt2YXIgcHJvcHM9a2V5cyhzb3VyY2UpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLHByb3BzKX19ZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl7dmFyIGxlbmd0aD1wcm9wcy5sZW5ndGg7CmlmKG9iamVjdD09bnVsbClyZXR1cm4hbGVuZ3RoO29iamVjdD1PYmplY3Qob2JqZWN0KTt3aGlsZShsZW5ndGgtLSl7dmFyIGtleT1wcm9wc1tsZW5ndGhdLHByZWRpY2F0ZT1zb3VyY2Vba2V5XSx2YWx1ZT1vYmplY3Rba2V5XTtpZih2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KXx8IXByZWRpY2F0ZSh2YWx1ZSkpcmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWZ1bmN0aW9uIGJhc2VEZWxheShmdW5jLHdhaXQsYXJncyl7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZnVuYy5hcHBseSh1bmRlZmluZWQsYXJncyl9LHdhaXQpfWZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxpc0NvbW1vbj10cnVlLGxlbmd0aD1hcnJheS5sZW5ndGgsCnJlc3VsdD1bXSx2YWx1ZXNMZW5ndGg9dmFsdWVzLmxlbmd0aDtpZighbGVuZ3RoKXJldHVybiByZXN1bHQ7aWYoaXRlcmF0ZWUpdmFsdWVzPWFycmF5TWFwKHZhbHVlcyxiYXNlVW5hcnkoaXRlcmF0ZWUpKTtpZihjb21wYXJhdG9yKXtpbmNsdWRlcz1hcnJheUluY2x1ZGVzV2l0aDtpc0NvbW1vbj1mYWxzZX1lbHNlIGlmKHZhbHVlcy5sZW5ndGg+PUxBUkdFX0FSUkFZX1NJWkUpe2luY2x1ZGVzPWNhY2hlSGFzO2lzQ29tbW9uPWZhbHNlO3ZhbHVlcz1uZXcgU2V0Q2FjaGUodmFsdWVzKX1vdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT09bnVsbD92YWx1ZTppdGVyYXRlZSh2YWx1ZSk7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciB2YWx1ZXNJbmRleD12YWx1ZXNMZW5ndGg7d2hpbGUodmFsdWVzSW5kZXgtLSlpZih2YWx1ZXNbdmFsdWVzSW5kZXhdPT09CmNvbXB1dGVkKWNvbnRpbnVlIG91dGVyO3Jlc3VsdC5wdXNoKHZhbHVlKX1lbHNlIGlmKCFpbmNsdWRlcyh2YWx1ZXMsY29tcHV0ZWQsY29tcGFyYXRvcikpcmVzdWx0LnB1c2godmFsdWUpfXJldHVybiByZXN1bHR9dmFyIGJhc2VFYWNoPWNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO3ZhciBiYXNlRWFjaFJpZ2h0PWNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCx0cnVlKTtmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciByZXN1bHQ9dHJ1ZTtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD0hIXByZWRpY2F0ZSh2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKTtyZXR1cm4gcmVzdWx0fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT0KYXJyYXlbaW5kZXhdLGN1cnJlbnQ9aXRlcmF0ZWUodmFsdWUpO2lmKGN1cnJlbnQhPW51bGwmJihjb21wdXRlZD09PXVuZGVmaW5lZD9jdXJyZW50PT09Y3VycmVudCYmIWlzU3ltYm9sKGN1cnJlbnQpOmNvbXBhcmF0b3IoY3VycmVudCxjb21wdXRlZCkpKXZhciBjb21wdXRlZD1jdXJyZW50LHJlc3VsdD12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD09PXVuZGVmaW5lZHx8ZW5kPmxlbmd0aD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCk7aWYoZW5kPDApZW5kKz1sZW5ndGg7ZW5kPXN0YXJ0PmVuZD8wOnRvTGVuZ3RoKGVuZCk7d2hpbGUoc3RhcnQ8ZW5kKWFycmF5W3N0YXJ0KytdPXZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIHJlc3VsdD1bXTtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe2lmKHByZWRpY2F0ZSh2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKSlyZXN1bHQucHVzaCh2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoLHByZWRpY2F0ZSxpc1N0cmljdCxyZXN1bHQpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3ByZWRpY2F0ZXx8KHByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlKTtyZXN1bHR8fChyZXN1bHQ9W10pO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKGRlcHRoPjAmJnByZWRpY2F0ZSh2YWx1ZSkpaWYoZGVwdGg+MSliYXNlRmxhdHRlbih2YWx1ZSxkZXB0aC0xLHByZWRpY2F0ZSxpc1N0cmljdCxyZXN1bHQpO2Vsc2UgYXJyYXlQdXNoKHJlc3VsdCx2YWx1ZSk7ZWxzZSBpZighaXNTdHJpY3QpcmVzdWx0W3Jlc3VsdC5sZW5ndGhdPQp2YWx1ZX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRm9yPWNyZWF0ZUJhc2VGb3IoKTt2YXIgYmFzZUZvclJpZ2h0PWNyZWF0ZUJhc2VGb3IodHJ1ZSk7ZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3Iob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JSaWdodChvYmplY3QsaXRlcmF0ZWUsa2V5cyl9ZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheUZpbHRlcihwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKX0pfWZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0wLGxlbmd0aD1wYXRoLmxlbmd0aDt3aGlsZShvYmplY3QhPW51bGwmJmluZGV4PGxlbmd0aClvYmplY3Q9b2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTsKcmV0dXJuIGluZGV4JiZpbmRleD09bGVuZ3RoP29iamVjdDp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LGtleXNGdW5jLHN5bWJvbHNGdW5jKXt2YXIgcmVzdWx0PWtleXNGdW5jKG9iamVjdCk7cmV0dXJuIGlzQXJyYXkob2JqZWN0KT9yZXN1bHQ6YXJyYXlQdXNoKHJlc3VsdCxzeW1ib2xzRnVuYyhvYmplY3QpKX1mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdmFsdWU9PT11bmRlZmluZWQ/dW5kZWZpbmVkVGFnOm51bGxUYWc7cmV0dXJuIHN5bVRvU3RyaW5nVGFnJiZzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpP2dldFJhd1RhZyh2YWx1ZSk6b2JqZWN0VG9TdHJpbmcodmFsdWUpfWZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPm90aGVyfWZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsCmtleSl9ZnVuY3Rpb24gYmFzZUhhc0luKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmtleSBpbiBPYmplY3Qob2JqZWN0KX1mdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsc3RhcnQsZW5kKXtyZXR1cm4gbnVtYmVyPj1uYXRpdmVNaW4oc3RhcnQsZW5kKSYmbnVtYmVyPG5hdGl2ZU1heChzdGFydCxlbmQpfWZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmNsdWRlcz1jb21wYXJhdG9yP2FycmF5SW5jbHVkZXNXaXRoOmFycmF5SW5jbHVkZXMsbGVuZ3RoPWFycmF5c1swXS5sZW5ndGgsb3RoTGVuZ3RoPWFycmF5cy5sZW5ndGgsb3RoSW5kZXg9b3RoTGVuZ3RoLGNhY2hlcz1BcnJheShvdGhMZW5ndGgpLG1heExlbmd0aD1JbmZpbml0eSxyZXN1bHQ9W107d2hpbGUob3RoSW5kZXgtLSl7dmFyIGFycmF5PWFycmF5c1tvdGhJbmRleF07aWYob3RoSW5kZXgmJml0ZXJhdGVlKWFycmF5PWFycmF5TWFwKGFycmF5LApiYXNlVW5hcnkoaXRlcmF0ZWUpKTttYXhMZW5ndGg9bmF0aXZlTWluKGFycmF5Lmxlbmd0aCxtYXhMZW5ndGgpO2NhY2hlc1tvdGhJbmRleF09IWNvbXBhcmF0b3ImJihpdGVyYXRlZXx8bGVuZ3RoPj0xMjAmJmFycmF5Lmxlbmd0aD49MTIwKT9uZXcgU2V0Q2FjaGUob3RoSW5kZXgmJmFycmF5KTp1bmRlZmluZWR9YXJyYXk9YXJyYXlzWzBdO3ZhciBpbmRleD0tMSxzZWVuPWNhY2hlc1swXTtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCYmcmVzdWx0Lmxlbmd0aDxtYXhMZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU/aXRlcmF0ZWUodmFsdWUpOnZhbHVlO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKCEoc2Vlbj9jYWNoZUhhcyhzZWVuLGNvbXB1dGVkKTppbmNsdWRlcyhyZXN1bHQsY29tcHV0ZWQsY29tcGFyYXRvcikpKXtvdGhJbmRleD1vdGhMZW5ndGg7d2hpbGUoLS1vdGhJbmRleCl7dmFyIGNhY2hlPWNhY2hlc1tvdGhJbmRleF07CmlmKCEoY2FjaGU/Y2FjaGVIYXMoY2FjaGUsY29tcHV0ZWQpOmluY2x1ZGVzKGFycmF5c1tvdGhJbmRleF0sY29tcHV0ZWQsY29tcGFyYXRvcikpKWNvbnRpbnVlIG91dGVyfWlmKHNlZW4pc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCxzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe3NldHRlcihhY2N1bXVsYXRvcixpdGVyYXRlZSh2YWx1ZSksa2V5LG9iamVjdCl9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZUludm9rZShvYmplY3QscGF0aCxhcmdzKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTt2YXIgZnVuYz1vYmplY3Q9PW51bGw/b2JqZWN0Om9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07cmV0dXJuIGZ1bmM9PW51bGw/dW5kZWZpbmVkOgphcHBseShmdW5jLG9iamVjdCxhcmdzKX1mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJnc1RhZ31mdW5jdGlvbiBiYXNlSXNBcnJheUJ1ZmZlcih2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1hcnJheUJ1ZmZlclRhZ31mdW5jdGlvbiBiYXNlSXNEYXRlKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWRhdGVUYWd9ZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKXtpZih2YWx1ZT09PW90aGVyKXJldHVybiB0cnVlO2lmKHZhbHVlPT1udWxsfHxvdGhlcj09bnVsbHx8IWlzT2JqZWN0TGlrZSh2YWx1ZSkmJiFpc09iamVjdExpa2Uob3RoZXIpKXJldHVybiB2YWx1ZSE9PXZhbHVlJiZvdGhlciE9PW90aGVyO3JldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsCm90aGVyLGJpdG1hc2ssY3VzdG9taXplcixiYXNlSXNFcXVhbCxzdGFjayl9ZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgb2JqSXNBcnI9aXNBcnJheShvYmplY3QpLG90aElzQXJyPWlzQXJyYXkob3RoZXIpLG9ialRhZz1vYmpJc0Fycj9hcnJheVRhZzpnZXRUYWcob2JqZWN0KSxvdGhUYWc9b3RoSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG90aGVyKTtvYmpUYWc9b2JqVGFnPT1hcmdzVGFnP29iamVjdFRhZzpvYmpUYWc7b3RoVGFnPW90aFRhZz09YXJnc1RhZz9vYmplY3RUYWc6b3RoVGFnO3ZhciBvYmpJc09iaj1vYmpUYWc9PW9iamVjdFRhZyxvdGhJc09iaj1vdGhUYWc9PW9iamVjdFRhZyxpc1NhbWVUYWc9b2JqVGFnPT1vdGhUYWc7aWYoaXNTYW1lVGFnJiZpc0J1ZmZlcihvYmplY3QpKXtpZighaXNCdWZmZXIob3RoZXIpKXJldHVybiBmYWxzZTtvYmpJc0Fycj10cnVlO29iaklzT2JqPQpmYWxzZX1pZihpc1NhbWVUYWcmJiFvYmpJc09iail7c3RhY2t8fChzdGFjaz1uZXcgU3RhY2spO3JldHVybiBvYmpJc0Fycnx8aXNUeXBlZEFycmF5KG9iamVjdCk/ZXF1YWxBcnJheXMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spOmVxdWFsQnlUYWcob2JqZWN0LG90aGVyLG9ialRhZyxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1pZighKGJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKXt2YXIgb2JqSXNXcmFwcGVkPW9iaklzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwiX193cmFwcGVkX18iKSxvdGhJc1dyYXBwZWQ9b3RoSXNPYmomJmhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIl9fd3JhcHBlZF9fIik7aWYob2JqSXNXcmFwcGVkfHxvdGhJc1dyYXBwZWQpe3ZhciBvYmpVbndyYXBwZWQ9b2JqSXNXcmFwcGVkP29iamVjdC52YWx1ZSgpOm9iamVjdCxvdGhVbndyYXBwZWQ9b3RoSXNXcmFwcGVkP290aGVyLnZhbHVlKCk6Cm90aGVyO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxGdW5jKG9ialVud3JhcHBlZCxvdGhVbndyYXBwZWQsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKX19aWYoIWlzU2FtZVRhZylyZXR1cm4gZmFsc2U7c3RhY2t8fChzdGFjaz1uZXcgU3RhY2spO3JldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmdldFRhZyh2YWx1ZSk9PW1hcFRhZ31mdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLG1hdGNoRGF0YSxjdXN0b21pemVyKXt2YXIgaW5kZXg9bWF0Y2hEYXRhLmxlbmd0aCxsZW5ndGg9aW5kZXgsbm9DdXN0b21pemVyPSFjdXN0b21pemVyO2lmKG9iamVjdD09bnVsbClyZXR1cm4hbGVuZ3RoO29iamVjdD1PYmplY3Qob2JqZWN0KTt3aGlsZShpbmRleC0tKXt2YXIgZGF0YT1tYXRjaERhdGFbaW5kZXhdOwppZihub0N1c3RvbWl6ZXImJmRhdGFbMl0/ZGF0YVsxXSE9PW9iamVjdFtkYXRhWzBdXTohKGRhdGFbMF1pbiBvYmplY3QpKXJldHVybiBmYWxzZX13aGlsZSgrK2luZGV4PGxlbmd0aCl7ZGF0YT1tYXRjaERhdGFbaW5kZXhdO3ZhciBrZXk9ZGF0YVswXSxvYmpWYWx1ZT1vYmplY3Rba2V5XSxzcmNWYWx1ZT1kYXRhWzFdO2lmKG5vQ3VzdG9taXplciYmZGF0YVsyXSl7aWYob2JqVmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCkpcmV0dXJuIGZhbHNlfWVsc2V7dmFyIHN0YWNrPW5ldyBTdGFjaztpZihjdXN0b21pemVyKXZhciByZXN1bHQ9Y3VzdG9taXplcihvYmpWYWx1ZSxzcmNWYWx1ZSxrZXksb2JqZWN0LHNvdXJjZSxzdGFjayk7aWYoIShyZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyxjdXN0b21pemVyLHN0YWNrKTpyZXN1bHQpKXJldHVybiBmYWxzZX19cmV0dXJuIHRydWV9CmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSl7aWYoIWlzT2JqZWN0KHZhbHVlKXx8aXNNYXNrZWQodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgcGF0dGVybj1pc0Z1bmN0aW9uKHZhbHVlKT9yZUlzTmF0aXZlOnJlSXNIb3N0Q3RvcjtyZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSl9ZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PXJlZ2V4cFRhZ31mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1zZXRUYWd9ZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkmJiEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldfWZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iKXJldHVybiB2YWx1ZTsKaWYodmFsdWU9PW51bGwpcmV0dXJuIGlkZW50aXR5O2lmKHR5cGVvZiB2YWx1ZT09Im9iamVjdCIpcmV0dXJuIGlzQXJyYXkodmFsdWUpP2Jhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sdmFsdWVbMV0pOmJhc2VNYXRjaGVzKHZhbHVlKTtyZXR1cm4gcHJvcGVydHkodmFsdWUpfWZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCl7aWYoIWlzUHJvdG90eXBlKG9iamVjdCkpcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTt2YXIgcmVzdWx0PVtdO2Zvcih2YXIga2V5IGluIE9iamVjdChvYmplY3QpKWlmKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkmJmtleSE9ImNvbnN0cnVjdG9yIilyZXN1bHQucHVzaChrZXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3Qpe2lmKCFpc09iamVjdChvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTt2YXIgaXNQcm90bz1pc1Byb3RvdHlwZShvYmplY3QpLHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBvYmplY3QpaWYoIShrZXk9PQoiY29uc3RydWN0b3IiJiYoaXNQcm90b3x8IWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpKSlyZXN1bHQucHVzaChrZXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUx0KHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8b3RoZXJ9ZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEscmVzdWx0PWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pP0FycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKTpbXTtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtyZXN1bHRbKytpbmRleF09aXRlcmF0ZWUodmFsdWUsa2V5LGNvbGxlY3Rpb24pfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2Upe3ZhciBtYXRjaERhdGE9Z2V0TWF0Y2hEYXRhKHNvdXJjZSk7aWYobWF0Y2hEYXRhLmxlbmd0aD09MSYmbWF0Y2hEYXRhWzBdWzJdKXJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sCm1hdGNoRGF0YVswXVsxXSk7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIG9iamVjdD09PXNvdXJjZXx8YmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEpfX1mdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsc3JjVmFsdWUpe2lmKGlzS2V5KHBhdGgpJiZpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKXJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSxzcmNWYWx1ZSk7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7dmFyIG9ialZhbHVlPWdldChvYmplY3QscGF0aCk7cmV0dXJuIG9ialZhbHVlPT09dW5kZWZpbmVkJiZvYmpWYWx1ZT09PXNyY1ZhbHVlP2hhc0luKG9iamVjdCxwYXRoKTpiYXNlSXNFcXVhbChzcmNWYWx1ZSxvYmpWYWx1ZSxDT01QQVJFX1BBUlRJQUxfRkxBR3xDT01QQVJFX1VOT1JERVJFRF9GTEFHKX19ZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcixzdGFjayl7aWYob2JqZWN0PT09CnNvdXJjZSlyZXR1cm47YmFzZUZvcihzb3VyY2UsZnVuY3Rpb24oc3JjVmFsdWUsa2V5KXtpZihpc09iamVjdChzcmNWYWx1ZSkpe3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LGJhc2VNZXJnZSxjdXN0b21pemVyLHN0YWNrKX1lbHNle3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIoc2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZSxrZXkrIiIsb2JqZWN0LHNvdXJjZSxzdGFjayk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPXNyY1ZhbHVlO2Fzc2lnbk1lcmdlVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9fSxrZXlzSW4pfWZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LHNvdXJjZSxrZXksc3JjSW5kZXgsbWVyZ2VGdW5jLGN1c3RvbWl6ZXIsc3RhY2spe3ZhciBvYmpWYWx1ZT1zYWZlR2V0KG9iamVjdCxrZXkpLHNyY1ZhbHVlPXNhZmVHZXQoc291cmNlLAprZXkpLHN0YWNrZWQ9c3RhY2suZ2V0KHNyY1ZhbHVlKTtpZihzdGFja2VkKXthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksc3RhY2tlZCk7cmV0dXJufXZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDt2YXIgaXNDb21tb249bmV3VmFsdWU9PT11bmRlZmluZWQ7aWYoaXNDb21tb24pe3ZhciBpc0Fycj1pc0FycmF5KHNyY1ZhbHVlKSxpc0J1ZmY9IWlzQXJyJiZpc0J1ZmZlcihzcmNWYWx1ZSksaXNUeXBlZD0haXNBcnImJiFpc0J1ZmYmJmlzVHlwZWRBcnJheShzcmNWYWx1ZSk7bmV3VmFsdWU9c3JjVmFsdWU7aWYoaXNBcnJ8fGlzQnVmZnx8aXNUeXBlZClpZihpc0FycmF5KG9ialZhbHVlKSluZXdWYWx1ZT1vYmpWYWx1ZTtlbHNlIGlmKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSluZXdWYWx1ZT1jb3B5QXJyYXkob2JqVmFsdWUpO2Vsc2UgaWYoaXNCdWZmKXtpc0NvbW1vbj0KZmFsc2U7bmV3VmFsdWU9Y2xvbmVCdWZmZXIoc3JjVmFsdWUsdHJ1ZSl9ZWxzZSBpZihpc1R5cGVkKXtpc0NvbW1vbj1mYWxzZTtuZXdWYWx1ZT1jbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsdHJ1ZSl9ZWxzZSBuZXdWYWx1ZT1bXTtlbHNlIGlmKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpfHxpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpe25ld1ZhbHVlPW9ialZhbHVlO2lmKGlzQXJndW1lbnRzKG9ialZhbHVlKSluZXdWYWx1ZT10b1BsYWluT2JqZWN0KG9ialZhbHVlKTtlbHNlIGlmKCFpc09iamVjdChvYmpWYWx1ZSl8fHNyY0luZGV4JiZpc0Z1bmN0aW9uKG9ialZhbHVlKSluZXdWYWx1ZT1pbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpfWVsc2UgaXNDb21tb249ZmFsc2V9aWYoaXNDb21tb24pe3N0YWNrLnNldChzcmNWYWx1ZSxuZXdWYWx1ZSk7bWVyZ2VGdW5jKG5ld1ZhbHVlLHNyY1ZhbHVlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9YXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsCmtleSxuZXdWYWx1ZSl9ZnVuY3Rpb24gYmFzZU50aChhcnJheSxuKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybjtuKz1uPDA/bGVuZ3RoOjA7cmV0dXJuIGlzSW5kZXgobixsZW5ndGgpP2FycmF5W25dOnVuZGVmaW5lZH1mdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpe3ZhciBpbmRleD0tMTtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLmxlbmd0aD9pdGVyYXRlZXM6W2lkZW50aXR5XSxiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO3ZhciByZXN1bHQ9YmFzZU1hcChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXt2YXIgY3JpdGVyaWE9YXJyYXlNYXAoaXRlcmF0ZWVzLGZ1bmN0aW9uKGl0ZXJhdGVlKXtyZXR1cm4gaXRlcmF0ZWUodmFsdWUpfSk7cmV0dXJueyJjcml0ZXJpYSI6Y3JpdGVyaWEsImluZGV4IjorK2luZGV4LCJ2YWx1ZSI6dmFsdWV9fSk7cmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LApmdW5jdGlvbihvYmplY3Qsb3RoZXIpe3JldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl9KX1mdW5jdGlvbiBiYXNlUGljayhvYmplY3QscGF0aHMpe3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwYXRocyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gaGFzSW4ob2JqZWN0LHBhdGgpfSl9ZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QscGF0aHMscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGhzLmxlbmd0aCxyZXN1bHQ9e307d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYXRoPXBhdGhzW2luZGV4XSx2YWx1ZT1iYXNlR2V0KG9iamVjdCxwYXRoKTtpZihwcmVkaWNhdGUodmFsdWUscGF0aCkpYmFzZVNldChyZXN1bHQsY2FzdFBhdGgocGF0aCxvYmplY3QpLHZhbHVlKX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIGJhc2VHZXQob2JqZWN0LHBhdGgpfX0KZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleE9mPWNvbXBhcmF0b3I/YmFzZUluZGV4T2ZXaXRoOmJhc2VJbmRleE9mLGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLHNlZW49YXJyYXk7aWYoYXJyYXk9PT12YWx1ZXMpdmFsdWVzPWNvcHlBcnJheSh2YWx1ZXMpO2lmKGl0ZXJhdGVlKXNlZW49YXJyYXlNYXAoYXJyYXksYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBmcm9tSW5kZXg9MCx2YWx1ZT12YWx1ZXNbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt3aGlsZSgoZnJvbUluZGV4PWluZGV4T2Yoc2Vlbixjb21wdXRlZCxmcm9tSW5kZXgsY29tcGFyYXRvcikpPi0xKXtpZihzZWVuIT09YXJyYXkpc3BsaWNlLmNhbGwoc2Vlbixmcm9tSW5kZXgsMSk7c3BsaWNlLmNhbGwoYXJyYXksZnJvbUluZGV4LDEpfX1yZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwKaW5kZXhlcyl7dmFyIGxlbmd0aD1hcnJheT9pbmRleGVzLmxlbmd0aDowLGxhc3RJbmRleD1sZW5ndGgtMTt3aGlsZShsZW5ndGgtLSl7dmFyIGluZGV4PWluZGV4ZXNbbGVuZ3RoXTtpZihsZW5ndGg9PWxhc3RJbmRleHx8aW5kZXghPT1wcmV2aW91cyl7dmFyIHByZXZpb3VzPWluZGV4O2lmKGlzSW5kZXgoaW5kZXgpKXNwbGljZS5jYWxsKGFycmF5LGluZGV4LDEpO2Vsc2UgYmFzZVVuc2V0KGFycmF5LGluZGV4KX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsdXBwZXIpe3JldHVybiBsb3dlcituYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSoodXBwZXItbG93ZXIrMSkpfWZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCxlbmQsc3RlcCxmcm9tUmlnaHQpe3ZhciBpbmRleD0tMSxsZW5ndGg9bmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZC1zdGFydCkvKHN0ZXB8fDEpKSwwKSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTt3aGlsZShsZW5ndGgtLSl7cmVzdWx0W2Zyb21SaWdodD8KbGVuZ3RoOisraW5kZXhdPXN0YXJ0O3N0YXJ0Kz1zdGVwfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsbil7dmFyIHJlc3VsdD0iIjtpZighc3RyaW5nfHxuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm4gcmVzdWx0O2Rve2lmKG4lMilyZXN1bHQrPXN0cmluZztuPW5hdGl2ZUZsb29yKG4vMik7aWYobilzdHJpbmcrPXN0cmluZ313aGlsZShuKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXN0KGZ1bmMsc3RhcnQpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHN0YXJ0LGlkZW50aXR5KSxmdW5jKyIiKX1mdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pe3JldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpfWZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sbil7dmFyIGFycmF5PXZhbHVlcyhjb2xsZWN0aW9uKTtyZXR1cm4gc2h1ZmZsZVNlbGYoYXJyYXksYmFzZUNsYW1wKG4sMCxhcnJheS5sZW5ndGgpKX0KZnVuY3Rpb24gYmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gb2JqZWN0O3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aC5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xLG5lc3RlZD1vYmplY3Q7d2hpbGUobmVzdGVkIT1udWxsJiYrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSksbmV3VmFsdWU9dmFsdWU7aWYoaW5kZXghPWxhc3RJbmRleCl7dmFyIG9ialZhbHVlPW5lc3RlZFtrZXldO25ld1ZhbHVlPWN1c3RvbWl6ZXI/Y3VzdG9taXplcihvYmpWYWx1ZSxrZXksbmVzdGVkKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9aXNPYmplY3Qob2JqVmFsdWUpP29ialZhbHVlOmlzSW5kZXgocGF0aFtpbmRleCsxXSk/W106e319YXNzaWduVmFsdWUobmVzdGVkLGtleSxuZXdWYWx1ZSk7bmVzdGVkPW5lc3RlZFtrZXldfXJldHVybiBvYmplY3R9CnZhciBiYXNlU2V0RGF0YT0hbWV0YU1hcD9pZGVudGl0eTpmdW5jdGlvbihmdW5jLGRhdGEpe21ldGFNYXAuc2V0KGZ1bmMsZGF0YSk7cmV0dXJuIGZ1bmN9O3ZhciBiYXNlU2V0VG9TdHJpbmc9IWRlZmluZVByb3BlcnR5P2lkZW50aXR5OmZ1bmN0aW9uKGZ1bmMsc3RyaW5nKXtyZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywidG9TdHJpbmciLHsiY29uZmlndXJhYmxlIjp0cnVlLCJlbnVtZXJhYmxlIjpmYWxzZSwidmFsdWUiOmNvbnN0YW50KHN0cmluZyksIndyaXRhYmxlIjp0cnVlfSl9O2Z1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pe3JldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpfWZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO2lmKHN0YXJ0PDApc3RhcnQ9LXN0YXJ0Pmxlbmd0aD8wOmxlbmd0aCtzdGFydDtlbmQ9ZW5kPmxlbmd0aD9sZW5ndGg6ZW5kO2lmKGVuZDwwKWVuZCs9Cmxlbmd0aDtsZW5ndGg9c3RhcnQ+ZW5kPzA6ZW5kLXN0YXJ0Pj4+MDtzdGFydD4+Pj0wO3ZhciByZXN1bHQ9QXJyYXkobGVuZ3RoKTt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPWFycmF5W2luZGV4K3N0YXJ0XTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb21lKGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0O2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsaW5kZXgsY29sbGVjdGlvbil7cmVzdWx0PXByZWRpY2F0ZSh2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKTtyZXR1cm4hcmVzdWx0fSk7cmV0dXJuISFyZXN1bHR9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHJldEhpZ2hlc3Qpe3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsP2xvdzphcnJheS5sZW5ndGg7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIiYmdmFsdWU9PT12YWx1ZSYmaGlnaDw9SEFMRl9NQVhfQVJSQVlfTEVOR1RIKXt3aGlsZShsb3c8aGlnaCl7dmFyIG1pZD0KbG93K2hpZ2g+Pj4xLGNvbXB1dGVkPWFycmF5W21pZF07aWYoY29tcHV0ZWQhPT1udWxsJiYhaXNTeW1ib2woY29tcHV0ZWQpJiYocmV0SGlnaGVzdD9jb21wdXRlZDw9dmFsdWU6Y29tcHV0ZWQ8dmFsdWUpKWxvdz1taWQrMTtlbHNlIGhpZ2g9bWlkfXJldHVybiBoaWdofXJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpZGVudGl0eSxyZXRIaWdoZXN0KX1mdW5jdGlvbiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSxyZXRIaWdoZXN0KXt2YWx1ZT1pdGVyYXRlZSh2YWx1ZSk7dmFyIGxvdz0wLGhpZ2g9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgsdmFsSXNOYU49dmFsdWUhPT12YWx1ZSx2YWxJc051bGw9dmFsdWU9PT1udWxsLHZhbElzU3ltYm9sPWlzU3ltYm9sKHZhbHVlKSx2YWxJc1VuZGVmaW5lZD12YWx1ZT09PXVuZGVmaW5lZDt3aGlsZShsb3c8aGlnaCl7dmFyIG1pZD1uYXRpdmVGbG9vcigobG93K2hpZ2gpLzIpLGNvbXB1dGVkPQppdGVyYXRlZShhcnJheVttaWRdKSxvdGhJc0RlZmluZWQ9Y29tcHV0ZWQhPT11bmRlZmluZWQsb3RoSXNOdWxsPWNvbXB1dGVkPT09bnVsbCxvdGhJc1JlZmxleGl2ZT1jb21wdXRlZD09PWNvbXB1dGVkLG90aElzU3ltYm9sPWlzU3ltYm9sKGNvbXB1dGVkKTtpZih2YWxJc05hTil2YXIgc2V0TG93PXJldEhpZ2hlc3R8fG90aElzUmVmbGV4aXZlO2Vsc2UgaWYodmFsSXNVbmRlZmluZWQpc2V0TG93PW90aElzUmVmbGV4aXZlJiYocmV0SGlnaGVzdHx8b3RoSXNEZWZpbmVkKTtlbHNlIGlmKHZhbElzTnVsbClzZXRMb3c9b3RoSXNSZWZsZXhpdmUmJm90aElzRGVmaW5lZCYmKHJldEhpZ2hlc3R8fCFvdGhJc051bGwpO2Vsc2UgaWYodmFsSXNTeW1ib2wpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJiFvdGhJc051bGwmJihyZXRIaWdoZXN0fHwhb3RoSXNTeW1ib2wpO2Vsc2UgaWYob3RoSXNOdWxsfHxvdGhJc1N5bWJvbClzZXRMb3c9ZmFsc2U7ZWxzZSBzZXRMb3c9CnJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlO2lmKHNldExvdylsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gbmF0aXZlTWluKGhpZ2gsTUFYX0FSUkFZX0lOREVYKX1mdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSxpdGVyYXRlZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU/aXRlcmF0ZWUodmFsdWUpOnZhbHVlO2lmKCFpbmRleHx8IWVxKGNvbXB1dGVkLHNlZW4pKXt2YXIgc2Vlbj1jb21wdXRlZDtyZXN1bHRbcmVzSW5kZXgrK109dmFsdWU9PT0wPzA6dmFsdWV9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTtpZihpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIE5BTjtyZXR1cm4rdmFsdWV9CmZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nIilyZXR1cm4gdmFsdWU7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLGJhc2VUb1N0cmluZykrIiI7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBzeW1ib2xUb1N0cmluZz9zeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKToiIjt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fWZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxpbmNsdWRlcz1hcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheS5sZW5ndGgsaXNDb21tb249dHJ1ZSxyZXN1bHQ9W10sc2Vlbj1yZXN1bHQ7aWYoY29tcGFyYXRvcil7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGh9ZWxzZSBpZihsZW5ndGg+PUxBUkdFX0FSUkFZX1NJWkUpe3ZhciBzZXQ9Cml0ZXJhdGVlP251bGw6Y3JlYXRlU2V0KGFycmF5KTtpZihzZXQpcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtpc0NvbW1vbj1mYWxzZTtpbmNsdWRlcz1jYWNoZUhhcztzZWVuPW5ldyBTZXRDYWNoZX1lbHNlIHNlZW49aXRlcmF0ZWU/W106cmVzdWx0O291dGVyOndoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZihpc0NvbW1vbiYmY29tcHV0ZWQ9PT1jb21wdXRlZCl7dmFyIHNlZW5JbmRleD1zZWVuLmxlbmd0aDt3aGlsZShzZWVuSW5kZXgtLSlpZihzZWVuW3NlZW5JbmRleF09PT1jb21wdXRlZCljb250aW51ZSBvdXRlcjtpZihpdGVyYXRlZSlzZWVuLnB1c2goY29tcHV0ZWQpO3Jlc3VsdC5wdXNoKHZhbHVlKX1lbHNlIGlmKCFpbmNsdWRlcyhzZWVuLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXtpZihzZWVuIT09cmVzdWx0KXNlZW4ucHVzaChjb21wdXRlZCk7CnJlc3VsdC5wdXNoKHZhbHVlKX19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlVW5zZXQob2JqZWN0LHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO29iamVjdD1wYXJlbnQob2JqZWN0LHBhdGgpO3JldHVybiBvYmplY3Q9PW51bGx8fGRlbGV0ZSBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldfWZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LHBhdGgsdXBkYXRlcixjdXN0b21pemVyKXtyZXR1cm4gYmFzZVNldChvYmplY3QscGF0aCx1cGRhdGVyKGJhc2VHZXQob2JqZWN0LHBhdGgpKSxjdXN0b21pemVyKX1mdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXkscHJlZGljYXRlLGlzRHJvcCxmcm9tUmlnaHQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTE7d2hpbGUoKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKSYmcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpO3JldHVybiBpc0Ryb3A/YmFzZVNsaWNlKGFycmF5LApmcm9tUmlnaHQ/MDppbmRleCxmcm9tUmlnaHQ/aW5kZXgrMTpsZW5ndGgpOmJhc2VTbGljZShhcnJheSxmcm9tUmlnaHQ/aW5kZXgrMTowLGZyb21SaWdodD9sZW5ndGg6aW5kZXgpfWZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsYWN0aW9ucyl7dmFyIHJlc3VsdD12YWx1ZTtpZihyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcilyZXN1bHQ9cmVzdWx0LnZhbHVlKCk7cmV0dXJuIGFycmF5UmVkdWNlKGFjdGlvbnMsZnVuY3Rpb24ocmVzdWx0LGFjdGlvbil7cmV0dXJuIGFjdGlvbi5mdW5jLmFwcGx5KGFjdGlvbi50aGlzQXJnLGFycmF5UHVzaChbcmVzdWx0XSxhY3Rpb24uYXJncykpfSxyZXN1bHQpfWZ1bmN0aW9uIGJhc2VYb3IoYXJyYXlzLGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBsZW5ndGg9YXJyYXlzLmxlbmd0aDtpZihsZW5ndGg8MilyZXR1cm4gbGVuZ3RoP2Jhc2VVbmlxKGFycmF5c1swXSk6W107dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShsZW5ndGgpOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGFycmF5PWFycmF5c1tpbmRleF0sb3RoSW5kZXg9LTE7d2hpbGUoKytvdGhJbmRleDxsZW5ndGgpaWYob3RoSW5kZXghPWluZGV4KXJlc3VsdFtpbmRleF09YmFzZURpZmZlcmVuY2UocmVzdWx0W2luZGV4XXx8YXJyYXksYXJyYXlzW290aEluZGV4XSxpdGVyYXRlZSxjb21wYXJhdG9yKX1yZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4ocmVzdWx0LDEpLGl0ZXJhdGVlLGNvbXBhcmF0b3IpfWZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsdmFsdWVzLGFzc2lnbkZ1bmMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cHJvcHMubGVuZ3RoLHZhbHNMZW5ndGg9dmFsdWVzLmxlbmd0aCxyZXN1bHQ9e307d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1pbmRleDx2YWxzTGVuZ3RoP3ZhbHVlc1tpbmRleF06dW5kZWZpbmVkO2Fzc2lnbkZ1bmMocmVzdWx0LHByb3BzW2luZGV4XSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpPwp2YWx1ZTpbXX1mdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJmdW5jdGlvbiI/dmFsdWU6aWRlbnRpdHl9ZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsb2JqZWN0KXtpZihpc0FycmF5KHZhbHVlKSlyZXR1cm4gdmFsdWU7cmV0dXJuIGlzS2V5KHZhbHVlLG9iamVjdCk/W3ZhbHVlXTpzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKX12YXIgY2FzdFJlc3Q9YmFzZVJlc3Q7ZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LHN0YXJ0LGVuZCl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6ZW5kO3JldHVybiFzdGFydCYmZW5kPj1sZW5ndGg/YXJyYXk6YmFzZVNsaWNlKGFycmF5LHN0YXJ0LGVuZCl9dmFyIGNsZWFyVGltZW91dD1jdHhDbGVhclRpbWVvdXR8fGZ1bmN0aW9uKGlkKXtyZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpfTtmdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsaXNEZWVwKXtpZihpc0RlZXApcmV0dXJuIGJ1ZmZlci5zbGljZSgpOwp2YXIgbGVuZ3RoPWJ1ZmZlci5sZW5ndGgscmVzdWx0PWFsbG9jVW5zYWZlP2FsbG9jVW5zYWZlKGxlbmd0aCk6bmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO2J1ZmZlci5jb3B5KHJlc3VsdCk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKXt2YXIgcmVzdWx0PW5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTsobmV3IFVpbnQ4QXJyYXkocmVzdWx0KSkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpOmRhdGFWaWV3LmJ1ZmZlcjtyZXR1cm4gbmV3IGRhdGFWaWV3LmNvbnN0cnVjdG9yKGJ1ZmZlcixkYXRhVmlldy5ieXRlT2Zmc2V0LGRhdGFWaWV3LmJ5dGVMZW5ndGgpfWZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCl7dmFyIHJlc3VsdD0KbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLHJlRmxhZ3MuZXhlYyhyZWdleHApKTtyZXN1bHQubGFzdEluZGV4PXJlZ2V4cC5sYXN0SW5kZXg7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpe3JldHVybiBzeW1ib2xWYWx1ZU9mP09iamVjdChzeW1ib2xWYWx1ZU9mLmNhbGwoc3ltYm9sKSk6e319ZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksaXNEZWVwKXt2YXIgYnVmZmVyPWlzRGVlcD9jbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKTp0eXBlZEFycmF5LmJ1ZmZlcjtyZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLHR5cGVkQXJyYXkuYnl0ZU9mZnNldCx0eXBlZEFycmF5Lmxlbmd0aCl9ZnVuY3Rpb24gY29tcGFyZUFzY2VuZGluZyh2YWx1ZSxvdGhlcil7aWYodmFsdWUhPT1vdGhlcil7dmFyIHZhbElzRGVmaW5lZD12YWx1ZSE9PXVuZGVmaW5lZCx2YWxJc051bGw9dmFsdWU9PT0KbnVsbCx2YWxJc1JlZmxleGl2ZT12YWx1ZT09PXZhbHVlLHZhbElzU3ltYm9sPWlzU3ltYm9sKHZhbHVlKTt2YXIgb3RoSXNEZWZpbmVkPW90aGVyIT09dW5kZWZpbmVkLG90aElzTnVsbD1vdGhlcj09PW51bGwsb3RoSXNSZWZsZXhpdmU9b3RoZXI9PT1vdGhlcixvdGhJc1N5bWJvbD1pc1N5bWJvbChvdGhlcik7aWYoIW90aElzTnVsbCYmIW90aElzU3ltYm9sJiYhdmFsSXNTeW1ib2wmJnZhbHVlPm90aGVyfHx2YWxJc1N5bWJvbCYmb3RoSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZSYmIW90aElzTnVsbCYmIW90aElzU3ltYm9sfHx2YWxJc051bGwmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmV8fCF2YWxJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNSZWZsZXhpdmUpcmV0dXJuIDE7aWYoIXZhbElzTnVsbCYmIXZhbElzU3ltYm9sJiYhb3RoSXNTeW1ib2wmJnZhbHVlPG90aGVyfHxvdGhJc1N5bWJvbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZSYmIXZhbElzTnVsbCYmCiF2YWxJc1N5bWJvbHx8b3RoSXNOdWxsJiZ2YWxJc0RlZmluZWQmJnZhbElzUmVmbGV4aXZlfHwhb3RoSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzUmVmbGV4aXZlKXJldHVybi0xfXJldHVybiAwfWZ1bmN0aW9uIGNvbXBhcmVNdWx0aXBsZShvYmplY3Qsb3RoZXIsb3JkZXJzKXt2YXIgaW5kZXg9LTEsb2JqQ3JpdGVyaWE9b2JqZWN0LmNyaXRlcmlhLG90aENyaXRlcmlhPW90aGVyLmNyaXRlcmlhLGxlbmd0aD1vYmpDcml0ZXJpYS5sZW5ndGgsb3JkZXJzTGVuZ3RoPW9yZGVycy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciByZXN1bHQ9Y29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sb3RoQ3JpdGVyaWFbaW5kZXhdKTtpZihyZXN1bHQpe2lmKGluZGV4Pj1vcmRlcnNMZW5ndGgpcmV0dXJuIHJlc3VsdDt2YXIgb3JkZXI9b3JkZXJzW2luZGV4XTtyZXR1cm4gcmVzdWx0KihvcmRlcj09ImRlc2MiPy0xOjEpfX1yZXR1cm4gb2JqZWN0LmluZGV4LQpvdGhlci5pbmRleH1mdW5jdGlvbiBjb21wb3NlQXJncyhhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0xlbmd0aD1ob2xkZXJzLmxlbmd0aCxsZWZ0SW5kZXg9LTEsbGVmdExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkobGVmdExlbmd0aCtyYW5nZUxlbmd0aCksaXNVbmN1cnJpZWQ9IWlzQ3VycmllZDt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKXJlc3VsdFtsZWZ0SW5kZXhdPXBhcnRpYWxzW2xlZnRJbmRleF07d2hpbGUoKythcmdzSW5kZXg8aG9sZGVyc0xlbmd0aClpZihpc1VuY3VycmllZHx8YXJnc0luZGV4PGFyZ3NMZW5ndGgpcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV09YXJnc1thcmdzSW5kZXhdO3doaWxlKHJhbmdlTGVuZ3RoLS0pcmVzdWx0W2xlZnRJbmRleCsrXT0KYXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpe3ZhciBhcmdzSW5kZXg9LTEsYXJnc0xlbmd0aD1hcmdzLmxlbmd0aCxob2xkZXJzSW5kZXg9LTEsaG9sZGVyc0xlbmd0aD1ob2xkZXJzLmxlbmd0aCxyaWdodEluZGV4PS0xLHJpZ2h0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxyYW5nZUxlbmd0aD1uYXRpdmVNYXgoYXJnc0xlbmd0aC1ob2xkZXJzTGVuZ3RoLDApLHJlc3VsdD1BcnJheShyYW5nZUxlbmd0aCtyaWdodExlbmd0aCksaXNVbmN1cnJpZWQ9IWlzQ3VycmllZDt3aGlsZSgrK2FyZ3NJbmRleDxyYW5nZUxlbmd0aClyZXN1bHRbYXJnc0luZGV4XT1hcmdzW2FyZ3NJbmRleF07dmFyIG9mZnNldD1hcmdzSW5kZXg7d2hpbGUoKytyaWdodEluZGV4PHJpZ2h0TGVuZ3RoKXJlc3VsdFtvZmZzZXQrcmlnaHRJbmRleF09cGFydGlhbHNbcmlnaHRJbmRleF07d2hpbGUoKytob2xkZXJzSW5kZXg8CmhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtvZmZzZXQraG9sZGVyc1tob2xkZXJzSW5kZXhdXT1hcmdzW2FyZ3NJbmRleCsrXTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsYXJyYXkpe3ZhciBpbmRleD0tMSxsZW5ndGg9c291cmNlLmxlbmd0aDthcnJheXx8KGFycmF5PUFycmF5KGxlbmd0aCkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1zb3VyY2VbaW5kZXhdO3JldHVybiBhcnJheX1mdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSxwcm9wcyxvYmplY3QsY3VzdG9taXplcil7dmFyIGlzTmV3PSFvYmplY3Q7b2JqZWN0fHwob2JqZWN0PXt9KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT1wcm9wc1tpbmRleF07dmFyIG5ld1ZhbHVlPWN1c3RvbWl6ZXI/Y3VzdG9taXplcihvYmplY3Rba2V5XSxzb3VyY2Vba2V5XSwKa2V5LG9iamVjdCxzb3VyY2UpOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zb3VyY2Vba2V5XTtpZihpc05ldyliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSk7ZWxzZSBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LG5ld1ZhbHVlKX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSxvYmplY3Qpe3JldHVybiBjb3B5T2JqZWN0KHNvdXJjZSxnZXRTeW1ib2xzKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSxvYmplY3Qpe3JldHVybiBjb3B5T2JqZWN0KHNvdXJjZSxnZXRTeW1ib2xzSW4oc291cmNlKSxvYmplY3QpfWZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0b3Ioc2V0dGVyLGluaXRpYWxpemVyKXtyZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUFnZ3JlZ2F0b3I6YmFzZUFnZ3JlZ2F0b3IsYWNjdW11bGF0b3I9CmluaXRpYWxpemVyP2luaXRpYWxpemVyKCk6e307cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixzZXR0ZXIsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYWNjdW11bGF0b3IpfX1mdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcil7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZXMubGVuZ3RoLGN1c3RvbWl6ZXI9bGVuZ3RoPjE/c291cmNlc1tsZW5ndGgtMV06dW5kZWZpbmVkLGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06dW5kZWZpbmVkO2N1c3RvbWl6ZXI9YXNzaWduZXIubGVuZ3RoPjMmJnR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iPyhsZW5ndGgtLSxjdXN0b21pemVyKTp1bmRlZmluZWQ7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sc291cmNlc1sxXSxndWFyZCkpe2N1c3RvbWl6ZXI9bGVuZ3RoPDM/dW5kZWZpbmVkOmN1c3RvbWl6ZXI7bGVuZ3RoPTF9b2JqZWN0PU9iamVjdChvYmplY3QpOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTtpZihzb3VyY2UpYXNzaWduZXIob2JqZWN0LHNvdXJjZSxpbmRleCxjdXN0b21pemVyKX1yZXR1cm4gb2JqZWN0fSl9ZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsZnJvbVJpZ2h0KXtyZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZSl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gY29sbGVjdGlvbjtpZighaXNBcnJheUxpa2UoY29sbGVjdGlvbikpcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24saXRlcmF0ZWUpO3ZhciBsZW5ndGg9Y29sbGVjdGlvbi5sZW5ndGgsaW5kZXg9ZnJvbVJpZ2h0P2xlbmd0aDotMSxpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7d2hpbGUoZnJvbVJpZ2h0P2luZGV4LS06KytpbmRleDxsZW5ndGgpaWYoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLGluZGV4LGl0ZXJhYmxlKT09PWZhbHNlKWJyZWFrO3JldHVybiBjb2xsZWN0aW9ufX1mdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwKaXRlcmF0ZWUsa2V5c0Z1bmMpe3ZhciBpbmRleD0tMSxpdGVyYWJsZT1PYmplY3Qob2JqZWN0KSxwcm9wcz1rZXlzRnVuYyhvYmplY3QpLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbZnJvbVJpZ2h0P2xlbmd0aDorK2luZGV4XTtpZihpdGVyYXRlZShpdGVyYWJsZVtrZXldLGtleSxpdGVyYWJsZSk9PT1mYWxzZSlicmVha31yZXR1cm4gb2JqZWN0fX1mdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsYml0bWFzayx0aGlzQXJnKXt2YXIgaXNCaW5kPWJpdG1hc2smV1JBUF9CSU5EX0ZMQUcsQ3Rvcj1jcmVhdGVDdG9yKGZ1bmMpO2Z1bmN0aW9uIHdyYXBwZXIoKXt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gZm4uYXBwbHkoaXNCaW5kP3RoaXNBcmc6dGhpcyxhcmd1bWVudHMpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKXtyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7dmFyIHN0clN5bWJvbHM9aGFzVW5pY29kZShzdHJpbmcpP3N0cmluZ1RvQXJyYXkoc3RyaW5nKTp1bmRlZmluZWQ7dmFyIGNocj1zdHJTeW1ib2xzP3N0clN5bWJvbHNbMF06c3RyaW5nLmNoYXJBdCgwKTt2YXIgdHJhaWxpbmc9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywxKS5qb2luKCIiKTpzdHJpbmcuc2xpY2UoMSk7cmV0dXJuIGNoclttZXRob2ROYW1lXSgpK3RyYWlsaW5nfX1mdW5jdGlvbiBjcmVhdGVDb21wb3VuZGVyKGNhbGxiYWNrKXtyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKXtyZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsIiIpKSxjYWxsYmFjaywiIil9fWZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgQ3RvcjtjYXNlIDE6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0pOwpjYXNlIDI6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSk7Y2FzZSA0OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdKTtjYXNlIDU6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSk7Y2FzZSA2OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSk7Y2FzZSA3OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdKX12YXIgdGhpc0JpbmRpbmc9YmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSkscmVzdWx0PUN0b3IuYXBwbHkodGhpc0JpbmRpbmcsYXJncyk7cmV0dXJuIGlzT2JqZWN0KHJlc3VsdCk/cmVzdWx0OnRoaXNCaW5kaW5nfX1mdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLApiaXRtYXNrLGFyaXR5KXt2YXIgQ3Rvcj1jcmVhdGVDdG9yKGZ1bmMpO2Z1bmN0aW9uIHdyYXBwZXIoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShsZW5ndGgpLGluZGV4PWxlbmd0aCxwbGFjZWhvbGRlcj1nZXRIb2xkZXIod3JhcHBlcik7d2hpbGUoaW5kZXgtLSlhcmdzW2luZGV4XT1hcmd1bWVudHNbaW5kZXhdO3ZhciBob2xkZXJzPWxlbmd0aDwzJiZhcmdzWzBdIT09cGxhY2Vob2xkZXImJmFyZ3NbbGVuZ3RoLTFdIT09cGxhY2Vob2xkZXI/W106cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7bGVuZ3RoLT1ob2xkZXJzLmxlbmd0aDtpZihsZW5ndGg8YXJpdHkpcmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHVuZGVmaW5lZCxhcmdzLGhvbGRlcnMsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eS1sZW5ndGgpO3ZhciBmbj10aGlzJiZ0aGlzIT09cm9vdCYmdGhpcyBpbnN0YW5jZW9mCndyYXBwZXI/Q3RvcjpmdW5jO3JldHVybiBhcHBseShmbix0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZUZpbmQoZmluZEluZGV4RnVuYyl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24scHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGl0ZXJhYmxlPU9iamVjdChjb2xsZWN0aW9uKTtpZighaXNBcnJheUxpa2UoY29sbGVjdGlvbikpe3ZhciBpdGVyYXRlZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUsMyk7Y29sbGVjdGlvbj1rZXlzKGNvbGxlY3Rpb24pO3ByZWRpY2F0ZT1mdW5jdGlvbihrZXkpe3JldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLGtleSxpdGVyYWJsZSl9fXZhciBpbmRleD1maW5kSW5kZXhGdW5jKGNvbGxlY3Rpb24scHJlZGljYXRlLGZyb21JbmRleCk7cmV0dXJuIGluZGV4Pi0xP2l0ZXJhYmxlW2l0ZXJhdGVlP2NvbGxlY3Rpb25baW5kZXhdOmluZGV4XTp1bmRlZmluZWR9fWZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3Mpe3ZhciBsZW5ndGg9CmZ1bmNzLmxlbmd0aCxpbmRleD1sZW5ndGgscHJlcmVxPUxvZGFzaFdyYXBwZXIucHJvdG90eXBlLnRocnU7aWYoZnJvbVJpZ2h0KWZ1bmNzLnJldmVyc2UoKTt3aGlsZShpbmRleC0tKXt2YXIgZnVuYz1mdW5jc1tpbmRleF07aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKHByZXJlcSYmIXdyYXBwZXImJmdldEZ1bmNOYW1lKGZ1bmMpPT0id3JhcHBlciIpdmFyIHdyYXBwZXI9bmV3IExvZGFzaFdyYXBwZXIoW10sdHJ1ZSl9aW5kZXg9d3JhcHBlcj9pbmRleDpsZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe2Z1bmM9ZnVuY3NbaW5kZXhdO3ZhciBmdW5jTmFtZT1nZXRGdW5jTmFtZShmdW5jKSxkYXRhPWZ1bmNOYW1lPT0id3JhcHBlciI/Z2V0RGF0YShmdW5jKTp1bmRlZmluZWQ7aWYoZGF0YSYmaXNMYXppYWJsZShkYXRhWzBdKSYmZGF0YVsxXT09KFdSQVBfQVJZX0ZMQUd8V1JBUF9DVVJSWV9GTEFHfFdSQVBfUEFSVElBTF9GTEFHfApXUkFQX1JFQVJHX0ZMQUcpJiYhZGF0YVs0XS5sZW5ndGgmJmRhdGFbOV09PTEpd3JhcHBlcj13cmFwcGVyW2dldEZ1bmNOYW1lKGRhdGFbMF0pXS5hcHBseSh3cmFwcGVyLGRhdGFbM10pO2Vsc2Ugd3JhcHBlcj1mdW5jLmxlbmd0aD09MSYmaXNMYXppYWJsZShmdW5jKT93cmFwcGVyW2Z1bmNOYW1lXSgpOndyYXBwZXIudGhydShmdW5jKX1yZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsdmFsdWU9YXJnc1swXTtpZih3cmFwcGVyJiZhcmdzLmxlbmd0aD09MSYmaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHdyYXBwZXIucGxhbnQodmFsdWUpLnZhbHVlKCk7dmFyIGluZGV4PTAscmVzdWx0PWxlbmd0aD9mdW5jc1tpbmRleF0uYXBwbHkodGhpcyxhcmdzKTp2YWx1ZTt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHQ9ZnVuY3NbaW5kZXhdLmNhbGwodGhpcyxyZXN1bHQpO3JldHVybiByZXN1bHR9fSl9ZnVuY3Rpb24gY3JlYXRlSHlicmlkKGZ1bmMsYml0bWFzayx0aGlzQXJnLApwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHkpe3ZhciBpc0FyeT1iaXRtYXNrJldSQVBfQVJZX0ZMQUcsaXNCaW5kPWJpdG1hc2smV1JBUF9CSU5EX0ZMQUcsaXNCaW5kS2V5PWJpdG1hc2smV1JBUF9CSU5EX0tFWV9GTEFHLGlzQ3VycmllZD1iaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSxpc0ZsaXA9Yml0bWFzayZXUkFQX0ZMSVBfRkxBRyxDdG9yPWlzQmluZEtleT91bmRlZmluZWQ6Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGg7d2hpbGUoaW5kZXgtLSlhcmdzW2luZGV4XT1hcmd1bWVudHNbaW5kZXhdO2lmKGlzQ3VycmllZCl2YXIgcGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpLGhvbGRlcnNDb3VudD1jb3VudEhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7CmlmKHBhcnRpYWxzKWFyZ3M9Y29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCk7aWYocGFydGlhbHNSaWdodClhcmdzPWNvbXBvc2VBcmdzUmlnaHQoYXJncyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxpc0N1cnJpZWQpO2xlbmd0aC09aG9sZGVyc0NvdW50O2lmKGlzQ3VycmllZCYmbGVuZ3RoPGFyaXR5KXt2YXIgbmV3SG9sZGVycz1yZXBsYWNlSG9sZGVycyhhcmdzLHBsYWNlaG9sZGVyKTtyZXR1cm4gY3JlYXRlUmVjdXJyeShmdW5jLGJpdG1hc2ssY3JlYXRlSHlicmlkLHdyYXBwZXIucGxhY2Vob2xkZXIsdGhpc0FyZyxhcmdzLG5ld0hvbGRlcnMsYXJnUG9zLGFyeSxhcml0eS1sZW5ndGgpfXZhciB0aGlzQmluZGluZz1pc0JpbmQ/dGhpc0FyZzp0aGlzLGZuPWlzQmluZEtleT90aGlzQmluZGluZ1tmdW5jXTpmdW5jO2xlbmd0aD1hcmdzLmxlbmd0aDtpZihhcmdQb3MpYXJncz1yZW9yZGVyKGFyZ3MsYXJnUG9zKTtlbHNlIGlmKGlzRmxpcCYmbGVuZ3RoPgoxKWFyZ3MucmV2ZXJzZSgpO2lmKGlzQXJ5JiZhcnk8bGVuZ3RoKWFyZ3MubGVuZ3RoPWFyeTtpZih0aGlzJiZ0aGlzIT09cm9vdCYmdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpZm49Q3Rvcnx8Y3JlYXRlQ3Rvcihmbik7cmV0dXJuIGZuLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZUludmVydGVyKHNldHRlcix0b0l0ZXJhdGVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gYmFzZUludmVydGVyKG9iamVjdCxzZXR0ZXIsdG9JdGVyYXRlZShpdGVyYXRlZSkse30pfX1mdW5jdGlvbiBjcmVhdGVNYXRoT3BlcmF0aW9uKG9wZXJhdG9yLGRlZmF1bHRWYWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXt2YXIgcmVzdWx0O2lmKHZhbHVlPT09dW5kZWZpbmVkJiZvdGhlcj09PXVuZGVmaW5lZClyZXR1cm4gZGVmYXVsdFZhbHVlO2lmKHZhbHVlIT09dW5kZWZpbmVkKXJlc3VsdD12YWx1ZTtpZihvdGhlciE9PQp1bmRlZmluZWQpe2lmKHJlc3VsdD09PXVuZGVmaW5lZClyZXR1cm4gb3RoZXI7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8dHlwZW9mIG90aGVyPT0ic3RyaW5nIil7dmFsdWU9YmFzZVRvU3RyaW5nKHZhbHVlKTtvdGhlcj1iYXNlVG9TdHJpbmcob3RoZXIpfWVsc2V7dmFsdWU9YmFzZVRvTnVtYmVyKHZhbHVlKTtvdGhlcj1iYXNlVG9OdW1iZXIob3RoZXIpfXJlc3VsdD1vcGVyYXRvcih2YWx1ZSxvdGhlcil9cmV0dXJuIHJlc3VsdH19ZnVuY3Rpb24gY3JlYXRlT3ZlcihhcnJheUZ1bmMpe3JldHVybiBmbGF0UmVzdChmdW5jdGlvbihpdGVyYXRlZXMpe2l0ZXJhdGVlcz1hcnJheU1hcChpdGVyYXRlZXMsYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtyZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncyl7dmFyIHRoaXNBcmc9dGhpcztyZXR1cm4gYXJyYXlGdW5jKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGFwcGx5KGl0ZXJhdGVlLHRoaXNBcmcsYXJncyl9KX0pfSl9CmZ1bmN0aW9uIGNyZWF0ZVBhZGRpbmcobGVuZ3RoLGNoYXJzKXtjaGFycz1jaGFycz09PXVuZGVmaW5lZD8iICI6YmFzZVRvU3RyaW5nKGNoYXJzKTt2YXIgY2hhcnNMZW5ndGg9Y2hhcnMubGVuZ3RoO2lmKGNoYXJzTGVuZ3RoPDIpcmV0dXJuIGNoYXJzTGVuZ3RoP2Jhc2VSZXBlYXQoY2hhcnMsbGVuZ3RoKTpjaGFyczt2YXIgcmVzdWx0PWJhc2VSZXBlYXQoY2hhcnMsbmF0aXZlQ2VpbChsZW5ndGgvc3RyaW5nU2l6ZShjaGFycykpKTtyZXR1cm4gaGFzVW5pY29kZShjaGFycyk/Y2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkocmVzdWx0KSwwLGxlbmd0aCkuam9pbigiIik6cmVzdWx0LnNsaWNlKDAsbGVuZ3RoKX1mdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgaXNCaW5kPWJpdG1hc2smV1JBUF9CSU5EX0ZMQUcsQ3Rvcj1jcmVhdGVDdG9yKGZ1bmMpO2Z1bmN0aW9uIHdyYXBwZXIoKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9CmFyZ3VtZW50cy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVmdExlbmd0aCthcmdzTGVuZ3RoKSxmbj10aGlzJiZ0aGlzIT09cm9vdCYmdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXI/Q3RvcjpmdW5jO3doaWxlKCsrbGVmdEluZGV4PGxlZnRMZW5ndGgpYXJnc1tsZWZ0SW5kZXhdPXBhcnRpYWxzW2xlZnRJbmRleF07d2hpbGUoYXJnc0xlbmd0aC0tKWFyZ3NbbGVmdEluZGV4KytdPWFyZ3VtZW50c1srK2FyZ3NJbmRleF07cmV0dXJuIGFwcGx5KGZuLGlzQmluZD90aGlzQXJnOnRoaXMsYXJncyl9cmV0dXJuIHdyYXBwZXJ9ZnVuY3Rpb24gY3JlYXRlUmFuZ2UoZnJvbVJpZ2h0KXtyZXR1cm4gZnVuY3Rpb24oc3RhcnQsZW5kLHN0ZXApe2lmKHN0ZXAmJnR5cGVvZiBzdGVwIT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoc3RhcnQsZW5kLHN0ZXApKWVuZD1zdGVwPXVuZGVmaW5lZDtzdGFydD10b0Zpbml0ZShzdGFydCk7aWYoZW5kPT09CnVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtzdGVwPXN0ZXA9PT11bmRlZmluZWQ/c3RhcnQ8ZW5kPzE6LTE6dG9GaW5pdGUoc3RlcCk7cmV0dXJuIGJhc2VSYW5nZShzdGFydCxlbmQsc3RlcCxmcm9tUmlnaHQpfX1mdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUsb3RoZXIpe2lmKCEodHlwZW9mIHZhbHVlPT0ic3RyaW5nIiYmdHlwZW9mIG90aGVyPT0ic3RyaW5nIikpe3ZhbHVlPXRvTnVtYmVyKHZhbHVlKTtvdGhlcj10b051bWJlcihvdGhlcil9cmV0dXJuIG9wZXJhdG9yKHZhbHVlLG90aGVyKX19ZnVuY3Rpb24gY3JlYXRlUmVjdXJyeShmdW5jLGJpdG1hc2ssd3JhcEZ1bmMscGxhY2Vob2xkZXIsdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLGFyZ1BvcyxhcnksYXJpdHkpe3ZhciBpc0N1cnJ5PWJpdG1hc2smV1JBUF9DVVJSWV9GTEFHLG5ld0hvbGRlcnM9aXNDdXJyeT8KaG9sZGVyczp1bmRlZmluZWQsbmV3SG9sZGVyc1JpZ2h0PWlzQ3Vycnk/dW5kZWZpbmVkOmhvbGRlcnMsbmV3UGFydGlhbHM9aXNDdXJyeT9wYXJ0aWFsczp1bmRlZmluZWQsbmV3UGFydGlhbHNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpwYXJ0aWFscztiaXRtYXNrfD1pc0N1cnJ5P1dSQVBfUEFSVElBTF9GTEFHOldSQVBfUEFSVElBTF9SSUdIVF9GTEFHO2JpdG1hc2smPX4oaXNDdXJyeT9XUkFQX1BBUlRJQUxfUklHSFRfRkxBRzpXUkFQX1BBUlRJQUxfRkxBRyk7aWYoIShiaXRtYXNrJldSQVBfQ1VSUllfQk9VTkRfRkxBRykpYml0bWFzayY9fihXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUcpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxuZXdQYXJ0aWFscyxuZXdIb2xkZXJzLG5ld1BhcnRpYWxzUmlnaHQsbmV3SG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO3ZhciByZXN1bHQ9d3JhcEZ1bmMuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO2lmKGlzTGF6aWFibGUoZnVuYykpc2V0RGF0YShyZXN1bHQsCm5ld0RhdGEpO3Jlc3VsdC5wbGFjZWhvbGRlcj1wbGFjZWhvbGRlcjtyZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHJlc3VsdCxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpe3ZhciBmdW5jPU1hdGhbbWV0aG9kTmFtZV07cmV0dXJuIGZ1bmN0aW9uKG51bWJlcixwcmVjaXNpb24pe251bWJlcj10b051bWJlcihudW1iZXIpO3ByZWNpc2lvbj1wcmVjaXNpb249PW51bGw/MDpuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksMjkyKTtpZihwcmVjaXNpb24pe3ZhciBwYWlyPSh0b1N0cmluZyhudW1iZXIpKyJlIikuc3BsaXQoImUiKSx2YWx1ZT1mdW5jKHBhaXJbMF0rImUiKygrcGFpclsxXStwcmVjaXNpb24pKTtwYWlyPSh0b1N0cmluZyh2YWx1ZSkrImUiKS5zcGxpdCgiZSIpO3JldHVybisocGFpclswXSsiZSIrKCtwYWlyWzFdLXByZWNpc2lvbikpfXJldHVybiBmdW5jKG51bWJlcil9fXZhciBjcmVhdGVTZXQ9IShTZXQmJjEvc2V0VG9BcnJheShuZXcgU2V0KFssCi0wXSkpWzFdPT1JTkZJTklUWSk/bm9vcDpmdW5jdGlvbih2YWx1ZXMpe3JldHVybiBuZXcgU2V0KHZhbHVlcyl9O2Z1bmN0aW9uIGNyZWF0ZVRvUGFpcnMoa2V5c0Z1bmMpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciB0YWc9Z2V0VGFnKG9iamVjdCk7aWYodGFnPT1tYXBUYWcpcmV0dXJuIG1hcFRvQXJyYXkob2JqZWN0KTtpZih0YWc9PXNldFRhZylyZXR1cm4gc2V0VG9QYWlycyhvYmplY3QpO3JldHVybiBiYXNlVG9QYWlycyhvYmplY3Qsa2V5c0Z1bmMob2JqZWN0KSl9fWZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNCaW5kS2V5PWJpdG1hc2smV1JBUF9CSU5EX0tFWV9GTEFHO2lmKCFpc0JpbmRLZXkmJnR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbGVuZ3RoPXBhcnRpYWxzP3BhcnRpYWxzLmxlbmd0aDoKMDtpZighbGVuZ3RoKXtiaXRtYXNrJj1+KFdSQVBfUEFSVElBTF9GTEFHfFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtwYXJ0aWFscz1ob2xkZXJzPXVuZGVmaW5lZH1hcnk9YXJ5PT09dW5kZWZpbmVkP2FyeTpuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksMCk7YXJpdHk9YXJpdHk9PT11bmRlZmluZWQ/YXJpdHk6dG9JbnRlZ2VyKGFyaXR5KTtsZW5ndGgtPWhvbGRlcnM/aG9sZGVycy5sZW5ndGg6MDtpZihiaXRtYXNrJldSQVBfUEFSVElBTF9SSUdIVF9GTEFHKXt2YXIgcGFydGlhbHNSaWdodD1wYXJ0aWFscyxob2xkZXJzUmlnaHQ9aG9sZGVycztwYXJ0aWFscz1ob2xkZXJzPXVuZGVmaW5lZH12YXIgZGF0YT1pc0JpbmRLZXk/dW5kZWZpbmVkOmdldERhdGEoZnVuYyk7dmFyIG5ld0RhdGE9W2Z1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsYXJnUG9zLGFyeSxhcml0eV07aWYoZGF0YSltZXJnZURhdGEobmV3RGF0YSwKZGF0YSk7ZnVuYz1uZXdEYXRhWzBdO2JpdG1hc2s9bmV3RGF0YVsxXTt0aGlzQXJnPW5ld0RhdGFbMl07cGFydGlhbHM9bmV3RGF0YVszXTtob2xkZXJzPW5ld0RhdGFbNF07YXJpdHk9bmV3RGF0YVs5XT1uZXdEYXRhWzldPT09dW5kZWZpbmVkP2lzQmluZEtleT8wOmZ1bmMubGVuZ3RoOm5hdGl2ZU1heChuZXdEYXRhWzldLWxlbmd0aCwwKTtpZighYXJpdHkmJmJpdG1hc2smKFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7aWYoIWJpdG1hc2t8fGJpdG1hc2s9PVdSQVBfQklORF9GTEFHKXZhciByZXN1bHQ9Y3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyk7ZWxzZSBpZihiaXRtYXNrPT1XUkFQX0NVUlJZX0ZMQUd8fGJpdG1hc2s9PVdSQVBfQ1VSUllfUklHSFRfRkxBRylyZXN1bHQ9Y3JlYXRlQ3VycnkoZnVuYyxiaXRtYXNrLGFyaXR5KTtlbHNlIGlmKChiaXRtYXNrPT0KV1JBUF9QQVJUSUFMX0ZMQUd8fGJpdG1hc2s9PShXUkFQX0JJTkRfRkxBR3xXUkFQX1BBUlRJQUxfRkxBRykpJiYhaG9sZGVycy5sZW5ndGgpcmVzdWx0PWNyZWF0ZVBhcnRpYWwoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMpO2Vsc2UgcmVzdWx0PWNyZWF0ZUh5YnJpZC5hcHBseSh1bmRlZmluZWQsbmV3RGF0YSk7dmFyIHNldHRlcj1kYXRhP2Jhc2VTZXREYXRhOnNldERhdGE7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhzZXR0ZXIocmVzdWx0LG5ld0RhdGEpLGZ1bmMsYml0bWFzayl9ZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSxzcmNWYWx1ZSxrZXksb2JqZWN0KXtpZihvYmpWYWx1ZT09PXVuZGVmaW5lZHx8ZXEob2JqVmFsdWUsb2JqZWN0UHJvdG9ba2V5XSkmJiFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKXJldHVybiBzcmNWYWx1ZTtyZXR1cm4gb2JqVmFsdWV9ZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNNZXJnZShvYmpWYWx1ZSxzcmNWYWx1ZSwKa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spe2lmKGlzT2JqZWN0KG9ialZhbHVlKSYmaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFjay5zZXQoc3JjVmFsdWUsb2JqVmFsdWUpO2Jhc2VNZXJnZShvYmpWYWx1ZSxzcmNWYWx1ZSx1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSxzdGFjayk7c3RhY2tbImRlbGV0ZSJdKHNyY1ZhbHVlKX1yZXR1cm4gb2JqVmFsdWV9ZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKXtyZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSk/dW5kZWZpbmVkOnZhbHVlfWZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9Yml0bWFzayZDT01QQVJFX1BBUlRJQUxfRkxBRyxhcnJMZW5ndGg9YXJyYXkubGVuZ3RoLG90aExlbmd0aD1vdGhlci5sZW5ndGg7aWYoYXJyTGVuZ3RoIT1vdGhMZW5ndGgmJiEoaXNQYXJ0aWFsJiZvdGhMZW5ndGg+YXJyTGVuZ3RoKSlyZXR1cm4gZmFsc2U7CnZhciBzdGFja2VkPXN0YWNrLmdldChhcnJheSk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIGluZGV4PS0xLHJlc3VsdD10cnVlLHNlZW49Yml0bWFzayZDT01QQVJFX1VOT1JERVJFRF9GTEFHP25ldyBTZXRDYWNoZTp1bmRlZmluZWQ7c3RhY2suc2V0KGFycmF5LG90aGVyKTtzdGFjay5zZXQob3RoZXIsYXJyYXkpO3doaWxlKCsraW5kZXg8YXJyTGVuZ3RoKXt2YXIgYXJyVmFsdWU9YXJyYXlbaW5kZXhdLG90aFZhbHVlPW90aGVyW2luZGV4XTtpZihjdXN0b21pemVyKXZhciBjb21wYXJlZD1pc1BhcnRpYWw/Y3VzdG9taXplcihvdGhWYWx1ZSxhcnJWYWx1ZSxpbmRleCxvdGhlcixhcnJheSxzdGFjayk6Y3VzdG9taXplcihhcnJWYWx1ZSxvdGhWYWx1ZSxpbmRleCxhcnJheSxvdGhlcixzdGFjayk7aWYoY29tcGFyZWQhPT11bmRlZmluZWQpe2lmKGNvbXBhcmVkKWNvbnRpbnVlO3Jlc3VsdD1mYWxzZTticmVha31pZihzZWVuKXtpZighYXJyYXlTb21lKG90aGVyLApmdW5jdGlvbihvdGhWYWx1ZSxvdGhJbmRleCl7aWYoIWNhY2hlSGFzKHNlZW4sb3RoSW5kZXgpJiYoYXJyVmFsdWU9PT1vdGhWYWx1ZXx8ZXF1YWxGdW5jKGFyclZhbHVlLG90aFZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixzdGFjaykpKXJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpfSkpe3Jlc3VsdD1mYWxzZTticmVha319ZWxzZSBpZighKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSl7cmVzdWx0PWZhbHNlO2JyZWFrfX1zdGFja1siZGVsZXRlIl0oYXJyYXkpO3N0YWNrWyJkZWxldGUiXShvdGhlcik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCxvdGhlcix0YWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7c3dpdGNoKHRhZyl7Y2FzZSBkYXRhVmlld1RhZzppZihvYmplY3QuYnl0ZUxlbmd0aCE9b3RoZXIuYnl0ZUxlbmd0aHx8b2JqZWN0LmJ5dGVPZmZzZXQhPQpvdGhlci5ieXRlT2Zmc2V0KXJldHVybiBmYWxzZTtvYmplY3Q9b2JqZWN0LmJ1ZmZlcjtvdGhlcj1vdGhlci5idWZmZXI7Y2FzZSBhcnJheUJ1ZmZlclRhZzppZihvYmplY3QuYnl0ZUxlbmd0aCE9b3RoZXIuYnl0ZUxlbmd0aHx8IWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLG5ldyBVaW50OEFycmF5KG90aGVyKSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlO2Nhc2UgYm9vbFRhZzpjYXNlIGRhdGVUYWc6Y2FzZSBudW1iZXJUYWc6cmV0dXJuIGVxKCtvYmplY3QsK290aGVyKTtjYXNlIGVycm9yVGFnOnJldHVybiBvYmplY3QubmFtZT09b3RoZXIubmFtZSYmb2JqZWN0Lm1lc3NhZ2U9PW90aGVyLm1lc3NhZ2U7Y2FzZSByZWdleHBUYWc6Y2FzZSBzdHJpbmdUYWc6cmV0dXJuIG9iamVjdD09b3RoZXIrIiI7Y2FzZSBtYXBUYWc6dmFyIGNvbnZlcnQ9bWFwVG9BcnJheTtjYXNlIHNldFRhZzp2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUc7Y29udmVydHx8Cihjb252ZXJ0PXNldFRvQXJyYXkpO2lmKG9iamVjdC5zaXplIT1vdGhlci5zaXplJiYhaXNQYXJ0aWFsKXJldHVybiBmYWxzZTt2YXIgc3RhY2tlZD1zdGFjay5nZXQob2JqZWN0KTtpZihzdGFja2VkKXJldHVybiBzdGFja2VkPT1vdGhlcjtiaXRtYXNrfD1DT01QQVJFX1VOT1JERVJFRF9GTEFHO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3ZhciByZXN1bHQ9ZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLGNvbnZlcnQob3RoZXIpLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spO3N0YWNrWyJkZWxldGUiXShvYmplY3QpO3JldHVybiByZXN1bHQ7Y2FzZSBzeW1ib2xUYWc6aWYoc3ltYm9sVmFsdWVPZilyZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCk9PXN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcil9cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIGlzUGFydGlhbD0KYml0bWFzayZDT01QQVJFX1BBUlRJQUxfRkxBRyxvYmpQcm9wcz1nZXRBbGxLZXlzKG9iamVjdCksb2JqTGVuZ3RoPW9ialByb3BzLmxlbmd0aCxvdGhQcm9wcz1nZXRBbGxLZXlzKG90aGVyKSxvdGhMZW5ndGg9b3RoUHJvcHMubGVuZ3RoO2lmKG9iakxlbmd0aCE9b3RoTGVuZ3RoJiYhaXNQYXJ0aWFsKXJldHVybiBmYWxzZTt2YXIgaW5kZXg9b2JqTGVuZ3RoO3doaWxlKGluZGV4LS0pe3ZhciBrZXk9b2JqUHJvcHNbaW5kZXhdO2lmKCEoaXNQYXJ0aWFsP2tleSBpbiBvdGhlcjpoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLGtleSkpKXJldHVybiBmYWxzZX12YXIgc3RhY2tlZD1zdGFjay5nZXQob2JqZWN0KTtpZihzdGFja2VkJiZzdGFjay5nZXQob3RoZXIpKXJldHVybiBzdGFja2VkPT1vdGhlcjt2YXIgcmVzdWx0PXRydWU7c3RhY2suc2V0KG9iamVjdCxvdGhlcik7c3RhY2suc2V0KG90aGVyLG9iamVjdCk7dmFyIHNraXBDdG9yPWlzUGFydGlhbDt3aGlsZSgrK2luZGV4PG9iakxlbmd0aCl7a2V5PQpvYmpQcm9wc1tpbmRleF07dmFyIG9ialZhbHVlPW9iamVjdFtrZXldLG90aFZhbHVlPW90aGVyW2tleV07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsb2JqVmFsdWUsa2V5LG90aGVyLG9iamVjdCxzdGFjayk6Y3VzdG9taXplcihvYmpWYWx1ZSxvdGhWYWx1ZSxrZXksb2JqZWN0LG90aGVyLHN0YWNrKTtpZighKGNvbXBhcmVkPT09dW5kZWZpbmVkP29ialZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhvYmpWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spOmNvbXBhcmVkKSl7cmVzdWx0PWZhbHNlO2JyZWFrfXNraXBDdG9yfHwoc2tpcEN0b3I9a2V5PT0iY29uc3RydWN0b3IiKX1pZihyZXN1bHQmJiFza2lwQ3Rvcil7dmFyIG9iakN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yLG90aEN0b3I9b3RoZXIuY29uc3RydWN0b3I7aWYob2JqQ3RvciE9b3RoQ3RvciYmKCJjb25zdHJ1Y3RvciJpbiBvYmplY3QmJiJjb25zdHJ1Y3RvciJpbgpvdGhlcikmJiEodHlwZW9mIG9iakN0b3I9PSJmdW5jdGlvbiImJm9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yJiZ0eXBlb2Ygb3RoQ3Rvcj09ImZ1bmN0aW9uIiYmb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKXJlc3VsdD1mYWxzZX1zdGFja1siZGVsZXRlIl0ob2JqZWN0KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZmxhdFJlc3QoZnVuYyl7cmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsdW5kZWZpbmVkLGZsYXR0ZW4pLGZ1bmMrIiIpfWZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KXtyZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LGtleXMsZ2V0U3ltYm9scyl9ZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzSW4sZ2V0U3ltYm9sc0luKX12YXIgZ2V0RGF0YT0hbWV0YU1hcD9ub29wOmZ1bmN0aW9uKGZ1bmMpe3JldHVybiBtZXRhTWFwLmdldChmdW5jKX07CmZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpe3ZhciByZXN1bHQ9ZnVuYy5uYW1lKyIiLGFycmF5PXJlYWxOYW1lc1tyZXN1bHRdLGxlbmd0aD1oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcyxyZXN1bHQpP2FycmF5Lmxlbmd0aDowO3doaWxlKGxlbmd0aC0tKXt2YXIgZGF0YT1hcnJheVtsZW5ndGhdLG90aGVyRnVuYz1kYXRhLmZ1bmM7aWYob3RoZXJGdW5jPT1udWxsfHxvdGhlckZ1bmM9PWZ1bmMpcmV0dXJuIGRhdGEubmFtZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKXt2YXIgb2JqZWN0PWhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCJwbGFjZWhvbGRlciIpP2xvZGFzaDpmdW5jO3JldHVybiBvYmplY3QucGxhY2Vob2xkZXJ9ZnVuY3Rpb24gZ2V0SXRlcmF0ZWUoKXt2YXIgcmVzdWx0PWxvZGFzaC5pdGVyYXRlZXx8aXRlcmF0ZWU7cmVzdWx0PXJlc3VsdD09PWl0ZXJhdGVlP2Jhc2VJdGVyYXRlZTpyZXN1bHQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/CnJlc3VsdChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTpyZXN1bHR9ZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsa2V5KXt2YXIgZGF0YT1tYXAuX19kYXRhX187cmV0dXJuIGlzS2V5YWJsZShrZXkpP2RhdGFbdHlwZW9mIGtleT09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTpkYXRhLm1hcH1mdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KXt2YXIgcmVzdWx0PWtleXMob2JqZWN0KSxsZW5ndGg9cmVzdWx0Lmxlbmd0aDt3aGlsZShsZW5ndGgtLSl7dmFyIGtleT1yZXN1bHRbbGVuZ3RoXSx2YWx1ZT1vYmplY3Rba2V5XTtyZXN1bHRbbGVuZ3RoXT1ba2V5LHZhbHVlLGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCxrZXkpe3ZhciB2YWx1ZT1nZXRWYWx1ZShvYmplY3Qsa2V5KTtyZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKT92YWx1ZTp1bmRlZmluZWR9ZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKXt2YXIgaXNPd249Cmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsc3ltVG9TdHJpbmdUYWcpLHRhZz12YWx1ZVtzeW1Ub1N0cmluZ1RhZ107dHJ5e3ZhbHVlW3N5bVRvU3RyaW5nVGFnXT11bmRlZmluZWQ7dmFyIHVubWFza2VkPXRydWV9Y2F0Y2goZSl7fXZhciByZXN1bHQ9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYodW5tYXNrZWQpaWYoaXNPd24pdmFsdWVbc3ltVG9TdHJpbmdUYWddPXRhZztlbHNlIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107cmV0dXJuIHJlc3VsdH12YXIgZ2V0U3ltYm9scz0hbmF0aXZlR2V0U3ltYm9scz9zdHViQXJyYXk6ZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuW107b2JqZWN0PU9iamVjdChvYmplY3QpO3JldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksZnVuY3Rpb24oc3ltYm9sKXtyZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3Qsc3ltYm9sKX0pfTt2YXIgZ2V0U3ltYm9sc0luPQohbmF0aXZlR2V0U3ltYm9scz9zdHViQXJyYXk6ZnVuY3Rpb24ob2JqZWN0KXt2YXIgcmVzdWx0PVtdO3doaWxlKG9iamVjdCl7YXJyYXlQdXNoKHJlc3VsdCxnZXRTeW1ib2xzKG9iamVjdCkpO29iamVjdD1nZXRQcm90b3R5cGUob2JqZWN0KX1yZXR1cm4gcmVzdWx0fTt2YXIgZ2V0VGFnPWJhc2VHZXRUYWc7aWYoRGF0YVZpZXcmJmdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkhPWRhdGFWaWV3VGFnfHxNYXAmJmdldFRhZyhuZXcgTWFwKSE9bWFwVGFnfHxQcm9taXNlJiZnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpIT1wcm9taXNlVGFnfHxTZXQmJmdldFRhZyhuZXcgU2V0KSE9c2V0VGFnfHxXZWFrTWFwJiZnZXRUYWcobmV3IFdlYWtNYXApIT13ZWFrTWFwVGFnKWdldFRhZz1mdW5jdGlvbih2YWx1ZSl7dmFyIHJlc3VsdD1iYXNlR2V0VGFnKHZhbHVlKSxDdG9yPXJlc3VsdD09b2JqZWN0VGFnP3ZhbHVlLmNvbnN0cnVjdG9yOnVuZGVmaW5lZCxjdG9yU3RyaW5nPQpDdG9yP3RvU291cmNlKEN0b3IpOiIiO2lmKGN0b3JTdHJpbmcpc3dpdGNoKGN0b3JTdHJpbmcpe2Nhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOnJldHVybiBkYXRhVmlld1RhZztjYXNlIG1hcEN0b3JTdHJpbmc6cmV0dXJuIG1hcFRhZztjYXNlIHByb21pc2VDdG9yU3RyaW5nOnJldHVybiBwcm9taXNlVGFnO2Nhc2Ugc2V0Q3RvclN0cmluZzpyZXR1cm4gc2V0VGFnO2Nhc2Ugd2Vha01hcEN0b3JTdHJpbmc6cmV0dXJuIHdlYWtNYXBUYWd9cmV0dXJuIHJlc3VsdH07ZnVuY3Rpb24gZ2V0VmlldyhzdGFydCxlbmQsdHJhbnNmb3Jtcyl7dmFyIGluZGV4PS0xLGxlbmd0aD10cmFuc2Zvcm1zLmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGRhdGE9dHJhbnNmb3Jtc1tpbmRleF0sc2l6ZT1kYXRhLnNpemU7c3dpdGNoKGRhdGEudHlwZSl7Y2FzZSAiZHJvcCI6c3RhcnQrPXNpemU7YnJlYWs7Y2FzZSAiZHJvcFJpZ2h0IjplbmQtPXNpemU7YnJlYWs7Y2FzZSAidGFrZSI6ZW5kPW5hdGl2ZU1pbihlbmQsCnN0YXJ0K3NpemUpO2JyZWFrO2Nhc2UgInRha2VSaWdodCI6c3RhcnQ9bmF0aXZlTWF4KHN0YXJ0LGVuZC1zaXplKTticmVha319cmV0dXJueyJzdGFydCI6c3RhcnQsImVuZCI6ZW5kfX1mdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2Upe3ZhciBtYXRjaD1zb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7cmV0dXJuIG1hdGNoP21hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKTpbXX1mdW5jdGlvbiBoYXNQYXRoKG9iamVjdCxwYXRoLGhhc0Z1bmMpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aC5sZW5ndGgscmVzdWx0PWZhbHNlO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIga2V5PXRvS2V5KHBhdGhbaW5kZXhdKTtpZighKHJlc3VsdD1vYmplY3QhPW51bGwmJmhhc0Z1bmMob2JqZWN0LGtleSkpKWJyZWFrO29iamVjdD1vYmplY3Rba2V5XX1pZihyZXN1bHR8fCsraW5kZXghPWxlbmd0aClyZXR1cm4gcmVzdWx0O2xlbmd0aD0Kb2JqZWN0PT1udWxsPzA6b2JqZWN0Lmxlbmd0aDtyZXR1cm4hIWxlbmd0aCYmaXNMZW5ndGgobGVuZ3RoKSYmaXNJbmRleChrZXksbGVuZ3RoKSYmKGlzQXJyYXkob2JqZWN0KXx8aXNBcmd1bWVudHMob2JqZWN0KSl9ZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc3VsdD1uZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtpZihsZW5ndGgmJnR5cGVvZiBhcnJheVswXT09InN0cmluZyImJmhhc093blByb3BlcnR5LmNhbGwoYXJyYXksImluZGV4Iikpe3Jlc3VsdC5pbmRleD1hcnJheS5pbmRleDtyZXN1bHQuaW5wdXQ9YXJyYXkuaW5wdXR9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KXtyZXR1cm4gdHlwZW9mIG9iamVjdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIWlzUHJvdG90eXBlKG9iamVjdCk/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e319ZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LAp0YWcsaXNEZWVwKXt2YXIgQ3Rvcj1vYmplY3QuY29uc3RydWN0b3I7c3dpdGNoKHRhZyl7Y2FzZSBhcnJheUJ1ZmZlclRhZzpyZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO2Nhc2UgYm9vbFRhZzpjYXNlIGRhdGVUYWc6cmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO2Nhc2UgZGF0YVZpZXdUYWc6cmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LGlzRGVlcCk7Y2FzZSBmbG9hdDMyVGFnOmNhc2UgZmxvYXQ2NFRhZzpjYXNlIGludDhUYWc6Y2FzZSBpbnQxNlRhZzpjYXNlIGludDMyVGFnOmNhc2UgdWludDhUYWc6Y2FzZSB1aW50OENsYW1wZWRUYWc6Y2FzZSB1aW50MTZUYWc6Y2FzZSB1aW50MzJUYWc6cmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsaXNEZWVwKTtjYXNlIG1hcFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBudW1iZXJUYWc6Y2FzZSBzdHJpbmdUYWc6cmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7Y2FzZSByZWdleHBUYWc6cmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7CmNhc2Ugc2V0VGFnOnJldHVybiBuZXcgQ3RvcjtjYXNlIHN5bWJvbFRhZzpyZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KX19ZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLGRldGFpbHMpe3ZhciBsZW5ndGg9ZGV0YWlscy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gc291cmNlO3ZhciBsYXN0SW5kZXg9bGVuZ3RoLTE7ZGV0YWlsc1tsYXN0SW5kZXhdPShsZW5ndGg+MT8iXHgyNiAiOiIiKStkZXRhaWxzW2xhc3RJbmRleF07ZGV0YWlscz1kZXRhaWxzLmpvaW4obGVuZ3RoPjI/IiwgIjoiICIpO3JldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIrZGV0YWlscysiXSAqL1xuIil9ZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSl7cmV0dXJuIGlzQXJyYXkodmFsdWUpfHxpc0FyZ3VtZW50cyh2YWx1ZSl8fCEhKHNwcmVhZGFibGVTeW1ib2wmJnZhbHVlJiZ2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSl9ZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwKbGVuZ3RoKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU7bGVuZ3RoPWxlbmd0aD09bnVsbD9NQVhfU0FGRV9JTlRFR0VSOmxlbmd0aDtyZXR1cm4hIWxlbmd0aCYmKHR5cGU9PSJudW1iZXIifHx0eXBlIT0ic3ltYm9sIiYmcmVJc1VpbnQudGVzdCh2YWx1ZSkpJiYodmFsdWU+LTEmJnZhbHVlJTE9PTAmJnZhbHVlPGxlbmd0aCl9ZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsaW5kZXgsb2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gZmFsc2U7dmFyIHR5cGU9dHlwZW9mIGluZGV4O2lmKHR5cGU9PSJudW1iZXIiP2lzQXJyYXlMaWtlKG9iamVjdCkmJmlzSW5kZXgoaW5kZXgsb2JqZWN0Lmxlbmd0aCk6dHlwZT09InN0cmluZyImJmluZGV4IGluIG9iamVjdClyZXR1cm4gZXEob2JqZWN0W2luZGV4XSx2YWx1ZSk7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGlzS2V5KHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiB2YWx1ZTsKaWYodHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiJ8fHZhbHVlPT1udWxsfHxpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHRydWU7cmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSl8fCFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSl8fG9iamVjdCE9bnVsbCYmdmFsdWUgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU7cmV0dXJuIHR5cGU9PSJzdHJpbmcifHx0eXBlPT0ibnVtYmVyInx8dHlwZT09InN5bWJvbCJ8fHR5cGU9PSJib29sZWFuIj92YWx1ZSE9PSJfX3Byb3RvX18iOnZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc0xhemlhYmxlKGZ1bmMpe3ZhciBmdW5jTmFtZT1nZXRGdW5jTmFtZShmdW5jKSxvdGhlcj1sb2Rhc2hbZnVuY05hbWVdO2lmKHR5cGVvZiBvdGhlciE9ImZ1bmN0aW9uInx8IShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKXJldHVybiBmYWxzZTsKaWYoZnVuYz09PW90aGVyKXJldHVybiB0cnVlO3ZhciBkYXRhPWdldERhdGEob3RoZXIpO3JldHVybiEhZGF0YSYmZnVuYz09PWRhdGFbMF19ZnVuY3Rpb24gaXNNYXNrZWQoZnVuYyl7cmV0dXJuISFtYXNrU3JjS2V5JiZtYXNrU3JjS2V5IGluIGZ1bmN9dmFyIGlzTWFza2FibGU9Y29yZUpzRGF0YT9pc0Z1bmN0aW9uOnN0dWJGYWxzZTtmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSl7dmFyIEN0b3I9dmFsdWUmJnZhbHVlLmNvbnN0cnVjdG9yLHByb3RvPXR5cGVvZiBDdG9yPT0iZnVuY3Rpb24iJiZDdG9yLnByb3RvdHlwZXx8b2JqZWN0UHJvdG87cmV0dXJuIHZhbHVlPT09cHJvdG99ZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT12YWx1ZSYmIWlzT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksc3JjVmFsdWUpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe2lmKG9iamVjdD09bnVsbClyZXR1cm4gZmFsc2U7CnJldHVybiBvYmplY3Rba2V5XT09PXNyY1ZhbHVlJiYoc3JjVmFsdWUhPT11bmRlZmluZWR8fGtleSBpbiBPYmplY3Qob2JqZWN0KSl9fWZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYyl7dmFyIHJlc3VsdD1tZW1vaXplKGZ1bmMsZnVuY3Rpb24oa2V5KXtpZihjYWNoZS5zaXplPT09TUFYX01FTU9JWkVfU0laRSljYWNoZS5jbGVhcigpO3JldHVybiBrZXl9KTt2YXIgY2FjaGU9cmVzdWx0LmNhY2hlO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsc291cmNlKXt2YXIgYml0bWFzaz1kYXRhWzFdLHNyY0JpdG1hc2s9c291cmNlWzFdLG5ld0JpdG1hc2s9Yml0bWFza3xzcmNCaXRtYXNrLGlzQ29tbW9uPW5ld0JpdG1hc2s8KFdSQVBfQklORF9GTEFHfFdSQVBfQklORF9LRVlfRkxBR3xXUkFQX0FSWV9GTEFHKTt2YXIgaXNDb21ibz1zcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiZiaXRtYXNrPT1XUkFQX0NVUlJZX0ZMQUd8fHNyY0JpdG1hc2s9PVdSQVBfQVJZX0ZMQUcmJgpiaXRtYXNrPT1XUkFQX1JFQVJHX0ZMQUcmJmRhdGFbN10ubGVuZ3RoPD1zb3VyY2VbOF18fHNyY0JpdG1hc2s9PShXUkFQX0FSWV9GTEFHfFdSQVBfUkVBUkdfRkxBRykmJnNvdXJjZVs3XS5sZW5ndGg8PXNvdXJjZVs4XSYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHO2lmKCEoaXNDb21tb258fGlzQ29tYm8pKXJldHVybiBkYXRhO2lmKHNyY0JpdG1hc2smV1JBUF9CSU5EX0ZMQUcpe2RhdGFbMl09c291cmNlWzJdO25ld0JpdG1hc2t8PWJpdG1hc2smV1JBUF9CSU5EX0ZMQUc/MDpXUkFQX0NVUlJZX0JPVU5EX0ZMQUd9dmFyIHZhbHVlPXNvdXJjZVszXTtpZih2YWx1ZSl7dmFyIHBhcnRpYWxzPWRhdGFbM107ZGF0YVszXT1wYXJ0aWFscz9jb21wb3NlQXJncyhwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNF0pOnZhbHVlO2RhdGFbNF09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVszXSxQTEFDRUhPTERFUik6c291cmNlWzRdfXZhbHVlPXNvdXJjZVs1XTtpZih2YWx1ZSl7cGFydGlhbHM9CmRhdGFbNV07ZGF0YVs1XT1wYXJ0aWFscz9jb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLHZhbHVlLHNvdXJjZVs2XSk6dmFsdWU7ZGF0YVs2XT1wYXJ0aWFscz9yZXBsYWNlSG9sZGVycyhkYXRhWzVdLFBMQUNFSE9MREVSKTpzb3VyY2VbNl19dmFsdWU9c291cmNlWzddO2lmKHZhbHVlKWRhdGFbN109dmFsdWU7aWYoc3JjQml0bWFzayZXUkFQX0FSWV9GTEFHKWRhdGFbOF09ZGF0YVs4XT09bnVsbD9zb3VyY2VbOF06bmF0aXZlTWluKGRhdGFbOF0sc291cmNlWzhdKTtpZihkYXRhWzldPT1udWxsKWRhdGFbOV09c291cmNlWzldO2RhdGFbMF09c291cmNlWzBdO2RhdGFbMV09bmV3Qml0bWFzaztyZXR1cm4gZGF0YX1mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KXt2YXIgcmVzdWx0PVtdO2lmKG9iamVjdCE9bnVsbClmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlyZXN1bHQucHVzaChrZXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpe3JldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKX0KZnVuY3Rpb24gb3ZlclJlc3QoZnVuYyxzdGFydCx0cmFuc2Zvcm0pe3N0YXJ0PW5hdGl2ZU1heChzdGFydD09PXVuZGVmaW5lZD9mdW5jLmxlbmd0aC0xOnN0YXJ0LDApO3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cyxpbmRleD0tMSxsZW5ndGg9bmF0aXZlTWF4KGFyZ3MubGVuZ3RoLXN0YXJ0LDApLGFycmF5PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbaW5kZXhdPWFyZ3Nbc3RhcnQraW5kZXhdO2luZGV4PS0xO3ZhciBvdGhlckFyZ3M9QXJyYXkoc3RhcnQrMSk7d2hpbGUoKytpbmRleDxzdGFydClvdGhlckFyZ3NbaW5kZXhdPWFyZ3NbaW5kZXhdO290aGVyQXJnc1tzdGFydF09dHJhbnNmb3JtKGFycmF5KTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLG90aGVyQXJncyl9fWZ1bmN0aW9uIHBhcmVudChvYmplY3QscGF0aCl7cmV0dXJuIHBhdGgubGVuZ3RoPDI/b2JqZWN0OmJhc2VHZXQob2JqZWN0LGJhc2VTbGljZShwYXRoLDAsLTEpKX0KZnVuY3Rpb24gcmVvcmRlcihhcnJheSxpbmRleGVzKXt2YXIgYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxsZW5ndGg9bmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLGFyckxlbmd0aCksb2xkQXJyYXk9Y29weUFycmF5KGFycmF5KTt3aGlsZShsZW5ndGgtLSl7dmFyIGluZGV4PWluZGV4ZXNbbGVuZ3RoXTthcnJheVtsZW5ndGhdPWlzSW5kZXgoaW5kZXgsYXJyTGVuZ3RoKT9vbGRBcnJheVtpbmRleF06dW5kZWZpbmVkfXJldHVybiBhcnJheX12YXIgc2V0RGF0YT1zaG9ydE91dChiYXNlU2V0RGF0YSk7dmFyIHNldFRpbWVvdXQ9Y3R4U2V0VGltZW91dHx8ZnVuY3Rpb24oZnVuYyx3YWl0KXtyZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsd2FpdCl9O3ZhciBzZXRUb1N0cmluZz1zaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO2Z1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLHJlZmVyZW5jZSxiaXRtYXNrKXt2YXIgc291cmNlPXJlZmVyZW5jZSsiIjtyZXR1cm4gc2V0VG9TdHJpbmcod3JhcHBlciwKaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksYml0bWFzaykpKX1mdW5jdGlvbiBzaG9ydE91dChmdW5jKXt2YXIgY291bnQ9MCxsYXN0Q2FsbGVkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHN0YW1wPW5hdGl2ZU5vdygpLHJlbWFpbmluZz1IT1RfU1BBTi0oc3RhbXAtbGFzdENhbGxlZCk7bGFzdENhbGxlZD1zdGFtcDtpZihyZW1haW5pbmc+MCl7aWYoKytjb3VudD49SE9UX0NPVU5UKXJldHVybiBhcmd1bWVudHNbMF19ZWxzZSBjb3VudD0wO3JldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCxhcmd1bWVudHMpfX1mdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSxzaXplKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aCxsYXN0SW5kZXg9bGVuZ3RoLTE7c2l6ZT1zaXplPT09dW5kZWZpbmVkP2xlbmd0aDpzaXplO3doaWxlKCsraW5kZXg8c2l6ZSl7dmFyIHJhbmQ9YmFzZVJhbmRvbShpbmRleCxsYXN0SW5kZXgpLAp2YWx1ZT1hcnJheVtyYW5kXTthcnJheVtyYW5kXT1hcnJheVtpbmRleF07YXJyYXlbaW5kZXhdPXZhbHVlfWFycmF5Lmxlbmd0aD1zaXplO3JldHVybiBhcnJheX12YXIgc3RyaW5nVG9QYXRoPW1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKXt2YXIgcmVzdWx0PVtdO2lmKHN0cmluZy5jaGFyQ29kZUF0KDApPT09NDYpcmVzdWx0LnB1c2goIiIpO3N0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsZnVuY3Rpb24obWF0Y2gsbnVtYmVyLHF1b3RlLHN1YlN0cmluZyl7cmVzdWx0LnB1c2gocXVvdGU/c3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCIkMSIpOm51bWJlcnx8bWF0Y2gpfSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHRvS2V5KHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHxpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHZhbHVlO3ZhciByZXN1bHQ9dmFsdWUrIiI7cmV0dXJuIHJlc3VsdD09IjAiJiYxL3ZhbHVlPT0tSU5GSU5JVFk/Ii0wIjpyZXN1bHR9CmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpe2lmKGZ1bmMhPW51bGwpe3RyeXtyZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyl9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gZnVuYysiIn1jYXRjaChlJDApe319cmV0dXJuIiJ9ZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscyxiaXRtYXNrKXthcnJheUVhY2god3JhcEZsYWdzLGZ1bmN0aW9uKHBhaXIpe3ZhciB2YWx1ZT0iXy4iK3BhaXJbMF07aWYoYml0bWFzayZwYWlyWzFdJiYhYXJyYXlJbmNsdWRlcyhkZXRhaWxzLHZhbHVlKSlkZXRhaWxzLnB1c2godmFsdWUpfSk7cmV0dXJuIGRldGFpbHMuc29ydCgpfWZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKXtpZih3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTt2YXIgcmVzdWx0PW5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZXIuX193cmFwcGVkX18sd3JhcHBlci5fX2NoYWluX18pO3Jlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7CnJlc3VsdC5fX2luZGV4X189d3JhcHBlci5fX2luZGV4X187cmVzdWx0Ll9fdmFsdWVzX189d3JhcHBlci5fX3ZhbHVlc19fO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2h1bmsoYXJyYXksc2l6ZSxndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoYXJyYXksc2l6ZSxndWFyZCk6c2l6ZT09PXVuZGVmaW5lZClzaXplPTE7ZWxzZSBzaXplPW5hdGl2ZU1heCh0b0ludGVnZXIoc2l6ZSksMCk7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RofHxzaXplPDEpcmV0dXJuW107dmFyIGluZGV4PTAscmVzSW5kZXg9MCxyZXN1bHQ9QXJyYXkobmF0aXZlQ2VpbChsZW5ndGgvc2l6ZSkpO3doaWxlKGluZGV4PGxlbmd0aClyZXN1bHRbcmVzSW5kZXgrK109YmFzZVNsaWNlKGFycmF5LGluZGV4LGluZGV4Kz1zaXplKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgsCnJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKHZhbHVlKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbmNhdCgpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO3ZhciBhcmdzPUFycmF5KGxlbmd0aC0xKSxhcnJheT1hcmd1bWVudHNbMF0saW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleC0xXT1hcmd1bWVudHNbaW5kZXhdO3JldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSk/Y29weUFycmF5KGFycmF5KTpbYXJyYXldLGJhc2VGbGF0dGVuKGFyZ3MsMSkpfXZhciBkaWZmZXJlbmNlPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LHZhbHVlcyl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSk6CltdfSk7dmFyIGRpZmZlcmVuY2VCeT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3ZhciBpdGVyYXRlZT1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKWl0ZXJhdGVlPXVuZGVmaW5lZDtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LGJhc2VGbGF0dGVuKHZhbHVlcywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX0pO3ZhciBkaWZmZXJlbmNlV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3ZhciBjb21wYXJhdG9yPWxhc3QodmFsdWVzKTtpZihpc0FycmF5TGlrZU9iamVjdChjb21wYXJhdG9yKSljb21wYXJhdG9yPXVuZGVmaW5lZDtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LGJhc2VGbGF0dGVuKHZhbHVlcywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLHVuZGVmaW5lZCxjb21wYXJhdG9yKToKW119KTtmdW5jdGlvbiBkcm9wKGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlU2xpY2UoYXJyYXksbjwwPzA6bixsZW5ndGgpfWZ1bmN0aW9uIGRyb3BSaWdodChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtuPWxlbmd0aC1uO3JldHVybiBiYXNlU2xpY2UoYXJyYXksMCxuPDA/MDpuKX1mdW5jdGlvbiBkcm9wUmlnaHRXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSx0cnVlKTpbXX1mdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVdoaWxlKGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSx0cnVlKTpbXX1mdW5jdGlvbiBmaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO2lmKHN0YXJ0JiZ0eXBlb2Ygc3RhcnQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSx2YWx1ZSxzdGFydCkpe3N0YXJ0PTA7ZW5kPWxlbmd0aH1yZXR1cm4gYmFzZUZpbGwoYXJyYXksdmFsdWUsc3RhcnQsZW5kKX1mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1mcm9tSW5kZXg9PW51bGw/MDp0b0ludGVnZXIoZnJvbUluZGV4KTtpZihpbmRleDwwKWluZGV4PW5hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk7cmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksCmdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxpbmRleCl9ZnVuY3Rpb24gZmluZExhc3RJbmRleChhcnJheSxwcmVkaWNhdGUsZnJvbUluZGV4KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWxlbmd0aC0xO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9ZnJvbUluZGV4PDA/bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTpuYXRpdmVNaW4oaW5kZXgsbGVuZ3RoLTEpfXJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxpbmRleCx0cnVlKX1mdW5jdGlvbiBmbGF0dGVuKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YmFzZUZsYXR0ZW4oYXJyYXksMSk6W119ZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7CnJldHVybiBsZW5ndGg/YmFzZUZsYXR0ZW4oYXJyYXksSU5GSU5JVFkpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSxkZXB0aCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4oYXJyYXksZGVwdGgpfWZ1bmN0aW9uIGZyb21QYWlycyhwYWlycyl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYWlycz09bnVsbD8wOnBhaXJzLmxlbmd0aCxyZXN1bHQ9e307d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtyZXN1bHRbcGFpclswXV09cGFpclsxXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGhlYWQoYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2FycmF5WzBdOnVuZGVmaW5lZH1mdW5jdGlvbiBpbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09Cm51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlSW5kZXhPZihhcnJheSx2YWx1ZSxpbmRleCl9ZnVuY3Rpb24gaW5pdGlhbChhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VTbGljZShhcnJheSwwLC0xKTpbXX12YXIgaW50ZXJzZWN0aW9uPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIG1hcHBlZD1hcnJheU1hcChhcnJheXMsY2FzdEFycmF5TGlrZU9iamVjdCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCk6W119KTt2YXIgaW50ZXJzZWN0aW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpLAptYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2lmKGl0ZXJhdGVlPT09bGFzdChtYXBwZWQpKWl0ZXJhdGVlPXVuZGVmaW5lZDtlbHNlIG1hcHBlZC5wb3AoKTtyZXR1cm4gbWFwcGVkLmxlbmd0aCYmbWFwcGVkWzBdPT09YXJyYXlzWzBdP2Jhc2VJbnRlcnNlY3Rpb24obWFwcGVkLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX0pO3ZhciBpbnRlcnNlY3Rpb25XaXRoPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGNvbXBhcmF0b3I9bGFzdChhcnJheXMpLG1hcHBlZD1hcnJheU1hcChhcnJheXMsY2FzdEFycmF5TGlrZU9iamVjdCk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtpZihjb21wYXJhdG9yKW1hcHBlZC5wb3AoKTtyZXR1cm4gbWFwcGVkLmxlbmd0aCYmbWFwcGVkWzBdPT09YXJyYXlzWzBdP2Jhc2VJbnRlcnNlY3Rpb24obWFwcGVkLHVuZGVmaW5lZCxjb21wYXJhdG9yKToKW119KTtmdW5jdGlvbiBqb2luKGFycmF5LHNlcGFyYXRvcil7cmV0dXJuIGFycmF5PT1udWxsPyIiOm5hdGl2ZUpvaW4uY2FsbChhcnJheSxzZXBhcmF0b3IpfWZ1bmN0aW9uIGxhc3QoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtsZW5ndGgtMV06dW5kZWZpbmVkfWZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGg7aWYoZnJvbUluZGV4IT09dW5kZWZpbmVkKXtpbmRleD10b0ludGVnZXIoZnJvbUluZGV4KTtpbmRleD1pbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RMYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxpbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSwKYmFzZUlzTmFOLGluZGV4LHRydWUpfWZ1bmN0aW9uIG50aChhcnJheSxuKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlTnRoKGFycmF5LHRvSW50ZWdlcihuKSk6dW5kZWZpbmVkfXZhciBwdWxsPWJhc2VSZXN0KHB1bGxBbGwpO2Z1bmN0aW9uIHB1bGxBbGwoYXJyYXksdmFsdWVzKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aCYmdmFsdWVzJiZ2YWx1ZXMubGVuZ3RoP2Jhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyk6YXJyYXl9ZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LHZhbHVlcyxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LHZhbHVlcyxjb21wYXJhdG9yKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aCYmdmFsdWVzJiZ2YWx1ZXMubGVuZ3RoP2Jhc2VQdWxsQWxsKGFycmF5LAp2YWx1ZXMsdW5kZWZpbmVkLGNvbXBhcmF0b3IpOmFycmF5fXZhciBwdWxsQXQ9ZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksaW5kZXhlcyl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXN1bHQ9YmFzZUF0KGFycmF5LGluZGV4ZXMpO2Jhc2VQdWxsQXQoYXJyYXksYXJyYXlNYXAoaW5kZXhlcyxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGlzSW5kZXgoaW5kZXgsbGVuZ3RoKT8raW5kZXg6aW5kZXh9KS5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpKTtyZXR1cm4gcmVzdWx0fSk7ZnVuY3Rpb24gcmVtb3ZlKGFycmF5LHByZWRpY2F0ZSl7dmFyIHJlc3VsdD1bXTtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXJldHVybiByZXN1bHQ7dmFyIGluZGV4PS0xLGluZGV4ZXM9W10sbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKHByZWRpY2F0ZSh2YWx1ZSwKaW5kZXgsYXJyYXkpKXtyZXN1bHQucHVzaCh2YWx1ZSk7aW5kZXhlcy5wdXNoKGluZGV4KX19YmFzZVB1bGxBdChhcnJheSxpbmRleGVzKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpe3JldHVybiBhcnJheT09bnVsbD9hcnJheTpuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpfWZ1bmN0aW9uIHNsaWNlKGFycmF5LHN0YXJ0LGVuZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO2lmKGVuZCYmdHlwZW9mIGVuZCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKGFycmF5LHN0YXJ0LGVuZCkpe3N0YXJ0PTA7ZW5kPWxlbmd0aH1lbHNle3N0YXJ0PXN0YXJ0PT1udWxsPzA6dG9JbnRlZ2VyKHN0YXJ0KTtlbmQ9ZW5kPT09dW5kZWZpbmVkP2xlbmd0aDp0b0ludGVnZXIoZW5kKX1yZXR1cm4gYmFzZVNsaWNlKGFycmF5LHN0YXJ0LGVuZCl9ZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksCnZhbHVlKX1mdW5jdGlvbiBzb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGl0ZXJhdGVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfWZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlKTtpZihpbmRleDxsZW5ndGgmJmVxKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4fXJldHVybi0xfWZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleChhcnJheSx2YWx1ZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLHRydWUpfWZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LAp2YWx1ZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZihsZW5ndGgpe3ZhciBpbmRleD1iYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSktMTtpZihlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRVbmlxKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU29ydGVkVW5pcShhcnJheSk6W119ZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU29ydGVkVW5pcShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119ZnVuY3Rpb24gdGFpbChhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VTbGljZShhcnJheSwxLGxlbmd0aCk6W119ZnVuY3Rpb24gdGFrZShhcnJheSxuLGd1YXJkKXtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXJldHVybltdOwpuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlU2xpY2UoYXJyYXksMCxuPDA/MDpuKX1mdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiB0YWtlUmlnaHRXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksZmFsc2UsdHJ1ZSk6W119ZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVdoaWxlKGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSk6W119dmFyIHVuaW9uPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywKMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSl9KTt2YXIgdW5pb25CeT1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBpdGVyYXRlZT1sYXN0KGFycmF5cyk7aWYoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKWl0ZXJhdGVlPXVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHVuaW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKTtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcil9KTtmdW5jdGlvbiB1bmlxKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlVW5pcShhcnJheSk6CltdfWZ1bmN0aW9uIHVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LGNvbXBhcmF0b3Ipe2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXksdW5kZWZpbmVkLGNvbXBhcmF0b3IpOltdfWZ1bmN0aW9uIHVuemlwKGFycmF5KXtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXJldHVybltdO3ZhciBsZW5ndGg9MDthcnJheT1hcnJheUZpbHRlcihhcnJheSxmdW5jdGlvbihncm91cCl7aWYoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKXtsZW5ndGg9bmF0aXZlTWF4KGdyb3VwLmxlbmd0aCxsZW5ndGgpO3JldHVybiB0cnVlfX0pO3JldHVybiBiYXNlVGltZXMobGVuZ3RoLGZ1bmN0aW9uKGluZGV4KXtyZXR1cm4gYXJyYXlNYXAoYXJyYXksCmJhc2VQcm9wZXJ0eShpbmRleCkpfSl9ZnVuY3Rpb24gdW56aXBXaXRoKGFycmF5LGl0ZXJhdGVlKXtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXJldHVybltdO3ZhciByZXN1bHQ9dW56aXAoYXJyYXkpO2lmKGl0ZXJhdGVlPT1udWxsKXJldHVybiByZXN1bHQ7cmV0dXJuIGFycmF5TWFwKHJlc3VsdCxmdW5jdGlvbihncm91cCl7cmV0dXJuIGFwcGx5KGl0ZXJhdGVlLHVuZGVmaW5lZCxncm91cCl9KX12YXIgd2l0aG91dD1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksdmFsdWVzKTpbXX0pO3ZhciB4b3I9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpKX0pO3ZhciB4b3JCeT1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBpdGVyYXRlZT1sYXN0KGFycmF5cyk7aWYoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKWl0ZXJhdGVlPQp1bmRlZmluZWQ7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9KTt2YXIgeG9yV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKTtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7dmFyIHppcD1iYXNlUmVzdCh1bnppcCk7ZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYXNzaWduVmFsdWUpfWZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsdmFsdWVzKXtyZXR1cm4gYmFzZVppcE9iamVjdChwcm9wc3x8W10sdmFsdWVzfHxbXSxiYXNlU2V0KX12YXIgemlwV2l0aD0KYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGgsaXRlcmF0ZWU9bGVuZ3RoPjE/YXJyYXlzW2xlbmd0aC0xXTp1bmRlZmluZWQ7aXRlcmF0ZWU9dHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iPyhhcnJheXMucG9wKCksaXRlcmF0ZWUpOnVuZGVmaW5lZDtyZXR1cm4gdW56aXBXaXRoKGFycmF5cyxpdGVyYXRlZSl9KTtmdW5jdGlvbiBjaGFpbih2YWx1ZSl7dmFyIHJlc3VsdD1sb2Rhc2godmFsdWUpO3Jlc3VsdC5fX2NoYWluX189dHJ1ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRhcCh2YWx1ZSxpbnRlcmNlcHRvcil7aW50ZXJjZXB0b3IodmFsdWUpO3JldHVybiB2YWx1ZX1mdW5jdGlvbiB0aHJ1KHZhbHVlLGludGVyY2VwdG9yKXtyZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpfXZhciB3cmFwcGVyQXQ9ZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpe3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoLHN0YXJ0PWxlbmd0aD9wYXRoc1swXTowLHZhbHVlPQp0aGlzLl9fd3JhcHBlZF9fLGludGVyY2VwdG9yPWZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIGJhc2VBdChvYmplY3QscGF0aHMpfTtpZihsZW5ndGg+MXx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGh8fCEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcil8fCFpc0luZGV4KHN0YXJ0KSlyZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTt2YWx1ZT12YWx1ZS5zbGljZShzdGFydCwrc3RhcnQrKGxlbmd0aD8xOjApKTt2YWx1ZS5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W2ludGVyY2VwdG9yXSwidGhpc0FyZyI6dW5kZWZpbmVkfSk7cmV0dXJuKG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLHRoaXMuX19jaGFpbl9fKSkudGhydShmdW5jdGlvbihhcnJheSl7aWYobGVuZ3RoJiYhYXJyYXkubGVuZ3RoKWFycmF5LnB1c2godW5kZWZpbmVkKTtyZXR1cm4gYXJyYXl9KX0pO2Z1bmN0aW9uIHdyYXBwZXJDaGFpbigpe3JldHVybiBjaGFpbih0aGlzKX1mdW5jdGlvbiB3cmFwcGVyQ29tbWl0KCl7cmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHRoaXMudmFsdWUoKSwKdGhpcy5fX2NoYWluX18pfWZ1bmN0aW9uIHdyYXBwZXJOZXh0KCl7aWYodGhpcy5fX3ZhbHVlc19fPT09dW5kZWZpbmVkKXRoaXMuX192YWx1ZXNfXz10b0FycmF5KHRoaXMudmFsdWUoKSk7dmFyIGRvbmU9dGhpcy5fX2luZGV4X18+PXRoaXMuX192YWx1ZXNfXy5sZW5ndGgsdmFsdWU9ZG9uZT91bmRlZmluZWQ6dGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO3JldHVybnsiZG9uZSI6ZG9uZSwidmFsdWUiOnZhbHVlfX1mdW5jdGlvbiB3cmFwcGVyVG9JdGVyYXRvcigpe3JldHVybiB0aGlzfWZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSl7dmFyIHJlc3VsdCxwYXJlbnQ9dGhpczt3aGlsZShwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKXt2YXIgY2xvbmU9d3JhcHBlckNsb25lKHBhcmVudCk7Y2xvbmUuX19pbmRleF9fPTA7Y2xvbmUuX192YWx1ZXNfXz11bmRlZmluZWQ7aWYocmVzdWx0KXByZXZpb3VzLl9fd3JhcHBlZF9fPWNsb25lO2Vsc2UgcmVzdWx0PWNsb25lOwp2YXIgcHJldmlvdXM9Y2xvbmU7cGFyZW50PXBhcmVudC5fX3dyYXBwZWRfX31wcmV2aW91cy5fX3dyYXBwZWRfXz12YWx1ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCl7dmFyIHZhbHVlPXRoaXMuX193cmFwcGVkX187aWYodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcil7dmFyIHdyYXBwZWQ9dmFsdWU7aWYodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpd3JhcHBlZD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7d3JhcHBlZD13cmFwcGVkLnJldmVyc2UoKTt3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goeyJmdW5jIjp0aHJ1LCJhcmdzIjpbcmV2ZXJzZV0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLHRoaXMuX19jaGFpbl9fKX1yZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpfWZ1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpe3JldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sdGhpcy5fX2FjdGlvbnNfXyl9CnZhciBjb3VudEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSkrK3Jlc3VsdFtrZXldO2Vsc2UgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksMSl9KTtmdW5jdGlvbiBldmVyeShjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUV2ZXJ5OmJhc2VFdmVyeTtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpKXByZWRpY2F0ZT11bmRlZmluZWQ7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpfWZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX12YXIgZmluZD0KY3JlYXRlRmluZChmaW5kSW5kZXgpO3ZhciBmaW5kTGFzdD1jcmVhdGVGaW5kKGZpbmRMYXN0SW5kZXgpO2Z1bmN0aW9uIGZsYXRNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSwxKX1mdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLGl0ZXJhdGVlKXtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLElORklOSVRZKX1mdW5jdGlvbiBmbGF0TWFwRGVwdGgoY29sbGVjdGlvbixpdGVyYXRlZSxkZXB0aCl7ZGVwdGg9ZGVwdGg9PT11bmRlZmluZWQ/MTp0b0ludGVnZXIoZGVwdGgpO3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksZGVwdGgpfWZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2g6YmFzZUVhY2g7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSwKMykpfWZ1bmN0aW9uIGZvckVhY2hSaWdodChjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5RWFjaFJpZ2h0OmJhc2VFYWNoUmlnaHQ7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9dmFyIGdyb3VwQnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsa2V5KXtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCxrZXkpKXJlc3VsdFtrZXldLnB1c2godmFsdWUpO2Vsc2UgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksW3ZhbHVlXSl9KTtmdW5jdGlvbiBpbmNsdWRlcyhjb2xsZWN0aW9uLHZhbHVlLGZyb21JbmRleCxndWFyZCl7Y29sbGVjdGlvbj1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9jb2xsZWN0aW9uOnZhbHVlcyhjb2xsZWN0aW9uKTtmcm9tSW5kZXg9ZnJvbUluZGV4JiYhZ3VhcmQ/dG9JbnRlZ2VyKGZyb21JbmRleCk6MDt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoOwppZihmcm9tSW5kZXg8MClmcm9tSW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtmcm9tSW5kZXgsMCk7cmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pP2Zyb21JbmRleDw9bGVuZ3RoJiZjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsZnJvbUluZGV4KT4tMTohIWxlbmd0aCYmYmFzZUluZGV4T2YoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgpPi0xfXZhciBpbnZva2VNYXA9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixwYXRoLGFyZ3Mpe3ZhciBpbmRleD0tMSxpc0Z1bmM9dHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIscmVzdWx0PWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pP0FycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKTpbXTtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlKXtyZXN1bHRbKytpbmRleF09aXNGdW5jP2FwcGx5KHBhdGgsdmFsdWUsYXJncyk6YmFzZUludm9rZSh2YWx1ZSxwYXRoLGFyZ3MpfSk7cmV0dXJuIHJlc3VsdH0pO3ZhciBrZXlCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwKdmFsdWUsa2V5KXtiYXNlQXNzaWduVmFsdWUocmVzdWx0LGtleSx2YWx1ZSl9KTtmdW5jdGlvbiBtYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheU1hcDpiYXNlTWFwO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfWZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzLGd1YXJkKXtpZihjb2xsZWN0aW9uPT1udWxsKXJldHVybltdO2lmKCFpc0FycmF5KGl0ZXJhdGVlcykpaXRlcmF0ZWVzPWl0ZXJhdGVlcz09bnVsbD9bXTpbaXRlcmF0ZWVzXTtvcmRlcnM9Z3VhcmQ/dW5kZWZpbmVkOm9yZGVycztpZighaXNBcnJheShvcmRlcnMpKW9yZGVycz1vcmRlcnM9PW51bGw/W106W29yZGVyc107cmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyl9dmFyIHBhcnRpdGlvbj1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSwKa2V5KXtyZXN1bHRba2V5PzA6MV0ucHVzaCh2YWx1ZSl9LGZ1bmN0aW9uKCl7cmV0dXJuW1tdLFtdXX0pO2Z1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5UmVkdWNlOmJhc2VSZWR1Y2UsaW5pdEFjY3VtPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDQpLGFjY3VtdWxhdG9yLGluaXRBY2N1bSxiYXNlRWFjaCl9ZnVuY3Rpb24gcmVkdWNlUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZVJpZ2h0OmJhc2VSZWR1Y2UsaW5pdEFjY3VtPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDQpLGFjY3VtdWxhdG9yLGluaXRBY2N1bSxiYXNlRWFjaFJpZ2h0KX1mdW5jdGlvbiByZWplY3QoY29sbGVjdGlvbiwKcHJlZGljYXRlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5RmlsdGVyOmJhc2VGaWx0ZXI7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKSl9ZnVuY3Rpb24gc2FtcGxlKGNvbGxlY3Rpb24pe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTYW1wbGU6YmFzZVNhbXBsZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uKX1mdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbixuLGd1YXJkKTpuPT09dW5kZWZpbmVkKW49MTtlbHNlIG49dG9JbnRlZ2VyKG4pO3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTYW1wbGVTaXplOmJhc2VTYW1wbGVTaXplO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbil9ZnVuY3Rpb24gc2h1ZmZsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2h1ZmZsZToKYmFzZVNodWZmbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKXtpZihjb2xsZWN0aW9uPT1udWxsKXJldHVybiAwO2lmKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9zdHJpbmdTaXplKGNvbGxlY3Rpb24pOmNvbGxlY3Rpb24ubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKGNvbGxlY3Rpb24pO2lmKHRhZz09bWFwVGFnfHx0YWc9PXNldFRhZylyZXR1cm4gY29sbGVjdGlvbi5zaXplO3JldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGh9ZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNvbWU6YmFzZVNvbWU7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLAozKSl9dmFyIHNvcnRCeT1iYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLGl0ZXJhdGVlcyl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTt2YXIgbGVuZ3RoPWl0ZXJhdGVlcy5sZW5ndGg7aWYobGVuZ3RoPjEmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24saXRlcmF0ZWVzWzBdLGl0ZXJhdGVlc1sxXSkpaXRlcmF0ZWVzPVtdO2Vsc2UgaWYobGVuZ3RoPjImJmlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0saXRlcmF0ZWVzWzJdKSlpdGVyYXRlZXM9W2l0ZXJhdGVlc1swXV07cmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLDEpLFtdKX0pO3ZhciBub3c9Y3R4Tm93fHxmdW5jdGlvbigpe3JldHVybiByb290LkRhdGUubm93KCl9O2Z1bmN0aW9uIGFmdGVyKG4sZnVuYyl7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO249dG9JbnRlZ2VyKG4pOwpyZXR1cm4gZnVuY3Rpb24oKXtpZigtLW48MSlyZXR1cm4gZnVuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGFyeShmdW5jLG4sZ3VhcmQpe249Z3VhcmQ/dW5kZWZpbmVkOm47bj1mdW5jJiZuPT1udWxsP2Z1bmMubGVuZ3RoOm47cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX0FSWV9GTEFHLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxuKX1mdW5jdGlvbiBiZWZvcmUobixmdW5jKXt2YXIgcmVzdWx0O2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTtyZXR1cm4gZnVuY3Rpb24oKXtpZigtLW4+MClyZXN1bHQ9ZnVuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYobjw9MSlmdW5jPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fX12YXIgYmluZD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHRoaXNBcmcscGFydGlhbHMpe3ZhciBiaXRtYXNrPVdSQVBfQklORF9GTEFHOwppZihwYXJ0aWFscy5sZW5ndGgpe3ZhciBob2xkZXJzPXJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLGdldEhvbGRlcihiaW5kKSk7Yml0bWFza3w9V1JBUF9QQVJUSUFMX0ZMQUd9cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyl9KTt2YXIgYmluZEtleT1iYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsa2V5LHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUc7aWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZEtleSkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGtleSxiaXRtYXNrLG9iamVjdCxwYXJ0aWFscyxob2xkZXJzKX0pO2Z1bmN0aW9uIGN1cnJ5KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYywKV1JBUF9DVVJSWV9GTEFHLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHkpO3Jlc3VsdC5wbGFjZWhvbGRlcj1jdXJyeS5wbGFjZWhvbGRlcjtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGN1cnJ5UmlnaHQoZnVuYyxhcml0eSxndWFyZCl7YXJpdHk9Z3VhcmQ/dW5kZWZpbmVkOmFyaXR5O3ZhciByZXN1bHQ9Y3JlYXRlV3JhcChmdW5jLFdSQVBfQ1VSUllfUklHSFRfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnlSaWdodC5wbGFjZWhvbGRlcjtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGFzdEFyZ3MsbGFzdFRoaXMsbWF4V2FpdCxyZXN1bHQsdGltZXJJZCxsYXN0Q2FsbFRpbWUsbGFzdEludm9rZVRpbWU9MCxsZWFkaW5nPWZhbHNlLG1heGluZz1mYWxzZSx0cmFpbGluZz10cnVlOwppZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7d2FpdD10b051bWJlcih3YWl0KXx8MDtpZihpc09iamVjdChvcHRpb25zKSl7bGVhZGluZz0hIW9wdGlvbnMubGVhZGluZzttYXhpbmc9Im1heFdhaXQiaW4gb3B0aW9uczttYXhXYWl0PW1heGluZz9uYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KXx8MCx3YWl0KTptYXhXYWl0O3RyYWlsaW5nPSJ0cmFpbGluZyJpbiBvcHRpb25zPyEhb3B0aW9ucy50cmFpbGluZzp0cmFpbGluZ31mdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpe3ZhciBhcmdzPWxhc3RBcmdzLHRoaXNBcmc9bGFzdFRoaXM7bGFzdEFyZ3M9bGFzdFRoaXM9dW5kZWZpbmVkO2xhc3RJbnZva2VUaW1lPXRpbWU7cmVzdWx0PWZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpe2xhc3RJbnZva2VUaW1lPXRpbWU7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwKd2FpdCk7cmV0dXJuIGxlYWRpbmc/aW52b2tlRnVuYyh0aW1lKTpyZXN1bHR9ZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKXt2YXIgdGltZVNpbmNlTGFzdENhbGw9dGltZS1sYXN0Q2FsbFRpbWUsdGltZVNpbmNlTGFzdEludm9rZT10aW1lLWxhc3RJbnZva2VUaW1lLHRpbWVXYWl0aW5nPXdhaXQtdGltZVNpbmNlTGFzdENhbGw7cmV0dXJuIG1heGluZz9uYXRpdmVNaW4odGltZVdhaXRpbmcsbWF4V2FpdC10aW1lU2luY2VMYXN0SW52b2tlKTp0aW1lV2FpdGluZ31mdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZTtyZXR1cm4gbGFzdENhbGxUaW1lPT09dW5kZWZpbmVkfHx0aW1lU2luY2VMYXN0Q2FsbD49d2FpdHx8dGltZVNpbmNlTGFzdENhbGw8MHx8bWF4aW5nJiZ0aW1lU2luY2VMYXN0SW52b2tlPj1tYXhXYWl0fWZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpe3ZhciB0aW1lPQpub3coKTtpZihzaG91bGRJbnZva2UodGltZSkpcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHJlbWFpbmluZ1dhaXQodGltZSkpfWZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKXt0aW1lcklkPXVuZGVmaW5lZDtpZih0cmFpbGluZyYmbGFzdEFyZ3MpcmV0dXJuIGludm9rZUZ1bmModGltZSk7bGFzdEFyZ3M9bGFzdFRoaXM9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FuY2VsKCl7aWYodGltZXJJZCE9PXVuZGVmaW5lZCljbGVhclRpbWVvdXQodGltZXJJZCk7bGFzdEludm9rZVRpbWU9MDtsYXN0QXJncz1sYXN0Q2FsbFRpbWU9bGFzdFRoaXM9dGltZXJJZD11bmRlZmluZWR9ZnVuY3Rpb24gZmx1c2goKXtyZXR1cm4gdGltZXJJZD09PXVuZGVmaW5lZD9yZXN1bHQ6dHJhaWxpbmdFZGdlKG5vdygpKX1mdW5jdGlvbiBkZWJvdW5jZWQoKXt2YXIgdGltZT1ub3coKSxpc0ludm9raW5nPXNob3VsZEludm9rZSh0aW1lKTsKbGFzdEFyZ3M9YXJndW1lbnRzO2xhc3RUaGlzPXRoaXM7bGFzdENhbGxUaW1lPXRpbWU7aWYoaXNJbnZva2luZyl7aWYodGltZXJJZD09PXVuZGVmaW5lZClyZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtpZihtYXhpbmcpe3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsd2FpdCk7cmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKX19aWYodGltZXJJZD09PXVuZGVmaW5lZCl0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiByZXN1bHR9ZGVib3VuY2VkLmNhbmNlbD1jYW5jZWw7ZGVib3VuY2VkLmZsdXNoPWZsdXNoO3JldHVybiBkZWJvdW5jZWR9dmFyIGRlZmVyPWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsYXJncyl7cmV0dXJuIGJhc2VEZWxheShmdW5jLDEsYXJncyl9KTt2YXIgZGVsYXk9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx3YWl0LGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYyx0b051bWJlcih3YWl0KXx8MCxhcmdzKX0pOwpmdW5jdGlvbiBmbGlwKGZ1bmMpe3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9GTElQX0ZMQUcpfWZ1bmN0aW9uIG1lbW9pemUoZnVuYyxyZXNvbHZlcil7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiJ8fHJlc29sdmVyIT1udWxsJiZ0eXBlb2YgcmVzb2x2ZXIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3ZhciBtZW1vaXplZD1mdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cyxrZXk9cmVzb2x2ZXI/cmVzb2x2ZXIuYXBwbHkodGhpcyxhcmdzKTphcmdzWzBdLGNhY2hlPW1lbW9pemVkLmNhY2hlO2lmKGNhY2hlLmhhcyhrZXkpKXJldHVybiBjYWNoZS5nZXQoa2V5KTt2YXIgcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmdzKTttZW1vaXplZC5jYWNoZT1jYWNoZS5zZXQoa2V5LHJlc3VsdCl8fGNhY2hlO3JldHVybiByZXN1bHR9O21lbW9pemVkLmNhY2hlPW5ldyAobWVtb2l6ZS5DYWNoZXx8TWFwQ2FjaGUpO3JldHVybiBtZW1vaXplZH0KbWVtb2l6ZS5DYWNoZT1NYXBDYWNoZTtmdW5jdGlvbiBuZWdhdGUocHJlZGljYXRlKXtpZih0eXBlb2YgcHJlZGljYXRlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7c3dpdGNoKGFyZ3MubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hcHJlZGljYXRlLmNhbGwodGhpcyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSxhcmdzWzFdKTtjYXNlIDM6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pfXJldHVybiFwcmVkaWNhdGUuYXBwbHkodGhpcyxhcmdzKX19ZnVuY3Rpb24gb25jZShmdW5jKXtyZXR1cm4gYmVmb3JlKDIsZnVuYyl9dmFyIG92ZXJBcmdzPWNhc3RSZXN0KGZ1bmN0aW9uKGZ1bmMsdHJhbnNmb3Jtcyl7dHJhbnNmb3Jtcz10cmFuc2Zvcm1zLmxlbmd0aD09CjEmJmlzQXJyYXkodHJhbnNmb3Jtc1swXSk/YXJyYXlNYXAodHJhbnNmb3Jtc1swXSxiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpOmFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsMSksYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgZnVuY3NMZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciBpbmRleD0tMSxsZW5ndGg9bmF0aXZlTWluKGFyZ3MubGVuZ3RoLGZ1bmNzTGVuZ3RoKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcmdzW2luZGV4XT10cmFuc2Zvcm1zW2luZGV4XS5jYWxsKHRoaXMsYXJnc1tpbmRleF0pO3JldHVybiBhcHBseShmdW5jLHRoaXMsYXJncyl9KX0pO3ZhciBwYXJ0aWFsPWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMscGFydGlhbHMpe3ZhciBob2xkZXJzPXJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLGdldEhvbGRlcihwYXJ0aWFsKSk7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1BBUlRJQUxfRkxBRywKdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHBhcnRpYWxSaWdodD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbFJpZ2h0KSk7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyx1bmRlZmluZWQscGFydGlhbHMsaG9sZGVycyl9KTt2YXIgcmVhcmc9ZmxhdFJlc3QoZnVuY3Rpb24oZnVuYyxpbmRleGVzKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfUkVBUkdfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxpbmRleGVzKX0pO2Z1bmN0aW9uIHJlc3QoZnVuYyxzdGFydCl7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3N0YXJ0PXN0YXJ0PT09dW5kZWZpbmVkP3N0YXJ0OnRvSW50ZWdlcihzdGFydCk7cmV0dXJuIGJhc2VSZXN0KGZ1bmMsc3RhcnQpfQpmdW5jdGlvbiBzcHJlYWQoZnVuYyxzdGFydCl7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3N0YXJ0PXN0YXJ0PT1udWxsPzA6bmF0aXZlTWF4KHRvSW50ZWdlcihzdGFydCksMCk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciBhcnJheT1hcmdzW3N0YXJ0XSxvdGhlckFyZ3M9Y2FzdFNsaWNlKGFyZ3MsMCxzdGFydCk7aWYoYXJyYXkpYXJyYXlQdXNoKG90aGVyQXJncyxhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfSl9ZnVuY3Rpb24gdGhyb3R0bGUoZnVuYyx3YWl0LG9wdGlvbnMpe3ZhciBsZWFkaW5nPXRydWUsdHJhaWxpbmc9dHJ1ZTtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ImxlYWRpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMubGVhZGluZzoKbGVhZGluZzt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9cmV0dXJuIGRlYm91bmNlKGZ1bmMsd2FpdCx7ImxlYWRpbmciOmxlYWRpbmcsIm1heFdhaXQiOndhaXQsInRyYWlsaW5nIjp0cmFpbGluZ30pfWZ1bmN0aW9uIHVuYXJ5KGZ1bmMpe3JldHVybiBhcnkoZnVuYywxKX1mdW5jdGlvbiB3cmFwKHZhbHVlLHdyYXBwZXIpe3JldHVybiBwYXJ0aWFsKGNhc3RGdW5jdGlvbih3cmFwcGVyKSx2YWx1ZSl9ZnVuY3Rpb24gY2FzdEFycmF5KCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIHZhbHVlPWFyZ3VtZW50c1swXTtyZXR1cm4gaXNBcnJheSh2YWx1ZSk/dmFsdWU6W3ZhbHVlXX1mdW5jdGlvbiBjbG9uZSh2YWx1ZSl7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0KImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21pemVyKX1mdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfREVFUF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyl9ZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfREVFUF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21pemVyKX1mdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCxzb3VyY2Upe3JldHVybiBzb3VyY2U9PW51bGx8fGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2Usa2V5cyhzb3VyY2UpKX1mdW5jdGlvbiBlcSh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPT09b3RoZXJ8fHZhbHVlIT09dmFsdWUmJgpvdGhlciE9PW90aGVyfXZhciBndD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7dmFyIGd0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU+PW90aGVyfSk7dmFyIGlzQXJndW1lbnRzPWJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP2Jhc2VJc0FyZ3VtZW50czpmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsImNhbGxlZSIpJiYhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwiY2FsbGVlIil9O3ZhciBpc0FycmF5PUFycmF5LmlzQXJyYXk7dmFyIGlzQXJyYXlCdWZmZXI9bm9kZUlzQXJyYXlCdWZmZXI/YmFzZVVuYXJ5KG5vZGVJc0FycmF5QnVmZmVyKTpiYXNlSXNBcnJheUJ1ZmZlcjtmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSl7cmV0dXJuIHZhbHVlIT1udWxsJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYKIWlzRnVuY3Rpb24odmFsdWUpfWZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmaXNBcnJheUxpa2UodmFsdWUpfWZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dHJ1ZXx8dmFsdWU9PT1mYWxzZXx8aXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWJvb2xUYWd9dmFyIGlzQnVmZmVyPW5hdGl2ZUlzQnVmZmVyfHxzdHViRmFsc2U7dmFyIGlzRGF0ZT1ub2RlSXNEYXRlP2Jhc2VVbmFyeShub2RlSXNEYXRlKTpiYXNlSXNEYXRlO2Z1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJnZhbHVlLm5vZGVUeXBlPT09MSYmIWlzUGxhaW5PYmplY3QodmFsdWUpfWZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpe2lmKHZhbHVlPT1udWxsKXJldHVybiB0cnVlO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSYmKGlzQXJyYXkodmFsdWUpfHx0eXBlb2YgdmFsdWU9PQoic3RyaW5nInx8dHlwZW9mIHZhbHVlLnNwbGljZT09ImZ1bmN0aW9uInx8aXNCdWZmZXIodmFsdWUpfHxpc1R5cGVkQXJyYXkodmFsdWUpfHxpc0FyZ3VtZW50cyh2YWx1ZSkpKXJldHVybiF2YWx1ZS5sZW5ndGg7dmFyIHRhZz1nZXRUYWcodmFsdWUpO2lmKHRhZz09bWFwVGFnfHx0YWc9PXNldFRhZylyZXR1cm4hdmFsdWUuc2l6ZTtpZihpc1Byb3RvdHlwZSh2YWx1ZSkpcmV0dXJuIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBpc0VxdWFsKHZhbHVlLG90aGVyKXtyZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsb3RoZXIpfWZ1bmN0aW9uIGlzRXF1YWxXaXRoKHZhbHVlLG90aGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7dmFyIHJlc3VsdD0KY3VzdG9taXplcj9jdXN0b21pemVyKHZhbHVlLG90aGVyKTp1bmRlZmluZWQ7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9iYXNlSXNFcXVhbCh2YWx1ZSxvdGhlcix1bmRlZmluZWQsY3VzdG9taXplcik6ISFyZXN1bHR9ZnVuY3Rpb24gaXNFcnJvcih2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSkpcmV0dXJuIGZhbHNlO3ZhciB0YWc9YmFzZUdldFRhZyh2YWx1ZSk7cmV0dXJuIHRhZz09ZXJyb3JUYWd8fHRhZz09ZG9tRXhjVGFnfHx0eXBlb2YgdmFsdWUubWVzc2FnZT09InN0cmluZyImJnR5cGVvZiB2YWx1ZS5uYW1lPT0ic3RyaW5nIiYmIWlzUGxhaW5PYmplY3QodmFsdWUpfWZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0ibnVtYmVyIiYmbmF0aXZlSXNGaW5pdGUodmFsdWUpfWZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSkpcmV0dXJuIGZhbHNlO3ZhciB0YWc9YmFzZUdldFRhZyh2YWx1ZSk7cmV0dXJuIHRhZz09CmZ1bmNUYWd8fHRhZz09Z2VuVGFnfHx0YWc9PWFzeW5jVGFnfHx0YWc9PXByb3h5VGFnfWZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT10b0ludGVnZXIodmFsdWUpfWZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0ibnVtYmVyIiYmdmFsdWU+LTEmJnZhbHVlJTE9PTAmJnZhbHVlPD1NQVhfU0FGRV9JTlRFR0VSfWZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU7cmV0dXJuIHZhbHVlIT1udWxsJiYodHlwZT09Im9iamVjdCJ8fHR5cGU9PSJmdW5jdGlvbiIpfWZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSl7cmV0dXJuIHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWU9PSJvYmplY3QifXZhciBpc01hcD1ub2RlSXNNYXA/YmFzZVVuYXJ5KG5vZGVJc01hcCk6YmFzZUlzTWFwO2Z1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdD09PQpzb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpfWZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCxzb3VyY2UsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxnZXRNYXRjaERhdGEoc291cmNlKSxjdXN0b21pemVyKX1mdW5jdGlvbiBpc05hTih2YWx1ZSl7cmV0dXJuIGlzTnVtYmVyKHZhbHVlKSYmdmFsdWUhPSt2YWx1ZX1mdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSl7aWYoaXNNYXNrYWJsZSh2YWx1ZSkpdGhyb3cgbmV3IEVycm9yKENPUkVfRVJST1JfVEVYVCk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSl9ZnVuY3Rpb24gaXNOdWxsKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT1udWxsfWZ1bmN0aW9uIGlzTmlsKHZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx9ZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PQoibnVtYmVyInx8aXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PW51bWJlclRhZ31mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKXtpZighaXNPYmplY3RMaWtlKHZhbHVlKXx8YmFzZUdldFRhZyh2YWx1ZSkhPW9iamVjdFRhZylyZXR1cm4gZmFsc2U7dmFyIHByb3RvPWdldFByb3RvdHlwZSh2YWx1ZSk7aWYocHJvdG89PT1udWxsKXJldHVybiB0cnVlO3ZhciBDdG9yPWhhc093blByb3BlcnR5LmNhbGwocHJvdG8sImNvbnN0cnVjdG9yIikmJnByb3RvLmNvbnN0cnVjdG9yO3JldHVybiB0eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3RvciBpbnN0YW5jZW9mIEN0b3ImJmZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpPT1vYmplY3RDdG9yU3RyaW5nfXZhciBpc1JlZ0V4cD1ub2RlSXNSZWdFeHA/YmFzZVVuYXJ5KG5vZGVJc1JlZ0V4cCk6YmFzZUlzUmVnRXhwO2Z1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpe3JldHVybiBpc0ludGVnZXIodmFsdWUpJiZ2YWx1ZT49Ci1NQVhfU0FGRV9JTlRFR0VSJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn12YXIgaXNTZXQ9bm9kZUlzU2V0P2Jhc2VVbmFyeShub2RlSXNTZXQpOmJhc2VJc1NldDtmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fCFpc0FycmF5KHZhbHVlKSYmaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PXN0cmluZ1RhZ31mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09InN5bWJvbCJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zeW1ib2xUYWd9dmFyIGlzVHlwZWRBcnJheT1ub2RlSXNUeXBlZEFycmF5P2Jhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KTpiYXNlSXNUeXBlZEFycmF5O2Z1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT11bmRlZmluZWR9ZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmCmdldFRhZyh2YWx1ZSk9PXdlYWtNYXBUYWd9ZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PXdlYWtTZXRUYWd9dmFyIGx0PWNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUx0KTt2YXIgbHRlPWNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZTw9b3RoZXJ9KTtmdW5jdGlvbiB0b0FycmF5KHZhbHVlKXtpZighdmFsdWUpcmV0dXJuW107aWYoaXNBcnJheUxpa2UodmFsdWUpKXJldHVybiBpc1N0cmluZyh2YWx1ZSk/c3RyaW5nVG9BcnJheSh2YWx1ZSk6Y29weUFycmF5KHZhbHVlKTtpZihzeW1JdGVyYXRvciYmdmFsdWVbc3ltSXRlcmF0b3JdKXJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKSxmdW5jPXRhZz09bWFwVGFnP21hcFRvQXJyYXk6dGFnPT1zZXRUYWc/c2V0VG9BcnJheToKdmFsdWVzO3JldHVybiBmdW5jKHZhbHVlKX1mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6MDt2YWx1ZT10b051bWJlcih2YWx1ZSk7aWYodmFsdWU9PT1JTkZJTklUWXx8dmFsdWU9PT0tSU5GSU5JVFkpe3ZhciBzaWduPXZhbHVlPDA/LTE6MTtyZXR1cm4gc2lnbipNQVhfSU5URUdFUn1yZXR1cm4gdmFsdWU9PT12YWx1ZT92YWx1ZTowfWZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSl7dmFyIHJlc3VsdD10b0Zpbml0ZSh2YWx1ZSkscmVtYWluZGVyPXJlc3VsdCUxO3JldHVybiByZXN1bHQ9PT1yZXN1bHQ/cmVtYWluZGVyP3Jlc3VsdC1yZW1haW5kZXI6cmVzdWx0OjB9ZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpe3JldHVybiB2YWx1ZT9iYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwwLE1BWF9BUlJBWV9MRU5HVEgpOjB9ZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciIpcmV0dXJuIHZhbHVlOwppZihpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIE5BTjtpZihpc09iamVjdCh2YWx1ZSkpe3ZhciBvdGhlcj10eXBlb2YgdmFsdWUudmFsdWVPZj09ImZ1bmN0aW9uIj92YWx1ZS52YWx1ZU9mKCk6dmFsdWU7dmFsdWU9aXNPYmplY3Qob3RoZXIpP290aGVyKyIiOm90aGVyfWlmKHR5cGVvZiB2YWx1ZSE9InN0cmluZyIpcmV0dXJuIHZhbHVlPT09MD92YWx1ZTordmFsdWU7dmFsdWU9dmFsdWUucmVwbGFjZShyZVRyaW0sIiIpO3ZhciBpc0JpbmFyeT1yZUlzQmluYXJ5LnRlc3QodmFsdWUpO3JldHVybiBpc0JpbmFyeXx8cmVJc09jdGFsLnRlc3QodmFsdWUpP2ZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSxpc0JpbmFyeT8yOjgpOnJlSXNCYWRIZXgudGVzdCh2YWx1ZSk/TkFOOit2YWx1ZX1mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKXtyZXR1cm4gY29weU9iamVjdCh2YWx1ZSxrZXlzSW4odmFsdWUpKX1mdW5jdGlvbiB0b1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gdmFsdWU/CmJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLC1NQVhfU0FGRV9JTlRFR0VSLE1BWF9TQUZFX0lOVEVHRVIpOnZhbHVlPT09MD92YWx1ZTowfWZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGw/IiI6YmFzZVRvU3RyaW5nKHZhbHVlKX12YXIgYXNzaWduPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Upe2lmKGlzUHJvdG90eXBlKHNvdXJjZSl8fGlzQXJyYXlMaWtlKHNvdXJjZSkpe2NvcHlPYmplY3Qoc291cmNlLGtleXMoc291cmNlKSxvYmplY3QpO3JldHVybn1mb3IodmFyIGtleSBpbiBzb3VyY2UpaWYoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSlhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHNvdXJjZVtrZXldKX0pO3ZhciBhc3NpZ25Jbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzSW4oc291cmNlKSxvYmplY3QpfSk7dmFyIGFzc2lnbkluV2l0aD1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsCnNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzSW4oc291cmNlKSxvYmplY3QsY3VzdG9taXplcil9KTt2YXIgYXNzaWduV2l0aD1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIpe2NvcHlPYmplY3Qoc291cmNlLGtleXMoc291cmNlKSxvYmplY3QsY3VzdG9taXplcil9KTt2YXIgYXQ9ZmxhdFJlc3QoYmFzZUF0KTtmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLHByb3BlcnRpZXMpe3ZhciByZXN1bHQ9YmFzZUNyZWF0ZShwcm90b3R5cGUpO3JldHVybiBwcm9wZXJ0aWVzPT1udWxsP3Jlc3VsdDpiYXNlQXNzaWduKHJlc3VsdCxwcm9wZXJ0aWVzKX12YXIgZGVmYXVsdHM9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZXMpe29iamVjdD1PYmplY3Qob2JqZWN0KTt2YXIgaW5kZXg9LTE7dmFyIGxlbmd0aD1zb3VyY2VzLmxlbmd0aDt2YXIgZ3VhcmQ9bGVuZ3RoPjI/c291cmNlc1syXToKdW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKWxlbmd0aD0xO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgc291cmNlPXNvdXJjZXNbaW5kZXhdO3ZhciBwcm9wcz1rZXlzSW4oc291cmNlKTt2YXIgcHJvcHNJbmRleD0tMTt2YXIgcHJvcHNMZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKCsrcHJvcHNJbmRleDxwcm9wc0xlbmd0aCl7dmFyIGtleT1wcm9wc1twcm9wc0luZGV4XTt2YXIgdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWR8fGVxKHZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlvYmplY3Rba2V5XT1zb3VyY2Vba2V5XX19cmV0dXJuIG9iamVjdH0pO3ZhciBkZWZhdWx0c0RlZXA9YmFzZVJlc3QoZnVuY3Rpb24oYXJncyl7YXJncy5wdXNoKHVuZGVmaW5lZCxjdXN0b21EZWZhdWx0c01lcmdlKTtyZXR1cm4gYXBwbHkobWVyZ2VXaXRoLAp1bmRlZmluZWQsYXJncyl9KTtmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCxwcmVkaWNhdGUpe3JldHVybiBiYXNlRmluZEtleShvYmplY3QsZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGJhc2VGb3JPd24pfWZ1bmN0aW9uIGZpbmRMYXN0S2V5KG9iamVjdCxwcmVkaWNhdGUpe3JldHVybiBiYXNlRmluZEtleShvYmplY3QsZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGJhc2VGb3JPd25SaWdodCl9ZnVuY3Rpb24gZm9ySW4ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlRm9yKG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvckluUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlRm9yUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpLGtleXNJbil9ZnVuY3Rpb24gZm9yT3duKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdCYmYmFzZUZvck93bihvYmplY3QsCmdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd25SaWdodChvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfWZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/W106YmFzZUZ1bmN0aW9ucyhvYmplY3Qsa2V5cyhvYmplY3QpKX1mdW5jdGlvbiBmdW5jdGlvbnNJbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/W106YmFzZUZ1bmN0aW9ucyhvYmplY3Qsa2V5c0luKG9iamVjdCkpfWZ1bmN0aW9uIGdldChvYmplY3QscGF0aCxkZWZhdWx0VmFsdWUpe3ZhciByZXN1bHQ9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKTtyZXR1cm4gcmVzdWx0PT09dW5kZWZpbmVkP2RlZmF1bHRWYWx1ZTpyZXN1bHR9ZnVuY3Rpb24gaGFzKG9iamVjdCxwYXRoKXtyZXR1cm4gb2JqZWN0IT1udWxsJiZoYXNQYXRoKG9iamVjdCwKcGF0aCxiYXNlSGFzKX1mdW5jdGlvbiBoYXNJbihvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QscGF0aCxiYXNlSGFzSW4pfXZhciBpbnZlcnQ9Y3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYodmFsdWUhPW51bGwmJnR5cGVvZiB2YWx1ZS50b1N0cmluZyE9ImZ1bmN0aW9uIil2YWx1ZT1uYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtyZXN1bHRbdmFsdWVdPWtleX0sY29uc3RhbnQoaWRlbnRpdHkpKTt2YXIgaW52ZXJ0Qnk9Y3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYodmFsdWUhPW51bGwmJnR5cGVvZiB2YWx1ZS50b1N0cmluZyE9ImZ1bmN0aW9uIil2YWx1ZT1uYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCx2YWx1ZSkpcmVzdWx0W3ZhbHVlXS5wdXNoKGtleSk7ZWxzZSByZXN1bHRbdmFsdWVdPVtrZXldfSwKZ2V0SXRlcmF0ZWUpO3ZhciBpbnZva2U9YmFzZVJlc3QoYmFzZUludm9rZSk7ZnVuY3Rpb24ga2V5cyhvYmplY3Qpe3JldHVybiBpc0FycmF5TGlrZShvYmplY3QpP2FycmF5TGlrZUtleXMob2JqZWN0KTpiYXNlS2V5cyhvYmplY3QpfWZ1bmN0aW9uIGtleXNJbihvYmplY3Qpe3JldHVybiBpc0FycmF5TGlrZShvYmplY3QpP2FycmF5TGlrZUtleXMob2JqZWN0LHRydWUpOmJhc2VLZXlzSW4ob2JqZWN0KX1mdW5jdGlvbiBtYXBLZXlzKG9iamVjdCxpdGVyYXRlZSl7dmFyIHJlc3VsdD17fTtpdGVyYXRlZT1nZXRJdGVyYXRlZShpdGVyYXRlZSwzKTtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtiYXNlQXNzaWduVmFsdWUocmVzdWx0LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpLHZhbHVlKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCxpdGVyYXRlZSl7dmFyIHJlc3VsdD17fTtpdGVyYXRlZT1nZXRJdGVyYXRlZShpdGVyYXRlZSwKMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksaXRlcmF0ZWUodmFsdWUsa2V5LG9iamVjdCkpfSk7cmV0dXJuIHJlc3VsdH12YXIgbWVyZ2U9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCl7YmFzZU1lcmdlKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpfSk7dmFyIG1lcmdlV2l0aD1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIpfSk7dmFyIG9taXQ9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LHBhdGhzKXt2YXIgcmVzdWx0PXt9O2lmKG9iamVjdD09bnVsbClyZXR1cm4gcmVzdWx0O3ZhciBpc0RlZXA9ZmFsc2U7cGF0aHM9YXJyYXlNYXAocGF0aHMsZnVuY3Rpb24ocGF0aCl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7aXNEZWVwfHwKKGlzRGVlcD1wYXRoLmxlbmd0aD4xKTtyZXR1cm4gcGF0aH0pO2NvcHlPYmplY3Qob2JqZWN0LGdldEFsbEtleXNJbihvYmplY3QpLHJlc3VsdCk7aWYoaXNEZWVwKXJlc3VsdD1iYXNlQ2xvbmUocmVzdWx0LENMT05FX0RFRVBfRkxBR3xDTE9ORV9GTEFUX0ZMQUd8Q0xPTkVfU1lNQk9MU19GTEFHLGN1c3RvbU9taXRDbG9uZSk7dmFyIGxlbmd0aD1wYXRocy5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pYmFzZVVuc2V0KHJlc3VsdCxwYXRoc1tsZW5ndGhdKTtyZXR1cm4gcmVzdWx0fSk7ZnVuY3Rpb24gb21pdEJ5KG9iamVjdCxwcmVkaWNhdGUpe3JldHVybiBwaWNrQnkob2JqZWN0LG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSl9dmFyIHBpY2s9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LHBhdGhzKXtyZXR1cm4gb2JqZWN0PT1udWxsP3t9OmJhc2VQaWNrKG9iamVjdCxwYXRocyl9KTtmdW5jdGlvbiBwaWNrQnkob2JqZWN0LHByZWRpY2F0ZSl7aWYob2JqZWN0PT1udWxsKXJldHVybnt9Owp2YXIgcHJvcHM9YXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksZnVuY3Rpb24ocHJvcCl7cmV0dXJuW3Byb3BdfSk7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSk7cmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LHByb3BzLGZ1bmN0aW9uKHZhbHVlLHBhdGgpe3JldHVybiBwcmVkaWNhdGUodmFsdWUscGF0aFswXSl9KX1mdW5jdGlvbiByZXN1bHQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoO2lmKCFsZW5ndGgpe2xlbmd0aD0xO29iamVjdD11bmRlZmluZWR9d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1vYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFt0b0tleShwYXRoW2luZGV4XSldO2lmKHZhbHVlPT09dW5kZWZpbmVkKXtpbmRleD1sZW5ndGg7dmFsdWU9ZGVmYXVsdFZhbHVlfW9iamVjdD1pc0Z1bmN0aW9uKHZhbHVlKT92YWx1ZS5jYWxsKG9iamVjdCk6CnZhbHVlfXJldHVybiBvYmplY3R9ZnVuY3Rpb24gc2V0KG9iamVjdCxwYXRoLHZhbHVlKXtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlU2V0KG9iamVjdCxwYXRoLHZhbHVlKX1mdW5jdGlvbiBzZXRXaXRoKG9iamVjdCxwYXRoLHZhbHVlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKX12YXIgdG9QYWlycz1jcmVhdGVUb1BhaXJzKGtleXMpO3ZhciB0b1BhaXJzSW49Y3JlYXRlVG9QYWlycyhrZXlzSW4pO2Z1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBpc0Fycj1pc0FycmF5KG9iamVjdCksaXNBcnJMaWtlPWlzQXJyfHxpc0J1ZmZlcihvYmplY3QpfHxpc1R5cGVkQXJyYXkob2JqZWN0KTtpdGVyYXRlZT1nZXRJdGVyYXRlZShpdGVyYXRlZSwKNCk7aWYoYWNjdW11bGF0b3I9PW51bGwpe3ZhciBDdG9yPW9iamVjdCYmb2JqZWN0LmNvbnN0cnVjdG9yO2lmKGlzQXJyTGlrZSlhY2N1bXVsYXRvcj1pc0Fycj9uZXcgQ3RvcjpbXTtlbHNlIGlmKGlzT2JqZWN0KG9iamVjdCkpYWNjdW11bGF0b3I9aXNGdW5jdGlvbihDdG9yKT9iYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKTp7fTtlbHNlIGFjY3VtdWxhdG9yPXt9fShpc0Fyckxpa2U/YXJyYXlFYWNoOmJhc2VGb3JPd24pKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxpbmRleCxvYmplY3Qpe3JldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvcix2YWx1ZSxpbmRleCxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIHVuc2V0KG9iamVjdCxwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3RydWU6YmFzZVVuc2V0KG9iamVjdCxwYXRoKX1mdW5jdGlvbiB1cGRhdGUob2JqZWN0LHBhdGgsdXBkYXRlcil7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QsCnBhdGgsY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpKX1mdW5jdGlvbiB1cGRhdGVXaXRoKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlVXBkYXRlKG9iamVjdCxwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSxjdXN0b21pemVyKX1mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VWYWx1ZXMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VWYWx1ZXMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBjbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj11bmRlZmluZWR9aWYodXBwZXIhPT11bmRlZmluZWQpe3VwcGVyPQp0b051bWJlcih1cHBlcik7dXBwZXI9dXBwZXI9PT11cHBlcj91cHBlcjowfWlmKGxvd2VyIT09dW5kZWZpbmVkKXtsb3dlcj10b051bWJlcihsb3dlcik7bG93ZXI9bG93ZXI9PT1sb3dlcj9sb3dlcjowfXJldHVybiBiYXNlQ2xhbXAodG9OdW1iZXIobnVtYmVyKSxsb3dlcix1cHBlcil9ZnVuY3Rpb24gaW5SYW5nZShudW1iZXIsc3RhcnQsZW5kKXtzdGFydD10b0Zpbml0ZShzdGFydCk7aWYoZW5kPT09dW5kZWZpbmVkKXtlbmQ9c3RhcnQ7c3RhcnQ9MH1lbHNlIGVuZD10b0Zpbml0ZShlbmQpO251bWJlcj10b051bWJlcihudW1iZXIpO3JldHVybiBiYXNlSW5SYW5nZShudW1iZXIsc3RhcnQsZW5kKX1mdW5jdGlvbiByYW5kb20obG93ZXIsdXBwZXIsZmxvYXRpbmcpe2lmKGZsb2F0aW5nJiZ0eXBlb2YgZmxvYXRpbmchPSJib29sZWFuIiYmaXNJdGVyYXRlZUNhbGwobG93ZXIsdXBwZXIsZmxvYXRpbmcpKXVwcGVyPWZsb2F0aW5nPXVuZGVmaW5lZDtpZihmbG9hdGluZz09PXVuZGVmaW5lZClpZih0eXBlb2YgdXBwZXI9PQoiYm9vbGVhbiIpe2Zsb2F0aW5nPXVwcGVyO3VwcGVyPXVuZGVmaW5lZH1lbHNlIGlmKHR5cGVvZiBsb3dlcj09ImJvb2xlYW4iKXtmbG9hdGluZz1sb3dlcjtsb3dlcj11bmRlZmluZWR9aWYobG93ZXI9PT11bmRlZmluZWQmJnVwcGVyPT09dW5kZWZpbmVkKXtsb3dlcj0wO3VwcGVyPTF9ZWxzZXtsb3dlcj10b0Zpbml0ZShsb3dlcik7aWYodXBwZXI9PT11bmRlZmluZWQpe3VwcGVyPWxvd2VyO2xvd2VyPTB9ZWxzZSB1cHBlcj10b0Zpbml0ZSh1cHBlcil9aWYobG93ZXI+dXBwZXIpe3ZhciB0ZW1wPWxvd2VyO2xvd2VyPXVwcGVyO3VwcGVyPXRlbXB9aWYoZmxvYXRpbmd8fGxvd2VyJTF8fHVwcGVyJTEpe3ZhciByYW5kPW5hdGl2ZVJhbmRvbSgpO3JldHVybiBuYXRpdmVNaW4obG93ZXIrcmFuZCoodXBwZXItbG93ZXIrZnJlZVBhcnNlRmxvYXQoIjFlLSIrKChyYW5kKyIiKS5sZW5ndGgtMSkpKSx1cHBlcil9cmV0dXJuIGJhc2VSYW5kb20obG93ZXIsdXBwZXIpfXZhciBjYW1lbENhc2U9CmNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3dvcmQ9d29yZC50b0xvd2VyQ2FzZSgpO3JldHVybiByZXN1bHQrKGluZGV4P2NhcGl0YWxpemUod29yZCk6d29yZCl9KTtmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZyl7cmV0dXJuIHVwcGVyRmlyc3QodG9TdHJpbmcoc3RyaW5nKS50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBkZWJ1cnIoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZzdHJpbmcucmVwbGFjZShyZUxhdGluLGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywiIil9ZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLHRhcmdldCxwb3NpdGlvbil7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7dGFyZ2V0PWJhc2VUb1N0cmluZyh0YXJnZXQpO3ZhciBsZW5ndGg9c3RyaW5nLmxlbmd0aDtwb3NpdGlvbj1wb3NpdGlvbj09PXVuZGVmaW5lZD9sZW5ndGg6YmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksCjAsbGVuZ3RoKTt2YXIgZW5kPXBvc2l0aW9uO3Bvc2l0aW9uLT10YXJnZXQubGVuZ3RoO3JldHVybiBwb3NpdGlvbj49MCYmc3RyaW5nLnNsaWNlKHBvc2l0aW9uLGVuZCk9PXRhcmdldH1mdW5jdGlvbiBlc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1VuZXNjYXBlZEh0bWwudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCxlc2NhcGVIdG1sQ2hhcik6c3RyaW5nfWZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmcpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3JldHVybiBzdHJpbmcmJnJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZyk/c3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCJcXCRceDI2Iik6c3RyaW5nfXZhciBrZWJhYkNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/Ii0iOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTsKdmFyIGxvd2VyQ2FzZT1jcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXtyZXR1cm4gcmVzdWx0KyhpbmRleD8iICI6IiIpK3dvcmQudG9Mb3dlckNhc2UoKX0pO3ZhciBsb3dlckZpcnN0PWNyZWF0ZUNhc2VGaXJzdCgidG9Mb3dlckNhc2UiKTtmdW5jdGlvbiBwYWQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7bGVuZ3RoPXRvSW50ZWdlcihsZW5ndGgpO3ZhciBzdHJMZW5ndGg9bGVuZ3RoP3N0cmluZ1NpemUoc3RyaW5nKTowO2lmKCFsZW5ndGh8fHN0ckxlbmd0aD49bGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIG1pZD0obGVuZ3RoLXN0ckxlbmd0aCkvMjtyZXR1cm4gY3JlYXRlUGFkZGluZyhuYXRpdmVGbG9vcihtaWQpLGNoYXJzKStzdHJpbmcrY3JlYXRlUGFkZGluZyhuYXRpdmVDZWlsKG1pZCksY2hhcnMpfWZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTsKbGVuZ3RoPXRvSW50ZWdlcihsZW5ndGgpO3ZhciBzdHJMZW5ndGg9bGVuZ3RoP3N0cmluZ1NpemUoc3RyaW5nKTowO3JldHVybiBsZW5ndGgmJnN0ckxlbmd0aDxsZW5ndGg/c3RyaW5nK2NyZWF0ZVBhZGRpbmcobGVuZ3RoLXN0ckxlbmd0aCxjaGFycyk6c3RyaW5nfWZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP2NyZWF0ZVBhZGRpbmcobGVuZ3RoLXN0ckxlbmd0aCxjaGFycykrc3RyaW5nOnN0cmluZ31mdW5jdGlvbiBwYXJzZUludChzdHJpbmcscmFkaXgsZ3VhcmQpe2lmKGd1YXJkfHxyYWRpeD09bnVsbClyYWRpeD0wO2Vsc2UgaWYocmFkaXgpcmFkaXg9K3JhZGl4O3JldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsCiIiKSxyYWRpeHx8MCl9ZnVuY3Rpb24gcmVwZWF0KHN0cmluZyxuLGd1YXJkKXtpZihndWFyZD9pc0l0ZXJhdGVlQ2FsbChzdHJpbmcsbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVJlcGVhdCh0b1N0cmluZyhzdHJpbmcpLG4pfWZ1bmN0aW9uIHJlcGxhY2UoKXt2YXIgYXJncz1hcmd1bWVudHMsc3RyaW5nPXRvU3RyaW5nKGFyZ3NbMF0pO3JldHVybiBhcmdzLmxlbmd0aDwzP3N0cmluZzpzdHJpbmcucmVwbGFjZShhcmdzWzFdLGFyZ3NbMl0pfXZhciBzbmFrZUNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/Il8iOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBzcGxpdChzdHJpbmcsc2VwYXJhdG9yLGxpbWl0KXtpZihsaW1pdCYmdHlwZW9mIGxpbWl0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCkpc2VwYXJhdG9yPQpsaW1pdD11bmRlZmluZWQ7bGltaXQ9bGltaXQ9PT11bmRlZmluZWQ/TUFYX0FSUkFZX0xFTkdUSDpsaW1pdD4+PjA7aWYoIWxpbWl0KXJldHVybltdO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2lmKHN0cmluZyYmKHR5cGVvZiBzZXBhcmF0b3I9PSJzdHJpbmcifHxzZXBhcmF0b3IhPW51bGwmJiFpc1JlZ0V4cChzZXBhcmF0b3IpKSl7c2VwYXJhdG9yPWJhc2VUb1N0cmluZyhzZXBhcmF0b3IpO2lmKCFzZXBhcmF0b3ImJmhhc1VuaWNvZGUoc3RyaW5nKSlyZXR1cm4gY2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkoc3RyaW5nKSwwLGxpbWl0KX1yZXR1cm4gc3RyaW5nLnNwbGl0KHNlcGFyYXRvcixsaW1pdCl9dmFyIHN0YXJ0Q2FzZT1jcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXtyZXR1cm4gcmVzdWx0KyhpbmRleD8iICI6IiIpK3VwcGVyRmlyc3Qod29yZCl9KTtmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz0KdG9TdHJpbmcoc3RyaW5nKTtwb3NpdGlvbj1wb3NpdGlvbj09bnVsbD8wOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLDAsc3RyaW5nLmxlbmd0aCk7dGFyZ2V0PWJhc2VUb1N0cmluZyh0YXJnZXQpO3JldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24scG9zaXRpb24rdGFyZ2V0Lmxlbmd0aCk9PXRhcmdldH1mdW5jdGlvbiB0ZW1wbGF0ZShzdHJpbmcsb3B0aW9ucyxndWFyZCl7dmFyIHNldHRpbmdzPWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsb3B0aW9ucyxndWFyZCkpb3B0aW9ucz11bmRlZmluZWQ7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7b3B0aW9ucz1hc3NpZ25JbldpdGgoe30sb3B0aW9ucyxzZXR0aW5ncyxjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTt2YXIgaW1wb3J0cz1hc3NpZ25JbldpdGgoe30sb3B0aW9ucy5pbXBvcnRzLHNldHRpbmdzLmltcG9ydHMsY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksaW1wb3J0c0tleXM9CmtleXMoaW1wb3J0cyksaW1wb3J0c1ZhbHVlcz1iYXNlVmFsdWVzKGltcG9ydHMsaW1wb3J0c0tleXMpO3ZhciBpc0VzY2FwaW5nLGlzRXZhbHVhdGluZyxpbmRleD0wLGludGVycG9sYXRlPW9wdGlvbnMuaW50ZXJwb2xhdGV8fHJlTm9NYXRjaCxzb3VyY2U9Il9fcCArXHgzZCAnIjt2YXIgcmVEZWxpbWl0ZXJzPVJlZ0V4cCgob3B0aW9ucy5lc2NhcGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8IitpbnRlcnBvbGF0ZS5zb3VyY2UrInwiKyhpbnRlcnBvbGF0ZT09PXJlSW50ZXJwb2xhdGU/cmVFc1RlbXBsYXRlOnJlTm9NYXRjaCkuc291cmNlKyJ8Iisob3B0aW9ucy5ldmFsdWF0ZXx8cmVOb01hdGNoKS5zb3VyY2UrInwkIiwiZyIpO3ZhciBzb3VyY2VVUkw9Ii8vIyBzb3VyY2VVUkxceDNkIisoInNvdXJjZVVSTCJpbiBvcHRpb25zP29wdGlvbnMuc291cmNlVVJMOiJsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWyIrICsrdGVtcGxhdGVDb3VudGVyKyJdIikrIlxuIjtzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsCmZ1bmN0aW9uKG1hdGNoLGVzY2FwZVZhbHVlLGludGVycG9sYXRlVmFsdWUsZXNUZW1wbGF0ZVZhbHVlLGV2YWx1YXRlVmFsdWUsb2Zmc2V0KXtpbnRlcnBvbGF0ZVZhbHVlfHwoaW50ZXJwb2xhdGVWYWx1ZT1lc1RlbXBsYXRlVmFsdWUpO3NvdXJjZSs9c3RyaW5nLnNsaWNlKGluZGV4LG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZyxlc2NhcGVTdHJpbmdDaGFyKTtpZihlc2NhcGVWYWx1ZSl7aXNFc2NhcGluZz10cnVlO3NvdXJjZSs9IicgK1xuX19lKCIrZXNjYXBlVmFsdWUrIikgK1xuJyJ9aWYoZXZhbHVhdGVWYWx1ZSl7aXNFdmFsdWF0aW5nPXRydWU7c291cmNlKz0iJztcbiIrZXZhbHVhdGVWYWx1ZSsiO1xuX19wICtceDNkICcifWlmKGludGVycG9sYXRlVmFsdWUpc291cmNlKz0iJyArXG4oKF9fdCBceDNkICgiK2ludGVycG9sYXRlVmFsdWUrIikpIFx4M2RceDNkIG51bGwgPyAnJyA6IF9fdCkgK1xuJyI7aW5kZXg9b2Zmc2V0K21hdGNoLmxlbmd0aDtyZXR1cm4gbWF0Y2h9KTsKc291cmNlKz0iJztcbiI7dmFyIHZhcmlhYmxlPW9wdGlvbnMudmFyaWFibGU7aWYoIXZhcmlhYmxlKXNvdXJjZT0id2l0aCAob2JqKSB7XG4iK3NvdXJjZSsiXG59XG4iO3NvdXJjZT0oaXNFdmFsdWF0aW5nP3NvdXJjZS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCIiKTpzb3VyY2UpLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwiJDEiKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdUcmFpbGluZywiJDE7Iik7c291cmNlPSJmdW5jdGlvbigiKyh2YXJpYWJsZXx8Im9iaiIpKyIpIHtcbiIrKHZhcmlhYmxlPyIiOiJvYmogfHwgKG9iaiBceDNkIHt9KTtcbiIpKyJ2YXIgX190LCBfX3AgXHgzZCAnJyIrKGlzRXNjYXBpbmc/IiwgX19lIFx4M2QgXy5lc2NhcGUiOiIiKSsoaXNFdmFsdWF0aW5nPyIsIF9faiBceDNkIEFycmF5LnByb3RvdHlwZS5qb2luO1xuIisiZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArXHgzZCBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XG4iOiI7XG4iKStzb3VyY2UrCiJyZXR1cm4gX19wXG59Ijt2YXIgcmVzdWx0PWF0dGVtcHQoZnVuY3Rpb24oKXtyZXR1cm4gRnVuY3Rpb24oaW1wb3J0c0tleXMsc291cmNlVVJMKyJyZXR1cm4gIitzb3VyY2UpLmFwcGx5KHVuZGVmaW5lZCxpbXBvcnRzVmFsdWVzKX0pO3Jlc3VsdC5zb3VyY2U9c291cmNlO2lmKGlzRXJyb3IocmVzdWx0KSl0aHJvdyByZXN1bHQ7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0b0xvd2VyKHZhbHVlKXtyZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdG9VcHBlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIHRyaW0oc3RyaW5nLGNoYXJzLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJihndWFyZHx8Y2hhcnM9PT11bmRlZmluZWQpKXJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW0sIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzsKdmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGNoclN5bWJvbHM9c3RyaW5nVG9BcnJheShjaGFycyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scyksZW5kPWNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scyxjaHJTeW1ib2xzKSsxO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCxlbmQpLmpvaW4oIiIpfWZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLGNoYXJzLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJihndWFyZHx8Y2hhcnM9PT11bmRlZmluZWQpKXJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1FbmQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksZW5kPWNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scyxzdHJpbmdUb0FycmF5KGNoYXJzKSkrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsCjAsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltU3RhcnQoc3RyaW5nLGNoYXJzLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJihndWFyZHx8Y2hhcnM9PT11bmRlZmluZWQpKXJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1TdGFydCwiIik7aWYoIXN0cmluZ3x8IShjaGFycz1iYXNlVG9TdHJpbmcoY2hhcnMpKSlyZXR1cm4gc3RyaW5nO3ZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxzdGFydD1jaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scyxzdHJpbmdUb0FycmF5KGNoYXJzKSk7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLHN0YXJ0KS5qb2luKCIiKX1mdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsb3B0aW9ucyl7dmFyIGxlbmd0aD1ERUZBVUxUX1RSVU5DX0xFTkdUSCxvbWlzc2lvbj1ERUZBVUxUX1RSVU5DX09NSVNTSU9OO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXt2YXIgc2VwYXJhdG9yPSJzZXBhcmF0b3IiaW4gb3B0aW9ucz8Kb3B0aW9ucy5zZXBhcmF0b3I6c2VwYXJhdG9yO2xlbmd0aD0ibGVuZ3RoImluIG9wdGlvbnM/dG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKTpsZW5ndGg7b21pc3Npb249Im9taXNzaW9uImluIG9wdGlvbnM/YmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pOm9taXNzaW9ufXN0cmluZz10b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJMZW5ndGg9c3RyaW5nLmxlbmd0aDtpZihoYXNVbmljb2RlKHN0cmluZykpe3ZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKTtzdHJMZW5ndGg9c3RyU3ltYm9scy5sZW5ndGh9aWYobGVuZ3RoPj1zdHJMZW5ndGgpcmV0dXJuIHN0cmluZzt2YXIgZW5kPWxlbmd0aC1zdHJpbmdTaXplKG9taXNzaW9uKTtpZihlbmQ8MSlyZXR1cm4gb21pc3Npb247dmFyIHJlc3VsdD1zdHJTeW1ib2xzP2Nhc3RTbGljZShzdHJTeW1ib2xzLDAsZW5kKS5qb2luKCIiKTpzdHJpbmcuc2xpY2UoMCxlbmQpO2lmKHNlcGFyYXRvcj09PXVuZGVmaW5lZClyZXR1cm4gcmVzdWx0KwpvbWlzc2lvbjtpZihzdHJTeW1ib2xzKWVuZCs9cmVzdWx0Lmxlbmd0aC1lbmQ7aWYoaXNSZWdFeHAoc2VwYXJhdG9yKSl7aWYoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpe3ZhciBtYXRjaCxzdWJzdHJpbmc9cmVzdWx0O2lmKCFzZXBhcmF0b3IuZ2xvYmFsKXNlcGFyYXRvcj1SZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSx0b1N0cmluZyhyZUZsYWdzLmV4ZWMoc2VwYXJhdG9yKSkrImciKTtzZXBhcmF0b3IubGFzdEluZGV4PTA7d2hpbGUobWF0Y2g9c2VwYXJhdG9yLmV4ZWMoc3Vic3RyaW5nKSl2YXIgbmV3RW5kPW1hdGNoLmluZGV4O3Jlc3VsdD1yZXN1bHQuc2xpY2UoMCxuZXdFbmQ9PT11bmRlZmluZWQ/ZW5kOm5ld0VuZCl9fWVsc2UgaWYoc3RyaW5nLmluZGV4T2YoYmFzZVRvU3RyaW5nKHNlcGFyYXRvciksZW5kKSE9ZW5kKXt2YXIgaW5kZXg9cmVzdWx0Lmxhc3RJbmRleE9mKHNlcGFyYXRvcik7aWYoaW5kZXg+LTEpcmVzdWx0PXJlc3VsdC5zbGljZSgwLGluZGV4KX1yZXR1cm4gcmVzdWx0KwpvbWlzc2lvbn1mdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3JldHVybiBzdHJpbmcmJnJlSGFzRXNjYXBlZEh0bWwudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsdW5lc2NhcGVIdG1sQ2hhcik6c3RyaW5nfXZhciB1cHBlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvVXBwZXJDYXNlKCl9KTt2YXIgdXBwZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvVXBwZXJDYXNlIik7ZnVuY3Rpb24gd29yZHMoc3RyaW5nLHBhdHRlcm4sZ3VhcmQpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3BhdHRlcm49Z3VhcmQ/dW5kZWZpbmVkOnBhdHRlcm47aWYocGF0dGVybj09PXVuZGVmaW5lZClyZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKT91bmljb2RlV29yZHMoc3RyaW5nKTphc2NpaVdvcmRzKHN0cmluZyk7cmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKXx8CltdfXZhciBhdHRlbXB0PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsYXJncyl7dHJ5e3JldHVybiBhcHBseShmdW5jLHVuZGVmaW5lZCxhcmdzKX1jYXRjaChlKXtyZXR1cm4gaXNFcnJvcihlKT9lOm5ldyBFcnJvcihlKX19KTt2YXIgYmluZEFsbD1mbGF0UmVzdChmdW5jdGlvbihvYmplY3QsbWV0aG9kTmFtZXMpe2FycmF5RWFjaChtZXRob2ROYW1lcyxmdW5jdGlvbihrZXkpe2tleT10b0tleShrZXkpO2Jhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LGJpbmQob2JqZWN0W2tleV0sb2JqZWN0KSl9KTtyZXR1cm4gb2JqZWN0fSk7ZnVuY3Rpb24gY29uZChwYWlycyl7dmFyIGxlbmd0aD1wYWlycz09bnVsbD8wOnBhaXJzLmxlbmd0aCx0b0l0ZXJhdGVlPWdldEl0ZXJhdGVlKCk7cGFpcnM9IWxlbmd0aD9bXTphcnJheU1hcChwYWlycyxmdW5jdGlvbihwYWlyKXtpZih0eXBlb2YgcGFpclsxXSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuW3RvSXRlcmF0ZWUocGFpclswXSksCnBhaXJbMV1dfSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciBpbmRleD0tMTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHBhaXI9cGFpcnNbaW5kZXhdO2lmKGFwcGx5KHBhaXJbMF0sdGhpcyxhcmdzKSlyZXR1cm4gYXBwbHkocGFpclsxXSx0aGlzLGFyZ3MpfX0pfWZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSl7cmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdmFsdWV9fWZ1bmN0aW9uIGRlZmF1bHRUbyh2YWx1ZSxkZWZhdWx0VmFsdWUpe3JldHVybiB2YWx1ZT09bnVsbHx8dmFsdWUhPT12YWx1ZT9kZWZhdWx0VmFsdWU6dmFsdWV9dmFyIGZsb3c9Y3JlYXRlRmxvdygpO3ZhciBmbG93UmlnaHQ9Y3JlYXRlRmxvdyh0cnVlKTtmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSl7cmV0dXJuIHZhbHVlfWZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpe3JldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmM9PQoiZnVuY3Rpb24iP2Z1bmM6YmFzZUNsb25lKGZ1bmMsQ0xPTkVfREVFUF9GTEFHKSl9ZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2Upe3JldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtyZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLGJhc2VDbG9uZShzcmNWYWx1ZSxDTE9ORV9ERUVQX0ZMQUcpKX12YXIgbWV0aG9kPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl9fSk7dmFyIG1ldGhvZE9mPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxhcmdzKXtyZXR1cm4gZnVuY3Rpb24ocGF0aCl7cmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl9fSk7ZnVuY3Rpb24gbWl4aW4ob2JqZWN0LHNvdXJjZSxvcHRpb25zKXt2YXIgcHJvcHM9a2V5cyhzb3VyY2UpLAptZXRob2ROYW1lcz1iYXNlRnVuY3Rpb25zKHNvdXJjZSxwcm9wcyk7aWYob3B0aW9ucz09bnVsbCYmIShpc09iamVjdChzb3VyY2UpJiYobWV0aG9kTmFtZXMubGVuZ3RofHwhcHJvcHMubGVuZ3RoKSkpe29wdGlvbnM9c291cmNlO3NvdXJjZT1vYmplY3Q7b2JqZWN0PXRoaXM7bWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2Usa2V5cyhzb3VyY2UpKX12YXIgY2hhaW49IShpc09iamVjdChvcHRpb25zKSYmImNoYWluImluIG9wdGlvbnMpfHwhIW9wdGlvbnMuY2hhaW4saXNGdW5jPWlzRnVuY3Rpb24ob2JqZWN0KTthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24obWV0aG9kTmFtZSl7dmFyIGZ1bmM9c291cmNlW21ldGhvZE5hbWVdO29iamVjdFttZXRob2ROYW1lXT1mdW5jO2lmKGlzRnVuYylvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fO2lmKGNoYWlufHxjaGFpbkFsbCl7dmFyIHJlc3VsdD0Kb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLGFjdGlvbnM9cmVzdWx0Ll9fYWN0aW9uc19fPWNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTthY3Rpb25zLnB1c2goeyJmdW5jIjpmdW5jLCJhcmdzIjphcmd1bWVudHMsInRoaXNBcmciOm9iamVjdH0pO3Jlc3VsdC5fX2NoYWluX189Y2hhaW5BbGw7cmV0dXJuIHJlc3VsdH1yZXR1cm4gZnVuYy5hcHBseShvYmplY3QsYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfX0pO3JldHVybiBvYmplY3R9ZnVuY3Rpb24gbm9Db25mbGljdCgpe2lmKHJvb3QuXz09PXRoaXMpcm9vdC5fPW9sZERhc2g7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gbm9vcCgpe31mdW5jdGlvbiBudGhBcmcobil7bj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3JldHVybiBiYXNlTnRoKGFyZ3Msbil9KX12YXIgb3Zlcj1jcmVhdGVPdmVyKGFycmF5TWFwKTt2YXIgb3ZlckV2ZXJ5PWNyZWF0ZU92ZXIoYXJyYXlFdmVyeSk7CnZhciBvdmVyU29tZT1jcmVhdGVPdmVyKGFycmF5U29tZSk7ZnVuY3Rpb24gcHJvcGVydHkocGF0aCl7cmV0dXJuIGlzS2V5KHBhdGgpP2Jhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSk6YmFzZVByb3BlcnR5RGVlcChwYXRoKX1mdW5jdGlvbiBwcm9wZXJ0eU9mKG9iamVjdCl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOmJhc2VHZXQob2JqZWN0LHBhdGgpfX12YXIgcmFuZ2U9Y3JlYXRlUmFuZ2UoKTt2YXIgcmFuZ2VSaWdodD1jcmVhdGVSYW5nZSh0cnVlKTtmdW5jdGlvbiBzdHViQXJyYXkoKXtyZXR1cm5bXX1mdW5jdGlvbiBzdHViRmFsc2UoKXtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gc3R1Yk9iamVjdCgpe3JldHVybnt9fWZ1bmN0aW9uIHN0dWJTdHJpbmcoKXtyZXR1cm4iIn1mdW5jdGlvbiBzdHViVHJ1ZSgpe3JldHVybiB0cnVlfWZ1bmN0aW9uIHRpbWVzKG4saXRlcmF0ZWUpe249dG9JbnRlZ2VyKG4pO2lmKG48MXx8bj5NQVhfU0FGRV9JTlRFR0VSKXJldHVybltdOwp2YXIgaW5kZXg9TUFYX0FSUkFZX0xFTkdUSCxsZW5ndGg9bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO24tPU1BWF9BUlJBWV9MRU5HVEg7dmFyIHJlc3VsdD1iYXNlVGltZXMobGVuZ3RoLGl0ZXJhdGVlKTt3aGlsZSgrK2luZGV4PG4paXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9QYXRoKHZhbHVlKXtpZihpc0FycmF5KHZhbHVlKSlyZXR1cm4gYXJyYXlNYXAodmFsdWUsdG9LZXkpO3JldHVybiBpc1N5bWJvbCh2YWx1ZSk/W3ZhbHVlXTpjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpfWZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCl7dmFyIGlkPSsraWRDb3VudGVyO3JldHVybiB0b1N0cmluZyhwcmVmaXgpK2lkfXZhciBhZGQ9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihhdWdlbmQsYWRkZW5kKXtyZXR1cm4gYXVnZW5kK2FkZGVuZH0sMCk7dmFyIGNlaWw9Y3JlYXRlUm91bmQoImNlaWwiKTsKdmFyIGRpdmlkZT1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLGRpdmlzb3Ipe3JldHVybiBkaXZpZGVuZC9kaXZpc29yfSwxKTt2YXIgZmxvb3I9Y3JlYXRlUm91bmQoImZsb29yIik7ZnVuY3Rpb24gbWF4KGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksaWRlbnRpdHksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWF4QnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VFeHRyZW11bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSxiYXNlR3QpOnVuZGVmaW5lZH1mdW5jdGlvbiBtZWFuKGFycmF5KXtyZXR1cm4gYmFzZU1lYW4oYXJyYXksaWRlbnRpdHkpfWZ1bmN0aW9uIG1lYW5CeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBtaW4oYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoPwpiYXNlRXh0cmVtdW0oYXJyYXksaWRlbnRpdHksYmFzZUx0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWluQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VFeHRyZW11bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSxiYXNlTHQpOnVuZGVmaW5lZH12YXIgbXVsdGlwbHk9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLG11bHRpcGxpY2FuZCl7cmV0dXJuIG11bHRpcGxpZXIqbXVsdGlwbGljYW5kfSwxKTt2YXIgcm91bmQ9Y3JlYXRlUm91bmQoInJvdW5kIik7dmFyIHN1YnRyYWN0PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obWludWVuZCxzdWJ0cmFoZW5kKXtyZXR1cm4gbWludWVuZC1zdWJ0cmFoZW5kfSwwKTtmdW5jdGlvbiBzdW0oYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VTdW0oYXJyYXksaWRlbnRpdHkpOjB9ZnVuY3Rpb24gc3VtQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmCmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTowfWxvZGFzaC5hZnRlcj1hZnRlcjtsb2Rhc2guYXJ5PWFyeTtsb2Rhc2guYXNzaWduPWFzc2lnbjtsb2Rhc2guYXNzaWduSW49YXNzaWduSW47bG9kYXNoLmFzc2lnbkluV2l0aD1hc3NpZ25JbldpdGg7bG9kYXNoLmFzc2lnbldpdGg9YXNzaWduV2l0aDtsb2Rhc2guYXQ9YXQ7bG9kYXNoLmJlZm9yZT1iZWZvcmU7bG9kYXNoLmJpbmQ9YmluZDtsb2Rhc2guYmluZEFsbD1iaW5kQWxsO2xvZGFzaC5iaW5kS2V5PWJpbmRLZXk7bG9kYXNoLmNhc3RBcnJheT1jYXN0QXJyYXk7bG9kYXNoLmNoYWluPWNoYWluO2xvZGFzaC5jaHVuaz1jaHVuaztsb2Rhc2guY29tcGFjdD1jb21wYWN0O2xvZGFzaC5jb25jYXQ9Y29uY2F0O2xvZGFzaC5jb25kPWNvbmQ7bG9kYXNoLmNvbmZvcm1zPWNvbmZvcm1zO2xvZGFzaC5jb25zdGFudD1jb25zdGFudDtsb2Rhc2guY291bnRCeT1jb3VudEJ5O2xvZGFzaC5jcmVhdGU9CmNyZWF0ZTtsb2Rhc2guY3Vycnk9Y3Vycnk7bG9kYXNoLmN1cnJ5UmlnaHQ9Y3VycnlSaWdodDtsb2Rhc2guZGVib3VuY2U9ZGVib3VuY2U7bG9kYXNoLmRlZmF1bHRzPWRlZmF1bHRzO2xvZGFzaC5kZWZhdWx0c0RlZXA9ZGVmYXVsdHNEZWVwO2xvZGFzaC5kZWZlcj1kZWZlcjtsb2Rhc2guZGVsYXk9ZGVsYXk7bG9kYXNoLmRpZmZlcmVuY2U9ZGlmZmVyZW5jZTtsb2Rhc2guZGlmZmVyZW5jZUJ5PWRpZmZlcmVuY2VCeTtsb2Rhc2guZGlmZmVyZW5jZVdpdGg9ZGlmZmVyZW5jZVdpdGg7bG9kYXNoLmRyb3A9ZHJvcDtsb2Rhc2guZHJvcFJpZ2h0PWRyb3BSaWdodDtsb2Rhc2guZHJvcFJpZ2h0V2hpbGU9ZHJvcFJpZ2h0V2hpbGU7bG9kYXNoLmRyb3BXaGlsZT1kcm9wV2hpbGU7bG9kYXNoLmZpbGw9ZmlsbDtsb2Rhc2guZmlsdGVyPWZpbHRlcjtsb2Rhc2guZmxhdE1hcD1mbGF0TWFwO2xvZGFzaC5mbGF0TWFwRGVlcD1mbGF0TWFwRGVlcDtsb2Rhc2guZmxhdE1hcERlcHRoPWZsYXRNYXBEZXB0aDsKbG9kYXNoLmZsYXR0ZW49ZmxhdHRlbjtsb2Rhc2guZmxhdHRlbkRlZXA9ZmxhdHRlbkRlZXA7bG9kYXNoLmZsYXR0ZW5EZXB0aD1mbGF0dGVuRGVwdGg7bG9kYXNoLmZsaXA9ZmxpcDtsb2Rhc2guZmxvdz1mbG93O2xvZGFzaC5mbG93UmlnaHQ9Zmxvd1JpZ2h0O2xvZGFzaC5mcm9tUGFpcnM9ZnJvbVBhaXJzO2xvZGFzaC5mdW5jdGlvbnM9ZnVuY3Rpb25zO2xvZGFzaC5mdW5jdGlvbnNJbj1mdW5jdGlvbnNJbjtsb2Rhc2guZ3JvdXBCeT1ncm91cEJ5O2xvZGFzaC5pbml0aWFsPWluaXRpYWw7bG9kYXNoLmludGVyc2VjdGlvbj1pbnRlcnNlY3Rpb247bG9kYXNoLmludGVyc2VjdGlvbkJ5PWludGVyc2VjdGlvbkJ5O2xvZGFzaC5pbnRlcnNlY3Rpb25XaXRoPWludGVyc2VjdGlvbldpdGg7bG9kYXNoLmludmVydD1pbnZlcnQ7bG9kYXNoLmludmVydEJ5PWludmVydEJ5O2xvZGFzaC5pbnZva2VNYXA9aW52b2tlTWFwO2xvZGFzaC5pdGVyYXRlZT1pdGVyYXRlZTtsb2Rhc2gua2V5Qnk9CmtleUJ5O2xvZGFzaC5rZXlzPWtleXM7bG9kYXNoLmtleXNJbj1rZXlzSW47bG9kYXNoLm1hcD1tYXA7bG9kYXNoLm1hcEtleXM9bWFwS2V5cztsb2Rhc2gubWFwVmFsdWVzPW1hcFZhbHVlcztsb2Rhc2gubWF0Y2hlcz1tYXRjaGVzO2xvZGFzaC5tYXRjaGVzUHJvcGVydHk9bWF0Y2hlc1Byb3BlcnR5O2xvZGFzaC5tZW1vaXplPW1lbW9pemU7bG9kYXNoLm1lcmdlPW1lcmdlO2xvZGFzaC5tZXJnZVdpdGg9bWVyZ2VXaXRoO2xvZGFzaC5tZXRob2Q9bWV0aG9kO2xvZGFzaC5tZXRob2RPZj1tZXRob2RPZjtsb2Rhc2gubWl4aW49bWl4aW47bG9kYXNoLm5lZ2F0ZT1uZWdhdGU7bG9kYXNoLm50aEFyZz1udGhBcmc7bG9kYXNoLm9taXQ9b21pdDtsb2Rhc2gub21pdEJ5PW9taXRCeTtsb2Rhc2gub25jZT1vbmNlO2xvZGFzaC5vcmRlckJ5PW9yZGVyQnk7bG9kYXNoLm92ZXI9b3Zlcjtsb2Rhc2gub3ZlckFyZ3M9b3ZlckFyZ3M7bG9kYXNoLm92ZXJFdmVyeT1vdmVyRXZlcnk7bG9kYXNoLm92ZXJTb21lPQpvdmVyU29tZTtsb2Rhc2gucGFydGlhbD1wYXJ0aWFsO2xvZGFzaC5wYXJ0aWFsUmlnaHQ9cGFydGlhbFJpZ2h0O2xvZGFzaC5wYXJ0aXRpb249cGFydGl0aW9uO2xvZGFzaC5waWNrPXBpY2s7bG9kYXNoLnBpY2tCeT1waWNrQnk7bG9kYXNoLnByb3BlcnR5PXByb3BlcnR5O2xvZGFzaC5wcm9wZXJ0eU9mPXByb3BlcnR5T2Y7bG9kYXNoLnB1bGw9cHVsbDtsb2Rhc2gucHVsbEFsbD1wdWxsQWxsO2xvZGFzaC5wdWxsQWxsQnk9cHVsbEFsbEJ5O2xvZGFzaC5wdWxsQWxsV2l0aD1wdWxsQWxsV2l0aDtsb2Rhc2gucHVsbEF0PXB1bGxBdDtsb2Rhc2gucmFuZ2U9cmFuZ2U7bG9kYXNoLnJhbmdlUmlnaHQ9cmFuZ2VSaWdodDtsb2Rhc2gucmVhcmc9cmVhcmc7bG9kYXNoLnJlamVjdD1yZWplY3Q7bG9kYXNoLnJlbW92ZT1yZW1vdmU7bG9kYXNoLnJlc3Q9cmVzdDtsb2Rhc2gucmV2ZXJzZT1yZXZlcnNlO2xvZGFzaC5zYW1wbGVTaXplPXNhbXBsZVNpemU7bG9kYXNoLnNldD1zZXQ7bG9kYXNoLnNldFdpdGg9CnNldFdpdGg7bG9kYXNoLnNodWZmbGU9c2h1ZmZsZTtsb2Rhc2guc2xpY2U9c2xpY2U7bG9kYXNoLnNvcnRCeT1zb3J0Qnk7bG9kYXNoLnNvcnRlZFVuaXE9c29ydGVkVW5pcTtsb2Rhc2guc29ydGVkVW5pcUJ5PXNvcnRlZFVuaXFCeTtsb2Rhc2guc3BsaXQ9c3BsaXQ7bG9kYXNoLnNwcmVhZD1zcHJlYWQ7bG9kYXNoLnRhaWw9dGFpbDtsb2Rhc2gudGFrZT10YWtlO2xvZGFzaC50YWtlUmlnaHQ9dGFrZVJpZ2h0O2xvZGFzaC50YWtlUmlnaHRXaGlsZT10YWtlUmlnaHRXaGlsZTtsb2Rhc2gudGFrZVdoaWxlPXRha2VXaGlsZTtsb2Rhc2gudGFwPXRhcDtsb2Rhc2gudGhyb3R0bGU9dGhyb3R0bGU7bG9kYXNoLnRocnU9dGhydTtsb2Rhc2gudG9BcnJheT10b0FycmF5O2xvZGFzaC50b1BhaXJzPXRvUGFpcnM7bG9kYXNoLnRvUGFpcnNJbj10b1BhaXJzSW47bG9kYXNoLnRvUGF0aD10b1BhdGg7bG9kYXNoLnRvUGxhaW5PYmplY3Q9dG9QbGFpbk9iamVjdDtsb2Rhc2gudHJhbnNmb3JtPQp0cmFuc2Zvcm07bG9kYXNoLnVuYXJ5PXVuYXJ5O2xvZGFzaC51bmlvbj11bmlvbjtsb2Rhc2gudW5pb25CeT11bmlvbkJ5O2xvZGFzaC51bmlvbldpdGg9dW5pb25XaXRoO2xvZGFzaC51bmlxPXVuaXE7bG9kYXNoLnVuaXFCeT11bmlxQnk7bG9kYXNoLnVuaXFXaXRoPXVuaXFXaXRoO2xvZGFzaC51bnNldD11bnNldDtsb2Rhc2gudW56aXA9dW56aXA7bG9kYXNoLnVuemlwV2l0aD11bnppcFdpdGg7bG9kYXNoLnVwZGF0ZT11cGRhdGU7bG9kYXNoLnVwZGF0ZVdpdGg9dXBkYXRlV2l0aDtsb2Rhc2gudmFsdWVzPXZhbHVlcztsb2Rhc2gudmFsdWVzSW49dmFsdWVzSW47bG9kYXNoLndpdGhvdXQ9d2l0aG91dDtsb2Rhc2gud29yZHM9d29yZHM7bG9kYXNoLndyYXA9d3JhcDtsb2Rhc2gueG9yPXhvcjtsb2Rhc2gueG9yQnk9eG9yQnk7bG9kYXNoLnhvcldpdGg9eG9yV2l0aDtsb2Rhc2guemlwPXppcDtsb2Rhc2guemlwT2JqZWN0PXppcE9iamVjdDtsb2Rhc2guemlwT2JqZWN0RGVlcD0KemlwT2JqZWN0RGVlcDtsb2Rhc2guemlwV2l0aD16aXBXaXRoO2xvZGFzaC5lbnRyaWVzPXRvUGFpcnM7bG9kYXNoLmVudHJpZXNJbj10b1BhaXJzSW47bG9kYXNoLmV4dGVuZD1hc3NpZ25Jbjtsb2Rhc2guZXh0ZW5kV2l0aD1hc3NpZ25JbldpdGg7bWl4aW4obG9kYXNoLGxvZGFzaCk7bG9kYXNoLmFkZD1hZGQ7bG9kYXNoLmF0dGVtcHQ9YXR0ZW1wdDtsb2Rhc2guY2FtZWxDYXNlPWNhbWVsQ2FzZTtsb2Rhc2guY2FwaXRhbGl6ZT1jYXBpdGFsaXplO2xvZGFzaC5jZWlsPWNlaWw7bG9kYXNoLmNsYW1wPWNsYW1wO2xvZGFzaC5jbG9uZT1jbG9uZTtsb2Rhc2guY2xvbmVEZWVwPWNsb25lRGVlcDtsb2Rhc2guY2xvbmVEZWVwV2l0aD1jbG9uZURlZXBXaXRoO2xvZGFzaC5jbG9uZVdpdGg9Y2xvbmVXaXRoO2xvZGFzaC5jb25mb3Jtc1RvPWNvbmZvcm1zVG87bG9kYXNoLmRlYnVycj1kZWJ1cnI7bG9kYXNoLmRlZmF1bHRUbz1kZWZhdWx0VG87bG9kYXNoLmRpdmlkZT1kaXZpZGU7bG9kYXNoLmVuZHNXaXRoPQplbmRzV2l0aDtsb2Rhc2guZXE9ZXE7bG9kYXNoLmVzY2FwZT1lc2NhcGU7bG9kYXNoLmVzY2FwZVJlZ0V4cD1lc2NhcGVSZWdFeHA7bG9kYXNoLmV2ZXJ5PWV2ZXJ5O2xvZGFzaC5maW5kPWZpbmQ7bG9kYXNoLmZpbmRJbmRleD1maW5kSW5kZXg7bG9kYXNoLmZpbmRLZXk9ZmluZEtleTtsb2Rhc2guZmluZExhc3Q9ZmluZExhc3Q7bG9kYXNoLmZpbmRMYXN0SW5kZXg9ZmluZExhc3RJbmRleDtsb2Rhc2guZmluZExhc3RLZXk9ZmluZExhc3RLZXk7bG9kYXNoLmZsb29yPWZsb29yO2xvZGFzaC5mb3JFYWNoPWZvckVhY2g7bG9kYXNoLmZvckVhY2hSaWdodD1mb3JFYWNoUmlnaHQ7bG9kYXNoLmZvckluPWZvckluO2xvZGFzaC5mb3JJblJpZ2h0PWZvckluUmlnaHQ7bG9kYXNoLmZvck93bj1mb3JPd247bG9kYXNoLmZvck93blJpZ2h0PWZvck93blJpZ2h0O2xvZGFzaC5nZXQ9Z2V0O2xvZGFzaC5ndD1ndDtsb2Rhc2guZ3RlPWd0ZTtsb2Rhc2guaGFzPWhhcztsb2Rhc2guaGFzSW49aGFzSW47CmxvZGFzaC5oZWFkPWhlYWQ7bG9kYXNoLmlkZW50aXR5PWlkZW50aXR5O2xvZGFzaC5pbmNsdWRlcz1pbmNsdWRlcztsb2Rhc2guaW5kZXhPZj1pbmRleE9mO2xvZGFzaC5pblJhbmdlPWluUmFuZ2U7bG9kYXNoLmludm9rZT1pbnZva2U7bG9kYXNoLmlzQXJndW1lbnRzPWlzQXJndW1lbnRzO2xvZGFzaC5pc0FycmF5PWlzQXJyYXk7bG9kYXNoLmlzQXJyYXlCdWZmZXI9aXNBcnJheUJ1ZmZlcjtsb2Rhc2guaXNBcnJheUxpa2U9aXNBcnJheUxpa2U7bG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0PWlzQXJyYXlMaWtlT2JqZWN0O2xvZGFzaC5pc0Jvb2xlYW49aXNCb29sZWFuO2xvZGFzaC5pc0J1ZmZlcj1pc0J1ZmZlcjtsb2Rhc2guaXNEYXRlPWlzRGF0ZTtsb2Rhc2guaXNFbGVtZW50PWlzRWxlbWVudDtsb2Rhc2guaXNFbXB0eT1pc0VtcHR5O2xvZGFzaC5pc0VxdWFsPWlzRXF1YWw7bG9kYXNoLmlzRXF1YWxXaXRoPWlzRXF1YWxXaXRoO2xvZGFzaC5pc0Vycm9yPWlzRXJyb3I7bG9kYXNoLmlzRmluaXRlPQppc0Zpbml0ZTtsb2Rhc2guaXNGdW5jdGlvbj1pc0Z1bmN0aW9uO2xvZGFzaC5pc0ludGVnZXI9aXNJbnRlZ2VyO2xvZGFzaC5pc0xlbmd0aD1pc0xlbmd0aDtsb2Rhc2guaXNNYXA9aXNNYXA7bG9kYXNoLmlzTWF0Y2g9aXNNYXRjaDtsb2Rhc2guaXNNYXRjaFdpdGg9aXNNYXRjaFdpdGg7bG9kYXNoLmlzTmFOPWlzTmFOO2xvZGFzaC5pc05hdGl2ZT1pc05hdGl2ZTtsb2Rhc2guaXNOaWw9aXNOaWw7bG9kYXNoLmlzTnVsbD1pc051bGw7bG9kYXNoLmlzTnVtYmVyPWlzTnVtYmVyO2xvZGFzaC5pc09iamVjdD1pc09iamVjdDtsb2Rhc2guaXNPYmplY3RMaWtlPWlzT2JqZWN0TGlrZTtsb2Rhc2guaXNQbGFpbk9iamVjdD1pc1BsYWluT2JqZWN0O2xvZGFzaC5pc1JlZ0V4cD1pc1JlZ0V4cDtsb2Rhc2guaXNTYWZlSW50ZWdlcj1pc1NhZmVJbnRlZ2VyO2xvZGFzaC5pc1NldD1pc1NldDtsb2Rhc2guaXNTdHJpbmc9aXNTdHJpbmc7bG9kYXNoLmlzU3ltYm9sPWlzU3ltYm9sO2xvZGFzaC5pc1R5cGVkQXJyYXk9CmlzVHlwZWRBcnJheTtsb2Rhc2guaXNVbmRlZmluZWQ9aXNVbmRlZmluZWQ7bG9kYXNoLmlzV2Vha01hcD1pc1dlYWtNYXA7bG9kYXNoLmlzV2Vha1NldD1pc1dlYWtTZXQ7bG9kYXNoLmpvaW49am9pbjtsb2Rhc2gua2ViYWJDYXNlPWtlYmFiQ2FzZTtsb2Rhc2gubGFzdD1sYXN0O2xvZGFzaC5sYXN0SW5kZXhPZj1sYXN0SW5kZXhPZjtsb2Rhc2gubG93ZXJDYXNlPWxvd2VyQ2FzZTtsb2Rhc2gubG93ZXJGaXJzdD1sb3dlckZpcnN0O2xvZGFzaC5sdD1sdDtsb2Rhc2gubHRlPWx0ZTtsb2Rhc2gubWF4PW1heDtsb2Rhc2gubWF4Qnk9bWF4Qnk7bG9kYXNoLm1lYW49bWVhbjtsb2Rhc2gubWVhbkJ5PW1lYW5CeTtsb2Rhc2gubWluPW1pbjtsb2Rhc2gubWluQnk9bWluQnk7bG9kYXNoLnN0dWJBcnJheT1zdHViQXJyYXk7bG9kYXNoLnN0dWJGYWxzZT1zdHViRmFsc2U7bG9kYXNoLnN0dWJPYmplY3Q9c3R1Yk9iamVjdDtsb2Rhc2guc3R1YlN0cmluZz1zdHViU3RyaW5nO2xvZGFzaC5zdHViVHJ1ZT0Kc3R1YlRydWU7bG9kYXNoLm11bHRpcGx5PW11bHRpcGx5O2xvZGFzaC5udGg9bnRoO2xvZGFzaC5ub0NvbmZsaWN0PW5vQ29uZmxpY3Q7bG9kYXNoLm5vb3A9bm9vcDtsb2Rhc2gubm93PW5vdztsb2Rhc2gucGFkPXBhZDtsb2Rhc2gucGFkRW5kPXBhZEVuZDtsb2Rhc2gucGFkU3RhcnQ9cGFkU3RhcnQ7bG9kYXNoLnBhcnNlSW50PXBhcnNlSW50O2xvZGFzaC5yYW5kb209cmFuZG9tO2xvZGFzaC5yZWR1Y2U9cmVkdWNlO2xvZGFzaC5yZWR1Y2VSaWdodD1yZWR1Y2VSaWdodDtsb2Rhc2gucmVwZWF0PXJlcGVhdDtsb2Rhc2gucmVwbGFjZT1yZXBsYWNlO2xvZGFzaC5yZXN1bHQ9cmVzdWx0O2xvZGFzaC5yb3VuZD1yb3VuZDtsb2Rhc2gucnVuSW5Db250ZXh0PXJ1bkluQ29udGV4dDtsb2Rhc2guc2FtcGxlPXNhbXBsZTtsb2Rhc2guc2l6ZT1zaXplO2xvZGFzaC5zbmFrZUNhc2U9c25ha2VDYXNlO2xvZGFzaC5zb21lPXNvbWU7bG9kYXNoLnNvcnRlZEluZGV4PXNvcnRlZEluZGV4O2xvZGFzaC5zb3J0ZWRJbmRleEJ5PQpzb3J0ZWRJbmRleEJ5O2xvZGFzaC5zb3J0ZWRJbmRleE9mPXNvcnRlZEluZGV4T2Y7bG9kYXNoLnNvcnRlZExhc3RJbmRleD1zb3J0ZWRMYXN0SW5kZXg7bG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5PXNvcnRlZExhc3RJbmRleEJ5O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhPZj1zb3J0ZWRMYXN0SW5kZXhPZjtsb2Rhc2guc3RhcnRDYXNlPXN0YXJ0Q2FzZTtsb2Rhc2guc3RhcnRzV2l0aD1zdGFydHNXaXRoO2xvZGFzaC5zdWJ0cmFjdD1zdWJ0cmFjdDtsb2Rhc2guc3VtPXN1bTtsb2Rhc2guc3VtQnk9c3VtQnk7bG9kYXNoLnRlbXBsYXRlPXRlbXBsYXRlO2xvZGFzaC50aW1lcz10aW1lcztsb2Rhc2gudG9GaW5pdGU9dG9GaW5pdGU7bG9kYXNoLnRvSW50ZWdlcj10b0ludGVnZXI7bG9kYXNoLnRvTGVuZ3RoPXRvTGVuZ3RoO2xvZGFzaC50b0xvd2VyPXRvTG93ZXI7bG9kYXNoLnRvTnVtYmVyPXRvTnVtYmVyO2xvZGFzaC50b1NhZmVJbnRlZ2VyPXRvU2FmZUludGVnZXI7bG9kYXNoLnRvU3RyaW5nPQp0b1N0cmluZztsb2Rhc2gudG9VcHBlcj10b1VwcGVyO2xvZGFzaC50cmltPXRyaW07bG9kYXNoLnRyaW1FbmQ9dHJpbUVuZDtsb2Rhc2gudHJpbVN0YXJ0PXRyaW1TdGFydDtsb2Rhc2gudHJ1bmNhdGU9dHJ1bmNhdGU7bG9kYXNoLnVuZXNjYXBlPXVuZXNjYXBlO2xvZGFzaC51bmlxdWVJZD11bmlxdWVJZDtsb2Rhc2gudXBwZXJDYXNlPXVwcGVyQ2FzZTtsb2Rhc2gudXBwZXJGaXJzdD11cHBlckZpcnN0O2xvZGFzaC5lYWNoPWZvckVhY2g7bG9kYXNoLmVhY2hSaWdodD1mb3JFYWNoUmlnaHQ7bG9kYXNoLmZpcnN0PWhlYWQ7bWl4aW4obG9kYXNoLGZ1bmN0aW9uKCl7dmFyIHNvdXJjZT17fTtiYXNlRm9yT3duKGxvZGFzaCxmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe2lmKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaC5wcm90b3R5cGUsbWV0aG9kTmFtZSkpc291cmNlW21ldGhvZE5hbWVdPWZ1bmN9KTtyZXR1cm4gc291cmNlfSgpLHsiY2hhaW4iOmZhbHNlfSk7bG9kYXNoLlZFUlNJT049ClZFUlNJT047YXJyYXlFYWNoKFsiYmluZCIsImJpbmRLZXkiLCJjdXJyeSIsImN1cnJ5UmlnaHQiLCJwYXJ0aWFsIiwicGFydGlhbFJpZ2h0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSl7bG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyPWxvZGFzaH0pO2FycmF5RWFjaChbImRyb3AiLCJ0YWtlIl0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKG4pe249bj09PXVuZGVmaW5lZD8xOm5hdGl2ZU1heCh0b0ludGVnZXIobiksMCk7dmFyIHJlc3VsdD10aGlzLl9fZmlsdGVyZWRfXyYmIWluZGV4P25ldyBMYXp5V3JhcHBlcih0aGlzKTp0aGlzLmNsb25lKCk7aWYocmVzdWx0Ll9fZmlsdGVyZWRfXylyZXN1bHQuX190YWtlQ291bnRfXz1uYXRpdmVNaW4obixyZXN1bHQuX190YWtlQ291bnRfXyk7ZWxzZSByZXN1bHQuX192aWV3c19fLnB1c2goeyJzaXplIjpuYXRpdmVNaW4obixNQVhfQVJSQVlfTEVOR1RIKSwKInR5cGUiOm1ldGhvZE5hbWUrKHJlc3VsdC5fX2Rpcl9fPDA/IlJpZ2h0IjoiIil9KTtyZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZSsiUmlnaHQiXT1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5yZXZlcnNlKClbbWV0aG9kTmFtZV0obikucmV2ZXJzZSgpfX0pO2FycmF5RWFjaChbImZpbHRlciIsIm1hcCIsInRha2VXaGlsZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe3ZhciB0eXBlPWluZGV4KzEsaXNGaWx0ZXI9dHlwZT09TEFaWV9GSUxURVJfRkxBR3x8dHlwZT09TEFaWV9XSElMRV9GTEFHO0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihpdGVyYXRlZSl7dmFyIHJlc3VsdD10aGlzLmNsb25lKCk7cmVzdWx0Ll9faXRlcmF0ZWVzX18ucHVzaCh7Iml0ZXJhdGVlIjpnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSwidHlwZSI6dHlwZX0pO3Jlc3VsdC5fX2ZpbHRlcmVkX189cmVzdWx0Ll9fZmlsdGVyZWRfX3x8CmlzRmlsdGVyO3JldHVybiByZXN1bHR9fSk7YXJyYXlFYWNoKFsiaGVhZCIsImxhc3QiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdGFrZU5hbWU9InRha2UiKyhpbmRleD8iUmlnaHQiOiIiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0YWtlTmFtZV0oMSkudmFsdWUoKVswXX19KTthcnJheUVhY2goWyJpbml0aWFsIiwidGFpbCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe3ZhciBkcm9wTmFtZT0iZHJvcCIrKGluZGV4PyIiOiJSaWdodCIpO0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZmlsdGVyZWRfXz9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpc1tkcm9wTmFtZV0oMSl9fSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbXBhY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZD0KZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIocHJlZGljYXRlKS5oZWFkKCl9O0xhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdD1mdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSl9O0xhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXA9YmFzZVJlc3QoZnVuY3Rpb24ocGF0aCxhcmdzKXtpZih0eXBlb2YgcGF0aD09ImZ1bmN0aW9uIilyZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pfSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLmZpbHRlcihuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oc3RhcnQsZW5kKXtzdGFydD10b0ludGVnZXIoc3RhcnQpOwp2YXIgcmVzdWx0PXRoaXM7aWYocmVzdWx0Ll9fZmlsdGVyZWRfXyYmKHN0YXJ0PjB8fGVuZDwwKSlyZXR1cm4gbmV3IExhenlXcmFwcGVyKHJlc3VsdCk7aWYoc3RhcnQ8MClyZXN1bHQ9cmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO2Vsc2UgaWYoc3RhcnQpcmVzdWx0PXJlc3VsdC5kcm9wKHN0YXJ0KTtpZihlbmQhPT11bmRlZmluZWQpe2VuZD10b0ludGVnZXIoZW5kKTtyZXN1bHQ9ZW5kPDA/cmVzdWx0LmRyb3BSaWdodCgtZW5kKTpyZXN1bHQudGFrZShlbmQtc3RhcnQpfXJldHVybiByZXN1bHR9O0xhenlXcmFwcGVyLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUocHJlZGljYXRlKS5yZXZlcnNlKCl9O0xhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKX07YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsCmZ1bmN0aW9uKGZ1bmMsbWV0aG9kTmFtZSl7dmFyIGNoZWNrSXRlcmF0ZWU9L14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksaXNUYWtlcj0vXig/OmhlYWR8bGFzdCkkLy50ZXN0KG1ldGhvZE5hbWUpLGxvZGFzaEZ1bmM9bG9kYXNoW2lzVGFrZXI/InRha2UiKyhtZXRob2ROYW1lPT0ibGFzdCI/IlJpZ2h0IjoiIik6bWV0aG9kTmFtZV0scmV0VW53cmFwcGVkPWlzVGFrZXJ8fC9eZmluZC8udGVzdChtZXRob2ROYW1lKTtpZighbG9kYXNoRnVuYylyZXR1cm47bG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fLGFyZ3M9aXNUYWtlcj9bMV06YXJndW1lbnRzLGlzTGF6eT12YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyLGl0ZXJhdGVlPWFyZ3NbMF0sdXNlTGF6eT1pc0xhenl8fGlzQXJyYXkodmFsdWUpO3ZhciBpbnRlcmNlcHRvcj1mdW5jdGlvbih2YWx1ZSl7dmFyIHJlc3VsdD0KbG9kYXNoRnVuYy5hcHBseShsb2Rhc2gsYXJyYXlQdXNoKFt2YWx1ZV0sYXJncykpO3JldHVybiBpc1Rha2VyJiZjaGFpbkFsbD9yZXN1bHRbMF06cmVzdWx0fTtpZih1c2VMYXp5JiZjaGVja0l0ZXJhdGVlJiZ0eXBlb2YgaXRlcmF0ZWU9PSJmdW5jdGlvbiImJml0ZXJhdGVlLmxlbmd0aCE9MSlpc0xhenk9dXNlTGF6eT1mYWxzZTt2YXIgY2hhaW5BbGw9dGhpcy5fX2NoYWluX18saXNIeWJyaWQ9ISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxpc1Vud3JhcHBlZD1yZXRVbndyYXBwZWQmJiFjaGFpbkFsbCxvbmx5TGF6eT1pc0xhenkmJiFpc0h5YnJpZDtpZighcmV0VW53cmFwcGVkJiZ1c2VMYXp5KXt2YWx1ZT1vbmx5TGF6eT92YWx1ZTpuZXcgTGF6eVdyYXBwZXIodGhpcyk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHZhbHVlLGFyZ3MpO3Jlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W2ludGVyY2VwdG9yXSwidGhpc0FyZyI6dW5kZWZpbmVkfSk7cmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHJlc3VsdCwKY2hhaW5BbGwpfWlmKGlzVW53cmFwcGVkJiZvbmx5TGF6eSlyZXR1cm4gZnVuYy5hcHBseSh0aGlzLGFyZ3MpO3Jlc3VsdD10aGlzLnRocnUoaW50ZXJjZXB0b3IpO3JldHVybiBpc1Vud3JhcHBlZD9pc1Rha2VyP3Jlc3VsdC52YWx1ZSgpWzBdOnJlc3VsdC52YWx1ZSgpOnJlc3VsdH19KTthcnJheUVhY2goWyJwb3AiLCJwdXNoIiwic2hpZnQiLCJzb3J0Iiwic3BsaWNlIiwidW5zaGlmdCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPWFycmF5UHJvdG9bbWV0aG9kTmFtZV0sY2hhaW5OYW1lPS9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdChtZXRob2ROYW1lKT8idGFwIjoidGhydSIscmV0VW53cmFwcGVkPS9eKD86cG9wfHNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk7bG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztpZihyZXRVbndyYXBwZWQmJiF0aGlzLl9fY2hhaW5fXyl7dmFyIHZhbHVlPXRoaXMudmFsdWUoKTsKcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSk/dmFsdWU6W10sYXJncyl9cmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSk/dmFsdWU6W10sYXJncyl9KX19KTtiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSxmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBsb2Rhc2hGdW5jPWxvZGFzaFttZXRob2ROYW1lXTtpZihsb2Rhc2hGdW5jKXt2YXIga2V5PWxvZGFzaEZ1bmMubmFtZSsiIixuYW1lcz1yZWFsTmFtZXNba2V5XXx8KHJlYWxOYW1lc1trZXldPVtdKTtuYW1lcy5wdXNoKHsibmFtZSI6bWV0aG9kTmFtZSwiZnVuYyI6bG9kYXNoRnVuY30pfX0pO3JlYWxOYW1lc1tjcmVhdGVIeWJyaWQodW5kZWZpbmVkLFdSQVBfQklORF9LRVlfRkxBRykubmFtZV09W3sibmFtZSI6IndyYXBwZXIiLCJmdW5jIjp1bmRlZmluZWR9XTtMYXp5V3JhcHBlci5wcm90b3R5cGUuY2xvbmU9bGF6eUNsb25lOwpMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZT1sYXp5UmV2ZXJzZTtMYXp5V3JhcHBlci5wcm90b3R5cGUudmFsdWU9bGF6eVZhbHVlO2xvZGFzaC5wcm90b3R5cGUuYXQ9d3JhcHBlckF0O2xvZGFzaC5wcm90b3R5cGUuY2hhaW49d3JhcHBlckNoYWluO2xvZGFzaC5wcm90b3R5cGUuY29tbWl0PXdyYXBwZXJDb21taXQ7bG9kYXNoLnByb3RvdHlwZS5uZXh0PXdyYXBwZXJOZXh0O2xvZGFzaC5wcm90b3R5cGUucGxhbnQ9d3JhcHBlclBsYW50O2xvZGFzaC5wcm90b3R5cGUucmV2ZXJzZT13cmFwcGVyUmV2ZXJzZTtsb2Rhc2gucHJvdG90eXBlLnRvSlNPTj1sb2Rhc2gucHJvdG90eXBlLnZhbHVlT2Y9bG9kYXNoLnByb3RvdHlwZS52YWx1ZT13cmFwcGVyVmFsdWU7bG9kYXNoLnByb3RvdHlwZS5maXJzdD1sb2Rhc2gucHJvdG90eXBlLmhlYWQ7aWYoc3ltSXRlcmF0b3IpbG9kYXNoLnByb3RvdHlwZVtzeW1JdGVyYXRvcl09d3JhcHBlclRvSXRlcmF0b3I7cmV0dXJuIGxvZGFzaH07CnZhciBfPXJ1bkluQ29udGV4dCgpO2lmKHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJnR5cGVvZiBkZWZpbmUuYW1kPT0ib2JqZWN0IiYmZGVmaW5lLmFtZCl7cm9vdC5fPV87ZGVmaW5lKGZ1bmN0aW9uKCl7cmV0dXJuIF99KX1lbHNlIGlmKGZyZWVNb2R1bGUpeyhmcmVlTW9kdWxlLmV4cG9ydHM9XykuXz1fO2ZyZWVFeHBvcnRzLl89X31lbHNlIHJvb3QuXz1ffSkuY2FsbCh0aGlzKTs8L3NjcmlwdD48c2NyaXB0Pi8vIGh0dHBzOi8vZDNqcy5vcmcgdjUuNy4wIENvcHlyaWdodCAyMDE4IE1pa2UgQm9zdG9jawohZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0odGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQpe3ZhciBlO3JldHVybiAxPT09dC5sZW5ndGgmJihlPXQsdD1mdW5jdGlvbih0LHIpe3JldHVybiBuKGUodCkscil9KSx7bGVmdDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPDA/cj1vKzE6aT1vfXJldHVybiByfSxyaWdodDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPjA/aT1vOnI9bysxfXJldHVybiByfX19dmFyIHI9ZShuKSxpPXIucmlnaHQsbz1yLmxlZnQ7ZnVuY3Rpb24gYSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBmKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCxhPS0xLGY9MCxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPXUodFthXSkpfHwoYys9KHI9ZS1mKSooZS0oZis9ci8rK28pKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXUobih0W2FdLGEsdCkpKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2lmKG8+MSlyZXR1cm4gYy8oby0xKX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9Zih0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIHModCxuKXt2YXIgZSxyLGksbz10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PW4pe2Zvcig7KythPG87KWlmKG51bGwhPShlPXRbYV0pJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9dFthXSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpfWVsc2UgZm9yKDsrK2E8bzspaWYobnVsbCE9KGU9bih0W2FdLGEsdCkpJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9bih0W2FdLGEsdCkpJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKTtyZXR1cm5bcixpXX12YXIgbD1BcnJheS5wcm90b3R5cGUsaD1sLnNsaWNlLGQ9bC5tYXA7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdih0KXtyZXR1cm4gdH1mdW5jdGlvbiBnKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfXZhciB5PU1hdGguc3FydCg1MCksXz1NYXRoLnNxcnQoMTApLGI9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIG0odCxuLGUpe3ZhciByLGksbyxhLHU9LTE7aWYoZT0rZSwodD0rdCk9PT0obj0rbikmJmU+MClyZXR1cm5bdF07aWYoKHI9bjx0KSYmKGk9dCx0PW4sbj1pKSwwPT09KGE9eCh0LG4sZSkpfHwhaXNGaW5pdGUoYSkpcmV0dXJuW107aWYoYT4wKWZvcih0PU1hdGguY2VpbCh0L2EpLG49TWF0aC5mbG9vcihuL2EpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKG4tdCsxKSk7Kyt1PGk7KW9bdV09KHQrdSkqYTtlbHNlIGZvcih0PU1hdGguZmxvb3IodCphKSxuPU1hdGguY2VpbChuKmEpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKHQtbisxKSk7Kyt1PGk7KW9bdV09KHQtdSkvYTtyZXR1cm4gciYmby5yZXZlcnNlKCksb31mdW5jdGlvbiB4KHQsbixlKXt2YXIgcj0obi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49eT8xMDpvPj1fPzU6bz49Yj8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKX1mdW5jdGlvbiB3KHQsbixlKXt2YXIgcj1NYXRoLmFicyhuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj15P2kqPTEwOm8+PV8/aSo9NTpvPj1iJiYoaSo9Miksbjx0Py1pOml9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBBKHQsbixlKXtpZihudWxsPT1lJiYoZT11KSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksYT0rZSh0W29dLG8sdCk7cmV0dXJuIGErKCtlKHRbbysxXSxvKzEsdCktYSkqKGktbyl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmZT5yJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+ciYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTih0KXtmb3IodmFyIG4sZSxyLGk9dC5sZW5ndGgsbz0tMSxhPTA7KytvPGk7KWErPXRbb10ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKTstLWk+PTA7KWZvcihuPShyPXRbaV0pLmxlbmd0aDstLW4+PTA7KWVbLS1hXT1yW25dO3JldHVybiBlfWZ1bmN0aW9uIFModCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmcj5lJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJnI+ZSYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gRSh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgbj0tMSxlPVModCxrKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIGsodCl7cmV0dXJuIHQubGVuZ3RofXZhciBDPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBQKHQpe3JldHVybiB0fXZhciB6PTEsUj0yLEw9MyxEPTQsVT0xZS02O2Z1bmN0aW9uIHEodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBPKHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiKyh0Ky41KSsiKSJ9ZnVuY3Rpb24gWSgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBCKHQsbil7dmFyIGU9W10scj1udWxsLGk9bnVsbCxvPTYsYT02LHU9MyxmPXQ9PT16fHx0PT09RD8tMToxLGM9dD09PUR8fHQ9PT1SPyJ4IjoieSIscz10PT09enx8dD09PUw/cTpPO2Z1bmN0aW9uIGwobCl7dmFyIGg9bnVsbD09cj9uLnRpY2tzP24udGlja3MuYXBwbHkobixlKTpuLmRvbWFpbigpOnIsZD1udWxsPT1pP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixlKTpQOmkscD1NYXRoLm1heChvLDApK3Usdj1uLnJhbmdlKCksZz0rdlswXSsuNSx5PSt2W3YubGVuZ3RoLTFdKy41LF89KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLGI9bC5zZWxlY3Rpb24/bC5zZWxlY3Rpb24oKTpsLG09Yi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSkseD1iLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSx3PXguZXhpdCgpLE09eC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLEE9eC5zZWxlY3QoImxpbmUiKSxUPXguc2VsZWN0KCJ0ZXh0Iik7bT1tLm1lcmdlKG0uZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikpLHg9eC5tZXJnZShNKSxBPUEubWVyZ2UoTS5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMrIjIiLGYqbykpLFQ9VC5tZXJnZShNLmFwcGVuZCgidGV4dCIpLmF0dHIoImZpbGwiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMsZipwKS5hdHRyKCJkeSIsdD09PXo/IjBlbSI6dD09PUw/IjAuNzFlbSI6IjAuMzJlbSIpKSxsIT09YiYmKG09bS50cmFuc2l0aW9uKGwpLHg9eC50cmFuc2l0aW9uKGwpLEE9QS50cmFuc2l0aW9uKGwpLFQ9VC50cmFuc2l0aW9uKGwpLHc9dy50cmFuc2l0aW9uKGwpLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9Xyh0KSk/cyh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxNLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gcyhuJiZpc0Zpbml0ZShuPW4odCkpP246Xyh0KSl9KSksdy5yZW1vdmUoKSxtLmF0dHIoImQiLHQ9PT1EfHx0PT1SP2E/Ik0iK2YqYSsiLCIrZysiSDAuNVYiK3krIkgiK2YqYToiTTAuNSwiK2crIlYiK3k6YT8iTSIrZysiLCIrZiphKyJWMC41SCIreSsiViIrZiphOiJNIitnKyIsMC41SCIreSkseC5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBzKF8odCkpfSksQS5hdHRyKGMrIjIiLGYqbyksVC5hdHRyKGMsZipwKS50ZXh0KGQpLGIuZmlsdGVyKFkpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1SPyJzdGFydCI6dD09PUQ/ImVuZCI6Im1pZGRsZSIpLGIuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPV99KX1yZXR1cm4gbC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGwpOm59LGwudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gZT1DLmNhbGwoYXJndW1lbnRzKSxsfSxsLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpDLmNhbGwodCksbCk6ZS5zbGljZSgpfSxsLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOkMuY2FsbCh0KSxsKTpyJiZyLnNsaWNlKCl9LGwudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGwpOml9LGwudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YT0rdCxsKTpvfSxsLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsbCk6b30sbC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGwpOmF9LGwudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsbCk6dX0sbH12YXIgRj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBJKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBIKHIpfWZ1bmN0aW9uIEgodCl7dGhpcy5fPXR9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIFgodCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPUYsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fUgucHJvdG90eXBlPUkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRoaXMuXyxvPShyPWksKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSxhPS0xLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK2E8dTspaWYoZT0odD1vW2FdKS50eXBlKWlbZV09WChpW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gaSlpW2VdPVgoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPWooaVtlXSx0Lm5hbWUpKSlyZXR1cm4gZX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgSCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxlPShyPXRoaXMuX1t0XSkubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIEc9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLFY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkcseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiAkKHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLFYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOlZbbl0sbG9jYWw6dH06dH1mdW5jdGlvbiBXKHQpe3ZhciBuPSQodCk7cmV0dXJuKG4ubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09RyYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09Rz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBaKCl7fWZ1bmN0aW9uIFEodCl7cmV0dXJuIG51bGw9PXQ/WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEooKXtyZXR1cm5bXX1mdW5jdGlvbiBLKHQpe3JldHVybiBudWxsPT10P0o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX12YXIgdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBudD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIW50Lm1hdGNoZXMpe3ZhciBldD1udC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG50Lm1zTWF0Y2hlc1NlbGVjdG9yfHxudC5tb3pNYXRjaGVzU2VsZWN0b3J8fG50Lm9NYXRjaGVzU2VsZWN0b3I7dHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmNhbGwodGhpcyx0KX19fX12YXIgcnQ9dHQ7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gb3QodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59b3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LG4pfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTt2YXIgYXQ9IiQiO2Z1bmN0aW9uIHV0KHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdT0wLGY9bi5sZW5ndGgsYz1vLmxlbmd0aDt1PGM7Kyt1KShhPW5bdV0pPyhhLl9fZGF0YV9fPW9bdV0sclt1XT1hKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcig7dTxmOysrdSkoYT1uW3VdKSYmKGlbdV09YSl9ZnVuY3Rpb24gZnQodCxuLGUscixpLG8sYSl7dmFyIHUsZixjLHM9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLGQ9bmV3IEFycmF5KGwpO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmKGRbdV09Yz1hdCthLmNhbGwoZixmLl9fZGF0YV9fLHUsbiksYyBpbiBzP2lbdV09ZjpzW2NdPWYpO2Zvcih1PTA7dTxoOysrdSkoZj1zW2M9YXQrYS5jYWxsKHQsb1t1XSx1LG8pXSk/KHJbdV09ZixmLl9fZGF0YV9fPW9bdV0sc1tjXT1udWxsKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmc1tkW3VdXT09PWYmJihpW3VdPWYpfWZ1bmN0aW9uIGN0KHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBsdCh0LG4pe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobil8fHN0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIGh0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBwdCh0KX1mdW5jdGlvbiBwdCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9aHQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB2dCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIGd0KHQsbil7Zm9yKHZhciBlPWR0KHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24geXQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIF90KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gYnQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiB4dCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHd0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gTXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gQXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9cHQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVHQ9e307KHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KSYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoVHQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO2Z1bmN0aW9uIE50KHQsbixlKXtyZXR1cm4gdD1TdCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFN0KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIEV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrdCh0LG4sZSl7dmFyIHI9VHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9OdDpTdDtyZXR1cm4gZnVuY3Rpb24oaSxvLGEpe3ZhciB1LGY9dGhpcy5fX29uLGM9cihuLG8sYSk7aWYoZilmb3IodmFyIHM9MCxsPWYubGVuZ3RoO3M8bDsrK3MpaWYoKHU9ZltzXSkudHlwZT09PXQudHlwZSYmdS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXIsdS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXI9Yyx1LmNhcHR1cmU9ZSksdm9pZCh1LnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxlKSx1PXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOmMsY2FwdHVyZTplfSxmP2YucHVzaCh1KTp0aGlzLl9fb249W3VdfX1mdW5jdGlvbiBDdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIFB0KHQsbixlKXt2YXIgcj1zdCh0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX12YXIgenQ9W251bGxdO2Z1bmN0aW9uIFJ0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIEx0KCl7cmV0dXJuIG5ldyBSdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLHp0KX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgUnQoW1t0XV0senQpfVJ0LnByb3RvdHlwZT1MdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlJ0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9USh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhLHU9bltpXSxmPXUubGVuZ3RoLGM9cltpXT1uZXcgQXJyYXkoZikscz0wO3M8ZjsrK3MpKG89dVtzXSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18scyx1KSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1tzXT1hKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Syh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpKGE9dVtjXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgUnQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUnQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlLHI9bj9mdDp1dCxpPXRoaXMuX3BhcmVudHMsbz10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihlPXQsdD1mdW5jdGlvbigpe3JldHVybiBlfSk7Zm9yKHZhciBhPW8ubGVuZ3RoLHU9bmV3IEFycmF5KGEpLGY9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHM9MDtzPGE7KytzKXt2YXIgbD1pW3NdLGg9b1tzXSxkPWgubGVuZ3RoLHA9dC5jYWxsKGwsbCYmbC5fX2RhdGFfXyxzLGkpLHY9cC5sZW5ndGgsZz1mW3NdPW5ldyBBcnJheSh2KSx5PXVbc109bmV3IEFycmF5KHYpO3IobCxoLGcseSxjW3NdPW5ldyBBcnJheShkKSxwLG4pO2Zvcih2YXIgXyxiLG09MCx4PTA7bTx2OysrbSlpZihfPWdbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoYj15W3hdKSYmKyt4PHY7KTtfLl9uZXh0PWJ8fG51bGx9fXJldHVybih1PW5ldyBSdCh1LGkpKS5fZW50ZXI9Zix1Ll9leGl0PWMsdX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKGl0KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LG1lcmdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBSdChhLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJmEhPT1yLm5leHRTaWJsaW5nJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsYSksYT1yKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4sZSl7cmV0dXJuIG4mJmU/dChuLl9fZGF0YV9fLGUuX19kYXRhX18pOiFuLSFlfXR8fCh0PWN0KTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgYSx1PWVbb10sZj11Lmxlbmd0aCxjPWlbb109bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShhPXVbc10pJiYoY1tzXT1hKTtjLnNvcnQobil9cmV0dXJuIG5ldyBSdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxuPS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0Wysrbl09dGhpc30pLHR9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIGE9cltpXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPTAscj1uLmxlbmd0aDtlPHI7KytlKWZvcih2YXIgaSxvPW5bZV0sYT0wLHU9by5sZW5ndGg7YTx1OysrYSkoaT1vW2FdKSYmdC5jYWxsKGksaS5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19OmUubG9jYWw/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19KShlLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX06ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLGUpfX0pKHQsbixudWxsPT1lPyIiOmUpKTpsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPWh0KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPWR0KHRoaXMubm9kZSgpKSxpPS0xLG89ZS5sZW5ndGg7KytpPG87KWlmKCFyLmNvbnRhaW5zKGVbaV0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7KG4uYXBwbHkodGhpcyxhcmd1bWVudHMpP3Z0Omd0KSh0aGlzLHQpfX06bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2dCh0aGlzLHQpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Z3QodGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD95dDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P190OigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX0pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChidCl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChtdCl9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Vyh0KSxyPW51bGw9PW4/eHQ6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRKG4pO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh3dCl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0F0Ok10KX0sZGF0dW06ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/a3Q6RXQsbnVsbD09ZSYmKGU9ITEpLHI9MDtyPGE7KytyKXRoaXMuZWFjaCh1KG9bcl0sbixlKSk7cmV0dXJuIHRoaXN9dmFyIHU9dGhpcy5ub2RlKCkuX19vbjtpZih1KWZvcih2YXIgZixjPTAscz11Lmxlbmd0aDtjPHM7KytjKWZvcihyPTAsZj11W2NdO3I8YTsrK3IpaWYoKGk9b1tyXSkudHlwZT09PWYudHlwZSYmaS5uYW1lPT09Zi5uYW1lKXJldHVybiBmLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbil9fSkodCxuKSl9fTt2YXIgVXQ9MDtmdW5jdGlvbiBxdCgpe3JldHVybiBuZXcgT3R9ZnVuY3Rpb24gT3QoKXt0aGlzLl89IkAiKygrK1V0KS50b1N0cmluZygzNil9ZnVuY3Rpb24gWXQoKXtmb3IodmFyIG4sZT10LmV2ZW50O249ZS5zb3VyY2VFdmVudDspZT1uO3JldHVybiBlfWZ1bmN0aW9uIEJ0KHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFksWyhyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gRnQodCl7dmFyIG49WXQoKTtyZXR1cm4gbi5jaGFuZ2VkVG91Y2hlcyYmKG49bi5jaGFuZ2VkVG91Y2hlc1swXSksQnQodCxuKX1mdW5jdGlvbiBJdCh0LG4sZSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoZT1uLG49WXQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciByLGk9MCxvPW4/bi5sZW5ndGg6MDtpPG87KytpKWlmKChyPW5baV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBCdCh0LHIpO3JldHVybiBudWxsfWZ1bmN0aW9uIEh0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBqdCgpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFh0KHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9RHQodCkub24oImRyYWdzdGFydC5kcmFnIixqdCwhMCk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixqdCwhMCk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gR3QodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGp0LCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vbigiY2xpY2suZHJhZyIsbnVsbCl9LDApKSwib25zZWxlY3RzdGFydCJpbiBlP3Iub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihlLnN0eWxlLk1velVzZXJTZWxlY3Q9ZS5fX25vc2VsZWN0LGRlbGV0ZSBlLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiAkdCh0LG4sZSxyLGksbyxhLHUsZixjKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PWEsdGhpcy5keD11LHRoaXMuZHk9Zix0aGlzLl89Y31mdW5jdGlvbiBXdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBadCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gUXQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIEp0KCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIEt0KHQsbixlKXt0LnByb3RvdHlwZT1uLnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiBubigpe31PdC5wcm90b3R5cGU9cXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPdCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fSwkdC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgZW49IlxccyooWystXT9cXGQrKVxccyoiLHJuPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLG9uPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixhbj0vXiMoWzAtOWEtZl17M30pJC8sdW49L14jKFswLTlhLWZdezZ9KSQvLGZuPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tlbixlbixlbl0rIlxcKSQiKSxjbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbb24sb24sb25dKyJcXCkkIiksc249bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tlbixlbixlbixybl0rIlxcKSQiKSxsbj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW29uLG9uLG9uLHJuXSsiXFwpJCIpLGhuPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tybixvbixvbl0rIlxcKSQiKSxkbj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW3JuLG9uLG9uLHJuXSsiXFwpJCIpLHBuPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHZuKHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1hbi5leGVjKHQpKT9uZXcgbW4oKG49cGFyc2VJbnQoblsxXSwxNikpPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6KG49dW4uZXhlYyh0KSk/Z24ocGFyc2VJbnQoblsxXSwxNikpOihuPWZuLmV4ZWModCkpP25ldyBtbihuWzFdLG5bMl0sblszXSwxKToobj1jbi5leGVjKHQpKT9uZXcgbW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49c24uZXhlYyh0KSk/eW4oblsxXSxuWzJdLG5bM10sbls0XSk6KG49bG4uZXhlYyh0KSk/eW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49aG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1kbi5leGVjKHQpKT93bihuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOnBuLmhhc093blByb3BlcnR5KHQpP2duKHBuW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgbW4oTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBnbih0KXtyZXR1cm4gbmV3IG1uKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiB5bih0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IG1uKHQsbixlLHIpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSx0P25ldyBtbigodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgbW59ZnVuY3Rpb24gYm4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP19uKHQpOm5ldyBtbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gbW4odCxuLGUscil7dGhpcy5yPSt0LHRoaXMuZz0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIHhuKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gd24odCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBBbih0LG4sZSxyKX1mdW5jdGlvbiBNbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFuKXJldHVybiBuZXcgQW4odC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSwhdClyZXR1cm4gbmV3IEFuO2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gdDt2YXIgbj0odD10LnJnYigpKS5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4obixlLHIpLG89TWF0aC5tYXgobixlLHIpLGE9TmFOLHU9by1pLGY9KG8raSkvMjtyZXR1cm4gdT8oYT1uPT09bz8oZS1yKS91KzYqKGU8cik6ZT09PW8/KHItbikvdSsyOihuLWUpL3UrNCx1Lz1mPC41P28raToyLW8taSxhKj02MCk6dT1mPjAmJmY8MT8wOmEsbmV3IEFuKGEsdSxmLHQub3BhY2l0eSl9KHQpOm5ldyBBbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gQW4odCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFRuKHQsbixlKXtyZXR1cm4gMjU1Kih0PDYwP24rKGUtbikqdC82MDp0PDE4MD9lOnQ8MjQwP24rKGUtbikqKDI0MC10KS82MDpuKX1LdChubix2bix7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxLdChtbixibix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IG1uKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpmdW5jdGlvbigpe3JldHVybiIjIit4bih0aGlzLnIpK3huKHRoaXMuZykreG4odGhpcy5iKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksS3QoQW4sTW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IG1uKFRuKHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFRuKHQsaSxyKSxUbih0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgTm49TWF0aC5QSS8xODAsU249MTgwL01hdGguUEksRW49Ljk2NDIyLGtuPTEsQ249LjgyNTIxLFBuPTQvMjksem49Ni8yOSxSbj0zKnpuKnpuLExuPXpuKnpuKnpuO2Z1bmN0aW9uIERuKHQpe2lmKHQgaW5zdGFuY2VvZiBxbilyZXR1cm4gbmV3IHFuKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGpuKXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgcW4odC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpObjtyZXR1cm4gbmV3IHFuKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIGUscixpPUZuKHQuciksbz1Gbih0LmcpLGE9Rm4odC5iKSx1PU9uKCguMjIyNTA0NSppKy43MTY4Nzg2Km8rLjA2MDYxNjkqYSkva24pO3JldHVybiBpPT09byYmbz09PWE/ZT1yPXU6KGU9T24oKC40MzYwNzQ3KmkrLjM4NTA2NDkqbysuMTQzMDgwNCphKS9Fbikscj1PbigoLjAxMzkzMjIqaSsuMDk3MTA0NSpvKy43MTQxNzMzKmEpL0NuKSksbmV3IHFuKDExNip1LTE2LDUwMCooZS11KSwyMDAqKHUtciksdC5vcGFjaXR5KX1mdW5jdGlvbiBVbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/RG4odCk6bmV3IHFuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gT24odCl7cmV0dXJuIHQ+TG4/TWF0aC5wb3codCwxLzMpOnQvUm4rUG59ZnVuY3Rpb24gWW4odCl7cmV0dXJuIHQ+em4/dCp0KnQ6Um4qKHQtUG4pfWZ1bmN0aW9uIEJuKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gSW4odCl7aWYodCBpbnN0YW5jZW9mIGpuKXJldHVybiBuZXcgam4odC5oLHQuYyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcW58fCh0PURuKHQpKSwwPT09dC5hJiYwPT09dC5iKXJldHVybiBuZXcgam4oTmFOLDAsdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpTbjtyZXR1cm4gbmV3IGpuKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEhuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGpuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1LdChxbixVbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFuKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBtbihCbigzLjEzMzg1NjEqKG49RW4qWW4obikpLTEuNjE2ODY2NyoodD1rbipZbih0KSktLjQ5MDYxNDYqKGU9Q24qWW4oZSkpKSxCbigtLjk3ODc2ODQqbisxLjkxNjE0MTUqdCsuMDMzNDU0KmUpLEJuKC4wNzE5NDUzKm4tLjIyODk5MTQqdCsxLjQwNTI0MjcqZSksdGhpcy5vcGFjaXR5KX19KSksS3Qoam4sSG4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqbih0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzKS5yZ2IoKX19KSk7dmFyIFhuPS0uMTQ4NjEsR249MS43ODI3NyxWbj0tLjI5MjI3LCRuPS0uOTA2NDksV249MS45NzI5NCxabj1XbiokbixRbj1XbipHbixKbj1HbipWbi0kbipYbjtmdW5jdGlvbiBLbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHRlKXJldHVybiBuZXcgdGUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgbW58fCh0PV9uKHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oSm4qcitabipuLVFuKmUpLyhKbitabi1Rbiksbz1yLWksYT0oV24qKGUtaSktVm4qbykvJG4sdT1NYXRoLnNxcnQoYSphK28qbykvKFduKmkqKDEtaSkpLGY9dT9NYXRoLmF0YW4yKGEsbykqU24tMTIwOk5hTjtyZXR1cm4gbmV3IHRlKGY8MD9mKzM2MDpmLHUsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgdGUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIHRlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBuZSh0LG4sZSxyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSpuKyg0LTYqbyszKmEpKmUrKDErMyp0KzMqby0zKmEpKnIrYSppKS82fWZ1bmN0aW9uIGVlKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sYT1yPjA/dFtyLTFdOjIqaS1vLHU9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBuZSgoZS1yL24pKm4sYSxpLG8sdSl9fWZ1bmN0aW9uIHJlKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sYT10WyhyKzEpJW5dLHU9dFsocisyKSVuXTtyZXR1cm4gbmUoKGUtci9uKSpuLGksbyxhLHUpfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gb2UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBhZSh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9vZSh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6aWUoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gMT09KHQ9K3QpP2ZlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6aWUoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZmUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlKTppZShpc05hTih0KT9uOnQpfUt0KHRlLEtuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKk5uLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBtbigyNTUqKG4rZSooWG4qcitHbippKSksMjU1KihuK2UqKFZuKnIrJG4qaSkpLDI1NSoobitlKihXbipyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIGNlPWZ1bmN0aW9uIHQobil7dmFyIGU9dWUobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9Ym4odCkpLnIsKG49Ym4obikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gc2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1ibihuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgbGU9c2UoZWUpLGhlPXNlKHJlKTtmdW5jdGlvbiBkZSh0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPW1lKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKWFbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKWFbZV09b1tlXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gcGUodCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiB2ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19ZnVuY3Rpb24gZ2UodCxuKXt2YXIgZSxyPXt9LGk9e307Zm9yKGUgaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KSxuKWUgaW4gdD9yW2VdPW1lKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19dmFyIHllPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxfZT1uZXcgUmVnRXhwKHllLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGJlKHQsbil7dmFyIGUscixpLG89eWUubGFzdEluZGV4PV9lLmxhc3RJbmRleD0wLGE9LTEsdT1bXSxmPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT15ZS5leGVjKHQpKSYmKHI9X2UuZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLChlPWVbMF0pPT09KHI9clswXSk/dVthXT91W2FdKz1yOnVbKythXT1yOih1WysrYV09bnVsbCxmLnB1c2goe2k6YSx4OnZlKGUscil9KSksbz1fZS5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksdVthXT91W2FdKz1pOnVbKythXT1pKSx1Lmxlbmd0aDwyP2ZbMF0/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX0oZlswXS54KTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KG4pOihuPWYubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPTA7cjxuOysrcil1WyhlPWZbcl0pLmldPWUueCh0KTtyZXR1cm4gdS5qb2luKCIiKX0pfWZ1bmN0aW9uIG1lKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj9pZShuKTooIm51bWJlciI9PT1yP3ZlOiJzdHJpbmciPT09cj8oZT12bihuKSk/KG49ZSxjZSk6YmU6biBpbnN0YW5jZW9mIHZuP2NlOm4gaW5zdGFuY2VvZiBEYXRlP3BlOkFycmF5LmlzQXJyYXkobik/ZGU6ImZ1bmN0aW9uIiE9dHlwZW9mIG4udmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIG4udG9TdHJpbmd8fGlzTmFOKG4pP2dlOnZlKSh0LG4pfWZ1bmN0aW9uIHhlKHQsbil7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX12YXIgd2UsTWUsQWUsVGUsTmU9MTgwL01hdGguUEksU2U9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gRWUodCxuLGUscixpLG8pe3ZhciBhLHUsZjtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K24qbikpJiYodC89YSxuLz1hKSwoZj10KmUrbipyKSYmKGUtPXQqZixyLT1uKmYpLCh1PU1hdGguc3FydChlKmUrcipyKSkmJihlLz11LHIvPXUsZi89dSksdCpyPG4qZSYmKHQ9LXQsbj0tbixmPS1mLGE9LWEpLHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKG4sdCkqTmUsc2tld1g6TWF0aC5hdGFuKGYpKk5lLHNjYWxlWDphLHNjYWxlWTp1fX1mdW5jdGlvbiBrZSh0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgdT1bXSxmPVtdO3JldHVybiBvPXQobyksYT10KGEpLGZ1bmN0aW9uKHQscixpLG8sYSx1KXtpZih0IT09aXx8ciE9PW8pe3ZhciBmPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7dS5wdXNoKHtpOmYtNCx4OnZlKHQsaSl9LHtpOmYtMix4OnZlKHIsbyl9KX1lbHNlKGl8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDp2ZSh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfShvLnJvdGF0ZSxhLnJvdGF0ZSx1LGYpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDp2ZSh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX0oby5za2V3WCxhLnNrZXdYLHUsZiksZnVuY3Rpb24odCxuLGUscixvLGEpe2lmKHQhPT1lfHxuIT09cil7dmFyIHU9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTp1LTQseDp2ZSh0LGUpfSx7aTp1LTIseDp2ZShuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX0oby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVksdSxmKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPWYubGVuZ3RoOysrZTxyOyl1WyhuPWZbZV0pLmldPW4ueCh0KTtyZXR1cm4gdS5qb2luKCIiKX19fXZhciBDZT1rZShmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P1NlOih3ZXx8KHdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLE1lPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxBZT1kb2N1bWVudC5kZWZhdWx0Vmlldyksd2Uuc3R5bGUudHJhbnNmb3JtPXQsdD1BZS5nZXRDb21wdXRlZFN0eWxlKE1lLmFwcGVuZENoaWxkKHdlKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxNZS5yZW1vdmVDaGlsZCh3ZSksRWUoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0sInB4LCAiLCJweCkiLCJkZWcpIiksUGU9a2UoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/U2U6KFRlfHwoVGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksVGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVRlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0VlKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlNlKX0sIiwgIiwiKSIsIikiKSx6ZT1NYXRoLlNRUlQyLFJlPTIsTGU9NCxEZT0xZS0xMjtmdW5jdGlvbiBVZSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBxZSh0LG4pe3ZhciBlLHIsaT10WzBdLG89dFsxXSxhPXRbMl0sdT1uWzBdLGY9blsxXSxjPW5bMl0scz11LWksbD1mLW8saD1zKnMrbCpsO2lmKGg8RGUpcj1NYXRoLmxvZyhjL2EpL3plLGU9ZnVuY3Rpb24odCl7cmV0dXJuW2krdCpzLG8rdCpsLGEqTWF0aC5leHAoemUqdCpyKV19O2Vsc2V7dmFyIGQ9TWF0aC5zcXJ0KGgpLHA9KGMqYy1hKmErTGUqaCkvKDIqYSpSZSpkKSx2PShjKmMtYSphLUxlKmgpLygyKmMqUmUqZCksZz1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LWcpL3plLGU9ZnVuY3Rpb24odCl7dmFyIG4sZT10KnIsdT1VZShnKSxmPWEvKFJlKmQpKih1KihuPXplKmUrZywoKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSkpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krZipzLG8rZipsLGEqdS9VZSh6ZSplK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPU1uKG4pKS5oLChlPU1uKGUpKS5oKSxpPWZlKG4ucyxlLnMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgWWU9T2UoYWUpLEJlPU9lKGZlKTtmdW5jdGlvbiBGZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPUhuKG4pKS5oLChlPUhuKGUpKS5oKSxpPWZlKG4uYyxlLmMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgSWU9RmUoYWUpLEhlPUZlKGZlKTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1LbihuKSkuaCwocj1LbihyKSkuaCksbz1mZShuLnMsci5zKSxhPWZlKG4ubCxyLmwpLHU9ZmUobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIFhlPWplKGFlKSxHZT1qZShmZSk7dmFyIFZlLCRlLFdlPTAsWmU9MCxRZT0wLEplPTFlMyxLZT0wLHRyPTAsbnI9MCxlcj0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxycj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBpcigpe3JldHVybiB0cnx8KHJyKG9yKSx0cj1lci5ub3coKStucil9ZnVuY3Rpb24gb3IoKXt0cj0wfWZ1bmN0aW9uIGFyKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB1cih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24gZnIoKXtpcigpLCsrV2U7Zm9yKHZhciB0LG49VmU7bjspKHQ9dHItbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLVdlfWZ1bmN0aW9uIGNyKCl7dHI9KEtlPWVyLm5vdygpKStucixXZT1aZT0wO3RyeXtmcigpfWZpbmFsbHl7V2U9MCxmdW5jdGlvbigpe3ZhciB0LG4sZT1WZSxyPTEvMDtmb3IoO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjpWZT1uKTskZT10LGxyKHIpfSgpLHRyPTB9fWZ1bmN0aW9uIHNyKCl7dmFyIHQ9ZXIubm93KCksbj10LUtlO24+SmUmJihuci09bixLZT10KX1mdW5jdGlvbiBscih0KXtXZXx8KFplJiYoWmU9Y2xlYXJUaW1lb3V0KFplKSksdC10cj4yND8odDwxLzAmJihaZT1zZXRUaW1lb3V0KGNyLHQtZXIubm93KCktbnIpKSxRZSYmKFFlPWNsZWFySW50ZXJ2YWwoUWUpKSk6KFFlfHwoS2U9ZXIubm93KCksUWU9c2V0SW50ZXJ2YWwoc3IsSmUpKSxXZT0xLHJyKGNyKSkpfWZ1bmN0aW9uIGhyKHQsbixlKXt2YXIgcj1uZXcgYXI7cmV0dXJuIG49bnVsbD09bj8wOituLHIucmVzdGFydChmdW5jdGlvbihlKXtyLnN0b3AoKSx0KGUrbil9LG4sZSkscn1hci5wcm90b3R5cGU9dXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphcixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/aXIoKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8JGU9PT10aGlzfHwoJGU/JGUuX25leHQ9dGhpczpWZT10aGlzLCRlPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsbHIoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsbHIoKSl9fTt2YXIgZHI9SSgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxwcj1bXSx2cj0wLGdyPTEseXI9Mixfcj0zLGJyPTQsbXI9NSx4cj02O2Z1bmN0aW9uIHdyKHQsbixlLHIsaSxvKXt2YXIgYT10Ll9fdHJhbnNpdGlvbjtpZihhKXtpZihlIGluIGEpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIG8oZil7dmFyIGMscyxsLGg7aWYoZS5zdGF0ZSE9PWdyKXJldHVybiB1KCk7Zm9yKGMgaW4gaSlpZigoaD1pW2NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09X3IpcmV0dXJuIGhyKG8pO2guc3RhdGU9PT1icj8oaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGlbY10pOitjPG4mJihoLnN0YXRlPXhyLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBpW2NdKX1pZihocihmdW5jdGlvbigpe2Uuc3RhdGU9PT1fciYmKGUuc3RhdGU9YnIsZS50aW1lci5yZXN0YXJ0KGEsZS5kZWxheSxlLnRpbWUpLGEoZikpfSksZS5zdGF0ZT15cixlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09eXIpe2ZvcihlLnN0YXRlPV9yLHI9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLGM9MCxzPS0xO2M8bDsrK2MpKGg9ZS50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHJbKytzXT1oKTtyLmxlbmd0aD1zKzF9fWZ1bmN0aW9uIGEobil7Zm9yKHZhciBpPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydCh1KSxlLnN0YXRlPW1yLDEpLG89LTEsYT1yLmxlbmd0aDsrK288YTspcltvXS5jYWxsKG51bGwsaSk7ZS5zdGF0ZT09PW1yJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLHUoKSl9ZnVuY3Rpb24gdSgpe2Zvcih2YXIgciBpbiBlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBpW25dLGkpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1pW25dPWUsZS50aW1lcj11cihmdW5jdGlvbih0KXtlLnN0YXRlPWdyLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZvKHQtZS5kZWxheSl9LDAsZS50aW1lKX0odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOmRyLHR3ZWVuOnByLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOnZyfSl9ZnVuY3Rpb24gTXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+dnIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBBcih0LG4pe3ZhciBlPVRyKHQsbik7aWYoZS5zdGF0ZT55cil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBUcih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIE5yKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sYT0hMDtpZihvKXtmb3IoaSBpbiBuPW51bGw9PW4/bnVsbDpuKyIiLG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT55ciYmZS5zdGF0ZTxtcixlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFNyKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9QXIodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBUcih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBFcih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/dmU6biBpbnN0YW5jZW9mIHZuP2NlOihlPXZuKG4pKT8obj1lLGNlKTpiZSkodCxuKX12YXIga3I9THQucHJvdG90eXBlLmNvbnN0cnVjdG9yO3ZhciBDcj0wO2Z1bmN0aW9uIFByKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB6cih0KXtyZXR1cm4gTHQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIFJyKCl7cmV0dXJuKytDcn12YXIgTHI9THQucHJvdG90eXBlO2Z1bmN0aW9uIERyKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIFVyKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfVByLnByb3RvdHlwZT16ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlByLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPTA7YTxpOysrYSlmb3IodmFyIHUsZixjPXJbYV0scz1jLmxlbmd0aCxsPW9bYV09bmV3IEFycmF5KHMpLGg9MDtoPHM7KytoKSh1PWNbaF0pJiYoZj10LmNhbGwodSx1Ll9fZGF0YV9fLGgsYykpJiYoIl9fZGF0YV9fImluIHUmJihmLl9fZGF0YV9fPXUuX19kYXRhX18pLGxbaF09Zix3cihsW2hdLG4sZSxoLGwsVHIodSxlKSkpO3JldHVybiBuZXcgUHIobyx0aGlzLl9wYXJlbnRzLG4sZSl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLGE9W10sdT0wO3U8aTsrK3UpZm9yKHZhciBmLGM9clt1XSxzPWMubGVuZ3RoLGw9MDtsPHM7KytsKWlmKGY9Y1tsXSl7Zm9yKHZhciBoLGQ9dC5jYWxsKGYsZi5fX2RhdGFfXyxsLGMpLHA9VHIoZixlKSx2PTAsZz1kLmxlbmd0aDt2PGc7Kyt2KShoPWRbdl0pJiZ3cihoLG4sZSx2LGQscCk7by5wdXNoKGQpLGEucHVzaChmKX1yZXR1cm4gbmV3IFByKG8sYSxuLGUpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXJ0KHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLGE9bltpXSx1PWEubGVuZ3RoLGY9cltpXT1bXSxjPTA7Yzx1OysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZmLnB1c2gobyk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBQcihhLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcga3IodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPVJyKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIGEsdT1yW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpaWYoYT11W2NdKXt2YXIgcz1UcihhLG4pO3dyKGEsdCxlLGMsdSx7dGltZTpzLnRpbWUrcy5kZWxheStzLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246cy5kdXJhdGlvbixlYXNlOnMuZWFzZX0pfXJldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsZSl9LGNhbGw6THIuY2FsbCxub2RlczpMci5ub2Rlcyxub2RlOkxyLm5vZGUsc2l6ZTpMci5zaXplLGVtcHR5OkxyLmVtcHR5LGVhY2g6THIuZWFjaCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/VHIodGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG89ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX0obik/TXI6QXI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHU9YS5vbjt1IT09ciYmKGk9KHI9dSkuY29weSgpKS5vbihuLGUpLGEub249aX19KGUsdCxuKSl9LGF0dHI6ZnVuY3Rpb24odCxuKXt2YXIgZT0kKHQpLHI9InRyYW5zZm9ybSI9PT1lP1BlOkVyO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSx1PWUodGhpcyk7aWYobnVsbCE9dSlyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUscixTcih0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlKTooZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0pKGUscixuKyIiKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9JCh0KTtyZXR1cm4gdGhpcy50d2VlbihlLChyLmxvY2FsP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9OmZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX0pKHIsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InRyYW5zZm9ybSI9PSh0Kz0iIik/Q2U6RXI7cmV0dXJuIG51bGw9PW4/dGhpcy5zdHlsZVR3ZWVuKHQsZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89bHQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1lJiZhPT09cj9pOmk9bihlPW8scj1hKX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1sdCh0aGlzLHQpLHU9ZSh0aGlzKTtyZXR1cm4gbnVsbD09dSYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdT1sdCh0aGlzLHQpKSxhPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KX19KHQscixTcih0aGlzLCJzdHlsZS4iK3QsbikpOmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oU3IodGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKHQ9dGhpcy5faWQsZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pKTt2YXIgdH0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPVRyKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9QXIodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUFyKHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1yKXtpPShyPWEpLnNsaWNlKCk7Zm9yKHZhciB1PXtuYW1lOm4sdmFsdWU6ZX0sZj0wLGM9aS5sZW5ndGg7ZjxjOysrZilpZihpW2ZdLm5hbWU9PT1uKXtpW2ZdPXU7YnJlYWt9Zj09PWMmJmkucHVzaCh1KX1vLnR3ZWVuPWl9fSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7QXIodGhpcyx0KS5lYXNlPW59fShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5lYXNlfX07dmFyIHFyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksT3I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksWXI9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxuKToyLU1hdGgucG93KDItdCxuKSkvMn1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksQnI9TWF0aC5QSSxGcj1Cci8yO2Z1bmN0aW9uIElyKHQpe3JldHVybigxLU1hdGguY29zKEJyKnQpKS8yfWZ1bmN0aW9uIEhyKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24ganIodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIFhyPTQvMTEsR3I9Ni8xMSxWcj04LzExLCRyPS43NSxXcj05LzExLFpyPTEwLzExLFFyPS45Mzc1LEpyPTIxLzIyLEtyPTYzLzY0LHRpPTEvWHIvWHI7ZnVuY3Rpb24gbmkodCl7cmV0dXJuKHQ9K3QpPFhyP3RpKnQqdDp0PFZyP3RpKih0LT1HcikqdCskcjp0PFpyP3RpKih0LT1XcikqdCtRcjp0aSoodC09SnIpKnQrS3J9dmFyIGVpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCkscmk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybi0tdCp0KigobisxKSp0K24pKzF9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxpaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksb2k9MipNYXRoLlBJLGFpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksdWk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K3IpL2UpfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqb2kpfSxpLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxpfSgxLC4zKSxmaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/bipNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChyLXQpL2UpOjItbipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksY2k9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlVyfTtmdW5jdGlvbiBzaSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBjaS50aW1lPWlyKCksY2k7cmV0dXJuIGV9THQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TnIodGhpcyx0KX0pfSxMdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBQcj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVJyKCksKGU9Y2kpLnRpbWU9aXIoKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiZ3cihhLHQsbixjLHUsZXx8c2koYSxuKSk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIGxpPVtudWxsXTtmdW5jdGlvbiBoaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZGkodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX1mdW5jdGlvbiBwaSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gdmkoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgZ2k9e25hbWU6ImRyYWcifSx5aT17bmFtZToic3BhY2UifSxfaT17bmFtZToiaGFuZGxlIn0sYmk9e25hbWU6ImNlbnRlciJ9LG1pPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoRWkpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx4aT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sd2k9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sTWk9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEFpPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxUaT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmk9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sU2k9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gRWkodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24ga2koKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gQ2koKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gUGkodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIFJpKG4pe3ZhciBlLHI9Q2ksaT1raSxvPUkodSwic3RhcnQiLCJicnVzaCIsImVuZCIpLGE9NjtmdW5jdGlvbiB1KHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGgpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtFaSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UGkodGhpcykuZXh0ZW50O0R0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbRWkoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsTWkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIHI9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBNaVt0LnR5cGVdfSksdC5lYWNoKGYpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsbCl9ZnVuY3Rpb24gZigpe3ZhciB0PUR0KHRoaXMpLG49UGkodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWEvMjpuWzBdWzBdLWEvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWEvMjpuWzBdWzFdLWEvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0rYTphfSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rYTphfSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBjKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgcyh0LG4pfWZ1bmN0aW9uIHModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIGwoKXtpZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHZpKCl9ZWxzZSBpZihlKXJldHVybjtpZihpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHIsbyxhLHUscyxsLGgsZCxwLHYsZyx5LF8sYj10aGlzLG09dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSx4PSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9tPSJvdmVybGF5IjptKT9naTp0LmV2ZW50LmFsdEtleT9iaTpfaSx3PW49PT14aT9udWxsOk5pW21dLE09bj09PW1pP251bGw6U2lbbV0sQT1QaShiKSxUPUEuZXh0ZW50LE49QS5zZWxlY3Rpb24sUz1UWzBdWzBdLEU9VFswXVsxXSxrPVRbMV1bMF0sQz1UWzFdWzFdLFA9dyYmTSYmdC5ldmVudC5zaGlmdEtleSx6PUZ0KGIpLFI9eixMPWMoYixhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09bT9BLnNlbGVjdGlvbj1OPVtbcj1uPT09eGk/Uzp6WzBdLGE9bj09PW1pP0U6elsxXV0sW3M9bj09PXhpP2s6cixoPW49PT1taT9DOmFdXToocj1OWzBdWzBdLGE9TlswXVsxXSxzPU5bMV1bMF0saD1OWzFdWzFdKSxvPXIsdT1hLGw9cyxkPWg7dmFyIEQ9RHQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksVT1ELnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLE1pW21dKTtpZih0LmV2ZW50LnRvdWNoZXMpRC5vbigidG91Y2htb3ZlLmJydXNoIixPLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLEIsITApO2Vsc2V7dmFyIHE9RHQodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlA9dyYmTTticmVhaztjYXNlIDE4Ong9PT1faSYmKHcmJihzPWwtcCp3LHI9bytwKncpLE0mJihoPWQtdipNLGE9dSt2Kk0pLHg9YmksWSgpKTticmVhaztjYXNlIDMyOnghPT1faSYmeCE9PWJpfHwodzwwP3M9bC1wOnc+MCYmKHI9by1wKSxNPDA/aD1kLXY6TT4wJiYoYT11LXYpLHg9eWksVS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbiksWSgpKTticmVhaztkZWZhdWx0OnJldHVybn12aSgpfSwhMCkub24oImtleXVwLmJydXNoIixmdW5jdGlvbigpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6UCYmKHk9Xz1QPSExLFkoKSk7YnJlYWs7Y2FzZSAxODp4PT09YmkmJih3PDA/cz1sOnc+MCYmKHI9byksTTwwP2g9ZDpNPjAmJihhPXUpLHg9X2ksWSgpKTticmVhaztjYXNlIDMyOng9PT15aSYmKHQuZXZlbnQuYWx0S2V5Pyh3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpKToodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pKSxVLmF0dHIoImN1cnNvciIsTWlbbV0pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLE8sITApLm9uKCJtb3VzZXVwLmJydXNoIixCLCEwKTtYdCh0LmV2ZW50LnZpZXcpfXBpKCksTnIoYiksZi5jYWxsKGIpLEwuc3RhcnQoKX1mdW5jdGlvbiBPKCl7dmFyIHQ9RnQoYik7IVB8fHl8fF98fChNYXRoLmFicyh0WzBdLVJbMF0pPk1hdGguYWJzKHRbMV0tUlsxXSk/Xz0hMDp5PSEwKSxSPXQsZz0hMCx2aSgpLFkoKX1mdW5jdGlvbiBZKCl7dmFyIHQ7c3dpdGNoKHA9UlswXS16WzBdLHY9UlsxXS16WzFdLHgpe2Nhc2UgeWk6Y2FzZSBnaTp3JiYocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1zLHApKSxvPXIrcCxsPXMrcCksTSYmKHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtaCx2KSksdT1hK3YsZD1oK3YpO2JyZWFrO2Nhc2UgX2k6dzwwPyhwPU1hdGgubWF4KFMtcixNYXRoLm1pbihrLXIscCkpLG89citwLGw9cyk6dz4wJiYocD1NYXRoLm1heChTLXMsTWF0aC5taW4oay1zLHApKSxvPXIsbD1zK3ApLE08MD8odj1NYXRoLm1heChFLWEsTWF0aC5taW4oQy1hLHYpKSx1PWErdixkPWgpOk0+MCYmKHY9TWF0aC5tYXgoRS1oLE1hdGgubWluKEMtaCx2KSksdT1hLGQ9aCt2KTticmVhaztjYXNlIGJpOncmJihvPU1hdGgubWF4KFMsTWF0aC5taW4oayxyLXAqdykpLGw9TWF0aC5tYXgoUyxNYXRoLm1pbihrLHMrcCp3KSkpLE0mJih1PU1hdGgubWF4KEUsTWF0aC5taW4oQyxhLXYqTSkpLGQ9TWF0aC5tYXgoRSxNYXRoLm1pbihDLGgrdipNKSkpfWw8byYmKHcqPS0xLHQ9cixyPXMscz10LHQ9byxvPWwsbD10LG0gaW4gQWkmJlUuYXR0cigiY3Vyc29yIixNaVttPUFpW21dXSkpLGQ8dSYmKE0qPS0xLHQ9YSxhPWgsaD10LHQ9dSx1PWQsZD10LG0gaW4gVGkmJlUuYXR0cigiY3Vyc29yIixNaVttPVRpW21dXSkpLEEuc2VsZWN0aW9uJiYoTj1BLnNlbGVjdGlvbikseSYmKG89TlswXVswXSxsPU5bMV1bMF0pLF8mJih1PU5bMF1bMV0sZD1OWzFdWzFdKSxOWzBdWzBdPT09byYmTlswXVsxXT09PXUmJk5bMV1bMF09PT1sJiZOWzFdWzFdPT09ZHx8KEEuc2VsZWN0aW9uPVtbbyx1XSxbbCxkXV0sZi5jYWxsKGIpLEwuYnJ1c2goKSl9ZnVuY3Rpb24gQigpe2lmKHBpKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSw1MDApLEQub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBHdCh0LmV2ZW50LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7RC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFUuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHppKE4pJiYoQS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoYikpLEwuZW5kKCl9fWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH1yZXR1cm4gdS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPXQuX19icnVzaCxpPWModCxhcmd1bWVudHMpLG89ci5zZWxlY3Rpb24sYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsci5leHRlbnQpLHU9bWUobyxhKTtmdW5jdGlvbiBzKG4pe3Iuc2VsZWN0aW9uPTE9PT1uJiZ6aShhKT9udWxsOnUobiksZi5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbyYmYT9zOnMoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMscj10aGlzLl9fYnJ1c2gsaT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyx0KTplLHIuZXh0ZW50KSxvPWModGhpcyx0KS5iZWZvcmVzdGFydCgpO05yKHRoaXMpLHIuc2VsZWN0aW9uPW51bGw9PWl8fHppKGkpP251bGw6aSxmLmNhbGwodGhpcyksby5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0scy5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nJiYodGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgZGkodSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksby5hcHBseSxvLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHUpOnJ9LHUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoISF0KSx1KTppfSx1LmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSk6YX0sdS5vbj1mdW5jdGlvbigpe3ZhciB0PW8ub24uYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiB0PT09bz91OnR9LHV9dmFyIExpPU1hdGguY29zLERpPU1hdGguc2luLFVpPU1hdGguUEkscWk9VWkvMixPaT0yKlVpLFlpPU1hdGgubWF4O3ZhciBCaT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gRmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBJaT1NYXRoLlBJLEhpPTIqSWksamk9SGktMWUtNjtmdW5jdGlvbiBYaSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIEdpKCl7cmV0dXJuIG5ldyBYaX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gJGkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIFdpKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0LmVuZEFuZ2xlfVhpLnByb3RvdHlwZT1HaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhpLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHU9ZS10LGY9ci1uLGM9by10LHM9YS1uLGw9YypjK3MqcztpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD4xZS02KWlmKE1hdGguYWJzKHMqdS1mKmMpPjFlLTYmJmkpe3ZhciBoPWUtbyxkPXItYSxwPXUqdStmKmYsdj1oKmgrZCpkLGc9TWF0aC5zcXJ0KHApLHk9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoSWktTWF0aC5hY29zKChwK2wtdikvKDIqZyp5KSkpLzIpLGI9Xy95LG09Xy9nO01hdGguYWJzKGItMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K2IqYykrIiwiKyhuK2IqcykpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhzKmg+YypkKSsiLCIrKHRoaXMuX3gxPXQrbSp1KSsiLCIrKHRoaXMuX3kxPW4rbSpmKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbjt2YXIgYT0oZT0rZSkqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGY9dCthLGM9bit1LHM9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrZisiLCIrYzooTWF0aC5hYnModGhpcy5feDEtZik+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtYyk+MWUtNikmJih0aGlzLl8rPSJMIitmKyIsIitjKSxlJiYobDwwJiYobD1sJUhpK0hpKSxsPmppP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodC1hKSsiLCIrKG4tdSkrIkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodGhpcy5feDE9ZikrIiwiKyh0aGlzLl95MT1jKTpsPjFlLTYmJih0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PUlpKSsiLCIrcysiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07ZnVuY3Rpb24gSmkoKXt9ZnVuY3Rpb24gS2kodCxuKXt2YXIgZT1uZXcgSmk7aWYodCBpbnN0YW5jZW9mIEppKXQuZWFjaChmdW5jdGlvbih0LG4pe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytpPG87KWUuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxvOyllLnNldChuKHI9dFtpXSxpLHQpLHIpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCllLnNldChhLHRbYV0pO3JldHVybiBlfWZ1bmN0aW9uIHRvKCl7cmV0dXJue319ZnVuY3Rpb24gbm8odCxuLGUpe3Rbbl09ZX1mdW5jdGlvbiBlbygpe3JldHVybiBLaSgpfWZ1bmN0aW9uIHJvKHQsbixlKXt0LnNldChuLGUpfWZ1bmN0aW9uIGlvKCl7fUppLnByb3RvdHlwZT1LaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkppLGhhczpmdW5jdGlvbih0KXtyZXR1cm4iJCIrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIiQiK3RdfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpc1siJCIrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49IiQiK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpIiQiPT09dFswXSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh7a2V5Om4uc2xpY2UoMSksdmFsdWU6dGhpc1tuXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYoIiQiPT09dFswXSlyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0KHRoaXNbbl0sbi5zbGljZSgxKSx0aGlzKX19O3ZhciBvbz1LaS5wcm90b3R5cGU7ZnVuY3Rpb24gYW8odCxuKXt2YXIgZT1uZXcgaW87aWYodCBpbnN0YW5jZW9mIGlvKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWlvLnByb3RvdHlwZT1hby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmlvLGhhczpvby5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIisodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpvby5yZW1vdmUsY2xlYXI6b28uY2xlYXIsdmFsdWVzOm9vLmtleXMsc2l6ZTpvby5zaXplLGVtcHR5Om9vLmVtcHR5LGVhY2g6b28uZWFjaH07dmFyIHVvPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBmbyh0LG4pe3JldHVybiB0LW59ZnVuY3Rpb24gY28odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHNvKHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1sbyh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIGxvKHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgZj10W29dLGM9ZlswXSxzPWZbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoaG8oZixsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWMpKihyLXMpLyhkLXMpK2MmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBobyh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHBvKCl7fXZhciB2bz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIGdvKCl7dmFyIHQ9MSxuPTEsZT1NLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KGZvKTtlbHNle3ZhciByPXModCksaT1yWzBdLGE9clsxXTtuPXcoaSxhLG4pLG49ZyhNYXRoLmZsb29yKGkvbikqbixNYXRoLmZsb29yKGEvbikqbixuKX1yZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG8odCxuKX0pfWZ1bmN0aW9uIG8oZSxpKXt2YXIgbz1bXSx1PVtdO3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG8sdSxmLGMscyxsLGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O289dT0tMSxjPWVbMF0+PXIsdm9bYzw8MV0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWY9YyxjPWVbbysxXT49cix2b1tmfGM8PDFdLmZvckVhY2gocCk7dm9bYzw8MF0uZm9yRWFjaChwKTtmb3IoOysrdTxuLTE7KXtmb3Iobz0tMSxjPWVbdSp0K3RdPj1yLHM9ZVt1KnRdPj1yLHZvW2M8PDF8czw8Ml0uZm9yRWFjaChwKTsrK288dC0xOylmPWMsYz1lW3UqdCt0K28rMV0+PXIsbD1zLHM9ZVt1KnQrbysxXT49cix2b1tmfGM8PDF8czw8MnxsPDwzXS5mb3JFYWNoKHApO3ZvW2N8czw8M10uZm9yRWFjaChwKX1vPS0xLHM9ZVt1KnRdPj1yLHZvW3M8PDJdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylsPXMscz1lW3UqdCtvKzFdPj1yLHZvW3M8PDJ8bDw8M10uZm9yRWFjaChwKTtmdW5jdGlvbiBwKHQpe3ZhciBuLGUscj1bdFswXVswXStvLHRbMF1bMV0rdV0sZj1bdFsxXVswXStvLHRbMV1bMV0rdV0sYz1hKHIpLHM9YShmKTsobj1kW2NdKT8oZT1oW3NdKT8oZGVsZXRlIGRbbi5lbmRdLGRlbGV0ZSBoW2Uuc3RhcnRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBkW24uZW5kXSxuLnJpbmcucHVzaChmKSxkW24uZW5kPXNdPW4pOihuPWhbc10pPyhlPWRbY10pPyhkZWxldGUgaFtuLnN0YXJ0XSxkZWxldGUgZFtlLmVuZF0sbj09PWU/KG4ucmluZy5wdXNoKGYpLGkobi5yaW5nKSk6aFtlLnN0YXJ0XT1kW24uZW5kXT17c3RhcnQ6ZS5zdGFydCxlbmQ6bi5lbmQscmluZzplLnJpbmcuY29uY2F0KG4ucmluZyl9KTooZGVsZXRlIGhbbi5zdGFydF0sbi5yaW5nLnVuc2hpZnQociksaFtuLnN0YXJ0PWNdPW4pOmhbY109ZFtzXT17c3RhcnQ6YyxlbmQ6cyxyaW5nOltyLGZdfX12b1tzPDwzXS5mb3JFYWNoKHApfShlLGksZnVuY3Rpb24odCl7cih0LGUsaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD9vLnB1c2goW3RdKTp1LnB1c2godCl9KSx1LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPW8ubGVuZ3RoO2U8cjsrK2UpaWYoLTEhPT1zbygobj1vW2VdKVswXSx0KSlyZXR1cm4gdm9pZCBuLnB1c2godCl9KSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOm99fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBvLGE9ZVswXSx1PWVbMV0sZj0wfGEsYz0wfHUscz1yW2MqdCtmXTthPjAmJmE8dCYmZj09PWEmJihvPXJbYyp0K2YtMV0sZVswXT1hKyhpLW8pLyhzLW8pLS41KSx1PjAmJnU8biYmYz09PXUmJihvPXJbKGMtMSkqdCtmXSxlWzFdPXUrKGktbykvKHMtbyktLjUpfSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmNlaWwoZVswXSksbz1NYXRoLmNlaWwoZVsxXSk7aWYoIShyPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1yLG49byxpfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGkpOmV9LGkuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQ/dTpwbyxpKTpyPT09dX0saX1mdW5jdGlvbiB5byh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPGk7KythKWZvcih2YXIgdT0wLGY9MDt1PHIrZTsrK3UpdTxyJiYoZis9dC5kYXRhW3UrYSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbdS1vK2Eqcl0pLG4uZGF0YVt1LWUrYSpyXT1mL01hdGgubWluKHUrMSxyLTErby11LG8pKX1mdW5jdGlvbiBfbyh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPHI7KythKWZvcih2YXIgdT0wLGY9MDt1PGkrZTsrK3UpdTxpJiYoZis9dC5kYXRhW2ErdSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbYSsodS1vKSpyXSksbi5kYXRhW2ErKHUtZSkqcl09Zi9NYXRoLm1pbih1KzEsaS0xK28tdSxvKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbW8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24geG8oKXtyZXR1cm4gMX12YXIgd289e30sTW89e30sQW89MzQsVG89MTAsTm89MTM7ZnVuY3Rpb24gU28odCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBFbyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsZj1vPD0wLGM9ITE7ZnVuY3Rpb24gcygpe2lmKGYpcmV0dXJuIE1vO2lmKGMpcmV0dXJuIGM9ITEsd287dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09QW8pe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUFvfHx0LmNoYXJDb2RlQXQoKythKT09PUFvOyk7cmV0dXJuKG49YSk+PW8/Zj0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1Ubz9jPSEwOnI9PT1ObyYmKGM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVRvKWM9ITA7ZWxzZSBpZihyPT09Tm8pYz0hMCx0LmNoYXJDb2RlQXQoYSk9PT1UbyYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gZj0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VG8mJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PU5vJiYtLW87KHI9cygpKSE9PU1vOyl7Zm9yKHZhciBsPVtdO3IhPT13byYmciE9PU1vOylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10PyIiOm4udGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXJldHVybntwYXJzZTpmdW5jdGlvbih0LG4pe3ZhciBlLGksbz1yKHQsZnVuY3Rpb24odCxyKXtpZihlKXJldHVybiBlKHQsci0xKTtpPXQsZT1uP2Z1bmN0aW9uKHQsbil7dmFyIGU9U28odCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxuKTpTbyh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKG8pLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGkpLmpvaW4oIlxuIil9fX12YXIga289RW8oIiwiKSxDbz1rby5wYXJzZSxQbz1rby5wYXJzZVJvd3Msem89a28uZm9ybWF0LFJvPWtvLmZvcm1hdFJvd3MsTG89RW8oIlx0IiksRG89TG8ucGFyc2UsVW89TG8ucGFyc2VSb3dzLHFvPUxvLmZvcm1hdCxPbz1Mby5mb3JtYXRSb3dzO2Z1bmN0aW9uIFlvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gQm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gRm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBJbyh0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oRm8pfWZ1bmN0aW9uIEhvKHQpe3JldHVybiBmdW5jdGlvbihuLGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPXZvaWQgMCksSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KX19dmFyIGpvPUhvKENvKSxYbz1IbyhEbyk7ZnVuY3Rpb24gR28odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0Lmpzb24oKX1mdW5jdGlvbiBWbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KX0pfX12YXIgJG89Vm8oImFwcGxpY2F0aW9uL3htbCIpLFdvPVZvKCJ0ZXh0L2h0bWwiKSxabz1WbygiaW1hZ2Uvc3ZnK3htbCIpO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBKbygpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX1mdW5jdGlvbiBLbyh0LG4sZSxyKXtpZihpc05hTihuKXx8aXNOYU4oZSkpcmV0dXJuIHQ7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQ9dC5fcm9vdCxwPXtkYXRhOnJ9LHY9dC5feDAsZz10Ll95MCx5PXQuX3gxLF89dC5feTE7aWYoIWQpcmV0dXJuIHQuX3Jvb3Q9cCx0O2Zvcig7ZC5sZW5ndGg7KWlmKChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hLGk9ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiBpW2xdPXAsdDtpZih1PSt0Ll94LmNhbGwobnVsbCxkLmRhdGEpLGY9K3QuX3kuY2FsbChudWxsLGQuZGF0YSksbj09PXUmJmU9PT1mKXJldHVybiBwLm5leHQ9ZCxpP2lbbF09cDp0Ll9yb290PXAsdDtkb3tpPWk/aVtsXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKHM9ZT49KGE9KGcrXykvMikpP2c9YTpfPWF9d2hpbGUoKGw9czw8MXxjKT09KGg9KGY+PWEpPDwxfHU+PW8pKTtyZXR1cm4gaVtoXT1kLGlbbF09cCx0fWZ1bmN0aW9uIHRhKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfWZ1bmN0aW9uIG5hKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGVhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHJhKHQsbixlKXt2YXIgcj1uZXcgaWEobnVsbD09bj9uYTpuLG51bGw9PWU/ZWE6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gaWEodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBvYSh0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59dmFyIGFhPXJhLnByb3RvdHlwZT1pYS5wcm90b3R5cGU7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIGZhKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBzYSh0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGhhKHQpe3JldHVybiB0Lnl9YWEuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgaWEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PW9hKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09b2EobikpO3JldHVybiBlfSxhYS5hZGQ9ZnVuY3Rpb24odCl7dmFyIG49K3RoaXMuX3guY2FsbChudWxsLHQpLGU9K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBLbyh0aGlzLmNvdmVyKG4sZSksbixlLHQpfSxhYS5hZGRBbGw9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSx1PW5ldyBBcnJheShvKSxmPTEvMCxjPTEvMCxzPS0xLzAsbD0tMS8wO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwoYVtlXT1yLHVbZV09aSxyPGYmJihmPXIpLHI+cyYmKHM9ciksaTxjJiYoYz1pKSxpPmwmJihsPWkpKTtmb3IoczxmJiYoZj10aGlzLl94MCxzPXRoaXMuX3gxKSxsPGMmJihjPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoZixjKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUtvKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxhYS5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7aWYoIShlPnR8fHQ+aXx8cj5ufHxuPm8pKXJldHVybiB0aGlzO3ZhciBhLHUsZj1pLWUsYz10aGlzLl9yb290O3N3aXRjaCh1PShuPChyK28pLzIpPDwxfHQ8KGUraSkvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSx0PihpPWUrZil8fG4+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSwoZT1pLWYpPnR8fG4+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSx0PihpPWUrZil8fHI+bik7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSwoZT1pLWYpPnR8fHI+bil9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXN9LGFhLmRhdGE9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSksdH0sYWEuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxhYS5maW5kPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYSx1LGYsYyxzPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxkPXRoaXMuX3kxLHA9W10sdj10aGlzLl9yb290O2Zvcih2JiZwLnB1c2gobmV3IHRhKHYscyxsLGgsZCkpLG51bGw9PWU/ZT0xLzA6KHM9dC1lLGw9bi1lLGg9dCtlLGQ9bitlLGUqPWUpO2Y9cC5wb3AoKTspaWYoISghKHY9Zi5ub2RlKXx8KGk9Zi54MCk+aHx8KG89Zi55MCk+ZHx8KGE9Zi54MSk8c3x8KHU9Zi55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBnPShpK2EpLzIseT0obyt1KS8yO3AucHVzaChuZXcgdGEodlszXSxnLHksYSx1KSxuZXcgdGEodlsyXSxpLHksZyx1KSxuZXcgdGEodlsxXSxnLG8sYSx5KSxuZXcgdGEodlswXSxpLG8sZyx5KSksKGM9KG4+PXkpPDwxfHQ+PWcpJiYoZj1wW3AubGVuZ3RoLTFdLHBbcC5sZW5ndGgtMV09cFtwLmxlbmd0aC0xLWNdLHBbcC5sZW5ndGgtMS1jXT1mKX1lbHNle3ZhciBfPXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksYj1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLG09XypfK2IqYjtpZihtPGUpe3ZhciB4PU1hdGguc3FydChlPW0pO3M9dC14LGw9bi14LGg9dCt4LGQ9bit4LHI9di5kYXRhfX1yZXR1cm4gcn0sYWEucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGwsaCxkPXRoaXMuX3Jvb3QscD10aGlzLl94MCx2PXRoaXMuX3kwLGc9dGhpcy5feDEseT10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PSh1PShwK2cpLzIpKT9wPXU6Zz11LChzPWE+PShmPSh2K3kpLzIpKT92PWY6eT1mLG49ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsobltsKzEmM118fG5bbCsyJjNdfHxuW2wrMyYzXSkmJihlPW4saD1sKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKHI9ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTpuPyhpP25bbF09aTpkZWxldGUgbltsXSwoZD1uWzBdfHxuWzFdfHxuWzJdfHxuWzNdKSYmZD09PShuWzNdfHxuWzJdfHxuWzFdfHxuWzBdKSYmIWQubGVuZ3RoJiYoZT9lW2hdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxhYS5yZW1vdmVBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfSxhYS5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGFhLnNpemU9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkb3srK3R9d2hpbGUobj1uLm5leHQpfSksdH0sYWEudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sZj10aGlzLl9yb290O2ZvcihmJiZ1LnB1c2gobmV3IHRhKGYsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGY9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmYubGVuZ3RoKXt2YXIgYz0ocitvKS8yLHM9KGkrYSkvMjsoZT1mWzNdKSYmdS5wdXNoKG5ldyB0YShlLGMscyxvLGEpKSwoZT1mWzJdKSYmdS5wdXNoKG5ldyB0YShlLHIscyxjLGEpKSwoZT1mWzFdKSYmdS5wdXNoKG5ldyB0YShlLGMsaSxvLHMpKSwoZT1mWzBdKSYmdS5wdXNoKG5ldyB0YShlLHIsaSxjLHMpKX1yZXR1cm4gdGhpc30sYWEudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgdGEodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxmPW4ueDEsYz1uLnkxLHM9KGErZikvMixsPSh1K2MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgdGEobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgdGEobyxzLHUsZixsKSksKG89aVsyXSkmJmUucHVzaChuZXcgdGEobyxhLGwscyxjKSksKG89aVszXSkmJmUucHVzaChuZXcgdGEobyxzLGwsZixjKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sYWEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LGFhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTt2YXIgZGE9MTAscGE9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpO2Z1bmN0aW9uIHZhKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIGdhKHQpe3JldHVybih0PXZhKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59dmFyIHlhLF9hPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGJhKHQpe3JldHVybiBuZXcgbWEodCl9ZnVuY3Rpb24gbWEodCl7aWYoIShuPV9hLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG47dGhpcy5maWxsPW5bMV18fCIgIix0aGlzLmFsaWduPW5bMl18fCI+Iix0aGlzLnNpZ249blszXXx8Ii0iLHRoaXMuc3ltYm9sPW5bNF18fCIiLHRoaXMuemVybz0hIW5bNV0sdGhpcy53aWR0aD1uWzZdJiYrbls2XSx0aGlzLmNvbW1hPSEhbls3XSx0aGlzLnByZWNpc2lvbj1uWzhdJiYrbls4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFuWzldLHRoaXMudHlwZT1uWzEwXXx8IiJ9ZnVuY3Rpb24geGEodCxuKXt2YXIgZT12YSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWJhLnByb3RvdHlwZT1tYS5wcm90b3R5cGUsbWEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07dmFyIHdhPXsiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiB4YSgxMDAqdCxuKX0scjp4YSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKHlhPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSxhPXIubGVuZ3RoO3JldHVybiBvPT09YT9yOm8+YT9yK25ldyBBcnJheShvLWErMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrdmEodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHR9dmFyIEFhLFRhPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBOYSh0KXt2YXIgbixlLHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KG49dC5ncm91cGluZyxlPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10sYT0wLHU9blswXSxmPTA7aT4wJiZ1PjAmJihmK3UrMT5yJiYodT1NYXRoLm1heCgxLHItZikpLG8ucHVzaCh0LnN1YnN0cmluZyhpLT11LGkrdSkpLCEoKGYrPXUrMSk+cikpOyl1PW5bYT0oYSsxKSVuLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9KTpNYSxpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsYT10Lm51bWVyYWxzP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0odC5udW1lcmFscyk6TWEsdT10LnBlcmNlbnR8fCIlIjtmdW5jdGlvbiBmKHQpe3ZhciBuPSh0PWJhKHQpKS5maWxsLGU9dC5hbGlnbixmPXQuc2lnbixjPXQuc3ltYm9sLHM9dC56ZXJvLGw9dC53aWR0aCxoPXQuY29tbWEsZD10LnByZWNpc2lvbixwPXQudHJpbSx2PXQudHlwZTsibiI9PT12PyhoPSEwLHY9ImciKTp3YVt2XXx8KG51bGw9PWQmJihkPTEyKSxwPSEwLHY9ImciKSwoc3x8IjAiPT09biYmIj0iPT09ZSkmJihzPSEwLG49IjAiLGU9Ij0iKTt2YXIgZz0iJCI9PT1jP2lbMF06IiMiPT09YyYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLHk9IiQiPT09Yz9pWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIsXz13YVt2XSxiPS9bZGVmZ3BycyVdLy50ZXN0KHYpO2Z1bmN0aW9uIG0odCl7dmFyIGksdSxjLG09Zyx4PXk7aWYoImMiPT09dil4PV8odCkreCx0PSIiO2Vsc2V7dmFyIHc9KHQ9K3QpPDA7aWYodD1fKE1hdGguYWJzKHQpLGQpLHAmJih0PWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBuLGU9dC5sZW5ndGgscj0xLGk9LTE7cjxlOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjppPW49cjticmVhaztjYXNlIjAiOjA9PT1pJiYoaT1yKSxuPXI7YnJlYWs7ZGVmYXVsdDppZihpPjApe2lmKCErdFtyXSlicmVhayB0O2k9MH19cmV0dXJuIGk+MD90LnNsaWNlKDAsaSkrdC5zbGljZShuKzEpOnR9KHQpKSx3JiYwPT0rdCYmKHc9ITEpLG09KHc/IigiPT09Zj9mOiItIjoiLSI9PT1mfHwiKCI9PT1mPyIiOmYpK20seD0oInMiPT09dj9UYVs4K3lhLzNdOiIiKSt4Kyh3JiYiKCI9PT1mPyIpIjoiIiksYilmb3IoaT0tMSx1PXQubGVuZ3RoOysraTx1OylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXt4PSg0Nj09PWM/byt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkreCx0PXQuc2xpY2UoMCxpKTticmVha319aCYmIXMmJih0PXIodCwxLzApKTt2YXIgTT1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxBPU08bD9uZXcgQXJyYXkobC1NKzEpLmpvaW4obik6IiI7c3dpdGNoKGgmJnMmJih0PXIoQSt0LEEubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxBPSIiKSxlKXtjYXNlIjwiOnQ9bSt0K3grQTticmVhaztjYXNlIj0iOnQ9bStBK3QreDticmVhaztjYXNlIl4iOnQ9QS5zbGljZSgwLE09QS5sZW5ndGg+PjEpK20rdCt4K0Euc2xpY2UoTSk7YnJlYWs7ZGVmYXVsdDp0PUErbSt0K3h9cmV0dXJuIGEodCl9cmV0dXJuIGQ9bnVsbD09ZD82Oi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxtfXJldHVybntmb3JtYXQ6Zixmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1mKCgodD1iYSh0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPVRhWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIFNhKG4pe3JldHVybiBBYT1OYShuKSx0LmZvcm1hdD1BYS5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9QWEuZm9ybWF0UHJlZml4LEFhfWZ1bmN0aW9uIEVhKHQpe3JldHVybiBNYXRoLm1heCgwLC1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKS1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsZ2EobiktZ2EodCkpKzF9ZnVuY3Rpb24gUGEoKXtyZXR1cm4gbmV3IHphfWZ1bmN0aW9uIHphKCl7dGhpcy5yZXNldCgpfVNhKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLHphLnByb3RvdHlwZT17Y29uc3RydWN0b3I6emEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtMYShSYSx0LHRoaXMudCksTGEodGhpcyxSYS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9UmEudDp0aGlzLnM9UmEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgUmE9bmV3IHphO2Z1bmN0aW9uIExhKHQsbixlKXt2YXIgcj10LnM9bitlLGk9ci1uLG89ci1pO3QudD1uLW8rKGUtaSl9dmFyIERhPTFlLTYsVWE9MWUtMTIscWE9TWF0aC5QSSxPYT1xYS8yLFlhPXFhLzQsQmE9MipxYSxGYT0xODAvcWEsSWE9cWEvMTgwLEhhPU1hdGguYWJzLGphPU1hdGguYXRhbixYYT1NYXRoLmF0YW4yLEdhPU1hdGguY29zLFZhPU1hdGguY2VpbCwkYT1NYXRoLmV4cCxXYT1NYXRoLmxvZyxaYT1NYXRoLnBvdyxRYT1NYXRoLnNpbixKYT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sS2E9TWF0aC5zcXJ0LHR1PU1hdGgudGFuO2Z1bmN0aW9uIG51KHQpe3JldHVybiB0PjE/MDp0PC0xP3FhOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBldSh0KXtyZXR1cm4gdD4xP09hOnQ8LTE/LU9hOk1hdGguYXNpbih0KX1mdW5jdGlvbiBydSh0KXtyZXR1cm4odD1RYSh0LzIpKSp0fWZ1bmN0aW9uIGl1KCl7fWZ1bmN0aW9uIG91KHQsbil7dCYmdXUuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdXVbdC50eXBlXSh0LG4pfXZhciBhdT17RmVhdHVyZTpmdW5jdGlvbih0LG4pe291KHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylvdShlW3JdLmdlb21ldHJ5LG4pfX0sdXU9e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmdSh0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspZnUoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Y3UodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyljdShlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXSxuKX19O2Z1bmN0aW9uIGZ1KHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIGN1KHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZnUodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHN1KHQsbil7dCYmYXUuaGFzT3duUHJvcGVydHkodC50eXBlKT9hdVt0LnR5cGVdKHQsbik6b3UodCxuKX12YXIgbHUsaHUsZHUscHUsdnUsZ3U9UGEoKSx5dT1QYSgpLF91PXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtndS5yZXNldCgpLF91LmxpbmVTdGFydD1idSxfdS5saW5lRW5kPW11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2d1O3l1LmFkZCh0PDA/QmErdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1pdX0sc3BoZXJlOmZ1bmN0aW9uKCl7eXUuYWRkKEJhKX19O2Z1bmN0aW9uIGJ1KCl7X3UucG9pbnQ9eHV9ZnVuY3Rpb24gbXUoKXt3dShsdSxodSl9ZnVuY3Rpb24geHUodCxuKXtfdS5wb2ludD13dSxsdT10LGh1PW4sZHU9dCo9SWEscHU9R2Eobj0obio9SWEpLzIrWWEpLHZ1PVFhKG4pfWZ1bmN0aW9uIHd1KHQsbil7dmFyIGU9KHQqPUlhKS1kdSxyPWU+PTA/MTotMSxpPXIqZSxvPUdhKG49KG4qPUlhKS8yK1lhKSxhPVFhKG4pLHU9dnUqYSxmPXB1Km8rdSpHYShpKSxjPXUqcipRYShpKTtndS5hZGQoWGEoYyxmKSksZHU9dCxwdT1vLHZ1PWF9ZnVuY3Rpb24gTXUodCl7cmV0dXJuW1hhKHRbMV0sdFswXSksZXUodFsyXSldfWZ1bmN0aW9uIEF1KHQpe3ZhciBuPXRbMF0sZT10WzFdLHI9R2EoZSk7cmV0dXJuW3IqR2EobikscipRYShuKSxRYShlKV19ZnVuY3Rpb24gVHUodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19ZnVuY3Rpb24gTnUodCxuKXtyZXR1cm5bdFsxXSpuWzJdLXRbMl0qblsxXSx0WzJdKm5bMF0tdFswXSpuWzJdLHRbMF0qblsxXS10WzFdKm5bMF1dfWZ1bmN0aW9uIFN1KHQsbil7dFswXSs9blswXSx0WzFdKz1uWzFdLHRbMl0rPW5bMl19ZnVuY3Rpb24gRXUodCxuKXtyZXR1cm5bdFswXSpuLHRbMV0qbix0WzJdKm5dfWZ1bmN0aW9uIGt1KHQpe3ZhciBuPUthKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1uLHRbMV0vPW4sdFsyXS89bn12YXIgQ3UsUHUsenUsUnUsTHUsRHUsVXUscXUsT3UsWXUsQnUsRnUsSXUsSHUsanUsWHUsR3UsVnUsJHUsV3UsWnUsUXUsSnUsS3UsdGYsbmYsZWY9UGEoKSxyZj17cG9pbnQ6b2YsbGluZVN0YXJ0OnVmLGxpbmVFbmQ6ZmYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cmYucG9pbnQ9Y2YscmYubGluZVN0YXJ0PXNmLHJmLmxpbmVFbmQ9bGYsZWYucmVzZXQoKSxfdS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe191LnBvbHlnb25FbmQoKSxyZi5wb2ludD1vZixyZi5saW5lU3RhcnQ9dWYscmYubGluZUVuZD1mZixndTwwPyhDdT0tKHp1PTE4MCksUHU9LShSdT05MCkpOmVmPkRhP1J1PTkwOmVmPC1EYSYmKFB1PS05MCksWXVbMF09Q3UsWXVbMV09enV9fTtmdW5jdGlvbiBvZih0LG4pe091LnB1c2goWXU9W0N1PXQsenU9dF0pLG48UHUmJihQdT1uKSxuPlJ1JiYoUnU9bil9ZnVuY3Rpb24gYWYodCxuKXt2YXIgZT1BdShbdCpJYSxuKklhXSk7aWYocXUpe3ZhciByPU51KHF1LGUpLGk9TnUoW3JbMV0sLXJbMF0sMF0scik7a3UoaSksaT1NdShpKTt2YXIgbyxhPXQtTHUsdT1hPjA/MTotMSxmPWlbMF0qRmEqdSxjPUhhKGEpPjE4MDtjXih1Kkx1PGYmJmY8dSp0KT8obz1pWzFdKkZhKT5SdSYmKFJ1PW8pOmNeKHUqTHU8KGY9KGYrMzYwKSUzNjAtMTgwKSYmZjx1KnQpPyhvPS1pWzFdKkZhKTxQdSYmKFB1PW8pOihuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pKSxjP3Q8THU/aGYoQ3UsdCk+aGYoQ3UsenUpJiYoenU9dCk6aGYodCx6dSk+aGYoQ3UsenUpJiYoQ3U9dCk6enU+PUN1Pyh0PEN1JiYoQ3U9dCksdD56dSYmKHp1PXQpKTp0Pkx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpfWVsc2UgT3UucHVzaChZdT1bQ3U9dCx6dT10XSk7bjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSxxdT1lLEx1PXR9ZnVuY3Rpb24gdWYoKXtyZi5wb2ludD1hZn1mdW5jdGlvbiBmZigpe1l1WzBdPUN1LFl1WzFdPXp1LHJmLnBvaW50PW9mLHF1PW51bGx9ZnVuY3Rpb24gY2YodCxuKXtpZihxdSl7dmFyIGU9dC1MdTtlZi5hZGQoSGEoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBEdT10LFV1PW47X3UucG9pbnQodCxuKSxhZih0LG4pfWZ1bmN0aW9uIHNmKCl7X3UubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbGYoKXtjZihEdSxVdSksX3UubGluZUVuZCgpLEhhKGVmKT5EYSYmKEN1PS0oenU9MTgwKSksWXVbMF09Q3UsWXVbMV09enUscXU9bnVsbH1mdW5jdGlvbiBoZih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24gZGYodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIHBmKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgdmY9e3NwaGVyZTppdSxwb2ludDpnZixsaW5lU3RhcnQ6X2YsbGluZUVuZDp4Zixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9d2YsdmYubGluZUVuZD1NZn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZmLmxpbmVTdGFydD1fZix2Zi5saW5lRW5kPXhmfX07ZnVuY3Rpb24gZ2YodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSk7eWYoZSpHYSh0KSxlKlFhKHQpLFFhKG4pKX1mdW5jdGlvbiB5Zih0LG4sZSl7SXUrPSh0LUl1KS8rK0J1LEh1Kz0obi1IdSkvQnUsanUrPShlLWp1KS9CdX1mdW5jdGlvbiBfZigpe3ZmLnBvaW50PWJmfWZ1bmN0aW9uIGJmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx2Zi5wb2ludD1tZix5ZihLdSx0ZixuZil9ZnVuY3Rpb24gbWYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9WGEoS2EoKGE9dGYqby1uZippKSphKyhhPW5mKnItS3UqbykqYSsoYT1LdSppLXRmKnIpKmEpLEt1KnIrdGYqaStuZipvKTtGdSs9YSxYdSs9YSooS3UrKEt1PXIpKSxHdSs9YSoodGYrKHRmPWkpKSxWdSs9YSoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24geGYoKXt2Zi5wb2ludD1nZn1mdW5jdGlvbiB3Zigpe3ZmLnBvaW50PUFmfWZ1bmN0aW9uIE1mKCl7VGYoUXUsSnUpLHZmLnBvaW50PWdmfWZ1bmN0aW9uIEFmKHQsbil7UXU9dCxKdT1uLHQqPUlhLG4qPUlhLHZmLnBvaW50PVRmO3ZhciBlPUdhKG4pO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gVGYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9dGYqby1uZippLHU9bmYqci1LdSpvLGY9S3UqaS10ZipyLGM9S2EoYSphK3UqdStmKmYpLHM9ZXUoYyksbD1jJiYtcy9jOyR1Kz1sKmEsV3UrPWwqdSxadSs9bCpmLEZ1Kz1zLFh1Kz1zKihLdSsoS3U9cikpLEd1Kz1zKih0ZisodGY9aSkpLFZ1Kz1zKihuZisobmY9bykpLHlmKEt1LHRmLG5mKX1mdW5jdGlvbiBOZih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU2YodCxuKXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9dChlLHIpLG4oZVswXSxlWzFdKX1yZXR1cm4gdC5pbnZlcnQmJm4uaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4oZT1uLmludmVydChlLHIpKSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24gRWYodCxuKXtyZXR1cm5bdD5xYT90LUJhOnQ8LXFhP3QrQmE6dCxuXX1mdW5jdGlvbiBrZih0LG4sZSl7cmV0dXJuKHQlPUJhKT9ufHxlP1NmKFBmKHQpLHpmKG4sZSkpOlBmKHQpOm58fGU/emYobixlKTpFZn1mdW5jdGlvbiBDZih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm5bKG4rPXQpPnFhP24tQmE6bjwtcWE/bitCYTpuLGVdfX1mdW5jdGlvbiBQZih0KXt2YXIgbj1DZih0KTtyZXR1cm4gbi5pbnZlcnQ9Q2YoLXQpLG59ZnVuY3Rpb24gemYodCxuKXt2YXIgZT1HYSh0KSxyPVFhKHQpLGk9R2Eobiksbz1RYShuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyplK3UqcjtyZXR1cm5bWGEoZippLXMqbyx1KmUtYypyKSxldShzKmkrZipvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyppLWYqbztyZXR1cm5bWGEoZippK2Mqbyx1KmUrcypyKSxldShzKmUtdSpyKV19LGF9ZnVuY3Rpb24gUmYodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufXJldHVybiB0PWtmKHRbMF0qSWEsdFsxXSpJYSx0Lmxlbmd0aD4yP3RbMl0qSWE6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSpJYSxuWzFdKklhKSlbMF0qPUZhLG5bMV0qPUZhLG59LG59ZnVuY3Rpb24gTGYodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUdhKG4pLHU9UWEobiksZj1yKmU7bnVsbD09aT8oaT1uK3IqQmEsbz1uLWYvMik6KGk9RGYoYSxpKSxvPURmKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqQmEpKTtmb3IodmFyIGMscz1pO3I+MD9zPm86czxvO3MtPWYpYz1NdShbYSwtdSpHYShzKSwtdSpRYShzKV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gRGYodCxuKXsobj1BdShuKSlbMF0tPXQsa3Uobik7dmFyIGU9bnUoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStCYS1EYSklQmF9ZnVuY3Rpb24gVWYoKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDppdSxyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX1mdW5jdGlvbiBxZih0LG4pe3JldHVybiBIYSh0WzBdLW5bMF0pPERhJiZIYSh0WzFdLW5bMV0pPERhfWZ1bmN0aW9uIE9mKHQsbixlLHIpe3RoaXMueD10LHRoaXMuej1uLHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gWWYodCxuLGUscixpKXt2YXIgbyxhLHU9W10sZj1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLGE9dFtuXTtpZihxZihyLGEpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO2kubGluZUVuZCgpfWVsc2UgdS5wdXNoKGU9bmV3IE9mKHIsdCxudWxsLCEwKSksZi5wdXNoKGUubz1uZXcgT2YocixudWxsLGUsITEpKSx1LnB1c2goZT1uZXcgT2YoYSx0LG51bGwsITEpKSxmLnB1c2goZS5vPW5ldyBPZihhLG51bGwsZSwhMCkpfX0pLHUubGVuZ3RoKXtmb3IoZi5zb3J0KG4pLEJmKHUpLEJmKGYpLG89MCxhPWYubGVuZ3RoO288YTsrK28pZltvXS5lPWU9IWU7Zm9yKHZhciBjLHMsbD11WzBdOzspe2Zvcih2YXIgaD1sLGQ9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47Yz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihkKWZvcihvPTAsYT1jLmxlbmd0aDtvPGE7KytvKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYoZClmb3IoYz1oLnAueixvPWMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgocz1jW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWM9KGg9aC5vKS56LGQ9IWR9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBCZih0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1FZi5pbnZlcnQ9RWY7dmFyIEZmPVBhKCk7ZnVuY3Rpb24gSWYodCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVFhKHIpLG89W1FhKGUpLC1HYShlKSwwXSxhPTAsdT0wO0ZmLnJlc2V0KCksMT09PWk/cj1PYStEYTotMT09PWkmJihyPS1PYS1EYSk7Zm9yKHZhciBmPTAsYz10Lmxlbmd0aDtmPGM7KytmKWlmKGw9KHM9dFtmXSkubGVuZ3RoKWZvcih2YXIgcyxsLGg9c1tsLTFdLGQ9aFswXSxwPWhbMV0vMitZYSx2PVFhKHApLGc9R2EocCkseT0wO3k8bDsrK3ksZD1iLHY9eCxnPXcsaD1fKXt2YXIgXz1zW3ldLGI9X1swXSxtPV9bMV0vMitZYSx4PVFhKG0pLHc9R2EobSksTT1iLWQsQT1NPj0wPzE6LTEsVD1BKk0sTj1UPnFhLFM9dip4O2lmKEZmLmFkZChYYShTKkEqUWEoVCksZyp3K1MqR2EoVCkpKSxhKz1OP00rQSpCYTpNLE5eZD49ZV5iPj1lKXt2YXIgRT1OdShBdShoKSxBdShfKSk7a3UoRSk7dmFyIGs9TnUobyxFKTtrdShrKTt2YXIgQz0oTl5NPj0wPy0xOjEpKmV1KGtbMl0pOyhyPkN8fHI9PT1DJiYoRVswXXx8RVsxXSkpJiYodSs9Tl5NPj0wPzE6LTEpfX1yZXR1cm4oYTwtRGF8fGE8RGEmJkZmPC1EYSleMSZ1fWZ1bmN0aW9uIEhmKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbyxhLHUsZj1uKGkpLGM9VWYoKSxzPW4oYyksbD0hMSxoPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoLnBvaW50PXksaC5saW5lU3RhcnQ9XyxoLmxpbmVFbmQ9YixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtoLnBvaW50PWQsaC5saW5lU3RhcnQ9dixoLmxpbmVFbmQ9ZyxhPU4oYSk7dmFyIHQ9SWYobyxyKTthLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksWWYoYSxYZix0LGUsaSkpOnQmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKG4sZSl7dChuLGUpJiZpLnBvaW50KG4sZSl9ZnVuY3Rpb24gcCh0LG4pe2YucG9pbnQodCxuKX1mdW5jdGlvbiB2KCl7aC5wb2ludD1wLGYubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2gucG9pbnQ9ZCxmLmxpbmVFbmQoKX1mdW5jdGlvbiB5KHQsbil7dS5wdXNoKFt0LG5dKSxzLnBvaW50KHQsbil9ZnVuY3Rpb24gXygpe3MubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBiKCl7eSh1WzBdWzBdLHVbMF1bMV0pLHMubGluZUVuZCgpO3ZhciB0LG4sZSxyLGY9cy5jbGVhbigpLGg9Yy5yZXN1bHQoKSxkPWgubGVuZ3RoO2lmKHUucG9wKCksby5wdXNoKHUpLHU9bnVsbCxkKWlmKDEmZil7aWYoKG49KGU9aFswXSkubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KWkucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7aS5saW5lRW5kKCl9fWVsc2UgZD4xJiYyJmYmJmgucHVzaChoLnBvcCgpLmNvbmNhdChoLnNoaWZ0KCkpKSxhLnB1c2goaC5maWx0ZXIoamYpKX1yZXR1cm4gaH19ZnVuY3Rpb24gamYodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gWGYodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tT2EtRGE6T2EtdFsxXSktKChuPW4ueClbMF08MD9uWzFdLU9hLURhOk9hLW5bMV0pfXZhciBHZj1IZihmdW5jdGlvbigpe3JldHVybiEwfSxmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3FhOi1xYSxmPUhhKG8tZSk7SGEoZi1xYSk8RGE/KHQucG9pbnQoZSxyPShyK2EpLzI+MD9PYTotT2EpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmZj49cWEmJihIYShlLWkpPERhJiYoZS09aSpEYSksSGEoby11KTxEYSYmKG8tPXUqRGEpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVFhKHQtZSk7cmV0dXJuIEhhKGEpPkRhP2phKChRYShuKSoobz1HYShyKSkqUWEoZSktUWEocikqKGk9R2EobikpKlFhKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSxmdW5jdGlvbih0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSpPYSxyLnBvaW50KC1xYSxpKSxyLnBvaW50KDAsaSksci5wb2ludChxYSxpKSxyLnBvaW50KHFhLDApLHIucG9pbnQocWEsLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtcWEsLWkpLHIucG9pbnQoLXFhLDApLHIucG9pbnQoLXFhLGkpO2Vsc2UgaWYoSGEodFswXS1uWzBdKT5EYSl7dmFyIG89dFswXTxuWzBdP3FhOi1xYTtpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX0sWy1xYSwtT2FdKTtmdW5jdGlvbiBWZih0KXt2YXIgbj1HYSh0KSxlPTYqSWEscj1uPjAsaT1IYShuKT5EYTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEdhKHQpKkdhKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPU51KEF1KHQpLEF1KGUpKSxhPVR1KG8sbyksdT1vWzBdLGY9YS11KnU7aWYoIWYpcmV0dXJuIXImJnQ7dmFyIGM9biphL2Yscz0tbip1L2YsbD1OdShpLG8pLGg9RXUoaSxjKTtTdShoLEV1KG8scykpO3ZhciBkPWwscD1UdShoLGQpLHY9VHUoZCxkKSxnPXAqcC12KihUdShoLGgpLTEpO2lmKCEoZzwwKSl7dmFyIHk9S2EoZyksXz1FdShkLCgtcC15KS92KTtpZihTdShfLGgpLF89TXUoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgQT14LW0sVD1IYShBLXFhKTxEYTtpZighVCYmTTx3JiYoYj13LHc9TSxNPWIpLFR8fEE8RGE/VD93K00+MF5fWzFdPChIYShfWzBdLW0pPERhP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpBPnFhXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIE49RXUoZCwoLXAreSkvdik7cmV0dXJuIFN1KE4saCksW18sTXUoTildfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDpxYS10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiBIZihvLGZ1bmN0aW9uKHQpe3ZhciBuLGUsZixjLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9Zj0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIGQscD1bbCxoXSx2PW8obCxoKSxnPXI/dj8wOnUobCxoKTp2P3UobCsobDwwP3FhOi1xYSksaCk6MDtpZighbiYmKGM9Zj12KSYmdC5saW5lU3RhcnQoKSx2IT09ZiYmKCEoZD1hKG4scCkpfHxxZihuLGQpfHxxZihwLGQpKSYmKHBbMF0rPURhLHBbMV0rPURhLHY9byhwWzBdLHBbMV0pKSx2IT09ZilzPTAsdj8odC5saW5lU3RhcnQoKSxkPWEocCxuKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPWEobixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLG49ZDtlbHNlIGlmKGkmJm4mJnJedil7dmFyIHk7ZyZlfHwhKHk9YShwLG4sITApKXx8KHM9MCxyPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmcWYobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxmPXYsZT1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChjJiZmKTw8MX19fSxmdW5jdGlvbihuLHIsaSxvKXtMZihvLHQsZSxpLG4scil9LHI/WzAsLXRdOlstcWEsdC1xYV0pfXZhciAkZj0xZTksV2Y9LSRmO2Z1bmN0aW9uIFpmKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGMpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxmKGksbyk8MF51PjApZG97Yy5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIEhhKHJbMF0tdCk8RGE/aT4wPzA6MzpIYShyWzBdLWUpPERhP2k+MD8yOjE6SGEoclsxXS1uKTxEYT9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBmKHQueCxuLngpfWZ1bmN0aW9uIGYodCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBmLGMscyxsLGgsZCxwLHYsZyx5LF8sYj1hLG09VWYoKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxjJiZjLnB1c2gocz1bXSk7eT0hMCxnPSExLHA9dj1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmJiYoTShsLGgpLGQmJmcmJm0ucmVqb2luKCksZi5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcsZyYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxmPVtdLGM9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Yy5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWNbZV0sZj0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07ZjxzOysrZilvPWgsYT1kLGw9dVtmXSxoPWxbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGY9TihmKSkubGVuZ3RoOyhlfHxpKSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaSYmWWYoZix1LG4sbyxhKSxhLnBvbHlnb25FbmQoKSk7Yj1hLGY9Yz1zPW51bGx9fTtmdW5jdGlvbiB3KHQsbil7aSh0LG4pJiZiLnBvaW50KHQsbil9ZnVuY3Rpb24gTShvLGEpe3ZhciB1PWkobyxhKTtpZihjJiZzLnB1c2goW28sYV0pLHkpbD1vLGg9YSxkPXUseT0hMSx1JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSkpO2Vsc2UgaWYodSYmZyliLnBvaW50KG8sYSk7ZWxzZXt2YXIgZj1bcD1NYXRoLm1heChXZixNYXRoLm1pbigkZixwKSksdj1NYXRoLm1heChXZixNYXRoLm1pbigkZix2KSldLG09W289TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsbykpLGE9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsYSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciBhLHU9dFswXSxmPXRbMV0sYz0wLHM9MSxsPW5bMF0tdSxoPW5bMV0tZjtpZihhPWUtdSxsfHwhKGE+MCkpe2lmKGEvPWwsbDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihsPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPWktdSxsfHwhKGE8MCkpe2lmKGEvPWwsbDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihsPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1pZihhPXItZixofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihoPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tZixofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1yZXR1cm4gYz4wJiYodFswXT11K2MqbCx0WzFdPWYrYypoKSxzPDEmJihuWzBdPXUrcypsLG5bMV09ZitzKmgpLCEwfX19fX0oZixtLHQsbixlLHIpP3UmJihiLmxpbmVTdGFydCgpLGIucG9pbnQobyxhKSxfPSExKTooZ3x8KGIubGluZVN0YXJ0KCksYi5wb2ludChmWzBdLGZbMV0pKSxiLnBvaW50KG1bMF0sbVsxXSksdXx8Yi5saW5lRW5kKCksXz0hMSl9cD1vLHY9YSxnPXV9cmV0dXJuIHh9fXZhciBRZixKZixLZix0Yz1QYSgpLG5jPXtzcGhlcmU6aXUscG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bmMucG9pbnQ9cmMsbmMubGluZUVuZD1lY30sbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdX07ZnVuY3Rpb24gZWMoKXtuYy5wb2ludD1uYy5saW5lRW5kPWl1fWZ1bmN0aW9uIHJjKHQsbil7UWY9dCo9SWEsSmY9UWEobio9SWEpLEtmPUdhKG4pLG5jLnBvaW50PWljfWZ1bmN0aW9uIGljKHQsbil7dCo9SWE7dmFyIGU9UWEobio9SWEpLHI9R2EobiksaT1IYSh0LVFmKSxvPUdhKGkpLGE9cipRYShpKSx1PUtmKmUtSmYqcipvLGY9SmYqZStLZipyKm87dGMuYWRkKFhhKEthKGEqYSt1KnUpLGYpKSxRZj10LEpmPWUsS2Y9cn1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdGMucmVzZXQoKSxzdSh0LG5jKSwrdGN9dmFyIGFjPVtudWxsLG51bGxdLHVjPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczphY307ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gYWNbMF09dCxhY1sxXT1uLG9jKHVjKX12YXIgY2M9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGModC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxzYz17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGhjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGhjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZGModC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHBjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYocGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBsYyh0LG4pe3JldHVybiEoIXR8fCFzYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmc2NbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGhjKHQsbil7cmV0dXJuIDA9PT1mYyh0LG4pfWZ1bmN0aW9uIGRjKHQsbil7dmFyIGU9ZmModFswXSx0WzFdKTtyZXR1cm4gZmModFswXSxuKStmYyhuLHRbMV0pPD1lK0RhfWZ1bmN0aW9uIHBjKHQsbil7cmV0dXJuISFJZih0Lm1hcCh2YyksZ2MobikpfWZ1bmN0aW9uIHZjKHQpe3JldHVybih0PXQubWFwKGdjKSkucG9wKCksdH1mdW5jdGlvbiBnYyh0KXtyZXR1cm5bdFswXSpJYSx0WzFdKklhXX1mdW5jdGlvbiB5Yyh0LG4sZSl7dmFyIHI9Zyh0LG4tRGEsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gX2ModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGJjKCl7dmFyIHQsbixlLHIsaSxvLGEsdSxmLGMscyxsLGg9MTAsZD1oLHA9OTAsdj0zNjAseT0yLjU7ZnVuY3Rpb24gXygpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmIoKX19ZnVuY3Rpb24gYigpe3JldHVybiBnKFZhKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoZyhWYSh1L3YpKnYsYSx2KS5tYXAobCkpLmNvbmNhdChnKFZhKG4vaCkqaCx0LGgpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCVwKT5EYX0pLm1hcChmKSkuY29uY2F0KGcoVmEoby9kKSpkLGksZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBIYSh0JXYpPkRhfSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiBiKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksXy5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSxfLnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLF8pOltwLHZdfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLF8pOltoLGRdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxmPXljKG8saSw5MCksYz1fYyhuLHQseSkscz15Yyh1LGEsOTApLGw9X2MocixlLHkpLF8pOnl9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC05MCtEYV0sWzE4MCw5MC1EYV1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLURhXSxbMTgwLDgwK0RhXV0pfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0fXZhciB4Yyx3YyxNYyxBYyxUYz1QYSgpLE5jPVBhKCksU2M9e3BvaW50Oml1LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1FYyxTYy5saW5lRW5kPVBjfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7U2MubGluZVN0YXJ0PVNjLmxpbmVFbmQ9U2MucG9pbnQ9aXUsVGMuYWRkKEhhKE5jKSksTmMucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9VGMvMjtyZXR1cm4gVGMucmVzZXQoKSx0fX07ZnVuY3Rpb24gRWMoKXtTYy5wb2ludD1rY31mdW5jdGlvbiBrYyh0LG4pe1NjLnBvaW50PUNjLHhjPU1jPXQsd2M9QWM9bn1mdW5jdGlvbiBDYyh0LG4pe05jLmFkZChBYyp0LU1jKm4pLE1jPXQsQWM9bn1mdW5jdGlvbiBQYygpe0NjKHhjLHdjKX12YXIgemM9MS8wLFJjPXpjLExjPS16YyxEYz1MYyxVYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PHpjJiYoemM9dCk7dD5MYyYmKExjPXQpO248UmMmJihSYz1uKTtuPkRjJiYoRGM9bil9LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDppdSxwb2x5Z29uRW5kOml1LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbemMsUmNdLFtMYyxEY11dO3JldHVybiBMYz1EYz0tKFJjPXpjPTEvMCksdH19O3ZhciBxYyxPYyxZYyxCYyxGYz0wLEljPTAsSGM9MCxqYz0wLFhjPTAsR2M9MCxWYz0wLCRjPTAsV2M9MCxaYz17cG9pbnQ6UWMsbGluZVN0YXJ0OkpjLGxpbmVFbmQ6bnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WmMubGluZVN0YXJ0PWVzLFpjLmxpbmVFbmQ9cnN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5wb2ludD1RYyxaYy5saW5lU3RhcnQ9SmMsWmMubGluZUVuZD1uc30scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9V2M/W1ZjL1djLCRjL1djXTpHYz9bamMvR2MsWGMvR2NdOkhjP1tGYy9IYyxJYy9IY106W05hTixOYU5dO3JldHVybiBGYz1JYz1IYz1qYz1YYz1HYz1WYz0kYz1XYz0wLHR9fTtmdW5jdGlvbiBRYyh0LG4pe0ZjKz10LEljKz1uLCsrSGN9ZnVuY3Rpb24gSmMoKXtaYy5wb2ludD1LY31mdW5jdGlvbiBLYyh0LG4pe1pjLnBvaW50PXRzLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gdHModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gbnMoKXtaYy5wb2ludD1RY31mdW5jdGlvbiBlcygpe1pjLnBvaW50PWlzfWZ1bmN0aW9uIHJzKCl7b3MocWMsT2MpfWZ1bmN0aW9uIGlzKHQsbil7WmMucG9pbnQ9b3MsUWMocWM9WWM9dCxPYz1CYz1uKX1mdW5jdGlvbiBvcyh0LG4pe3ZhciBlPXQtWWMscj1uLUJjLGk9S2EoZSplK3Iqcik7amMrPWkqKFljK3QpLzIsWGMrPWkqKEJjK24pLzIsR2MrPWksVmMrPShpPUJjKnQtWWMqbikqKFljK3QpLCRjKz1pKihCYytuKSxXYys9MyppLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gYXModCl7dGhpcy5fY29udGV4dD10fWFzLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxCYSl9fSxyZXN1bHQ6aXV9O3ZhciB1cyxmcyxjcyxzcyxscyxocz1QYSgpLGRzPXtwb2ludDppdSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtkcy5wb2ludD1wc30sbGluZUVuZDpmdW5jdGlvbigpe3VzJiZ2cyhmcyxjcyksZHMucG9pbnQ9aXV9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3VzPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dXM9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2hzO3JldHVybiBocy5yZXNldCgpLHR9fTtmdW5jdGlvbiBwcyh0LG4pe2RzLnBvaW50PXZzLGZzPXNzPXQsY3M9bHM9bn1mdW5jdGlvbiB2cyh0LG4pe3NzLT10LGxzLT1uLGhzLmFkZChLYShzcypzcytscypscykpLHNzPXQsbHM9bn1mdW5jdGlvbiBncygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiB5cyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBfcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IGJzO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBicygpe31mdW5jdGlvbiBtcyh0LG4sZSl7dmFyIHI9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KG51bGwpLHN1KGUsdC5zdHJlYW0oVWMpKSxuKFVjLnJlc3VsdCgpKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQociksdH1mdW5jdGlvbiB4cyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9LGUpfWZ1bmN0aW9uIHdzKHQsbixlKXtyZXR1cm4geHModCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVswXS1lWzBdWzBdKSxvPShyLWkqKGVbMV1bMF0rZVswXVswXSkpLzIsYT0taSplWzBdWzFdO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIEFzKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMV0tZVswXVsxXSksbz0taSplWzBdWzBdLGE9KHItaSooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1ncy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6eXMoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixuKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT15cyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LGJzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YnMscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFRzPTE2LE5zPUdhKDMwKklhKTtmdW5jdGlvbiBTcyh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGcpe3ZhciB5PWMtcixfPXMtaSxiPXkqeStfKl87aWYoYj40Km4mJnYtLSl7dmFyIG09YStoLHg9dStkLHc9ZitwLE09S2EobSptK3gqeCt3KncpLEE9ZXUody89TSksVD1IYShIYSh3KS0xKTxEYXx8SGEoby1sKTxEYT8obytsKS8yOlhhKHgsbSksTj10KFQsQSksUz1OWzBdLEU9TlsxXSxrPVMtcixDPUUtaSxQPV8qay15KkM7KFAqUC9iPm58fEhhKCh5KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtmKnA8TnMpJiYoZShyLGksbyxhLHUsZixTLEUsVCxtLz1NLHgvPU0sdyx2LGcpLGcucG9pbnQoUyxFKSxlKFMsRSxULG0seCx3LGMscyxsLGgsZCxwLHYsZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxmLGMscyxsLGgsZCxwLHY9e3BvaW50OmcsbGluZVN0YXJ0OnksbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdi5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHYubGluZVN0YXJ0PXl9fTtmdW5jdGlvbiBnKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHkoKXtzPU5hTix2LnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89QXUoW3IsaV0pLGE9dChyLGkpO2UocyxsLGMsaCxkLHAscz1hWzBdLGw9YVsxXSxjPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0sVHMsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXt2LnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3koKSx2LnBvaW50PXgsdi5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxmPXAsdi5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxjLGgsZCxwLGksbyxyLGEsdSxmLFRzLG4pLHYubGluZUVuZD1iLGIoKX1yZXR1cm4gdn19KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIF9zKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBFcz1fcyh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KklhLG4qSWEpfX0pO2Z1bmN0aW9uIGtzKHQsbixlLHIpe3ZhciBpPUdhKHIpLG89UWEociksYT1pKnQsdT1vKnQsZj1pL3QsYz1vL3Qscz0obyplLWkqbikvdCxsPShvKm4raSplKS90O2Z1bmN0aW9uIGgodCxyKXtyZXR1cm5bYSp0LXUqcituLGUtdSp0LWEqcl19cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW2YqdC1jKm4rcyxsLWMqdC1mKm5dfSxofWZ1bmN0aW9uIENzKHQpe3JldHVybiBQcyhmdW5jdGlvbigpe3JldHVybiB0fSkoKX1mdW5jdGlvbiBQcyh0KXt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsPTE1MCxoPTQ4MCxkPTI1MCxwPTAsdj0wLGc9MCx5PTAsXz0wLGI9MCxtPW51bGwseD1HZix3PW51bGwsTT1tYyxBPS41O2Z1bmN0aW9uIFQodCl7cmV0dXJuIGYodFswXSpJYSx0WzFdKklhKX1mdW5jdGlvbiBOKHQpe3JldHVybih0PWYuaW52ZXJ0KHRbMF0sdFsxXSkpJiZbdFswXSpGYSx0WzFdKkZhXX1mdW5jdGlvbiBTKCl7dmFyIHQ9a3MobCwwLDAsYikuYXBwbHkobnVsbCxuKHAsdikpLHI9KGI/a3M6ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIocixpKXtyZXR1cm5bbit0KnIsZS10KmldfXJldHVybiByLmludmVydD1mdW5jdGlvbihyLGkpe3JldHVyblsoci1uKS90LChlLWkpL3RdfSxyfSkobCxoLXRbMF0sZC10WzFdLGIpO3JldHVybiBlPWtmKGcseSxfKSx1PVNmKG4sciksZj1TZihlLHUpLGE9U3ModSxBKSxFKCl9ZnVuY3Rpb24gRSgpe3JldHVybiBjPXM9bnVsbCxUfXJldHVybiBULnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmcz09PXQ/YzpjPUVzKGZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKHgoYShNKHM9dCkpKSkpfSxULnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dCxtPXZvaWQgMCxFKCkpOnh9LFQucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXI9aT1vPW51bGwsRSgpKTpNfSxULmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0rdD9WZihtPXQqSWEpOihtPW51bGwsR2YpLEUoKSk6bSpGYX0sVC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW51bGw9PXQ/KHc9cj1pPW89bnVsbCxtYyk6WmYodz0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksRSgpKTpudWxsPT13P251bGw6W1t3LHJdLFtpLG9dXX0sVC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxTKCkpOmx9LFQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0sUygpKTpbaCxkXX0sVC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqSWEsdj10WzFdJTM2MCpJYSxTKCkpOltwKkZhLHYqRmFdfSxULnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpJYSx5PXRbMV0lMzYwKklhLF89dC5sZW5ndGg+Mj90WzJdJTM2MCpJYTowLFMoKSk6W2cqRmEseSpGYSxfKkZhXX0sVC5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCpJYSxTKCkpOmIqRmF9LFQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVNzKHUsQT10KnQpLEUoKSk6S2EoQSl9LFQuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKFQsdCxuKX0sVC5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKFQsdCxuKX0sVC5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhULHQsbil9LFQuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKFQsdCxuKX0sZnVuY3Rpb24oKXtyZXR1cm4gbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxULmludmVydD1uLmludmVydCYmTixTKCl9fWZ1bmN0aW9uIHpzKHQpe3ZhciBuPTAsZT1xYS8zLHI9UHModCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKklhLGU9dFsxXSpJYSk6W24qRmEsZSpGYV19LGl9ZnVuY3Rpb24gUnModCxuKXt2YXIgZT1RYSh0KSxyPShlK1FhKG4pKS8yO2lmKEhhKHIpPERhKXJldHVybiBmdW5jdGlvbih0KXt2YXIgbj1HYSh0KTtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuW3QqbixRYShlKS9uXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdC9uLGV1KGUqbildfSxlfSh0KTt2YXIgaT0xK2UqKDIqci1lKSxvPUthKGkpL3I7ZnVuY3Rpb24gYSh0LG4pe3ZhciBlPUthKGktMipyKlFhKG4pKS9yO3JldHVybltlKlFhKHQqPXIpLG8tZSpHYSh0KV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGV1KChpLSh0KnQrZSplKSpyKnIpLygyKnIpKV19LGF9ZnVuY3Rpb24gTHMoKXtyZXR1cm4genMoUnMpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gRHMoKXtyZXR1cm4gTHMoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBVcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1HYShuKSxpPUdhKGUpLG89dChyKmkpO3JldHVybltvKmkqUWEobiksbypRYShlKV19fWZ1bmN0aW9uIHFzKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUthKG4qbitlKmUpLGk9dChyKSxvPVFhKGkpLGE9R2EoaSk7cmV0dXJuW1hhKG4qbyxyKmEpLGV1KHImJmUqby9yKV19fXZhciBPcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4gS2EoMi8oMSt0KSl9KTtPcy5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqZXUodC8yKX0pO3ZhciBZcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4odD1udSh0KSkmJnQvUWEodCl9KTtmdW5jdGlvbiBCcyh0LG4pe3JldHVyblt0LFdhKHR1KChPYStuKS8yKSldfWZ1bmN0aW9uIEZzKHQpe3ZhciBuLGUscixpPUNzKHQpLG89aS5jZW50ZXIsYT1pLnNjYWxlLHU9aS50cmFuc2xhdGUsZj1pLmNsaXBFeHRlbnQsYz1udWxsO2Z1bmN0aW9uIHMoKXt2YXIgbz1xYSphKCksdT1pKFJmKGkucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiBmKG51bGw9PWM/W1t1WzBdLW8sdVsxXS1vXSxbdVswXStvLHVbMV0rb11dOnQ9PT1Ccz9bW01hdGgubWF4KHVbMF0tbyxjKSxuXSxbTWF0aC5taW4odVswXStvLGUpLHJdXTpbW2MsTWF0aC5tYXgodVsxXS1vLG4pXSxbZSxNYXRoLm1pbih1WzFdK28scildXSl9cmV0dXJuIGkuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEodCkscygpKTphKCl9LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLHMoKSk6dSgpfSxpLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxzKCkpOm8oKX0saS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2M9bj1lPXI9bnVsbDooYz0rdFswXVswXSxuPSt0WzBdWzFdLGU9K3RbMV1bMF0scj0rdFsxXVsxXSkscygpKTpudWxsPT1jP251bGw6W1tjLG5dLFtlLHJdXX0scygpfWZ1bmN0aW9uIElzKHQpe3JldHVybiB0dSgoT2ErdCkvMil9ZnVuY3Rpb24gSHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOldhKGUvR2EobikpL1dhKElzKG4pL0lzKHQpKSxpPWUqWmEoSXModCkscikvcjtpZighcilyZXR1cm4gQnM7ZnVuY3Rpb24gbyh0LG4pe2k+MD9uPC1PYStEYSYmKG49LU9hK0RhKTpuPk9hLURhJiYobj1PYS1EYSk7dmFyIGU9aS9aYShJcyhuKSxyKTtyZXR1cm5bZSpRYShyKnQpLGktZSpHYShyKnQpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1KYShyKSpLYSh0KnQrZSplKTtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSwyKmphKFphKGkvbywxL3IpKS1PYV19LG99ZnVuY3Rpb24ganModCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBYcyh0LG4pe3ZhciBlPUdhKHQpLHI9dD09PW4/UWEodCk6KGUtR2EobikpLyhuLXQpLGk9ZS9yK3Q7aWYoSGEocik8RGEpcmV0dXJuIGpzO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUWEobyksaS1lKkdhKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW47cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksaS1KYShyKSpLYSh0KnQrZSplKV19LG99WXMuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksQnMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipqYSgkYShuKSktT2FdfSxqcy5pbnZlcnQ9anM7dmFyIEdzPTEuMzQwMjY0LFZzPS0uMDgxMTA2LCRzPTg5M2UtNixXcz0uMDAzNzk2LFpzPUthKDMpLzI7ZnVuY3Rpb24gUXModCxuKXt2YXIgZT1ldShacypRYShuKSkscj1lKmUsaT1yKnIqcjtyZXR1cm5bdCpHYShlKS8oWnMqKEdzKzMqVnMqcitpKig3KiRzKzkqV3MqcikpKSxlKihHcytWcypyK2kqKCRzK1dzKnIpKV19ZnVuY3Rpb24gSnModCxuKXt2YXIgZT1HYShuKSxyPUdhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBLcyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/bWM6X3Moe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIHRsKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBubCh0LG4pe3JldHVybltHYShuKSpRYSh0KSxRYShuKV19ZnVuY3Rpb24gZWwodCxuKXt2YXIgZT1HYShuKSxyPTErR2EodCkqZTtyZXR1cm5bZSpRYSh0KS9yLFFhKG4pL3JdfWZ1bmN0aW9uIHJsKHQsbil7cmV0dXJuW1dhKHR1KChPYStuKS8yKSksLXRdfWZ1bmN0aW9uIGlsKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIG9sKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGFsKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiB1bCh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZsKHQsbil7dmFyIGUscixpLG8sYSx1PW5ldyBobCh0KSxmPSt0LnZhbHVlJiYodS52YWx1ZT10LnZhbHVlKSxjPVt1XTtmb3IobnVsbD09biYmKG49Y2wpO2U9Yy5wb3AoKTspaWYoZiYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKGE9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShhKSxvPWEtMTtvPj0wOy0tbyljLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBobChpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gdS5lYWNoQmVmb3JlKGxsKX1mdW5jdGlvbiBjbCh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBzbCh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gbGwodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBobCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1Rcy5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKihHcytWcyppK28qKCRzK1dzKmkpKS1uKS8oR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkpKnIpKmkqaSwhKEhhKGUpPFVhKSk7KythKTtyZXR1cm5bWnMqdCooR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkvR2EociksZXUoUWEocikvWnMpXX0sSnMuaW52ZXJ0PXFzKGphKSx0bC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKEhhKGUpPkRhJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxubC5pbnZlcnQ9cXMoZXUpLGVsLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gMipqYSh0KX0pLHJsLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKmphKCRhKHQpKS1PYV19LGhsLnByb3RvdHlwZT1mbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmhsLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHVsKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsYT1bb107ZG97Zm9yKG49YS5yZXZlcnNlKCksYT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKWEucHVzaChlW3JdKX13aGlsZShhLmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSxhPVtdO2k9by5wb3AoKTspaWYoYS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPWEucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZmwodGhpcykuZWFjaEJlZm9yZShzbCl9fTt2YXIgZGw9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIHBsKHQpe2Zvcih2YXIgbixlLHI9MCxpPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dC5sZW5ndGg7cjspZT1NYXRoLnJhbmRvbSgpKnItLXwwLG49dFtyXSx0W3JdPXRbZV0sdFtlXT1uO3JldHVybiB0fShkbC5jYWxsKHQpKSkubGVuZ3RoLG89W107cjxpOyluPXRbcl0sZSYmeWwoZSxuKT8rK3I6KGU9Ymwobz12bChvLG4pKSxyPTApO3JldHVybiBlfWZ1bmN0aW9uIHZsKHQsbil7dmFyIGUscjtpZihfbChuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKGdsKG4sdFtlXSkmJl9sKG1sKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihnbChtbCh0W2VdLHRbcl0pLG4pJiZnbChtbCh0W2VdLG4pLHRbcl0pJiZnbChtbCh0W3JdLG4pLHRbZV0pJiZfbCh4bCh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gZ2wodCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geWwodCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfbCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5bCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGJsKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybnt4OihuPXRbMF0pLngseTpuLnkscjpuLnJ9O2Nhc2UgMjpyZXR1cm4gbWwodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHhsKHRbMF0sdFsxXSx0WzJdKX12YXIgbn1mdW5jdGlvbiBtbCh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCxhPW4ueSx1PW4ucixmPW8tZSxjPWEtcixzPXUtaSxsPU1hdGguc3FydChmKmYrYypjKTtyZXR1cm57eDooZStvK2YvbCpzKS8yLHk6KHIrYStjL2wqcykvMixyOihsK2krdSkvMn19ZnVuY3Rpb24geGwodCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucixhPW4ueCx1PW4ueSxmPW4ucixjPWUueCxzPWUueSxsPWUucixoPXItYSxkPXItYyxwPWktdSx2PWktcyxnPWYtbyx5PWwtbyxfPXIqcitpKmktbypvLGI9Xy1hKmEtdSp1K2YqZixtPV8tYypjLXMqcytsKmwseD1kKnAtaCp2LHc9KHAqbS12KmIpLygyKngpLXIsTT0odipnLXAqeSkveCxBPShkKmItaCptKS8oMip4KS1pLFQ9KGgqeS1kKmcpL3gsTj1NKk0rVCpULTEsUz0yKihvK3cqTStBKlQpLEU9dyp3K0EqQS1vKm8saz0tKE4/KFMrTWF0aC5zcXJ0KFMqUy00Kk4qRSkpLygyKk4pOkUvUyk7cmV0dXJue3g6cit3K00qayx5OmkrQStUKmsscjprfX1mdW5jdGlvbiB3bCh0LG4sZSl7dmFyIHIsaSxvLGEsdT10Lngtbi54LGY9dC55LW4ueSxjPXUqdStmKmY7Yz8oaT1uLnIrZS5yLGkqPWksYT10LnIrZS5yLGk+KGEqPWEpPyhyPShjK2EtaSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxhL2MtcipyKSksZS54PXQueC1yKnUtbypmLGUueT10LnktcipmK28qdSk6KHI9KGMraS1hKS8oMipjKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGkvYy1yKnIpKSxlLng9bi54K3IqdS1vKmYsZS55PW4ueStyKmYrbyp1KSk6KGUueD1uLngrZS5yLGUueT1uLnkpfWZ1bmN0aW9uIE1sKHQsbil7dmFyIGU9dC5yK24uci0xZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gQWwodCl7dmFyIG49dC5fLGU9dC5uZXh0Ll8scj1uLnIrZS5yLGk9KG4ueCplLnIrZS54Km4ucikvcixvPShuLnkqZS5yK2UueSpuLnIpL3I7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24gVGwodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIE5sKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbDtpZigobj10WzBdKS54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO3dsKGUsbixyPXRbMl0pLG49bmV3IFRsKG4pLGU9bmV3IFRsKGUpLHI9bmV3IFRsKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKHU9Mzt1PGk7Kyt1KXt3bChuLl8sZS5fLHI9dFt1XSkscj1uZXcgVGwociksZj1lLm5leHQsYz1uLnByZXZpb3VzLHM9ZS5fLnIsbD1uLl8ucjtkb3tpZihzPD1sKXtpZihNbChmLl8sci5fKSl7ZT1mLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1zKz1mLl8ucixmPWYubmV4dH1lbHNle2lmKE1sKGMuXyxyLl8pKXsobj1jKS5uZXh0PWUsZS5wcmV2aW91cz1uLC0tdTtjb250aW51ZSB0fWwrPWMuXy5yLGM9Yy5wcmV2aW91c319d2hpbGUoZiE9PWMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsbz1BbChuKTsocj1yLm5leHQpIT09ZTspKGE9QWwocikpPG8mJihuPXIsbz1hKTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPXBsKG4pLHU9MDt1PGk7Kyt1KShuPXRbdV0pLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIFNsKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBFbCgpe3JldHVybiAwfWZ1bmN0aW9uIGtsKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBDbCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFBsKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gemwodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYocj1lLmNoaWxkcmVuKXt2YXIgcixpLG8sYT1yLmxlbmd0aCx1PXQoZSkqbnx8MDtpZih1KWZvcihpPTA7aTxhOysraSlyW2ldLnIrPXU7aWYobz1ObChyKSx1KWZvcihpPTA7aTxhOysraSlyW2ldLnItPXU7ZS5yPW8rdX19fWZ1bmN0aW9uIFJsKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnBhcmVudDtuLnIqPXQsZSYmKG4ueD1lLngrdCpuLngsbi55PWUueSt0Km4ueSl9fWZ1bmN0aW9uIExsKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBEbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueTA9ZSxvLnkxPWksby54MD1uLG8ueDE9bis9by52YWx1ZSpjfXZhciBVbD0iJCIscWw9e2RlcHRoOi0xfSxPbD17fTtmdW5jdGlvbiBZbCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBCbCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBJbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIEhsKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gamwodCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gWGwodCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gR2wodCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBWbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpjfUdsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhsLnByb3RvdHlwZSk7dmFyICRsPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBXbCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHUsZixjLHMsbCxoLGQscCx2LGcseT1bXSxfPW4uY2hpbGRyZW4sYj0wLG09MCx4PV8ubGVuZ3RoLHc9bi52YWx1ZTtiPHg7KXtmPWktZSxjPW8tcjtkb3tzPV9bbSsrXS52YWx1ZX13aGlsZSghcyYmbTx4KTtmb3IobD1oPXMsZz1zKnMqKHY9TWF0aC5tYXgoYy9mLGYvYykvKHcqdCkpLHA9TWF0aC5tYXgoaC9nLGcvbCk7bTx4OysrbSl7aWYocys9dT1fW21dLnZhbHVlLHU8bCYmKGw9dSksdT5oJiYoaD11KSxnPXMqcyp2LChkPU1hdGgubWF4KGgvZyxnL2wpKT5wKXtzLT11O2JyZWFrfXA9ZH15LnB1c2goYT17dmFsdWU6cyxkaWNlOmY8YyxjaGlsZHJlbjpfLnNsaWNlKGIsbSl9KSxhLmRpY2U/RGwoYSxlLHIsaSx3P3IrPWMqcy93Om8pOlZsKGEsZSxyLHc/ZSs9ZipzL3c6aSxvKSx3LT1zLGI9bX1yZXR1cm4geX12YXIgWmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7V2wobix0LGUscixpLG8pfXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KCRsKTt2YXIgUWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7aWYoKGE9dC5fc3F1YXJpZnkpJiZhLnJhdGlvPT09bilmb3IodmFyIGEsdSxmLGMscyxsPS0xLGg9YS5sZW5ndGgsZD10LnZhbHVlOysrbDxoOyl7Zm9yKGY9KHU9YVtsXSkuY2hpbGRyZW4sYz11LnZhbHVlPTAscz1mLmxlbmd0aDtjPHM7KytjKXUudmFsdWUrPWZbY10udmFsdWU7dS5kaWNlP0RsKHUsZSxyLGkscis9KG8tcikqdS52YWx1ZS9kKTpWbCh1LGUscixlKz0oaS1lKSp1LnZhbHVlL2QsbyksZC09dS52YWx1ZX1lbHNlIHQuX3NxdWFyaWZ5PWE9V2wobix0LGUscixpLG8pLGEucmF0aW89bn1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7ZnVuY3Rpb24gSmwodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gS2wodCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89WzAsMV0sYT0yLHU9Mjt1PGk7Kyt1KXtmb3IoO2E+MSYmKG49dFtvW2EtMl1dLGU9dFtvW2EtMV1dLHI9dFt1XSwoZVswXS1uWzBdKSooclsxXS1uWzFdKS0oZVsxXS1uWzFdKSooclswXS1uWzBdKTw9MCk7KS0tYTtvW2ErK109dX1yZXR1cm4gby5zbGljZSgwLGEpfWZ1bmN0aW9uIHRoKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIG5oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksZWg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCkscmg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9ZWguc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGloPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxvaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9aWguc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGFoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSx1aD1BcnJheS5wcm90b3R5cGUsZmg9dWgubWFwLGNoPXVoLnNsaWNlLHNoPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIGxoKHQpe3ZhciBuPUtpKCksZT1bXSxyPXNoO2Z1bmN0aW9uIGkoaSl7dmFyIG89aSsiIixhPW4uZ2V0KG8pO2lmKCFhKXtpZihyIT09c2gpcmV0dXJuIHI7bi5zZXQobyxhPWUucHVzaChpKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106Y2guY2FsbCh0KSxpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sbj1LaSgpO2Zvcih2YXIgcixvLGE9LTEsdT10Lmxlbmd0aDsrK2E8dTspbi5oYXMobz0ocj10W2FdKSsiIil8fG4uc2V0KG8sZS5wdXNoKHIpKTtyZXR1cm4gaX0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1jaC5jYWxsKG4pLGkpOnQuc2xpY2UoKX0saS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxoKCkuZG9tYWluKGUpLnJhbmdlKHQpLnVua25vd24ocil9LGl9ZnVuY3Rpb24gaGgoKXt2YXIgdCxuLGU9bGgoKS51bmtub3duKHZvaWQgMCkscj1lLmRvbWFpbixpPWUucmFuZ2Usbz1bMCwxXSxhPSExLHU9MCxmPTAsYz0uNTtmdW5jdGlvbiBzKCl7dmFyIGU9cigpLmxlbmd0aCxzPW9bMV08b1swXSxsPW9bcy0wXSxoPW9bMS1zXTt0PShoLWwpL01hdGgubWF4KDEsZS11KzIqZiksYSYmKHQ9TWF0aC5mbG9vcih0KSksbCs9KGgtbC10KihlLXUpKSpjLG49dCooMS11KSxhJiYobD1NYXRoLnJvdW5kKGwpLG49TWF0aC5yb3VuZChuKSk7dmFyIGQ9ZyhlKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGwrdCpufSk7cmV0dXJuIGkocz9kLnJldmVyc2UoKTpkKX1yZXR1cm4gZGVsZXRlIGUudW5rbm93bixlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxzKCkpOnIoKX0sZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1bK3RbMF0sK3RbMV1dLHMoKSk6by5zbGljZSgpfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89Wyt0WzBdLCt0WzFdXSxhPSEwLHMoKX0sZS5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZS5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISF0LHMoKSk6YX0sZS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOnV9LGUucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Y30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhoKCkuZG9tYWluKHIoKSkucmFuZ2Uobykucm91bmQoYSkucGFkZGluZ0lubmVyKHUpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihjKX0scygpfWZ1bmN0aW9uIGRoKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4rdH12YXIgdmg9WzAsMV07ZnVuY3Rpb24gZ2godCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZGgobil9ZnVuY3Rpb24geWgodCxuLGUscil7dmFyIGk9dFswXSxvPXRbMV0sYT1uWzBdLHU9blsxXTtyZXR1cm4gbzxpPyhpPWUobyxpKSxhPXIodSxhKSk6KGk9ZShpLG8pLGE9cihhLHUpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gX2godCxuLGUscil7dmFyIG89TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLTEsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0tMTtmb3IodFtvXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLG49bi5zbGljZSgpLnJldmVyc2UoKSk7KytmPG87KWFbZl09ZSh0W2ZdLHRbZisxXSksdVtmXT1yKG5bZl0sbltmKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9aSh0LG4sMSxvKS0xO3JldHVybiB1W2VdKGFbZV0obikpfX1mdW5jdGlvbiBiaCh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBtaCh0LG4pe3ZhciBlLHIsaSxvPXZoLGE9dmgsdT1tZSxmPSExO2Z1bmN0aW9uIGMoKXtyZXR1cm4gZT1NYXRoLm1pbihvLmxlbmd0aCxhLmxlbmd0aCk+Mj9faDp5aCxyPWk9bnVsbCxzfWZ1bmN0aW9uIHMobil7cmV0dXJuKHJ8fChyPWUobyxhLGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9bj8wOnQ+PWU/MTpyKHQpfX19KHQpOnQsdSkpKSgrbil9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybihpfHwoaT1lKGEsbyxnaCxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fShuKTpuKSkpKCt0KX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZmguY2FsbCh0LHBoKSxjKCkpOm8uc2xpY2UoKX0scy5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1jaC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSxzLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Y2guY2FsbCh0KSx1PXhlLGMoKX0scy5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsYygpKTpmfSxzLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYygpKTp1fSxjKCl9ZnVuY3Rpb24geGgobil7dmFyIGU9bi5kb21haW47cmV0dXJuIG4udGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBtKG5bMF0sbltuLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3ZhciBpLG89blswXSxhPW5bbi5sZW5ndGgtMV0sdT13KG8sYSxudWxsPT1lPzEwOmUpO3N3aXRjaCgocj1iYShudWxsPT1yPyIsZiI6cikpLnR5cGUpe2Nhc2UicyI6dmFyIGY9TWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1rYSh1LGYpKXx8KHIucHJlY2lzaW9uPWkpLHQuZm9ybWF0UHJlZml4KHIsZik7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9Q2EodSxNYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyhhKSkpKXx8KHIucHJlY2lzaW9uPWktKCJlIj09PXIudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1FYSh1KSl8fChyLnByZWNpc2lvbj1pLTIqKCIlIj09PXIudHlwZSkpfXJldHVybiB0LmZvcm1hdChyKX0oZSgpLG4scil9LG4ubmljZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD0xMCk7dmFyIHIsaT1lKCksbz0wLGE9aS5sZW5ndGgtMSx1PWlbb10sZj1pW2FdO3JldHVybiBmPHUmJihyPXUsdT1mLGY9cixyPW8sbz1hLGE9ciksKHI9eCh1LGYsdCkpPjA/cj14KHU9TWF0aC5mbG9vcih1L3IpKnIsZj1NYXRoLmNlaWwoZi9yKSpyLHQpOnI8MCYmKHI9eCh1PU1hdGguY2VpbCh1KnIpL3IsZj1NYXRoLmZsb29yKGYqcikvcix0KSkscj4wPyhpW29dPU1hdGguZmxvb3IodS9yKSpyLGlbYV09TWF0aC5jZWlsKGYvcikqcixlKGkpKTpyPDAmJihpW29dPU1hdGguY2VpbCh1KnIpL3IsaVthXT1NYXRoLmZsb29yKGYqcikvcixlKGkpKSxufSxufWZ1bmN0aW9uIHdoKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gTWgodCxuKXtyZXR1cm4obj1NYXRoLmxvZyhuL3QpKT9mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZS90KS9ufTpkaChuKX1mdW5jdGlvbiBBaCh0LG4pe3JldHVybiB0PDA/ZnVuY3Rpb24oZSl7cmV0dXJuLU1hdGgucG93KC1uLGUpKk1hdGgucG93KC10LDEtZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhuLGUpKk1hdGgucG93KHQsMS1lKX19ZnVuY3Rpb24gVGgodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIE5oKHQpe3JldHVybiAxMD09PXQ/VGg6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gU2godCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5sb2cobikvdH0pfWZ1bmN0aW9uIEVoKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tdCgtbil9fWZ1bmN0aW9uIGtoKHQsbil7cmV0dXJuIHQ8MD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX1mdW5jdGlvbiBDaCgpe3ZhciB0PTEsbj1taChmdW5jdGlvbihuLGUpe3JldHVybihlPWtoKGUsdCktKG49a2gobix0KSkpP2Z1bmN0aW9uKHIpe3JldHVybihraChyLHQpLW4pL2V9OmRoKGUpfSxmdW5jdGlvbihuLGUpe3JldHVybiBlPWtoKGUsdCktKG49a2gobix0KSksZnVuY3Rpb24ocil7cmV0dXJuIGtoKG4rZSpyLDEvdCl9fSksZT1uLmRvbWFpbjtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixlKGUoKSkpOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLENoKCkuZXhwb25lbnQodCkpfSx4aChuKX12YXIgUGg9bmV3IERhdGUsemg9bmV3IERhdGU7ZnVuY3Rpb24gUmgodCxuLGUscil7ZnVuY3Rpb24gaShuKXtyZXR1cm4gdChuPW5ldyBEYXRlKCtuKSksbn1yZXR1cm4gaS5mbG9vcj1pLGkuY2VpbD1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGV9LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odD1uZXcgRGF0ZSgrdCksbnVsbD09ZT8xOk1hdGguZmxvb3IoZSkpLHR9LGkucmFuZ2U9ZnVuY3Rpb24oZSxyLG8pe3ZhciBhLHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkb3t1LnB1c2goYT1uZXcgRGF0ZSgrZSkpLG4oZSxvKSx0KGUpfXdoaWxlKGE8ZSYmZTxyKTtyZXR1cm4gdX0saS5maWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0sZnVuY3Rpb24odCxyKXtpZih0Pj10KWlmKHI8MClmb3IoOysrcjw9MDspZm9yKDtuKHQsLTEpLCFlKHQpOyk7ZWxzZSBmb3IoOy0tcj49MDspZm9yKDtuKHQsMSksIWUodCk7KTt9KX0sZSYmKGkuY291bnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gUGguc2V0VGltZSgrbiksemguc2V0VGltZSgrciksdChQaCksdCh6aCksTWF0aC5mbG9vcihlKFBoLHpoKSl9LGkuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9pLmZpbHRlcihyP2Z1bmN0aW9uKG4pe3JldHVybiByKG4pJXQ9PTB9OmZ1bmN0aW9uKG4pe3JldHVybiBpLmNvdW50KDAsbikldD09MH0pOmk6bnVsbH0pLGl9dmFyIExoPVJoKGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7TGguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9SaChmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpMaDpudWxsfTt2YXIgRGg9TGgucmFuZ2UsVWg9NmU0LHFoPTYwNDhlNSxPaD1SaChmdW5jdGlvbih0KXt0LnNldFRpbWUoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMWUzKm4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzFlM30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfSksWWg9T2gucmFuZ2UsQmg9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKE1hdGguZmxvb3IodC9VaCkqVWgpfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlVoKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9VaH0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSksRmg9QmgucmFuZ2UsSWg9UmgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpKlVoJTM2ZTU7bjwwJiYobis9MzZlNSksdC5zZXRUaW1lKDM2ZTUqTWF0aC5mbG9vcigoK3QtbikvMzZlNSkrbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLEhoPUloLnJhbmdlLGpoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKlVoKS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSxYaD1qaC5yYW5nZTtmdW5jdGlvbiBHaCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvcWh9KX12YXIgVmg9R2goMCksJGg9R2goMSksV2g9R2goMiksWmg9R2goMyksUWg9R2goNCksSmg9R2goNSksS2g9R2goNiksdGQ9VmgucmFuZ2UsbmQ9JGgucmFuZ2UsZWQ9V2gucmFuZ2UscmQ9WmgucmFuZ2UsaWQ9UWgucmFuZ2Usb2Q9SmgucmFuZ2UsYWQ9S2gucmFuZ2UsdWQ9UmgoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksZmQ9dWQucmFuZ2UsY2Q9UmgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtjZC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1JoKGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBzZD1jZC5yYW5nZSxsZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLGhkPWxkLnJhbmdlLGRkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLHBkPWRkLnJhbmdlLHZkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGdkPXZkLnJhbmdlO2Z1bmN0aW9uIHlkKHQpe3JldHVybiBSaChmdW5jdGlvbihuKXtuLnNldFVUQ0RhdGUobi5nZXRVVENEYXRlKCktKG4uZ2V0VVRDRGF5KCkrNy10KSU3KSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3FofSl9dmFyIF9kPXlkKDApLGJkPXlkKDEpLG1kPXlkKDIpLHhkPXlkKDMpLHdkPXlkKDQpLE1kPXlkKDUpLEFkPXlkKDYpLFRkPV9kLnJhbmdlLE5kPWJkLnJhbmdlLFNkPW1kLnJhbmdlLEVkPXhkLnJhbmdlLGtkPXdkLnJhbmdlLENkPU1kLnJhbmdlLFBkPUFkLnJhbmdlLHpkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLFJkPXpkLnJhbmdlLExkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7TGQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgRGQ9TGQucmFuZ2U7ZnVuY3Rpb24gVWQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIHFkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIE9kKHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIFlkKHQpe3ZhciBuPXQuZGF0ZVRpbWUsZT10LmRhdGUscj10LnRpbWUsaT10LnBlcmlvZHMsbz10LmRheXMsYT10LnNob3J0RGF5cyx1PXQubW9udGhzLGY9dC5zaG9ydE1vbnRocyxjPVZkKGkpLHM9JGQoaSksbD1WZChvKSxoPSRkKG8pLGQ9VmQoYSkscD0kZChhKSx2PVZkKHUpLGc9JGQodSkseT1WZChmKSxfPSRkKGYpLGI9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdVt0LmdldE1vbnRoKCldfSxjOm51bGwsZDpwcCxlOnBwLGY6YnAsSDp2cCxJOmdwLGo6eXAsTDpfcCxtOm1wLE06eHAscDpmdW5jdGlvbih0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpXcCxzOlpwLFM6d3AsdTpNcCxVOkFwLFY6VHAsdzpOcCxXOlNwLHg6bnVsbCxYOm51bGwseTpFcCxZOmtwLFo6Q3AsIiUiOiRwfSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6UHAsZTpQcCxmOlVwLEg6enAsSTpScCxqOkxwLEw6RHAsbTpxcCxNOk9wLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOllwLHU6QnAsVTpGcCxWOklwLHc6SHAsVzpqcCx4Om51bGwsWDpudWxsLHk6WHAsWTpHcCxaOlZwLCIlIjokcH0seD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9ZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXkuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPV9bclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9di5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09Z1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQSh0LG4sZSxyKX0sZDppcCxlOmlwLGY6c3AsSDphcCxJOmFwLGo6b3AsTDpjcCxtOnJwLE06dXAscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Yy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9c1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmhwLHM6ZHAsUzpmcCx1OlpkLFU6UWQsVjpKZCx3OldkLFc6S2QseDpmdW5jdGlvbih0LG4scil7cmV0dXJuIEEodCxlLG4scil9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBBKHQscixuLGUpfSx5Om5wLFk6dHAsWjplcCwiJSI6bHB9O2Z1bmN0aW9uIHcodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLGE9W10sdT0tMSxmPTAsYz10Lmxlbmd0aDtmb3IoZSBpbnN0YW5jZW9mIERhdGV8fChlPW5ldyBEYXRlKCtlKSk7Kyt1PGM7KTM3PT09dC5jaGFyQ29kZUF0KHUpJiYoYS5wdXNoKHQuc2xpY2UoZix1KSksbnVsbCE9KGk9RmRbcj10LmNoYXJBdCgrK3UpXSk/cj10LmNoYXJBdCgrK3UpOmk9ImUiPT09cj8iICI6IjAiLChvPW5bcl0pJiYocj1vKGUsaSkpLGEucHVzaChyKSxmPXUrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGYsdSkpLGEuam9pbigiIil9fWZ1bmN0aW9uIE0odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvPU9kKDE5MDApO2lmKEEobyx0LGUrPSIiLDApIT1lLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksIlYiaW4gbyl7aWYoby5WPDF8fG8uVj41MylyZXR1cm4gbnVsbDsidyJpbiBvfHwoby53PTEpLCJaImluIG8/KGk9KHI9cWQoT2Qoby55KSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9iZC5jZWlsKHIpOmJkKHIpLHI9dmQub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9bihPZChvLnkpKSkuZ2V0RGF5KCkscj1pPjR8fDA9PT1pPyRoLmNlaWwocik6JGgocikscj1qaC5vZmZzZXQociw3KihvLlYtMSkpLG8ueT1yLmdldEZ1bGxZZWFyKCksby5tPXIuZ2V0TW9udGgoKSxvLmQ9ci5nZXREYXRlKCkrKG8udys2KSU3KX1lbHNlKCJXImluIG98fCJVImluIG8pJiYoInciaW4gb3x8KG8udz0idSJpbiBvP28udSU3OiJXImluIG8/MTowKSxpPSJaImluIG8/cWQoT2Qoby55KSkuZ2V0VVRDRGF5KCk6bihPZChvLnkpKS5nZXREYXkoKSxvLm09MCxvLmQ9IlciaW4gbz8oby53KzYpJTcrNypvLlctKGkrNSklNzpvLncrNypvLlUtKGkrNiklNyk7cmV0dXJuIloiaW4gbz8oby5IKz1vLlovMTAwfDAsby5NKz1vLlolMTAwLHFkKG8pKTpuKG8pfX1mdW5jdGlvbiBBKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGY9ZS5sZW5ndGg7YTx1Oyl7aWYocj49ZilyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gRmQ/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLFVkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQscWQpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX12YXIgQmQsRmQ9eyItIjoiIixfOiIgIiwwOiIwIn0sSWQ9L15ccypcZCsvLEhkPS9eJS8samQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIFhkKHQsbixlKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxlP25ldyBBcnJheShlLW8rMSkuam9pbihuKStpOmkpfWZ1bmN0aW9uIEdkKHQpe3JldHVybiB0LnJlcGxhY2UoamQsIlxcJCYiKX1mdW5jdGlvbiBWZCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoR2QpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiAkZCh0KXtmb3IodmFyIG49e30sZT0tMSxyPXQubGVuZ3RoOysrZTxyOyluW3RbZV0udG9Mb3dlckNhc2UoKV09ZTtyZXR1cm4gbn1mdW5jdGlvbiBXZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBaZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBucCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVwKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9wKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5MPU1hdGguZmxvb3IoclswXS8xZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxwKHQsbixlKXt2YXIgcj1IZC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0xZTMqK3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcHAodCxuKXtyZXR1cm4gWGQodC5nZXREYXRlKCksbiwyKX1mdW5jdGlvbiB2cCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCksbiwyKX1mdW5jdGlvbiBncCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24geXAodCxuKXtyZXR1cm4gWGQoMStqaC5jb3VudChjZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIF9wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBicCh0LG4pe3JldHVybiBfcCh0LG4pKyIwMDAifWZ1bmN0aW9uIG1wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geHAodCxuKXtyZXR1cm4gWGQodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB3cCh0LG4pe3JldHVybiBYZCh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIE1wKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBBcCh0LG4pe3JldHVybiBYZChWaC5jb3VudChjZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFRwKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT9RaCh0KTpRaC5jZWlsKHQpLFhkKFFoLmNvdW50KGNkKHQpLHQpKyg0PT09Y2QodCkuZ2V0RGF5KCkpLG4sMil9ZnVuY3Rpb24gTnAodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gU3AodCxuKXtyZXR1cm4gWGQoJGguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBFcCh0LG4pe3JldHVybiBYZCh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24ga3AodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIENwKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrWGQobi82MHwwLCIwIiwyKStYZChuJTYwLCIwIiwyKX1mdW5jdGlvbiBQcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIHpwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIFJwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBMcCh0LG4pe3JldHVybiBYZCgxK3ZkLmNvdW50KExkKHQpLHQpLG4sMyl9ZnVuY3Rpb24gRHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFVwKHQsbil7cmV0dXJuIERwKHQsbikrIjAwMCJ9ZnVuY3Rpb24gcXAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBPcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFlwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gQnAodCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIEZwKHQsbil7cmV0dXJuIFhkKF9kLmNvdW50KExkKHQpLHQpLG4sMil9ZnVuY3Rpb24gSXAodCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP3dkKHQpOndkLmNlaWwodCksWGQod2QuY291bnQoTGQodCksdCkrKDQ9PT1MZCh0KS5nZXRVVENEYXkoKSksbiwyKX1mdW5jdGlvbiBIcCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBqcCh0LG4pe3JldHVybiBYZChiZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBHcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gVnAoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uICRwKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFdwKHQpe3JldHVybit0fWZ1bmN0aW9uIFpwKHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9ZnVuY3Rpb24gUXAobil7cmV0dXJuIEJkPVlkKG4pLHQudGltZUZvcm1hdD1CZC5mb3JtYXQsdC50aW1lUGFyc2U9QmQucGFyc2UsdC51dGNGb3JtYXQ9QmQudXRjRm9ybWF0LHQudXRjUGFyc2U9QmQudXRjUGFyc2UsQmR9UXAoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgSnA9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO3ZhciBLcD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpLHR2PTFlMyxudj02MCp0dixldj02MCpudixydj0yNCpldixpdj03KnJ2LG92PTMwKnJ2LGF2PTM2NSpydjtmdW5jdGlvbiB1dih0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gZnYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gY3YodCxuLHIsaSxvLGEsdSxmLGMpe3ZhciBzPW1oKGdoLHZlKSxsPXMuaW52ZXJ0LGg9cy5kb21haW4sZD1jKCIuJUwiKSxwPWMoIjolUyIpLHY9YygiJUk6JU0iKSxnPWMoIiVJICVwIikseT1jKCIlYSAlZCIpLF89YygiJWIgJWQiKSxiPWMoIiVCIiksbT1jKCIlWSIpLHg9W1t1LDEsdHZdLFt1LDUsNSp0dl0sW3UsMTUsMTUqdHZdLFt1LDMwLDMwKnR2XSxbYSwxLG52XSxbYSw1LDUqbnZdLFthLDE1LDE1Km52XSxbYSwzMCwzMCpudl0sW28sMSxldl0sW28sMywzKmV2XSxbbyw2LDYqZXZdLFtvLDEyLDEyKmV2XSxbaSwxLHJ2XSxbaSwyLDIqcnZdLFtyLDEsaXZdLFtuLDEsb3ZdLFtuLDMsMypvdl0sW3QsMSxhdl1dO2Z1bmN0aW9uIE0oZSl7cmV0dXJuKHUoZSk8ZT9kOmEoZSk8ZT9wOm8oZSk8ZT92OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/eTpfOnQoZSk8ZT9iOm0pKGUpfWZ1bmN0aW9uIEEobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIGE9TWF0aC5hYnMoaS1yKS9uLHU9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KHgsYSk7dT09PXgubGVuZ3RoPyhvPXcoci9hdixpL2F2LG4pLG49dCk6dT8obz0odT14W2EveFt1LTFdWzJdPHhbdV1bMl0vYT91LTE6dV0pWzFdLG49dVswXSk6KG89TWF0aC5tYXgodyhyLGksbiksMSksbj1mKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChmaC5jYWxsKHQsZnYpKTpoKCkubWFwKHV2KX0scy50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9aCgpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sYT1vPGk7cmV0dXJuIGEmJihlPWksaT1vLG89ZSksZT0oZT1BKHQsaSxvLG4pKT9lLnJhbmdlKGksbysxKTpbXSxhP2UucmV2ZXJzZSgpOmV9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP006YyhuKX0scy5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9aCgpO3JldHVybih0PUEodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP2god2goZSx0KSk6c30scy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKHMsY3YodCxuLHIsaSxvLGEsdSxmLGMpKX0sc31mdW5jdGlvbiBzdih0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgbHY9c3YoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGh2PXN2KCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxkdj1zdigiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IikscHY9c3YoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLHZ2PXN2KCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxndj1zdigiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIikseXY9c3YoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLF92PXN2KCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxidj1zdigiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIik7ZnVuY3Rpb24gbXYodCl7cmV0dXJuIGxlKHRbdC5sZW5ndGgtMV0pfXZhciB4dj1uZXcgQXJyYXkoMykuY29uY2F0KCJkOGIzNjVmNWY1ZjU1YWI0YWMiLCJhNjYxMWFkZmMyN2Q4MGNkYzEwMTg1NzEiLCJhNjYxMWFkZmMyN2RmNWY1ZjU4MGNkYzEwMTg1NzEiLCI4YzUxMGFkOGIzNjVmNmU4YzNjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFkOGIzNjVmNmU4YzNmNWY1ZjVjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiKS5tYXAoc3YpLHd2PW12KHh2KSxNdj1uZXcgQXJyYXkoMykuY29uY2F0KCJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLCI3YjMyOTRjMmE1Y2ZhNmRiYTAwMDg4MzciLCI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiKS5tYXAoc3YpLEF2PW12KE12KSxUdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlOWEzYzlmN2Y3ZjdhMWQ3NmEiLCJkMDFjOGJmMWI2ZGFiOGUxODY0ZGFjMjYiLCJkMDFjOGJmMWI2ZGFmN2Y3ZjdiOGUxODY0ZGFjMjYiLCJjNTFiN2RlOWEzYzlmZGUwZWZlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RlOWEzYzlmZGUwZWZmN2Y3ZjdlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiKS5tYXAoc3YpLE52PW12KFR2KSxTdj1uZXcgQXJyYXkoMykuY29uY2F0KCI5OThlYzNmN2Y3ZjdmMWEzNDAiLCI1ZTNjOTliMmFiZDJmZGI4NjNlNjYxMDEiLCI1ZTNjOTliMmFiZDJmN2Y3ZjdmZGI4NjNlNjYxMDEiLCI1NDI3ODg5OThlYzNkOGRhZWJmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg5OThlYzNkOGRhZWJmN2Y3ZjdmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiKS5tYXAoc3YpLEV2PW12KFN2KSxrdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLCJjYTAwMjBmNGE1ODI5MmM1ZGUwNTcxYjAiLCJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLCJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJlZjhhNjJmZGRiYzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiKS5tYXAoc3YpLEN2PW12KGt2KSxQdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmZmZmZmY5OTk5OTkiLCJjYTAwMjBmNGE1ODJiYWJhYmE0MDQwNDAiLCJjYTAwMjBmNGE1ODJmZmZmZmZiYWJhYmE0MDQwNDAiLCJiMjE4MmJlZjhhNjJmZGRiYzdlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJlZjhhNjJmZGRiYzdmZmZmZmZlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiKS5tYXAoc3YpLHp2PW12KFB2KSxSdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWJmZGIiLCJkNzE5MWNmZGFlNjFhYmQ5ZTkyYzdiYjYiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmQ5ZTkyYzdiYjYiLCJkNzMwMjdmYzhkNTlmZWUwOTBlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmYzhkNTlmZWUwOTBmZmZmYmZlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiKS5tYXAoc3YpLEx2PW12KFJ2KSxEdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWNmNjAiLCJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhNmQ5NmExYTk2NDEiLCJkNzMwMjdmYzhkNTlmZWUwOGJkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciKS5tYXAoc3YpLFV2PW12KER2KSxxdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5OWQ1OTQiLCJkNzE5MWNmZGFlNjFhYmRkYTQyYjgzYmEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmRkYTQyYjgzYmEiLCJkNTNlNGZmYzhkNTlmZWUwOGJlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmYzhkNTlmZWUwOGJmZmZmYmZlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiKS5tYXAoc3YpLE92PW12KHF2KSxZdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1Zjk5OWQ4YzkyY2EyNWYiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyMzhiNDUiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLEJ2PW12KFl2KSxGdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGVjZjQ5ZWJjZGE4ODU2YTciLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODQxOWQiLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGIiKS5tYXAoc3YpLEl2PW12KEZ2KSxIdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGYzZGJhOGRkYjU0M2EyY2EiLCJmMGY5ZThiYWU0YmM3YmNjYzQyYjhjYmUiLCJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiKS5tYXAoc3YpLGp2PW12KEh2KSxYdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU4YzhmZGJiODRlMzRhMzMiLCJmZWYwZDlmZGNjOGFmYzhkNTlkNzMwMWYiLCJmZWYwZDlmZGNjOGFmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWZiMzAwMDA3ZjAwMDAiKS5tYXAoc3YpLEd2PW12KFh2KSxWdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2UyZjBhNmJkZGIxYzkwOTkiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YwMjgxOGEiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzYiKS5tYXAoc3YpLCR2PW12KFZ2KSxXdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2U3ZjJhNmJkZGIyYjhjYmUiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YwNTcwYjAiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwNDVhOGQwMjM4NTgiKS5tYXAoc3YpLFp2PW12KFd2KSxRdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlN2UxZWZjOTk0YzdkZDFjNzciLCJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLCJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiKS5tYXAoc3YpLEp2PW12KFF2KSxLdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZGUwZGRmYTlmYjVjNTFiOGEiLCJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2UiLCJmZWViZTJmYmI0YjlmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzc0OTAwNmEiKS5tYXAoc3YpLHRnPW12KEt2KSxuZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZGY4YjE3ZmNkYmIyYzdmYjgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyMjVlYTgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgyNTM0OTQwODFkNTgiKS5tYXAoc3YpLGVnPW12KG5nKSxyZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmN2ZjYjlhZGRkOGUzMWEzNTQiLCJmZmZmY2NjMmU2OTk3OGM2NzkyMzg0NDMiLCJmZmZmY2NjMmU2OTk3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDY4MzcwMDQ1MjkiKS5tYXAoc3YpLGlnPW12KHJnKSxvZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmY3YmNmZWM0NGZkOTVmMGUiLCJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLCJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiKS5tYXAoc3YpLGFnPW12KG9nKSx1Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmVkYTBmZWIyNGNmMDNiMjAiLCJmZmZmYjJmZWNjNWNmZDhkM2NlMzFhMWMiLCJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiKS5tYXAoc3YpLGZnPW12KHVnKSxjZz1uZXcgQXJyYXkoMykuY29uY2F0KCJkZWViZjc5ZWNhZTEzMTgyYmQiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiKS5tYXAoc3YpLHNnPW12KGNnKSxsZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1ZTBhMWQ5OWIzMWEzNTQiLCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDUiLCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLGhnPW12KGxnKSxkZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmMGYwZjBiZGJkYmQ2MzYzNjMiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY1MjUyNTIiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUwMDAwMDAiKS5tYXAoc3YpLHBnPW12KGRnKSx2Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZmVkZjViY2JkZGM3NTZiYjEiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg2YTUxYTMiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM1NDI3OGYzZjAwN2QiKS5tYXAoc3YpLGdnPW12KHZnKSx5Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWUwZDJmYzkyNzJkZTJkMjYiLCJmZWU1ZDlmY2FlOTFmYjZhNGFjYjE4MWQiLCJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGQiKS5tYXAoc3YpLF9nPW12KHlnKSxiZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU2Y2VmZGFlNmJlNjU1MGQiLCJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLCJmZWVkZGVmZGJlODVmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiKS5tYXAoc3YpLG1nPW12KGJnKSx4Zz1HZShLbigzMDAsLjUsMCksS24oLTI0MCwuNSwxKSksd2c9R2UoS24oLTEwMCwuNzUsLjM1KSxLbig4MCwxLjUsLjgpKSxNZz1HZShLbigyNjAsLjc1LC4zNSksS24oODAsMS41LC44KSksQWc9S24oKTt2YXIgVGc9Ym4oKSxOZz1NYXRoLlBJLzMsU2c9MipNYXRoLlBJLzM7ZnVuY3Rpb24gRWcodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGtnPUVnKHN2KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksQ2c9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxQZz1FZyhzdigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLHpnPUVnKHN2KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBMZz1NYXRoLmFicyxEZz1NYXRoLmF0YW4yLFVnPU1hdGguY29zLHFnPU1hdGgubWF4LE9nPU1hdGgubWluLFlnPU1hdGguc2luLEJnPU1hdGguc3FydCxGZz0xZS0xMixJZz1NYXRoLlBJLEhnPUlnLzIsamc9MipJZztmdW5jdGlvbiBYZyh0KXtyZXR1cm4gdD49MT9IZzp0PD0tMT8tSGc6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIEdnKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFZnKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uICRnKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gV2codCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gWmcodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gUWcodCxuLGUscixpLG8sYSl7dmFyIHU9dC1lLGY9bi1yLGM9KGE/bzotbykvQmcodSp1K2YqZikscz1jKmYsbD0tYyp1LGg9dCtzLGQ9bitsLHA9ZStzLHY9citsLGc9KGgrcCkvMix5PShkK3YpLzIsXz1wLWgsYj12LWQsbT1fKl8rYipiLHg9aS1vLHc9aCp2LXAqZCxNPShiPDA/LTE6MSkqQmcocWcoMCx4KngqbS13KncpKSxBPSh3KmItXypNKS9tLFQ9KC13Kl8tYipNKS9tLE49KHcqYitfKk0pL20sUz0oLXcqXytiKk0pL20sRT1BLWcsaz1ULXksQz1OLWcsUD1TLXk7cmV0dXJuIEUqRStrKms+QypDK1AqUCYmKEE9TixUPVMpLHtjeDpBLGN5OlQseDAxOi1zLHkwMTotbCx4MTE6QSooaS94LTEpLHkxMTpUKihpL3gtMSl9fWZ1bmN0aW9uIEpnKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBLZyh0KXtyZXR1cm4gbmV3IEpnKHQpfWZ1bmN0aW9uIHR5KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG55KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGV5KCl7dmFyIHQ9dHksbj1ueSxlPVJnKCEwKSxyPW51bGwsaT1LZyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscz1hLmxlbmd0aCxsPSExO2ZvcihudWxsPT1yJiYobz1pKGM9R2koKSkpLHU9MDt1PD1zOysrdSkhKHU8cyYmZShmPWFbdV0sdSxhKSk9PT1sJiYoKGw9IWwpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGwmJm8ucG9pbnQoK3QoZix1LGEpLCtuKGYsdSxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6bn0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxhKTplfSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbnVsbCE9ciYmKG89aShyKSksYSk6aX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bz1udWxsOm89aShyPXQpLGEpOnJ9LGF9ZnVuY3Rpb24gcnkoKXt2YXIgdD10eSxuPW51bGwsZT1SZygwKSxyPW55LGk9UmcoITApLG89bnVsbCxhPUtnLHU9bnVsbDtmdW5jdGlvbiBmKGYpe3ZhciBjLHMsbCxoLGQscD1mLmxlbmd0aCx2PSExLGc9bmV3IEFycmF5KHApLHk9bmV3IEFycmF5KHApO2ZvcihudWxsPT1vJiYodT1hKGQ9R2koKSkpLGM9MDtjPD1wOysrYyl7aWYoIShjPHAmJmkoaD1mW2NdLGMsZikpPT09dilpZih2PSF2KXM9Yyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxsPWMtMTtsPj1zOy0tbCl1LnBvaW50KGdbbF0seVtsXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9diYmKGdbY109K3QoaCxjLGYpLHlbY109K2UoaCxjLGYpLHUucG9pbnQobj8rbihoLGMsZik6Z1tjXSxyPytyKGgsYyxmKTp5W2NdKSl9aWYoZClyZXR1cm4gdT1udWxsLGQrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBleSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gZi54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UmcoK2UpLG49bnVsbCxmKTp0fSxmLngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyPW51bGwsZik6ZX0sZi55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTplfSxmLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLmxpbmVYMD1mLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGUpfSxmLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KHIpfSxmLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChuKS55KGUpfSxmLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZyghIXQpLGYpOml9LGYuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYodT1hKG8pKSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz11PW51bGw6dT1hKG89dCksZik6b30sZn1mdW5jdGlvbiBpeSh0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiBveSh0KXtyZXR1cm4gdH1KZy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgYXk9ZnkoS2cpO2Z1bmN0aW9uIHV5KHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZnkodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHV5KHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY3kodCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZnkodCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc3koKXtyZXR1cm4gY3koZXkoKS5jdXJ2ZShheSkpfWZ1bmN0aW9uIGx5KCl7dmFyIHQ9cnkoKS5jdXJ2ZShheSksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjeShlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3kocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGh5KHQsbil7cmV0dXJuWyhuPStuKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLG4qTWF0aC5zaW4odCldfXV5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGR5PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBweSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gdnkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGd5KHQpe3ZhciBuPXB5LGU9dnkscj10eSxpPW55LG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEsdT1keS5jYWxsKGFyZ3VtZW50cyksZj1uLmFwcGx5KHRoaXMsdSksYz1lLmFwcGx5KHRoaXMsdSk7aWYob3x8KG89YT1HaSgpKSx0KG8sK3IuYXBwbHkodGhpcywodVswXT1mLHUpKSwraS5hcHBseSh0aGlzLHUpLCtyLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksK2kuYXBwbHkodGhpcyx1KSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIHl5KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obj0obityKS8yLGUsbixpLHIsaSl9ZnVuY3Rpb24gX3kodCxuLGUscixpKXt0Lm1vdmVUbyhuLGUpLHQuYmV6aWVyQ3VydmVUbyhuLGU9KGUraSkvMixyLGUscixpKX1mdW5jdGlvbiBieSh0LG4sZSxyLGkpe3ZhciBvPWh5KG4sZSksYT1oeShuLGU9KGUraSkvMiksdT1oeShyLGUpLGY9aHkocixpKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sdVswXSx1WzFdLGZbMF0sZlsxXSl9dmFyIG15PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vSWcpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxqZyl9fSx4eT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSx3eT1NYXRoLnNxcnQoMS8zKSxNeT0yKnd5LEF5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTXkpLHI9ZSp3eTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LFR5PU1hdGguc2luKElnLzEwKS9NYXRoLnNpbig3KklnLzEwKSxOeT1NYXRoLnNpbihqZy8xMCkqVHksU3k9LU1hdGguY29zKGpnLzEwKSpUeSxFeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MipuKSxyPU55KmUsaT1TeSplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9amcqby81LHU9TWF0aC5jb3MoYSksZj1NYXRoLnNpbihhKTt0LmxpbmVUbyhmKmUsLXUqZSksdC5saW5lVG8odSpyLWYqaSxmKnIrdSppKX10LmNsb3NlUGF0aCgpfX0sa3k9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LEN5PU1hdGguc3FydCgzKSxQeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypDeSkpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtQ3kqZSwtZSksdC5saW5lVG8oQ3kqZSwtZSksdC5jbG9zZVBhdGgoKX19LHp5PU1hdGguc3FydCgzKS8yLFJ5PTEvTWF0aC5zcXJ0KDEyKSxMeT0zKihSeS8yKzEpLER5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTHkpLHI9ZS8yLGk9ZSpSeSxvPXIsYT1lKlJ5K2UsdT0tbyxmPWE7dC5tb3ZlVG8ocixpKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHUsZiksdC5saW5lVG8oLS41KnItenkqaSx6eSpyKy0uNSppKSx0LmxpbmVUbygtLjUqby16eSphLHp5Km8rLS41KmEpLHQubGluZVRvKC0uNSp1LXp5KmYsenkqdSstLjUqZiksdC5saW5lVG8oLS41KnIrenkqaSwtLjUqaS16eSpyKSx0LmxpbmVUbygtLjUqbyt6eSphLC0uNSphLXp5Km8pLHQubGluZVRvKC0uNSp1K3p5KmYsLS41KmYtenkqdSksdC5jbG9zZVBhdGgoKX19LFV5PVtteSx4eSxBeSxreSxFeSxQeSxEeV07ZnVuY3Rpb24gcXkoKXt9ZnVuY3Rpb24gT3kodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIFl5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBCeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl5KHQsbil7dGhpcy5fYmFzaXM9bmV3IFl5KHQpLHRoaXMuX2JldGE9bn1ZeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOk95KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Ok95KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxCeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sRnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXkucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGY9LTE7KytmPD1lOylyPWYvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbZl0rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bZl0rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBIeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBZeSh0KTpuZXcgSXkodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBqeSh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFh5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6ankodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Omp5KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR3k9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHkodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gVnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fVZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICR5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFZ5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFd5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1XeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFd5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFF5KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5GZyl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsZj0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2YsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2Z9aWYodC5fbDIzX2E+Rmcpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gSnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1KeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEt5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSnkodCxuKTpuZXcgWHkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiB0Xyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufXRfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6UXkodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgbl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB0Xyh0LG4pOm5ldyBWeSh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIGVfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHJfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgZV8odCxuKTpuZXcgV3kodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBpXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb18odCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIGFfKHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKG9fKG8pK29fKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gdV8odCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIGZfKHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBjXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gc18odCl7dGhpcy5fY29udGV4dD1uZXcgbF8odCl9ZnVuY3Rpb24gbF8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGhfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBkXyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIHBfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiB2Xyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZ18odCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHlfKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gX18odCl7dmFyIG49dC5tYXAoYl8pO3JldHVybiBnXyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfWZ1bmN0aW9uIGJfKHQpe2Zvcih2YXIgbixlPTAscj0tMSxpPXQubGVuZ3RoOysrcjxpOykobj0rdFtyXVsxXSkmJihlKz1uKTtyZXR1cm4gZX1mdW5jdGlvbiBtXyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24geF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gd18odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTV8oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBBXyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIFRfKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBOXyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gU18odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEVfKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89Sl8ucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmQ18oaSx0LG4sZSksciYmQ18oaSxuLHQsciksWl9bdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWl9bbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBrXyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gQ18odCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFBfKHQsbixlLHIsaSl7dmFyIG8sYT10WzBdLHU9dFsxXSxmPWFbMF0sYz1hWzFdLHM9MCxsPTEsaD11WzBdLWYsZD11WzFdLWM7aWYobz1uLWYsaHx8IShvPjApKXtpZihvLz1oLGg8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoaD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1yLWYsaHx8IShvPDApKXtpZihvLz1oLGg8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoaD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9aWYobz1lLWMsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoZD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1pLWMsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoZD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9cmV0dXJuIShzPjB8fGw8MSl8fChzPjAmJih0WzBdPVtmK3MqaCxjK3MqZF0pLGw8MSYmKHRbMV09W2YrbCpoLGMrbCpkXSksITApfX19fX1mdW5jdGlvbiB6Xyh0LG4sZSxyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSx1LGY9dFswXSxjPXQubGVmdCxzPXQucmlnaHQsbD1jWzBdLGg9Y1sxXSxkPXNbMF0scD1zWzFdLHY9KGwrZCkvMixnPShoK3ApLzI7aWYocD09PWgpe2lmKHY8bnx8dj49cilyZXR1cm47aWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9W3YsZV07bz1bdixpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVt2LGldO289W3YsZV19fWVsc2UgaWYodT1nLShhPShsLWQpLyhwLWgpKSp2LGE8LTF8fGE+MSlpZihsPmQpe2lmKGYpe2lmKGZbMV0+PWkpcmV0dXJufWVsc2UgZj1bKGUtdSkvYSxlXTtvPVsoaS11KS9hLGldfWVsc2V7aWYoZil7aWYoZlsxXTxlKXJldHVybn1lbHNlIGY9WyhpLXUpL2EsaV07bz1bKGUtdSkvYSxlXX1lbHNlIGlmKGg8cCl7aWYoZil7aWYoZlswXT49cilyZXR1cm59ZWxzZSBmPVtuLGEqbit1XTtvPVtyLGEqcit1XX1lbHNle2lmKGYpe2lmKGZbMF08bilyZXR1cm59ZWxzZSBmPVtyLGEqcit1XTtvPVtuLGEqbit1XX1yZXR1cm4gdFswXT1mLHRbMV09bywhMH1mdW5jdGlvbiBSXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPW4ubGVmdCxpPW4ucmlnaHQ7cmV0dXJuIGU9PT1pJiYoaT1yLHI9ZSksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihlPT09cj8ocj1uWzFdLGk9blswXSk6KHI9blswXSxpPW5bMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIExfKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBEXyh0LG4pe3JldHVybiBuWysobi5sZWZ0PT09dC5zaXRlKV19aV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxjXy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6Zl8odGhpcyx0aGlzLl90MCx1Xyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsZl8odGhpcyx1Xyh0aGlzLGU9YV8odGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OmZfKHRoaXMsdGhpcy5fdDAsZT1hXyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChzXy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjXy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2NfLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sbF8ucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0saF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9ZF8odCksaT1kXyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0scF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0sTV8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNXyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PVNfKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoVF8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsTl8odGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYoTl8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsVF8odGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCxhPXQuUjtpZihlPW8/YT9TXyhhKTpvOmEsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJmE/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PWE/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPWEsYS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsVF8odGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCxOXyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxUXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsTl8odGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxUXyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSxOXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFVfLHFfPVtdO2Z1bmN0aW9uIE9fKCl7QV8odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFlfKHQpe3ZhciBuPXQuUCxlPXQuTjtpZihuJiZlKXt2YXIgcj1uLnNpdGUsaT10LnNpdGUsbz1lLnNpdGU7aWYociE9PW8pe3ZhciBhPWlbMF0sdT1pWzFdLGY9clswXS1hLGM9clsxXS11LHM9b1swXS1hLGw9b1sxXS11LGg9MiooZipsLWMqcyk7aWYoIShoPj0tdGIpKXt2YXIgZD1mKmYrYypjLHA9cypzK2wqbCx2PShsKmQtYypwKS9oLGc9KGYqcC1zKmQpL2gseT1xXy5wb3AoKXx8bmV3IE9fO3kuYXJjPXQseS5zaXRlPWkseS54PXYrYSx5Lnk9KHkuY3k9Zyt1KStNYXRoLnNxcnQodip2K2cqZyksdC5jaXJjbGU9eTtmb3IodmFyIF89bnVsbCxiPVFfLl87YjspaWYoeS55PGIueXx8eS55PT09Yi55JiZ5Lng8PWIueCl7aWYoIWIuTCl7Xz1iLlA7YnJlYWt9Yj1iLkx9ZWxzZXtpZighYi5SKXtfPWI7YnJlYWt9Yj1iLlJ9UV8uaW5zZXJ0KF8seSksX3x8KFVfPXkpfX19fWZ1bmN0aW9uIEJfKHQpe3ZhciBuPXQuY2lyY2xlO24mJihuLlB8fChVXz1uLk4pLFFfLnJlbW92ZShuKSxxXy5wdXNoKG4pLEFfKG4pLHQuY2lyY2xlPW51bGwpfXZhciBGXz1bXTtmdW5jdGlvbiBJXygpe0FfKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBIXyh0KXt2YXIgbj1GXy5wb3AoKXx8bmV3IElfO3JldHVybiBuLnNpdGU9dCxufWZ1bmN0aW9uIGpfKHQpe0JfKHQpLFdfLnJlbW92ZSh0KSxGXy5wdXNoKHQpLEFfKHQpfWZ1bmN0aW9uIFhfKHQpe3ZhciBuPXQuY2lyY2xlLGU9bi54LHI9bi5jeSxpPVtlLHJdLG89dC5QLGE9dC5OLHU9W3RdO2pfKHQpO2Zvcih2YXIgZj1vO2YuY2lyY2xlJiZNYXRoLmFicyhlLWYuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWYuY2lyY2xlLmN5KTxLXzspbz1mLlAsdS51bnNoaWZ0KGYpLGpfKGYpLGY9bzt1LnVuc2hpZnQoZiksQl8oZik7Zm9yKHZhciBjPWE7Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8S18mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEtfOylhPWMuTix1LnB1c2goYyksal8oYyksYz1hO3UucHVzaChjKSxCXyhjKTt2YXIgcyxsPXUubGVuZ3RoO2ZvcihzPTE7czxsOysrcyljPXVbc10sZj11W3MtMV0sQ18oYy5lZGdlLGYuc2l0ZSxjLnNpdGUsaSk7Zj11WzBdLChjPXVbbC0xXSkuZWRnZT1FXyhmLnNpdGUsYy5zaXRlLG51bGwsaSksWV8oZiksWV8oYyl9ZnVuY3Rpb24gR18odCl7Zm9yKHZhciBuLGUscixpLG89dFswXSxhPXRbMV0sdT1XXy5fO3U7KWlmKChyPVZfKHUsYSktbyk+S18pdT11Lkw7ZWxzZXtpZighKChpPW8tJF8odSxhKSk+S18pKXtyPi1LXz8obj11LlAsZT11KTppPi1LXz8obj11LGU9dS5OKTpuPWU9dTticmVha31pZighdS5SKXtuPXU7YnJlYWt9dT11LlJ9IWZ1bmN0aW9uKHQpe1pfW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0odCk7dmFyIGY9SF8odCk7aWYoV18uaW5zZXJ0KG4sZiksbnx8ZSl7aWYobj09PWUpcmV0dXJuIEJfKG4pLGU9SF8obi5zaXRlKSxXXy5pbnNlcnQoZixlKSxmLmVkZ2U9ZS5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpLFlfKG4pLHZvaWQgWV8oZSk7aWYoZSl7Ql8obiksQl8oZSk7dmFyIGM9bi5zaXRlLHM9Y1swXSxsPWNbMV0saD10WzBdLXMsZD10WzFdLWwscD1lLnNpdGUsdj1wWzBdLXMsZz1wWzFdLWwseT0yKihoKmctZCp2KSxfPWgqaCtkKmQsYj12KnYrZypnLG09WyhnKl8tZCpiKS95K3MsKGgqYi12Kl8pL3krbF07Q18oZS5lZGdlLGMscCxtKSxmLmVkZ2U9RV8oYyx0LG51bGwsbSksZS5lZGdlPUVfKHQscCxudWxsLG0pLFlfKG4pLFlfKGUpfWVsc2UgZi5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpfX1mdW5jdGlvbiBWXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciB1PShlPWEuc2l0ZSlbMF0sZj1lWzFdLGM9Zi1uO2lmKCFjKXJldHVybiB1O3ZhciBzPXUtcixsPTEvby0xL2MsaD1zL2M7cmV0dXJuIGw/KC1oK01hdGguc3FydChoKmgtMipsKihzKnMvKC0yKmMpLWYrYy8yK2ktby8yKSkpL2wrcjoocit1KS8yfWZ1bmN0aW9uICRfKHQsbil7dmFyIGU9dC5OO2lmKGUpcmV0dXJuIFZfKGUsbik7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09bj9yWzBdOjEvMH12YXIgV18sWl8sUV8sSl8sS189MWUtNix0Yj0xZS0xMjtmdW5jdGlvbiBuYih0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBlYih0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChuYikucG9wKCk7Zm9yKEpfPVtdLFpfPW5ldyBBcnJheSh0Lmxlbmd0aCksV189bmV3IE1fLFFfPW5ldyBNXzs7KWlmKGk9VV8sbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KEdfKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO1hfKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGUscixpPTAsbz1aXy5sZW5ndGg7aTxvOysraSlpZigodD1aX1tpXSkmJihyPShuPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPHI7KytlKWFbZV09ZSx1W2VdPVJfKHQsSl9bbltlXV0pO2ZvcihhLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gdVtuXS11W3RdfSksZT0wO2U8cjsrK2UpdVtlXT1uW2FbZV1dO2ZvcihlPTA7ZTxyOysrZSluW2VdPXVbZV19fSgpLG4pe3ZhciBhPStuWzBdWzBdLHU9K25bMF1bMV0sZj0rblsxXVswXSxjPStuWzFdWzFdOyFmdW5jdGlvbih0LG4sZSxyKXtmb3IodmFyIGksbz1KXy5sZW5ndGg7by0tOyl6XyhpPUpfW29dLHQsbixlLHIpJiZQXyhpLHQsbixlLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5LX3x8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5LXyl8fGRlbGV0ZSBKX1tvXX0oYSx1LGYsYyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGc9Wl8ubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89Wl9baV0pe2ZvcihhPW8uc2l0ZSx1PShmPW8uaGFsZmVkZ2VzKS5sZW5ndGg7dS0tOylKX1tmW3VdXXx8Zi5zcGxpY2UodSwxKTtmb3IodT0wLGM9Zi5sZW5ndGg7dTxjOylwPShkPURfKG8sSl9bZlt1XV0pKVswXSx2PWRbMV0sbD0ocz1MXyhvLEpfW2ZbKyt1JWNdXSkpWzBdLGg9c1sxXSwoTWF0aC5hYnMocC1sKT5LX3x8TWF0aC5hYnModi1oKT5LXykmJihmLnNwbGljZSh1LDAsSl8ucHVzaChrXyhhLGQsTWF0aC5hYnMocC10KTxLXyYmci12PktfP1t0LE1hdGguYWJzKGwtdCk8S18/aDpyXTpNYXRoLmFicyh2LXIpPEtfJiZlLXA+S18/W01hdGguYWJzKGgtcik8S18/bDplLHJdOk1hdGguYWJzKHAtZSk8S18mJnYtbj5LXz9bZSxNYXRoLmFicyhsLWUpPEtfP2g6bl06TWF0aC5hYnModi1uKTxLXyYmcC10PktfP1tNYXRoLmFicyhoLW4pPEtfP2w6dCxuXTpudWxsKSktMSksKytjKTtjJiYoeT0hMSl9aWYoeSl7dmFyIF8sYixtLHg9MS8wO2ZvcihpPTAseT1udWxsO2k8ZzsrK2kpKG89Wl9baV0pJiYobT0oXz0oYT1vLnNpdGUpWzBdLXQpKl8rKGI9YVsxXS1uKSpiKTx4JiYoeD1tLHk9byk7aWYoeSl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxBPVtlLHJdLFQ9W2Usbl07eS5oYWxmZWRnZXMucHVzaChKXy5wdXNoKGtfKGE9eS5zaXRlLHcsTSkpLTEsSl8ucHVzaChrXyhhLE0sQSkpLTEsSl8ucHVzaChrXyhhLEEsVCkpLTEsSl8ucHVzaChrXyhhLFQsdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89Wl9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWl9baV0pfShhLHUsZixjKX10aGlzLmVkZ2VzPUpfLHRoaXMuY2VsbHM9Wl8sV189UV89Sl89Wl89bnVsbH1mdW5jdGlvbiByYih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaWIodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBvYih0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZWIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplYixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTF8obix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxhLHUsZixjLHM9ZS5zaXRlLGw9LTEsaD1uW2lbby0xXV0sZD1oLmxlZnQ9PT1zP2gucmlnaHQ6aC5sZWZ0OysrbDxvOylhPWQsZD0oaD1uW2lbbF1dKS5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdCxhJiZkJiZyPGEuaW5kZXgmJnI8ZC5pbmRleCYmKGY9YSxjPWQsKCh1PXMpWzBdLWNbMF0pKihmWzFdLXVbMV0pLSh1WzBdLWZbMF0pKihjWzFdLXVbMV0pPDApJiZ0LnB1c2goW3MuZGF0YSxhLmRhdGEsZC5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHU9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbYV0pOylpZigrK2E+PXUpcmV0dXJuIG51bGw7dmFyIGY9dC1pLnNpdGVbMF0sYz1uLWkuc2l0ZVsxXSxzPWYqZitjKmM7ZG97aT1vLmNlbGxzW3I9YV0sYT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSx1PXIubGVmdDtpZih1IT09aS5zaXRlJiZ1fHwodT1yLnJpZ2h0KSl7dmFyIGY9dC11WzBdLGM9bi11WzFdLGw9ZipmK2MqYztsPHMmJihzPWwsYT11LmluZGV4KX19KX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8czw9ZSplP2kuc2l0ZTpudWxsfX0sb2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvYixzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgb2IodGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBvYih0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBhYj1uZXcgb2IoMSwwLDApO2Z1bmN0aW9uIHViKHQpe3JldHVybiB0Ll9fem9vbXx8YWJ9ZnVuY3Rpb24gZmIoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGNiKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gc2IoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbGIoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gaGIoKXtyZXR1cm4gdGhpcy5fX3pvb218fGFifWZ1bmN0aW9uIGRiKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHBiKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHZiKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sYT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX11Yi5wcm90b3R5cGU9b2IucHJvdG90eXBlLHQudmVyc2lvbj0iNS43LjAiLHQuYmlzZWN0PWksdC5iaXNlY3RSaWdodD1pLHQuYmlzZWN0TGVmdD1vLHQuYXNjZW5kaW5nPW4sdC5iaXNlY3Rvcj1lLHQuY3Jvc3M9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyx1LGY9dC5sZW5ndGgsYz1uLmxlbmd0aCxzPW5ldyBBcnJheShmKmMpO2ZvcihudWxsPT1lJiYoZT1hKSxyPW89MDtyPGY7KytyKWZvcih1PXRbcl0saT0wO2k8YzsrK2ksKytvKXNbb109ZSh1LG5baV0pO3JldHVybiBzfSx0LmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LHQuZGV2aWF0aW9uPWMsdC5leHRlbnQ9cyx0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe3ZhciB0PXYsbj1zLGU9TTtmdW5jdGlvbiByKHIpe3ZhciBvLGEsdT1yLmxlbmd0aCxmPW5ldyBBcnJheSh1KTtmb3Iobz0wO288dTsrK28pZltvXT10KHJbb10sbyxyKTt2YXIgYz1uKGYpLHM9Y1swXSxsPWNbMV0saD1lKGYscyxsKTtBcnJheS5pc0FycmF5KGgpfHwoaD13KHMsbCxoKSxoPWcoTWF0aC5jZWlsKHMvaCkqaCxsLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9czspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT5sOyloLnBvcCgpLC0tZDt2YXIgcCx2PW5ldyBBcnJheShkKzEpO2ZvcihvPTA7bzw9ZDsrK28pKHA9dltvXT1bXSkueDA9bz4wP2hbby0xXTpzLHAueDE9bzxkP2hbb106bDtmb3Iobz0wO288dTsrK28pczw9KGE9ZltvXSkmJmE8PWwmJnZbaShoLGEsMCxkKV0ucHVzaChyW29dKTtyZXR1cm4gdn1yZXR1cm4gci52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnAobikscik6dH0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpwKFt0WzBdLHRbMV1dKSxyKTpufSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP3AoaC5jYWxsKHQpKTpwKHQpLHIpOmV9LHJ9LHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9ZC5jYWxsKHQsdSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKEEodCwuNzUpLUEodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqYyh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9TSx0Lm1heD1ULHQubWVhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT1yLG89LTEsYT0wO2lmKG51bGw9PW4pZm9yKDsrK288cjspaXNOYU4oZT11KHRbb10pKT8tLWk6YSs9ZTtlbHNlIGZvcig7KytvPHI7KWlzTmFOKGU9dShuKHRbb10sbyx0KSkpPy0taTphKz1lO2lmKGkpcmV0dXJuIGEvaX0sdC5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixpPXQubGVuZ3RoLG89LTEsYT1bXTtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKHI9dSh0W29dKSl8fGEucHVzaChyKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKHI9dShlKHRbb10sbyx0KSkpfHxhLnB1c2gocik7cmV0dXJuIEEoYS5zb3J0KG4pLC41KX0sdC5tZXJnZT1OLHQubWluPVMsdC5wYWlycz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWEpO2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxpPXRbMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPW4oaSxpPXRbKytlXSk7cmV0dXJuIG99LHQucGVybXV0ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdC5xdWFudGlsZT1BLHQucmFuZ2U9Zyx0LnNjYW49ZnVuY3Rpb24odCxlKXtpZihyPXQubGVuZ3RoKXt2YXIgcixpLG89MCxhPTAsdT10W2FdO2ZvcihudWxsPT1lJiYoZT1uKTsrK288cjspKGUoaT10W29dLHUpPDB8fDAhPT1lKHUsdSkpJiYodT1pLGE9byk7cmV0dXJuIDA9PT1lKHUsdSk/YTp2b2lkIDB9fSx0LnNodWZmbGU9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sdC5zdW09ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz0wO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspKGU9K3RbaV0pJiYobys9ZSk7ZWxzZSBmb3IoOysraTxyOykoZT0rbih0W2ldLGksdCkpJiYobys9ZSk7cmV0dXJuIG99LHQudGlja3M9bSx0LnRpY2tJbmNyZW1lbnQ9eCx0LnRpY2tTdGVwPXcsdC50cmFuc3Bvc2U9RSx0LnZhcmlhbmNlPWYsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gRShhcmd1bWVudHMpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIEIoeix0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoUix0KX0sdC5heGlzQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBCKEwsdCl9LHQuYXhpc0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoRCx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBSaSh3aSl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKG1pKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gUmkoeGkpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXt2YXIgdD0wLG49bnVsbCxlPW51bGwscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1LGYsYyxzLGw9aS5sZW5ndGgsaD1bXSxkPWcobCkscD1bXSx2PVtdLHk9di5ncm91cHM9bmV3IEFycmF5KGwpLF89bmV3IEFycmF5KGwqbCk7Zm9yKG89MCxjPS0xOysrYzxsOyl7Zm9yKGE9MCxzPS0xOysrczxsOylhKz1pW2NdW3NdO2gucHVzaChhKSxwLnB1c2goZyhsKSksbys9YX1mb3IobiYmZC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oaFt0XSxoW2VdKX0pLGUmJnAuZm9yRWFjaChmdW5jdGlvbih0LG4pe3Quc29ydChmdW5jdGlvbih0LHIpe3JldHVybiBlKGlbbl1bdF0saVtuXVtyXSl9KX0pLGY9KG89WWkoMCxPaS10KmwpL28pP3Q6T2kvbCxhPTAsYz0tMTsrK2M8bDspe2Zvcih1PWEscz0tMTsrK3M8bDspe3ZhciBiPWRbY10sbT1wW2JdW3NdLHg9aVtiXVttXSx3PWEsTT1hKz14Km87X1ttKmwrYl09e2luZGV4OmIsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOncsZW5kQW5nbGU6TSx2YWx1ZTp4fX15W2JdPXtpbmRleDpiLHN0YXJ0QW5nbGU6dSxlbmRBbmdsZTphLHZhbHVlOmhbYl19LGErPWZ9Zm9yKGM9LTE7KytjPGw7KWZvcihzPWMtMTsrK3M8bDspe3ZhciBBPV9bcypsK2NdLFQ9X1tjKmwrc107KEEudmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goQS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6QX06e3NvdXJjZTpBLHRhcmdldDpUfSl9cmV0dXJuIHI/di5zb3J0KHIpOnZ9cmV0dXJuIGkucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WWkoMCxuKSxpKTp0fSxpLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKTpufSxpLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKTplfSxpLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/cj1udWxsOihuPXQscj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxpKTpyJiZyLl87dmFyIG59LGl9LHQucmliYm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Vmksbj0kaSxlPVdpLHI9WmksaT1RaSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9QmkuY2FsbChhcmd1bWVudHMpLGY9dC5hcHBseSh0aGlzLHUpLGM9bi5hcHBseSh0aGlzLHUpLHM9K2UuYXBwbHkodGhpcywodVswXT1mLHUpKSxsPXIuYXBwbHkodGhpcyx1KS1xaSxoPWkuYXBwbHkodGhpcyx1KS1xaSxkPXMqTGkobCkscD1zKkRpKGwpLHY9K2UuYXBwbHkodGhpcywodVswXT1jLHUpKSxnPXIuYXBwbHkodGhpcyx1KS1xaSx5PWkuYXBwbHkodGhpcyx1KS1xaTtpZihvfHwobz1hPUdpKCkpLG8ubW92ZVRvKGQscCksby5hcmMoMCwwLHMsbCxoKSxsPT09ZyYmaD09PXl8fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqTGkoZyksdipEaShnKSksby5hcmMoMCwwLHYsZyx5KSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxkLHApLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOml9LGEuc291cmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sdC5uZXN0PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9W10saT1bXTtmdW5jdGlvbiBvKGUsaSxhLHUpe2lmKGk+PXIubGVuZ3RoKXJldHVybiBudWxsIT10JiZlLnNvcnQodCksbnVsbCE9bj9uKGUpOmU7Zm9yKHZhciBmLGMscyxsPS0xLGg9ZS5sZW5ndGgsZD1yW2krK10scD1LaSgpLHY9YSgpOysrbDxoOykocz1wLmdldChmPWQoYz1lW2xdKSsiIikpP3MucHVzaChjKTpwLnNldChmLFtjXSk7cmV0dXJuIHAuZWFjaChmdW5jdGlvbih0LG4pe3UodixuLG8odCxpLGEsdSkpfSksdn1yZXR1cm4gZT17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCx0byxubyl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsZW8scm8pfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0KGUsbyl7aWYoKytvPnIubGVuZ3RoKXJldHVybiBlO3ZhciBhLHU9aVtvLTFdO3JldHVybiBudWxsIT1uJiZvPj1yLmxlbmd0aD9hPWUuZW50cmllcygpOihhPVtdLGUuZWFjaChmdW5jdGlvbihuLGUpe2EucHVzaCh7a2V5OmUsdmFsdWVzOnQobixvKX0pfSkpLG51bGwhPXU/YS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHUodC5rZXksbi5rZXkpfSk6YX0obyh0LDAsZW8scm8pLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHIucHVzaCh0KSxlfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaVtyLmxlbmd0aC0xXT10LGV9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24obil7cmV0dXJuIHQ9bixlfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIG49dCxlfX19LHQuc2V0PWFvLHQubWFwPUtpLHQua2V5cz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goZSk7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh0W2VdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSx0LmNvbG9yPXZuLHQucmdiPWJuLHQuaHNsPU1uLHQubGFiPVVuLHQuaGNsPUhuLHQubGNoPWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4oZSxuLHQsbnVsbD09cj8xOnIpfSx0LmdyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IHFuKHQsMCwwLG51bGw9PW4/MTpuKX0sdC5jdWJlaGVsaXg9S24sdC5jb250b3Vycz1nbyx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9Ym8sbj1tbyxlPXhvLHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGY9cisyKnU+PmEsYz1pKzIqdT4+YSxzPWNvKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZipjKSxsPW5ldyBGbG9hdDMyQXJyYXkoZipjKTtyLmZvckVhY2goZnVuY3Rpb24ocixvLHMpe3ZhciBsPSt0KHIsbyxzKSt1Pj5hLGg9K24ocixvLHMpK3U+PmEsZD0rZShyLG8scyk7bD49MCYmbDxmJiZoPj0wJiZoPGMmJihpW2wraCpmXSs9ZCl9KSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKTt2YXIgZD1zKGkpO2lmKCFBcnJheS5pc0FycmF5KGQpKXt2YXIgcD1UKGkpO2Q9dygwLHAsZCksKGQ9ZygwLE1hdGguZmxvb3IocC9kKSpkLGQpKS5zaGlmdCgpfXJldHVybiBnbygpLnRocmVzaG9sZHMoZCkuc2l6ZShbZixjXSkoaSkubWFwKGgpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQudmFsdWUqPU1hdGgucG93KDIsLTIqYSksdC5jb29yZGluYXRlcy5mb3JFYWNoKGQpLHR9ZnVuY3Rpb24gZCh0KXt0LmZvckVhY2gocCl9ZnVuY3Rpb24gcCh0KXt0LmZvckVhY2godil9ZnVuY3Rpb24gdih0KXt0WzBdPXRbMF0qTWF0aC5wb3coMixhKS11LHRbMV09dFsxXSpNYXRoLnBvdygyLGEpLXV9ZnVuY3Rpb24geSgpe3JldHVybiBmPXIrMioodT0zKm8pPj5hLGM9aSsyKnU+PmEsbH1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y28oK24pLGwpOnR9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTpufSxsLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTplfSxsLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49TWF0aC5jZWlsKHRbMF0pLGU9TWF0aC5jZWlsKHRbMV0pO2lmKCEobj49MHx8bj49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gcj1uLGk9ZSx5KCl9LGwuY2VsbFNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIDE8PGE7aWYoISgodD0rdCk+PTEpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjZWxsIHNpemUiKTtyZXR1cm4gYT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx5KCl9LGwudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/Y28odW8uY2FsbCh0KSk6Y28odCksbCk6c30sbC5iYW5kd2lkdGg9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE1hdGguc3FydChvKihvKzEpKTtpZighKCh0PSt0KT49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJhbmR3aWR0aCIpO3JldHVybiBvPU1hdGgucm91bmQoKE1hdGguc3FydCg0KnQqdCsxKS0xKS8yKSx5KCl9LGx9LHQuZGlzcGF0Y2g9SSx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgbixlLHIsaSxvPVd0LGE9WnQsdT1RdCxmPUp0LGM9e30scz1JKCJzdGFydCIsImRyYWciLCJlbmQiKSxsPTAsaD0wO2Z1bmN0aW9uIGQodCl7dC5vbigibW91c2Vkb3duLmRyYWciLHApLmZpbHRlcihmKS5vbigidG91Y2hzdGFydC5kcmFnIix5KS5vbigidG91Y2htb3ZlLmRyYWciLF8pLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGIpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBwKCl7aWYoIWkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdT1tKCJtb3VzZSIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksRnQsdGhpcyxhcmd1bWVudHMpO3UmJihEdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsdiwhMCkub24oIm1vdXNldXAuZHJhZyIsZywhMCksWHQodC5ldmVudC52aWV3KSxIdCgpLHI9ITEsbj10LmV2ZW50LmNsaWVudFgsZT10LmV2ZW50LmNsaWVudFksdSgic3RhcnQiKSl9fWZ1bmN0aW9uIHYoKXtpZihqdCgpLCFyKXt2YXIgaT10LmV2ZW50LmNsaWVudFgtbixvPXQuZXZlbnQuY2xpZW50WS1lO3I9aSppK28qbz5ofWMubW91c2UoImRyYWciKX1mdW5jdGlvbiBnKCl7RHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsciksanQoKSxjLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiB5KCl7aWYoby5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmxlbmd0aDtmb3Iobj0wO248dTsrK24pKGU9bShyW25dLmlkZW50aWZpZXIsaSxJdCx0aGlzLGFyZ3VtZW50cykpJiYoSHQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gXygpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihqdCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYigpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPW51bGx9LDUwMCksbj0wO248bzsrK24pKGU9Y1tyW25dLmlkZW50aWZpZXJdKSYmKEh0KCksZSgiZW5kIikpfWZ1bmN0aW9uIG0obixlLHIsaSxvKXt2YXIgYSxmLGgscD1yKGUsbiksdj1zLmNvcHkoKTtpZihDdChuZXcgJHQoZCwiYmVmb3Jlc3RhcnQiLGEsbixsLHBbMF0scFsxXSwwLDAsdiksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXUuYXBwbHkoaSxvKSkmJihmPWEueC1wWzBdfHwwLGg9YS55LXBbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQodSl7dmFyIHMsZz1wO3N3aXRjaCh1KXtjYXNlInN0YXJ0IjpjW25dPXQscz1sKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW25dLC0tbDtjYXNlImRyYWciOnA9cihlLG4pLHM9bH1DdChuZXcgJHQoZCx1LGEsbixzLHBbMF0rZixwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSx2KSx2LmFwcGx5LHYsW3UsaSxvXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6b30sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTphfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTp1fSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6Zn0sZC5vbj1mdW5jdGlvbigpe3ZhciB0PXMub24uYXBwbHkocyxhcmd1bWVudHMpO3JldHVybiB0PT09cz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LHQuZHJhZ0Rpc2FibGU9WHQsdC5kcmFnRW5hYmxlPUd0LHQuZHN2Rm9ybWF0PUVvLHQuY3N2UGFyc2U9Q28sdC5jc3ZQYXJzZVJvd3M9UG8sdC5jc3ZGb3JtYXQ9em8sdC5jc3ZGb3JtYXRSb3dzPVJvLHQudHN2UGFyc2U9RG8sdC50c3ZQYXJzZVJvd3M9VW8sdC50c3ZGb3JtYXQ9cW8sdC50c3ZGb3JtYXRSb3dzPU9vLHQuZWFzZUxpbmVhcj1mdW5jdGlvbih0KXtyZXR1cm4rdH0sdC5lYXNlUXVhZD1Ecix0LmVhc2VRdWFkSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdH0sdC5lYXNlUXVhZE91dD1mdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0sdC5lYXNlUXVhZEluT3V0PURyLHQuZWFzZUN1YmljPVVyLHQuZWFzZUN1YmljSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0fSx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUN1YmljSW5PdXQ9VXIsdC5lYXNlUG9seT1Zcix0LmVhc2VQb2x5SW49cXIsdC5lYXNlUG9seU91dD1Pcix0LmVhc2VQb2x5SW5PdXQ9WXIsdC5lYXNlU2luPUlyLHQuZWFzZVNpbkluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqRnIpfSx0LmVhc2VTaW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqRnIpfSx0LmVhc2VTaW5Jbk91dD1Jcix0LmVhc2VFeHA9SHIsdC5lYXNlRXhwSW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9LHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0sdC5lYXNlRXhwSW5PdXQ9SHIsdC5lYXNlQ2lyY2xlPWpyLHQuZWFzZUNpcmNsZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LHQuZWFzZUNpcmNsZU91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9anIsdC5lYXNlQm91bmNlPW5pLHQuZWFzZUJvdW5jZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLW5pKDEtdCl9LHQuZWFzZUJvdW5jZU91dD1uaSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtbmkoMS10KTpuaSh0LTEpKzEpLzJ9LHQuZWFzZUJhY2s9aWksdC5lYXNlQmFja0luPWVpLHQuZWFzZUJhY2tPdXQ9cmksdC5lYXNlQmFja0luT3V0PWlpLHQuZWFzZUVsYXN0aWM9dWksdC5lYXNlRWxhc3RpY0luPWFpLHQuZWFzZUVsYXN0aWNPdXQ9dWksdC5lYXNlRWxhc3RpY0luT3V0PWZpLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oWW8pfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oQm8pfSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPUVvKHQpO3JldHVybiBJbyhuLGUpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGkucGFyc2UodCxyKX0pfSx0LmNzdj1qbyx0LnRzdj1Ybyx0LmltYWdlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscil7dmFyIGk9bmV3IEltYWdlO2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtpLm9uZXJyb3I9cixpLm9ubG9hZD1mdW5jdGlvbigpe2UoaSl9LGkuc3JjPXR9KX0sdC5qc29uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihHbyl9LHQudGV4dD1Jbyx0LnhtbD0kbyx0Lmh0bWw9V28sdC5zdmc9Wm8sdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe3ZhciBlO2Z1bmN0aW9uIHIoKXt2YXIgcixpLG89ZS5sZW5ndGgsYT0wLHU9MDtmb3Iocj0wO3I8bzsrK3IpYSs9KGk9ZVtyXSkueCx1Kz1pLnk7Zm9yKGE9YS9vLXQsdT11L28tbixyPTA7cjxvOysrcikoaT1lW3JdKS54LT1hLGkueS09dX1yZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dH0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHI9MSxpPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHUsZixjLHMsbCxoPW4ubGVuZ3RoLGQ9MDtkPGk7KytkKWZvcihvPXJhKG4sdWEsZmEpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8aDsrK3QpdT1uW3RdLHM9ZVt1LmluZGV4XSxsPXMqcyxmPXUueCt1LnZ4LGM9dS55K3Uudnksby52aXNpdChwKTtmdW5jdGlvbiBwKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLGQ9cytoO2lmKCFhKXJldHVybiBuPmYrZHx8aTxmLWR8fGU+YytkfHxvPGMtZDtpZihhLmluZGV4PnUuaW5kZXgpe3ZhciBwPWYtYS54LWEudngsdj1jLWEueS1hLnZ5LGc9cCpwK3YqdjtnPGQqZCYmKDA9PT1wJiYoZys9KHA9Sm8oKSkqcCksMD09PXYmJihnKz0odj1KbygpKSp2KSxnPShkLShnPU1hdGguc3FydChnKSkpL2cqcix1LnZ4Kz0ocCo9ZykqKGQ9KGgqPWgpLyhsK2gpKSx1LnZ5Kz0odio9ZykqZCxhLnZ4LT1wKihkPTEtZCksYS52eS09dipkKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9ZVt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiB1KCl7aWYobil7dmFyIHIsaSxvPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKSxyPTA7cjxvOysrcilpPW5bcl0sZVtpLmluZGV4XT0rdChpLHIsbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LHUoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG8pOml9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksdSgpLG8pOnR9LG99LHQuZm9yY2VMaW5rPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYT1jYSx1PWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1RbygzMCksYz0xO2Z1bmN0aW9uIHMocil7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGM7KytpKWZvcih2YXIgdSxmLHMsbCxoLGQscCx2PTA7djxhOysrdilmPSh1PXRbdl0pLnNvdXJjZSxsPShzPXUudGFyZ2V0KS54K3MudngtZi54LWYudnh8fEpvKCksaD1zLnkrcy52eS1mLnktZi52eXx8Sm8oKSxsKj1kPSgoZD1NYXRoLnNxcnQobCpsK2gqaCkpLWVbdl0pL2QqcipuW3ZdLGgqPWQscy52eC09bCoocD1vW3ZdKSxzLnZ5LT1oKnAsZi52eCs9bCoocD0xLXApLGYudnkrPWgqcH1mdW5jdGlvbiBsKCl7aWYocil7dmFyIHUsZixjPXIubGVuZ3RoLHM9dC5sZW5ndGgsbD1LaShyLGEpO2Zvcih1PTAsaT1uZXcgQXJyYXkoYyk7dTxzOysrdSkoZj10W3VdKS5pbmRleD11LCJvYmplY3QiIT10eXBlb2YgZi5zb3VyY2UmJihmLnNvdXJjZT1zYShsLGYuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBmLnRhcmdldCYmKGYudGFyZ2V0PXNhKGwsZi50YXJnZXQpKSxpW2Yuc291cmNlLmluZGV4XT0oaVtmLnNvdXJjZS5pbmRleF18fDApKzEsaVtmLnRhcmdldC5pbmRleF09KGlbZi50YXJnZXQuaW5kZXhdfHwwKSsxO2Zvcih1PTAsbz1uZXcgQXJyYXkocyk7dTxzOysrdSlmPXRbdV0sb1t1XT1pW2Yuc291cmNlLmluZGV4XS8oaVtmLnNvdXJjZS5pbmRleF0raVtmLnRhcmdldC5pbmRleF0pO249bmV3IEFycmF5KHMpLGgoKSxlPW5ldyBBcnJheShzKSxkKCl9fWZ1bmN0aW9uIGgoKXtpZihyKWZvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSluW2VdPSt1KHRbZV0sZSx0KX1mdW5jdGlvbiBkKCl7aWYocilmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT0rZih0W25dLG4sdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGwoKX0scy5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGwoKSxzKTp0fSxzLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQscyk6YX0scy5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LHMpOmN9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksaCgpLHMpOnV9LHMuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksZCgpLHMpOmZ9LHN9LHQuZm9yY2VNYW55Qm9keT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGk9UW8oLTMwKSxvPTEsYT0xLzAsdT0uODE7ZnVuY3Rpb24gZihyKXt2YXIgaSxvPXQubGVuZ3RoLGE9cmEodCxsYSxoYSkudmlzaXRBZnRlcihzKTtmb3IoZT1yLGk9MDtpPG87KytpKW49dFtpXSxhLnZpc2l0KGwpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgbixlLG89dC5sZW5ndGg7Zm9yKHI9bmV3IEFycmF5KG8pLG49MDtuPG87KytuKWU9dFtuXSxyW2UuaW5kZXhdPStpKGUsbix0KX19ZnVuY3Rpb24gcyh0KXt2YXIgbixlLGksbyxhLHU9MCxmPTA7aWYodC5sZW5ndGgpe2ZvcihpPW89YT0wO2E8NDsrK2EpKG49dFthXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsZis9ZSxpKz1lKm4ueCxvKz1lKm4ueSk7dC54PWkvZix0Lnk9by9mfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9cltuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gbCh0LGksZixjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgcz10Lngtbi54LGw9dC55LW4ueSxoPWMtaSxkPXMqcytsKmw7aWYoaCpoL3U8ZClyZXR1cm4gZDxhJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpLG4udngrPXMqdC52YWx1ZSplL2Qsbi52eSs9bCp0LnZhbHVlKmUvZCksITA7aWYoISh0Lmxlbmd0aHx8ZD49YSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpKTtkb3t0LmRhdGEhPT1uJiYoaD1yW3QuZGF0YS5pbmRleF0qZS9kLG4udngrPXMqaCxuLnZ5Kz1sKmgpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGYuaW5pdGlhbGl6ZT1mdW5jdGlvbihuKXt0PW4sYygpfSxmLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGMoKSxmKTppfSxmLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxmKTpNYXRoLnNxcnQobyl9LGYuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmfSx0LmZvcmNlUmFkaWFsPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYT1RbyguMSk7ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGE9MCx1PXIubGVuZ3RoO2E8dTsrK2Epe3ZhciBmPXJbYV0sYz1mLngtbnx8MWUtNixzPWYueS1lfHwxZS02LGw9TWF0aC5zcXJ0KGMqYytzKnMpLGg9KG9bYV0tbCkqaVthXSp0L2w7Zi52eCs9YypoLGYudnkrPXMqaH19ZnVuY3Rpb24gZigpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09K3QocltuXSxuLHIpLGlbbl09aXNOYU4ob1tuXSk/MDorYShyW25dLG4scil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbygrdCkpLG51bGw9PW4mJihuPTApLG51bGw9PWUmJihlPTApLHUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZigpfSx1LnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGYoKSx1KTphfSx1LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxmKCksdSk6dH0sdS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHUpOm59LHUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCx1KTplfSx1fSx0LmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlPTEscj0uMDAxLGk9MS1NYXRoLnBvdyhyLDEvMzAwKSxvPTAsYT0uNix1PUtpKCksZj11cihzKSxjPUkoInRpY2siLCJlbmQiKTtmdW5jdGlvbiBzKCl7bCgpLGMuY2FsbCgidGljayIsbiksZTxyJiYoZi5zdG9wKCksYy5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBsKCl7dmFyIG4scixmPXQubGVuZ3RoO2ZvcihlKz0oby1lKSppLHUuZWFjaChmdW5jdGlvbih0KXt0KGUpfSksbj0wO248ZjsrK24pbnVsbD09KHI9dFtuXSkuZng/ci54Kz1yLnZ4Kj1hOihyLng9ci5meCxyLnZ4PTApLG51bGw9PXIuZnk/ci55Kz1yLnZ5Kj1hOihyLnk9ci5meSxyLnZ5PTApfWZ1bmN0aW9uIGgoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYoKG49dFtlXSkuaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1kYSpNYXRoLnNxcnQoZSksbz1lKnBhO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBkKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXJldHVybiBudWxsPT10JiYodD1bXSksaCgpLG49e3RpY2s6bCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGYucmVzdGFydChzKSxufSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGYuc3RvcCgpLG59LG5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsaCgpLHUuZWFjaChkKSxuKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxuKTplfSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOitpfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxuKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LnJlbW92ZSh0KTp1LnNldCh0LGQoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxmLGM9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8czsrK2MpKGE9KGk9bi0odT10W2NdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoZj11LHI9YSk7cmV0dXJuIGZ9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LGUpLG4pOmMub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9UW8oLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFvKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9U2EsdC5mb3JtYXRMb2NhbGU9TmEsdC5mb3JtYXRTcGVjaWZpZXI9YmEsdC5wcmVjaXNpb25GaXhlZD1FYSx0LnByZWNpc2lvblByZWZpeD1rYSx0LnByZWNpc2lvblJvdW5kPUNhLHQuZ2VvQXJlYT1mdW5jdGlvbih0KXtyZXR1cm4geXUucmVzZXQoKSxzdSh0LF91KSwyKnl1fSx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihSdT16dT0tKEN1PVB1PTEvMCksT3U9W10sc3UodCxyZiksZT1PdS5sZW5ndGgpe2ZvcihPdS5zb3J0KGRmKSxuPTEsbz1bcj1PdVswXV07bjxlOysrbilwZihyLChpPU91W25dKVswXSl8fHBmKHIsaVsxXSk/KGhmKHJbMF0saVsxXSk+aGYoclswXSxyWzFdKSYmKHJbMV09aVsxXSksaGYoaVswXSxyWzFdKT5oZihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1oZihyWzFdLGlbMF0pKT5hJiYoYT11LEN1PWlbMF0senU9clsxXSl9cmV0dXJuIE91PVl1PW51bGwsQ3U9PT0xLzB8fFB1PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0N1LFB1XSxbenUsUnVdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXtCdT1GdT1JdT1IdT1qdT1YdT1HdT1WdT0kdT1XdT1adT0wLHN1KHQsdmYpO3ZhciBuPSR1LGU9V3Uscj1adSxpPW4qbitlKmUrcipyO3JldHVybiBpPFVhJiYobj1YdSxlPUd1LHI9VnUsRnU8RGEmJihuPUl1LGU9SHUscj1qdSksKGk9bipuK2UqZStyKnIpPFVhKT9bTmFOLE5hTl06W1hhKGUsbikqRmEsZXUoci9LYShpKSkqRmFdfSx0Lmdlb0NpcmNsZT1mdW5jdGlvbigpe3ZhciB0LG4sZT1OZihbMCwwXSkscj1OZig5MCksaT1OZig2KSxvPXtwb2ludDpmdW5jdGlvbihlLHIpe3QucHVzaChlPW4oZSxyKSksZVswXSo9RmEsZVsxXSo9RmF9fTtmdW5jdGlvbiBhKCl7dmFyIGE9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYSxmPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKklhO3JldHVybiB0PVtdLG49a2YoLWFbMF0qSWEsLWFbMV0qSWEsMCkuaW52ZXJ0LExmKG8sdSxmLDEpLGE9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt0XX0sdD1uPW51bGwsYX1yZXR1cm4gYS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZihbK3RbMF0sK3RbMV1dKSxhKTplfSxhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTpyfSxhLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTppfSxhfSx0Lmdlb0NsaXBBbnRpbWVyaWRpYW49R2YsdC5nZW9DbGlwQ2lyY2xlPVZmLHQuZ2VvQ2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLGE9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1aZihyLGksbyxhKShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3VbMF1bMF0saT0rdVswXVsxXSxvPSt1WzFdWzBdLGE9K3VbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLGFdXX19fSx0Lmdlb0NsaXBSZWN0YW5nbGU9WmYsdC5nZW9Db250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybih0JiZjYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP2NjW3QudHlwZV06bGMpKHQsbil9LHQuZ2VvRGlzdGFuY2U9ZmMsdC5nZW9HcmF0aWN1bGU9YmMsdC5nZW9HcmF0aWN1bGUxMD1mdW5jdGlvbigpe3JldHVybiBiYygpKCl9LHQuZ2VvSW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKklhLHI9dFsxXSpJYSxpPW5bMF0qSWEsbz1uWzFdKklhLGE9R2EociksdT1RYShyKSxmPUdhKG8pLGM9UWEobykscz1hKkdhKGUpLGw9YSpRYShlKSxoPWYqR2EoaSksZD1mKlFhKGkpLHA9MipldShLYShydShvLXIpK2EqZipydShpLWUpKSksdj1RYShwKSxnPXA/ZnVuY3Rpb24odCl7dmFyIG49UWEodCo9cCkvdixlPVFhKHAtdCkvdixyPWUqcytuKmgsaT1lKmwrbipkLG89ZSp1K24qYztyZXR1cm5bWGEoaSxyKSpGYSxYYShvLEthKHIqcitpKmkpKSpGYV19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqRmEscipGYV19O3JldHVybiBnLmRpc3RhbmNlPXAsZ30sdC5nZW9MZW5ndGg9b2MsdC5nZW9QYXRoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucG9pbnRSYWRpdXMoK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzdSh0LGUocikpKSxyLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShTYykpLFNjLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShkcykpLGRzLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gc3UodCxlKFVjKSksVWMucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShaYykpLFpjLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj8odD1udWxsLG1jKToodD1uKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/KG49bnVsbCxuZXcgZ3MpOm5ldyBhcyhuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKGkpLG8pOm59LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooci5wb2ludFJhZGl1cygrdCksK3QpLG8pOml9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSx0Lmdlb0FsYmVycz1Ecyx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPURzKCksdT1McygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksZj1McygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGYuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksZi5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGYuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oYykscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rRGEscysuMTIqbitEYV0sW28tLjIxNCpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxpPWYudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitEYSxzKy4xNjYqbitEYV0sW28tLjExNSpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoT3MpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdz1Pcyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIENzKFlzKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc9WXMsdC5nZW9Db25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiB6cyhIcykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1Icyx0Lmdlb0NvbmljRXF1YWxBcmVhPUxzLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9UnMsdC5nZW9Db25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHpzKFhzKS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9WHMsdC5nZW9FcXVhbEVhcnRoPWZ1bmN0aW9uKCl7cmV0dXJuIENzKFFzKS5zY2FsZSgxNzcuMTU4KX0sdC5nZW9FcXVhbEVhcnRoUmF3PVFzLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGpzKS5zY2FsZSgxNTIuNjMpfSx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1qcyx0Lmdlb0dub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKEpzKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSx0Lmdlb0dub21vbmljUmF3PUpzLHQuZ2VvSWRlbnRpdHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT0xLHU9MCxmPTAsYz0xLHM9MSxsPW1jLGg9bnVsbCxkPW1jO2Z1bmN0aW9uIHAoKXtyZXR1cm4gcj1pPW51bGwsb31yZXR1cm4gbz17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiByJiZpPT09dD9yOnI9bChkKGk9dCkpfSxwb3N0Y2xpcDpmdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1yLGg9dD1uPWU9bnVsbCxwKCkpOmR9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09cj8oaD10PW49ZT1udWxsLG1jKTpaZihoPStyWzBdWzBdLHQ9K3JbMF1bMV0sbj0rclsxXVswXSxlPStyWzFdWzFdKSxwKCkpOm51bGw9PWg/bnVsbDpbW2gsdF0sW24sZV1dfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcygoYT0rdCkqYyxhKnMsdSxmKSxwKCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSpzLHU9K3RbMF0sZj0rdFsxXSkscCgpKTpbdSxmXX0scmVmbGVjdFg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSooYz10Py0xOjEpLGEqcyx1LGYpLHAoKSk6YzwwfSxyZWZsZWN0WTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSoocz10Py0xOjEpLHUsZikscCgpKTpzPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiB4cyhvLHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gd3Mobyx0LG4pfSxmaXRXaWR0aDpmdW5jdGlvbih0LG4pe3JldHVybiBNcyhvLHQsbil9LGZpdEhlaWdodDpmdW5jdGlvbih0LG4pe3JldHVybiBBcyhvLHQsbil9fX0sdC5nZW9Qcm9qZWN0aW9uPUNzLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9UHMsdC5nZW9NZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBGcyhCcykuc2NhbGUoOTYxL0JhKX0sdC5nZW9NZXJjYXRvclJhdz1Ccyx0Lmdlb05hdHVyYWxFYXJ0aDE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3ModGwpLnNjYWxlKDE3NS4yOTUpfSx0Lmdlb05hdHVyYWxFYXJ0aDFSYXc9dGwsdC5nZW9PcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MobmwpLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTArRGEpfSx0Lmdlb09ydGhvZ3JhcGhpY1Jhdz1ubCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoZWwpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1lbCx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciB0PUZzKHJsKSxuPXQuY2VudGVyLGU9dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oWy10WzFdLHRbMF1dKTpbKHQ9bigpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9ZSgpKVswXSx0WzFdLHRbMl0tOTBdfSxlKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9cmwsdC5nZW9Sb3RhdGlvbj1SZix0Lmdlb1N0cmVhbT1zdSx0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOl9zKHQpfX0sdC5jbHVzdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aWwsbj0xLGU9MSxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYT0wO2kuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe3ZhciBlPW4uY2hpbGRyZW47ZT8obi54PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShvbCwwKS90Lmxlbmd0aH0oZSksbi55PWZ1bmN0aW9uKHQpe3JldHVybiAxK3QucmVkdWNlKGFsLDApfShlKSk6KG4ueD1vP2ErPXQobixvKTowLG4ueT0wLG89bil9KTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxjPXUueC10KHUsZikvMixzPWYueCt0KGYsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1jKS8ocy1jKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5oaWVyYXJjaHk9ZmwsdC5wYWNrPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPTEsZT0xLHI9RWw7ZnVuY3Rpb24gaShpKXtyZXR1cm4gaS54PW4vMixpLnk9ZS8yLHQ/aS5lYWNoQmVmb3JlKFBsKHQpKS5lYWNoQWZ0ZXIoemwociwuNSkpLmVhY2hCZWZvcmUoUmwoMSkpOmkuZWFjaEJlZm9yZShQbChDbCkpLmVhY2hBZnRlcih6bChFbCwxKSkuZWFjaEFmdGVyKHpsKHIsaS5yL01hdGgubWluKG4sZSkpKS5lYWNoQmVmb3JlKFJsKE1hdGgubWluKG4sZSkvKDIqaS5yKSkpLGl9cmV0dXJuIGkucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PShlPW4pP251bGw6U2woZSksaSk6dDt2YXIgZX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxpKTpyfSxpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gTmwodCksdH0sdC5wYWNrRW5jbG9zZT1wbCx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe3ZhciB0PTEsbj0xLGU9MCxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG89aS5oZWlnaHQrMTtyZXR1cm4gaS54MD1pLnkwPWUsaS54MT10LGkueTE9bi9vLGkuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihyKXtyLmNoaWxkcmVuJiZEbChyLHIueDAsdCooci5kZXB0aCsxKS9uLHIueDEsdCooci5kZXB0aCsyKS9uKTt2YXIgaT1yLngwLG89ci55MCxhPXIueDEtZSx1PXIueTEtZTthPGkmJihpPWE9KGkrYSkvMiksdTxvJiYobz11PShvK3UpLzIpLHIueDA9aSxyLnkwPW8sci54MT1hLHIueTE9dX19KG4sbykpLHImJmkuZWFjaEJlZm9yZShMbCksaX1yZXR1cm4gaS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsaSk6cn0saS5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlWzBdLG49K2VbMV0saSk6W3Qsbl19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKTplfSxpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQ9WWwsbj1CbDtmdW5jdGlvbiBlKGUpe3ZhciByLGksbyxhLHUsZixjLHM9ZS5sZW5ndGgsbD1uZXcgQXJyYXkocyksaD17fTtmb3IoaT0wO2k8czsrK2kpcj1lW2ldLHU9bFtpXT1uZXcgaGwociksbnVsbCE9KGY9dChyLGksZSkpJiYoZis9IiIpJiYoaFtjPVVsKyh1LmlkPWYpXT1jIGluIGg/T2w6dSk7Zm9yKGk9MDtpPHM7KytpKWlmKHU9bFtpXSxudWxsIT0oZj1uKGVbaV0saSxlKSkmJihmKz0iIikpe2lmKCEoYT1oW1VsK2ZdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrZik7aWYoYT09PU9sKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2YpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHUpOmEuY2hpbGRyZW49W3VdLHUucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXV9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9cWwsby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLXN9KS5lYWNoQmVmb3JlKGxsKSxvLnBhcmVudD1udWxsLHM+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIGUuaWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9U2wobiksZSk6dH0sZS5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TbCh0KSxlKTpufSxlfSx0LnRyZWU9ZnVuY3Rpb24oKXt2YXIgdD1GbCxuPTEsZT0xLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLGE9bmV3IEdsKHQsMCksdT1bYV07bj11LnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpdS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgR2wocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4oYS5wYXJlbnQ9bmV3IEdsKG51bGwsMCkpLmNoaWxkcmVuPVthXSxhfShpKTtpZihmLmVhY2hBZnRlcihvKSxmLnBhcmVudC5tPS1mLnosZi5lYWNoQmVmb3JlKGEpLHIpaS5lYWNoQmVmb3JlKHUpO2Vsc2V7dmFyIGM9aSxzPWksbD1pO2kuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8Yy54JiYoYz10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9Yz09PXM/MTp0KGMscykvMixkPWgtYy54LHA9bi8ocy54K2grZCksdj1lLyhsLmRlcHRofHwxKTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrZCkqcCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGY9by5wYXJlbnQuY2hpbGRyZW5bMF0sYz1vLm0scz1hLm0sbD11Lm0saD1mLm07dT1IbCh1KSxvPUlsKG8pLHUmJm87KWY9SWwoZiksKGE9SGwoYSkpLmE9biwoaT11LnorbC1vLnotYyt0KHUuXyxvLl8pKT4wJiYoamwoWGwodSxuLHIpLG4saSksYys9aSxzKz1pKSxsKz11Lm0sYys9by5tLGgrPWYubSxzKz1hLm07dSYmIUhsKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFJbChmKSYmKGYudD1vLGYubSs9Yy1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1abCxuPSExLGU9MSxyPTEsaT1bMF0sbz1FbCxhPUVsLHU9RWwsZj1FbCxjPUVsO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShMbCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1jKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWYobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmZ9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6Y30sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sZj11Lmxlbmd0aCxjPW5ldyBBcnJheShmKzEpO2ZvcihjWzBdPWE9bz0wO288ZjsrK28pY1tvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsZil7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Zil9Zm9yKHZhciBsPWNbbl0saD1yLzIrbCxkPW4rMSxwPWUtMTtkPHA7KXt2YXIgdj1kK3A+Pj4xO2Nbdl08aD9kPXYrMTpwPXZ9aC1jW2QtMV08Y1tkXS1oJiZuKzE8ZCYmLS1kO3ZhciBnPWNbZF0tbCx5PXItZztpZihhLWk+Zi1vKXt2YXIgXz0oaSp5K2EqZykvcjt0KG4sZCxnLGksbyxfLGYpLHQoZCxlLHksXyxvLGEsZil9ZWxzZXt2YXIgYj0obyp5K2YqZykvcjt0KG4sZCxnLGksbyxhLGIpLHQoZCxlLHksaSxiLGEsZil9fSgwLGYsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1EbCx0LnRyZWVtYXBTbGljZT1WbCx0LnRyZWVtYXBTbGljZURpY2U9ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP1ZsOkRsKSh0LG4sZSxyLGkpfSx0LnRyZWVtYXBTcXVhcmlmeT1abCx0LnRyZWVtYXBSZXNxdWFyaWZ5PVFsLHQuaW50ZXJwb2xhdGU9bWUsdC5pbnRlcnBvbGF0ZUFycmF5PWRlLHQuaW50ZXJwb2xhdGVCYXNpcz1lZSx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9cmUsdC5pbnRlcnBvbGF0ZURhdGU9cGUsdC5pbnRlcnBvbGF0ZURpc2NyZXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fSx0LmludGVycG9sYXRlSHVlPWZ1bmN0aW9uKHQsbil7dmFyIGU9YWUoK3QsK24pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiBuLTM2MCpNYXRoLmZsb29yKG4vMzYwKX19LHQuaW50ZXJwb2xhdGVOdW1iZXI9dmUsdC5pbnRlcnBvbGF0ZU9iamVjdD1nZSx0LmludGVycG9sYXRlUm91bmQ9eGUsdC5pbnRlcnBvbGF0ZVN0cmluZz1iZSx0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUNlLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UGUsdC5pbnRlcnBvbGF0ZVpvb209cWUsdC5pbnRlcnBvbGF0ZVJnYj1jZSx0LmludGVycG9sYXRlUmdiQmFzaXM9bGUsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPWhlLHQuaW50ZXJwb2xhdGVIc2w9WWUsdC5pbnRlcnBvbGF0ZUhzbExvbmc9QmUsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWZlKCh0PVVuKHQpKS5sLChuPVVuKG4pKS5sKSxyPWZlKHQuYSxuLmEpLGk9ZmUodC5iLG4uYiksbz1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPUllLHQuaW50ZXJwb2xhdGVIY2xMb25nPUhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9WGUsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9R2UsdC5waWVjZXdpc2U9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoLTEsaT1uWzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT10KGksaT1uWysrZV0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLE1hdGgubWluKHItMSxNYXRoLmZsb29yKHQqPXIpKSk7cmV0dXJuIG9bbl0odC1uKX19LHQucXVhbnRpemU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sdC5wYXRoPUdpLHQucG9seWdvbkFyZWE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj10Lmxlbmd0aCxpPXRbci0xXSxvPTA7KytlPHI7KW49aSxpPXRbZV0sbys9blsxXSppWzBdLW5bMF0qaVsxXTtyZXR1cm4gby8yfSx0LnBvbHlnb25DZW50cm9pZD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz0wLGE9MCx1PXRbaS0xXSxmPTA7KytyPGk7KW49dSx1PXRbcl0sZis9ZT1uWzBdKnVbMV0tdVswXSpuWzFdLG8rPShuWzBdK3VbMF0pKmUsYSs9KG5bMV0rdVsxXSkqZTtyZXR1cm5bby8oZio9MyksYS9mXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KEpsKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1LbChyKSxhPUtsKGkpLHU9YVswXT09PW9bMF0sZj1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxjPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pYy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtZjsrK24pYy5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBjfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1uWzBdLHU9blsxXSxmPW9bMF0sYz1vWzFdLHM9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT51IT1jPnUmJmE8KGYtZSkqKHUtcikvKGMtcikrZSYmKHM9IXMpLGY9ZSxjPXI7cmV0dXJuIHN9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1vWzBdLHU9b1sxXSxmPTA7KytyPGk7KW49YSxlPXUsbi09YT0obz10W3JdKVswXSxlLT11PW9bMV0sZis9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBmfSx0LnF1YWR0cmVlPXJhLHQucmFuZG9tVW5pZm9ybT1uaCx0LnJhbmRvbU5vcm1hbD1laCx0LnJhbmRvbUxvZ05vcm1hbD1yaCx0LnJhbmRvbUJhdGVzPW9oLHQucmFuZG9tSXJ3aW5IYWxsPWloLHQucmFuZG9tRXhwb25lbnRpYWw9YWgsdC5zY2FsZUJhbmQ9aGgsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQobil7dmFyIGU9bi5jb3B5O3JldHVybiBuLnBhZGRpbmc9bi5wYWRkaW5nT3V0ZXIsZGVsZXRlIG4ucGFkZGluZ0lubmVyLGRlbGV0ZSBuLnBhZGRpbmdPdXRlcixuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKCkpfSxufShoaCgpLnBhZGRpbmdJbm5lcigxKSl9LHQuc2NhbGVJZGVudGl0eT1mdW5jdGlvbiB0KCl7dmFyIG49WzAsMV07ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWZoLmNhbGwodCxwaCksZSk6bi5zbGljZSgpfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKX0seGgoZSl9LHQuc2NhbGVMaW5lYXI9ZnVuY3Rpb24gdCgpe3ZhciBuPW1oKGdoLHZlKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKG4sdCgpKX0seGgobil9LHQuc2NhbGVMb2c9ZnVuY3Rpb24gbigpe3ZhciBlPW1oKE1oLEFoKS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1TaCgxMCksYT1OaCgxMCk7ZnVuY3Rpb24gdSgpe3JldHVybiBvPVNoKGkpLGE9TmgoaSkscigpWzBdPDAmJihvPUVoKG8pLGE9RWgoYSkpLGV9cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCx1KCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLHUoKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLHU9ZVswXSxmPWVbZS5sZW5ndGgtMV07KG49Zjx1KSYmKGg9dSx1PWYsZj1oKTt2YXIgYyxzLGwsaD1vKHUpLGQ9byhmKSxwPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJmQtaDxwKXtpZihoPU1hdGgucm91bmQoaCktMSxkPU1hdGgucm91bmQoZCkrMSx1PjApe2Zvcig7aDxkOysraClmb3Iocz0xLGM9YShoKTtzPGk7KytzKWlmKCEoKGw9YypzKTx1KSl7aWYobD5mKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8ZDsrK2gpZm9yKHM9aS0xLGM9YShoKTtzPj0xOy0tcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1tKGgsZCxNYXRoLm1pbihkLWgscCkpLm1hcChhKTtyZXR1cm4gbj92LnJldmVyc2UoKTp2fSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciB1PU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L2EoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9dT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIod2gocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKGUsbigpLmJhc2UoaSkpfSxlfSx0LnNjYWxlT3JkaW5hbD1saCx0LnNjYWxlSW1wbGljaXQ9c2gsdC5zY2FsZVBvdz1DaCx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBDaCgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPUEoZSx0L24pO3JldHVybiB1fWZ1bmN0aW9uIHUodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiByW2kobyx0KV19cmV0dXJuIHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP29bbi0xXTplWzBdLG48by5sZW5ndGg/b1tuXTplW2UubGVuZ3RoLTFdXX0sdS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz10Lmxlbmd0aDtpPG87KytpKW51bGw9PShyPXRbaV0pfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQobiksYSgpfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWNoLmNhbGwodCksYSgpKTpyLnNsaWNlKCl9LHUucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uocil9LHV9LHQuc2NhbGVRdWFudGl6ZT1mdW5jdGlvbiB0KCl7dmFyIG49MCxlPTEscj0xLG89Wy41XSxhPVswLDFdO2Z1bmN0aW9uIHUodCl7aWYodDw9dClyZXR1cm4gYVtpKG8sdCwwLHIpXX1mdW5jdGlvbiBmKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KHIpOysrdDxyOylvW3RdPSgodCsxKSplLSh0LXIpKm4pLyhyKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGYoKSk6W24sZV19LHUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9KGE9Y2guY2FsbCh0KSkubGVuZ3RoLTEsZigpKTphLnNsaWNlKCl9LHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBpPWEuaW5kZXhPZih0KTtyZXR1cm4gaTwwP1tOYU4sTmFOXTppPDE/W24sb1swXV06aT49cj9bb1tyLTFdLGVdOltvW2ktMV0sb1tpXV19LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKFtuLGVdKS5yYW5nZShhKX0seGgodSl9LHQuc2NhbGVUaHJlc2hvbGQ9ZnVuY3Rpb24gdCgpe3ZhciBuPVsuNV0sZT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtpZih0PD10KXJldHVybiBlW2kobix0LDAscildfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWNoLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSxvKTplLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciByPWUuaW5kZXhPZih0KTtyZXR1cm5bbltyLTFdLG5bcl1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShlKX0sb30sdC5zY2FsZVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoY2QsdWQsVmgsamgsSWgsQmgsT2gsTGgsdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoTGQsemQsX2QsdmQsZGQsbGQsT2gsTGgsdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sdC5zY2FsZVNlcXVlbnRpYWw9ZnVuY3Rpb24gdChuKXt2YXIgZT0wLHI9MSxpPTEsbz0hMTtmdW5jdGlvbiBhKHQpe3ZhciByPSh0LWUpKmk7cmV0dXJuIG4obz9NYXRoLm1heCgwLE1hdGgubWluKDEscikpOnIpfXJldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9ZT09PXI/MDoxLyhyLWUpLGEpOltlLHJdfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxhKTpvfSxhLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyXSkuY2xhbXAobyl9LHhoKGEpfSx0LnNjYWxlRGl2ZXJnaW5nPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPS41LGk9MSxvPTEsYT0xLHU9ITE7ZnVuY3Rpb24gZih0KXt2YXIgZT0uNSsoKHQ9K3QpLXIpKih0PHI/bzphKTtyZXR1cm4gbih1P01hdGgubWF4KDAsTWF0aC5taW4oMSxlKSk6ZSl9cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0saT0rdFsyXSxvPWU9PT1yPzA6LjUvKHItZSksYT1yPT09aT8wOi41LyhpLXIpLGYpOltlLHIsaV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ISF0LGYpOnV9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZik6bn0sZi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQobikuZG9tYWluKFtlLHIsaV0pLmNsYW1wKHUpfSx4aChmKX0sdC5zY2hlbWVDYXRlZ29yeTEwPWx2LHQuc2NoZW1lQWNjZW50PWh2LHQuc2NoZW1lRGFyazI9ZHYsdC5zY2hlbWVQYWlyZWQ9cHYsdC5zY2hlbWVQYXN0ZWwxPXZ2LHQuc2NoZW1lUGFzdGVsMj1ndix0LnNjaGVtZVNldDE9eXYsdC5zY2hlbWVTZXQyPV92LHQuc2NoZW1lU2V0Mz1idix0LmludGVycG9sYXRlQnJCRz13dix0LnNjaGVtZUJyQkc9eHYsdC5pbnRlcnBvbGF0ZVBSR249QXYsdC5zY2hlbWVQUkduPU12LHQuaW50ZXJwb2xhdGVQaVlHPU52LHQuc2NoZW1lUGlZRz1Udix0LmludGVycG9sYXRlUHVPcj1Fdix0LnNjaGVtZVB1T3I9U3YsdC5pbnRlcnBvbGF0ZVJkQnU9Q3YsdC5zY2hlbWVSZEJ1PWt2LHQuaW50ZXJwb2xhdGVSZEd5PXp2LHQuc2NoZW1lUmRHeT1Qdix0LmludGVycG9sYXRlUmRZbEJ1PUx2LHQuc2NoZW1lUmRZbEJ1PVJ2LHQuaW50ZXJwb2xhdGVSZFlsR249VXYsdC5zY2hlbWVSZFlsR249RHYsdC5pbnRlcnBvbGF0ZVNwZWN0cmFsPU92LHQuc2NoZW1lU3BlY3RyYWw9cXYsdC5pbnRlcnBvbGF0ZUJ1R249QnYsdC5zY2hlbWVCdUduPVl2LHQuaW50ZXJwb2xhdGVCdVB1PUl2LHQuc2NoZW1lQnVQdT1Gdix0LmludGVycG9sYXRlR25CdT1qdix0LnNjaGVtZUduQnU9SHYsdC5pbnRlcnBvbGF0ZU9yUmQ9R3YsdC5zY2hlbWVPclJkPVh2LHQuaW50ZXJwb2xhdGVQdUJ1R249JHYsdC5zY2hlbWVQdUJ1R249VnYsdC5pbnRlcnBvbGF0ZVB1QnU9WnYsdC5zY2hlbWVQdUJ1PVd2LHQuaW50ZXJwb2xhdGVQdVJkPUp2LHQuc2NoZW1lUHVSZD1Rdix0LmludGVycG9sYXRlUmRQdT10Zyx0LnNjaGVtZVJkUHU9S3YsdC5pbnRlcnBvbGF0ZVlsR25CdT1lZyx0LnNjaGVtZVlsR25CdT1uZyx0LmludGVycG9sYXRlWWxHbj1pZyx0LnNjaGVtZVlsR249cmcsdC5pbnRlcnBvbGF0ZVlsT3JCcj1hZyx0LnNjaGVtZVlsT3JCcj1vZyx0LmludGVycG9sYXRlWWxPclJkPWZnLHQuc2NoZW1lWWxPclJkPXVnLHQuaW50ZXJwb2xhdGVCbHVlcz1zZyx0LnNjaGVtZUJsdWVzPWNnLHQuaW50ZXJwb2xhdGVHcmVlbnM9aGcsdC5zY2hlbWVHcmVlbnM9bGcsdC5pbnRlcnBvbGF0ZUdyZXlzPXBnLHQuc2NoZW1lR3JleXM9ZGcsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9Z2csdC5zY2hlbWVQdXJwbGVzPXZnLHQuaW50ZXJwb2xhdGVSZWRzPV9nLHQuc2NoZW1lUmVkcz15Zyx0LmludGVycG9sYXRlT3Jhbmdlcz1tZyx0LnNjaGVtZU9yYW5nZXM9YmcsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ9eGcsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiBBZy5oPTM2MCp0LTEwMCxBZy5zPTEuNS0xLjUqbixBZy5sPS44LS45Km4sQWcrIiJ9LHQuaW50ZXJwb2xhdGVXYXJtPXdnLHQuaW50ZXJwb2xhdGVDb29sPU1nLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLFRnLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLFRnLmc9MjU1KihuPU1hdGguc2luKHQrTmcpKSpuLFRnLmI9MjU1KihuPU1hdGguc2luKHQrU2cpKSpuLFRnKyIifSx0LmludGVycG9sYXRlVmlyaWRpcz1rZyx0LmludGVycG9sYXRlTWFnbWE9Q2csdC5pbnRlcnBvbGF0ZUluZmVybm89UGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT16Zyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRHQoVyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9Vyx0LmxvY2FsPXF0LHQubWF0Y2hlcj1ydCx0Lm1vdXNlPUZ0LHQubmFtZXNwYWNlPSQsdC5uYW1lc3BhY2VzPVYsdC5jbGllbnRQb2ludD1CdCx0LnNlbGVjdD1EdCx0LnNlbGVjdEFsbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtudWxsPT10P1tdOnRdLHp0KX0sdC5zZWxlY3Rpb249THQsdC5zZWxlY3Rvcj1RLHQuc2VsZWN0b3JBbGw9Syx0LnN0eWxlPWx0LHQudG91Y2g9SXQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49WXQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09QnQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9c3QsdC5jdXN0b21FdmVudD1DdCx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUdnLG49VmcsZT1SZygwKSxyPW51bGwsaT0kZyxvPVdnLGE9WmcsdT1udWxsO2Z1bmN0aW9uIGYoKXt2YXIgZixjLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUhnLHY9TGcocC1kKSxnPXA+ZDtpZih1fHwodT1mPUdpKCkpLGg8bCYmKGM9aCxoPWwsbD1jKSxoPkZnKWlmKHY+amctRmcpdS5tb3ZlVG8oaCpVZyhkKSxoKllnKGQpKSx1LmFyYygwLDAsaCxkLHAsIWcpLGw+RmcmJih1Lm1vdmVUbyhsKlVnKHApLGwqWWcocCkpLHUuYXJjKDAsMCxsLHAsZCxnKSk7ZWxzZXt2YXIgeSxfLGI9ZCxtPXAseD1kLHc9cCxNPXYsQT12LFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+RmcmJihyPytyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpCZyhsKmwraCpoKSksUz1PZyhMZyhoLWwpLzIsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxFPVMsaz1TO2lmKE4+Rmcpe3ZhciBDPVhnKE4vbCpZZyhUKSksUD1YZyhOL2gqWWcoVCkpOyhNLT0yKkMpPkZnPyh4Kz1DKj1nPzE6LTEsdy09Qyk6KE09MCx4PXc9KGQrcCkvMiksKEEtPTIqUCk+Rmc/KGIrPVAqPWc/MTotMSxtLT1QKTooQT0wLGI9bT0oZCtwKS8yKX12YXIgej1oKlVnKGIpLFI9aCpZZyhiKSxMPWwqVWcodyksRD1sKllnKHcpO2lmKFM+Rmcpe3ZhciBVPWgqVWcobSkscT1oKllnKG0pLE89bCpVZyh4KSxZPWwqWWcoeCk7aWYodjxJZyl7dmFyIEI9TT5GZz9mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBmPWUtdCxjPXItbixzPWEtaSxsPXUtbyxoPShzKihuLW8pLWwqKHQtaSkpLyhsKmYtcypjKTtyZXR1cm5bdCtoKmYsbitoKmNdfSh6LFIsTyxZLFUscSxMLEQpOltMLERdLEY9ei1CWzBdLEk9Ui1CWzFdLEg9VS1CWzBdLGo9cS1CWzFdLFg9MS9ZZygoKHM9KEYqSCtJKmopLyhCZyhGKkYrSSpJKSpCZyhIKkgraipqKSkpPjE/MDpzPC0xP0lnOk1hdGguYWNvcyhzKSkvMiksRz1CZyhCWzBdKkJbMF0rQlsxXSpCWzFdKTtFPU9nKFMsKGwtRykvKFgtMSkpLGs9T2coUywoaC1HKS8oWCsxKSl9fUE+Rmc/az5GZz8oeT1RZyhPLFkseixSLGgsayxnKSxfPVFnKFUscSxMLEQsaCxrLGcpLHUubW92ZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksazxTP3UuYXJjKHkuY3gseS5jeSxrLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsaCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIWcpLHUuYXJjKF8uY3gsXy5jeSxrLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6KHUubW92ZVRvKHosUiksdS5hcmMoMCwwLGgsYixtLCFnKSk6dS5tb3ZlVG8oeixSKSxsPkZnJiZNPkZnP0U+Rmc/KHk9UWcoTCxELFUscSxsLC1FLGcpLF89UWcoeixSLE8sWSxsLC1FLGcpLHUubGluZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksRTxTP3UuYXJjKHkuY3gseS5jeSxFLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsbCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksZyksdS5hcmMoXy5jeCxfLmN5LEUsRGcoXy55MTEsXy54MTEpLERnKF8ueTAxLF8ueDAxKSwhZykpKTp1LmFyYygwLDAsbCx3LHgsZyk6dS5saW5lVG8oTCxEKX1lbHNlIHUubW92ZVRvKDAsMCk7aWYodS5jbG9zZVBhdGgoKSxmKXJldHVybiB1PW51bGwsZisiInx8bnVsbH1yZXR1cm4gZi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBlPSgrdC5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgraS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1JZy8yO3JldHVybltVZyhyKSplLFlnKHIpKmVdfSxmLmlubmVyUmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6bn0sZi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOnJ9LGYuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTppfSxmLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm99LGYucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PXQ/bnVsbDp0LGYpOnV9LGZ9LHQuYXJlYT1yeSx0LmxpbmU9ZXksdC5waWU9ZnVuY3Rpb24oKXt2YXIgdD1veSxuPWl5LGU9bnVsbCxyPVJnKDApLGk9UmcoamcpLG89UmcoMCk7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscyxsLGg9YS5sZW5ndGgsZD0wLHA9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLGc9K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLHk9TWF0aC5taW4oamcsTWF0aC5tYXgoLWpnLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLWcpKSxfPU1hdGgubWluKE1hdGguYWJzKHkpL2gsby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGI9XyooeTwwPy0xOjEpO2Zvcih1PTA7dTxoOysrdSkobD12W3BbdV09dV09K3QoYVt1XSx1LGEpKT4wJiYoZCs9bCk7Zm9yKG51bGwhPW4/cC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odlt0XSx2W2VdKX0pOm51bGwhPWUmJnAuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKGFbdF0sYVtuXSl9KSx1PTAsYz1kPyh5LWgqYikvZDowO3U8aDsrK3UsZz1zKWY9cFt1XSxzPWcrKChsPXZbZl0pPjA/bCpjOjApK2IsdltmXT17ZGF0YTphW2ZdLGluZGV4OnUsdmFsdWU6bCxzdGFydEFuZ2xlOmcsZW5kQW5nbGU6cyxwYWRBbmdsZTpffTtyZXR1cm4gdn1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbj1udWxsLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6b30sYX0sdC5hcmVhUmFkaWFsPWx5LHQucmFkaWFsQXJlYT1seSx0LmxpbmVSYWRpYWw9c3ksdC5yYWRpYWxMaW5lPXN5LHQucG9pbnRSYWRpYWw9aHksdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiBneSh5eSl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIGd5KF95KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9Z3koYnkpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7dmFyIHQ9UmcobXkpLG49UmcoNjQpLGU9bnVsbDtmdW5jdGlvbiByKCl7dmFyIHI7aWYoZXx8KGU9cj1HaSgpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKS5kcmF3KGUsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxyKXJldHVybiBlPW51bGwscisiInx8bnVsbH1yZXR1cm4gci50eXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Umcobikscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLHIpOm59LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCxyKTplfSxyfSx0LnN5bWJvbHM9VXksdC5zeW1ib2xDaXJjbGU9bXksdC5zeW1ib2xDcm9zcz14eSx0LnN5bWJvbERpYW1vbmQ9QXksdC5zeW1ib2xTcXVhcmU9a3ksdC5zeW1ib2xTdGFyPUV5LHQuc3ltYm9sVHJpYW5nbGU9UHksdC5zeW1ib2xXeWU9RHksdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQnkodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeSh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXkodCl9LHQuY3VydmVCdW5kbGU9SHksdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPSR5LHQuY3VydmVDYXJkaW5hbE9wZW49WnksdC5jdXJ2ZUNhcmRpbmFsPUd5LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPW5fLHQuY3VydmVDYXRtdWxsUm9tT3Blbj1yXyx0LmN1cnZlQ2F0bXVsbFJvbT1LeSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaV8odCl9LHQuY3VydmVMaW5lYXI9S2csdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGNfKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgc18odCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaF8odCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXt2YXIgdD1SZyhbXSksbj1nXyxlPXZfLHI9eV87ZnVuY3Rpb24gaShpKXt2YXIgbyxhLHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZj1pLmxlbmd0aCxjPXUubGVuZ3RoLHM9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBsLGg9dVtvXSxkPXNbb109bmV3IEFycmF5KGYpLHA9MDtwPGY7KytwKWRbcF09bD1bMCwrcihpW3BdLGgscCxpKV0sbC5kYXRhPWlbcF07ZC5rZXk9aH1mb3Iobz0wLGE9bihzKTtvPGM7KytvKXNbYVtvXV0uaW5kZXg9bztyZXR1cm4gZShzLGEpLHN9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKGR5LmNhbGwobikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2dfOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoZHkuY2FsbCh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD92Xzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9dl8odCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sYSx1LGY9MCxjPXRbblswXV0ubGVuZ3RoO2Y8YzsrK2YpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bZl0pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09YSxyWzBdPWErPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9dl8sdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIGE9MCx1PTA7YTxlOysrYSl1Kz10W2FdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LXUvMn12Xyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9MTthPHI7KythKXtmb3IodmFyIHU9MCxmPTAsYz0wO3U8aTsrK3Upe2Zvcih2YXIgcz10W25bdV1dLGw9c1thXVsxXXx8MCxoPShsLShzW2EtMV1bMV18fDApKS8yLGQ9MDtkPHU7KytkKXt2YXIgcD10W25bZF1dO2grPShwW2FdWzFdfHwwKS0ocFthLTFdWzFdfHwwKX1mKz1sLGMrPWgqbH1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLGYmJihvLT1jL2YpfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sdl8odCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1fXyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBfXyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChiXyksbz1nXyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLGE9MCx1PTAsZj1bXSxjPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sYTx1PyhhKz1pW2VdLGYucHVzaChlKSk6KHUrPWlbZV0sYy5wdXNoKGUpKTtyZXR1cm4gYy5yZXZlcnNlKCkuY29uY2F0KGYpfSx0LnN0YWNrT3JkZXJOb25lPWdfLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGdfKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9UmgsdC50aW1lTWlsbGlzZWNvbmQ9TGgsdC50aW1lTWlsbGlzZWNvbmRzPURoLHQudXRjTWlsbGlzZWNvbmQ9TGgsdC51dGNNaWxsaXNlY29uZHM9RGgsdC50aW1lU2Vjb25kPU9oLHQudGltZVNlY29uZHM9WWgsdC51dGNTZWNvbmQ9T2gsdC51dGNTZWNvbmRzPVloLHQudGltZU1pbnV0ZT1CaCx0LnRpbWVNaW51dGVzPUZoLHQudGltZUhvdXI9SWgsdC50aW1lSG91cnM9SGgsdC50aW1lRGF5PWpoLHQudGltZURheXM9WGgsdC50aW1lV2Vlaz1WaCx0LnRpbWVXZWVrcz10ZCx0LnRpbWVTdW5kYXk9VmgsdC50aW1lU3VuZGF5cz10ZCx0LnRpbWVNb25kYXk9JGgsdC50aW1lTW9uZGF5cz1uZCx0LnRpbWVUdWVzZGF5PVdoLHQudGltZVR1ZXNkYXlzPWVkLHQudGltZVdlZG5lc2RheT1aaCx0LnRpbWVXZWRuZXNkYXlzPXJkLHQudGltZVRodXJzZGF5PVFoLHQudGltZVRodXJzZGF5cz1pZCx0LnRpbWVGcmlkYXk9SmgsdC50aW1lRnJpZGF5cz1vZCx0LnRpbWVTYXR1cmRheT1LaCx0LnRpbWVTYXR1cmRheXM9YWQsdC50aW1lTW9udGg9dWQsdC50aW1lTW9udGhzPWZkLHQudGltZVllYXI9Y2QsdC50aW1lWWVhcnM9c2QsdC51dGNNaW51dGU9bGQsdC51dGNNaW51dGVzPWhkLHQudXRjSG91cj1kZCx0LnV0Y0hvdXJzPXBkLHQudXRjRGF5PXZkLHQudXRjRGF5cz1nZCx0LnV0Y1dlZWs9X2QsdC51dGNXZWVrcz1UZCx0LnV0Y1N1bmRheT1fZCx0LnV0Y1N1bmRheXM9VGQsdC51dGNNb25kYXk9YmQsdC51dGNNb25kYXlzPU5kLHQudXRjVHVlc2RheT1tZCx0LnV0Y1R1ZXNkYXlzPVNkLHQudXRjV2VkbmVzZGF5PXhkLHQudXRjV2VkbmVzZGF5cz1FZCx0LnV0Y1RodXJzZGF5PXdkLHQudXRjVGh1cnNkYXlzPWtkLHQudXRjRnJpZGF5PU1kLHQudXRjRnJpZGF5cz1DZCx0LnV0Y1NhdHVyZGF5PUFkLHQudXRjU2F0dXJkYXlzPVBkLHQudXRjTW9udGg9emQsdC51dGNNb250aHM9UmQsdC51dGNZZWFyPUxkLHQudXRjWWVhcnM9RGQsdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1RcCx0LnRpbWVGb3JtYXRMb2NhbGU9WWQsdC5pc29Gb3JtYXQ9SnAsdC5pc29QYXJzZT1LcCx0Lm5vdz1pcix0LnRpbWVyPXVyLHQudGltZXJGbHVzaD1mcix0LnRpbWVvdXQ9aHIsdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGFyLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/aXIoKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyhhKXthKz1pLHIucmVzdGFydChvLGkrPW4sZSksdChhKX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPXpyLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpZm9yKHIgaW4gbj1udWxsPT1uP251bGw6bisiIixpKWlmKChlPWlbcl0pLnN0YXRlPmdyJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgUHIoW1t0XV0sbGksbiwrcik7cmV0dXJuIG51bGx9LHQuaW50ZXJydXB0PU5yLHQudm9yb25vaT1mdW5jdGlvbigpe3ZhciB0PXhfLG49d18sZT1udWxsO2Z1bmN0aW9uIHIocil7cmV0dXJuIG5ldyBlYihyLm1hcChmdW5jdGlvbihlLGkpe3ZhciBvPVtNYXRoLnJvdW5kKHQoZSxpLHIpL0tfKSpLXyxNYXRoLnJvdW5kKG4oZSxpLHIpL0tfKSpLX107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9ZSxvfSksZSl9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246bV8oK24pLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om1fKCt0KSxyKTpufSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6ZSYmW1tlWzBdWzBdLGVbMF1bMV1dLFtlWzFdWzBdLGVbMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6ZSYmW2VbMV1bMF0tZVswXVswXSxlWzFdWzFdLWVbMF1bMV1dfSxyfSx0Lnpvb209ZnVuY3Rpb24oKXt2YXIgbixlLHI9c2IsaT1sYixvPXZiLGE9ZGIsdT1wYixmPVswLDEvMF0sYz1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPXFlLGg9W10sZD1JKCJzdGFydCIsInpvb20iLCJlbmQiKSxwPTUwMCx2PTE1MCxnPTA7ZnVuY3Rpb24geSh0KXt0LnByb3BlcnR5KCJfX3pvb20iLGhiKS5vbigid2hlZWwuem9vbSIsQSkub24oIm1vdXNlZG93bi56b29tIixUKS5vbigiZGJsY2xpY2suem9vbSIsTikuZmlsdGVyKHUpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLFMpLm9uKCJ0b3VjaG1vdmUuem9vbSIsRSkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsaykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChmWzBdLE1hdGgubWluKGZbMV0sbikpKT09PXQuaz90Om5ldyBvYihuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IG9iKHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3codGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dyh0aGlzLHQpLG89aS5hcHBseSh0aGlzLHQpLGE9ZXx8bShvKSx1PU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLGY9dGhpcy5fX3pvb20sYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixzPWwoZi5pbnZlcnQoYSkuY29uY2F0KHUvZi5rKSxjLmludmVydChhKS5jb25jYXQodS9jLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1jO2Vsc2V7dmFyIG49cyh0KSxlPXUvblsyXTt0PW5ldyBvYihlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB3KHQsbil7Zm9yKHZhciBlLHI9MCxpPWgubGVuZ3RoO3I8aTsrK3IpaWYoKGU9aFtyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBNKHQsbil9ZnVuY3Rpb24gTSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsbil9ZnVuY3Rpb24gQSgpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD13KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGU9TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4uaypNYXRoLnBvdygyLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGk9RnQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09aVswXSYmdC5tb3VzZVswXVsxXT09PWlbMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09aSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWUpcmV0dXJuO3QubW91c2U9W2ksbi5pbnZlcnQoaSldLE5yKHRoaXMpLHQuc3RhcnQoKX1jYigpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSx2KSx0Lnpvb20oIm1vdXNlIixvKGIoXyhuLGUpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsYykpfX1mdW5jdGlvbiBUKCl7aWYoIWUmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj13KHRoaXMsYXJndW1lbnRzKSxpPUR0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKGNiKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC11LHI9dC5ldmVudC5jbGllbnRZLWY7bi5tb3ZlZD1lKmUrcipyPmd9bi56b29tKCJtb3VzZSIsbyhiKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1GdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LGMpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksY2IoKSxuLmVuZCgpfSwhMCksYT1GdCh0aGlzKSx1PXQuZXZlbnQuY2xpZW50WCxmPXQuZXZlbnQuY2xpZW50WTtYdCh0LmV2ZW50LnZpZXcpLGZiKCksbi5tb3VzZT1bYSx0aGlzLl9fem9vbS5pbnZlcnQoYSldLE5yKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gTigpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj10aGlzLl9fem9vbSxlPUZ0KHRoaXMpLGE9bi5pbnZlcnQoZSksdT1uLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6MiksZj1vKGIoXyhuLHUpLGUsYSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyk7Y2IoKSxzPjA/RHQodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKHMpLmNhbGwoeCxmLGUpOkR0KHRoaXMpLmNhbGwoeS50cmFuc2Zvcm0sZil9fWZ1bmN0aW9uIFMoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGUsaSxvLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1mLmxlbmd0aDtmb3IoZmIoKSxpPTA7aTxjOysraSlhPVthPUl0KHRoaXMsZiwobz1mW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoYSksby5pZGVudGlmaWVyXSx1LnRvdWNoMD91LnRvdWNoMXx8KHUudG91Y2gxPWEpOih1LnRvdWNoMD1hLGU9ITApO2lmKG4mJihuPWNsZWFyVGltZW91dChuKSwhdS50b3VjaDEpKXJldHVybiB1LmVuZCgpLHZvaWQoKGE9RHQodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYobj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bj1udWxsfSxwKSxOcih0aGlzKSx1LnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7dmFyIGUscixpLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMscz1mLmxlbmd0aDtmb3IoY2IoKSxuJiYobj1jbGVhclRpbWVvdXQobikpLGU9MDtlPHM7KytlKWk9SXQodGhpcyxmLChyPWZbZV0pLmlkZW50aWZpZXIpLHUudG91Y2gwJiZ1LnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj91LnRvdWNoMFswXT1pOnUudG91Y2gxJiZ1LnRvdWNoMVsyXT09PXIuaWRlbnRpZmllciYmKHUudG91Y2gxWzBdPWkpO2lmKHI9dS50aGF0Ll9fem9vbSx1LnRvdWNoMSl7dmFyIGw9dS50b3VjaDBbMF0saD11LnRvdWNoMFsxXSxkPXUudG91Y2gxWzBdLHA9dS50b3VjaDFbMV0sdj0odj1kWzBdLWxbMF0pKnYrKHY9ZFsxXS1sWzFdKSp2LGc9KGc9cFswXS1oWzBdKSpnKyhnPXBbMV0taFsxXSkqZztyPV8ocixNYXRoLnNxcnQodi9nKSksaT1bKGxbMF0rZFswXSkvMiwobFsxXStkWzFdKS8yXSxhPVsoaFswXStwWzBdKS8yLChoWzFdK3BbMV0pLzJdfWVsc2V7aWYoIXUudG91Y2gwKXJldHVybjtpPXUudG91Y2gwWzBdLGE9dS50b3VjaDBbMV19dS56b29tKCJ0b3VjaCIsbyhiKHIsaSxhKSx1LmV4dGVudCxjKSl9ZnVuY3Rpb24gaygpe3ZhciBuLHIsaT13KHRoaXMsYXJndW1lbnRzKSxvPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYT1vLmxlbmd0aDtmb3IoZmIoKSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSxwKSxuPTA7bjxhOysrbilyPW9bbl0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIHkudHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsaGIpLHQhPT1lP3godCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSx5LnNjYWxlQnk9ZnVuY3Rpb24odCxuKXt5LnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKX0pfSx5LnNjYWxlVG89ZnVuY3Rpb24odCxuKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10aGlzLl9fem9vbSxyPW0odCksYT1lLmludmVydChyKSx1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKGUsdSkscixhKSx0LGMpfSl9LHkudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxuLGUpe3kudHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjKX0pfSx5LnRyYW5zbGF0ZVRvPWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj10aGlzLl9fem9vbSxhPW0odCk7cmV0dXJuIG8oYWIudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoci5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/LW4uYXBwbHkodGhpcyxhcmd1bWVudHMpOi1uLCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSksdCxjKX0pfSxNLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9aC5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGguc3BsaWNlKHRoaXMuaW5kZXgsMSksdGhpcy5pbmRleD0tMSx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0N0KG5ldyBpYih5LHQsdGhpcy50aGF0Ll9fem9vbSksZC5hcHBseSxkLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHkud2hlZWxEZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCt0KSx5KTphfSx5LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCEhdCkseSk6cn0seS50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnV9LHkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHkpOml9LHkuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGZbMF09K3RbMF0sZlsxXT0rdFsxXSx5KTpbZlswXSxmWzFdXX0seS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNbMF1bMF09K3RbMF1bMF0sY1sxXVswXT0rdFsxXVswXSxjWzBdWzFdPSt0WzBdWzFdLGNbMV1bMV09K3RbMV1bMV0seSk6W1tjWzBdWzBdLGNbMF1bMV1dLFtjWzFdWzBdLGNbMV1bMV1dXX0seS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCx5KTpvfSx5LmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkpOnN9LHkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx5KTpsfSx5Lm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP3k6dH0seS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSh0PSt0KSp0LHkpOk1hdGguc3FydChnKX0seX0sdC56b29tVHJhbnNmb3JtPXViLHQuem9vbUlkZW50aXR5PWFiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOwo8L3NjcmlwdD48c2NyaXB0PihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5ncmFwaGxpYj1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApOwp2YXIgZj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbGliPXJlcXVpcmUoIi4vbGliIik7bW9kdWxlLmV4cG9ydHM9e0dyYXBoOmxpYi5HcmFwaCxqc29uOnJlcXVpcmUoIi4vbGliL2pzb24iKSxhbGc6cmVxdWlyZSgiLi9saWIvYWxnIiksdmVyc2lvbjpsaWIudmVyc2lvbn19LHsiLi9saWIiOjE3LCIuL2xpYi9hbGciOjgsIi4vbGliL2pzb24iOjE4fV0sCjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNvbXBvbmVudHM7ZnVuY3Rpb24gY29tcG9uZW50cyhnKXt2YXIgdmlzaXRlZD17fSxjbXB0cz1bXSxjbXB0O2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7Y21wdC5wdXNoKHYpO18uZWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKTtfLmVhY2goZy5wcmVkZWNlc3NvcnModiksZGZzKX1fLmVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2NtcHQ9W107ZGZzKHYpO2lmKGNtcHQubGVuZ3RoKWNtcHRzLnB1c2goY21wdCl9KTtyZXR1cm4gY21wdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1kZnM7ZnVuY3Rpb24gZGZzKGcsdnMsb3JkZXIpe2lmKCFfLmlzQXJyYXkodnMpKXZzPQpbdnNdO3ZhciBuYXZpZ2F0aW9uPShnLmlzRGlyZWN0ZWQoKT9nLnN1Y2Nlc3NvcnM6Zy5uZWlnaGJvcnMpLmJpbmQoZyk7dmFyIGFjYz1bXSx2aXNpdGVkPXt9O18uZWFjaCh2cyxmdW5jdGlvbih2KXtpZighZy5oYXNOb2RlKHYpKXRocm93IG5ldyBFcnJvcigiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiAiK3YpO2RvRGZzKGcsdixvcmRlcj09PSJwb3N0Iix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO3JldHVybiBhY2N9ZnVuY3Rpb24gZG9EZnMoZyx2LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKXtpZighXy5oYXModmlzaXRlZCx2KSl7dmlzaXRlZFt2XT10cnVlO2lmKCFwb3N0b3JkZXIpYWNjLnB1c2godik7Xy5lYWNoKG5hdmlnYXRpb24odiksZnVuY3Rpb24odyl7ZG9EZnMoZyx3LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO2lmKHBvc3RvcmRlcilhY2MucHVzaCh2KX19fSx7Ii4uL2xvZGFzaCI6MTl9XSw0OltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7dmFyIGRpamtzdHJhPXJlcXVpcmUoIi4vZGlqa3N0cmEiKSxfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWRpamtzdHJhQWxsO2Z1bmN0aW9uIGRpamtzdHJhQWxsKGcsd2VpZ2h0RnVuYyxlZGdlRnVuYyl7cmV0dXJuIF8udHJhbnNmb3JtKGcubm9kZXMoKSxmdW5jdGlvbihhY2Msdil7YWNjW3ZdPWRpamtzdHJhKGcsdix3ZWlnaHRGdW5jLGVkZ2VGdW5jKX0se30pfX0seyIuLi9sb2Rhc2giOjE5LCIuL2RpamtzdHJhIjo1fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksUHJpb3JpdHlRdWV1ZT1yZXF1aXJlKCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIik7bW9kdWxlLmV4cG9ydHM9ZGlqa3N0cmE7dmFyIERFRkFVTFRfV0VJR0hUX0ZVTkM9Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBkaWprc3RyYShnLHNvdXJjZSx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5EaWprc3RyYShnLApTdHJpbmcoc291cmNlKSx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRlVOQyxlZGdlRm58fGZ1bmN0aW9uKHYpe3JldHVybiBnLm91dEVkZ2VzKHYpfSl9ZnVuY3Rpb24gcnVuRGlqa3N0cmEoZyxzb3VyY2Usd2VpZ2h0Rm4sZWRnZUZuKXt2YXIgcmVzdWx0cz17fSxwcT1uZXcgUHJpb3JpdHlRdWV1ZSx2LHZFbnRyeTt2YXIgdXBkYXRlTmVpZ2hib3JzPWZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2UudiE9PXY/ZWRnZS52OmVkZ2Uudyx3RW50cnk9cmVzdWx0c1t3XSx3ZWlnaHQ9d2VpZ2h0Rm4oZWRnZSksZGlzdGFuY2U9dkVudHJ5LmRpc3RhbmNlK3dlaWdodDtpZih3ZWlnaHQ8MCl0aHJvdyBuZXcgRXJyb3IoImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gIisiQmFkIGVkZ2U6ICIrZWRnZSsiIFdlaWdodDogIit3ZWlnaHQpO2lmKGRpc3RhbmNlPHdFbnRyeS5kaXN0YW5jZSl7d0VudHJ5LmRpc3RhbmNlPWRpc3RhbmNlO3dFbnRyeS5wcmVkZWNlc3Nvcj0KdjtwcS5kZWNyZWFzZSh3LGRpc3RhbmNlKX19O2cubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe3ZhciBkaXN0YW5jZT12PT09c291cmNlPzA6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3Jlc3VsdHNbdl09e2Rpc3RhbmNlOmRpc3RhbmNlfTtwcS5hZGQodixkaXN0YW5jZSl9KTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTt2RW50cnk9cmVzdWx0c1t2XTtpZih2RW50cnkuZGlzdGFuY2U9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpYnJlYWs7ZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKX1yZXR1cm4gcmVzdWx0c319LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsIi4uL2xvZGFzaCI6MTl9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx0YXJqYW49cmVxdWlyZSgiLi90YXJqYW4iKTttb2R1bGUuZXhwb3J0cz1maW5kQ3ljbGVzO2Z1bmN0aW9uIGZpbmRDeWNsZXMoZyl7cmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwKZnVuY3Rpb24oY21wdCl7cmV0dXJuIGNtcHQubGVuZ3RoPjF8fGNtcHQubGVuZ3RoPT09MSYmZy5oYXNFZGdlKGNtcHRbMF0sY21wdFswXSl9KX19LHsiLi4vbG9kYXNoIjoxOSwiLi90YXJqYW4iOjEzfV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZmxveWRXYXJzaGFsbDt2YXIgREVGQVVMVF9XRUlHSFRfRlVOQz1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZVTkMsZWRnZUZufHxmdW5jdGlvbih2KXtyZXR1cm4gZy5vdXRFZGdlcyh2KX0pfWZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3ZhciByZXN1bHRzPXt9LG5vZGVzPWcubm9kZXMoKTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpe3Jlc3VsdHNbdl09Cnt9O3Jlc3VsdHNbdl1bdl09e2Rpc3RhbmNlOjB9O25vZGVzLmZvckVhY2goZnVuY3Rpb24odyl7aWYodiE9PXcpcmVzdWx0c1t2XVt3XT17ZGlzdGFuY2U6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfX0pO2VkZ2VGbih2KS5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2UudixkPXdlaWdodEZuKGVkZ2UpO3Jlc3VsdHNbdl1bd109e2Rpc3RhbmNlOmQscHJlZGVjZXNzb3I6dn19KX0pO25vZGVzLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIHJvd0s9cmVzdWx0c1trXTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciByb3dJPXJlc3VsdHNbaV07bm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKXt2YXIgaWs9cm93SVtrXTt2YXIga2o9cm93S1tqXTt2YXIgaWo9cm93SVtqXTt2YXIgYWx0RGlzdGFuY2U9aWsuZGlzdGFuY2Ura2ouZGlzdGFuY2U7aWYoYWx0RGlzdGFuY2U8aWouZGlzdGFuY2Upe2lqLmRpc3RhbmNlPWFsdERpc3RhbmNlO2lqLnByZWRlY2Vzc29yPQprai5wcmVkZWNlc3Nvcn19KX0pfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Y29tcG9uZW50czpyZXF1aXJlKCIuL2NvbXBvbmVudHMiKSxkaWprc3RyYTpyZXF1aXJlKCIuL2RpamtzdHJhIiksZGlqa3N0cmFBbGw6cmVxdWlyZSgiLi9kaWprc3RyYS1hbGwiKSxmaW5kQ3ljbGVzOnJlcXVpcmUoIi4vZmluZC1jeWNsZXMiKSxmbG95ZFdhcnNoYWxsOnJlcXVpcmUoIi4vZmxveWQtd2Fyc2hhbGwiKSxpc0FjeWNsaWM6cmVxdWlyZSgiLi9pcy1hY3ljbGljIikscG9zdG9yZGVyOnJlcXVpcmUoIi4vcG9zdG9yZGVyIikscHJlb3JkZXI6cmVxdWlyZSgiLi9wcmVvcmRlciIpLHByaW06cmVxdWlyZSgiLi9wcmltIiksdGFyamFuOnJlcXVpcmUoIi4vdGFyamFuIiksdG9wc29ydDpyZXF1aXJlKCIuL3RvcHNvcnQiKX19LHsiLi9jb21wb25lbnRzIjoyLCIuL2RpamtzdHJhIjo1LAoiLi9kaWprc3RyYS1hbGwiOjQsIi4vZmluZC1jeWNsZXMiOjYsIi4vZmxveWQtd2Fyc2hhbGwiOjcsIi4vaXMtYWN5Y2xpYyI6OSwiLi9wb3N0b3JkZXIiOjEwLCIuL3ByZW9yZGVyIjoxMSwiLi9wcmltIjoxMiwiLi90YXJqYW4iOjEzLCIuL3RvcHNvcnQiOjE0fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHRvcHNvcnQ9cmVxdWlyZSgiLi90b3Bzb3J0Iik7bW9kdWxlLmV4cG9ydHM9aXNBY3ljbGljO2Z1bmN0aW9uIGlzQWN5Y2xpYyhnKXt0cnl7dG9wc29ydChnKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgdG9wc29ydC5DeWNsZUV4Y2VwdGlvbilyZXR1cm4gZmFsc2U7dGhyb3cgZTt9cmV0dXJuIHRydWV9fSx7Ii4vdG9wc29ydCI6MTR9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGRmcz1yZXF1aXJlKCIuL2RmcyIpO21vZHVsZS5leHBvcnRzPXBvc3RvcmRlcjtmdW5jdGlvbiBwb3N0b3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLAp2cywicG9zdCIpfX0seyIuL2RmcyI6M31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZGZzPXJlcXVpcmUoIi4vZGZzIik7bW9kdWxlLmV4cG9ydHM9cHJlb3JkZXI7ZnVuY3Rpb24gcHJlb3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLHZzLCJwcmUiKX19LHsiLi9kZnMiOjN9XSwxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGgiKSxQcmlvcml0eVF1ZXVlPXJlcXVpcmUoIi4uL2RhdGEvcHJpb3JpdHktcXVldWUiKTttb2R1bGUuZXhwb3J0cz1wcmltO2Z1bmN0aW9uIHByaW0oZyx3ZWlnaHRGdW5jKXt2YXIgcmVzdWx0PW5ldyBHcmFwaCxwYXJlbnRzPXt9LHBxPW5ldyBQcmlvcml0eVF1ZXVlLHY7ZnVuY3Rpb24gdXBkYXRlTmVpZ2hib3JzKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2Uudixwcmk9cHEucHJpb3JpdHkodyk7aWYocHJpIT09CnVuZGVmaW5lZCl7dmFyIGVkZ2VXZWlnaHQ9d2VpZ2h0RnVuYyhlZGdlKTtpZihlZGdlV2VpZ2h0PHByaSl7cGFyZW50c1t3XT12O3BxLmRlY3JlYXNlKHcsZWRnZVdlaWdodCl9fX1pZihnLm5vZGVDb3VudCgpPT09MClyZXR1cm4gcmVzdWx0O18uZWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cHEuYWRkKHYsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtyZXN1bHQuc2V0Tm9kZSh2KX0pO3BxLmRlY3JlYXNlKGcubm9kZXMoKVswXSwwKTt2YXIgaW5pdD1mYWxzZTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTtpZihfLmhhcyhwYXJlbnRzLHYpKXJlc3VsdC5zZXRFZGdlKHYscGFyZW50c1t2XSk7ZWxzZSBpZihpbml0KXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogIitnKTtlbHNlIGluaXQ9dHJ1ZTtnLm5vZGVFZGdlcyh2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyl9cmV0dXJuIHJlc3VsdH19LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsCiIuLi9ncmFwaCI6MTYsIi4uL2xvZGFzaCI6MTl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dGFyamFuO2Z1bmN0aW9uIHRhcmphbihnKXt2YXIgaW5kZXg9MCxzdGFjaz1bXSx2aXNpdGVkPXt9LHJlc3VsdHM9W107ZnVuY3Rpb24gZGZzKHYpe3ZhciBlbnRyeT12aXNpdGVkW3ZdPXtvblN0YWNrOnRydWUsbG93bGluazppbmRleCxpbmRleDppbmRleCsrfTtzdGFjay5wdXNoKHYpO2cuc3VjY2Vzc29ycyh2KS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKXtkZnModyk7ZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10ubG93bGluayl9ZWxzZSBpZih2aXNpdGVkW3ddLm9uU3RhY2spZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10uaW5kZXgpfSk7aWYoZW50cnkubG93bGluaz09PWVudHJ5LmluZGV4KXt2YXIgY21wdD0KW10sdztkb3t3PXN0YWNrLnBvcCgpO3Zpc2l0ZWRbd10ub25TdGFjaz1mYWxzZTtjbXB0LnB1c2godyl9d2hpbGUodiE9PXcpO3Jlc3VsdHMucHVzaChjbXB0KX19Zy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odil7aWYoIV8uaGFzKHZpc2l0ZWQsdikpZGZzKHYpfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dG9wc29ydDt0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uPUN5Y2xlRXhjZXB0aW9uO2Z1bmN0aW9uIHRvcHNvcnQoZyl7dmFyIHZpc2l0ZWQ9e30sc3RhY2s9e30scmVzdWx0cz1bXTtmdW5jdGlvbiB2aXNpdChub2RlKXtpZihfLmhhcyhzdGFjayxub2RlKSl0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb247aWYoIV8uaGFzKHZpc2l0ZWQsbm9kZSkpe3N0YWNrW25vZGVdPXRydWU7dmlzaXRlZFtub2RlXT10cnVlO18uZWFjaChnLnByZWRlY2Vzc29ycyhub2RlKSwKdmlzaXQpO2RlbGV0ZSBzdGFja1tub2RlXTtyZXN1bHRzLnB1c2gobm9kZSl9fV8uZWFjaChnLnNpbmtzKCksdmlzaXQpO2lmKF8uc2l6ZSh2aXNpdGVkKSE9PWcubm9kZUNvdW50KCkpdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIEN5Y2xlRXhjZXB0aW9uKCl7fX0seyIuLi9sb2Rhc2giOjE5fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPVByaW9yaXR5UXVldWU7ZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpe3RoaXMuX2Fycj1bXTt0aGlzLl9rZXlJbmRpY2VzPXt9fVByaW9yaXR5UXVldWUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLmxlbmd0aH07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB4LmtleX0pfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXM9CmZ1bmN0aW9uKGtleSl7cmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsa2V5KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHk9ZnVuY3Rpb24oa2V5KXt2YXIgaW5kZXg9dGhpcy5fa2V5SW5kaWNlc1trZXldO2lmKGluZGV4IT09dW5kZWZpbmVkKXJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtpZih0aGlzLnNpemUoKT09PTApdGhyb3cgbmV3IEVycm9yKCJRdWV1ZSB1bmRlcmZsb3ciKTtyZXR1cm4gdGhpcy5fYXJyWzBdLmtleX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlcztrZXk9U3RyaW5nKGtleSk7aWYoIV8uaGFzKGtleUluZGljZXMsa2V5KSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGluZGV4PWFyci5sZW5ndGg7a2V5SW5kaWNlc1trZXldPWluZGV4O2Fyci5wdXNoKHtrZXk6a2V5LApwcmlvcml0eTpwcmlvcml0eX0pO3RoaXMuX2RlY3JlYXNlKGluZGV4KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLnJlbW92ZU1pbj1mdW5jdGlvbigpe3RoaXMuX3N3YXAoMCx0aGlzLl9hcnIubGVuZ3RoLTEpO3ZhciBtaW49dGhpcy5fYXJyLnBvcCgpO2RlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW21pbi5rZXldO3RoaXMuX2hlYXBpZnkoMCk7cmV0dXJuIG1pbi5rZXl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmRlY3JlYXNlPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGluZGV4PXRoaXMuX2tleUluZGljZXNba2V5XTtpZihwcmlvcml0eT50aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KXRocm93IG5ldyBFcnJvcigiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiAiKyJLZXk6ICIra2V5KyIgT2xkOiAiK3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHkrIiBOZXc6ICIrcHJpb3JpdHkpO3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHk9CnByaW9yaXR5O3RoaXMuX2RlY3JlYXNlKGluZGV4KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2hlYXBpZnk9ZnVuY3Rpb24oaSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGw9MippLHI9bCsxLGxhcmdlc3Q9aTtpZihsPGFyci5sZW5ndGgpe2xhcmdlc3Q9YXJyW2xdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9sOmxhcmdlc3Q7aWYocjxhcnIubGVuZ3RoKWxhcmdlc3Q9YXJyW3JdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9yOmxhcmdlc3Q7aWYobGFyZ2VzdCE9PWkpe3RoaXMuX3N3YXAoaSxsYXJnZXN0KTt0aGlzLl9oZWFwaWZ5KGxhcmdlc3QpfX19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZT1mdW5jdGlvbihpbmRleCl7dmFyIGFycj10aGlzLl9hcnI7dmFyIHByaW9yaXR5PWFycltpbmRleF0ucHJpb3JpdHk7dmFyIHBhcmVudDt3aGlsZShpbmRleCE9PTApe3BhcmVudD1pbmRleD4+MTtpZihhcnJbcGFyZW50XS5wcmlvcml0eTxwcmlvcml0eSlicmVhazsKdGhpcy5fc3dhcChpbmRleCxwYXJlbnQpO2luZGV4PXBhcmVudH19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9zd2FwPWZ1bmN0aW9uKGksail7dmFyIGFycj10aGlzLl9hcnI7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlczt2YXIgb3JpZ0Fyckk9YXJyW2ldO3ZhciBvcmlnQXJySj1hcnJbal07YXJyW2ldPW9yaWdBcnJKO2FycltqXT1vcmlnQXJySTtrZXlJbmRpY2VzW29yaWdBcnJKLmtleV09aTtrZXlJbmRpY2VzW29yaWdBcnJJLmtleV09an19LHsiLi4vbG9kYXNoIjoxOX1dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPUdyYXBoO3ZhciBERUZBVUxUX0VER0VfTkFNRT0iXHgwMCIsR1JBUEhfTk9ERT0iXHgwMCIsRURHRV9LRVlfREVMSU09Ilx1MDAwMSI7ZnVuY3Rpb24gR3JhcGgob3B0cyl7dGhpcy5faXNEaXJlY3RlZD1fLmhhcyhvcHRzLCJkaXJlY3RlZCIpP29wdHMuZGlyZWN0ZWQ6CnRydWU7dGhpcy5faXNNdWx0aWdyYXBoPV8uaGFzKG9wdHMsIm11bHRpZ3JhcGgiKT9vcHRzLm11bHRpZ3JhcGg6ZmFsc2U7dGhpcy5faXNDb21wb3VuZD1fLmhhcyhvcHRzLCJjb21wb3VuZCIpP29wdHMuY29tcG91bmQ6ZmFsc2U7dGhpcy5fbGFiZWw9dW5kZWZpbmVkO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1fLmNvbnN0YW50KHVuZGVmaW5lZCk7dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPV8uY29uc3RhbnQodW5kZWZpbmVkKTt0aGlzLl9ub2Rlcz17fTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9wYXJlbnQ9e307dGhpcy5fY2hpbGRyZW49e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV09e319dGhpcy5faW49e307dGhpcy5fcHJlZHM9e307dGhpcy5fb3V0PXt9O3RoaXMuX3N1Y3M9e307dGhpcy5fZWRnZU9ianM9e307dGhpcy5fZWRnZUxhYmVscz17fX1HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudD0wO0dyYXBoLnByb3RvdHlwZS5fZWRnZUNvdW50PTA7R3JhcGgucHJvdG90eXBlLmlzRGlyZWN0ZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWR9O0dyYXBoLnByb3RvdHlwZS5pc011bHRpZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBofTtHcmFwaC5wcm90b3R5cGUuaXNDb21wb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0NvbXBvdW5kfTtHcmFwaC5wcm90b3R5cGUuc2V0R3JhcGg9ZnVuY3Rpb24obGFiZWwpe3RoaXMuX2xhYmVsPWxhYmVsO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9O0dyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsPWZ1bmN0aW9uKG5ld0RlZmF1bHQpe2lmKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpbmV3RGVmYXVsdD1fLmNvbnN0YW50KG5ld0RlZmF1bHQpO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1uZXdEZWZhdWx0O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUubm9kZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDb3VudH07CkdyYXBoLnByb3RvdHlwZS5ub2Rlcz1mdW5jdGlvbigpe3JldHVybiBfLmtleXModGhpcy5fbm9kZXMpfTtHcmFwaC5wcm90b3R5cGUuc291cmNlcz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gXy5pc0VtcHR5KHNlbGYuX2luW3ZdKX0pfTtHcmFwaC5wcm90b3R5cGUuc2lua3M9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIF8uaXNFbXB0eShzZWxmLl9vdXRbdl0pfSl9O0dyYXBoLnByb3RvdHlwZS5zZXROb2Rlcz1mdW5jdGlvbih2cyx2YWx1ZSl7dmFyIGFyZ3M9YXJndW1lbnRzO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHZzLGZ1bmN0aW9uKHYpe2lmKGFyZ3MubGVuZ3RoPjEpc2VsZi5zZXROb2RlKHYsdmFsdWUpO2Vsc2Ugc2VsZi5zZXROb2RlKHYpfSk7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXROb2RlPQpmdW5jdGlvbih2LHZhbHVlKXtpZihfLmhhcyh0aGlzLl9ub2Rlcyx2KSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXRoaXMuX25vZGVzW3ZdPXZhbHVlO3JldHVybiB0aGlzfXRoaXMuX25vZGVzW3ZdPWFyZ3VtZW50cy5sZW5ndGg+MT92YWx1ZTp0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcGFyZW50W3ZdPUdSQVBIX05PREU7dGhpcy5fY2hpbGRyZW5bdl09e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl09dHJ1ZX10aGlzLl9pblt2XT17fTt0aGlzLl9wcmVkc1t2XT17fTt0aGlzLl9vdXRbdl09e307dGhpcy5fc3Vjc1t2XT17fTsrK3RoaXMuX25vZGVDb3VudDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLm5vZGU9ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMuX25vZGVzW3ZdfTtHcmFwaC5wcm90b3R5cGUuaGFzTm9kZT1mdW5jdGlvbih2KXtyZXR1cm4gXy5oYXModGhpcy5fbm9kZXMsdil9O0dyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlPQpmdW5jdGlvbih2KXt2YXIgc2VsZj10aGlzO2lmKF8uaGFzKHRoaXMuX25vZGVzLHYpKXt2YXIgcmVtb3ZlRWRnZT1mdW5jdGlvbihlKXtzZWxmLnJlbW92ZUVkZ2Uoc2VsZi5fZWRnZU9ianNbZV0pfTtkZWxldGUgdGhpcy5fbm9kZXNbdl07aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7ZGVsZXRlIHRoaXMuX3BhcmVudFt2XTtfLmVhY2godGhpcy5jaGlsZHJlbih2KSxmdW5jdGlvbihjaGlsZCl7c2VsZi5zZXRQYXJlbnQoY2hpbGQpfSk7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdfV8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9pblt2XTtkZWxldGUgdGhpcy5fcHJlZHNbdl07Xy5lYWNoKF8ua2V5cyh0aGlzLl9vdXRbdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9vdXRbdl07ZGVsZXRlIHRoaXMuX3N1Y3Nbdl07LS10aGlzLl9ub2RlQ291bnR9cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQ9CmZ1bmN0aW9uKHYscGFyZW50KXtpZighdGhpcy5faXNDb21wb3VuZCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoIik7aWYoXy5pc1VuZGVmaW5lZChwYXJlbnQpKXBhcmVudD1HUkFQSF9OT0RFO2Vsc2V7cGFyZW50Kz0iIjtmb3IodmFyIGFuY2VzdG9yPXBhcmVudDshXy5pc1VuZGVmaW5lZChhbmNlc3Rvcik7YW5jZXN0b3I9dGhpcy5wYXJlbnQoYW5jZXN0b3IpKWlmKGFuY2VzdG9yPT09dil0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgIitwYXJlbnQrIiBhcyBwYXJlbnQgb2YgIit2KyIgd291bGQgY3JlYXRlIGEgY3ljbGUiKTt0aGlzLnNldE5vZGUocGFyZW50KX10aGlzLnNldE5vZGUodik7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7dGhpcy5fcGFyZW50W3ZdPXBhcmVudDt0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdPXRydWU7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Q9CmZ1bmN0aW9uKHYpe2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdl1dW3ZdfTtHcmFwaC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHYpe2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBwYXJlbnQ9dGhpcy5fcGFyZW50W3ZdO2lmKHBhcmVudCE9PUdSQVBIX05PREUpcmV0dXJuIHBhcmVudH19O0dyYXBoLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih2KXtpZihfLmlzVW5kZWZpbmVkKHYpKXY9R1JBUEhfTk9ERTtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgY2hpbGRyZW49dGhpcy5fY2hpbGRyZW5bdl07aWYoY2hpbGRyZW4pcmV0dXJuIF8ua2V5cyhjaGlsZHJlbil9ZWxzZSBpZih2PT09R1JBUEhfTk9ERSlyZXR1cm4gdGhpcy5ub2RlcygpO2Vsc2UgaWYodGhpcy5oYXNOb2RlKHYpKXJldHVybltdfTtHcmFwaC5wcm90b3R5cGUucHJlZGVjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkc1Y9dGhpcy5fcHJlZHNbdl07aWYocHJlZHNWKXJldHVybiBfLmtleXMocHJlZHNWKX07CkdyYXBoLnByb3RvdHlwZS5zdWNjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBzdWNzVj10aGlzLl9zdWNzW3ZdO2lmKHN1Y3NWKXJldHVybiBfLmtleXMoc3Vjc1YpfTtHcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkcz10aGlzLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkcylyZXR1cm4gXy51bmlvbihwcmVkcyx0aGlzLnN1Y2Nlc3NvcnModikpfTtHcmFwaC5wcm90b3R5cGUuaXNMZWFmPWZ1bmN0aW9uKHYpe3ZhciBuZWlnaGJvcnM7aWYodGhpcy5pc0RpcmVjdGVkKCkpbmVpZ2hib3JzPXRoaXMuc3VjY2Vzc29ycyh2KTtlbHNlIG5laWdoYm9ycz10aGlzLm5laWdoYm9ycyh2KTtyZXR1cm4gbmVpZ2hib3JzLmxlbmd0aD09PTB9O0dyYXBoLnByb3RvdHlwZS5maWx0ZXJOb2Rlcz1mdW5jdGlvbihmaWx0ZXIpe3ZhciBjb3B5PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtkaXJlY3RlZDp0aGlzLl9pc0RpcmVjdGVkLG11bHRpZ3JhcGg6dGhpcy5faXNNdWx0aWdyYXBoLApjb21wb3VuZDp0aGlzLl9pc0NvbXBvdW5kfSk7Y29weS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKHZhbHVlLHYpe2lmKGZpbHRlcih2KSljb3B5LnNldE5vZGUodix2YWx1ZSl9KTtfLmVhY2godGhpcy5fZWRnZU9ianMsZnVuY3Rpb24oZSl7aWYoY29weS5oYXNOb2RlKGUudikmJmNvcHkuaGFzTm9kZShlLncpKWNvcHkuc2V0RWRnZShlLHNlbGYuZWRnZShlKSl9KTt2YXIgcGFyZW50cz17fTtmdW5jdGlvbiBmaW5kUGFyZW50KHYpe3ZhciBwYXJlbnQ9c2VsZi5wYXJlbnQodik7aWYocGFyZW50PT09dW5kZWZpbmVkfHxjb3B5Lmhhc05vZGUocGFyZW50KSl7cGFyZW50c1t2XT1wYXJlbnQ7cmV0dXJuIHBhcmVudH1lbHNlIGlmKHBhcmVudCBpbiBwYXJlbnRzKXJldHVybiBwYXJlbnRzW3BhcmVudF07ZWxzZSByZXR1cm4gZmluZFBhcmVudChwYXJlbnQpfWlmKHRoaXMuX2lzQ29tcG91bmQpXy5lYWNoKGNvcHkubm9kZXMoKSwKZnVuY3Rpb24odil7Y29weS5zZXRQYXJlbnQodixmaW5kUGFyZW50KHYpKX0pO3JldHVybiBjb3B5fTtHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbD1mdW5jdGlvbihuZXdEZWZhdWx0KXtpZighXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKW5ld0RlZmF1bHQ9Xy5jb25zdGFudChuZXdEZWZhdWx0KTt0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm49bmV3RGVmYXVsdDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2VDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlQ291bnR9O0dyYXBoLnByb3RvdHlwZS5lZGdlcz1mdW5jdGlvbigpe3JldHVybiBfLnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyl9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXRoPWZ1bmN0aW9uKHZzLHZhbHVlKXt2YXIgc2VsZj10aGlzLGFyZ3M9YXJndW1lbnRzO18ucmVkdWNlKHZzLGZ1bmN0aW9uKHYsdyl7aWYoYXJncy5sZW5ndGg+MSlzZWxmLnNldEVkZ2Uodix3LHZhbHVlKTtlbHNlIHNlbGYuc2V0RWRnZSh2LAp3KTtyZXR1cm4gd30pO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0RWRnZT1mdW5jdGlvbigpe3ZhciB2LHcsbmFtZSx2YWx1ZSx2YWx1ZVNwZWNpZmllZD1mYWxzZSxhcmcwPWFyZ3VtZW50c1swXTtpZih0eXBlb2YgYXJnMD09PSJvYmplY3QiJiZhcmcwIT09bnVsbCYmInYiaW4gYXJnMCl7dj1hcmcwLnY7dz1hcmcwLnc7bmFtZT1hcmcwLm5hbWU7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpe3ZhbHVlPWFyZ3VtZW50c1sxXTt2YWx1ZVNwZWNpZmllZD10cnVlfX1lbHNle3Y9YXJnMDt3PWFyZ3VtZW50c1sxXTtuYW1lPWFyZ3VtZW50c1szXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpe3ZhbHVlPWFyZ3VtZW50c1syXTt2YWx1ZVNwZWNpZmllZD10cnVlfX12PSIiK3Y7dz0iIit3O2lmKCFfLmlzVW5kZWZpbmVkKG5hbWUpKW5hbWU9IiIrbmFtZTt2YXIgZT1lZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7aWYoXy5oYXModGhpcy5fZWRnZUxhYmVscywKZSkpe2lmKHZhbHVlU3BlY2lmaWVkKXRoaXMuX2VkZ2VMYWJlbHNbZV09dmFsdWU7cmV0dXJuIHRoaXN9aWYoIV8uaXNVbmRlZmluZWQobmFtZSkmJiF0aGlzLl9pc011bHRpZ3JhcGgpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCBceDNkIGZhbHNlIik7dGhpcy5zZXROb2RlKHYpO3RoaXMuc2V0Tm9kZSh3KTt0aGlzLl9lZGdlTGFiZWxzW2VdPXZhbHVlU3BlY2lmaWVkP3ZhbHVlOnRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih2LHcsbmFtZSk7dmFyIGVkZ2VPYmo9ZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTt2PWVkZ2VPYmoudjt3PWVkZ2VPYmoudztPYmplY3QuZnJlZXplKGVkZ2VPYmopO3RoaXMuX2VkZ2VPYmpzW2VdPWVkZ2VPYmo7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fcHJlZHNbd10sdik7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fc3Vjc1t2XSx3KTt0aGlzLl9pblt3XVtlXT0KZWRnZU9iajt0aGlzLl9vdXRbdl1bZV09ZWRnZU9iajt0aGlzLl9lZGdlQ291bnQrKztyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xP2VkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7cmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbZV19O0dyYXBoLnByb3RvdHlwZS5oYXNFZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT9lZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3JldHVybiBfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLGUpfTtHcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/CmVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSksZWRnZT10aGlzLl9lZGdlT2Jqc1tlXTtpZihlZGdlKXt2PWVkZ2Uudjt3PWVkZ2UudztkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tlXTtkZWxldGUgdGhpcy5fZWRnZU9ianNbZV07ZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9wcmVkc1t3XSx2KTtkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sdyk7ZGVsZXRlIHRoaXMuX2luW3ddW2VdO2RlbGV0ZSB0aGlzLl9vdXRbdl1bZV07dGhpcy5fZWRnZUNvdW50LS19cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5pbkVkZ2VzPWZ1bmN0aW9uKHYsdSl7dmFyIGluVj10aGlzLl9pblt2XTtpZihpblYpe3ZhciBlZGdlcz1fLnZhbHVlcyhpblYpO2lmKCF1KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudj09PQp1fSl9fTtHcmFwaC5wcm90b3R5cGUub3V0RWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgb3V0Vj10aGlzLl9vdXRbdl07aWYob3V0Vil7dmFyIGVkZ2VzPV8udmFsdWVzKG91dFYpO2lmKCF3KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudz09PXd9KX19O0dyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgaW5FZGdlcz10aGlzLmluRWRnZXModix3KTtpZihpbkVkZ2VzKXJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsdykpfTtmdW5jdGlvbiBpbmNyZW1lbnRPckluaXRFbnRyeShtYXAsayl7aWYobWFwW2tdKW1hcFtrXSsrO2Vsc2UgbWFwW2tdPTF9ZnVuY3Rpb24gZGVjcmVtZW50T3JSZW1vdmVFbnRyeShtYXAsayl7aWYoIS0tbWFwW2tdKWRlbGV0ZSBtYXBba119ZnVuY3Rpb24gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9CiIiK3dfO2lmKCFpc0RpcmVjdGVkJiZ2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9cmV0dXJuIHYrRURHRV9LRVlfREVMSU0rdytFREdFX0tFWV9ERUxJTSsoXy5pc1VuZGVmaW5lZChuYW1lKT9ERUZBVUxUX0VER0VfTkFNRTpuYW1lKX1mdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9IiIrd187aWYoIWlzRGlyZWN0ZWQmJnY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgZWRnZU9iaj17djp2LHc6d307aWYobmFtZSllZGdlT2JqLm5hbWU9bmFtZTtyZXR1cm4gZWRnZU9ian1mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLGVkZ2VPYmope3JldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCxlZGdlT2JqLnYsZWRnZU9iai53LGVkZ2VPYmoubmFtZSl9fSx7Ii4vbG9kYXNoIjoxOX1dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17R3JhcGg6cmVxdWlyZSgiLi9ncmFwaCIpLAp2ZXJzaW9uOnJlcXVpcmUoIi4vdmVyc2lvbiIpfX0seyIuL2dyYXBoIjoxNiwiLi92ZXJzaW9uIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGgiKTttb2R1bGUuZXhwb3J0cz17d3JpdGU6d3JpdGUscmVhZDpyZWFkfTtmdW5jdGlvbiB3cml0ZShnKXt2YXIganNvbj17b3B0aW9uczp7ZGlyZWN0ZWQ6Zy5pc0RpcmVjdGVkKCksbXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpLGNvbXBvdW5kOmcuaXNDb21wb3VuZCgpfSxub2Rlczp3cml0ZU5vZGVzKGcpLGVkZ2VzOndyaXRlRWRnZXMoZyl9O2lmKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpanNvbi52YWx1ZT1fLmNsb25lKGcuZ3JhcGgoKSk7cmV0dXJuIGpzb259ZnVuY3Rpb24gd3JpdGVOb2RlcyhnKXtyZXR1cm4gXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlVmFsdWU9Zy5ub2RlKHYpLHBhcmVudD0KZy5wYXJlbnQodiksbm9kZT17djp2fTtpZighXy5pc1VuZGVmaW5lZChub2RlVmFsdWUpKW5vZGUudmFsdWU9bm9kZVZhbHVlO2lmKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpbm9kZS5wYXJlbnQ9cGFyZW50O3JldHVybiBub2RlfSl9ZnVuY3Rpb24gd3JpdGVFZGdlcyhnKXtyZXR1cm4gXy5tYXAoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVmFsdWU9Zy5lZGdlKGUpLGVkZ2U9e3Y6ZS52LHc6ZS53fTtpZighXy5pc1VuZGVmaW5lZChlLm5hbWUpKWVkZ2UubmFtZT1lLm5hbWU7aWYoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSllZGdlLnZhbHVlPWVkZ2VWYWx1ZTtyZXR1cm4gZWRnZX0pfWZ1bmN0aW9uIHJlYWQoanNvbil7dmFyIGc9KG5ldyBHcmFwaChqc29uLm9wdGlvbnMpKS5zZXRHcmFwaChqc29uLnZhbHVlKTtfLmVhY2goanNvbi5ub2RlcyxmdW5jdGlvbihlbnRyeSl7Zy5zZXROb2RlKGVudHJ5LnYsZW50cnkudmFsdWUpO2lmKGVudHJ5LnBhcmVudClnLnNldFBhcmVudChlbnRyeS52LAplbnRyeS5wYXJlbnQpfSk7Xy5lYWNoKGpzb24uZWRnZXMsZnVuY3Rpb24oZW50cnkpe2cuc2V0RWRnZSh7djplbnRyeS52LHc6ZW50cnkudyxuYW1lOmVudHJ5Lm5hbWV9LGVudHJ5LnZhbHVlKX0pO3JldHVybiBnfX0seyIuL2dyYXBoIjoxNiwiLi9sb2Rhc2giOjE5fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPXdpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMi4xLjUifSx7fV19LHt9LFsxXSkoMSl9KTs8L3NjcmlwdD48c2NyaXB0PihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5kYWdyZT1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPQpuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Z3JhcGhsaWI6cmVxdWlyZSgiLi9saWIvZ3JhcGhsaWIiKSxsYXlvdXQ6cmVxdWlyZSgiLi9saWIvbGF5b3V0IiksZGVidWc6cmVxdWlyZSgiLi9saWIvZGVidWciKSx1dGlsOnt0aW1lOnJlcXVpcmUoIi4vbGliL3V0aWwiKS50aW1lLG5vdGltZTpyZXF1aXJlKCIuL2xpYi91dGlsIikubm90aW1lfSwKdmVyc2lvbjpyZXF1aXJlKCIuL2xpYi92ZXJzaW9uIil9fSx7Ii4vbGliL2RlYnVnIjo2LCIuL2xpYi9ncmFwaGxpYiI6NywiLi9saWIvbGF5b3V0Ijo5LCIuL2xpYi91dGlsIjoyOSwiLi9saWIvdmVyc2lvbiI6MzB9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLGdyZWVkeUZBUz1yZXF1aXJlKCIuL2dyZWVkeS1mYXMiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXt2YXIgZmFzPWcuZ3JhcGgoKS5hY3ljbGljZXI9PT0iZ3JlZWR5Ij9ncmVlZHlGQVMoZyx3ZWlnaHRGbihnKSk6ZGZzRkFTKGcpO18uZm9yRWFjaChmYXMsZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtnLnJlbW92ZUVkZ2UoZSk7bGFiZWwuZm9yd2FyZE5hbWU9ZS5uYW1lO2xhYmVsLnJldmVyc2VkPXRydWU7Zy5zZXRFZGdlKGUudyxlLnYsbGFiZWwsXy51bmlxdWVJZCgicmV2IikpfSk7ZnVuY3Rpb24gd2VpZ2h0Rm4oZyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBnLmVkZ2UoZSkud2VpZ2h0fX0KfWZ1bmN0aW9uIGRmc0ZBUyhnKXt2YXIgZmFzPVtdLHN0YWNrPXt9LHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTtzdGFja1t2XT10cnVlO18uZm9yRWFjaChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe2lmKF8uaGFzKHN0YWNrLGUudykpZmFzLnB1c2goZSk7ZWxzZSBkZnMoZS53KX0pO2RlbGV0ZSBzdGFja1t2XX1fLmZvckVhY2goZy5ub2RlcygpLGRmcyk7cmV0dXJuIGZhc31mdW5jdGlvbiB1bmRvKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtpZihsYWJlbC5yZXZlcnNlZCl7Zy5yZW1vdmVFZGdlKGUpO3ZhciBmb3J3YXJkTmFtZT1sYWJlbC5mb3J3YXJkTmFtZTtkZWxldGUgbGFiZWwucmV2ZXJzZWQ7ZGVsZXRlIGxhYmVsLmZvcndhcmROYW1lO2cuc2V0RWRnZShlLncsZS52LGxhYmVsLGZvcndhcmROYW1lKX19KX19LHsiLi9ncmVlZHktZmFzIjo4LAoiLi9sb2Rhc2giOjEwfV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPWFkZEJvcmRlclNlZ21lbnRzO2Z1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpe2Z1bmN0aW9uIGRmcyh2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KSxub2RlPWcubm9kZSh2KTtpZihjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGRmcyk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXtub2RlLmJvcmRlckxlZnQ9W107bm9kZS5ib3JkZXJSaWdodD1bXTtmb3IodmFyIHJhbms9bm9kZS5taW5SYW5rLG1heFJhbms9bm9kZS5tYXhSYW5rKzE7cmFuazxtYXhSYW5rOysrcmFuayl7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJMZWZ0IiwiX2JsIix2LG5vZGUscmFuayk7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJSaWdodCIsIl9iciIsdixub2RlLHJhbmspfX19Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwKZGZzKX1mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcscHJvcCxwcmVmaXgsc2csc2dOb2RlLHJhbmspe3ZhciBsYWJlbD17d2lkdGg6MCxoZWlnaHQ6MCxyYW5rOnJhbmssYm9yZGVyVHlwZTpwcm9wfSxwcmV2PXNnTm9kZVtwcm9wXVtyYW5rLTFdLGN1cnI9dXRpbC5hZGREdW1teU5vZGUoZywiYm9yZGVyIixsYWJlbCxwcmVmaXgpO3NnTm9kZVtwcm9wXVtyYW5rXT1jdXJyO2cuc2V0UGFyZW50KGN1cnIsc2cpO2lmKHByZXYpZy5zZXRFZGdlKHByZXYsY3Vycix7d2VpZ2h0OjF9KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz17YWRqdXN0OmFkanVzdCx1bmRvOnVuZG99O2Z1bmN0aW9uIGFkanVzdChnKXt2YXIgcmFua0Rpcj1nLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO2lmKHJhbmtEaXI9PT0ibHIifHxyYW5rRGlyPT09InJsIilzd2FwV2lkdGhIZWlnaHQoZyl9CmZ1bmN0aW9uIHVuZG8oZyl7dmFyIHJhbmtEaXI9Zy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtpZihyYW5rRGlyPT09ImJ0Inx8cmFua0Rpcj09PSJybCIpcmV2ZXJzZVkoZyk7aWYocmFua0Rpcj09PSJsciJ8fHJhbmtEaXI9PT0icmwiKXtzd2FwWFkoZyk7c3dhcFdpZHRoSGVpZ2h0KGcpfX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwV2lkdGhIZWlnaHRPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c3dhcFdpZHRoSGVpZ2h0T25lKGcuZWRnZShlKSl9KX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHRPbmUoYXR0cnMpe3ZhciB3PWF0dHJzLndpZHRoO2F0dHJzLndpZHRoPWF0dHJzLmhlaWdodDthdHRycy5oZWlnaHQ9d31mdW5jdGlvbiByZXZlcnNlWShnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldmVyc2VZT25lKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLHJldmVyc2VZT25lKTtpZihfLmhhcyhlZGdlLCJ5IikpcmV2ZXJzZVlPbmUoZWRnZSl9KX1mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycyl7YXR0cnMueT0tYXR0cnMueX1mdW5jdGlvbiBzd2FwWFkoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwWFlPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxzd2FwWFlPbmUpO2lmKF8uaGFzKGVkZ2UsIngiKSlzd2FwWFlPbmUoZWRnZSl9KX1mdW5jdGlvbiBzd2FwWFlPbmUoYXR0cnMpe3ZhciB4PWF0dHJzLng7YXR0cnMueD1hdHRycy55O2F0dHJzLnk9eH19LHsiLi9sb2Rhc2giOjEwfV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9TGlzdDtmdW5jdGlvbiBMaXN0KCl7dmFyIHNlbnRpbmVsPQp7fTtzZW50aW5lbC5fbmV4dD1zZW50aW5lbC5fcHJldj1zZW50aW5lbDt0aGlzLl9zZW50aW5lbD1zZW50aW5lbH1MaXN0LnByb3RvdHlwZS5kZXF1ZXVlPWZ1bmN0aW9uKCl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGVudHJ5PXNlbnRpbmVsLl9wcmV2O2lmKGVudHJ5IT09c2VudGluZWwpe3VubGluayhlbnRyeSk7cmV0dXJuIGVudHJ5fX07TGlzdC5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbihlbnRyeSl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsO2lmKGVudHJ5Ll9wcmV2JiZlbnRyeS5fbmV4dCl1bmxpbmsoZW50cnkpO2VudHJ5Ll9uZXh0PXNlbnRpbmVsLl9uZXh0O3NlbnRpbmVsLl9uZXh0Ll9wcmV2PWVudHJ5O3NlbnRpbmVsLl9uZXh0PWVudHJ5O2VudHJ5Ll9wcmV2PXNlbnRpbmVsfTtMaXN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBzdHJzPVtdLHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGN1cnI9c2VudGluZWwuX3ByZXY7d2hpbGUoY3VyciE9PQpzZW50aW5lbCl7c3Rycy5wdXNoKEpTT04uc3RyaW5naWZ5KGN1cnIsZmlsdGVyT3V0TGlua3MpKTtjdXJyPWN1cnIuX3ByZXZ9cmV0dXJuIlsiK3N0cnMuam9pbigiLCAiKSsiXSJ9O2Z1bmN0aW9uIHVubGluayhlbnRyeSl7ZW50cnkuX3ByZXYuX25leHQ9ZW50cnkuX25leHQ7ZW50cnkuX25leHQuX3ByZXY9ZW50cnkuX3ByZXY7ZGVsZXRlIGVudHJ5Ll9uZXh0O2RlbGV0ZSBlbnRyeS5fcHJldn1mdW5jdGlvbiBmaWx0ZXJPdXRMaW5rcyhrLHYpe2lmKGshPT0iX25leHQiJiZrIT09Il9wcmV2IilyZXR1cm4gdn19LHt9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPXtkZWJ1Z09yZGVyaW5nOmRlYnVnT3JkZXJpbmd9O2Z1bmN0aW9uIGRlYnVnT3JkZXJpbmcoZyl7dmFyIGxheWVyTWF0cml4PQp1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7dmFyIGg9KG5ldyBHcmFwaCh7Y29tcG91bmQ6dHJ1ZSxtdWx0aWdyYXBoOnRydWV9KSkuc2V0R3JhcGgoe30pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aC5zZXROb2RlKHYse2xhYmVsOnZ9KTtoLnNldFBhcmVudCh2LCJsYXllciIrZy5ub2RlKHYpLnJhbmspfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtoLnNldEVkZ2UoZS52LGUudyx7fSxlLm5hbWUpfSk7Xy5mb3JFYWNoKGxheWVyTWF0cml4LGZ1bmN0aW9uKGxheWVyLGkpe3ZhciBsYXllclY9ImxheWVyIitpO2guc2V0Tm9kZShsYXllclYse3Jhbms6InNhbWUifSk7Xy5yZWR1Y2UobGF5ZXIsZnVuY3Rpb24odSx2KXtoLnNldEVkZ2UodSx2LHtzdHlsZToiaW52aXMifSk7cmV0dXJuIHZ9KX0pO3JldHVybiBofX0seyIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZ3JhcGhsaWI7CmlmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7Z3JhcGhsaWI9cmVxdWlyZSgiZ3JhcGhsaWIiKX1jYXRjaChlKXt9aWYoIWdyYXBobGliKWdyYXBobGliPXdpbmRvdy5ncmFwaGxpYjttb2R1bGUuZXhwb3J0cz1ncmFwaGxpYn0seyJncmFwaGxpYiI6dW5kZWZpbmVkfV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGgsTGlzdD1yZXF1aXJlKCIuL2RhdGEvbGlzdCIpO21vZHVsZS5leHBvcnRzPWdyZWVkeUZBUzt2YXIgREVGQVVMVF9XRUlHSFRfRk49Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBncmVlZHlGQVMoZyx3ZWlnaHRGbil7aWYoZy5ub2RlQ291bnQoKTw9MSlyZXR1cm5bXTt2YXIgc3RhdGU9YnVpbGRTdGF0ZShnLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GTik7dmFyIHJlc3VsdHM9ZG9HcmVlZHlGQVMoc3RhdGUuZ3JhcGgsc3RhdGUuYnVja2V0cywKc3RhdGUuemVyb0lkeCk7cmV0dXJuIF8uZmxhdHRlbihfLm1hcChyZXN1bHRzLGZ1bmN0aW9uKGUpe3JldHVybiBnLm91dEVkZ2VzKGUudixlLncpfSksdHJ1ZSl9ZnVuY3Rpb24gZG9HcmVlZHlGQVMoZyxidWNrZXRzLHplcm9JZHgpe3ZhciByZXN1bHRzPVtdLHNvdXJjZXM9YnVja2V0c1tidWNrZXRzLmxlbmd0aC0xXSxzaW5rcz1idWNrZXRzWzBdO3ZhciBlbnRyeTt3aGlsZShnLm5vZGVDb3VudCgpKXt3aGlsZShlbnRyeT1zaW5rcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7d2hpbGUoZW50cnk9c291cmNlcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7aWYoZy5ub2RlQ291bnQoKSlmb3IodmFyIGk9YnVja2V0cy5sZW5ndGgtMjtpPjA7LS1pKXtlbnRyeT1idWNrZXRzW2ldLmRlcXVldWUoKTtpZihlbnRyeSl7cmVzdWx0cz1yZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LAplbnRyeSx0cnVlKSk7YnJlYWt9fX1yZXR1cm4gcmVzdWx0c31mdW5jdGlvbiByZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5LGNvbGxlY3RQcmVkZWNlc3NvcnMpe3ZhciByZXN1bHRzPWNvbGxlY3RQcmVkZWNlc3NvcnM/W106dW5kZWZpbmVkO18uZm9yRWFjaChnLmluRWRnZXMoZW50cnkudiksZnVuY3Rpb24oZWRnZSl7dmFyIHdlaWdodD1nLmVkZ2UoZWRnZSksdUVudHJ5PWcubm9kZShlZGdlLnYpO2lmKGNvbGxlY3RQcmVkZWNlc3NvcnMpcmVzdWx0cy5wdXNoKHt2OmVkZ2Uudix3OmVkZ2Uud30pO3VFbnRyeS5vdXQtPXdlaWdodDthc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LHVFbnRyeSl9KTtfLmZvckVhY2goZy5vdXRFZGdlcyhlbnRyeS52KSxmdW5jdGlvbihlZGdlKXt2YXIgd2VpZ2h0PWcuZWRnZShlZGdlKSx3PWVkZ2Uudyx3RW50cnk9Zy5ub2RlKHcpO3dFbnRyeVsiaW4iXS09d2VpZ2h0O2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsd0VudHJ5KX0pOwpnLnJlbW92ZU5vZGUoZW50cnkudik7cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gYnVpbGRTdGF0ZShnLHdlaWdodEZuKXt2YXIgZmFzR3JhcGg9bmV3IEdyYXBoLG1heEluPTAsbWF4T3V0PTA7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtmYXNHcmFwaC5zZXROb2RlKHYse3Y6diwiaW4iOjAsb3V0OjB9KX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIHByZXZXZWlnaHQ9ZmFzR3JhcGguZWRnZShlLnYsZS53KXx8MCx3ZWlnaHQ9d2VpZ2h0Rm4oZSksZWRnZVdlaWdodD1wcmV2V2VpZ2h0K3dlaWdodDtmYXNHcmFwaC5zZXRFZGdlKGUudixlLncsZWRnZVdlaWdodCk7bWF4T3V0PU1hdGgubWF4KG1heE91dCxmYXNHcmFwaC5ub2RlKGUudikub3V0Kz13ZWlnaHQpO21heEluPU1hdGgubWF4KG1heEluLGZhc0dyYXBoLm5vZGUoZS53KVsiaW4iXSs9d2VpZ2h0KX0pO3ZhciBidWNrZXRzPV8ucmFuZ2UobWF4T3V0K21heEluKzMpLm1hcChmdW5jdGlvbigpe3JldHVybiBuZXcgTGlzdH0pOwp2YXIgemVyb0lkeD1tYXhJbisxO18uZm9yRWFjaChmYXNHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsZmFzR3JhcGgubm9kZSh2KSl9KTtyZXR1cm57Z3JhcGg6ZmFzR3JhcGgsYnVja2V0czpidWNrZXRzLHplcm9JZHg6emVyb0lkeH19ZnVuY3Rpb24gYXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCxlbnRyeSl7aWYoIWVudHJ5Lm91dClidWNrZXRzWzBdLmVucXVldWUoZW50cnkpO2Vsc2UgaWYoIWVudHJ5WyJpbiJdKWJ1Y2tldHNbYnVja2V0cy5sZW5ndGgtMV0uZW5xdWV1ZShlbnRyeSk7ZWxzZSBidWNrZXRzW2VudHJ5Lm91dC1lbnRyeVsiaW4iXSt6ZXJvSWR4XS5lbnF1ZXVlKGVudHJ5KX19LHsiLi9kYXRhL2xpc3QiOjUsIi4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksYWN5Y2xpYz1yZXF1aXJlKCIuL2FjeWNsaWMiKSwKbm9ybWFsaXplPXJlcXVpcmUoIi4vbm9ybWFsaXplIikscmFuaz1yZXF1aXJlKCIuL3JhbmsiKSxub3JtYWxpemVSYW5rcz1yZXF1aXJlKCIuL3V0aWwiKS5ub3JtYWxpemVSYW5rcyxwYXJlbnREdW1teUNoYWlucz1yZXF1aXJlKCIuL3BhcmVudC1kdW1teS1jaGFpbnMiKSxyZW1vdmVFbXB0eVJhbmtzPXJlcXVpcmUoIi4vdXRpbCIpLnJlbW92ZUVtcHR5UmFua3MsbmVzdGluZ0dyYXBoPXJlcXVpcmUoIi4vbmVzdGluZy1ncmFwaCIpLGFkZEJvcmRlclNlZ21lbnRzPXJlcXVpcmUoIi4vYWRkLWJvcmRlci1zZWdtZW50cyIpLGNvb3JkaW5hdGVTeXN0ZW09cmVxdWlyZSgiLi9jb29yZGluYXRlLXN5c3RlbSIpLG9yZGVyPXJlcXVpcmUoIi4vb3JkZXIiKSxwb3NpdGlvbj1yZXF1aXJlKCIuL3Bvc2l0aW9uIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9bGF5b3V0O2Z1bmN0aW9uIGxheW91dChnLG9wdHMpe3ZhciB0aW1lPQpvcHRzJiZvcHRzLmRlYnVnVGltaW5nP3V0aWwudGltZTp1dGlsLm5vdGltZTt0aW1lKCJsYXlvdXQiLGZ1bmN0aW9uKCl7dmFyIGxheW91dEdyYXBoPXRpbWUoIiAgYnVpbGRMYXlvdXRHcmFwaCIsZnVuY3Rpb24oKXtyZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKX0pO3RpbWUoIiAgcnVuTGF5b3V0IixmdW5jdGlvbigpe3J1bkxheW91dChsYXlvdXRHcmFwaCx0aW1lKX0pO3RpbWUoIiAgdXBkYXRlSW5wdXRHcmFwaCIsZnVuY3Rpb24oKXt1cGRhdGVJbnB1dEdyYXBoKGcsbGF5b3V0R3JhcGgpfSl9KX1mdW5jdGlvbiBydW5MYXlvdXQoZyx0aW1lKXt0aW1lKCIgICAgbWFrZVNwYWNlRm9yRWRnZUxhYmVscyIsZnVuY3Rpb24oKXttYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpfSk7dGltZSgiICAgIHJlbW92ZVNlbGZFZGdlcyIsZnVuY3Rpb24oKXtyZW1vdmVTZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgYWN5Y2xpYyIsZnVuY3Rpb24oKXthY3ljbGljLnJ1bihnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGgucnVuIiwKZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGgucnVuKGcpfSk7dGltZSgiICAgIHJhbmsiLGZ1bmN0aW9uKCl7cmFuayh1dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKSl9KTt0aW1lKCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIHJlbW92ZUVtcHR5UmFua3MiLGZ1bmN0aW9uKCl7cmVtb3ZlRW1wdHlSYW5rcyhnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGguY2xlYW51cCIsZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGguY2xlYW51cChnKX0pO3RpbWUoIiAgICBub3JtYWxpemVSYW5rcyIsZnVuY3Rpb24oKXtub3JtYWxpemVSYW5rcyhnKX0pO3RpbWUoIiAgICBhc3NpZ25SYW5rTWluTWF4IixmdW5jdGlvbigpe2Fzc2lnblJhbmtNaW5NYXgoZyl9KTt0aW1lKCIgICAgcmVtb3ZlRWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtyZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS5ydW4iLApmdW5jdGlvbigpe25vcm1hbGl6ZS5ydW4oZyl9KTt0aW1lKCIgICAgcGFyZW50RHVtbXlDaGFpbnMiLGZ1bmN0aW9uKCl7cGFyZW50RHVtbXlDaGFpbnMoZyl9KTt0aW1lKCIgICAgYWRkQm9yZGVyU2VnbWVudHMiLGZ1bmN0aW9uKCl7YWRkQm9yZGVyU2VnbWVudHMoZyl9KTt0aW1lKCIgICAgb3JkZXIiLGZ1bmN0aW9uKCl7b3JkZXIoZyl9KTt0aW1lKCIgICAgaW5zZXJ0U2VsZkVkZ2VzIixmdW5jdGlvbigpe2luc2VydFNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICBhZGp1c3RDb29yZGluYXRlU3lzdGVtIixmdW5jdGlvbigpe2Nvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpfSk7dGltZSgiICAgIHBvc2l0aW9uIixmdW5jdGlvbigpe3Bvc2l0aW9uKGcpfSk7dGltZSgiICAgIHBvc2l0aW9uU2VsZkVkZ2VzIixmdW5jdGlvbigpe3Bvc2l0aW9uU2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIHJlbW92ZUJvcmRlck5vZGVzIixmdW5jdGlvbigpe3JlbW92ZUJvcmRlck5vZGVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS51bmRvIiwKZnVuY3Rpb24oKXtub3JtYWxpemUudW5kbyhnKX0pO3RpbWUoIiAgICBmaXh1cEVkZ2VMYWJlbENvb3JkcyIsZnVuY3Rpb24oKXtmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKX0pO3RpbWUoIiAgICB1bmRvQ29vcmRpbmF0ZVN5c3RlbSIsZnVuY3Rpb24oKXtjb29yZGluYXRlU3lzdGVtLnVuZG8oZyl9KTt0aW1lKCIgICAgdHJhbnNsYXRlR3JhcGgiLGZ1bmN0aW9uKCl7dHJhbnNsYXRlR3JhcGgoZyl9KTt0aW1lKCIgICAgYXNzaWduTm9kZUludGVyc2VjdHMiLGZ1bmN0aW9uKCl7YXNzaWduTm9kZUludGVyc2VjdHMoZyl9KTt0aW1lKCIgICAgcmV2ZXJzZVBvaW50cyIsZnVuY3Rpb24oKXtyZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKX0pO3RpbWUoIiAgICBhY3ljbGljLnVuZG8iLGZ1bmN0aW9uKCl7YWN5Y2xpYy51bmRvKGcpfSl9ZnVuY3Rpb24gdXBkYXRlSW5wdXRHcmFwaChpbnB1dEdyYXBoLGxheW91dEdyYXBoKXtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBpbnB1dExhYmVsPQppbnB1dEdyYXBoLm5vZGUodiksbGF5b3V0TGFiZWw9bGF5b3V0R3JhcGgubm9kZSh2KTtpZihpbnB1dExhYmVsKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueTtpZihsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpe2lucHV0TGFiZWwud2lkdGg9bGF5b3V0TGFiZWwud2lkdGg7aW5wdXRMYWJlbC5oZWlnaHQ9bGF5b3V0TGFiZWwuaGVpZ2h0fX19KTtfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBpbnB1dExhYmVsPWlucHV0R3JhcGguZWRnZShlKSxsYXlvdXRMYWJlbD1sYXlvdXRHcmFwaC5lZGdlKGUpO2lucHV0TGFiZWwucG9pbnRzPWxheW91dExhYmVsLnBvaW50cztpZihfLmhhcyhsYXlvdXRMYWJlbCwieCIpKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueX19KTtpbnB1dEdyYXBoLmdyYXBoKCkud2lkdGg9bGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDsKaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodD1sYXlvdXRHcmFwaC5ncmFwaCgpLmhlaWdodH12YXIgZ3JhcGhOdW1BdHRycz1bIm5vZGVzZXAiLCJlZGdlc2VwIiwicmFua3NlcCIsIm1hcmdpbngiLCJtYXJnaW55Il0sZ3JhcGhEZWZhdWx0cz17cmFua3NlcDo1MCxlZGdlc2VwOjIwLG5vZGVzZXA6NTAscmFua2RpcjoidGIifSxncmFwaEF0dHJzPVsiYWN5Y2xpY2VyIiwicmFua2VyIiwicmFua2RpciIsImFsaWduIl0sbm9kZU51bUF0dHJzPVsid2lkdGgiLCJoZWlnaHQiXSxub2RlRGVmYXVsdHM9e3dpZHRoOjAsaGVpZ2h0OjB9LGVkZ2VOdW1BdHRycz1bIm1pbmxlbiIsIndlaWdodCIsIndpZHRoIiwiaGVpZ2h0IiwibGFiZWxvZmZzZXQiXSxlZGdlRGVmYXVsdHM9e21pbmxlbjoxLHdlaWdodDoxLHdpZHRoOjAsaGVpZ2h0OjAsbGFiZWxvZmZzZXQ6MTAsbGFiZWxwb3M6InIifSxlZGdlQXR0cnM9WyJsYWJlbHBvcyJdO2Z1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCl7dmFyIGc9Cm5ldyBHcmFwaCh7bXVsdGlncmFwaDp0cnVlLGNvbXBvdW5kOnRydWV9KSxncmFwaD1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtnLnNldEdyYXBoKF8ubWVyZ2Uoe30sZ3JhcGhEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhncmFwaCxncmFwaE51bUF0dHJzKSxfLnBpY2soZ3JhcGgsZ3JhcGhBdHRycykpKTtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO2cuc2V0Tm9kZSh2LF8uZGVmYXVsdHMoc2VsZWN0TnVtYmVyQXR0cnMobm9kZSxub2RlTnVtQXR0cnMpLG5vZGVEZWZhdWx0cykpO2cuc2V0UGFyZW50KHYsaW5wdXRHcmFwaC5wYXJlbnQodikpfSk7Xy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5lZGdlKGUpKTtnLnNldEVkZ2UoZSxfLm1lcmdlKHt9LGVkZ2VEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhlZGdlLAplZGdlTnVtQXR0cnMpLF8ucGljayhlZGdlLGVkZ2VBdHRycykpKX0pO3JldHVybiBnfWZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyl7dmFyIGdyYXBoPWcuZ3JhcGgoKTtncmFwaC5yYW5rc2VwLz0yO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2VkZ2UubWlubGVuKj0yO2lmKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSE9PSJjIilpZihncmFwaC5yYW5rZGlyPT09IlRCInx8Z3JhcGgucmFua2Rpcj09PSJCVCIpZWRnZS53aWR0aCs9ZWRnZS5sYWJlbG9mZnNldDtlbHNlIGVkZ2UuaGVpZ2h0Kz1lZGdlLmxhYmVsb2Zmc2V0fSl9ZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLndpZHRoJiZlZGdlLmhlaWdodCl7dmFyIHY9Zy5ub2RlKGUudiksdz1nLm5vZGUoZS53KSxsYWJlbD17cmFuazoody5yYW5rLQp2LnJhbmspLzIrdi5yYW5rLGU6ZX07dXRpbC5hZGREdW1teU5vZGUoZywiZWRnZS1wcm94eSIsbGFiZWwsIl9lcCIpfX0pfWZ1bmN0aW9uIGFzc2lnblJhbmtNaW5NYXgoZyl7dmFyIG1heFJhbms9MDtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmJvcmRlclRvcCl7bm9kZS5taW5SYW5rPWcubm9kZShub2RlLmJvcmRlclRvcCkucmFuaztub2RlLm1heFJhbms9Zy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKS5yYW5rO21heFJhbms9Xy5tYXgobWF4UmFuayxub2RlLm1heFJhbmspfX0pO2cuZ3JhcGgoKS5tYXhSYW5rPW1heFJhbmt9ZnVuY3Rpb24gcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmR1bW15PT09ImVkZ2UtcHJveHkiKXtnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbms9bm9kZS5yYW5rO2cucmVtb3ZlTm9kZSh2KX19KX0KZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZyl7dmFyIG1pblg9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heFg9MCxtaW5ZPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtYXhZPTAsZ3JhcGhMYWJlbD1nLmdyYXBoKCksbWFyZ2luWD1ncmFwaExhYmVsLm1hcmdpbnh8fDAsbWFyZ2luWT1ncmFwaExhYmVsLm1hcmdpbnl8fDA7ZnVuY3Rpb24gZ2V0RXh0cmVtZXMoYXR0cnMpe3ZhciB4PWF0dHJzLngseT1hdHRycy55LHc9YXR0cnMud2lkdGgsaD1hdHRycy5oZWlnaHQ7bWluWD1NYXRoLm1pbihtaW5YLHgtdy8yKTttYXhYPU1hdGgubWF4KG1heFgseCt3LzIpO21pblk9TWF0aC5taW4obWluWSx5LWgvMik7bWF4WT1NYXRoLm1heChtYXhZLHkraC8yKX1fLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2dldEV4dHJlbWVzKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihfLmhhcyhlZGdlLCJ4IikpZ2V0RXh0cmVtZXMoZWRnZSl9KTsKbWluWC09bWFyZ2luWDttaW5ZLT1tYXJnaW5ZO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO25vZGUueC09bWluWDtub2RlLnktPW1pbll9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMsZnVuY3Rpb24ocCl7cC54LT1taW5YO3AueS09bWluWX0pO2lmKF8uaGFzKGVkZ2UsIngiKSllZGdlLngtPW1pblg7aWYoXy5oYXMoZWRnZSwieSIpKWVkZ2UueS09bWluWX0pO2dyYXBoTGFiZWwud2lkdGg9bWF4WC1taW5YK21hcmdpblg7Z3JhcGhMYWJlbC5oZWlnaHQ9bWF4WS1taW5ZK21hcmdpbll9ZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSksbm9kZVY9Zy5ub2RlKGUudiksbm9kZVc9Zy5ub2RlKGUudykscDEscDI7aWYoIWVkZ2UucG9pbnRzKXtlZGdlLnBvaW50cz0KW107cDE9bm9kZVc7cDI9bm9kZVZ9ZWxzZXtwMT1lZGdlLnBvaW50c1swXTtwMj1lZGdlLnBvaW50c1tlZGdlLnBvaW50cy5sZW5ndGgtMV19ZWRnZS5wb2ludHMudW5zaGlmdCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVYscDEpKTtlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVyxwMikpfSl9ZnVuY3Rpb24gZml4dXBFZGdlTGFiZWxDb29yZHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoXy5oYXMoZWRnZSwieCIpKXtpZihlZGdlLmxhYmVscG9zPT09ImwifHxlZGdlLmxhYmVscG9zPT09InIiKWVkZ2Uud2lkdGgtPWVkZ2UubGFiZWxvZmZzZXQ7c3dpdGNoKGVkZ2UubGFiZWxwb3Mpe2Nhc2UgImwiOmVkZ2UueC09ZWRnZS53aWR0aC8yK2VkZ2UubGFiZWxvZmZzZXQ7YnJlYWs7Y2FzZSAiciI6ZWRnZS54Kz1lZGdlLndpZHRoLzIrZWRnZS5sYWJlbG9mZnNldDticmVha319fSl9ZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2UucmV2ZXJzZWQpZWRnZS5wb2ludHMucmV2ZXJzZSgpfSl9ZnVuY3Rpb24gcmVtb3ZlQm9yZGVyTm9kZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLmNoaWxkcmVuKHYpLmxlbmd0aCl7dmFyIG5vZGU9Zy5ub2RlKHYpLHQ9Zy5ub2RlKG5vZGUuYm9yZGVyVG9wKSxiPWcubm9kZShub2RlLmJvcmRlckJvdHRvbSksbD1nLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpLHI9Zy5ub2RlKF8ubGFzdChub2RlLmJvcmRlclJpZ2h0KSk7bm9kZS53aWR0aD1NYXRoLmFicyhyLngtbC54KTtub2RlLmhlaWdodD1NYXRoLmFicyhiLnktdC55KTtub2RlLng9bC54K25vZGUud2lkdGgvMjtub2RlLnk9dC55K25vZGUuaGVpZ2h0LzJ9fSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLm5vZGUodikuZHVtbXk9PT0iYm9yZGVyIilnLnJlbW92ZU5vZGUodil9KX1mdW5jdGlvbiByZW1vdmVTZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7aWYoZS52PT09ZS53KXt2YXIgbm9kZT1nLm5vZGUoZS52KTtpZighbm9kZS5zZWxmRWRnZXMpbm9kZS5zZWxmRWRnZXM9W107bm9kZS5zZWxmRWRnZXMucHVzaCh7ZTplLGxhYmVsOmcuZWRnZShlKX0pO2cucmVtb3ZlRWRnZShlKX19KX1mdW5jdGlvbiBpbnNlcnRTZWxmRWRnZXMoZyl7dmFyIGxheWVycz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7Xy5mb3JFYWNoKGxheWVycyxmdW5jdGlvbihsYXllcil7dmFyIG9yZGVyU2hpZnQ9MDtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXt2YXIgbm9kZT1nLm5vZGUodik7bm9kZS5vcmRlcj1pK29yZGVyU2hpZnQ7Xy5mb3JFYWNoKG5vZGUuc2VsZkVkZ2VzLGZ1bmN0aW9uKHNlbGZFZGdlKXt1dGlsLmFkZER1bW15Tm9kZShnLCJzZWxmZWRnZSIse3dpZHRoOnNlbGZFZGdlLmxhYmVsLndpZHRoLGhlaWdodDpzZWxmRWRnZS5sYWJlbC5oZWlnaHQscmFuazpub2RlLnJhbmssb3JkZXI6aSsgKytvcmRlclNoaWZ0LAplOnNlbGZFZGdlLmUsbGFiZWw6c2VsZkVkZ2UubGFiZWx9LCJfc2UiKX0pO2RlbGV0ZSBub2RlLnNlbGZFZGdlc30pfSl9ZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYobm9kZS5kdW1teT09PSJzZWxmZWRnZSIpe3ZhciBzZWxmTm9kZT1nLm5vZGUobm9kZS5lLnYpLHg9c2VsZk5vZGUueCtzZWxmTm9kZS53aWR0aC8yLHk9c2VsZk5vZGUueSxkeD1ub2RlLngteCxkeT1zZWxmTm9kZS5oZWlnaHQvMjtnLnNldEVkZ2Uobm9kZS5lLG5vZGUubGFiZWwpO2cucmVtb3ZlTm9kZSh2KTtub2RlLmxhYmVsLnBvaW50cz1be3g6eCsyKmR4LzMseTp5LWR5fSx7eDp4KzUqZHgvNix5OnktZHl9LHt4OngrZHgseTp5fSx7eDp4KzUqZHgvNix5OnkrZHl9LHt4OngrMipkeC8zLHk6eStkeX1dO25vZGUubGFiZWwueD1ub2RlLng7bm9kZS5sYWJlbC55PW5vZGUueX19KX1mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosCmF0dHJzKXtyZXR1cm4gXy5tYXBWYWx1ZXMoXy5waWNrKG9iaixhdHRycyksTnVtYmVyKX1mdW5jdGlvbiBjYW5vbmljYWxpemUoYXR0cnMpe3ZhciBuZXdBdHRycz17fTtfLmZvckVhY2goYXR0cnMsZnVuY3Rpb24odixrKXtuZXdBdHRyc1trLnRvTG93ZXJDYXNlKCldPXZ9KTtyZXR1cm4gbmV3QXR0cnN9fSx7Ii4vYWN5Y2xpYyI6MiwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzIjozLCIuL2Nvb3JkaW5hdGUtc3lzdGVtIjo0LCIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vbmVzdGluZy1ncmFwaCI6MTEsIi4vbm9ybWFsaXplIjoxMiwiLi9vcmRlciI6MTcsIi4vcGFyZW50LWR1bW15LWNoYWlucyI6MjIsIi4vcG9zaXRpb24iOjI0LCIuL3JhbmsiOjI2LCIuL3V0aWwiOjI5fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPQp3aW5kb3cuXzttb2R1bGUuZXhwb3J0cz1sb2Rhc2h9LHsibG9kYXNoIjp1bmRlZmluZWR9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLGNsZWFudXA6Y2xlYW51cH07ZnVuY3Rpb24gcnVuKGcpe3ZhciByb290PXV0aWwuYWRkRHVtbXlOb2RlKGcsInJvb3QiLHt9LCJfcm9vdCIpO3ZhciBkZXB0aHM9dHJlZURlcHRocyhnKTt2YXIgaGVpZ2h0PV8ubWF4KF8udmFsdWVzKGRlcHRocykpLTE7dmFyIG5vZGVTZXA9MipoZWlnaHQrMTtnLmdyYXBoKCkubmVzdGluZ1Jvb3Q9cm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2cuZWRnZShlKS5taW5sZW4qPW5vZGVTZXB9KTt2YXIgd2VpZ2h0PXN1bVdlaWdodHMoZykrMTtfLmZvckVhY2goZy5jaGlsZHJlbigpLGZ1bmN0aW9uKGNoaWxkKXtkZnMoZyxyb290LG5vZGVTZXAsCndlaWdodCxoZWlnaHQsZGVwdGhzLGNoaWxkKX0pO2cuZ3JhcGgoKS5ub2RlUmFua0ZhY3Rvcj1ub2RlU2VwfWZ1bmN0aW9uIGRmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyx2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KTtpZighY2hpbGRyZW4ubGVuZ3RoKXtpZih2IT09cm9vdClnLnNldEVkZ2Uocm9vdCx2LHt3ZWlnaHQ6MCxtaW5sZW46bm9kZVNlcH0pO3JldHVybn12YXIgdG9wPXV0aWwuYWRkQm9yZGVyTm9kZShnLCJfYnQiKSxib3R0b209dXRpbC5hZGRCb3JkZXJOb2RlKGcsIl9iYiIpLGxhYmVsPWcubm9kZSh2KTtnLnNldFBhcmVudCh0b3Asdik7bGFiZWwuYm9yZGVyVG9wPXRvcDtnLnNldFBhcmVudChib3R0b20sdik7bGFiZWwuYm9yZGVyQm90dG9tPWJvdHRvbTtfLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2RmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyxjaGlsZCk7dmFyIGNoaWxkTm9kZT1nLm5vZGUoY2hpbGQpLApjaGlsZFRvcD1jaGlsZE5vZGUuYm9yZGVyVG9wP2NoaWxkTm9kZS5ib3JkZXJUb3A6Y2hpbGQsY2hpbGRCb3R0b209Y2hpbGROb2RlLmJvcmRlckJvdHRvbT9jaGlsZE5vZGUuYm9yZGVyQm90dG9tOmNoaWxkLHRoaXNXZWlnaHQ9Y2hpbGROb2RlLmJvcmRlclRvcD93ZWlnaHQ6Mip3ZWlnaHQsbWlubGVuPWNoaWxkVG9wIT09Y2hpbGRCb3R0b20/MTpoZWlnaHQtZGVwdGhzW3ZdKzE7Zy5zZXRFZGdlKHRvcCxjaGlsZFRvcCx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSk7Zy5zZXRFZGdlKGNoaWxkQm90dG9tLGJvdHRvbSx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSl9KTtpZighZy5wYXJlbnQodikpZy5zZXRFZGdlKHJvb3QsdG9wLHt3ZWlnaHQ6MCxtaW5sZW46aGVpZ2h0K2RlcHRoc1t2XX0pfWZ1bmN0aW9uIHRyZWVEZXB0aHMoZyl7dmFyIGRlcHRocz17fTtmdW5jdGlvbiBkZnModixkZXB0aCl7dmFyIGNoaWxkcmVuPQpnLmNoaWxkcmVuKHYpO2lmKGNoaWxkcmVuJiZjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkKXtkZnMoY2hpbGQsZGVwdGgrMSl9KTtkZXB0aHNbdl09ZGVwdGh9Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxmdW5jdGlvbih2KXtkZnModiwxKX0pO3JldHVybiBkZXB0aHN9ZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKXtyZXR1cm4gXy5yZWR1Y2UoZy5lZGdlcygpLGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gYWNjK2cuZWRnZShlKS53ZWlnaHR9LDApfWZ1bmN0aW9uIGNsZWFudXAoZyl7dmFyIGdyYXBoTGFiZWw9Zy5ncmFwaCgpO2cucmVtb3ZlTm9kZShncmFwaExhYmVsLm5lc3RpbmdSb290KTtkZWxldGUgZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLm5lc3RpbmdFZGdlKWcucmVtb3ZlRWRnZShlKX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSwKMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXtnLmdyYXBoKCkuZHVtbXlDaGFpbnM9W107Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtub3JtYWxpemVFZGdlKGcsZWRnZSl9KX1mdW5jdGlvbiBub3JtYWxpemVFZGdlKGcsZSl7dmFyIHY9ZS52LHZSYW5rPWcubm9kZSh2KS5yYW5rLHc9ZS53LHdSYW5rPWcubm9kZSh3KS5yYW5rLG5hbWU9ZS5uYW1lLGVkZ2VMYWJlbD1nLmVkZ2UoZSksbGFiZWxSYW5rPWVkZ2VMYWJlbC5sYWJlbFJhbms7aWYod1Jhbms9PT12UmFuaysxKXJldHVybjtnLnJlbW92ZUVkZ2UoZSk7dmFyIGR1bW15LGF0dHJzLGk7Zm9yKGk9MCwrK3ZSYW5rO3ZSYW5rPHdSYW5rOysraSwrK3ZSYW5rKXtlZGdlTGFiZWwucG9pbnRzPVtdO2F0dHJzPXt3aWR0aDowLApoZWlnaHQ6MCxlZGdlTGFiZWw6ZWRnZUxhYmVsLGVkZ2VPYmo6ZSxyYW5rOnZSYW5rfTtkdW1teT11dGlsLmFkZER1bW15Tm9kZShnLCJlZGdlIixhdHRycywiX2QiKTtpZih2UmFuaz09PWxhYmVsUmFuayl7YXR0cnMud2lkdGg9ZWRnZUxhYmVsLndpZHRoO2F0dHJzLmhlaWdodD1lZGdlTGFiZWwuaGVpZ2h0O2F0dHJzLmR1bW15PSJlZGdlLWxhYmVsIjthdHRycy5sYWJlbHBvcz1lZGdlTGFiZWwubGFiZWxwb3N9Zy5zZXRFZGdlKHYsZHVtbXkse3dlaWdodDplZGdlTGFiZWwud2VpZ2h0fSxuYW1lKTtpZihpPT09MClnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7dj1kdW1teX1nLnNldEVkZ2Uodix3LHt3ZWlnaHQ6ZWRnZUxhYmVsLndlaWdodH0sbmFtZSl9ZnVuY3Rpb24gdW5kbyhnKXtfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxvcmlnTGFiZWw9bm9kZS5lZGdlTGFiZWwsdztnLnNldEVkZ2Uobm9kZS5lZGdlT2JqLApvcmlnTGFiZWwpO3doaWxlKG5vZGUuZHVtbXkpe3c9Zy5zdWNjZXNzb3JzKHYpWzBdO2cucmVtb3ZlTm9kZSh2KTtvcmlnTGFiZWwucG9pbnRzLnB1c2goe3g6bm9kZS54LHk6bm9kZS55fSk7aWYobm9kZS5kdW1teT09PSJlZGdlLWxhYmVsIil7b3JpZ0xhYmVsLng9bm9kZS54O29yaWdMYWJlbC55PW5vZGUueTtvcmlnTGFiZWwud2lkdGg9bm9kZS53aWR0aDtvcmlnTGFiZWwuaGVpZ2h0PW5vZGUuaGVpZ2h0fXY9dztub2RlPWcubm9kZSh2KX19KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWFkZFN1YmdyYXBoQ29uc3RyYWludHM7ZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLGNnLHZzKXt2YXIgcHJldj17fSxyb290UHJldjtfLmZvckVhY2godnMsZnVuY3Rpb24odil7dmFyIGNoaWxkPWcucGFyZW50KHYpLHBhcmVudCwKcHJldkNoaWxkO3doaWxlKGNoaWxkKXtwYXJlbnQ9Zy5wYXJlbnQoY2hpbGQpO2lmKHBhcmVudCl7cHJldkNoaWxkPXByZXZbcGFyZW50XTtwcmV2W3BhcmVudF09Y2hpbGR9ZWxzZXtwcmV2Q2hpbGQ9cm9vdFByZXY7cm9vdFByZXY9Y2hpbGR9aWYocHJldkNoaWxkJiZwcmV2Q2hpbGQhPT1jaGlsZCl7Y2cuc2V0RWRnZShwcmV2Q2hpbGQsY2hpbGQpO3JldHVybn1jaGlsZD1wYXJlbnR9fSl9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9YmFyeWNlbnRlcjtmdW5jdGlvbiBiYXJ5Y2VudGVyKGcsbW92YWJsZSl7cmV0dXJuIF8ubWFwKG1vdmFibGUsZnVuY3Rpb24odil7dmFyIGluVj1nLmluRWRnZXModik7aWYoIWluVi5sZW5ndGgpcmV0dXJue3Y6dn07ZWxzZXt2YXIgcmVzdWx0PV8ucmVkdWNlKGluVixmdW5jdGlvbihhY2MsZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpLApub2RlVT1nLm5vZGUoZS52KTtyZXR1cm57c3VtOmFjYy5zdW0rZWRnZS53ZWlnaHQqbm9kZVUub3JkZXIsd2VpZ2h0OmFjYy53ZWlnaHQrZWRnZS53ZWlnaHR9fSx7c3VtOjAsd2VpZ2h0OjB9KTtyZXR1cm57djp2LGJhcnljZW50ZXI6cmVzdWx0LnN1bS9yZXN1bHQud2VpZ2h0LHdlaWdodDpyZXN1bHQud2VpZ2h0fX19KX19LHsiLi4vbG9kYXNoIjoxMH1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPWJ1aWxkTGF5ZXJHcmFwaDtmdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl7dmFyIHJvb3Q9Y3JlYXRlUm9vdE5vZGUoZykscmVzdWx0PShuZXcgR3JhcGgoe2NvbXBvdW5kOnRydWV9KSkuc2V0R3JhcGgoe3Jvb3Q6cm9vdH0pLnNldERlZmF1bHROb2RlTGFiZWwoZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KX0pOwpfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxwYXJlbnQ9Zy5wYXJlbnQodik7aWYobm9kZS5yYW5rPT09cmFua3x8bm9kZS5taW5SYW5rPD1yYW5rJiZyYW5rPD1ub2RlLm1heFJhbmspe3Jlc3VsdC5zZXROb2RlKHYpO3Jlc3VsdC5zZXRQYXJlbnQodixwYXJlbnR8fHJvb3QpO18uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksZnVuY3Rpb24oZSl7dmFyIHU9ZS52PT09dj9lLnc6ZS52LGVkZ2U9cmVzdWx0LmVkZ2UodSx2KSx3ZWlnaHQ9IV8uaXNVbmRlZmluZWQoZWRnZSk/ZWRnZS53ZWlnaHQ6MDtyZXN1bHQuc2V0RWRnZSh1LHYse3dlaWdodDpnLmVkZ2UoZSkud2VpZ2h0K3dlaWdodH0pfSk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXJlc3VsdC5zZXROb2RlKHYse2JvcmRlckxlZnQ6bm9kZS5ib3JkZXJMZWZ0W3JhbmtdLGJvcmRlclJpZ2h0Om5vZGUuYm9yZGVyUmlnaHRbcmFua119KX19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNyZWF0ZVJvb3ROb2RlKGcpe3ZhciB2Owp3aGlsZShnLmhhc05vZGUodj1fLnVuaXF1ZUlkKCJfcm9vdCIpKSk7cmV0dXJuIHZ9fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwfV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNyb3NzQ291bnQ7ZnVuY3Rpb24gY3Jvc3NDb3VudChnLGxheWVyaW5nKXt2YXIgY2M9MDtmb3IodmFyIGk9MTtpPGxheWVyaW5nLmxlbmd0aDsrK2kpY2MrPXR3b0xheWVyQ3Jvc3NDb3VudChnLGxheWVyaW5nW2ktMV0sbGF5ZXJpbmdbaV0pO3JldHVybiBjY31mdW5jdGlvbiB0d29MYXllckNyb3NzQ291bnQoZyxub3J0aExheWVyLHNvdXRoTGF5ZXIpe3ZhciBzb3V0aFBvcz1fLnppcE9iamVjdChzb3V0aExheWVyLF8ubWFwKHNvdXRoTGF5ZXIsZnVuY3Rpb24odixpKXtyZXR1cm4gaX0pKTt2YXIgc291dGhFbnRyaWVzPV8uZmxhdHRlbihfLm1hcChub3J0aExheWVyLGZ1bmN0aW9uKHYpe3JldHVybiBfLmNoYWluKGcub3V0RWRnZXModikpLm1hcChmdW5jdGlvbihlKXtyZXR1cm57cG9zOnNvdXRoUG9zW2Uud10sCndlaWdodDpnLmVkZ2UoZSkud2VpZ2h0fX0pLnNvcnRCeSgicG9zIikudmFsdWUoKX0pLHRydWUpO3ZhciBmaXJzdEluZGV4PTE7d2hpbGUoZmlyc3RJbmRleDxzb3V0aExheWVyLmxlbmd0aClmaXJzdEluZGV4PDw9MTt2YXIgdHJlZVNpemU9MipmaXJzdEluZGV4LTE7Zmlyc3RJbmRleC09MTt2YXIgdHJlZT1fLm1hcChuZXcgQXJyYXkodHJlZVNpemUpLGZ1bmN0aW9uKCl7cmV0dXJuIDB9KTt2YXIgY2M9MDtfLmZvckVhY2goc291dGhFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZW50cnkpe3ZhciBpbmRleD1lbnRyeS5wb3MrZmlyc3RJbmRleDt0cmVlW2luZGV4XSs9ZW50cnkud2VpZ2h0O3ZhciB3ZWlnaHRTdW09MDt3aGlsZShpbmRleD4wKXtpZihpbmRleCUyKXdlaWdodFN1bSs9dHJlZVtpbmRleCsxXTtpbmRleD1pbmRleC0xPj4xO3RyZWVbaW5kZXhdKz1lbnRyeS53ZWlnaHR9Y2MrPWVudHJ5LndlaWdodCp3ZWlnaHRTdW19KSk7cmV0dXJuIGNjfX0seyIuLi9sb2Rhc2giOjEwfV0sCjE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxpbml0T3JkZXI9cmVxdWlyZSgiLi9pbml0LW9yZGVyIiksY3Jvc3NDb3VudD1yZXF1aXJlKCIuL2Nyb3NzLWNvdW50Iiksc29ydFN1YmdyYXBoPXJlcXVpcmUoIi4vc29ydC1zdWJncmFwaCIpLGJ1aWxkTGF5ZXJHcmFwaD1yZXF1aXJlKCIuL2J1aWxkLWxheWVyLWdyYXBoIiksYWRkU3ViZ3JhcGhDb25zdHJhaW50cz1yZXF1aXJlKCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9b3JkZXI7ZnVuY3Rpb24gb3JkZXIoZyl7dmFyIG1heFJhbms9dXRpbC5tYXhSYW5rKGcpLGRvd25MYXllckdyYXBocz1idWlsZExheWVyR3JhcGhzKGcsXy5yYW5nZSgxLG1heFJhbmsrMSksImluRWRnZXMiKSx1cExheWVyR3JhcGhzPWJ1aWxkTGF5ZXJHcmFwaHMoZywKXy5yYW5nZShtYXhSYW5rLTEsLTEsLTEpLCJvdXRFZGdlcyIpO3ZhciBsYXllcmluZz1pbml0T3JkZXIoZyk7YXNzaWduT3JkZXIoZyxsYXllcmluZyk7dmFyIGJlc3RDQz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksYmVzdDtmb3IodmFyIGk9MCxsYXN0QmVzdD0wO2xhc3RCZXN0PDQ7KytpLCsrbGFzdEJlc3Qpe3N3ZWVwTGF5ZXJHcmFwaHMoaSUyP2Rvd25MYXllckdyYXBoczp1cExheWVyR3JhcGhzLGklND49Mik7bGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpO3ZhciBjYz1jcm9zc0NvdW50KGcsbGF5ZXJpbmcpO2lmKGNjPGJlc3RDQyl7bGFzdEJlc3Q9MDtiZXN0PV8uY2xvbmVEZWVwKGxheWVyaW5nKTtiZXN0Q0M9Y2N9fWFzc2lnbk9yZGVyKGcsYmVzdCl9ZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLHJhbmtzLHJlbGF0aW9uc2hpcCl7cmV0dXJuIF8ubWFwKHJhbmtzLGZ1bmN0aW9uKHJhbmspe3JldHVybiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl9KX0KZnVuY3Rpb24gc3dlZXBMYXllckdyYXBocyhsYXllckdyYXBocyxiaWFzUmlnaHQpe3ZhciBjZz1uZXcgR3JhcGg7Xy5mb3JFYWNoKGxheWVyR3JhcGhzLGZ1bmN0aW9uKGxnKXt2YXIgcm9vdD1sZy5ncmFwaCgpLnJvb3Q7dmFyIHNvcnRlZD1zb3J0U3ViZ3JhcGgobGcscm9vdCxjZyxiaWFzUmlnaHQpO18uZm9yRWFjaChzb3J0ZWQudnMsZnVuY3Rpb24odixpKXtsZy5ub2RlKHYpLm9yZGVyPWl9KTthZGRTdWJncmFwaENvbnN0cmFpbnRzKGxnLGNnLHNvcnRlZC52cyl9KX1mdW5jdGlvbiBhc3NpZ25PcmRlcihnLGxheWVyaW5nKXtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe2cubm9kZSh2KS5vcmRlcj1pfSl9KX19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyI6MTMsIi4vYnVpbGQtbGF5ZXItZ3JhcGgiOjE1LCIuL2Nyb3NzLWNvdW50IjoxNiwKIi4vaW5pdC1vcmRlciI6MTgsIi4vc29ydC1zdWJncmFwaCI6MjB9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9aW5pdE9yZGVyO2Z1bmN0aW9uIGluaXRPcmRlcihnKXt2YXIgdmlzaXRlZD17fSxzaW1wbGVOb2Rlcz1fLmZpbHRlcihnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIWcuY2hpbGRyZW4odikubGVuZ3RofSksbWF4UmFuaz1fLm1heChfLm1hcChzaW1wbGVOb2RlcyxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSksbGF5ZXJzPV8ubWFwKF8ucmFuZ2UobWF4UmFuaysxKSxmdW5jdGlvbigpe3JldHVybltdfSk7ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTt2YXIgbm9kZT1nLm5vZGUodik7bGF5ZXJzW25vZGUucmFua10ucHVzaCh2KTtfLmZvckVhY2goZy5zdWNjZXNzb3JzKHYpLGRmcyl9dmFyIG9yZGVyZWRWcz0KXy5zb3J0Qnkoc2ltcGxlTm9kZXMsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSk7Xy5mb3JFYWNoKG9yZGVyZWRWcyxkZnMpO3JldHVybiBsYXllcnN9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZUNvbmZsaWN0cztmdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsY2cpe3ZhciBtYXBwZWRFbnRyaWVzPXt9O18uZm9yRWFjaChlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5LGkpe3ZhciB0bXA9bWFwcGVkRW50cmllc1tlbnRyeS52XT17aW5kZWdyZWU6MCwiaW4iOltdLG91dDpbXSx2czpbZW50cnkudl0saTppfTtpZighXy5pc1VuZGVmaW5lZChlbnRyeS5iYXJ5Y2VudGVyKSl7dG1wLmJhcnljZW50ZXI9ZW50cnkuYmFyeWNlbnRlcjt0bXAud2VpZ2h0PWVudHJ5LndlaWdodH19KTtfLmZvckVhY2goY2cuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZW50cnlWPQptYXBwZWRFbnRyaWVzW2Uudl0sZW50cnlXPW1hcHBlZEVudHJpZXNbZS53XTtpZighXy5pc1VuZGVmaW5lZChlbnRyeVYpJiYhXy5pc1VuZGVmaW5lZChlbnRyeVcpKXtlbnRyeVcuaW5kZWdyZWUrKztlbnRyeVYub3V0LnB1c2gobWFwcGVkRW50cmllc1tlLnddKX19KTt2YXIgc291cmNlU2V0PV8uZmlsdGVyKG1hcHBlZEVudHJpZXMsZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5pbmRlZ3JlZX0pO3JldHVybiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KX1mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KXt2YXIgZW50cmllcz1bXTtmdW5jdGlvbiBoYW5kbGVJbih2RW50cnkpe3JldHVybiBmdW5jdGlvbih1RW50cnkpe2lmKHVFbnRyeS5tZXJnZWQpcmV0dXJuO2lmKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpfHxfLmlzVW5kZWZpbmVkKHZFbnRyeS5iYXJ5Y2VudGVyKXx8dUVudHJ5LmJhcnljZW50ZXI+PXZFbnRyeS5iYXJ5Y2VudGVyKW1lcmdlRW50cmllcyh2RW50cnksCnVFbnRyeSl9fWZ1bmN0aW9uIGhhbmRsZU91dCh2RW50cnkpe3JldHVybiBmdW5jdGlvbih3RW50cnkpe3dFbnRyeVsiaW4iXS5wdXNoKHZFbnRyeSk7aWYoLS13RW50cnkuaW5kZWdyZWU9PT0wKXNvdXJjZVNldC5wdXNoKHdFbnRyeSl9fXdoaWxlKHNvdXJjZVNldC5sZW5ndGgpe3ZhciBlbnRyeT1zb3VyY2VTZXQucG9wKCk7ZW50cmllcy5wdXNoKGVudHJ5KTtfLmZvckVhY2goZW50cnlbImluIl0ucmV2ZXJzZSgpLGhhbmRsZUluKGVudHJ5KSk7Xy5mb3JFYWNoKGVudHJ5Lm91dCxoYW5kbGVPdXQoZW50cnkpKX1yZXR1cm4gXy5jaGFpbihlbnRyaWVzKS5maWx0ZXIoZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5tZXJnZWR9KS5tYXAoZnVuY3Rpb24oZW50cnkpe3JldHVybiBfLnBpY2soZW50cnksWyJ2cyIsImkiLCJiYXJ5Y2VudGVyIiwid2VpZ2h0Il0pfSkudmFsdWUoKX1mdW5jdGlvbiBtZXJnZUVudHJpZXModGFyZ2V0LHNvdXJjZSl7dmFyIHN1bT0wLHdlaWdodD0wOwppZih0YXJnZXQud2VpZ2h0KXtzdW0rPXRhcmdldC5iYXJ5Y2VudGVyKnRhcmdldC53ZWlnaHQ7d2VpZ2h0Kz10YXJnZXQud2VpZ2h0fWlmKHNvdXJjZS53ZWlnaHQpe3N1bSs9c291cmNlLmJhcnljZW50ZXIqc291cmNlLndlaWdodDt3ZWlnaHQrPXNvdXJjZS53ZWlnaHR9dGFyZ2V0LnZzPXNvdXJjZS52cy5jb25jYXQodGFyZ2V0LnZzKTt0YXJnZXQuYmFyeWNlbnRlcj1zdW0vd2VpZ2h0O3RhcmdldC53ZWlnaHQ9d2VpZ2h0O3RhcmdldC5pPU1hdGgubWluKHNvdXJjZS5pLHRhcmdldC5pKTtzb3VyY2UubWVyZ2VkPXRydWV9fSx7Ii4uL2xvZGFzaCI6MTB9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksYmFyeWNlbnRlcj1yZXF1aXJlKCIuL2JhcnljZW50ZXIiKSxyZXNvbHZlQ29uZmxpY3RzPXJlcXVpcmUoIi4vcmVzb2x2ZS1jb25mbGljdHMiKSxzb3J0PXJlcXVpcmUoIi4vc29ydCIpO21vZHVsZS5leHBvcnRzPQpzb3J0U3ViZ3JhcGg7ZnVuY3Rpb24gc29ydFN1YmdyYXBoKGcsdixjZyxiaWFzUmlnaHQpe3ZhciBtb3ZhYmxlPWcuY2hpbGRyZW4odiksbm9kZT1nLm5vZGUodiksYmw9bm9kZT9ub2RlLmJvcmRlckxlZnQ6dW5kZWZpbmVkLGJyPW5vZGU/bm9kZS5ib3JkZXJSaWdodDp1bmRlZmluZWQsc3ViZ3JhcGhzPXt9O2lmKGJsKW1vdmFibGU9Xy5maWx0ZXIobW92YWJsZSxmdW5jdGlvbih3KXtyZXR1cm4gdyE9PWJsJiZ3IT09YnJ9KTt2YXIgYmFyeWNlbnRlcnM9YmFyeWNlbnRlcihnLG1vdmFibGUpO18uZm9yRWFjaChiYXJ5Y2VudGVycyxmdW5jdGlvbihlbnRyeSl7aWYoZy5jaGlsZHJlbihlbnRyeS52KS5sZW5ndGgpe3ZhciBzdWJncmFwaFJlc3VsdD1zb3J0U3ViZ3JhcGgoZyxlbnRyeS52LGNnLGJpYXNSaWdodCk7c3ViZ3JhcGhzW2VudHJ5LnZdPXN1YmdyYXBoUmVzdWx0O2lmKF8uaGFzKHN1YmdyYXBoUmVzdWx0LCJiYXJ5Y2VudGVyIikpbWVyZ2VCYXJ5Y2VudGVycyhlbnRyeSwKc3ViZ3JhcGhSZXN1bHQpfX0pO3ZhciBlbnRyaWVzPXJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsY2cpO2V4cGFuZFN1YmdyYXBocyhlbnRyaWVzLHN1YmdyYXBocyk7dmFyIHJlc3VsdD1zb3J0KGVudHJpZXMsYmlhc1JpZ2h0KTtpZihibCl7cmVzdWx0LnZzPV8uZmxhdHRlbihbYmwscmVzdWx0LnZzLGJyXSx0cnVlKTtpZihnLnByZWRlY2Vzc29ycyhibCkubGVuZ3RoKXt2YXIgYmxQcmVkPWcubm9kZShnLnByZWRlY2Vzc29ycyhibClbMF0pLGJyUHJlZD1nLm5vZGUoZy5wcmVkZWNlc3NvcnMoYnIpWzBdKTtpZighXy5oYXMocmVzdWx0LCJiYXJ5Y2VudGVyIikpe3Jlc3VsdC5iYXJ5Y2VudGVyPTA7cmVzdWx0LndlaWdodD0wfXJlc3VsdC5iYXJ5Y2VudGVyPShyZXN1bHQuYmFyeWNlbnRlcipyZXN1bHQud2VpZ2h0K2JsUHJlZC5vcmRlciticlByZWQub3JkZXIpLyhyZXN1bHQud2VpZ2h0KzIpO3Jlc3VsdC53ZWlnaHQrPTJ9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsCnN1YmdyYXBocyl7Xy5mb3JFYWNoKGVudHJpZXMsZnVuY3Rpb24oZW50cnkpe2VudHJ5LnZzPV8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odil7aWYoc3ViZ3JhcGhzW3ZdKXJldHVybiBzdWJncmFwaHNbdl0udnM7cmV0dXJuIHZ9KSx0cnVlKX0pfWZ1bmN0aW9uIG1lcmdlQmFyeWNlbnRlcnModGFyZ2V0LG90aGVyKXtpZighXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpe3RhcmdldC5iYXJ5Y2VudGVyPSh0YXJnZXQuYmFyeWNlbnRlcip0YXJnZXQud2VpZ2h0K290aGVyLmJhcnljZW50ZXIqb3RoZXIud2VpZ2h0KS8odGFyZ2V0LndlaWdodCtvdGhlci53ZWlnaHQpO3RhcmdldC53ZWlnaHQrPW90aGVyLndlaWdodH1lbHNle3RhcmdldC5iYXJ5Y2VudGVyPW90aGVyLmJhcnljZW50ZXI7dGFyZ2V0LndlaWdodD1vdGhlci53ZWlnaHR9fX0seyIuLi9sb2Rhc2giOjEwLCIuL2JhcnljZW50ZXIiOjE0LCIuL3Jlc29sdmUtY29uZmxpY3RzIjoxOSwiLi9zb3J0IjoyMX1dLAoyMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9c29ydDtmdW5jdGlvbiBzb3J0KGVudHJpZXMsYmlhc1JpZ2h0KXt2YXIgcGFydHM9dXRpbC5wYXJ0aXRpb24oZW50cmllcyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuIF8uaGFzKGVudHJ5LCJiYXJ5Y2VudGVyIil9KTt2YXIgc29ydGFibGU9cGFydHMubGhzLHVuc29ydGFibGU9Xy5zb3J0QnkocGFydHMucmhzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4tZW50cnkuaX0pLHZzPVtdLHN1bT0wLHdlaWdodD0wLHZzSW5kZXg9MDtzb3J0YWJsZS5zb3J0KGNvbXBhcmVXaXRoQmlhcyghIWJpYXNSaWdodCkpO3ZzSW5kZXg9Y29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSx2c0luZGV4KTtfLmZvckVhY2goc29ydGFibGUsZnVuY3Rpb24oZW50cnkpe3ZzSW5kZXgrPWVudHJ5LnZzLmxlbmd0aDt2cy5wdXNoKGVudHJ5LnZzKTsKc3VtKz1lbnRyeS5iYXJ5Y2VudGVyKmVudHJ5LndlaWdodDt3ZWlnaHQrPWVudHJ5LndlaWdodDt2c0luZGV4PWNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsdnNJbmRleCl9KTt2YXIgcmVzdWx0PXt2czpfLmZsYXR0ZW4odnMsdHJ1ZSl9O2lmKHdlaWdodCl7cmVzdWx0LmJhcnljZW50ZXI9c3VtL3dlaWdodDtyZXN1bHQud2VpZ2h0PXdlaWdodH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsaW5kZXgpe3ZhciBsYXN0O3doaWxlKHVuc29ydGFibGUubGVuZ3RoJiYobGFzdD1fLmxhc3QodW5zb3J0YWJsZSkpLmk8PWluZGV4KXt1bnNvcnRhYmxlLnBvcCgpO3ZzLnB1c2gobGFzdC52cyk7aW5kZXgrK31yZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpe3JldHVybiBmdW5jdGlvbihlbnRyeVYsZW50cnlXKXtpZihlbnRyeVYuYmFyeWNlbnRlcjxlbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4tMTtlbHNlIGlmKGVudHJ5Vi5iYXJ5Y2VudGVyPgplbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4gMTtyZXR1cm4hYmlhcz9lbnRyeVYuaS1lbnRyeVcuaTplbnRyeVcuaS1lbnRyeVYuaX19fSx7Ii4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5fV0sMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cGFyZW50RHVtbXlDaGFpbnM7ZnVuY3Rpb24gcGFyZW50RHVtbXlDaGFpbnMoZyl7dmFyIHBvc3RvcmRlck51bXM9cG9zdG9yZGVyKGcpO18uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLGVkZ2VPYmo9bm9kZS5lZGdlT2JqLHBhdGhEYXRhPWZpbmRQYXRoKGcscG9zdG9yZGVyTnVtcyxlZGdlT2JqLnYsZWRnZU9iai53KSxwYXRoPXBhdGhEYXRhLnBhdGgsbGNhPXBhdGhEYXRhLmxjYSxwYXRoSWR4PTAscGF0aFY9cGF0aFtwYXRoSWR4XSxhc2NlbmRpbmc9dHJ1ZTt3aGlsZSh2IT09ZWRnZU9iai53KXtub2RlPQpnLm5vZGUodik7aWYoYXNjZW5kaW5nKXt3aGlsZSgocGF0aFY9cGF0aFtwYXRoSWR4XSkhPT1sY2EmJmcubm9kZShwYXRoVikubWF4UmFuazxub2RlLnJhbmspcGF0aElkeCsrO2lmKHBhdGhWPT09bGNhKWFzY2VuZGluZz1mYWxzZX1pZighYXNjZW5kaW5nKXt3aGlsZShwYXRoSWR4PHBhdGgubGVuZ3RoLTEmJmcubm9kZShwYXRoVj1wYXRoW3BhdGhJZHgrMV0pLm1pblJhbms8PW5vZGUucmFuaylwYXRoSWR4Kys7cGF0aFY9cGF0aFtwYXRoSWR4XX1nLnNldFBhcmVudCh2LHBhdGhWKTt2PWcuc3VjY2Vzc29ycyh2KVswXX19KX1mdW5jdGlvbiBmaW5kUGF0aChnLHBvc3RvcmRlck51bXMsdix3KXt2YXIgdlBhdGg9W10sd1BhdGg9W10sbG93PU1hdGgubWluKHBvc3RvcmRlck51bXNbdl0ubG93LHBvc3RvcmRlck51bXNbd10ubG93KSxsaW09TWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0scG9zdG9yZGVyTnVtc1t3XS5saW0pLHBhcmVudCxsY2E7cGFyZW50PXY7ZG97cGFyZW50PQpnLnBhcmVudChwYXJlbnQpO3ZQYXRoLnB1c2gocGFyZW50KX13aGlsZShwYXJlbnQmJihwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93Pmxvd3x8bGltPnBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtsY2E9cGFyZW50O3BhcmVudD13O3doaWxlKChwYXJlbnQ9Zy5wYXJlbnQocGFyZW50KSkhPT1sY2Epd1BhdGgucHVzaChwYXJlbnQpO3JldHVybntwYXRoOnZQYXRoLmNvbmNhdCh3UGF0aC5yZXZlcnNlKCkpLGxjYTpsY2F9fWZ1bmN0aW9uIHBvc3RvcmRlcihnKXt2YXIgcmVzdWx0PXt9LGxpbT0wO2Z1bmN0aW9uIGRmcyh2KXt2YXIgbG93PWxpbTtfLmZvckVhY2goZy5jaGlsZHJlbih2KSxkZnMpO3Jlc3VsdFt2XT17bG93OmxvdyxsaW06bGltKyt9fV8uZm9yRWFjaChnLmNoaWxkcmVuKCksZGZzKTtyZXR1cm4gcmVzdWx0fX0seyIuL2xvZGFzaCI6MTB9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9CnJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3Bvc2l0aW9uWDpwb3NpdGlvblgsZmluZFR5cGUxQ29uZmxpY3RzOmZpbmRUeXBlMUNvbmZsaWN0cyxmaW5kVHlwZTJDb25mbGljdHM6ZmluZFR5cGUyQ29uZmxpY3RzLGFkZENvbmZsaWN0OmFkZENvbmZsaWN0LGhhc0NvbmZsaWN0Omhhc0NvbmZsaWN0LHZlcnRpY2FsQWxpZ25tZW50OnZlcnRpY2FsQWxpZ25tZW50LGhvcml6b250YWxDb21wYWN0aW9uOmhvcml6b250YWxDb21wYWN0aW9uLGFsaWduQ29vcmRpbmF0ZXM6YWxpZ25Db29yZGluYXRlcyxmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDpmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudCxiYWxhbmNlOmJhbGFuY2V9O2Z1bmN0aW9uIGZpbmRUeXBlMUNvbmZsaWN0cyhnLGxheWVyaW5nKXt2YXIgY29uZmxpY3RzPXt9O2Z1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLGxheWVyKXt2YXIgazA9MCxzY2FuUG9zPQowLHByZXZMYXllckxlbmd0aD1wcmV2TGF5ZXIubGVuZ3RoLGxhc3ROb2RlPV8ubGFzdChsYXllcik7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7dmFyIHc9ZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLHYpLGsxPXc/Zy5ub2RlKHcpLm9yZGVyOnByZXZMYXllckxlbmd0aDtpZih3fHx2PT09bGFzdE5vZGUpe18uZm9yRWFjaChsYXllci5zbGljZShzY2FuUG9zLGkrMSksZnVuY3Rpb24oc2Nhbk5vZGUpe18uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksZnVuY3Rpb24odSl7dmFyIHVMYWJlbD1nLm5vZGUodSksdVBvcz11TGFiZWwub3JkZXI7aWYoKHVQb3M8azB8fGsxPHVQb3MpJiYhKHVMYWJlbC5kdW1teSYmZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsc2Nhbk5vZGUpfSl9KTtzY2FuUG9zPWkrMTtrMD1rMX19KTtyZXR1cm4gbGF5ZXJ9Xy5yZWR1Y2UobGF5ZXJpbmcsdmlzaXRMYXllcik7cmV0dXJuIGNvbmZsaWN0c30KZnVuY3Rpb24gZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpe3ZhciBjb25mbGljdHM9e307ZnVuY3Rpb24gc2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aEVuZCxwcmV2Tm9ydGhCb3JkZXIsbmV4dE5vcnRoQm9yZGVyKXt2YXIgdjtfLmZvckVhY2goXy5yYW5nZShzb3V0aFBvcyxzb3V0aEVuZCksZnVuY3Rpb24oaSl7dj1zb3V0aFtpXTtpZihnLm5vZGUodikuZHVtbXkpXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLGZ1bmN0aW9uKHUpe3ZhciB1Tm9kZT1nLm5vZGUodSk7aWYodU5vZGUuZHVtbXkmJih1Tm9kZS5vcmRlcjxwcmV2Tm9ydGhCb3JkZXJ8fHVOb2RlLm9yZGVyPm5leHROb3J0aEJvcmRlcikpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsdil9KX0pfWZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsc291dGgpe3ZhciBwcmV2Tm9ydGhQb3M9LTEsbmV4dE5vcnRoUG9zLHNvdXRoUG9zPTA7Xy5mb3JFYWNoKHNvdXRoLGZ1bmN0aW9uKHYsc291dGhMb29rYWhlYWQpe2lmKGcubm9kZSh2KS5kdW1teT09PQoiYm9yZGVyIil7dmFyIHByZWRlY2Vzc29ycz1nLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkZWNlc3NvcnMubGVuZ3RoKXtuZXh0Tm9ydGhQb3M9Zy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7c2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aExvb2thaGVhZCxwcmV2Tm9ydGhQb3MsbmV4dE5vcnRoUG9zKTtzb3V0aFBvcz1zb3V0aExvb2thaGVhZDtwcmV2Tm9ydGhQb3M9bmV4dE5vcnRoUG9zfX1zY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoLmxlbmd0aCxuZXh0Tm9ydGhQb3Msbm9ydGgubGVuZ3RoKX0pO3JldHVybiBzb3V0aH1fLnJlZHVjZShsYXllcmluZyx2aXNpdExheWVyKTtyZXR1cm4gY29uZmxpY3RzfWZ1bmN0aW9uIGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZyx2KXtpZihnLm5vZGUodikuZHVtbXkpcmV0dXJuIF8uZmluZChnLnByZWRlY2Vzc29ycyh2KSxmdW5jdGlvbih1KXtyZXR1cm4gZy5ub2RlKHUpLmR1bW15fSl9ZnVuY3Rpb24gYWRkQ29uZmxpY3QoY29uZmxpY3RzLAp2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgY29uZmxpY3RzVj1jb25mbGljdHNbdl07aWYoIWNvbmZsaWN0c1YpY29uZmxpY3RzW3ZdPWNvbmZsaWN0c1Y9e307Y29uZmxpY3RzVlt3XT10cnVlfWZ1bmN0aW9uIGhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH1yZXR1cm4gXy5oYXMoY29uZmxpY3RzW3ZdLHcpfWZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsbGF5ZXJpbmcsY29uZmxpY3RzLG5laWdoYm9yRm4pe3ZhciByb290PXt9LGFsaWduPXt9LHBvcz17fTtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LG9yZGVyKXtyb290W3ZdPXY7YWxpZ25bdl09djtwb3Nbdl09b3JkZXJ9KX0pO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHByZXZJZHg9LTE7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB3cz1uZWlnaGJvckZuKHYpOwppZih3cy5sZW5ndGgpe3dzPV8uc29ydEJ5KHdzLGZ1bmN0aW9uKHcpe3JldHVybiBwb3Nbd119KTt2YXIgbXA9KHdzLmxlbmd0aC0xKS8yO2Zvcih2YXIgaT1NYXRoLmZsb29yKG1wKSxpbD1NYXRoLmNlaWwobXApO2k8PWlsOysraSl7dmFyIHc9d3NbaV07aWYoYWxpZ25bdl09PT12JiZwcmV2SWR4PHBvc1t3XSYmIWhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpKXthbGlnblt3XT12O2FsaWduW3ZdPXJvb3Rbdl09cm9vdFt3XTtwcmV2SWR4PXBvc1t3XX19fX0pfSk7cmV0dXJue3Jvb3Q6cm9vdCxhbGlnbjphbGlnbn19ZnVuY3Rpb24gaG9yaXpvbnRhbENvbXBhY3Rpb24oZyxsYXllcmluZyxyb290LGFsaWduLHJldmVyc2VTZXApe3ZhciB4cz17fSxibG9ja0c9YnVpbGRCbG9ja0dyYXBoKGcsbGF5ZXJpbmcscm9vdCxyZXZlcnNlU2VwKSxib3JkZXJUeXBlPXJldmVyc2VTZXA/ImJvcmRlckxlZnQiOiJib3JkZXJSaWdodCI7ZnVuY3Rpb24gaXRlcmF0ZShzZXRYc0Z1bmMsbmV4dE5vZGVzRnVuYyl7dmFyIHN0YWNrPQpibG9ja0cubm9kZXMoKTt2YXIgZWxlbT1zdGFjay5wb3AoKTt2YXIgdmlzaXRlZD17fTt3aGlsZShlbGVtKXtpZih2aXNpdGVkW2VsZW1dKXNldFhzRnVuYyhlbGVtKTtlbHNle3Zpc2l0ZWRbZWxlbV09dHJ1ZTtzdGFjay5wdXNoKGVsZW0pO3N0YWNrPXN0YWNrLmNvbmNhdChuZXh0Tm9kZXNGdW5jKGVsZW0pKX1lbGVtPXN0YWNrLnBvcCgpfX1mdW5jdGlvbiBwYXNzMShlbGVtKXt4c1tlbGVtXT1ibG9ja0cuaW5FZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLGUpe3JldHVybiBNYXRoLm1heChhY2MseHNbZS52XStibG9ja0cuZWRnZShlKSl9LDApfWZ1bmN0aW9uIHBhc3MyKGVsZW0pe3ZhciBtaW49YmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsZSl7cmV0dXJuIE1hdGgubWluKGFjYyx4c1tlLnddLWJsb2NrRy5lZGdlKGUpKX0sTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTt2YXIgbm9kZT1nLm5vZGUoZWxlbSk7aWYobWluIT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZJiYKbm9kZS5ib3JkZXJUeXBlIT09Ym9yZGVyVHlwZSl4c1tlbGVtXT1NYXRoLm1heCh4c1tlbGVtXSxtaW4pfWl0ZXJhdGUocGFzczEsXy5iaW5kKGJsb2NrRy5wcmVkZWNlc3NvcnMsYmxvY2tHKSk7aXRlcmF0ZShwYXNzMixfLmJpbmQoYmxvY2tHLnN1Y2Nlc3NvcnMsYmxvY2tHKSk7Xy5mb3JFYWNoKGFsaWduLGZ1bmN0aW9uKHYpe3hzW3ZdPXhzW3Jvb3Rbdl1dfSk7cmV0dXJuIHhzfWZ1bmN0aW9uIGJ1aWxkQmxvY2tHcmFwaChnLGxheWVyaW5nLHJvb3QscmV2ZXJzZVNlcCl7dmFyIGJsb2NrR3JhcGg9bmV3IEdyYXBoLGdyYXBoTGFiZWw9Zy5ncmFwaCgpLHNlcEZuPXNlcChncmFwaExhYmVsLm5vZGVzZXAsZ3JhcGhMYWJlbC5lZGdlc2VwLHJldmVyc2VTZXApO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHU7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB2Um9vdD1yb290W3ZdO2Jsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7aWYodSl7dmFyIHVSb290PQpyb290W3VdLHByZXZNYXg9YmxvY2tHcmFwaC5lZGdlKHVSb290LHZSb290KTtibG9ja0dyYXBoLnNldEVkZ2UodVJvb3QsdlJvb3QsTWF0aC5tYXgoc2VwRm4oZyx2LHUpLHByZXZNYXh8fDApKX11PXZ9KX0pO3JldHVybiBibG9ja0dyYXBofWZ1bmN0aW9uIGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcseHNzKXtyZXR1cm4gXy5taW5CeShfLnZhbHVlcyh4c3MpLGZ1bmN0aW9uKHhzKXt2YXIgbWF4PU51bWJlci5ORUdBVElWRV9JTkZJTklUWTt2YXIgbWluPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtfLmZvckluKHhzLGZ1bmN0aW9uKHgsdil7dmFyIGhhbGZXaWR0aD13aWR0aChnLHYpLzI7bWF4PU1hdGgubWF4KHgraGFsZldpZHRoLG1heCk7bWluPU1hdGgubWluKHgtaGFsZldpZHRoLG1pbil9KTtyZXR1cm4gbWF4LW1pbn0pfWZ1bmN0aW9uIGFsaWduQ29vcmRpbmF0ZXMoeHNzLGFsaWduVG8pe3ZhciBhbGlnblRvVmFscz1fLnZhbHVlcyhhbGlnblRvKSxhbGlnblRvTWluPQpfLm1pbihhbGlnblRvVmFscyksYWxpZ25Ub01heD1fLm1heChhbGlnblRvVmFscyk7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXt2YXIgYWxpZ25tZW50PXZlcnQraG9yaXoseHM9eHNzW2FsaWdubWVudF0sZGVsdGE7aWYoeHM9PT1hbGlnblRvKXJldHVybjt2YXIgeHNWYWxzPV8udmFsdWVzKHhzKTtkZWx0YT1ob3Jpej09PSJsIj9hbGlnblRvTWluLV8ubWluKHhzVmFscyk6YWxpZ25Ub01heC1fLm1heCh4c1ZhbHMpO2lmKGRlbHRhKXhzc1thbGlnbm1lbnRdPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybiB4K2RlbHRhfSl9KX0pfWZ1bmN0aW9uIGJhbGFuY2UoeHNzLGFsaWduKXtyZXR1cm4gXy5tYXBWYWx1ZXMoeHNzLnVsLGZ1bmN0aW9uKGlnbm9yZSx2KXtpZihhbGlnbilyZXR1cm4geHNzW2FsaWduLnRvTG93ZXJDYXNlKCldW3ZdO2Vsc2V7dmFyIHhzPV8uc29ydEJ5KF8ubWFwKHhzcywKdikpO3JldHVybih4c1sxXSt4c1syXSkvMn19KX1mdW5jdGlvbiBwb3NpdGlvblgoZyl7dmFyIGxheWVyaW5nPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKSxjb25mbGljdHM9Xy5tZXJnZShmaW5kVHlwZTFDb25mbGljdHMoZyxsYXllcmluZyksZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpKTt2YXIgeHNzPXt9LGFkanVzdGVkTGF5ZXJpbmc7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXthZGp1c3RlZExheWVyaW5nPXZlcnQ9PT0idSI/bGF5ZXJpbmc6Xy52YWx1ZXMobGF5ZXJpbmcpLnJldmVyc2UoKTtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXtpZihob3Jpej09PSJyIilhZGp1c3RlZExheWVyaW5nPV8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsZnVuY3Rpb24oaW5uZXIpe3JldHVybiBfLnZhbHVlcyhpbm5lcikucmV2ZXJzZSgpfSk7dmFyIG5laWdoYm9yRm49Xy5iaW5kKHZlcnQ9PT0idSI/Zy5wcmVkZWNlc3NvcnM6Zy5zdWNjZXNzb3JzLApnKTt2YXIgYWxpZ249dmVydGljYWxBbGlnbm1lbnQoZyxhZGp1c3RlZExheWVyaW5nLGNvbmZsaWN0cyxuZWlnaGJvckZuKTt2YXIgeHM9aG9yaXpvbnRhbENvbXBhY3Rpb24oZyxhZGp1c3RlZExheWVyaW5nLGFsaWduLnJvb3QsYWxpZ24uYWxpZ24saG9yaXo9PT0iciIpO2lmKGhvcml6PT09InIiKXhzPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybi14fSk7eHNzW3ZlcnQraG9yaXpdPXhzfSl9KTt2YXIgc21hbGxlc3RXaWR0aD1maW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLHhzcyk7YWxpZ25Db29yZGluYXRlcyh4c3Msc21hbGxlc3RXaWR0aCk7cmV0dXJuIGJhbGFuY2UoeHNzLGcuZ3JhcGgoKS5hbGlnbil9ZnVuY3Rpb24gc2VwKG5vZGVTZXAsZWRnZVNlcCxyZXZlcnNlU2VwKXtyZXR1cm4gZnVuY3Rpb24oZyx2LHcpe3ZhciB2TGFiZWw9Zy5ub2RlKHYpLHdMYWJlbD1nLm5vZGUodyksc3VtPTAsZGVsdGE7c3VtKz12TGFiZWwud2lkdGgvMjtpZihfLmhhcyh2TGFiZWwsCiJsYWJlbHBvcyIpKXN3aXRjaCh2TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSAibCI6ZGVsdGE9LXZMYWJlbC53aWR0aC8yO2JyZWFrO2Nhc2UgInIiOmRlbHRhPXZMYWJlbC53aWR0aC8yO2JyZWFrfWlmKGRlbHRhKXN1bSs9cmV2ZXJzZVNlcD9kZWx0YTotZGVsdGE7ZGVsdGE9MDtzdW0rPSh2TGFiZWwuZHVtbXk/ZWRnZVNlcDpub2RlU2VwKS8yO3N1bSs9KHdMYWJlbC5kdW1teT9lZGdlU2VwOm5vZGVTZXApLzI7c3VtKz13TGFiZWwud2lkdGgvMjtpZihfLmhhcyh3TGFiZWwsImxhYmVscG9zIikpc3dpdGNoKHdMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlICJsIjpkZWx0YT13TGFiZWwud2lkdGgvMjticmVhaztjYXNlICJyIjpkZWx0YT0td0xhYmVsLndpZHRoLzI7YnJlYWt9aWYoZGVsdGEpc3VtKz1yZXZlcnNlU2VwP2RlbHRhOi1kZWx0YTtkZWx0YT0wO3JldHVybiBzdW19fWZ1bmN0aW9uIHdpZHRoKGcsdil7cmV0dXJuIGcubm9kZSh2KS53aWR0aH0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOX1dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKSxwb3NpdGlvblg9cmVxdWlyZSgiLi9iayIpLnBvc2l0aW9uWDttb2R1bGUuZXhwb3J0cz1wb3NpdGlvbjtmdW5jdGlvbiBwb3NpdGlvbihnKXtnPXV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO3Bvc2l0aW9uWShnKTtfLmZvckVhY2gocG9zaXRpb25YKGcpLGZ1bmN0aW9uKHgsdil7Zy5ub2RlKHYpLng9eH0pfWZ1bmN0aW9uIHBvc2l0aW9uWShnKXt2YXIgbGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpLHJhbmtTZXA9Zy5ncmFwaCgpLnJhbmtzZXAscHJldlk9MDtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe3ZhciBtYXhIZWlnaHQ9Xy5tYXgoXy5tYXAobGF5ZXIsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5oZWlnaHR9KSk7Cl8uZm9yRWFjaChsYXllcixmdW5jdGlvbih2KXtnLm5vZGUodikueT1wcmV2WSttYXhIZWlnaHQvMn0pO3ByZXZZKz1tYXhIZWlnaHQrcmFua1NlcH0pfX0seyIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9iayI6MjN9XSwyNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCxzbGFjaz1yZXF1aXJlKCIuL3V0aWwiKS5zbGFjazttb2R1bGUuZXhwb3J0cz1mZWFzaWJsZVRyZWU7ZnVuY3Rpb24gZmVhc2libGVUcmVlKGcpe3ZhciB0PW5ldyBHcmFwaCh7ZGlyZWN0ZWQ6ZmFsc2V9KTt2YXIgc3RhcnQ9Zy5ub2RlcygpWzBdLHNpemU9Zy5ub2RlQ291bnQoKTt0LnNldE5vZGUoc3RhcnQse30pO3ZhciBlZGdlLGRlbHRhO3doaWxlKHRpZ2h0VHJlZSh0LGcpPHNpemUpe2VkZ2U9ZmluZE1pblNsYWNrRWRnZSh0LGcpO2RlbHRhPXQuaGFzTm9kZShlZGdlLnYpPwpzbGFjayhnLGVkZ2UpOi1zbGFjayhnLGVkZ2UpO3NoaWZ0UmFua3ModCxnLGRlbHRhKX1yZXR1cm4gdH1mdW5jdGlvbiB0aWdodFRyZWUodCxnKXtmdW5jdGlvbiBkZnModil7Xy5mb3JFYWNoKGcubm9kZUVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVj1lLnYsdz12PT09ZWRnZVY/ZS53OmVkZ2VWO2lmKCF0Lmhhc05vZGUodykmJiFzbGFjayhnLGUpKXt0LnNldE5vZGUodyx7fSk7dC5zZXRFZGdlKHYsdyx7fSk7ZGZzKHcpfX0pfV8uZm9yRWFjaCh0Lm5vZGVzKCksZGZzKTtyZXR1cm4gdC5ub2RlQ291bnQoKX1mdW5jdGlvbiBmaW5kTWluU2xhY2tFZGdlKHQsZyl7cmV0dXJuIF8ubWluQnkoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2lmKHQuaGFzTm9kZShlLnYpIT09dC5oYXNOb2RlKGUudykpcmV0dXJuIHNsYWNrKGcsZSl9KX1mdW5jdGlvbiBzaGlmdFJhbmtzKHQsZyxkZWx0YSl7Xy5mb3JFYWNoKHQubm9kZXMoKSxmdW5jdGlvbih2KXtnLm5vZGUodikucmFuays9ZGVsdGF9KX0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI4fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciByYW5rVXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxsb25nZXN0UGF0aD1yYW5rVXRpbC5sb25nZXN0UGF0aCxmZWFzaWJsZVRyZWU9cmVxdWlyZSgiLi9mZWFzaWJsZS10cmVlIiksbmV0d29ya1NpbXBsZXg9cmVxdWlyZSgiLi9uZXR3b3JrLXNpbXBsZXgiKTttb2R1bGUuZXhwb3J0cz1yYW5rO2Z1bmN0aW9uIHJhbmsoZyl7c3dpdGNoKGcuZ3JhcGgoKS5yYW5rZXIpe2Nhc2UgIm5ldHdvcmstc2ltcGxleCI6bmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7YnJlYWs7Y2FzZSAidGlnaHQtdHJlZSI6dGlnaHRUcmVlUmFua2VyKGcpO2JyZWFrO2Nhc2UgImxvbmdlc3QtcGF0aCI6bG9uZ2VzdFBhdGhSYW5rZXIoZyk7YnJlYWs7ZGVmYXVsdDpuZXR3b3JrU2ltcGxleFJhbmtlcihnKX19dmFyIGxvbmdlc3RQYXRoUmFua2VyPWxvbmdlc3RQYXRoOwpmdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZyl7bG9uZ2VzdFBhdGgoZyk7ZmVhc2libGVUcmVlKGcpfWZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpe25ldHdvcmtTaW1wbGV4KGcpfX0seyIuL2ZlYXNpYmxlLXRyZWUiOjI1LCIuL25ldHdvcmstc2ltcGxleCI6MjcsIi4vdXRpbCI6Mjh9XSwyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksZmVhc2libGVUcmVlPXJlcXVpcmUoIi4vZmVhc2libGUtdHJlZSIpLHNsYWNrPXJlcXVpcmUoIi4vdXRpbCIpLnNsYWNrLGluaXRSYW5rPXJlcXVpcmUoIi4vdXRpbCIpLmxvbmdlc3RQYXRoLHByZW9yZGVyPXJlcXVpcmUoIi4uL2dyYXBobGliIikuYWxnLnByZW9yZGVyLHBvc3RvcmRlcj1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLmFsZy5wb3N0b3JkZXIsc2ltcGxpZnk9cmVxdWlyZSgiLi4vdXRpbCIpLnNpbXBsaWZ5O21vZHVsZS5leHBvcnRzPW5ldHdvcmtTaW1wbGV4OwpuZXR3b3JrU2ltcGxleC5pbml0TG93TGltVmFsdWVzPWluaXRMb3dMaW1WYWx1ZXM7bmV0d29ya1NpbXBsZXguaW5pdEN1dFZhbHVlcz1pbml0Q3V0VmFsdWVzO25ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZT1jYWxjQ3V0VmFsdWU7bmV0d29ya1NpbXBsZXgubGVhdmVFZGdlPWxlYXZlRWRnZTtuZXR3b3JrU2ltcGxleC5lbnRlckVkZ2U9ZW50ZXJFZGdlO25ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXM9ZXhjaGFuZ2VFZGdlcztmdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKXtnPXNpbXBsaWZ5KGcpO2luaXRSYW5rKGcpO3ZhciB0PWZlYXNpYmxlVHJlZShnKTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt2YXIgZSxmO3doaWxlKGU9bGVhdmVFZGdlKHQpKXtmPWVudGVyRWRnZSh0LGcsZSk7ZXhjaGFuZ2VFZGdlcyh0LGcsZSxmKX19ZnVuY3Rpb24gaW5pdEN1dFZhbHVlcyh0LGcpe3ZhciB2cz1wb3N0b3JkZXIodCx0Lm5vZGVzKCkpO3ZzPXZzLnNsaWNlKDAsCnZzLmxlbmd0aC0xKTtfLmZvckVhY2godnMsZnVuY3Rpb24odil7YXNzaWduQ3V0VmFsdWUodCxnLHYpfSl9ZnVuY3Rpb24gYXNzaWduQ3V0VmFsdWUodCxnLGNoaWxkKXt2YXIgY2hpbGRMYWI9dC5ub2RlKGNoaWxkKSxwYXJlbnQ9Y2hpbGRMYWIucGFyZW50O3QuZWRnZShjaGlsZCxwYXJlbnQpLmN1dHZhbHVlPWNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpfWZ1bmN0aW9uIGNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpe3ZhciBjaGlsZExhYj10Lm5vZGUoY2hpbGQpLHBhcmVudD1jaGlsZExhYi5wYXJlbnQsY2hpbGRJc1RhaWw9dHJ1ZSxncmFwaEVkZ2U9Zy5lZGdlKGNoaWxkLHBhcmVudCksY3V0VmFsdWU9MDtpZighZ3JhcGhFZGdlKXtjaGlsZElzVGFpbD1mYWxzZTtncmFwaEVkZ2U9Zy5lZGdlKHBhcmVudCxjaGlsZCl9Y3V0VmFsdWU9Z3JhcGhFZGdlLndlaWdodDtfLmZvckVhY2goZy5ub2RlRWRnZXMoY2hpbGQpLGZ1bmN0aW9uKGUpe3ZhciBpc091dEVkZ2U9ZS52PT09Y2hpbGQsb3RoZXI9CmlzT3V0RWRnZT9lLnc6ZS52O2lmKG90aGVyIT09cGFyZW50KXt2YXIgcG9pbnRzVG9IZWFkPWlzT3V0RWRnZT09PWNoaWxkSXNUYWlsLG90aGVyV2VpZ2h0PWcuZWRnZShlKS53ZWlnaHQ7Y3V0VmFsdWUrPXBvaW50c1RvSGVhZD9vdGhlcldlaWdodDotb3RoZXJXZWlnaHQ7aWYoaXNUcmVlRWRnZSh0LGNoaWxkLG90aGVyKSl7dmFyIG90aGVyQ3V0VmFsdWU9dC5lZGdlKGNoaWxkLG90aGVyKS5jdXR2YWx1ZTtjdXRWYWx1ZSs9cG9pbnRzVG9IZWFkPy1vdGhlckN1dFZhbHVlOm90aGVyQ3V0VmFsdWV9fX0pO3JldHVybiBjdXRWYWx1ZX1mdW5jdGlvbiBpbml0TG93TGltVmFsdWVzKHRyZWUscm9vdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJvb3Q9dHJlZS5ub2RlcygpWzBdO2Rmc0Fzc2lnbkxvd0xpbSh0cmVlLHt9LDEscm9vdCl9ZnVuY3Rpb24gZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHYscGFyZW50KXt2YXIgbG93PW5leHRMaW0sbGFiZWw9dHJlZS5ub2RlKHYpOwp2aXNpdGVkW3ZdPXRydWU7Xy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKW5leHRMaW09ZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHcsdil9KTtsYWJlbC5sb3c9bG93O2xhYmVsLmxpbT1uZXh0TGltKys7aWYocGFyZW50KWxhYmVsLnBhcmVudD1wYXJlbnQ7ZWxzZSBkZWxldGUgbGFiZWwucGFyZW50O3JldHVybiBuZXh0TGltfWZ1bmN0aW9uIGxlYXZlRWRnZSh0cmVlKXtyZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSxmdW5jdGlvbihlKXtyZXR1cm4gdHJlZS5lZGdlKGUpLmN1dHZhbHVlPDB9KX1mdW5jdGlvbiBlbnRlckVkZ2UodCxnLGVkZ2Upe3ZhciB2PWVkZ2Uudix3PWVkZ2UudztpZighZy5oYXNFZGdlKHYsdykpe3Y9ZWRnZS53O3c9ZWRnZS52fXZhciB2TGFiZWw9dC5ub2RlKHYpLHdMYWJlbD10Lm5vZGUodyksdGFpbExhYmVsPXZMYWJlbCxmbGlwPWZhbHNlO2lmKHZMYWJlbC5saW0+d0xhYmVsLmxpbSl7dGFpbExhYmVsPQp3TGFiZWw7ZmxpcD10cnVlfXZhciBjYW5kaWRhdGVzPV8uZmlsdGVyKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtyZXR1cm4gZmxpcD09PWlzRGVzY2VuZGFudCh0LHQubm9kZShlZGdlLnYpLHRhaWxMYWJlbCkmJmZsaXAhPT1pc0Rlc2NlbmRhbnQodCx0Lm5vZGUoZWRnZS53KSx0YWlsTGFiZWwpfSk7cmV0dXJuIF8ubWluQnkoY2FuZGlkYXRlcyxmdW5jdGlvbihlZGdlKXtyZXR1cm4gc2xhY2soZyxlZGdlKX0pfWZ1bmN0aW9uIGV4Y2hhbmdlRWRnZXModCxnLGUsZil7dmFyIHY9ZS52LHc9ZS53O3QucmVtb3ZlRWRnZSh2LHcpO3Quc2V0RWRnZShmLnYsZi53LHt9KTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt1cGRhdGVSYW5rcyh0LGcpfWZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsZyl7dmFyIHJvb3Q9Xy5maW5kKHQubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4hZy5ub2RlKHYpLnBhcmVudH0pLHZzPXByZW9yZGVyKHQscm9vdCk7dnM9dnMuc2xpY2UoMSk7Cl8uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXt2YXIgcGFyZW50PXQubm9kZSh2KS5wYXJlbnQsZWRnZT1nLmVkZ2UodixwYXJlbnQpLGZsaXBwZWQ9ZmFsc2U7aWYoIWVkZ2Upe2VkZ2U9Zy5lZGdlKHBhcmVudCx2KTtmbGlwcGVkPXRydWV9Zy5ub2RlKHYpLnJhbms9Zy5ub2RlKHBhcmVudCkucmFuaysoZmxpcHBlZD9lZGdlLm1pbmxlbjotZWRnZS5taW5sZW4pfSl9ZnVuY3Rpb24gaXNUcmVlRWRnZSh0cmVlLHUsdil7cmV0dXJuIHRyZWUuaGFzRWRnZSh1LHYpfWZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLHZMYWJlbCxyb290TGFiZWwpe3JldHVybiByb290TGFiZWwubG93PD12TGFiZWwubGltJiZ2TGFiZWwubGltPD1yb290TGFiZWwubGltfX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vZmVhc2libGUtdHJlZSI6MjUsIi4vdXRpbCI6Mjh9XSwyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7Cm1vZHVsZS5leHBvcnRzPXtsb25nZXN0UGF0aDpsb25nZXN0UGF0aCxzbGFjazpzbGFja307ZnVuY3Rpb24gbG9uZ2VzdFBhdGgoZyl7dmFyIHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe3ZhciBsYWJlbD1nLm5vZGUodik7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm4gbGFiZWwucmFuazt2aXNpdGVkW3ZdPXRydWU7dmFyIHJhbms9Xy5taW5CeShfLm1hcChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3JldHVybiBkZnMoZS53KS1nLmVkZ2UoZSkubWlubGVufSkpO2lmKHJhbms9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl8fHJhbms9PT11bmRlZmluZWR8fHJhbms9PT1udWxsKXJhbms9MDtyZXR1cm4gbGFiZWwucmFuaz1yYW5rfV8uZm9yRWFjaChnLnNvdXJjZXMoKSxkZnMpfWZ1bmN0aW9uIHNsYWNrKGcsZSl7cmV0dXJuIGcubm9kZShlLncpLnJhbmstZy5ub2RlKGUudikucmFuay1nLmVkZ2UoZSkubWlubGVufX0seyIuLi9sb2Rhc2giOjEwfV0sMjk6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz17YWRkRHVtbXlOb2RlOmFkZER1bW15Tm9kZSxzaW1wbGlmeTpzaW1wbGlmeSxhc05vbkNvbXBvdW5kR3JhcGg6YXNOb25Db21wb3VuZEdyYXBoLHN1Y2Nlc3NvcldlaWdodHM6c3VjY2Vzc29yV2VpZ2h0cyxwcmVkZWNlc3NvcldlaWdodHM6cHJlZGVjZXNzb3JXZWlnaHRzLGludGVyc2VjdFJlY3Q6aW50ZXJzZWN0UmVjdCxidWlsZExheWVyTWF0cml4OmJ1aWxkTGF5ZXJNYXRyaXgsbm9ybWFsaXplUmFua3M6bm9ybWFsaXplUmFua3MscmVtb3ZlRW1wdHlSYW5rczpyZW1vdmVFbXB0eVJhbmtzLGFkZEJvcmRlck5vZGU6YWRkQm9yZGVyTm9kZSxtYXhSYW5rOm1heFJhbmsscGFydGl0aW9uOnBhcnRpdGlvbix0aW1lOnRpbWUsbm90aW1lOm5vdGltZX07ZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsdHlwZSxhdHRycyxuYW1lKXt2YXIgdjsKZG8gdj1fLnVuaXF1ZUlkKG5hbWUpO3doaWxlKGcuaGFzTm9kZSh2KSk7YXR0cnMuZHVtbXk9dHlwZTtnLnNldE5vZGUodixhdHRycyk7cmV0dXJuIHZ9ZnVuY3Rpb24gc2ltcGxpZnkoZyl7dmFyIHNpbXBsaWZpZWQ9KG5ldyBHcmFwaCkuc2V0R3JhcGgoZy5ncmFwaCgpKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3NpbXBsaWZpZWQuc2V0Tm9kZSh2LGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBzaW1wbGVMYWJlbD1zaW1wbGlmaWVkLmVkZ2UoZS52LGUudyl8fHt3ZWlnaHQ6MCxtaW5sZW46MX0sbGFiZWw9Zy5lZGdlKGUpO3NpbXBsaWZpZWQuc2V0RWRnZShlLnYsZS53LHt3ZWlnaHQ6c2ltcGxlTGFiZWwud2VpZ2h0K2xhYmVsLndlaWdodCxtaW5sZW46TWF0aC5tYXgoc2ltcGxlTGFiZWwubWlubGVuLGxhYmVsLm1pbmxlbil9KX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIGFzTm9uQ29tcG91bmRHcmFwaChnKXt2YXIgc2ltcGxpZmllZD0KKG5ldyBHcmFwaCh7bXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpfSkpLnNldEdyYXBoKGcuZ3JhcGgoKSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZighZy5jaGlsZHJlbih2KS5sZW5ndGgpc2ltcGxpZmllZC5zZXROb2RlKHYsZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c2ltcGxpZmllZC5zZXRFZGdlKGUsZy5lZGdlKGUpKX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIHN1Y2Nlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHN1Y3M9e307Xy5mb3JFYWNoKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7c3Vjc1tlLnddPShzdWNzW2Uud118fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gc3Vjc30pO3JldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksd2VpZ2h0TWFwKX1mdW5jdGlvbiBwcmVkZWNlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksCmZ1bmN0aW9uKHYpe3ZhciBwcmVkcz17fTtfLmZvckVhY2goZy5pbkVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ByZWRzW2Uudl09KHByZWRzW2Uudl18fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gcHJlZHN9KTtyZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLHdlaWdodE1hcCl9ZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LHBvaW50KXt2YXIgeD1yZWN0Lng7dmFyIHk9cmVjdC55O3ZhciBkeD1wb2ludC54LXg7dmFyIGR5PXBvaW50LnkteTt2YXIgdz1yZWN0LndpZHRoLzI7dmFyIGg9cmVjdC5oZWlnaHQvMjtpZighZHgmJiFkeSl0aHJvdyBuZXcgRXJyb3IoIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZSIpO3ZhciBzeCxzeTtpZihNYXRoLmFicyhkeSkqdz5NYXRoLmFicyhkeCkqaCl7aWYoZHk8MCloPS1oO3N4PWgqZHgvZHk7c3k9aH1lbHNle2lmKGR4PDApdz0tdztzeD13O3N5PXcqZHkvZHh9cmV0dXJue3g6eCsKc3gseTp5K3N5fX1mdW5jdGlvbiBidWlsZExheWVyTWF0cml4KGcpe3ZhciBsYXllcmluZz1fLm1hcChfLnJhbmdlKG1heFJhbmsoZykrMSksZnVuY3Rpb24oKXtyZXR1cm5bXX0pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLHJhbms9bm9kZS5yYW5rO2lmKCFfLmlzVW5kZWZpbmVkKHJhbmspKWxheWVyaW5nW3JhbmtdW25vZGUub3JkZXJdPXZ9KTtyZXR1cm4gbGF5ZXJpbmd9ZnVuY3Rpb24gbm9ybWFsaXplUmFua3MoZyl7dmFyIG1pbj1fLm1pbkJ5KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYoXy5oYXMobm9kZSwicmFuayIpKW5vZGUucmFuay09bWlufSl9ZnVuY3Rpb24gcmVtb3ZlRW1wdHlSYW5rcyhnKXt2YXIgb2Zmc2V0PV8ubWluQnkoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKTsKdmFyIGxheWVycz1bXTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciByYW5rPWcubm9kZSh2KS5yYW5rLW9mZnNldDtpZighbGF5ZXJzW3JhbmtdKWxheWVyc1tyYW5rXT1bXTtsYXllcnNbcmFua10ucHVzaCh2KX0pO3ZhciBkZWx0YT0wLG5vZGVSYW5rRmFjdG9yPWcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtfLmZvckVhY2gobGF5ZXJzLGZ1bmN0aW9uKHZzLGkpe2lmKF8uaXNVbmRlZmluZWQodnMpJiZpJW5vZGVSYW5rRmFjdG9yIT09MCktLWRlbHRhO2Vsc2UgaWYoZGVsdGEpXy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS5yYW5rKz1kZWx0YX0pfSl9ZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLHByZWZpeCxyYW5rLG9yZGVyKXt2YXIgbm9kZT17d2lkdGg6MCxoZWlnaHQ6MH07aWYoYXJndW1lbnRzLmxlbmd0aD49NCl7bm9kZS5yYW5rPXJhbms7bm9kZS5vcmRlcj1vcmRlcn1yZXR1cm4gYWRkRHVtbXlOb2RlKGcsImJvcmRlciIsbm9kZSxwcmVmaXgpfQpmdW5jdGlvbiBtYXhSYW5rKGcpe3JldHVybiBfLm1heChfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHJhbms9Zy5ub2RlKHYpLnJhbms7aWYoIV8uaXNVbmRlZmluZWQocmFuaykpcmV0dXJuIHJhbmt9KSl9ZnVuY3Rpb24gcGFydGl0aW9uKGNvbGxlY3Rpb24sZm4pe3ZhciByZXN1bHQ9e2xoczpbXSxyaHM6W119O18uZm9yRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlKXtpZihmbih2YWx1ZSkpcmVzdWx0Lmxocy5wdXNoKHZhbHVlKTtlbHNlIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRpbWUobmFtZSxmbil7dmFyIHN0YXJ0PV8ubm93KCk7dHJ5e3JldHVybiBmbigpfWZpbmFsbHl7Y29uc29sZS5sb2cobmFtZSsiIHRpbWU6ICIrKF8ubm93KCktc3RhcnQpKyJtcyIpfX1mdW5jdGlvbiBub3RpbWUobmFtZSxmbil7cmV0dXJuIGZuKCl9fSx7Ii4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDMwOltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9IjAuOC4yIn0se31dfSx7fSxbMV0pKDEpfSk7PC9zY3JpcHQ+PHNjcmlwdD4vL35+V0VCUEFUSH5+ZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvYmFzZS5qcwondXNlIHN0cmljdCc7dmFyIE07ZnVuY3Rpb24gdWEoYSl7dmFyIGM9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYzxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2MrK119Ontkb25lOiEwfX19ZnVuY3Rpb24gUGEoYSl7cmV0dXJue25leHQ6dWEoYSl9fWZ1bmN0aW9uIGpiKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYz9jLmNhbGwoYSk6UGEoYSl9CnZhciBrYj1mdW5jdGlvbihhKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09YT9hOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOmF9KHRoaXMpLG1iPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYSxjLGQpe2EhPUFycmF5LnByb3RvdHlwZSYmYSE9T2JqZWN0LnByb3RvdHlwZSYmKGFbY109ZC52YWx1ZSl9O2Z1bmN0aW9uIHNiKGEsYyl7aWYoYyl7dmFyIGQ9a2I7YT1hLnNwbGl0KCIuIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aC0xO2YrKyl7dmFyIGc9YVtmXTtnIGluIGR8fChkW2ddPXt9KTtkPWRbZ119YT1hW2EubGVuZ3RoLTFdO2Y9ZFthXTtjPWMoZik7YyE9ZiYmbnVsbCE9YyYmbWIoZCxhLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Y30pfX0Kc2IoIlByb21pc2UiLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobSl7dGhpcy5zdGF0ZV89MDt0aGlzLnJlc3VsdF89dm9pZCAwO3RoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz1bXTt2YXIgcD10aGlzLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfKCk7dHJ5e20ocC5yZXNvbHZlLHAucmVqZWN0KX1jYXRjaChxKXtwLnJlamVjdChxKX19ZnVuY3Rpb24gZCgpe3RoaXMuYmF0Y2hfPW51bGx9ZnVuY3Rpb24gZihtKXtzd2l0Y2godHlwZW9mIG0pe2Nhc2UgIm9iamVjdCI6cmV0dXJuIG51bGwhPW07Y2FzZSAiZnVuY3Rpb24iOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIGcobSl7cmV0dXJuIG0gaW5zdGFuY2VvZiBjP206bmV3IGMoZnVuY3Rpb24ocCl7cChtKX0pfWlmKGEpcmV0dXJuIGE7ZC5wcm90b3R5cGUuYXN5bmNFeGVjdXRlPWZ1bmN0aW9uKG0pe2lmKG51bGw9PXRoaXMuYmF0Y2hfKXt0aGlzLmJhdGNoXz1bXTt2YXIgcD10aGlzO3RoaXMuYXN5bmNFeGVjdXRlRnVuY3Rpb24oZnVuY3Rpb24oKXtwLmV4ZWN1dGVCYXRjaF8oKX0pfXRoaXMuYmF0Y2hfLnB1c2gobSl9Owp2YXIgbD1rYi5zZXRUaW1lb3V0O2QucHJvdG90eXBlLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uPWZ1bmN0aW9uKG0pe2wobSwwKX07ZC5wcm90b3R5cGUuZXhlY3V0ZUJhdGNoXz1mdW5jdGlvbigpe2Zvcig7dGhpcy5iYXRjaF8mJnRoaXMuYmF0Y2hfLmxlbmd0aDspe3ZhciBtPXRoaXMuYmF0Y2hfO3RoaXMuYmF0Y2hfPVtdO2Zvcih2YXIgcD0wO3A8bS5sZW5ndGg7KytwKXt2YXIgcT1tW3BdO21bcF09bnVsbDt0cnl7cSgpfWNhdGNoKHIpe3RoaXMuYXN5bmNUaHJvd18ocil9fX10aGlzLmJhdGNoXz1udWxsfTtkLnByb3RvdHlwZS5hc3luY1Rocm93Xz1mdW5jdGlvbihtKXt0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCl7dGhyb3cgbTt9KX07Yy5wcm90b3R5cGUuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF89ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKHIpe3JldHVybiBmdW5jdGlvbih0KXtxfHwocT0hMCxyLmNhbGwocCx0KSl9fXZhciBwPXRoaXMscT0hMTtyZXR1cm57cmVzb2x2ZTptKHRoaXMucmVzb2x2ZVRvXyksCnJlamVjdDptKHRoaXMucmVqZWN0Xyl9fTtjLnByb3RvdHlwZS5yZXNvbHZlVG9fPWZ1bmN0aW9uKG0pe209PT10aGlzP3RoaXMucmVqZWN0XyhuZXcgVHlwZUVycm9yKCJBIFByb21pc2UgY2Fubm90IHJlc29sdmUgdG8gaXRzZWxmIikpOm0gaW5zdGFuY2VvZiBjP3RoaXMuc2V0dGxlU2FtZUFzUHJvbWlzZV8obSk6ZihtKT90aGlzLnJlc29sdmVUb05vblByb21pc2VPYmpfKG0pOnRoaXMuZnVsZmlsbF8obSl9O2MucHJvdG90eXBlLnJlc29sdmVUb05vblByb21pc2VPYmpfPWZ1bmN0aW9uKG0pe3ZhciBwPXZvaWQgMDt0cnl7cD1tLnRoZW59Y2F0Y2gocSl7dGhpcy5yZWplY3RfKHEpO3JldHVybn0iZnVuY3Rpb24iPT10eXBlb2YgcD90aGlzLnNldHRsZVNhbWVBc1RoZW5hYmxlXyhwLG0pOnRoaXMuZnVsZmlsbF8obSl9O2MucHJvdG90eXBlLnJlamVjdF89ZnVuY3Rpb24obSl7dGhpcy5zZXR0bGVfKDIsbSl9O2MucHJvdG90eXBlLmZ1bGZpbGxfPWZ1bmN0aW9uKG0pe3RoaXMuc2V0dGxlXygxLAptKX07Yy5wcm90b3R5cGUuc2V0dGxlXz1mdW5jdGlvbihtLHApe2lmKDAhPXRoaXMuc3RhdGVfKXRocm93IEVycm9yKCJDYW5ub3Qgc2V0dGxlKCIrbSsiLCAiK3ArIik6IFByb21pc2UgYWxyZWFkeSBzZXR0bGVkIGluIHN0YXRlIit0aGlzLnN0YXRlXyk7dGhpcy5zdGF0ZV89bTt0aGlzLnJlc3VsdF89cDt0aGlzLmV4ZWN1dGVPblNldHRsZWRDYWxsYmFja3NfKCl9O2MucHJvdG90eXBlLmV4ZWN1dGVPblNldHRsZWRDYWxsYmFja3NfPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5vblNldHRsZWRDYWxsYmFja3NfKXtmb3IodmFyIG09MDttPHRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXy5sZW5ndGg7KyttKWsuYXN5bmNFeGVjdXRlKHRoaXMub25TZXR0bGVkQ2FsbGJhY2tzX1ttXSk7dGhpcy5vblNldHRsZWRDYWxsYmFja3NfPW51bGx9fTt2YXIgaz1uZXcgZDtjLnByb3RvdHlwZS5zZXR0bGVTYW1lQXNQcm9taXNlXz1mdW5jdGlvbihtKXt2YXIgcD10aGlzLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfKCk7Cm0uY2FsbFdoZW5TZXR0bGVkXyhwLnJlc29sdmUscC5yZWplY3QpfTtjLnByb3RvdHlwZS5zZXR0bGVTYW1lQXNUaGVuYWJsZV89ZnVuY3Rpb24obSxwKXt2YXIgcT10aGlzLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfKCk7dHJ5e20uY2FsbChwLHEucmVzb2x2ZSxxLnJlamVjdCl9Y2F0Y2gocil7cS5yZWplY3Qocil9fTtjLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKG0scCl7ZnVuY3Rpb24gcShBLHkpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBBP2Z1bmN0aW9uKHgpe3RyeXtyKEEoeCkpfWNhdGNoKEMpe3QoQyl9fTp5fXZhciByLHQsdj1uZXcgYyhmdW5jdGlvbihBLHkpe3I9QTt0PXl9KTt0aGlzLmNhbGxXaGVuU2V0dGxlZF8ocShtLHIpLHEocCx0KSk7cmV0dXJuIHZ9O2MucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLG0pfTtjLnByb3RvdHlwZS5jYWxsV2hlblNldHRsZWRfPWZ1bmN0aW9uKG0scCl7ZnVuY3Rpb24gcSgpe3N3aXRjaChyLnN0YXRlXyl7Y2FzZSAxOm0oci5yZXN1bHRfKTsKYnJlYWs7Y2FzZSAyOnAoci5yZXN1bHRfKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbmV4cGVjdGVkIHN0YXRlOiAiK3Iuc3RhdGVfKTt9fXZhciByPXRoaXM7bnVsbD09dGhpcy5vblNldHRsZWRDYWxsYmFja3NfP2suYXN5bmNFeGVjdXRlKHEpOnRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXy5wdXNoKHEpfTtjLnJlc29sdmU9ZztjLnJlamVjdD1mdW5jdGlvbihtKXtyZXR1cm4gbmV3IGMoZnVuY3Rpb24ocCxxKXtxKG0pfSl9O2MucmFjZT1mdW5jdGlvbihtKXtyZXR1cm4gbmV3IGMoZnVuY3Rpb24ocCxxKXtmb3IodmFyIHI9amIobSksdD1yLm5leHQoKTshdC5kb25lO3Q9ci5uZXh0KCkpZyh0LnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKHAscSl9KX07Yy5hbGw9ZnVuY3Rpb24obSl7dmFyIHA9amIobSkscT1wLm5leHQoKTtyZXR1cm4gcS5kb25lP2coW10pOm5ldyBjKGZ1bmN0aW9uKHIsdCl7ZnVuY3Rpb24gdih4KXtyZXR1cm4gZnVuY3Rpb24oQyl7QVt4XT1DO3ktLTswPT0KeSYmcihBKX19dmFyIEE9W10seT0wO2RvIEEucHVzaCh2b2lkIDApLHkrKyxnKHEudmFsdWUpLmNhbGxXaGVuU2V0dGxlZF8odihBLmxlbmd0aC0xKSx0KSxxPXAubmV4dCgpO3doaWxlKCFxLmRvbmUpfSl9O3JldHVybiBjfSk7c2IoIlByb21pc2UucHJvdG90eXBlLmZpbmFsbHkiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihkKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGMoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBkfSl9LGZ1bmN0aW9uKGQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoYygpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgZDt9KX0pfX0pOwpmdW5jdGlvbiB3YihhKXtmdW5jdGlvbiBjKGYpe3JldHVybiBhLm5leHQoZil9ZnVuY3Rpb24gZChmKXtyZXR1cm4gYS50aHJvdyhmKX1yZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZixnKXtmdW5jdGlvbiBsKGspe2suZG9uZT9mKGsudmFsdWUpOlByb21pc2UucmVzb2x2ZShrLnZhbHVlKS50aGVuKGMsZCkudGhlbihsLGcpfWwoYS5uZXh0KCkpfSl9ZnVuY3Rpb24gRGIoYSl7cmV0dXJuIHdiKGEoKSl9ZnVuY3Rpb24gRWIoYSl7cmV0dXJuIHZvaWQgMCE9PWF9ZnVuY3Rpb24gR2IoYSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhfQpmdW5jdGlvbiBJYihhKXt2YXIgYz10eXBlb2YgYTtpZigib2JqZWN0Ij09YylpZihhKXtpZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuImFycmF5IjtpZihhIGluc3RhbmNlb2YgT2JqZWN0KXJldHVybiBjO3ZhciBkPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTtpZigiW29iamVjdCBXaW5kb3ddIj09ZClyZXR1cm4ib2JqZWN0IjtpZigiW29iamVjdCBBcnJheV0iPT1kfHwibnVtYmVyIj09dHlwZW9mIGEubGVuZ3RoJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuc3BsaWNlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEucHJvcGVydHlJc0VudW1lcmFibGUmJiFhLnByb3BlcnR5SXNFbnVtZXJhYmxlKCJzcGxpY2UiKSlyZXR1cm4iYXJyYXkiO2lmKCJbb2JqZWN0IEZ1bmN0aW9uXSI9PWR8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5jYWxsJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEucHJvcGVydHlJc0VudW1lcmFibGUmJiFhLnByb3BlcnR5SXNFbnVtZXJhYmxlKCJjYWxsIikpcmV0dXJuImZ1bmN0aW9uIn1lbHNlIHJldHVybiJudWxsIjsKZWxzZSBpZigiZnVuY3Rpb24iPT1jJiYidW5kZWZpbmVkIj09dHlwZW9mIGEuY2FsbClyZXR1cm4ib2JqZWN0IjtyZXR1cm4gY31mdW5jdGlvbiBKYihhKXtyZXR1cm4gbnVsbD09PWF9ZnVuY3Rpb24gTmIoYSl7cmV0dXJuImFycmF5Ij09SWIoYSl9ZnVuY3Rpb24gUWIoYSxjKXtmdW5jdGlvbiBkKCl7fWQucHJvdG90eXBlPWMucHJvdG90eXBlO2Euc3VwZXJDbGFzc189Yy5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGQ7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YTthLmJhc2U9ZnVuY3Rpb24oZixnLGwpe2Zvcih2YXIgaz1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLG09MjttPGFyZ3VtZW50cy5sZW5ndGg7bSsrKWtbbS0yXT1hcmd1bWVudHNbbV07cmV0dXJuIGMucHJvdG90eXBlW2ddLmFwcGx5KGYsayl9fTsKLy9+fldFQlBBVEh+fmV4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL3RyYW5zaXRpb25hbGZvcndhcmRkZWNsYXJhdGlvbnMuanMKLy9+fldFQlBBVEh+fmV4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlYnVnL2Vycm9yLmpzCmZ1bmN0aW9uIFRiKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsVGIpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7dGhpcy5yZXBvcnRFcnJvclRvU2VydmVyPSEwfVFiKFRiLEVycm9yKTtUYi5wcm90b3R5cGUubmFtZT0iQ3VzdG9tRXJyb3IiOwovL35+V0VCUEFUSH5+ZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvZG9tL25vZGV0eXBlLmpzCi8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9hc3NlcnRzL2Fzc2VydHMuanMKZnVuY3Rpb24gVWIoYSxjKXtUYi5jYWxsKHRoaXMsWGIoYSxjKSk7dGhpcy5tZXNzYWdlUGF0dGVybj1hfVFiKFViLFRiKTtVYi5wcm90b3R5cGUubmFtZT0iQXNzZXJ0aW9uRXJyb3IiO2Z1bmN0aW9uIFliKGEpe3Rocm93IGE7fWZ1bmN0aW9uIFhiKGEsYyl7YT1hLnNwbGl0KCIlcyIpO2Zvcih2YXIgZD0iIixmPWEubGVuZ3RoLTEsZz0wO2c8ZjtnKyspZCs9YVtnXSsoZzxjLmxlbmd0aD9jW2ddOiIlcyIpO3JldHVybiBkK2FbZl19ZnVuY3Rpb24gYmMoYSxjKXtZYihuZXcgVWIoIkZhaWx1cmUiKyhhPyI6ICIrYToiIiksQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKSl9OwovL35+V0VCUEFUSH5+ZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvYXJyYXkvYXJyYXkuanMKdmFyIGRjPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYyl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGMsdm9pZCAwKX06ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZj1HYihhKT9hLnNwbGl0KCIiKTphLGc9MDtnPGQ7ZysrKWcgaW4gZiYmYy5jYWxsKHZvaWQgMCxmW2ddLGcsYSl9LGVjPUFycmF5LnByb3RvdHlwZS5tYXA/ZnVuY3Rpb24oYSxjKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGEsYyx2b2lkIDApfTpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZD1hLmxlbmd0aCxmPUFycmF5KGQpLGc9R2IoYSk/YS5zcGxpdCgiIik6YSxsPTA7bDxkO2wrKylsIGluIGcmJihmW2xdPWMuY2FsbCh2b2lkIDAsZ1tsXSxsLGEpKTtyZXR1cm4gZn07CmZ1bmN0aW9uIGhjKGEsYyxkKXtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGMpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYyxkKX07Ci8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9jcnlwdC9jcnlwdC5qcwpmdW5jdGlvbiBpYyhhKXtpZig4MTkyPj1hLmxlbmd0aClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEpO2Zvcih2YXIgYz0iIixkPTA7ZDxhLmxlbmd0aDtkKz04MTkyKWMrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxoYyhhLGQsZCs4MTkyKSk7cmV0dXJuIGN9OwovL35+V0VCUEFUSH5+ZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvc3RyaW5nL2ludGVybmFsLmpzCmZ1bmN0aW9uIG5jKGEpe3JldHVybi9eW1xzXHhhMF0qJC8udGVzdChhKX07Ci8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9zdHJpbmcvc3RyaW5nLmpzCi8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9sYWJzL3VzZXJhZ2VudC91dGlsLmpzCi8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9vYmplY3Qvb2JqZWN0LmpzCi8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9sYWJzL3VzZXJhZ2VudC9icm93c2VyLmpzCi8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9sYWJzL3VzZXJhZ2VudC9lbmdpbmUuanMKLy9+fldFQlBBVEh+fmV4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2xhYnMvdXNlcmFnZW50L3BsYXRmb3JtLmpzCi8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9yZWZsZWN0L3JlZmxlY3QuanMKLy9+fldFQlBBVEh+fmV4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL3VzZXJhZ2VudC91c2VyYWdlbnQuanMKLy9+fldFQlBBVEh+fmV4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL3VzZXJhZ2VudC9wcm9kdWN0LmpzCi8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9jcnlwdC9iYXNlNjQuanMKdmFyIG9jPW51bGwscGM9bnVsbCxxYz1udWxsO2Z1bmN0aW9uIHRjKGEsYyl7eWMoKTtjPWM/cWM6b2M7Zm9yKHZhciBkPVtdLGY9MDtmPGEubGVuZ3RoO2YrPTMpe3ZhciBnPWFbZl0sbD1mKzE8YS5sZW5ndGgsaz1sP2FbZisxXTowLG09ZisyPGEubGVuZ3RoLHA9bT9hW2YrMl06MCxxPWc+PjI7Zz0oZyYzKTw8NHxrPj40O2s9KGsmMTUpPDwyfHA+PjY7cCY9NjM7bXx8KHA9NjQsbHx8KGs9NjQpKTtkLnB1c2goY1txXSxjW2ddLGNba10sY1twXSl9cmV0dXJuIGQuam9pbigiIil9ZnVuY3Rpb24gRmMoYSl7dmFyIGM9YS5sZW5ndGgsZD0wOyJceDNkIj09PWFbYy0yXT9kPTI6Ilx4M2QiPT09YVtjLTFdJiYoZD0xKTt2YXIgZj1uZXcgVWludDhBcnJheShNYXRoLmNlaWwoMypjLzQpLWQpLGc9MDtHYyhhLGZ1bmN0aW9uKGwpe2ZbZysrXT1sfSk7cmV0dXJuIGYuc3ViYXJyYXkoMCxnKX0KZnVuY3Rpb24gR2MoYSxjKXtmdW5jdGlvbiBkKHApe2Zvcig7ZjxhLmxlbmd0aDspe3ZhciBxPWEuY2hhckF0KGYrKykscj1wY1txXTtpZihudWxsIT1yKXJldHVybiByO2lmKCFuYyhxKSl0aHJvdyBFcnJvcigiVW5rbm93biBiYXNlNjQgZW5jb2RpbmcgYXQgY2hhcjogIitxKTt9cmV0dXJuIHB9eWMoKTtmb3IodmFyIGY9MDs7KXt2YXIgZz1kKC0xKSxsPWQoMCksaz1kKDY0KSxtPWQoNjQpO2lmKDY0PT09bSYmLTE9PT1nKWJyZWFrO2MoZzw8MnxsPj40KTs2NCE9ayYmKGMobDw8NCYyNDB8az4+MiksNjQhPW0mJmMoazw8NiYxOTJ8bSkpfX0KZnVuY3Rpb24geWMoKXtpZighb2Mpe29jPXt9O3BjPXt9O3FjPXt9O2Zvcih2YXIgYT0wOzY1PmE7YSsrKW9jW2FdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXHgzZCIuY2hhckF0KGEpLHBjW29jW2FdXT1hLHFjW2FdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fLiIuY2hhckF0KGEpLDYyPD1hJiYocGNbIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8uIi5jaGFyQXQoYSldPWEpfX07Ci8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS9hcml0aC5qcwpmdW5jdGlvbiBIYyhhLGMpe3RoaXMubG89YTt0aGlzLmhpPWN9TT1IYy5wcm90b3R5cGU7TS5jbXA9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaGk8YS5oaXx8dGhpcy5oaT09YS5oaSYmdGhpcy5sbzxhLmxvPy0xOnRoaXMuaGk9PWEuaGkmJnRoaXMubG89PWEubG8/MDoxfTtNLnJpZ2h0U2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEhjKCh0aGlzLmxvPj4+MXwodGhpcy5oaSYxKTw8MzEpPj4+MCx0aGlzLmhpPj4+MT4+PjApfTtNLmxlZnRTaGlmdD1mdW5jdGlvbigpe3JldHVybiBuZXcgSGModGhpcy5sbzw8MT4+PjAsKHRoaXMuaGk8PDF8dGhpcy5sbz4+PjMxKT4+PjApfTtNLm1zYj1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuaGkmMjE0NzQ4MzY0OCl9O00ubHNiPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5sbyYxKX07TS56ZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PXRoaXMubG8mJjA9PXRoaXMuaGl9OwpNLmFkZD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEhjKCh0aGlzLmxvK2EubG8mNDI5NDk2NzI5NSk+Pj4wPj4+MCwoKHRoaXMuaGkrYS5oaSY0Mjk0OTY3Mjk1KT4+PjApKyg0Mjk0OTY3Mjk2PD10aGlzLmxvK2EubG8/MTowKT4+PjApfTtNLnN1Yj1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEhjKCh0aGlzLmxvLWEubG8mNDI5NDk2NzI5NSk+Pj4wPj4+MCwoKHRoaXMuaGktYS5oaSY0Mjk0OTY3Mjk1KT4+PjApLSgwPnRoaXMubG8tYS5sbz8xOjApPj4+MCl9O2Z1bmN0aW9uIEpjKGEpe3ZhciBjPWEmNjU1MzUsZD1hPj4+MTY7YT0xMCpjKzY1NTM2KigwKmMmNjU1MzUpKzY1NTM2KigxMCpkJjY1NTM1KTtmb3IoYz0wKmQrKDAqYz4+PjE2KSsoMTAqZD4+PjE2KTs0Mjk0OTY3Mjk2PD1hOylhLT00Mjk0OTY3Mjk2LGMrPTE7cmV0dXJuIG5ldyBIYyhhPj4+MCxjPj4+MCl9Ck0ubXVsPWZ1bmN0aW9uKCl7dmFyIGE9SmModGhpcy5sbyksYz1KYyh0aGlzLmhpKTtjLmhpPWMubG87Yy5sbz0wO3JldHVybiBhLmFkZChjKX07TS5kaXY9ZnVuY3Rpb24oKXtmb3IodmFyIGE9bmV3IEhjKDAsMCksYz1uZXcgSGModGhpcy5sbyx0aGlzLmhpKSxkPW5ldyBIYygxMCwwKSxmPW5ldyBIYygxLDApOyFkLm1zYigpOylkPWQubGVmdFNoaWZ0KCksZj1mLmxlZnRTaGlmdCgpO2Zvcig7IWYuemVybygpOykwPj1kLmNtcChjKSYmKGE9YS5hZGQoZiksYz1jLnN1YihkKSksZD1kLnJpZ2h0U2hpZnQoKSxmPWYucmlnaHRTaGlmdCgpO3JldHVyblthLGNdfTtNLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPSIiLGM9dGhpczshYy56ZXJvKCk7KXtjPWMuZGl2KCk7dmFyIGQ9Y1swXTthPWNbMV0ubG8rYTtjPWR9IiI9PWEmJihhPSIwIik7cmV0dXJuIGF9OwpmdW5jdGlvbiBLYyhhKXtmb3IodmFyIGM9bmV3IEhjKDAsMCksZD1uZXcgSGMoMCwwKSxmPTA7ZjxhLmxlbmd0aDtmKyspe2lmKCIwIj5hW2ZdfHwiOSI8YVtmXSlyZXR1cm4gbnVsbDtkLmxvPXBhcnNlSW50KGFbZl0sMTApO2M9Yy5tdWwoKS5hZGQoZCl9cmV0dXJuIGN9TS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgSGModGhpcy5sbyx0aGlzLmhpKX07ZnVuY3Rpb24gTGMoYSxjKXt0aGlzLmxvPWE7dGhpcy5oaT1jfUxjLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBMYygodGhpcy5sbythLmxvJjQyOTQ5NjcyOTUpPj4+MD4+PjAsKCh0aGlzLmhpK2EuaGkmNDI5NDk2NzI5NSk+Pj4wKSsoNDI5NDk2NzI5Njw9dGhpcy5sbythLmxvPzE6MCk+Pj4wKX07CkxjLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBMYygodGhpcy5sby1hLmxvJjQyOTQ5NjcyOTUpPj4+MD4+PjAsKCh0aGlzLmhpLWEuaGkmNDI5NDk2NzI5NSk+Pj4wKS0oMD50aGlzLmxvLWEubG8/MTowKT4+PjApfTtMYy5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IExjKHRoaXMubG8sdGhpcy5oaSl9O0xjLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPTAhPSh0aGlzLmhpJjIxNDc0ODM2NDgpLGM9bmV3IEhjKHRoaXMubG8sdGhpcy5oaSk7YSYmKGM9KG5ldyBIYygwLDApKS5zdWIoYykpO3JldHVybihhPyItIjoiIikrYy50b1N0cmluZygpfTtmdW5jdGlvbiBNYyhhKXt2YXIgYz0wPGEubGVuZ3RoJiYiLSI9PWFbMF07YyYmKGE9YS5zdWJzdHJpbmcoMSkpO2E9S2MoYSk7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7YyYmKGE9KG5ldyBIYygwLDApKS5zdWIoYSkpO3JldHVybiBuZXcgTGMoYS5sbyxhLmhpKX07Ci8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS9jb25zdGFudHMuanMKZnVuY3Rpb24gTmMoYSl7c3dpdGNoKGEpe2Nhc2UgNTpjYXNlIDM6Y2FzZSAxMzpjYXNlIDQ6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgODpjYXNlIDE0OmNhc2UgMzE6cmV0dXJuIDA7Y2FzZSAxOmNhc2UgNjpjYXNlIDE2OmNhc2UgMzA6cmV0dXJuIDE7Y2FzZSA5OmNhc2UgMTE6Y2FzZSAxMjpyZXR1cm4gMjtjYXNlIDI6Y2FzZSA3OmNhc2UgMTU6cmV0dXJuIDU7ZGVmYXVsdDpyZXR1cm4tMX19OwovL35+V0VCUEFUSH5+ZXh0ZXJuYWwvY29tX2dvb2dsZV9wcm90b2J1Zl9qcy9iaW5hcnkvdXRpbHMuanMKdmFyIE9jPTAsYmQ9MDtmdW5jdGlvbiBjZChhKXt2YXIgYz1hPj4+MDthPU1hdGguZmxvb3IoKGEtYykvNDI5NDk2NzI5Nik+Pj4wO09jPWM7YmQ9YX1mdW5jdGlvbiBkZChhKXt2YXIgYz0wPmE7YT1NYXRoLmFicyhhKTt2YXIgZD1hPj4+MDthPU1hdGguZmxvb3IoKGEtZCkvNDI5NDk2NzI5Nik7YT4+Pj0wO2MmJihhPX5hPj4+MCxkPSh+ZD4+PjApKzEsNDI5NDk2NzI5NTxkJiYoZD0wLGErKyw0Mjk0OTY3Mjk1PGEmJihhPTApKSk7T2M9ZDtiZD1hfWZ1bmN0aW9uIGVkKGEpe3ZhciBjPTA+YTthPTIqTWF0aC5hYnMoYSk7Y2QoYSk7YT1PYzt2YXIgZD1iZDtjJiYoMD09YT8wPT1kP2Q9YT00Mjk0OTY3Mjk1OihkLS0sYT00Mjk0OTY3Mjk1KTphLS0pO09jPWE7YmQ9ZH0KZnVuY3Rpb24gZmQoYSl7dmFyIGM9MD5hPzE6MDthPWM/LWE6YTtpZigwPT09YSkwPDEvYT9PYz1iZD0wOihiZD0wLE9jPTIxNDc0ODM2NDgpO2Vsc2UgaWYoaXNOYU4oYSkpYmQ9MCxPYz0yMTQ3NDgzNjQ3O2Vsc2UgaWYoMy40MDI4MjM0NjYzODUyODg2RTM4PGEpYmQ9MCxPYz0oYzw8MzF8MjEzOTA5NTA0MCk+Pj4wO2Vsc2UgaWYoMS4xNzU0OTQzNTA4MjIyODc1RS0zOD5hKWE9TWF0aC5yb3VuZChhL01hdGgucG93KDIsLTE0OSkpLGJkPTAsT2M9KGM8PDMxfGEpPj4+MDtlbHNle3ZhciBkPU1hdGguZmxvb3IoTWF0aC5sb2coYSkvTWF0aC5MTjIpO2EqPU1hdGgucG93KDIsLWQpO2E9TWF0aC5yb3VuZCg4Mzg4NjA4KmEpJjgzODg2MDc7YmQ9MDtPYz0oYzw8MzF8ZCsxMjc8PDIzfGEpPj4+MH19CmZ1bmN0aW9uIGdkKGEpe3ZhciBjPTA+YT8xOjA7YT1jPy1hOmE7aWYoMD09PWEpYmQ9MDwxL2E/MDoyMTQ3NDgzNjQ4LE9jPTA7ZWxzZSBpZihpc05hTihhKSliZD0yMTQ3NDgzNjQ3LE9jPTQyOTQ5NjcyOTU7ZWxzZSBpZigxLjc5NzY5MzEzNDg2MjMxNTdFMzA4PGEpYmQ9KGM8PDMxfDIxNDY0MzUwNzIpPj4+MCxPYz0wO2Vsc2UgaWYoMi4yMjUwNzM4NTg1MDcyMDE0RS0zMDg+YSlhLz1NYXRoLnBvdygyLC0xMDc0KSxiZD0oYzw8MzF8YS80Mjk0OTY3Mjk2KT4+PjAsT2M9YT4+PjA7ZWxzZXt2YXIgZD1NYXRoLmZsb29yKE1hdGgubG9nKGEpL01hdGguTE4yKTsxMDI0PT1kJiYoZD0xMDIzKTthKj1NYXRoLnBvdygyLC1kKTtiZD0oYzw8MzF8ZCsxMDIzPDwyMHwxMDQ4NTc2KmEmMTA0ODU3NSk+Pj4wO09jPTQ1MDM1OTk2MjczNzA0OTYqYT4+PjB9fQpmdW5jdGlvbiBxZChhKXt2YXIgYz1hLmNoYXJDb2RlQXQoNCksZD1hLmNoYXJDb2RlQXQoNSksZj1hLmNoYXJDb2RlQXQoNiksZz1hLmNoYXJDb2RlQXQoNyk7T2M9YS5jaGFyQ29kZUF0KDApKyhhLmNoYXJDb2RlQXQoMSk8PDgpKyhhLmNoYXJDb2RlQXQoMik8PDE2KSsoYS5jaGFyQ29kZUF0KDMpPDwyNCk+Pj4wO2JkPWMrKGQ8PDgpKyhmPDwxNikrKGc8PDI0KT4+PjB9ZnVuY3Rpb24gcmQoYSxjKXtyZXR1cm4gNDI5NDk2NzI5NipjK2F9ZnVuY3Rpb24gc2QoYSxjKXt2YXIgZD1jJjIxNDc0ODM2NDg7ZCYmKGE9fmErMT4+PjAsYz1+Yz4+PjAsMD09YSYmKGM9YysxPj4+MCkpO2E9cmQoYSxjKTtyZXR1cm4gZD8tYTphfWZ1bmN0aW9uIERkKGEsYyl7dmFyIGQ9YSYxO2E9KGE+Pj4xfGM8PDMxKT4+PjA7Yz4+Pj0xO2QmJihhPWErMT4+PjAsMD09YSYmKGM9YysxPj4+MCkpO2E9cmQoYSxjKTtyZXR1cm4gZD8tYTphfQpmdW5jdGlvbiBFZChhKXt2YXIgYz0yKihhPj4zMSkrMSxkPWE+Pj4yMyYyNTU7YSY9ODM4ODYwNztyZXR1cm4gMjU1PT1kP2E/TmFOOkluZmluaXR5KmM6MD09ZD9jKk1hdGgucG93KDIsLTE0OSkqYTpjKk1hdGgucG93KDIsZC0xNTApKihhK01hdGgucG93KDIsMjMpKX1mdW5jdGlvbiBGZChhLGMpe3ZhciBkPTIqKGM+PjMxKSsxLGY9Yz4+PjIwJjIwNDc7YT00Mjk0OTY3Mjk2KihjJjEwNDg1NzUpK2E7cmV0dXJuIDIwNDc9PWY/YT9OYU46SW5maW5pdHkqZDowPT1mP2QqTWF0aC5wb3coMiwtMTA3NCkqYTpkKk1hdGgucG93KDIsZi0xMDc1KSooYSs0NTAzNTk5NjI3MzcwNDk2KX1mdW5jdGlvbiBHZChhLGMpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGE+Pj4wJjI1NSxhPj4+OCYyNTUsYT4+PjE2JjI1NSxhPj4+MjQmMjU1LGM+Pj4wJjI1NSxjPj4+OCYyNTUsYz4+PjE2JjI1NSxjPj4+MjQmMjU1KX12YXIgSGQ9IjAxMjM0NTY3ODlhYmNkZWYiLnNwbGl0KCIiKTsKZnVuY3Rpb24gSWQoYSxjKXtmdW5jdGlvbiBkKG0pe2Zvcih2YXIgcD0xRTcscT0wOzc+cTtxKyspe3AvPTEwO3ZhciByPW0vcCUxMD4+PjA7aWYoMCE9cnx8bClsPSEwLGsrPWdbcl19fWlmKDIwOTcxNTE+PWMpcmV0dXJuIiIrKDQyOTQ5NjcyOTYqYythKTt2YXIgZj0oYT4+PjI0fGM8PDgpPj4+MCYxNjc3NzIxNTtjPWM+PjE2JjY1NTM1O2E9KGEmMTY3NzcyMTUpKzY3NzcyMTYqZis2NzEwNjU2KmM7Zis9ODE0NzQ5NypjO2MqPTI7MUU3PD1hJiYoZis9TWF0aC5mbG9vcihhLzFFNyksYSU9MUU3KTsxRTc8PWYmJihjKz1NYXRoLmZsb29yKGYvMUU3KSxmJT0xRTcpO3ZhciBnPUhkLGw9ITEsaz0iIjsoY3x8bCkmJmQoYyk7KGZ8fGwpJiZkKGYpOyhhfHxsKSYmZChhKTtyZXR1cm4ga31mdW5jdGlvbiBKZChhLGMpe3ZhciBkPWMmMjE0NzQ4MzY0ODtkJiYoYT1+YSsxPj4+MCxjPX5jKygwPT1hPzE6MCk+Pj4wKTthPUlkKGEsYyk7cmV0dXJuIGQ/Ii0iK2E6YX0KZnVuY3Rpb24gS2QoYSl7ZnVuY3Rpb24gYyhrLG0pe2Zvcih2YXIgcD0wOzg+cCYmKDEhPT1rfHwwPG0pO3ArKyltPWsqZ1twXSttLGdbcF09bSYyNTUsbT4+Pj04fWZ1bmN0aW9uIGQoKXtmb3IodmFyIGs9MDs4Pms7aysrKWdba109fmdba10mMjU1fXZhciBmPSExOyItIj09PWFbMF0mJihmPSEwLGE9YS5zbGljZSgxKSk7Zm9yKHZhciBnPVswLDAsMCwwLDAsMCwwLDBdLGw9MDtsPGEubGVuZ3RoO2wrKyljKDEwLEhkLmluZGV4T2YoYVtsXSkpO2YmJihkKCksYygxLDEpKTtyZXR1cm4gaWMoZyl9CmZ1bmN0aW9uIExkKGEpe2lmKGEuY29uc3RydWN0b3I9PT1VaW50OEFycmF5KXJldHVybiBhO2lmKGEuY29uc3RydWN0b3I9PT1BcnJheUJ1ZmZlcilyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYSk7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBCdWZmZXImJmEuY29uc3RydWN0b3I9PT1CdWZmZXIpcmV0dXJuIG5ldyBVaW50OEFycmF5KGEpO2lmKGEuY29uc3RydWN0b3I9PT1BcnJheSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYSk7aWYoYS5jb25zdHJ1Y3Rvcj09PVN0cmluZylyZXR1cm4gRmMoYSk7YmMoIlR5cGUgbm90IGNvbnZlcnRpYmxlIHRvIFVpbnQ4QXJyYXkuIik7cmV0dXJuIG5ldyBVaW50OEFycmF5KDApfTsKLy9+fldFQlBBVEh+fmV4dGVybmFsL2NvbV9nb29nbGVfcHJvdG9idWZfanMvYmluYXJ5L2RlY29kZXIuanMKZnVuY3Rpb24gTWQoYSxjLGQpe3RoaXMuYnl0ZXNfPW51bGw7dGhpcy50ZW1wSGlnaF89dGhpcy50ZW1wTG93Xz10aGlzLmN1cnNvcl89dGhpcy5lbmRfPXRoaXMuc3RhcnRfPTA7dGhpcy5lcnJvcl89ITE7YSYmdGhpcy5zZXRCbG9jayhhLGMsZCl9dmFyIFpkPVtdO2Z1bmN0aW9uICRkKGEsYyxkKXtpZihaZC5sZW5ndGgpe3ZhciBmPVpkLnBvcCgpO2EmJmYuc2V0QmxvY2soYSxjLGQpO3JldHVybiBmfXJldHVybiBuZXcgTWQoYSxjLGQpfU09TWQucHJvdG90eXBlO00uZnJlZT1mdW5jdGlvbigpe3RoaXMuY2xlYXIoKTsxMDA+WmQubGVuZ3RoJiZaZC5wdXNoKHRoaXMpfTtNLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuICRkKHRoaXMuYnl0ZXNfLHRoaXMuc3RhcnRfLHRoaXMuZW5kXy10aGlzLnN0YXJ0Xyl9O00uY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmJ5dGVzXz1udWxsO3RoaXMuY3Vyc29yXz10aGlzLmVuZF89dGhpcy5zdGFydF89MDt0aGlzLmVycm9yXz0hMX07Ck0uZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnl0ZXNffTtNLnNldEJsb2NrPWZ1bmN0aW9uKGEsYyxkKXt0aGlzLmJ5dGVzXz1MZChhKTt0aGlzLnN0YXJ0Xz1FYihjKT9jOjA7dGhpcy5lbmRfPUViKGQpP3RoaXMuc3RhcnRfK2Q6dGhpcy5ieXRlc18ubGVuZ3RoO3RoaXMuY3Vyc29yXz10aGlzLnN0YXJ0X307TS5nZXRFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmRffTtNLnNldEVuZD1mdW5jdGlvbihhKXt0aGlzLmVuZF89YX07TS5yZXNldD1mdW5jdGlvbigpe3RoaXMuY3Vyc29yXz10aGlzLnN0YXJ0X307TS5nZXRDdXJzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJzb3JffTtNLnNldEN1cnNvcj1mdW5jdGlvbihhKXt0aGlzLmN1cnNvcl89YX07TS5hZHZhbmNlPWZ1bmN0aW9uKGEpe3RoaXMuY3Vyc29yXys9YX07TS5hdEVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnNvcl89PXRoaXMuZW5kX307Ck0ucGFzdEVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnNvcl8+dGhpcy5lbmRffTtNLmdldEVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JffHwwPnRoaXMuY3Vyc29yX3x8dGhpcy5jdXJzb3JfPnRoaXMuZW5kX307Ck0ucmVhZFNwbGl0VmFyaW50NjRfPWZ1bmN0aW9uKCl7Zm9yKHZhciBhLGM9MCxkLGY9MDs0PmY7ZisrKWlmKGE9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKytdLGN8PShhJjEyNyk8PDcqZiwxMjg+YSl7dGhpcy50ZW1wTG93Xz1jPj4+MDt0aGlzLnRlbXBIaWdoXz0wO3JldHVybn1hPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysrXTtjfD0oYSYxMjcpPDwyODtkPTB8KGEmMTI3KT4+NDtpZigxMjg+YSl0aGlzLnRlbXBMb3dfPWM+Pj4wLHRoaXMudGVtcEhpZ2hfPWQ+Pj4wO2Vsc2V7Zm9yKGY9MDs1PmY7ZisrKWlmKGE9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKytdLGR8PShhJjEyNyk8PDcqZiszLDEyOD5hKXt0aGlzLnRlbXBMb3dfPWM+Pj4wO3RoaXMudGVtcEhpZ2hfPWQ+Pj4wO3JldHVybn1iYygiRmFpbGVkIHRvIHJlYWQgdmFyaW50LCBlbmNvZGluZyBpcyBpbnZhbGlkLiIpO3RoaXMuZXJyb3JfPSEwfX07Ck0uc2tpcFZhcmludD1mdW5jdGlvbigpe2Zvcig7dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfXSYxMjg7KXRoaXMuY3Vyc29yXysrO3RoaXMuY3Vyc29yXysrfTtNLnVuc2tpcFZhcmludD1mdW5jdGlvbihhKXtmb3IoOzEyODxhOyl0aGlzLmN1cnNvcl8tLSxhPj4+PTc7dGhpcy5jdXJzb3JfLS19OwpNLnJlYWRVbnNpZ25lZFZhcmludDMyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc187dmFyIGM9YVt0aGlzLmN1cnNvcl8rMF07dmFyIGQ9YyYxMjc7aWYoMTI4PmMpcmV0dXJuIHRoaXMuY3Vyc29yXys9MSxkO2M9YVt0aGlzLmN1cnNvcl8rMV07ZHw9KGMmMTI3KTw8NztpZigxMjg+YylyZXR1cm4gdGhpcy5jdXJzb3JfKz0yLGQ7Yz1hW3RoaXMuY3Vyc29yXysyXTtkfD0oYyYxMjcpPDwxNDtpZigxMjg+YylyZXR1cm4gdGhpcy5jdXJzb3JfKz0zLGQ7Yz1hW3RoaXMuY3Vyc29yXyszXTtkfD0oYyYxMjcpPDwyMTtpZigxMjg+YylyZXR1cm4gdGhpcy5jdXJzb3JfKz00LGQ7Yz1hW3RoaXMuY3Vyc29yXys0XTtkfD0oYyYxNSk8PDI4O2lmKDEyOD5jKXJldHVybiB0aGlzLmN1cnNvcl8rPTUsZD4+PjA7dGhpcy5jdXJzb3JfKz01OzEyODw9YVt0aGlzLmN1cnNvcl8rK10mJjEyODw9YVt0aGlzLmN1cnNvcl8rK10mJjEyODw9YVt0aGlzLmN1cnNvcl8rK10mJjEyODw9YVt0aGlzLmN1cnNvcl8rK10mJgp0aGlzLmN1cnNvcl8rKztyZXR1cm4gZH07TS5yZWFkU2lnbmVkVmFyaW50MzI9TWQucHJvdG90eXBlLnJlYWRVbnNpZ25lZFZhcmludDMyO00ucmVhZFVuc2lnbmVkVmFyaW50MzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkVW5zaWduZWRWYXJpbnQzMigpLnRvU3RyaW5nKCl9O00ucmVhZFNpZ25lZFZhcmludDMyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFNpZ25lZFZhcmludDMyKCkudG9TdHJpbmcoKX07TS5yZWFkWmlnemFnVmFyaW50MzI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7cmV0dXJuIGE+Pj4xXi0oYSYxKX07TS5yZWFkVW5zaWduZWRWYXJpbnQ2ND1mdW5jdGlvbigpe3RoaXMucmVhZFNwbGl0VmFyaW50NjRfKCk7cmV0dXJuIHJkKHRoaXMudGVtcExvd18sdGhpcy50ZW1wSGlnaF8pfTsKTS5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZz1mdW5jdGlvbigpe3RoaXMucmVhZFNwbGl0VmFyaW50NjRfKCk7cmV0dXJuIElkKHRoaXMudGVtcExvd18sdGhpcy50ZW1wSGlnaF8pfTtNLnJlYWRTaWduZWRWYXJpbnQ2ND1mdW5jdGlvbigpe3RoaXMucmVhZFNwbGl0VmFyaW50NjRfKCk7cmV0dXJuIHNkKHRoaXMudGVtcExvd18sdGhpcy50ZW1wSGlnaF8pfTtNLnJlYWRTaWduZWRWYXJpbnQ2NFN0cmluZz1mdW5jdGlvbigpe3RoaXMucmVhZFNwbGl0VmFyaW50NjRfKCk7cmV0dXJuIEpkKHRoaXMudGVtcExvd18sdGhpcy50ZW1wSGlnaF8pfTtNLnJlYWRaaWd6YWdWYXJpbnQ2ND1mdW5jdGlvbigpe3RoaXMucmVhZFNwbGl0VmFyaW50NjRfKCk7cmV0dXJuIERkKHRoaXMudGVtcExvd18sdGhpcy50ZW1wSGlnaF8pfTtNLnJlYWRaaWd6YWdWYXJpbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRaaWd6YWdWYXJpbnQ2NCgpLnRvU3RyaW5nKCl9OwpNLnJlYWRVaW50OD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXTt0aGlzLmN1cnNvcl8rPTE7cmV0dXJuIGF9O00ucmVhZFVpbnQxNj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXSxjPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysxXTt0aGlzLmN1cnNvcl8rPTI7cmV0dXJuIGE8PDB8Yzw8OH07TS5yZWFkVWludDMyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzBdLGM9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzFdLGQ9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzJdLGY9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzNdO3RoaXMuY3Vyc29yXys9NDtyZXR1cm4oYTw8MHxjPDw4fGQ8PDE2fGY8PDI0KT4+PjB9O00ucmVhZFVpbnQ2ND1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZFVpbnQzMigpLGM9dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIHJkKGEsYyl9OwpNLnJlYWRVaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxjPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBJZChhLGMpfTtNLnJlYWRJbnQ4PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzBdO3RoaXMuY3Vyc29yXys9MTtyZXR1cm4gYTw8MjQ+PjI0fTtNLnJlYWRJbnQxNj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXSxjPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysxXTt0aGlzLmN1cnNvcl8rPTI7cmV0dXJuKGE8PDB8Yzw8OCk8PDE2Pj4xNn07TS5yZWFkSW50MzI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMF0sYz10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMV0sZD10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMl0sZj10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rM107dGhpcy5jdXJzb3JfKz00O3JldHVybiBhPDwwfGM8PDh8ZDw8MTZ8Zjw8MjR9OwpNLnJlYWRJbnQ2ND1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZFVpbnQzMigpLGM9dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIHNkKGEsYyl9O00ucmVhZEludDY0U3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZWFkVWludDMyKCksYz10aGlzLnJlYWRVaW50MzIoKTtyZXR1cm4gSmQoYSxjKX07TS5yZWFkRmxvYXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKTtyZXR1cm4gRWQoYSl9O00ucmVhZERvdWJsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZFVpbnQzMigpLGM9dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIEZkKGEsYyl9O00ucmVhZEJvb2w9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysrXX07TS5yZWFkRW51bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRTaWduZWRWYXJpbnQzMigpfTsKTS5yZWFkU3RyaW5nPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYnl0ZXNfLGQ9dGhpcy5jdXJzb3JfO2E9ZCthO2Zvcih2YXIgZj1bXSxnPSIiO2Q8YTspe3ZhciBsPWNbZCsrXTtpZigxMjg+bClmLnB1c2gobCk7ZWxzZSBpZigxOTI+bCljb250aW51ZTtlbHNlIGlmKDIyND5sKXt2YXIgaz1jW2QrK107Zi5wdXNoKChsJjMxKTw8NnxrJjYzKX1lbHNlIGlmKDI0MD5sKXtrPWNbZCsrXTt2YXIgbT1jW2QrK107Zi5wdXNoKChsJjE1KTw8MTJ8KGsmNjMpPDw2fG0mNjMpfWVsc2UgaWYoMjQ4Pmwpe2s9Y1tkKytdO209Y1tkKytdO3ZhciBwPWNbZCsrXTtsPShsJjcpPDwxOHwoayY2Myk8PDEyfChtJjYzKTw8NnxwJjYzO2wtPTY1NTM2O2YucHVzaCgobD4+MTAmMTAyMykrNTUyOTYsKGwmMTAyMykrNTYzMjApfTgxOTI8PWYubGVuZ3RoJiYoZys9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpLGYubGVuZ3RoPTApfWcrPWljKGYpO3RoaXMuY3Vyc29yXz1kO3JldHVybiBnfTsKTS5yZWFkU3RyaW5nV2l0aExlbmd0aD1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZFVuc2lnbmVkVmFyaW50MzIoKTtyZXR1cm4gdGhpcy5yZWFkU3RyaW5nKGEpfTtNLnJlYWRCeXRlcz1mdW5jdGlvbihhKXtpZigwPmF8fHRoaXMuY3Vyc29yXythPnRoaXMuYnl0ZXNfLmxlbmd0aClyZXR1cm4gdGhpcy5lcnJvcl89ITAsYmMoIkludmFsaWQgYnl0ZSBsZW5ndGghIiksbmV3IFVpbnQ4QXJyYXkoMCk7dmFyIGM9dGhpcy5ieXRlc18uc3ViYXJyYXkodGhpcy5jdXJzb3JfLHRoaXMuY3Vyc29yXythKTt0aGlzLmN1cnNvcl8rPWE7cmV0dXJuIGN9O00ucmVhZFZhcmludEhhc2g2ND1mdW5jdGlvbigpe3RoaXMucmVhZFNwbGl0VmFyaW50NjRfKCk7cmV0dXJuIEdkKHRoaXMudGVtcExvd18sdGhpcy50ZW1wSGlnaF8pfTsKTS5yZWFkRml4ZWRIYXNoNjQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ5dGVzXyxjPXRoaXMuY3Vyc29yXyxkPWFbYyswXSxmPWFbYysxXSxnPWFbYysyXSxsPWFbYyszXSxrPWFbYys0XSxtPWFbYys1XSxwPWFbYys2XTthPWFbYys3XTt0aGlzLmN1cnNvcl8rPTg7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZCxmLGcsbCxrLG0scCxhKX07Ci8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS9lbmNvZGVyLmpzCmZ1bmN0aW9uIGFlKCl7dGhpcy5idWZmZXJfPVtdfU09YWUucHJvdG90eXBlO00ubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVmZmVyXy5sZW5ndGh9O00uZW5kPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5idWZmZXJfO3RoaXMuYnVmZmVyXz1bXTtyZXR1cm4gYX07TS53cml0ZVNwbGl0VmFyaW50NjQ9ZnVuY3Rpb24oYSxjKXtmb3IoOzA8Y3x8MTI3PGE7KXRoaXMuYnVmZmVyXy5wdXNoKGEmMTI3fDEyOCksYT0oYT4+Pjd8Yzw8MjUpPj4+MCxjPj4+PTc7dGhpcy5idWZmZXJfLnB1c2goYSl9O00ud3JpdGVTcGxpdEZpeGVkNjQ9ZnVuY3Rpb24oYSxjKXt0aGlzLndyaXRlVWludDMyKGEpO3RoaXMud3JpdGVVaW50MzIoYyl9O00ud3JpdGVVbnNpZ25lZFZhcmludDMyPWZ1bmN0aW9uKGEpe2Zvcig7MTI3PGE7KXRoaXMuYnVmZmVyXy5wdXNoKGEmMTI3fDEyOCksYT4+Pj03O3RoaXMuYnVmZmVyXy5wdXNoKGEpfTsKTS53cml0ZVNpZ25lZFZhcmludDMyPWZ1bmN0aW9uKGEpe2lmKDA8PWEpdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50MzIoYSk7ZWxzZXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuYnVmZmVyXy5wdXNoKGEmMTI3fDEyOCksYT4+PTc7dGhpcy5idWZmZXJfLnB1c2goMSl9fTtNLndyaXRlVW5zaWduZWRWYXJpbnQ2ND1mdW5jdGlvbihhKXtkZChhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChPYyxiZCl9O00ud3JpdGVTaWduZWRWYXJpbnQ2ND1mdW5jdGlvbihhKXtkZChhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChPYyxiZCl9O00ud3JpdGVaaWd6YWdWYXJpbnQzMj1mdW5jdGlvbihhKXt0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMigoYTw8MV5hPj4zMSk+Pj4wKX07TS53cml0ZVppZ3phZ1ZhcmludDY0PWZ1bmN0aW9uKGEpe2VkKGEpO3RoaXMud3JpdGVTcGxpdFZhcmludDY0KE9jLGJkKX07Ck0ud3JpdGVaaWd6YWdWYXJpbnQ2NFN0cmluZz1mdW5jdGlvbihhKXt0aGlzLndyaXRlWmlnemFnVmFyaW50NjQocGFyc2VJbnQoYSwxMCkpfTtNLndyaXRlVWludDg9ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXJfLnB1c2goYT4+PjAmMjU1KX07TS53cml0ZVVpbnQxNj1mdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MCYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj44JjI1NSl9O00ud3JpdGVVaW50MzI9ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXJfLnB1c2goYT4+PjAmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+OCYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4xNiYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4yNCYyNTUpfTtNLndyaXRlVWludDY0PWZ1bmN0aW9uKGEpe2NkKGEpO3RoaXMud3JpdGVVaW50MzIoT2MpO3RoaXMud3JpdGVVaW50MzIoYmQpfTtNLndyaXRlSW50OD1mdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MCYyNTUpfTsKTS53cml0ZUludDE2PWZ1bmN0aW9uKGEpe3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4wJjI1NSk7dGhpcy5idWZmZXJfLnB1c2goYT4+PjgmMjU1KX07TS53cml0ZUludDMyPWZ1bmN0aW9uKGEpe3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4wJjI1NSk7dGhpcy5idWZmZXJfLnB1c2goYT4+PjgmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MTYmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MjQmMjU1KX07TS53cml0ZUludDY0PWZ1bmN0aW9uKGEpe2RkKGEpO3RoaXMud3JpdGVTcGxpdEZpeGVkNjQoT2MsYmQpfTtNLndyaXRlSW50NjRTdHJpbmc9ZnVuY3Rpb24oYSl7cWQoS2QoYSkpO3RoaXMud3JpdGVTcGxpdEZpeGVkNjQoT2MsYmQpfTtNLndyaXRlRmxvYXQ9ZnVuY3Rpb24oYSl7ZmQoYSk7dGhpcy53cml0ZVVpbnQzMihPYyl9O00ud3JpdGVEb3VibGU9ZnVuY3Rpb24oYSl7Z2QoYSk7dGhpcy53cml0ZVVpbnQzMihPYyk7dGhpcy53cml0ZVVpbnQzMihiZCl9OwpNLndyaXRlQm9vbD1mdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcl8ucHVzaChhPzE6MCl9O00ud3JpdGVFbnVtPWZ1bmN0aW9uKGEpe3RoaXMud3JpdGVTaWduZWRWYXJpbnQzMihhKX07TS53cml0ZUJ5dGVzPWZ1bmN0aW9uKGEpe3RoaXMuYnVmZmVyXy5wdXNoLmFwcGx5KHRoaXMuYnVmZmVyXyxhKX07TS53cml0ZVZhcmludEhhc2g2ND1mdW5jdGlvbihhKXtxZChhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChPYyxiZCl9O00ud3JpdGVGaXhlZEhhc2g2ND1mdW5jdGlvbihhKXtxZChhKTt0aGlzLndyaXRlVWludDMyKE9jKTt0aGlzLndyaXRlVWludDMyKGJkKX07Ck0ud3JpdGVTdHJpbmc9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYnVmZmVyXy5sZW5ndGgsZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZj1hLmNoYXJDb2RlQXQoZCk7aWYoMTI4PmYpdGhpcy5idWZmZXJfLnB1c2goZik7ZWxzZSBpZigyMDQ4PmYpdGhpcy5idWZmZXJfLnB1c2goZj4+NnwxOTIpLHRoaXMuYnVmZmVyXy5wdXNoKGYmNjN8MTI4KTtlbHNlIGlmKDY1NTM2PmYpaWYoNTUyOTY8PWYmJjU2MzE5Pj1mJiZkKzE8YS5sZW5ndGgpe3ZhciBnPWEuY2hhckNvZGVBdChkKzEpOzU2MzIwPD1nJiY1NzM0Mz49ZyYmKGY9MTAyNCooZi01NTI5NikrZy01NjMyMCs2NTUzNix0aGlzLmJ1ZmZlcl8ucHVzaChmPj4xOHwyNDApLHRoaXMuYnVmZmVyXy5wdXNoKGY+PjEyJjYzfDEyOCksdGhpcy5idWZmZXJfLnB1c2goZj4+NiY2M3wxMjgpLHRoaXMuYnVmZmVyXy5wdXNoKGYmNjN8MTI4KSxkKyspfWVsc2UgdGhpcy5idWZmZXJfLnB1c2goZj4+MTJ8MjI0KSx0aGlzLmJ1ZmZlcl8ucHVzaChmPj4KNiY2M3wxMjgpLHRoaXMuYnVmZmVyXy5wdXNoKGYmNjN8MTI4KX1yZXR1cm4gdGhpcy5idWZmZXJfLmxlbmd0aC1jfTsKLy9+fldFQlBBVEh+fmV4dGVybmFsL2NvbV9nb29nbGVfcHJvdG9idWZfanMvYmluYXJ5L3JlYWRlci5qcwpmdW5jdGlvbiBiZShhLGMsZCl7dGhpcy5kZWNvZGVyXz0kZChhLGMsZCk7dGhpcy5maWVsZEN1cnNvcl89dGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKTt0aGlzLm5leHRXaXJlVHlwZV89dGhpcy5uZXh0RmllbGRfPS0xO3RoaXMuZXJyb3JfPSExO3RoaXMucmVhZENhbGxiYWNrc189bnVsbH12YXIgY2U9W107TT1iZS5wcm90b3R5cGU7TS5hbGxvYz1mdW5jdGlvbihhLGMsZCl7aWYoY2UubGVuZ3RoKXt2YXIgZj1jZS5wb3AoKTthJiZmLmRlY29kZXJfLnNldEJsb2NrKGEsYyxkKTtyZXR1cm4gZn1yZXR1cm4gbmV3IGJlKGEsYyxkKX07TS5mcmVlPWZ1bmN0aW9uKCl7dGhpcy5kZWNvZGVyXy5jbGVhcigpO3RoaXMubmV4dFdpcmVUeXBlXz10aGlzLm5leHRGaWVsZF89LTE7dGhpcy5lcnJvcl89ITE7dGhpcy5yZWFkQ2FsbGJhY2tzXz1udWxsOzEwMD5jZS5sZW5ndGgmJmNlLnB1c2godGhpcyl9O00uZ2V0RmllbGRDdXJzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWVsZEN1cnNvcl99OwpNLmdldEN1cnNvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLmdldEN1cnNvcigpfTtNLmdldEJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLmdldEJ1ZmZlcigpfTtNLmdldEZpZWxkTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmV4dEZpZWxkX307TS5nZXRXaXJlVHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5leHRXaXJlVHlwZV99O00uaXNFbmRHcm91cD1mdW5jdGlvbigpe3JldHVybiA0PT10aGlzLm5leHRXaXJlVHlwZV99O00uZ2V0RXJyb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvcl98fHRoaXMuZGVjb2Rlcl8uZ2V0RXJyb3IoKX07TS5zZXRCbG9jaz1mdW5jdGlvbihhLGMsZCl7dGhpcy5kZWNvZGVyXy5zZXRCbG9jayhhLGMsZCk7dGhpcy5uZXh0V2lyZVR5cGVfPXRoaXMubmV4dEZpZWxkXz0tMX07Ck0ucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmRlY29kZXJfLnJlc2V0KCk7dGhpcy5uZXh0V2lyZVR5cGVfPXRoaXMubmV4dEZpZWxkXz0tMX07TS5hZHZhbmNlPWZ1bmN0aW9uKGEpe3RoaXMuZGVjb2Rlcl8uYWR2YW5jZShhKX07Ck0ubmV4dEZpZWxkPWZ1bmN0aW9uKCl7aWYodGhpcy5kZWNvZGVyXy5hdEVuZCgpKXJldHVybiExO2lmKHRoaXMuZ2V0RXJyb3IoKSlyZXR1cm4gYmMoIkRlY29kZXIgaGl0IGFuIGVycm9yIiksITE7dGhpcy5maWVsZEN1cnNvcl89dGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKTt2YXIgYT10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCksYz1hPj4+MzthJj03O2lmKDAhPWEmJjUhPWEmJjEhPWEmJjIhPWEmJjMhPWEmJjQhPWEpcmV0dXJuIGJjKCJJbnZhbGlkIHdpcmUgdHlwZTogJXMgKGF0IHBvc2l0aW9uICVzKSIsYSx0aGlzLmZpZWxkQ3Vyc29yXyksdGhpcy5lcnJvcl89ITAsITE7dGhpcy5uZXh0RmllbGRfPWM7dGhpcy5uZXh0V2lyZVR5cGVfPWE7cmV0dXJuITB9O00udW5za2lwSGVhZGVyPWZ1bmN0aW9uKCl7dGhpcy5kZWNvZGVyXy51bnNraXBWYXJpbnQodGhpcy5uZXh0RmllbGRfPDwzfHRoaXMubmV4dFdpcmVUeXBlXyl9OwpNLnNraXBNYXRjaGluZ0ZpZWxkcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMubmV4dEZpZWxkXztmb3IodGhpcy51bnNraXBIZWFkZXIoKTt0aGlzLm5leHRGaWVsZCgpJiZ0aGlzLmdldEZpZWxkTnVtYmVyKCk9PWE7KXRoaXMuc2tpcEZpZWxkKCk7dGhpcy5kZWNvZGVyXy5hdEVuZCgpfHx0aGlzLnVuc2tpcEhlYWRlcigpfTtNLnNraXBWYXJpbnRGaWVsZD1mdW5jdGlvbigpezAhPXRoaXMubmV4dFdpcmVUeXBlXz8oYmMoIkludmFsaWQgd2lyZSB0eXBlIGZvciBza2lwVmFyaW50RmllbGQiKSx0aGlzLnNraXBGaWVsZCgpKTp0aGlzLmRlY29kZXJfLnNraXBWYXJpbnQoKX07TS5za2lwRGVsaW1pdGVkRmllbGQ9ZnVuY3Rpb24oKXtpZigyIT10aGlzLm5leHRXaXJlVHlwZV8pYmMoIkludmFsaWQgd2lyZSB0eXBlIGZvciBza2lwRGVsaW1pdGVkRmllbGQiKSx0aGlzLnNraXBGaWVsZCgpO2Vsc2V7dmFyIGE9dGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO3RoaXMuZGVjb2Rlcl8uYWR2YW5jZShhKX19OwpNLnNraXBGaXhlZDMyRmllbGQ9ZnVuY3Rpb24oKXs1IT10aGlzLm5leHRXaXJlVHlwZV8/KGJjKCJJbnZhbGlkIHdpcmUgdHlwZSBmb3Igc2tpcEZpeGVkMzJGaWVsZCIpLHRoaXMuc2tpcEZpZWxkKCkpOnRoaXMuZGVjb2Rlcl8uYWR2YW5jZSg0KX07TS5za2lwRml4ZWQ2NEZpZWxkPWZ1bmN0aW9uKCl7MSE9dGhpcy5uZXh0V2lyZVR5cGVfPyhiYygiSW52YWxpZCB3aXJlIHR5cGUgZm9yIHNraXBGaXhlZDY0RmllbGQiKSx0aGlzLnNraXBGaWVsZCgpKTp0aGlzLmRlY29kZXJfLmFkdmFuY2UoOCl9OwpNLnNraXBHcm91cD1mdW5jdGlvbigpe3ZhciBhPXRoaXMubmV4dEZpZWxkXztkb3tpZighdGhpcy5uZXh0RmllbGQoKSl7YmMoIlVubWF0Y2hlZCBzdGFydC1ncm91cCB0YWc6IHN0cmVhbSBFT0YiKTt0aGlzLmVycm9yXz0hMDticmVha31pZig0PT10aGlzLm5leHRXaXJlVHlwZV8pe3RoaXMubmV4dEZpZWxkXyE9YSYmKGJjKCJVbm1hdGNoZWQgZW5kLWdyb3VwIHRhZyIpLHRoaXMuZXJyb3JfPSEwKTticmVha310aGlzLnNraXBGaWVsZCgpfXdoaWxlKDEpfTtNLnNraXBGaWVsZD1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLm5leHRXaXJlVHlwZV8pe2Nhc2UgMDp0aGlzLnNraXBWYXJpbnRGaWVsZCgpO2JyZWFrO2Nhc2UgMTp0aGlzLnNraXBGaXhlZDY0RmllbGQoKTticmVhaztjYXNlIDI6dGhpcy5za2lwRGVsaW1pdGVkRmllbGQoKTticmVhaztjYXNlIDU6dGhpcy5za2lwRml4ZWQzMkZpZWxkKCk7YnJlYWs7Y2FzZSAzOnRoaXMuc2tpcEdyb3VwKCk7YnJlYWs7ZGVmYXVsdDpiYygiSW52YWxpZCB3aXJlIGVuY29kaW5nIGZvciBmaWVsZC4iKX19OwpNLnJlZ2lzdGVyUmVhZENhbGxiYWNrPWZ1bmN0aW9uKGEsYyl7SmIodGhpcy5yZWFkQ2FsbGJhY2tzXykmJih0aGlzLnJlYWRDYWxsYmFja3NfPXt9KTt0aGlzLnJlYWRDYWxsYmFja3NfW2FdPWN9O00ucnVuUmVhZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3JldHVybigwLHRoaXMucmVhZENhbGxiYWNrc19bYV0pKHRoaXMpfTsKTS5yZWFkQW55PWZ1bmN0aW9uKGEpe3RoaXMubmV4dFdpcmVUeXBlXz1OYyhhKTtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiB0aGlzLnJlYWREb3VibGUoKTtjYXNlIDI6cmV0dXJuIHRoaXMucmVhZEZsb2F0KCk7Y2FzZSAzOnJldHVybiB0aGlzLnJlYWRJbnQ2NCgpO2Nhc2UgNDpyZXR1cm4gdGhpcy5yZWFkVWludDY0KCk7Y2FzZSA1OnJldHVybiB0aGlzLnJlYWRJbnQzMigpO2Nhc2UgNjpyZXR1cm4gdGhpcy5yZWFkRml4ZWQ2NCgpO2Nhc2UgNzpyZXR1cm4gdGhpcy5yZWFkRml4ZWQzMigpO2Nhc2UgODpyZXR1cm4gdGhpcy5yZWFkQm9vbCgpO2Nhc2UgOTpyZXR1cm4gdGhpcy5yZWFkU3RyaW5nKCk7Y2FzZSAxMDpiYygiR3JvdXAgZmllbGQgdHlwZSBub3Qgc3VwcG9ydGVkIGluIHJlYWRBbnkoKSIpO2Nhc2UgMTE6YmMoIk1lc3NhZ2UgZmllbGQgdHlwZSBub3Qgc3VwcG9ydGVkIGluIHJlYWRBbnkoKSIpO2Nhc2UgMTI6cmV0dXJuIHRoaXMucmVhZEJ5dGVzKCk7Y2FzZSAxMzpyZXR1cm4gdGhpcy5yZWFkVWludDMyKCk7CmNhc2UgMTQ6cmV0dXJuIHRoaXMucmVhZEVudW0oKTtjYXNlIDE1OnJldHVybiB0aGlzLnJlYWRTZml4ZWQzMigpO2Nhc2UgMTY6cmV0dXJuIHRoaXMucmVhZFNmaXhlZDY0KCk7Y2FzZSAxNzpyZXR1cm4gdGhpcy5yZWFkU2ludDMyKCk7Y2FzZSAxODpyZXR1cm4gdGhpcy5yZWFkU2ludDY0KCk7Y2FzZSAzMDpyZXR1cm4gdGhpcy5yZWFkRml4ZWRIYXNoNjQoKTtjYXNlIDMxOnJldHVybiB0aGlzLnJlYWRWYXJpbnRIYXNoNjQoKTtkZWZhdWx0OmJjKCJJbnZhbGlkIGZpZWxkIHR5cGUgaW4gcmVhZEFueSgpIil9cmV0dXJuIDB9O00ucmVhZE1lc3NhZ2U9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLmRlY29kZXJfLmdldEVuZCgpLGY9dGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO2Y9dGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKStmO3RoaXMuZGVjb2Rlcl8uc2V0RW5kKGYpO2MoYSx0aGlzKTt0aGlzLmRlY29kZXJfLnNldEN1cnNvcihmKTt0aGlzLmRlY29kZXJfLnNldEVuZChkKX07Ck0ucmVhZEdyb3VwPWZ1bmN0aW9uKGEsYyxkKXtkKGMsdGhpcyk7dGhpcy5lcnJvcl98fDQ9PXRoaXMubmV4dFdpcmVUeXBlX3x8KGJjKCJHcm91cCBzdWJtZXNzYWdlIGRpZCBub3QgZW5kIHdpdGggYW4gRU5EX0dST1VQIHRhZyIpLHRoaXMuZXJyb3JfPSEwKX07TS5nZXRGaWVsZERlY29kZXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCksYz10aGlzLmRlY29kZXJfLmdldEN1cnNvcigpLGQ9YythO2E9JGQodGhpcy5kZWNvZGVyXy5nZXRCdWZmZXIoKSxjLGEpO3RoaXMuZGVjb2Rlcl8uc2V0Q3Vyc29yKGQpO3JldHVybiBhfTtNLnJlYWRJbnQzMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQzMigpfTtNLnJlYWRJbnQzMlN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQzMlN0cmluZygpfTtNLnJlYWRJbnQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NCgpfTsKTS5yZWFkSW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkU2lnbmVkVmFyaW50NjRTdHJpbmcoKX07TS5yZWFkVWludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKX07TS5yZWFkVWludDMyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzJTdHJpbmcoKX07TS5yZWFkVWludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50NjQoKX07TS5yZWFkVWludDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50NjRTdHJpbmcoKX07TS5yZWFkU2ludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDMyKCl9O00ucmVhZFNpbnQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnQ2NCgpfTsKTS5yZWFkU2ludDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDY0U3RyaW5nKCl9O00ucmVhZEZpeGVkMzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVWludDMyKCl9O00ucmVhZEZpeGVkNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVWludDY0KCl9O00ucmVhZEZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVWludDY0U3RyaW5nKCl9O00ucmVhZFNmaXhlZDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZEludDMyKCl9O00ucmVhZFNmaXhlZDMyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZEludDMyKCkudG9TdHJpbmcoKX07TS5yZWFkU2ZpeGVkNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkSW50NjQoKX07TS5yZWFkU2ZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkSW50NjRTdHJpbmcoKX07Ck0ucmVhZEZsb2F0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZEZsb2F0KCl9O00ucmVhZERvdWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWREb3VibGUoKX07TS5yZWFkQm9vbD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpfTtNLnJlYWRFbnVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDY0KCl9O00ucmVhZFN0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkU3RyaW5nKGEpfTtNLnJlYWRCeXRlcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkQnl0ZXMoYSl9O00ucmVhZFZhcmludEhhc2g2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRWYXJpbnRIYXNoNjQoKX07Ck0ucmVhZEZpeGVkSGFzaDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZEZpeGVkSGFzaDY0KCl9O00ucmVhZFBhY2tlZEZpZWxkXz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7Yz10aGlzLmRlY29kZXJfLmdldEN1cnNvcigpK2M7Zm9yKHZhciBkPVtdO3RoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCk8YzspZC5wdXNoKGEuY2FsbCh0aGlzLmRlY29kZXJfKSk7cmV0dXJuIGR9O00ucmVhZFBhY2tlZEludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQzMil9O00ucmVhZFBhY2tlZEludDMyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQzMlN0cmluZyl9O00ucmVhZFBhY2tlZEludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NCl9OwpNLnJlYWRQYWNrZWRJbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkU2lnbmVkVmFyaW50NjRTdHJpbmcpfTtNLnJlYWRQYWNrZWRVaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIpfTtNLnJlYWRQYWNrZWRVaW50MzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzJTdHJpbmcpfTtNLnJlYWRQYWNrZWRVaW50NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50NjQpfTtNLnJlYWRQYWNrZWRVaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50NjRTdHJpbmcpfTsKTS5yZWFkUGFja2VkU2ludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnQzMil9O00ucmVhZFBhY2tlZFNpbnQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkWmlnemFnVmFyaW50NjQpfTtNLnJlYWRQYWNrZWRTaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDY0U3RyaW5nKX07TS5yZWFkUGFja2VkRml4ZWQzMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVWludDMyKX07TS5yZWFkUGFja2VkRml4ZWQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVWludDY0KX07TS5yZWFkUGFja2VkRml4ZWQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVWludDY0U3RyaW5nKX07Ck0ucmVhZFBhY2tlZFNmaXhlZDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRJbnQzMil9O00ucmVhZFBhY2tlZFNmaXhlZDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRJbnQ2NCl9O00ucmVhZFBhY2tlZFNmaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRJbnQ2NFN0cmluZyl9O00ucmVhZFBhY2tlZEZsb2F0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRGbG9hdCl9O00ucmVhZFBhY2tlZERvdWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkRG91YmxlKX07TS5yZWFkUGFja2VkQm9vbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkQm9vbCl9OwpNLnJlYWRQYWNrZWRFbnVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRFbnVtKX07TS5yZWFkUGFja2VkVmFyaW50SGFzaDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRWYXJpbnRIYXNoNjQpfTtNLnJlYWRQYWNrZWRGaXhlZEhhc2g2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkRml4ZWRIYXNoNjQpfTsKLy9+fldFQlBBVEh+fmV4dGVybmFsL2NvbV9nb29nbGVfcHJvdG9idWZfanMvYmluYXJ5L3dyaXRlci5qcwpmdW5jdGlvbiBkZSgpe3RoaXMuYmxvY2tzXz1bXTt0aGlzLnRvdGFsTGVuZ3RoXz0wO3RoaXMuZW5jb2Rlcl89bmV3IGFlO3RoaXMuYm9va21hcmtzXz1bXX1NPWRlLnByb3RvdHlwZTtNLmFwcGVuZFVpbnQ4QXJyYXlfPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZW5jb2Rlcl8uZW5kKCk7dGhpcy5ibG9ja3NfLnB1c2goYyk7dGhpcy5ibG9ja3NfLnB1c2goYSk7dGhpcy50b3RhbExlbmd0aF8rPWMubGVuZ3RoK2EubGVuZ3RofTtNLmJlZ2luRGVsaW1pdGVkXz1mdW5jdGlvbihhKXt0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMik7YT10aGlzLmVuY29kZXJfLmVuZCgpO3RoaXMuYmxvY2tzXy5wdXNoKGEpO3RoaXMudG90YWxMZW5ndGhfKz1hLmxlbmd0aDthLnB1c2godGhpcy50b3RhbExlbmd0aF8pO3JldHVybiBhfTsKTS5lbmREZWxpbWl0ZWRfPWZ1bmN0aW9uKGEpe3ZhciBjPWEucG9wKCk7Zm9yKGM9dGhpcy50b3RhbExlbmd0aF8rdGhpcy5lbmNvZGVyXy5sZW5ndGgoKS1jOzEyNzxjOylhLnB1c2goYyYxMjd8MTI4KSxjPj4+PTcsdGhpcy50b3RhbExlbmd0aF8rKzthLnB1c2goYyk7dGhpcy50b3RhbExlbmd0aF8rK307TS53cml0ZVNlcmlhbGl6ZWRNZXNzYWdlPWZ1bmN0aW9uKGEsYyxkKXt0aGlzLmFwcGVuZFVpbnQ4QXJyYXlfKGEuc3ViYXJyYXkoYyxkKSl9O00ubWF5YmVXcml0ZVNlcmlhbGl6ZWRNZXNzYWdlPWZ1bmN0aW9uKGEsYyxkKXtudWxsIT1hJiZudWxsIT1jJiZudWxsIT1kJiZ0aGlzLndyaXRlU2VyaWFsaXplZE1lc3NhZ2UoYSxjLGQpfTtNLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5ibG9ja3NfPVtdO3RoaXMuZW5jb2Rlcl8uZW5kKCk7dGhpcy50b3RhbExlbmd0aF89MDt0aGlzLmJvb2ttYXJrc189W119OwpNLmdldFJlc3VsdEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgYT1uZXcgVWludDhBcnJheSh0aGlzLnRvdGFsTGVuZ3RoXyt0aGlzLmVuY29kZXJfLmxlbmd0aCgpKSxjPXRoaXMuYmxvY2tzXyxkPWMubGVuZ3RoLGY9MCxnPTA7ZzxkO2crKyl7dmFyIGw9Y1tnXTthLnNldChsLGYpO2YrPWwubGVuZ3RofWM9dGhpcy5lbmNvZGVyXy5lbmQoKTthLnNldChjLGYpO3RoaXMuYmxvY2tzXz1bYV07cmV0dXJuIGF9O00uZ2V0UmVzdWx0QmFzZTY0U3RyaW5nPWZ1bmN0aW9uKGEpe3JldHVybiB0Yyh0aGlzLmdldFJlc3VsdEJ1ZmZlcigpLGEpfTtNLmJlZ2luU3ViTWVzc2FnZT1mdW5jdGlvbihhKXt0aGlzLmJvb2ttYXJrc18ucHVzaCh0aGlzLmJlZ2luRGVsaW1pdGVkXyhhKSl9O00uZW5kU3ViTWVzc2FnZT1mdW5jdGlvbigpe3RoaXMuZW5kRGVsaW1pdGVkXyh0aGlzLmJvb2ttYXJrc18ucG9wKCkpfTsKTS53cml0ZUZpZWxkSGVhZGVyXz1mdW5jdGlvbihhLGMpe3RoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDgqYStjKX07Ck0ud3JpdGVBbnk9ZnVuY3Rpb24oYSxjLGQpe3N3aXRjaChhKXtjYXNlIDE6dGhpcy53cml0ZURvdWJsZShjLGQpO2JyZWFrO2Nhc2UgMjp0aGlzLndyaXRlRmxvYXQoYyxkKTticmVhaztjYXNlIDM6dGhpcy53cml0ZUludDY0KGMsZCk7YnJlYWs7Y2FzZSA0OnRoaXMud3JpdGVVaW50NjQoYyxkKTticmVhaztjYXNlIDU6dGhpcy53cml0ZUludDMyKGMsZCk7YnJlYWs7Y2FzZSA2OnRoaXMud3JpdGVGaXhlZDY0KGMsZCk7YnJlYWs7Y2FzZSA3OnRoaXMud3JpdGVGaXhlZDMyKGMsZCk7YnJlYWs7Y2FzZSA4OnRoaXMud3JpdGVCb29sKGMsZCk7YnJlYWs7Y2FzZSA5OnRoaXMud3JpdGVTdHJpbmcoYyxkKTticmVhaztjYXNlIDEwOmJjKCJHcm91cCBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gd3JpdGVBbnkoKSIpO2JyZWFrO2Nhc2UgMTE6YmMoIk1lc3NhZ2UgZmllbGQgdHlwZSBub3Qgc3VwcG9ydGVkIGluIHdyaXRlQW55KCkiKTticmVhaztjYXNlIDEyOnRoaXMud3JpdGVCeXRlcyhjLApkKTticmVhaztjYXNlIDEzOnRoaXMud3JpdGVVaW50MzIoYyxkKTticmVhaztjYXNlIDE0OnRoaXMud3JpdGVFbnVtKGMsZCk7YnJlYWs7Y2FzZSAxNTp0aGlzLndyaXRlU2ZpeGVkMzIoYyxkKTticmVhaztjYXNlIDE2OnRoaXMud3JpdGVTZml4ZWQ2NChjLGQpO2JyZWFrO2Nhc2UgMTc6dGhpcy53cml0ZVNpbnQzMihjLGQpO2JyZWFrO2Nhc2UgMTg6dGhpcy53cml0ZVNpbnQ2NChjLGQpO2JyZWFrO2Nhc2UgMzA6dGhpcy53cml0ZUZpeGVkSGFzaDY0KGMsZCk7YnJlYWs7Y2FzZSAzMTp0aGlzLndyaXRlVmFyaW50SGFzaDY0KGMsZCk7YnJlYWs7ZGVmYXVsdDpiYygiSW52YWxpZCBmaWVsZCB0eXBlIGluIHdyaXRlQW55KCkiKX19O00ud3JpdGVVbnNpZ25lZFZhcmludDMyXz1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoYykpfTsKTS53cml0ZVNpZ25lZFZhcmludDMyXz1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDMyKGMpKX07TS53cml0ZVVuc2lnbmVkVmFyaW50NjRfPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQ2NChjKSl9O00ud3JpdGVTaWduZWRWYXJpbnQ2NF89ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQ2NChjKSl9O00ud3JpdGVaaWd6YWdWYXJpbnQzMl89ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnQzMihjKSl9OwpNLndyaXRlWmlnemFnVmFyaW50NjRfPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50NjQoYykpfTtNLndyaXRlWmlnemFnVmFyaW50NjRTdHJpbmdfPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50NjRTdHJpbmcoYykpfTtNLndyaXRlSW50MzI9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiZ0aGlzLndyaXRlU2lnbmVkVmFyaW50MzJfKGEsYyl9O00ud3JpdGVJbnQzMlN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVTaWduZWRWYXJpbnQzMl8oYSxwYXJzZUludChjLDEwKSl9O00ud3JpdGVJbnQ2ND1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVTaWduZWRWYXJpbnQ2NF8oYSxjKX07Ck0ud3JpdGVJbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJihjPU1jKGMpLHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRWYXJpbnQ2NChjLmxvLGMuaGkpKX07TS53cml0ZVVpbnQzMj1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVVbnNpZ25lZFZhcmludDMyXyhhLGMpfTtNLndyaXRlVWludDMyU3RyaW5nPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50MzJfKGEscGFyc2VJbnQoYywxMCkpfTtNLndyaXRlVWludDY0PWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50NjRfKGEsYyl9O00ud3JpdGVVaW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYoYz1LYyhjKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0VmFyaW50NjQoYy5sbyxjLmhpKSl9OwpNLndyaXRlU2ludDMyPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmdGhpcy53cml0ZVppZ3phZ1ZhcmludDMyXyhhLGMpfTtNLndyaXRlU2ludDY0PWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmdGhpcy53cml0ZVppZ3phZ1ZhcmludDY0XyhhLGMpfTtNLndyaXRlU2ludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmdGhpcy53cml0ZVppZ3phZ1ZhcmludDY0U3RyaW5nXyhhLGMpfTtNLndyaXRlRml4ZWQzMj1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsNSksdGhpcy5lbmNvZGVyXy53cml0ZVVpbnQzMihjKSl9O00ud3JpdGVGaXhlZDY0PWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwxKSx0aGlzLmVuY29kZXJfLndyaXRlVWludDY0KGMpKX07Ck0ud3JpdGVGaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKGM9S2MoYyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDEpLHRoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdEZpeGVkNjQoYy5sbyxjLmhpKSl9O00ud3JpdGVTZml4ZWQzMj1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsNSksdGhpcy5lbmNvZGVyXy53cml0ZUludDMyKGMpKX07TS53cml0ZVNmaXhlZDY0PWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwxKSx0aGlzLmVuY29kZXJfLndyaXRlSW50NjQoYykpfTtNLndyaXRlU2ZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYoYz1NYyhjKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMSksdGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0Rml4ZWQ2NChjLmxvLGMuaGkpKX07Ck0ud3JpdGVGbG9hdD1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsNSksdGhpcy5lbmNvZGVyXy53cml0ZUZsb2F0KGMpKX07TS53cml0ZURvdWJsZT1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMSksdGhpcy5lbmNvZGVyXy53cml0ZURvdWJsZShjKSl9O00ud3JpdGVCb29sPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlQm9vbChjKSl9O00ud3JpdGVFbnVtPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlU2lnbmVkVmFyaW50MzIoYykpfTtNLndyaXRlU3RyaW5nPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKGE9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSksdGhpcy5lbmNvZGVyXy53cml0ZVN0cmluZyhjKSx0aGlzLmVuZERlbGltaXRlZF8oYSkpfTsKTS53cml0ZUJ5dGVzPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKGM9TGQoYyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGMubGVuZ3RoKSx0aGlzLmFwcGVuZFVpbnQ4QXJyYXlfKGMpKX07TS53cml0ZU1lc3NhZ2U9ZnVuY3Rpb24oYSxjLGQpe251bGwhPWMmJihhPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpLGQoYyx0aGlzKSx0aGlzLmVuZERlbGltaXRlZF8oYSkpfTtNLndyaXRlTWVzc2FnZVNldD1mdW5jdGlvbihhLGMsZCl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oMSwzKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKDIsMCksdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDMyKGEpLGE9dGhpcy5iZWdpbkRlbGltaXRlZF8oMyksZChjLHRoaXMpLHRoaXMuZW5kRGVsaW1pdGVkXyhhKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKDEsNCkpfTsKTS53cml0ZUdyb3VwPWZ1bmN0aW9uKGEsYyxkKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDMpLGQoYyx0aGlzKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsNCkpfTtNLndyaXRlRml4ZWRIYXNoNjQ9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDEpLHRoaXMuZW5jb2Rlcl8ud3JpdGVGaXhlZEhhc2g2NChjKSl9O00ud3JpdGVWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVWYXJpbnRIYXNoNjQoYykpfTtNLndyaXRlUmVwZWF0ZWRJbnQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVNpZ25lZFZhcmludDMyXyhhLGNbZF0pfTsKTS53cml0ZVJlcGVhdGVkSW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVJbnQzMlN0cmluZyhhLGNbZF0pfTtNLndyaXRlUmVwZWF0ZWRJbnQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVNpZ25lZFZhcmludDY0XyhhLGNbZF0pfTtNLndyaXRlUmVwZWF0ZWRJbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZUludDY0U3RyaW5nKGEsY1tkXSl9O00ud3JpdGVSZXBlYXRlZFVpbnQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50MzJfKGEsY1tkXSl9OwpNLndyaXRlUmVwZWF0ZWRVaW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVVaW50MzJTdHJpbmcoYSxjW2RdKX07TS53cml0ZVJlcGVhdGVkVWludDY0PWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQ2NF8oYSxjW2RdKX07TS53cml0ZVJlcGVhdGVkVWludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlVWludDY0U3RyaW5nKGEsY1tkXSl9O00ud3JpdGVSZXBlYXRlZFNpbnQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVppZ3phZ1ZhcmludDMyXyhhLGNbZF0pfTsKTS53cml0ZVJlcGVhdGVkU2ludDY0PWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlWmlnemFnVmFyaW50NjRfKGEsY1tkXSl9O00ud3JpdGVSZXBlYXRlZFNpbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVppZ3phZ1ZhcmludDY0U3RyaW5nXyhhLGNbZF0pfTtNLndyaXRlUmVwZWF0ZWRGaXhlZDMyPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlRml4ZWQzMihhLGNbZF0pfTtNLndyaXRlUmVwZWF0ZWRGaXhlZDY0PWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlRml4ZWQ2NChhLGNbZF0pfTsKTS53cml0ZVJlcGVhdGVkRml4ZWQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZUZpeGVkNjRTdHJpbmcoYSxjW2RdKX07TS53cml0ZVJlcGVhdGVkU2ZpeGVkMzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVTZml4ZWQzMihhLGNbZF0pfTtNLndyaXRlUmVwZWF0ZWRTZml4ZWQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVNmaXhlZDY0KGEsY1tkXSl9O00ud3JpdGVSZXBlYXRlZFNmaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlU2ZpeGVkNjRTdHJpbmcoYSxjW2RdKX07Ck0ud3JpdGVSZXBlYXRlZEZsb2F0PWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlRmxvYXQoYSxjW2RdKX07TS53cml0ZVJlcGVhdGVkRG91YmxlPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlRG91YmxlKGEsY1tkXSl9O00ud3JpdGVSZXBlYXRlZEJvb2w9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVCb29sKGEsY1tkXSl9O00ud3JpdGVSZXBlYXRlZEVudW09ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVFbnVtKGEsY1tkXSl9O00ud3JpdGVSZXBlYXRlZFN0cmluZz1mdW5jdGlvbihhKXtpZihudWxsIT1hKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMud3JpdGVTdHJpbmcoMSxhW2NdKX07Ck0ud3JpdGVSZXBlYXRlZEJ5dGVzPWZ1bmN0aW9uKGEpe2lmKG51bGwhPWEpZm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspdGhpcy53cml0ZUJ5dGVzKDEsYVtjXSl9O00ud3JpdGVSZXBlYXRlZE1lc3NhZ2U9ZnVuY3Rpb24oYSxjLGQpe2lmKG51bGwhPWMpZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2QoY1tmXSx0aGlzKTt0aGlzLmVuZERlbGltaXRlZF8oZyl9fTtNLndyaXRlUmVwZWF0ZWRHcm91cD1mdW5jdGlvbihhLGMsZCl7aWYobnVsbCE9Yylmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMyksZChjW2ZdLHRoaXMpLHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSw0KX07TS53cml0ZVJlcGVhdGVkRml4ZWRIYXNoNjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVGaXhlZEhhc2g2NChhLGNbZF0pfTsKTS53cml0ZVJlcGVhdGVkVmFyaW50SGFzaDY0PWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlVmFyaW50SGFzaDY0KGEsY1tkXSl9O00ud3JpdGVQYWNrZWRJbnQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMihjW2RdKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTtNLndyaXRlUGFja2VkSW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlU2lnbmVkVmFyaW50MzIocGFyc2VJbnQoY1tkXSwxMCkpO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19OwpNLndyaXRlUGFja2VkSW50NjQ9ZnVuY3Rpb24oYSl7aWYobnVsbCE9YSYmYS5sZW5ndGgpe2Zvcih2YXIgYz10aGlzLmJlZ2luRGVsaW1pdGVkXygxKSxkPTA7ZDxhLmxlbmd0aDtkKyspdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDY0KGFbZF0pO3RoaXMuZW5kRGVsaW1pdGVkXyhjKX19O00ud3JpdGVQYWNrZWRJbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZj1NYyhjW2RdKTt0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRWYXJpbnQ2NChmLmxvLGYuaGkpfXRoaXMuZW5kRGVsaW1pdGVkXyhhKX19OwpNLndyaXRlUGFja2VkVWludDMyPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoY1tkXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07TS53cml0ZVBhY2tlZFVpbnQzMlN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKHBhcnNlSW50KGNbZF0sMTApKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTsKTS53cml0ZVBhY2tlZFVpbnQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDY0KGNbZF0pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19O00ud3JpdGVQYWNrZWRVaW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGY9S2MoY1tkXSk7dGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0VmFyaW50NjQoZi5sbyxmLmhpKX10aGlzLmVuZERlbGltaXRlZF8oYSl9fTsKTS53cml0ZVBhY2tlZFNpbnQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnQzMihjW2RdKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTtNLndyaXRlUGFja2VkU2ludDY0PWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludDY0KGNbZF0pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19OwpNLndyaXRlUGFja2VkU2ludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludDY0KHBhcnNlSW50KGNbZF0sMTApKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTtNLndyaXRlUGFja2VkRml4ZWQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMiksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoNCpjLmxlbmd0aCksYT0wO2E8Yy5sZW5ndGg7YSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVVaW50MzIoY1thXSl9OwpNLndyaXRlUGFja2VkRml4ZWQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMiksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCpjLmxlbmd0aCksYT0wO2E8Yy5sZW5ndGg7YSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVVaW50NjQoY1thXSl9O00ud3JpdGVQYWNrZWRGaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpZm9yKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwyKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig4KmMubGVuZ3RoKSxhPTA7YTxjLmxlbmd0aDthKyspe3ZhciBkPUtjKGNbYV0pO3RoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdEZpeGVkNjQoZC5sbyxkLmhpKX19OwpNLndyaXRlUGFja2VkU2ZpeGVkMzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDQqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlSW50MzIoY1thXSl9O00ud3JpdGVQYWNrZWRTZml4ZWQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMiksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCpjLmxlbmd0aCksYT0wO2E8Yy5sZW5ndGg7YSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVJbnQ2NChjW2FdKX07Ck0ud3JpdGVQYWNrZWRTZml4ZWQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMiksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCpjLmxlbmd0aCksYT0wO2E8Yy5sZW5ndGg7YSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVJbnQ2NFN0cmluZyhjW2FdKX07TS53cml0ZVBhY2tlZEZsb2F0PWZ1bmN0aW9uKGEpe2lmKG51bGwhPWEmJmEubGVuZ3RoKXt0aGlzLndyaXRlRmllbGRIZWFkZXJfKDEsMik7dGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoNCphLmxlbmd0aCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspdGhpcy5lbmNvZGVyXy53cml0ZUZsb2F0KGFbY10pfX07Ck0ud3JpdGVQYWNrZWREb3VibGU9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDgqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlRG91YmxlKGNbYV0pfTtNLndyaXRlUGFja2VkQm9vbD1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMiksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlQm9vbChjW2FdKX07Ck0ud3JpdGVQYWNrZWRFbnVtPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy5lbmNvZGVyXy53cml0ZUVudW0oY1tkXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07TS53cml0ZVBhY2tlZEZpeGVkSGFzaDY0PWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpZm9yKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwyKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig4KmMubGVuZ3RoKSxhPTA7YTxjLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZUZpeGVkSGFzaDY0KGNbYV0pfTsKTS53cml0ZVBhY2tlZFZhcmludEhhc2g2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVWYXJpbnRIYXNoNjQoY1tkXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ci8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL21hcC5qcwpmdW5jdGlvbiBlZShhLGMpe3RoaXMuYXJyXz1hO3RoaXMudmFsdWVDdG9yXz1jO3RoaXMubWFwXz17fTt0aGlzLmFyckNsZWFuPSEwOzA8dGhpcy5hcnJfLmxlbmd0aCYmdGhpcy5sb2FkRnJvbUFycmF5XygpfWVlLnByb3RvdHlwZS5sb2FkRnJvbUFycmF5Xz1mdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5hcnJfLmxlbmd0aDthKyspe3ZhciBjPXRoaXMuYXJyX1thXSxkPWNbMF07dGhpcy5tYXBfW2QudG9TdHJpbmcoKV09bmV3IGZlKGQsY1sxXSl9dGhpcy5hcnJDbGVhbj0hMH07CmVlLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7aWYodGhpcy5hcnJDbGVhbil7aWYodGhpcy52YWx1ZUN0b3JfKXt2YXIgYT10aGlzLm1hcF8sYztmb3IoYyBpbiBhKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGMpKXt2YXIgZD1hW2NdLnZhbHVlV3JhcHBlcjtkJiZkLnRvQXJyYXkoKX19fWVsc2V7dGhpcy5hcnJfLmxlbmd0aD0wO2E9dGhpcy5zdHJpbmdLZXlzXygpO2Euc29ydCgpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBmPXRoaXMubWFwX1thW2NdXTsoZD1mLnZhbHVlV3JhcHBlcikmJmQudG9BcnJheSgpO3RoaXMuYXJyXy5wdXNoKFtmLmtleSxmLnZhbHVlXSl9dGhpcy5hcnJDbGVhbj0hMH1yZXR1cm4gdGhpcy5hcnJffTsKZWUucHJvdG90eXBlLnRvT2JqZWN0PWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPXRoaXMudG9BcnJheSgpLGY9W10sZz0wO2c8ZC5sZW5ndGg7ZysrKXt2YXIgbD10aGlzLm1hcF9bZFtnXVswXS50b1N0cmluZygpXTt0aGlzLndyYXBFbnRyeV8obCk7dmFyIGs9bC52YWx1ZVdyYXBwZXI7az9mLnB1c2goW2wua2V5LGMoYSxrKV0pOmYucHVzaChbbC5rZXksbC52YWx1ZV0pfXJldHVybiBmfTtmdW5jdGlvbiB5ZShhKXt0aGlzLmlkeF89MDt0aGlzLmFycl89YX15ZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlkeF88dGhpcy5hcnJfLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTp0aGlzLmFycl9bdGhpcy5pZHhfKytdfTp7ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fTsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKHllLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KTtNPWVlLnByb3RvdHlwZTtNLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZ0tleXNfKCkubGVuZ3RofTsKTS5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwXz17fTt0aGlzLmFyckNsZWFuPSExfTtNLmRlbD1mdW5jdGlvbihhKXthPWEudG9TdHJpbmcoKTt2YXIgYz10aGlzLm1hcF8uaGFzT3duUHJvcGVydHkoYSk7ZGVsZXRlIHRoaXMubWFwX1thXTt0aGlzLmFyckNsZWFuPSExO3JldHVybiBjfTtNLmdldEVudHJ5TGlzdD1mdW5jdGlvbigpe3ZhciBhPVtdLGM9dGhpcy5zdHJpbmdLZXlzXygpO2Muc29ydCgpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZj10aGlzLm1hcF9bY1tkXV07YS5wdXNoKFtmLmtleSxmLnZhbHVlXSl9cmV0dXJuIGF9O00uZW50cmllcz1mdW5jdGlvbigpe3ZhciBhPVtdLGM9dGhpcy5zdHJpbmdLZXlzXygpO2Muc29ydCgpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZj10aGlzLm1hcF9bY1tkXV07YS5wdXNoKFtmLmtleSx0aGlzLndyYXBFbnRyeV8oZildKX1yZXR1cm4gbmV3IHllKGEpfTsKTS5rZXlzPWZ1bmN0aW9uKCl7dmFyIGE9W10sYz10aGlzLnN0cmluZ0tleXNfKCk7Yy5zb3J0KCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYS5wdXNoKHRoaXMubWFwX1tjW2RdXS5rZXkpO3JldHVybiBuZXcgeWUoYSl9O00udmFsdWVzPWZ1bmN0aW9uKCl7dmFyIGE9W10sYz10aGlzLnN0cmluZ0tleXNfKCk7Yy5zb3J0KCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYS5wdXNoKHRoaXMud3JhcEVudHJ5Xyh0aGlzLm1hcF9bY1tkXV0pKTtyZXR1cm4gbmV3IHllKGEpfTtNLmZvckVhY2g9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLnN0cmluZ0tleXNfKCk7ZC5zb3J0KCk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBnPXRoaXMubWFwX1tkW2ZdXTthLmNhbGwoYyx0aGlzLndyYXBFbnRyeV8oZyksZy5rZXksdGhpcyl9fTsKTS5zZXQ9ZnVuY3Rpb24oYSxjKXt2YXIgZD1uZXcgZmUoYSk7dGhpcy52YWx1ZUN0b3JfPyhkLnZhbHVlV3JhcHBlcj1jLGQudmFsdWU9Yy50b0FycmF5KCkpOmQudmFsdWU9Yzt0aGlzLm1hcF9bYS50b1N0cmluZygpXT1kO3RoaXMuYXJyQ2xlYW49ITE7cmV0dXJuIHRoaXN9O00ud3JhcEVudHJ5Xz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy52YWx1ZUN0b3JfPyhhLnZhbHVlV3JhcHBlcnx8KGEudmFsdWVXcmFwcGVyPW5ldyB0aGlzLnZhbHVlQ3Rvcl8oYS52YWx1ZSkpLGEudmFsdWVXcmFwcGVyKTphLnZhbHVlfTtNLmdldD1mdW5jdGlvbihhKXtpZihhPXRoaXMubWFwX1thLnRvU3RyaW5nKCldKXJldHVybiB0aGlzLndyYXBFbnRyeV8oYSl9O00uaGFzPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKClpbiB0aGlzLm1hcF99OwpNLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbihhLGMsZCxmLGcpe3ZhciBsPXRoaXMuc3RyaW5nS2V5c18oKTtsLnNvcnQoKTtmb3IodmFyIGs9MDtrPGwubGVuZ3RoO2srKyl7dmFyIG09dGhpcy5tYXBfW2xba11dO2MuYmVnaW5TdWJNZXNzYWdlKGEpO2QuY2FsbChjLDEsbS5rZXkpO3RoaXMudmFsdWVDdG9yXz9mLmNhbGwoYywyLHRoaXMud3JhcEVudHJ5XyhtKSxnKTpmLmNhbGwoYywyLG0udmFsdWUpO2MuZW5kU3ViTWVzc2FnZSgpfX07ZnVuY3Rpb24gemUoYSxjLGQpe2Zvcih2YXIgZj1iZS5wcm90b3R5cGUucmVhZFN0cmluZyxnPWJlLnByb3RvdHlwZS5yZWFkTWVzc2FnZSxsPSIiLGs9dm9pZCAwO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspe3ZhciBtPWMuZ2V0RmllbGROdW1iZXIoKTsxPT1tP2w9Zi5jYWxsKGMpOjI9PW0mJihhLnZhbHVlQ3Rvcl8/KGs9bmV3IGEudmFsdWVDdG9yXyxnLmNhbGwoYyxrLGQpKTprPWcuY2FsbChjKSl9YS5zZXQobCxrKX0KTS5zdHJpbmdLZXlzXz1mdW5jdGlvbigpe3ZhciBhPXRoaXMubWFwXyxjPVtdLGQ7Zm9yKGQgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxkKSYmYy5wdXNoKGQpO3JldHVybiBjfTtmdW5jdGlvbiBmZShhLGMpe3RoaXMua2V5PWE7dGhpcy52YWx1ZT1jO3RoaXMudmFsdWVXcmFwcGVyPXZvaWQgMH07Ci8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL21lc3NhZ2UuanMKZnVuY3Rpb24gQWUoKXt9dmFyIEJlPSJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5O0FlLnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZUlkX307ZnVuY3Rpb24gQ2UoYSxjKXtyZXR1cm4gYythLmFycmF5SW5kZXhPZmZzZXRffWZ1bmN0aW9uIERlKGEsYyl7cmV0dXJuIGMtYS5hcnJheUluZGV4T2Zmc2V0X30KZnVuY3Rpb24gRWUoYSxjLGQsZil7YS53cmFwcGVyc189bnVsbDtjfHwoYz1bXSk7YS5tZXNzYWdlSWRfPXZvaWQgMDthLmFycmF5SW5kZXhPZmZzZXRfPS0xO2EuYXJyYXk9YztGZShhKTthLmNvbnZlcnRlZFByaW1pdGl2ZUZpZWxkc189e307aWYoZClmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKXt2YXIgZz1kW2NdO2c8YS5waXZvdF8/KGc9Q2UoYSxnKSxhLmFycmF5W2ddPWEuYXJyYXlbZ118fEdlKTooSGUoYSksYS5leHRlbnNpb25PYmplY3RfW2ddPWEuZXh0ZW5zaW9uT2JqZWN0X1tnXXx8R2UpfWlmKGYmJmYubGVuZ3RoKWZvcihjPTA7YzxmLmxlbmd0aDtjKyspSWUoYSxmW2NdKX12YXIgR2U9T2JqZWN0LmZyZWV6ZT9PYmplY3QuZnJlZXplKFtdKTpbXTtmdW5jdGlvbiBKZShhKXtyZXR1cm4gTmIoYSl9ZnVuY3Rpb24gdWYoYSl7cmV0dXJuIG51bGwhPT1hJiYib2JqZWN0Ij09dHlwZW9mIGEmJiFKZShhKSYmIShCZSYmYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfQpmdW5jdGlvbiBGZShhKXt2YXIgYz1hLmFycmF5Lmxlbmd0aDtpZihjKXstLWM7dmFyIGQ9YS5hcnJheVtjXTtpZih1ZihkKSl7YS5waXZvdF89RGUoYSxjKTthLmV4dGVuc2lvbk9iamVjdF89ZDtyZXR1cm59fWEucGl2b3RfPU51bWJlci5NQVhfVkFMVUV9ZnVuY3Rpb24gSGUoYSl7dmFyIGM9Q2UoYSxhLnBpdm90Xyk7YS5hcnJheVtjXXx8KGEuZXh0ZW5zaW9uT2JqZWN0Xz1hLmFycmF5W2NdPXt9KX1mdW5jdGlvbiB2ZihhLGMsZCl7Zm9yKHZhciBmPVtdLGc9MDtnPGEubGVuZ3RoO2crKylmW2ddPWMuY2FsbChhW2ddLGQsYVtnXSk7cmV0dXJuIGZ9ZnVuY3Rpb24gd2YoYSxjKXtpZihjPGEucGl2b3RfKXtjPUNlKGEsYyk7dmFyIGQ9YS5hcnJheVtjXTtyZXR1cm4gZD09PUdlP2EuYXJyYXlbY109W106ZH1pZihhLmV4dGVuc2lvbk9iamVjdF8pcmV0dXJuIGQ9YS5leHRlbnNpb25PYmplY3RfW2NdLGQ9PT1HZT9hLmV4dGVuc2lvbk9iamVjdF9bY109W106ZH0KZnVuY3Rpb24geGYoYSxjKXtyZXR1cm4gd2YoYSxjKX1mdW5jdGlvbiB5ZihhLGMpe2E9d2YoYSxjKTtyZXR1cm4gbnVsbD09YT9hOithfWZ1bmN0aW9uIHpmKGEpe3ZhciBjPXhmKGEsMSk7YS5jb252ZXJ0ZWRQcmltaXRpdmVGaWVsZHNffHwoYS5jb252ZXJ0ZWRQcmltaXRpdmVGaWVsZHNfPXt9KTtpZighYS5jb252ZXJ0ZWRQcmltaXRpdmVGaWVsZHNfWzFdKXtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyljW2RdPStjW2RdO2EuY29udmVydGVkUHJpbWl0aXZlRmllbGRzX1sxXT0hMH1yZXR1cm4gY31mdW5jdGlvbiBBZihhKXtpZihudWxsPT1hfHxHYihhKSlyZXR1cm4gYTtpZihCZSYmYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIHRjKGEpO2JjKCJDYW5ub3QgY29lcmNlIHRvIGI2NCBzdHJpbmc6ICIrSWIoYSkpO3JldHVybiBudWxsfQpmdW5jdGlvbiBCZihhKXtpZihudWxsPT1hfHxhIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gYTtpZihHYihhKSlyZXR1cm4gRmMoYSk7YmMoIkNhbm5vdCBjb2VyY2UgdG8gVWludDhBcnJheTogIitJYihhKSk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gQ2YoYSl7RGYoYSk7cmV0dXJuIWEubGVuZ3RofHxHYihhWzBdKT9hOmVjKGEsQWYpfWZ1bmN0aW9uIEVmKGEpe0RmKGEpO3JldHVybiFhLmxlbmd0aHx8YVswXWluc3RhbmNlb2YgVWludDhBcnJheT9hOmVjKGEsQmYpfWZ1bmN0aW9uIERmKGEpe2lmKGEmJjE8YS5sZW5ndGgpe3ZhciBjPUliKGFbMF0pO2RjKGEsZnVuY3Rpb24oZCl7SWIoZCkhPWMmJmJjKCJJbmNvbnNpc3RlbnQgdHlwZSBpbiBKU1BCIHJlcGVhdGVkIGZpZWxkIGFycmF5LiBHb3QgIitJYihkKSsiIGV4cGVjdGVkICIrYyl9KX19ZnVuY3Rpb24gRmYoYSxjLGQpe2E9d2YoYSxjKTtyZXR1cm4gbnVsbD09YT9kOmF9CmZ1bmN0aW9uIEdmKGEsYyl7YT15ZihhLGMpO3JldHVybiBudWxsPT1hPzA6YX1mdW5jdGlvbiBIZihhLGMsZCl7YS53cmFwcGVyc198fChhLndyYXBwZXJzXz17fSk7aWYoMSBpbiBhLndyYXBwZXJzXylyZXR1cm4gYS53cmFwcGVyc19bMV07aWYoIWMpcmV0dXJuIGM9d2YoYSwxKSxjfHwoYz1bXSxJZihhLDEsYykpLGEud3JhcHBlcnNfWzFdPW5ldyBlZShjLGQpfWZ1bmN0aW9uIElmKGEsYyxkKXtjPGEucGl2b3RfP2EuYXJyYXlbQ2UoYSxjKV09ZDooSGUoYSksYS5leHRlbnNpb25PYmplY3RfW2NdPWQpfWZ1bmN0aW9uIEpmKGEsYyxkKXtLZihhLGMsZCwwKX1mdW5jdGlvbiBMZihhLGMsZCl7S2YoYSxjLGQsMCl9ZnVuY3Rpb24gTWYoYSxjLGQpe0tmKGEsYyxkLCIiKX1mdW5jdGlvbiBOZihhLGMsZCl7S2YoYSxjLGQsMCl9ZnVuY3Rpb24gS2YoYSxjLGQsZil7ZCE9PWY/SWYoYSxjLGQpOmEuYXJyYXlbQ2UoYSxjKV09bnVsbH0KZnVuY3Rpb24gRmcoYSxjLGQpe2E9eGYoYSwxKTt2b2lkIDAhPWQ/YS5zcGxpY2UoZCwwLGMpOmEucHVzaChjKX1mdW5jdGlvbiBHZyhhLGMsZCxmKXsoZD1JZShhLGQpKSYmZCE9PWMmJnZvaWQgMCE9PWYmJihhLndyYXBwZXJzXyYmZCBpbiBhLndyYXBwZXJzXyYmKGEud3JhcHBlcnNfW2RdPXZvaWQgMCksSWYoYSxkLHZvaWQgMCkpO0lmKGEsYyxmKX1mdW5jdGlvbiBJZShhLGMpe2Zvcih2YXIgZCxmLGc9MDtnPGMubGVuZ3RoO2crKyl7dmFyIGw9Y1tnXSxrPXdmKGEsbCk7bnVsbCE9ayYmKGQ9bCxmPWssSWYoYSxsLHZvaWQgMCkpfXJldHVybiBkPyhJZihhLGQsZiksZCk6MH1mdW5jdGlvbiBIZyhhLGMsZCl7YS53cmFwcGVyc198fChhLndyYXBwZXJzXz17fSk7aWYoIWEud3JhcHBlcnNfW2RdKXt2YXIgZj13ZihhLGQpO2YmJihhLndyYXBwZXJzX1tkXT1uZXcgYyhmKSl9cmV0dXJuIGEud3JhcHBlcnNfW2RdfQpmdW5jdGlvbiBJZyhhLGMsZCl7SmcoYSxjLGQpO2M9YS53cmFwcGVyc19bZF07Yz09R2UmJihjPWEud3JhcHBlcnNfW2RdPVtdKTtyZXR1cm4gY31mdW5jdGlvbiBKZyhhLGMsZCl7YS53cmFwcGVyc198fChhLndyYXBwZXJzXz17fSk7aWYoIWEud3JhcHBlcnNfW2RdKXtmb3IodmFyIGY9eGYoYSxkKSxnPVtdLGw9MDtsPGYubGVuZ3RoO2wrKylnW2xdPW5ldyBjKGZbbF0pO2Eud3JhcHBlcnNfW2RdPWd9fWZ1bmN0aW9uIEtnKGEsYyxkKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTt2YXIgZj1kP2QudG9BcnJheSgpOmQ7YS53cmFwcGVyc19bY109ZDtJZihhLGMsZil9ZnVuY3Rpb24gTGcoYSxjLGQsZil7YS53cmFwcGVyc198fChhLndyYXBwZXJzXz17fSk7dmFyIGc9Zj9mLnRvQXJyYXkoKTpmO2Eud3JhcHBlcnNfW2NdPWY7R2coYSxjLGQsZyl9CmZ1bmN0aW9uIE1nKGEsYyxkKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTtkPWR8fFtdO2Zvcih2YXIgZj1bXSxnPTA7ZzxkLmxlbmd0aDtnKyspZltnXT1kW2ddLnRvQXJyYXkoKTthLndyYXBwZXJzX1tjXT1kO0lmKGEsYyxmKX1mdW5jdGlvbiBOZyhhLGMsZCxmLGcpe0pnKGEsZixjKTt2YXIgbD1hLndyYXBwZXJzX1tjXTtsfHwobD1hLndyYXBwZXJzX1tjXT1bXSk7ZD1kP2Q6bmV3IGY7YT14ZihhLGMpO3ZvaWQgMCE9Zz8obC5zcGxpY2UoZywwLGQpLGEuc3BsaWNlKGcsMCxkLnRvQXJyYXkoKSkpOihsLnB1c2goZCksYS5wdXNoKGQudG9BcnJheSgpKSk7cmV0dXJuIGR9TT1BZS5wcm90b3R5cGU7Ck0uc3luY01hcEZpZWxkc189ZnVuY3Rpb24oKXtpZih0aGlzLndyYXBwZXJzXylmb3IodmFyIGEgaW4gdGhpcy53cmFwcGVyc18pe3ZhciBjPXRoaXMud3JhcHBlcnNfW2FdO2lmKE5iKGMpKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKWNbZF0mJmNbZF0udG9BcnJheSgpO2Vsc2UgYyYmYy50b0FycmF5KCl9fTtNLnRvQXJyYXk9ZnVuY3Rpb24oKXt0aGlzLnN5bmNNYXBGaWVsZHNfKCk7cmV0dXJuIHRoaXMuYXJyYXl9O00udG9TdHJpbmc9ZnVuY3Rpb24oKXt0aGlzLnN5bmNNYXBGaWVsZHNfKCk7cmV0dXJuIHRoaXMuYXJyYXkudG9TdHJpbmcoKX07Ck0uZ2V0RXh0ZW5zaW9uPWZ1bmN0aW9uKGEpe2lmKHRoaXMuZXh0ZW5zaW9uT2JqZWN0Xyl7dGhpcy53cmFwcGVyc198fCh0aGlzLndyYXBwZXJzXz17fSk7dmFyIGM9YS5maWVsZEluZGV4O2lmKGEuaXNSZXBlYXRlZCl7aWYoYS5pc01lc3NhZ2VUeXBlKCkpcmV0dXJuIHRoaXMud3JhcHBlcnNfW2NdfHwodGhpcy53cmFwcGVyc19bY109ZWModGhpcy5leHRlbnNpb25PYmplY3RfW2NdfHxbXSxmdW5jdGlvbihkKXtyZXR1cm4gbmV3IGEuY3RvcihkKX0pKSx0aGlzLndyYXBwZXJzX1tjXX1lbHNlIGlmKGEuaXNNZXNzYWdlVHlwZSgpKXJldHVybiF0aGlzLndyYXBwZXJzX1tjXSYmdGhpcy5leHRlbnNpb25PYmplY3RfW2NdJiYodGhpcy53cmFwcGVyc19bY109bmV3IGEuY3Rvcih0aGlzLmV4dGVuc2lvbk9iamVjdF9bY10pKSx0aGlzLndyYXBwZXJzX1tjXTtyZXR1cm4gdGhpcy5leHRlbnNpb25PYmplY3RfW2NdfX07Ck0uc2V0RXh0ZW5zaW9uPWZ1bmN0aW9uKGEsYyl7dGhpcy53cmFwcGVyc198fCh0aGlzLndyYXBwZXJzXz17fSk7SGUodGhpcyk7dmFyIGQ9YS5maWVsZEluZGV4O2EuaXNSZXBlYXRlZD8oYz1jfHxbXSxhLmlzTWVzc2FnZVR5cGUoKT8odGhpcy53cmFwcGVyc19bZF09Yyx0aGlzLmV4dGVuc2lvbk9iamVjdF9bZF09ZWMoYyxmdW5jdGlvbihmKXtyZXR1cm4gZi50b0FycmF5KCl9KSk6dGhpcy5leHRlbnNpb25PYmplY3RfW2RdPWMpOmEuaXNNZXNzYWdlVHlwZSgpPyh0aGlzLndyYXBwZXJzX1tkXT1jLHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tkXT1jP2MudG9BcnJheSgpOmMpOnRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tkXT1jO3JldHVybiB0aGlzfTtNLmNsb25lTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiBPZyh0aGlzKX07TS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBPZyh0aGlzKX07CmZ1bmN0aW9uIE9nKGEpe3JldHVybiBuZXcgYS5jb25zdHJ1Y3RvcihQZyhhLnRvQXJyYXkoKSkpfWZ1bmN0aW9uIFBnKGEpe2lmKE5iKGEpKXtmb3IodmFyIGM9QXJyYXkoYS5sZW5ndGgpLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGY9YVtkXTtudWxsIT1mJiYoY1tkXT0ib2JqZWN0Ij09dHlwZW9mIGY/UGcoZik6Zil9cmV0dXJuIGN9aWYoQmUmJmEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBuZXcgVWludDhBcnJheShhKTtjPXt9O2ZvcihkIGluIGEpZj1hW2RdLG51bGwhPWYmJihjW2RdPSJvYmplY3QiPT10eXBlb2YgZj9QZyhmKTpmKTtyZXR1cm4gY307Ci8vfn5XRUJQQVRIfn5leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2RlYnVnLmpzCi8vfn5XRUJQQVRIfn5iYXplbC1vdXQvaG9zdC9iaW4vZXh0ZXJuYWwvb3JnX3RlbnNvcmZsb3cvdGVuc29yZmxvdy9jb3JlL2V4YW1wbGVfcHJvdG9zLmpzCmZ1bmN0aW9uIFFnKGEpe0VlKHRoaXMsYSxSZyxudWxsKX1RYihRZyxBZSk7ZnVuY3Rpb24gU2coYSl7RWUodGhpcyxhLFRnLG51bGwpfVFiKFNnLEFlKTtmdW5jdGlvbiBVZyhhKXtFZSh0aGlzLGEsVmcsbnVsbCl9UWIoVWcsQWUpO2Z1bmN0aW9uIFdnKGEpe0VlKHRoaXMsYSxudWxsLFhnKX1RYihXZyxBZSk7ZnVuY3Rpb24gWWcoYSl7RWUodGhpcyxhLG51bGwsbnVsbCl9UWIoWWcsQWUpO2Z1bmN0aW9uIFpnKGEpe0VlKHRoaXMsYSxKaCxudWxsKX1RYihaZyxBZSk7ZnVuY3Rpb24gS2goYSl7RWUodGhpcyxhLG51bGwsbnVsbCl9UWIoS2gsQWUpO3ZhciBSZz1bMV07TT1RZy5wcm90b3R5cGU7TS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gTGgoYSx0aGlzKX07ZnVuY3Rpb24gTGgoYSxjKXt2YXIgZD17dmFsdWVMaXN0OmMuZ2V0VmFsdWVMaXN0X2FzQjY0KCl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiBNaChhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkQnl0ZXMoKTthLmFkZFZhbHVlKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1NLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyBkZTtOaCh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBOaChhLGMpe2E9YS5nZXRWYWx1ZUxpc3RfYXNVOCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZEJ5dGVzKGEpfU0uZ2V0VmFsdWVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHhmKHRoaXMsMSl9O00uZ2V0VmFsdWVMaXN0X2FzQjY0PWZ1bmN0aW9uKCl7cmV0dXJuIENmKHRoaXMuZ2V0VmFsdWVMaXN0KCkpfTtNLmdldFZhbHVlTGlzdF9hc1U4PWZ1bmN0aW9uKCl7cmV0dXJuIEVmKHRoaXMuZ2V0VmFsdWVMaXN0KCkpfTsKTS5zZXRWYWx1ZUxpc3Q9ZnVuY3Rpb24oYSl7SWYodGhpcywxLGF8fFtdKX07TS5hZGRWYWx1ZT1mdW5jdGlvbihhLGMpe0ZnKHRoaXMsYSxjKX07TS5jbGVhclZhbHVlTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0VmFsdWVMaXN0KFtdKX07dmFyIFRnPVsxXTtNPVNnLnByb3RvdHlwZTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBPaChhLHRoaXMpfTtmdW5jdGlvbiBPaChhLGMpe3ZhciBkLGY9e3ZhbHVlTGlzdDpudWxsPT0oZD16ZihjKSk/dm9pZCAwOmR9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfWZ1bmN0aW9uIFBoKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRQYWNrZWRGbG9hdCgpO2Euc2V0VmFsdWVMaXN0KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX0KTS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7UWgodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gUWgoYSxjKXthPWEuZ2V0VmFsdWVMaXN0KCk7MDxhLmxlbmd0aCYmYy53cml0ZVBhY2tlZEZsb2F0KGEpfU0uZ2V0VmFsdWVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHpmKHRoaXMpfTtNLnNldFZhbHVlTGlzdD1mdW5jdGlvbihhKXtJZih0aGlzLDEsYXx8W10pfTtNLmFkZFZhbHVlPWZ1bmN0aW9uKGEsYyl7RmcodGhpcyxhLGMpfTtNLmNsZWFyVmFsdWVMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRWYWx1ZUxpc3QoW10pfTt2YXIgVmc9WzFdO009VWcucHJvdG90eXBlO00udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIFJoKGEsdGhpcyl9O2Z1bmN0aW9uIFJoKGEsYyl7dmFyIGQsZj17dmFsdWVMaXN0Om51bGw9PShkPXhmKGMsMSkpP3ZvaWQgMDpkfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gU2goYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWMucmVhZFBhY2tlZEludDY0KCk7YS5zZXRWYWx1ZUxpc3QoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU0uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGRlO1RoKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uIFRoKGEsYyl7YT1hLmdldFZhbHVlTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVQYWNrZWRJbnQ2NChhKX1NLmdldFZhbHVlTGlzdD1mdW5jdGlvbigpe3JldHVybiB4Zih0aGlzLDEpfTtNLnNldFZhbHVlTGlzdD1mdW5jdGlvbihhKXtJZih0aGlzLDEsYXx8W10pfTtNLmFkZFZhbHVlPWZ1bmN0aW9uKGEsYyl7RmcodGhpcyxhLGMpfTtNLmNsZWFyVmFsdWVMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRWYWx1ZUxpc3QoW10pfTsKdmFyIFhnPVtbMSwyLDNdXTtNPVdnLnByb3RvdHlwZTtNLmdldEtpbmRDYXNlPWZ1bmN0aW9uKCl7cmV0dXJuIEllKHRoaXMsWGdbMF0pfTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBVaChhLHRoaXMpfTtmdW5jdGlvbiBVaChhLGMpe3ZhciBkLGY9e2J5dGVzTGlzdDooZD1jLmdldEJ5dGVzTGlzdCgpKSYmTGgoYSxkKSxmbG9hdExpc3Q6KGQ9Yy5nZXRGbG9hdExpc3QoKSkmJk9oKGEsZCksaW50NjRMaXN0OihkPWMuZ2V0SW50NjRMaXN0KCkpJiZSaChhLGQpfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gVmgoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBRZztjLnJlYWRNZXNzYWdlKGQsTWgpO2Euc2V0Qnl0ZXNMaXN0KGQpO2JyZWFrO2Nhc2UgMjpkPW5ldyBTZztjLnJlYWRNZXNzYWdlKGQsUGgpO2Euc2V0RmxvYXRMaXN0KGQpO2JyZWFrO2Nhc2UgMzpkPW5ldyBVZztjLnJlYWRNZXNzYWdlKGQsU2gpO2Euc2V0SW50NjRMaXN0KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1NLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyBkZTtXaCh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gV2goYSxjKXt2YXIgZD1hLmdldEJ5dGVzTGlzdCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDEsZCxOaCk7ZD1hLmdldEZsb2F0TGlzdCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDIsZCxRaCk7ZD1hLmdldEludDY0TGlzdCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDMsZCxUaCl9TS5nZXRCeXRlc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyxRZywxKX07TS5zZXRCeXRlc0xpc3Q9ZnVuY3Rpb24oYSl7TGcodGhpcywxLFhnWzBdLGEpfTtNLmNsZWFyQnl0ZXNMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRCeXRlc0xpc3Qodm9pZCAwKX07TS5oYXNCeXRlc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcywxKX07TS5nZXRGbG9hdExpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyxTZywyKX07TS5zZXRGbG9hdExpc3Q9ZnVuY3Rpb24oYSl7TGcodGhpcywyLFhnWzBdLGEpfTtNLmNsZWFyRmxvYXRMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRGbG9hdExpc3Qodm9pZCAwKX07Ck0uaGFzRmxvYXRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsMil9O00uZ2V0SW50NjRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMsVWcsMyl9O00uc2V0SW50NjRMaXN0PWZ1bmN0aW9uKGEpe0xnKHRoaXMsMyxYZ1swXSxhKX07TS5jbGVhckludDY0TGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0SW50NjRMaXN0KHZvaWQgMCl9O00uaGFzSW50NjRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsMyl9O1lnLnByb3RvdHlwZS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gWGgoYSx0aGlzKX07ZnVuY3Rpb24gWGgoYSxjKXt2YXIgZCxmPXtmZWF0dXJlTWFwOihkPWMuZ2V0RmVhdHVyZU1hcCgpKT9kLnRvT2JqZWN0KGEsVWgpOltdfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gWWgoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWEuZ2V0RmVhdHVyZU1hcCgpO2MucmVhZE1lc3NhZ2UoZCxmdW5jdGlvbihmLGcpe3plKGYsZyxWaCl9KTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9WWcucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyBkZTtaaCh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBaaChhLGMpeyhhPWEuZ2V0RmVhdHVyZU1hcCghMCkpJiYwPGEuZ2V0TGVuZ3RoKCkmJmEuc2VyaWFsaXplQmluYXJ5KDEsYyxkZS5wcm90b3R5cGUud3JpdGVTdHJpbmcsZGUucHJvdG90eXBlLndyaXRlTWVzc2FnZSxXaCl9WWcucHJvdG90eXBlLmdldEZlYXR1cmVNYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIEhmKHRoaXMsYSxXZyl9OwpZZy5wcm90b3R5cGUuY2xlYXJGZWF0dXJlTWFwPWZ1bmN0aW9uKCl7dGhpcy5nZXRGZWF0dXJlTWFwKCkuY2xlYXIoKX07dmFyIEpoPVsxXTtNPVpnLnByb3RvdHlwZTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiAkaChhLHRoaXMpfTtmdW5jdGlvbiAkaChhLGMpe3ZhciBkPXtmZWF0dXJlTGlzdDp2ZihjLmdldEZlYXR1cmVMaXN0KCksVWgsYSl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfWZ1bmN0aW9uIGFpKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgV2c7Yy5yZWFkTWVzc2FnZShkLFZoKTthLmFkZEZlYXR1cmUoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU0uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGRlO2JpKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBiaShhLGMpe2E9YS5nZXRGZWF0dXJlTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMSxhLFdoKX1NLmdldEZlYXR1cmVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIElnKHRoaXMsV2csMSl9O00uc2V0RmVhdHVyZUxpc3Q9ZnVuY3Rpb24oYSl7TWcodGhpcywxLGEpfTtNLmFkZEZlYXR1cmU9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gTmcodGhpcywxLGEsV2csYyl9O00uY2xlYXJGZWF0dXJlTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZUxpc3QoW10pfTtLaC5wcm90b3R5cGUudG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGNpKGEsdGhpcyl9O2Z1bmN0aW9uIGNpKGEsYyl7dmFyIGQsZj17ZmVhdHVyZUxpc3RNYXA6KGQ9Yy5nZXRGZWF0dXJlTGlzdE1hcCgpKT9kLnRvT2JqZWN0KGEsJGgpOltdfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gZGkoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWEuZ2V0RmVhdHVyZUxpc3RNYXAoKTtjLnJlYWRNZXNzYWdlKGQsZnVuY3Rpb24oZixnKXt6ZShmLGcsYWkpfSk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfUtoLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7ZWkodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gZWkoYSxjKXsoYT1hLmdldEZlYXR1cmVMaXN0TWFwKCEwKSkmJjA8YS5nZXRMZW5ndGgoKSYmYS5zZXJpYWxpemVCaW5hcnkoMSxjLGRlLnByb3RvdHlwZS53cml0ZVN0cmluZyxkZS5wcm90b3R5cGUud3JpdGVNZXNzYWdlLGJpKX1LaC5wcm90b3R5cGUuZ2V0RmVhdHVyZUxpc3RNYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIEhmKHRoaXMsYSxaZyl9OwpLaC5wcm90b3R5cGUuY2xlYXJGZWF0dXJlTGlzdE1hcD1mdW5jdGlvbigpe3RoaXMuZ2V0RmVhdHVyZUxpc3RNYXAoKS5jbGVhcigpfTtmdW5jdGlvbiBmaShhKXtFZSh0aGlzLGEsbnVsbCxudWxsKX1RYihmaSxBZSk7ZnVuY3Rpb24gZ2koYSl7RWUodGhpcyxhLG51bGwsbnVsbCl9UWIoZ2ksQWUpO009ZmkucHJvdG90eXBlO00udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGhpKGEsdGhpcyl9O2Z1bmN0aW9uIGhpKGEsYyl7dmFyIGQsZj17ZmVhdHVyZXM6KGQ9Yy5nZXRGZWF0dXJlcygpKSYmWGgoYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9ZnVuY3Rpb24gaWkoYSl7YT1uZXcgYmUoYSk7dmFyIGM9bmV3IGZpO3JldHVybiBqaShjLGEpfQpmdW5jdGlvbiBqaShhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9bmV3IFlnO2MucmVhZE1lc3NhZ2UoZCxZaCk7YS5zZXRGZWF0dXJlcyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9TS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7a2kodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24ga2koYSxjKXthPWEuZ2V0RmVhdHVyZXMoKTtudWxsIT1hJiZjLndyaXRlTWVzc2FnZSgxLGEsWmgpfU0uZ2V0RmVhdHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyxZZywxKX07TS5zZXRGZWF0dXJlcz1mdW5jdGlvbihhKXtLZyh0aGlzLDEsYSl9O00uY2xlYXJGZWF0dXJlcz1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZXModm9pZCAwKX07Ck0uaGFzRmVhdHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcywxKX07TT1naS5wcm90b3R5cGU7TS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gbGkoYSx0aGlzKX07ZnVuY3Rpb24gbGkoYSxjKXt2YXIgZCxmPXtjb250ZXh0OihkPWMuZ2V0Q29udGV4dCgpKSYmWGgoYSxkKSxmZWF0dXJlTGlzdHM6KGQ9Yy5nZXRGZWF0dXJlTGlzdHMoKSkmJmNpKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfWZ1bmN0aW9uIG1pKGEpe2E9bmV3IGJlKGEpO3ZhciBjPW5ldyBnaTtyZXR1cm4gbmkoYyxhKX0KZnVuY3Rpb24gbmkoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBZZztjLnJlYWRNZXNzYWdlKGQsWWgpO2Euc2V0Q29udGV4dChkKTticmVhaztjYXNlIDI6ZD1uZXcgS2g7Yy5yZWFkTWVzc2FnZShkLGRpKTthLnNldEZlYXR1cmVMaXN0cyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9TS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7b2kodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gb2koYSxjKXt2YXIgZD1hLmdldENvbnRleHQoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgxLGQsWmgpO2Q9YS5nZXRGZWF0dXJlTGlzdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgyLGQsZWkpfU0uZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBIZyh0aGlzLFlnLDEpfTsKTS5zZXRDb250ZXh0PWZ1bmN0aW9uKGEpe0tnKHRoaXMsMSxhKX07TS5jbGVhckNvbnRleHQ9ZnVuY3Rpb24oKXt0aGlzLnNldENvbnRleHQodm9pZCAwKX07TS5oYXNDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsMSl9O00uZ2V0RmVhdHVyZUxpc3RzPWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMsS2gsMil9O00uc2V0RmVhdHVyZUxpc3RzPWZ1bmN0aW9uKGEpe0tnKHRoaXMsMixhKX07TS5jbGVhckZlYXR1cmVMaXN0cz1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZUxpc3RzKHZvaWQgMCl9O00uaGFzRmVhdHVyZUxpc3RzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsMil9OwovL35+V0VCUEFUSH5+YmF6ZWwtb3V0L2hvc3QvYmluL2V4dGVybmFsL2FpX2dvb2dsZV9wYWlyX2ZhY2V0cy9mYWNldHNfb3ZlcnZpZXcvcHJvdG8vZmVhdHVyZV9zdGF0aXN0aWNzX3Byb3RvLmpzCmZ1bmN0aW9uIHBpKGEpe0VlKHRoaXMsYSxxaSxudWxsKX1RYihwaSxBZSk7ZnVuY3Rpb24gamooYSl7RWUodGhpcyxhLGtqLG51bGwpfVFiKGpqLEFlKTtmdW5jdGlvbiBsaihhKXtFZSh0aGlzLGEsbWosbnVsbCl9UWIobGosQWUpO2Z1bmN0aW9uIG5qKGEpe0VlKHRoaXMsYSxvaixwail9UWIobmosQWUpO2Z1bmN0aW9uIHFqKGEpe0VlKHRoaXMsYSxudWxsLG51bGwpfVFiKHFqLEFlKTtmdW5jdGlvbiByaihhKXtFZSh0aGlzLGEsbnVsbCxzail9UWIocmosQWUpO2Z1bmN0aW9uIHRqKGEpe0VlKHRoaXMsYSx1aixudWxsKX1RYih0aixBZSk7ZnVuY3Rpb24gdmooYSl7RWUodGhpcyxhLHdqLG51bGwpfVFiKHZqLEFlKTtmdW5jdGlvbiB4aihhKXtFZSh0aGlzLGEsbnVsbCxudWxsKX1RYih4aixBZSk7ZnVuY3Rpb24geWooYSl7RWUodGhpcyxhLHpqLG51bGwpfVFiKHlqLEFlKTtmdW5jdGlvbiBBaihhKXtFZSh0aGlzLGEsQmosbnVsbCl9UWIoQWosQWUpOwpmdW5jdGlvbiBDaihhKXtFZSh0aGlzLGEsbnVsbCxudWxsKX1RYihDaixBZSk7ZnVuY3Rpb24gRGooYSl7RWUodGhpcyxhLG51bGwsbnVsbCl9UWIoRGosQWUpO2Z1bmN0aW9uIEVqKGEpe0VlKHRoaXMsYSxudWxsLG51bGwpfVFiKEVqLEFlKTtmdW5jdGlvbiBGaihhKXtFZSh0aGlzLGEsR2osbnVsbCl9UWIoRmosQWUpO2Z1bmN0aW9uIEhqKGEpe0VlKHRoaXMsYSxudWxsLG51bGwpfVFiKEhqLEFlKTtmdW5jdGlvbiBJaihhKXtFZSh0aGlzLGEsSmosbnVsbCl9UWIoSWosQWUpO2Z1bmN0aW9uIEtqKGEpe0VlKHRoaXMsYSxudWxsLG51bGwpfVFiKEtqLEFlKTt2YXIgcWk9WzFdO009cGkucHJvdG90eXBlO00udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIExqKGEsdGhpcyl9O2Z1bmN0aW9uIExqKGEsYyl7dmFyIGQ9e2RhdGFzZXRzTGlzdDp2ZihjLmdldERhdGFzZXRzTGlzdCgpLE1qLGEpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH0KZnVuY3Rpb24gTmooYSl7YT1uZXcgYmUoYSk7dmFyIGM9bmV3IHBpO3JldHVybiBPaihjLGEpfWZ1bmN0aW9uIE9qKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgbGo7Yy5yZWFkTWVzc2FnZShkLFBqKTthLmFkZERhdGFzZXRzKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1NLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyBkZTtRaih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBRaihhLGMpe2E9YS5nZXREYXRhc2V0c0xpc3QoKTswPGEubGVuZ3RoJiZjLndyaXRlUmVwZWF0ZWRNZXNzYWdlKDEsYSxSail9TS5nZXREYXRhc2V0c0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSWcodGhpcyxsaiwxKX07TS5zZXREYXRhc2V0c0xpc3Q9ZnVuY3Rpb24oKXtNZyh0aGlzLDEsW10pfTsKTS5hZGREYXRhc2V0cz1mdW5jdGlvbihhKXtOZyh0aGlzLDEsYSxsaix2b2lkIDApfTtNLmNsZWFyRGF0YXNldHNMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXREYXRhc2V0c0xpc3QoKX07dmFyIGtqPVsxXTtNPWpqLnByb3RvdHlwZTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBTaihhLHRoaXMpfTtmdW5jdGlvbiBTaihhLGMpe3ZhciBkLGY9e3N0ZXBMaXN0Om51bGw9PShkPXhmKGMsMSkpP3ZvaWQgMDpkfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn1mdW5jdGlvbiBUaihhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkU3RyaW5nKCk7YS5hZGRTdGVwKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1NLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyBkZTtVaih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gVWooYSxjKXthPWEuZ2V0U3RlcExpc3QoKTswPGEubGVuZ3RoJiZjLndyaXRlUmVwZWF0ZWRTdHJpbmcoYSl9TS5nZXRTdGVwTGlzdD1mdW5jdGlvbigpe3JldHVybiB4Zih0aGlzLDEpfTtNLnNldFN0ZXBMaXN0PWZ1bmN0aW9uKCl7SWYodGhpcywxLFtdKX07TS5hZGRTdGVwPWZ1bmN0aW9uKGEpe0ZnKHRoaXMsYSx2b2lkIDApfTtNLmNsZWFyU3RlcExpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldFN0ZXBMaXN0KCl9O3ZhciBtaj1bM107TT1sai5wcm90b3R5cGU7TS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gTWooYSx0aGlzKX07ZnVuY3Rpb24gTWooYSxjKXt2YXIgZD17bmFtZTpGZihjLDEsIiIpLG51bUV4YW1wbGVzOkZmKGMsMiwwKSx3ZWlnaHRlZE51bUV4YW1wbGVzOkdmKGMsNCksZmVhdHVyZXNMaXN0OnZmKGMuZ2V0RmVhdHVyZXNMaXN0KCksVmosYSl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiBQaihhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkU3RyaW5nKCk7YS5zZXROYW1lKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0TnVtRXhhbXBsZXMoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRXZWlnaHRlZE51bUV4YW1wbGVzKGQpO2JyZWFrO2Nhc2UgMzpkPW5ldyBuajtjLnJlYWRNZXNzYWdlKGQsV2opO2EuYWRkRmVhdHVyZXMoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU0uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGRlO1JqKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBSaihhLGMpe3ZhciBkPWEuZ2V0TmFtZSgpOzA8ZC5sZW5ndGgmJmMud3JpdGVTdHJpbmcoMSxkKTtkPWEuZ2V0TnVtRXhhbXBsZXMoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgyLGQpO2Q9YS5nZXRXZWlnaHRlZE51bUV4YW1wbGVzKCk7MCE9PWQmJmMud3JpdGVEb3VibGUoNCxkKTtkPWEuZ2V0RmVhdHVyZXNMaXN0KCk7MDxkLmxlbmd0aCYmYy53cml0ZVJlcGVhdGVkTWVzc2FnZSgzLGQsWGopfU0uZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiBGZih0aGlzLDEsIiIpfTtNLnNldE5hbWU9ZnVuY3Rpb24oYSl7TWYodGhpcywxLGEpfTtNLmdldE51bUV4YW1wbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIEZmKHRoaXMsMiwwKX07TS5zZXROdW1FeGFtcGxlcz1mdW5jdGlvbihhKXtKZih0aGlzLDIsYSl9O00uZ2V0V2VpZ2h0ZWROdW1FeGFtcGxlcz1mdW5jdGlvbigpe3JldHVybiBHZih0aGlzLDQpfTsKTS5zZXRXZWlnaHRlZE51bUV4YW1wbGVzPWZ1bmN0aW9uKGEpe0xmKHRoaXMsNCxhKX07TS5nZXRGZWF0dXJlc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSWcodGhpcyxuaiwzKX07TS5zZXRGZWF0dXJlc0xpc3Q9ZnVuY3Rpb24oKXtNZyh0aGlzLDMsW10pfTtNLmFkZEZlYXR1cmVzPWZ1bmN0aW9uKGEpe05nKHRoaXMsMyxhLG5qLHZvaWQgMCl9O00uY2xlYXJGZWF0dXJlc0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldEZlYXR1cmVzTGlzdCgpfTt2YXIgb2o9WzZdLHBqPVtbMSw4XSxbMyw0LDUsN11dO009bmoucHJvdG90eXBlO00uZ2V0RmllbGRJZENhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gSWUodGhpcyxwalswXSl9O00uZ2V0U3RhdHNDYXNlPWZ1bmN0aW9uKCl7cmV0dXJuIEllKHRoaXMscGpbMV0pfTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBWaihhLHRoaXMpfTsKZnVuY3Rpb24gVmooYSxjKXt2YXIgZCxmPXtuYW1lOkZmKGMsMSwiIikscGF0aDooZD1jLmdldFBhdGgoKSkmJlNqKGEsZCksdHlwZTpGZihjLDIsMCksbnVtU3RhdHM6KGQ9Yy5nZXROdW1TdGF0cygpKSYmWWooYSxkKSxzdHJpbmdTdGF0czooZD1jLmdldFN0cmluZ1N0YXRzKCkpJiZaaihhLGQpLGJ5dGVzU3RhdHM6KGQ9Yy5nZXRCeXRlc1N0YXRzKCkpJiZhayhhLGQpLHN0cnVjdFN0YXRzOihkPWMuZ2V0U3RydWN0U3RhdHMoKSkmJmJrKGEsZCksY3VzdG9tU3RhdHNMaXN0OnZmKGMuZ2V0Q3VzdG9tU3RhdHNMaXN0KCksY2ssYSl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfQpmdW5jdGlvbiBXaihhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkU3RyaW5nKCk7YS5zZXROYW1lKGQpO2JyZWFrO2Nhc2UgODpkPW5ldyBqajtjLnJlYWRNZXNzYWdlKGQsVGopO2Euc2V0UGF0aChkKTticmVhaztjYXNlIDI6ZD1jLnJlYWRFbnVtKCk7YS5zZXRUeXBlKGQpO2JyZWFrO2Nhc2UgMzpkPW5ldyB0ajtjLnJlYWRNZXNzYWdlKGQsZGspO2Euc2V0TnVtU3RhdHMoZCk7YnJlYWs7Y2FzZSA0OmQ9bmV3IHZqO2MucmVhZE1lc3NhZ2UoZCxlayk7YS5zZXRTdHJpbmdTdGF0cyhkKTticmVhaztjYXNlIDU6ZD1uZXcgQ2o7Yy5yZWFkTWVzc2FnZShkLGZrKTthLnNldEJ5dGVzU3RhdHMoZCk7YnJlYWs7Y2FzZSA3OmQ9bmV3IERqO2MucmVhZE1lc3NhZ2UoZCxnayk7YS5zZXRTdHJ1Y3RTdGF0cyhkKTticmVhaztjYXNlIDY6ZD1uZXcgcmo7Yy5yZWFkTWVzc2FnZShkLGhrKTsKYS5hZGRDdXN0b21TdGF0cyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9TS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7WGoodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIFhqKGEsYyl7dmFyIGQ9d2YoYSwxKTtudWxsIT1kJiZjLndyaXRlU3RyaW5nKDEsZCk7ZD1hLmdldFBhdGgoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg4LGQsVWopO2Q9YS5nZXRUeXBlKCk7MCE9PWQmJmMud3JpdGVFbnVtKDIsZCk7ZD1hLmdldE51bVN0YXRzKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoMyxkLGlrKTtkPWEuZ2V0U3RyaW5nU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg0LGQsamspO2Q9YS5nZXRCeXRlc1N0YXRzKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoNSxkLGtrKTtkPWEuZ2V0U3RydWN0U3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg3LGQsbGspO2Q9YS5nZXRDdXN0b21TdGF0c0xpc3QoKTswPGQubGVuZ3RoJiZjLndyaXRlUmVwZWF0ZWRNZXNzYWdlKDYsZCxtayl9TS5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIEZmKHRoaXMsMSwiIil9O00uc2V0TmFtZT1mdW5jdGlvbihhKXtHZyh0aGlzLDEscGpbMF0sYSl9OwpNLmNsZWFyTmFtZT1mdW5jdGlvbigpe0dnKHRoaXMsMSxwalswXSx2b2lkIDApfTtNLmhhc05hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcywxKX07TS5nZXRQYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMsamosOCl9O00uc2V0UGF0aD1mdW5jdGlvbihhKXtMZyh0aGlzLDgscGpbMF0sYSl9O00uY2xlYXJQYXRoPWZ1bmN0aW9uKCl7dGhpcy5zZXRQYXRoKHZvaWQgMCl9O00uaGFzUGF0aD1mdW5jdGlvbigpe3JldHVybiBudWxsIT13Zih0aGlzLDgpfTtNLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gRmYodGhpcywyLDApfTtNLnNldFR5cGU9ZnVuY3Rpb24oYSl7TmYodGhpcywyLGEpfTtNLmdldE51bVN0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMsdGosMyl9O00uc2V0TnVtU3RhdHM9ZnVuY3Rpb24oYSl7TGcodGhpcywzLHBqWzFdLGEpfTtNLmNsZWFyTnVtU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldE51bVN0YXRzKHZvaWQgMCl9OwpNLmhhc051bVN0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsMyl9O00uZ2V0U3RyaW5nU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyx2aiw0KX07TS5zZXRTdHJpbmdTdGF0cz1mdW5jdGlvbihhKXtMZyh0aGlzLDQscGpbMV0sYSl9O00uY2xlYXJTdHJpbmdTdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0U3RyaW5nU3RhdHModm9pZCAwKX07TS5oYXNTdHJpbmdTdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT13Zih0aGlzLDQpfTtNLmdldEJ5dGVzU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyxDaiw1KX07TS5zZXRCeXRlc1N0YXRzPWZ1bmN0aW9uKGEpe0xnKHRoaXMsNSxwalsxXSxhKX07TS5jbGVhckJ5dGVzU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldEJ5dGVzU3RhdHModm9pZCAwKX07TS5oYXNCeXRlc1N0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsNSl9OwpNLmdldFN0cnVjdFN0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMsRGosNyl9O00uc2V0U3RydWN0U3RhdHM9ZnVuY3Rpb24oYSl7TGcodGhpcyw3LHBqWzFdLGEpfTtNLmNsZWFyU3RydWN0U3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldFN0cnVjdFN0YXRzKHZvaWQgMCl9O00uaGFzU3RydWN0U3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcyw3KX07TS5nZXRDdXN0b21TdGF0c0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSWcodGhpcyxyaiw2KX07TS5zZXRDdXN0b21TdGF0c0xpc3Q9ZnVuY3Rpb24oKXtNZyh0aGlzLDYsW10pfTtNLmFkZEN1c3RvbVN0YXRzPWZ1bmN0aW9uKGEpe05nKHRoaXMsNixhLHJqLHZvaWQgMCl9O00uY2xlYXJDdXN0b21TdGF0c0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldEN1c3RvbVN0YXRzTGlzdCgpfTtNPXFqLnByb3RvdHlwZTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBuayhhLHRoaXMpfTsKZnVuY3Rpb24gbmsoYSxjKXt2YXIgZD17bnVtTm9uTWlzc2luZzpHZihjLDEpLG51bU1pc3Npbmc6R2YoYywyKSxhdmdOdW1WYWx1ZXM6R2YoYywzKSx0b3ROdW1WYWx1ZXM6R2YoYyw0KX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9ZnVuY3Rpb24gb2soYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWMucmVhZERvdWJsZSgpO2Euc2V0TnVtTm9uTWlzc2luZyhkKTticmVhaztjYXNlIDI6ZD1jLnJlYWREb3VibGUoKTthLnNldE51bU1pc3NpbmcoZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRBdmdOdW1WYWx1ZXMoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRUb3ROdW1WYWx1ZXMoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfQpNLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyBkZTtwayh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBwayhhLGMpe3ZhciBkPWEuZ2V0TnVtTm9uTWlzc2luZygpOzAhPT1kJiZjLndyaXRlRG91YmxlKDEsZCk7ZD1hLmdldE51bU1pc3NpbmcoKTswIT09ZCYmYy53cml0ZURvdWJsZSgyLGQpO2Q9YS5nZXRBdmdOdW1WYWx1ZXMoKTswIT09ZCYmYy53cml0ZURvdWJsZSgzLGQpO2Q9YS5nZXRUb3ROdW1WYWx1ZXMoKTswIT09ZCYmYy53cml0ZURvdWJsZSg0LGQpfU0uZ2V0TnVtTm9uTWlzc2luZz1mdW5jdGlvbigpe3JldHVybiBHZih0aGlzLDEpfTtNLnNldE51bU5vbk1pc3Npbmc9ZnVuY3Rpb24oYSl7TGYodGhpcywxLGEpfTtNLmdldE51bU1pc3Npbmc9ZnVuY3Rpb24oKXtyZXR1cm4gR2YodGhpcywyKX07TS5zZXROdW1NaXNzaW5nPWZ1bmN0aW9uKGEpe0xmKHRoaXMsMixhKX07Ck0uZ2V0QXZnTnVtVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIEdmKHRoaXMsMyl9O00uc2V0QXZnTnVtVmFsdWVzPWZ1bmN0aW9uKGEpe0xmKHRoaXMsMyxhKX07TS5nZXRUb3ROdW1WYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gR2YodGhpcyw0KX07TS5zZXRUb3ROdW1WYWx1ZXM9ZnVuY3Rpb24oYSl7TGYodGhpcyw0LGEpfTt2YXIgc2o9W1syLDMsNCw1XV07TT1yai5wcm90b3R5cGU7TS5nZXRWYWxDYXNlPWZ1bmN0aW9uKCl7cmV0dXJuIEllKHRoaXMsc2pbMF0pfTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBjayhhLHRoaXMpfTsKZnVuY3Rpb24gY2soYSxjKXt2YXIgZCxmPXtuYW1lOkZmKGMsMSwiIiksbnVtOkdmKGMsMiksc3RyOkZmKGMsMywiIiksaGlzdG9ncmFtOihkPWMuZ2V0SGlzdG9ncmFtKCkpJiZxayhhLGQpLHJhbmtIaXN0b2dyYW06KGQ9Yy5nZXRSYW5rSGlzdG9ncmFtKCkpJiZyayhhLGQpfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gaGsoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWMucmVhZFN0cmluZygpO2Euc2V0TmFtZShkKTticmVhaztjYXNlIDI6ZD1jLnJlYWREb3VibGUoKTthLnNldE51bShkKTticmVhaztjYXNlIDM6ZD1jLnJlYWRTdHJpbmcoKTthLnNldFN0cihkKTticmVhaztjYXNlIDQ6ZD1uZXcgRmo7Yy5yZWFkTWVzc2FnZShkLHNrKTthLnNldEhpc3RvZ3JhbShkKTticmVhaztjYXNlIDU6ZD1uZXcgSWo7Yy5yZWFkTWVzc2FnZShkLHRrKTthLnNldFJhbmtIaXN0b2dyYW0oZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU0uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGRlO21rKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBtayhhLGMpe3ZhciBkPWEuZ2V0TmFtZSgpOzA8ZC5sZW5ndGgmJmMud3JpdGVTdHJpbmcoMSxkKTtkPXdmKGEsMik7bnVsbCE9ZCYmYy53cml0ZURvdWJsZSgyLGQpO2Q9d2YoYSwzKTtudWxsIT1kJiZjLndyaXRlU3RyaW5nKDMsZCk7ZD1hLmdldEhpc3RvZ3JhbSgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDQsZCx1ayk7ZD1hLmdldFJhbmtIaXN0b2dyYW0oKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg1LGQsdmspfU0uZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiBGZih0aGlzLDEsIiIpfTtNLnNldE5hbWU9ZnVuY3Rpb24oYSl7TWYodGhpcywxLGEpfTtNLmdldE51bT1mdW5jdGlvbigpe3JldHVybiBHZih0aGlzLDIpfTtNLnNldE51bT1mdW5jdGlvbihhKXtHZyh0aGlzLDIsc2pbMF0sYSl9O00uY2xlYXJOdW09ZnVuY3Rpb24oKXtHZyh0aGlzLDIsc2pbMF0sdm9pZCAwKX07TS5oYXNOdW09ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcywyKX07Ck0uZ2V0U3RyPWZ1bmN0aW9uKCl7cmV0dXJuIEZmKHRoaXMsMywiIil9O00uc2V0U3RyPWZ1bmN0aW9uKGEpe0dnKHRoaXMsMyxzalswXSxhKX07TS5jbGVhclN0cj1mdW5jdGlvbigpe0dnKHRoaXMsMyxzalswXSx2b2lkIDApfTtNLmhhc1N0cj1mdW5jdGlvbigpe3JldHVybiBudWxsIT13Zih0aGlzLDMpfTtNLmdldEhpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBIZyh0aGlzLEZqLDQpfTtNLnNldEhpc3RvZ3JhbT1mdW5jdGlvbihhKXtMZyh0aGlzLDQsc2pbMF0sYSl9O00uY2xlYXJIaXN0b2dyYW09ZnVuY3Rpb24oKXt0aGlzLnNldEhpc3RvZ3JhbSh2b2lkIDApfTtNLmhhc0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBudWxsIT13Zih0aGlzLDQpfTtNLmdldFJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyxJaiw1KX07TS5zZXRSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKGEpe0xnKHRoaXMsNSxzalswXSxhKX07TS5jbGVhclJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXt0aGlzLnNldFJhbmtIaXN0b2dyYW0odm9pZCAwKX07Ck0uaGFzUmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBudWxsIT13Zih0aGlzLDUpfTt2YXIgdWo9WzhdO009dGoucHJvdG90eXBlO00udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIFlqKGEsdGhpcyl9O2Z1bmN0aW9uIFlqKGEsYyl7dmFyIGQsZj17Y29tbW9uU3RhdHM6KGQ9Yy5nZXRDb21tb25TdGF0cygpKSYmd2soYSxkKSxtZWFuOkdmKGMsMiksc3RkRGV2OkdmKGMsMyksbnVtWmVyb3M6RmYoYyw0LDApLG1pbjpHZihjLDUpLG1lZGlhbjpHZihjLDYpLG1heDpHZihjLDcpLGhpc3RvZ3JhbXNMaXN0OnZmKGMuZ2V0SGlzdG9ncmFtc0xpc3QoKSxxayxhKSx3ZWlnaHRlZE51bWVyaWNTdGF0czooZD1jLmdldFdlaWdodGVkTnVtZXJpY1N0YXRzKCkpJiZ4ayhhLGQpfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gZGsoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBFajtjLnJlYWRNZXNzYWdlKGQseWspO2Euc2V0Q29tbW9uU3RhdHMoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRNZWFuKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZERvdWJsZSgpO2Euc2V0U3RkRGV2KGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0TnVtWmVyb3MoZCk7YnJlYWs7Y2FzZSA1OmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRNaW4oZCk7YnJlYWs7Y2FzZSA2OmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRNZWRpYW4oZCk7YnJlYWs7Y2FzZSA3OmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRNYXgoZCk7YnJlYWs7Y2FzZSA4OmQ9bmV3IEZqO2MucmVhZE1lc3NhZ2UoZCxzayk7YS5hZGRIaXN0b2dyYW1zKGQpO2JyZWFrO2Nhc2UgOTpkPW5ldyB5ajtjLnJlYWRNZXNzYWdlKGQsCnprKTthLnNldFdlaWdodGVkTnVtZXJpY1N0YXRzKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1NLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyBkZTtpayh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gaWsoYSxjKXt2YXIgZD1hLmdldENvbW1vblN0YXRzKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoMSxkLEFrKTtkPWEuZ2V0TWVhbigpOzAhPT1kJiZjLndyaXRlRG91YmxlKDIsZCk7ZD1hLmdldFN0ZERldigpOzAhPT1kJiZjLndyaXRlRG91YmxlKDMsZCk7ZD1hLmdldE51bVplcm9zKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoNCxkKTtkPWEuZ2V0TWluKCk7MCE9PWQmJmMud3JpdGVEb3VibGUoNSxkKTtkPWEuZ2V0TWVkaWFuKCk7MCE9PWQmJmMud3JpdGVEb3VibGUoNixkKTtkPWEuZ2V0TWF4KCk7MCE9PWQmJmMud3JpdGVEb3VibGUoNyxkKTtkPWEuZ2V0SGlzdG9ncmFtc0xpc3QoKTswPGQubGVuZ3RoJiZjLndyaXRlUmVwZWF0ZWRNZXNzYWdlKDgsZCx1ayk7ZD1hLmdldFdlaWdodGVkTnVtZXJpY1N0YXRzKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoOSxkLEJrKX1NLmdldENvbW1vblN0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMsRWosMSl9OwpNLnNldENvbW1vblN0YXRzPWZ1bmN0aW9uKGEpe0tnKHRoaXMsMSxhKX07TS5jbGVhckNvbW1vblN0YXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXRDb21tb25TdGF0cyh2b2lkIDApfTtNLmhhc0NvbW1vblN0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsMSl9O00uZ2V0TWVhbj1mdW5jdGlvbigpe3JldHVybiBHZih0aGlzLDIpfTtNLnNldE1lYW49ZnVuY3Rpb24oYSl7TGYodGhpcywyLGEpfTtNLmdldFN0ZERldj1mdW5jdGlvbigpe3JldHVybiBHZih0aGlzLDMpfTtNLnNldFN0ZERldj1mdW5jdGlvbihhKXtMZih0aGlzLDMsYSl9O00uZ2V0TnVtWmVyb3M9ZnVuY3Rpb24oKXtyZXR1cm4gRmYodGhpcyw0LDApfTtNLnNldE51bVplcm9zPWZ1bmN0aW9uKGEpe0pmKHRoaXMsNCxhKX07TS5nZXRNaW49ZnVuY3Rpb24oKXtyZXR1cm4gR2YodGhpcyw1KX07TS5zZXRNaW49ZnVuY3Rpb24oYSl7TGYodGhpcyw1LGEpfTsKTS5nZXRNZWRpYW49ZnVuY3Rpb24oKXtyZXR1cm4gR2YodGhpcyw2KX07TS5zZXRNZWRpYW49ZnVuY3Rpb24oYSl7TGYodGhpcyw2LGEpfTtNLmdldE1heD1mdW5jdGlvbigpe3JldHVybiBHZih0aGlzLDcpfTtNLnNldE1heD1mdW5jdGlvbihhKXtMZih0aGlzLDcsYSl9O00uZ2V0SGlzdG9ncmFtc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSWcodGhpcyxGaiw4KX07TS5zZXRIaXN0b2dyYW1zTGlzdD1mdW5jdGlvbihhKXtNZyh0aGlzLDgsYSl9O00uYWRkSGlzdG9ncmFtcz1mdW5jdGlvbihhKXtyZXR1cm4gTmcodGhpcyw4LGEsRmosdm9pZCAwKX07TS5jbGVhckhpc3RvZ3JhbXNMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRIaXN0b2dyYW1zTGlzdChbXSl9O00uZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyx5aiw5KX07TS5zZXRXZWlnaHRlZE51bWVyaWNTdGF0cz1mdW5jdGlvbihhKXtLZyh0aGlzLDksYSl9OwpNLmNsZWFyV2VpZ2h0ZWROdW1lcmljU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldFdlaWdodGVkTnVtZXJpY1N0YXRzKHZvaWQgMCl9O00uaGFzV2VpZ2h0ZWROdW1lcmljU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcyw5KX07dmFyIHdqPVszXTt2ai5wcm90b3R5cGUudG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIFpqKGEsdGhpcyl9O2Z1bmN0aW9uIFpqKGEsYyl7dmFyIGQsZj17Y29tbW9uU3RhdHM6KGQ9Yy5nZXRDb21tb25TdGF0cygpKSYmd2soYSxkKSx1bmlxdWU6RmYoYywyLDApLHRvcFZhbHVlc0xpc3Q6dmYoYy5nZXRUb3BWYWx1ZXNMaXN0KCksQ2ssYSksYXZnTGVuZ3RoOkdmKGMsNCkscmFua0hpc3RvZ3JhbTooZD1jLmdldFJhbmtIaXN0b2dyYW0oKSkmJnJrKGEsZCksd2VpZ2h0ZWRTdHJpbmdTdGF0czooZD1jLmdldFdlaWdodGVkU3RyaW5nU3RhdHMoKSkmJkRrKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfQpmdW5jdGlvbiBlayhhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9bmV3IEVqO2MucmVhZE1lc3NhZ2UoZCx5ayk7YS5zZXRDb21tb25TdGF0cyhkKTticmVhaztjYXNlIDI6ZD1jLnJlYWRVaW50NjQoKTthLnNldFVuaXF1ZShkKTticmVhaztjYXNlIDM6ZD1uZXcgeGo7Yy5yZWFkTWVzc2FnZShkLEVrKTthLmFkZFRvcFZhbHVlcyhkKTticmVhaztjYXNlIDQ6ZD1jLnJlYWRGbG9hdCgpO2Euc2V0QXZnTGVuZ3RoKGQpO2JyZWFrO2Nhc2UgNTpkPW5ldyBJajtjLnJlYWRNZXNzYWdlKGQsdGspO2Euc2V0UmFua0hpc3RvZ3JhbShkKTticmVhaztjYXNlIDY6ZD1uZXcgQWo7Yy5yZWFkTWVzc2FnZShkLEZrKTthLnNldFdlaWdodGVkU3RyaW5nU3RhdHMoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfQp2ai5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGRlO2prKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uIGprKGEsYyl7dmFyIGQ9YS5nZXRDb21tb25TdGF0cygpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDEsZCxBayk7ZD1hLmdldFVuaXF1ZSgpOzAhPT1kJiZjLndyaXRlVWludDY0KDIsZCk7ZD1hLmdldFRvcFZhbHVlc0xpc3QoKTswPGQubGVuZ3RoJiZjLndyaXRlUmVwZWF0ZWRNZXNzYWdlKDMsZCxHayk7ZD1hLmdldEF2Z0xlbmd0aCgpOzAhPT1kJiZjLndyaXRlRmxvYXQoNCxkKTtkPWEuZ2V0UmFua0hpc3RvZ3JhbSgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDUsZCx2ayk7ZD1hLmdldFdlaWdodGVkU3RyaW5nU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg2LGQsSGspfU09eGoucHJvdG90eXBlO00udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIENrKGEsdGhpcyl9OwpmdW5jdGlvbiBDayhhLGMpe3ZhciBkPXtkZXByZWNhdGVkRnJlcTpGZihjLDEsMCksdmFsdWU6RmYoYywyLCIiKSxmcmVxdWVuY3k6R2YoYywzKX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9ZnVuY3Rpb24gRWsoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWMucmVhZFVpbnQ2NCgpO2Euc2V0RGVwcmVjYXRlZEZyZXEoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkU3RyaW5nKCk7YS5zZXRWYWx1ZShkKTticmVhaztjYXNlIDM6ZD1jLnJlYWREb3VibGUoKTthLnNldEZyZXF1ZW5jeShkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9TS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7R2sodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIEdrKGEsYyl7dmFyIGQ9YS5nZXREZXByZWNhdGVkRnJlcSgpOzAhPT1kJiZjLndyaXRlVWludDY0KDEsZCk7ZD1hLmdldFZhbHVlKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZygyLGQpO2Q9YS5nZXRGcmVxdWVuY3koKTswIT09ZCYmYy53cml0ZURvdWJsZSgzLGQpfU0uZ2V0RGVwcmVjYXRlZEZyZXE9ZnVuY3Rpb24oKXtyZXR1cm4gRmYodGhpcywxLDApfTtNLnNldERlcHJlY2F0ZWRGcmVxPWZ1bmN0aW9uKGEpe0pmKHRoaXMsMSxhKX07TS5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBGZih0aGlzLDIsIiIpfTtNLnNldFZhbHVlPWZ1bmN0aW9uKGEpe01mKHRoaXMsMixhKX07TS5nZXRGcmVxdWVuY3k9ZnVuY3Rpb24oKXtyZXR1cm4gR2YodGhpcywzKX07TS5zZXRGcmVxdWVuY3k9ZnVuY3Rpb24oYSl7TGYodGhpcywzLGEpfTtNPXZqLnByb3RvdHlwZTtNLmdldENvbW1vblN0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMsRWosMSl9OwpNLnNldENvbW1vblN0YXRzPWZ1bmN0aW9uKGEpe0tnKHRoaXMsMSxhKX07TS5jbGVhckNvbW1vblN0YXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXRDb21tb25TdGF0cyh2b2lkIDApfTtNLmhhc0NvbW1vblN0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsMSl9O00uZ2V0VW5pcXVlPWZ1bmN0aW9uKCl7cmV0dXJuIEZmKHRoaXMsMiwwKX07TS5zZXRVbmlxdWU9ZnVuY3Rpb24oYSl7SmYodGhpcywyLGEpfTtNLmdldFRvcFZhbHVlc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSWcodGhpcyx4aiwzKX07TS5zZXRUb3BWYWx1ZXNMaXN0PWZ1bmN0aW9uKGEpe01nKHRoaXMsMyxhKX07TS5hZGRUb3BWYWx1ZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIE5nKHRoaXMsMyxhLHhqLHZvaWQgMCl9O00uY2xlYXJUb3BWYWx1ZXNMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRUb3BWYWx1ZXNMaXN0KFtdKX07TS5nZXRBdmdMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gR2YodGhpcyw0KX07Ck0uc2V0QXZnTGVuZ3RoPWZ1bmN0aW9uKGEpe0xmKHRoaXMsNCxhKX07TS5nZXRSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMsSWosNSl9O00uc2V0UmFua0hpc3RvZ3JhbT1mdW5jdGlvbihhKXtLZyh0aGlzLDUsYSl9O00uY2xlYXJSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKCl7dGhpcy5zZXRSYW5rSGlzdG9ncmFtKHZvaWQgMCl9O00uaGFzUmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBudWxsIT13Zih0aGlzLDUpfTtNLmdldFdlaWdodGVkU3RyaW5nU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyxBaiw2KX07TS5zZXRXZWlnaHRlZFN0cmluZ1N0YXRzPWZ1bmN0aW9uKGEpe0tnKHRoaXMsNixhKX07TS5jbGVhcldlaWdodGVkU3RyaW5nU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldFdlaWdodGVkU3RyaW5nU3RhdHModm9pZCAwKX07TS5oYXNXZWlnaHRlZFN0cmluZ1N0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsNil9Owp2YXIgemo9WzRdO009eWoucHJvdG90eXBlO00udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIHhrKGEsdGhpcyl9O2Z1bmN0aW9uIHhrKGEsYyl7dmFyIGQ9e21lYW46R2YoYywxKSxzdGREZXY6R2YoYywyKSxtZWRpYW46R2YoYywzKSxoaXN0b2dyYW1zTGlzdDp2ZihjLmdldEhpc3RvZ3JhbXNMaXN0KCkscWssYSl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiB6ayhhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRNZWFuKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZERvdWJsZSgpO2Euc2V0U3RkRGV2KGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZERvdWJsZSgpO2Euc2V0TWVkaWFuKGQpO2JyZWFrO2Nhc2UgNDpkPW5ldyBGajtjLnJlYWRNZXNzYWdlKGQsc2spO2EuYWRkSGlzdG9ncmFtcyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9TS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7QmsodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIEJrKGEsYyl7dmFyIGQ9YS5nZXRNZWFuKCk7MCE9PWQmJmMud3JpdGVEb3VibGUoMSxkKTtkPWEuZ2V0U3RkRGV2KCk7MCE9PWQmJmMud3JpdGVEb3VibGUoMixkKTtkPWEuZ2V0TWVkaWFuKCk7MCE9PWQmJmMud3JpdGVEb3VibGUoMyxkKTtkPWEuZ2V0SGlzdG9ncmFtc0xpc3QoKTswPGQubGVuZ3RoJiZjLndyaXRlUmVwZWF0ZWRNZXNzYWdlKDQsZCx1ayl9TS5nZXRNZWFuPWZ1bmN0aW9uKCl7cmV0dXJuIEdmKHRoaXMsMSl9O00uc2V0TWVhbj1mdW5jdGlvbihhKXtMZih0aGlzLDEsYSl9O00uZ2V0U3RkRGV2PWZ1bmN0aW9uKCl7cmV0dXJuIEdmKHRoaXMsMil9O00uc2V0U3RkRGV2PWZ1bmN0aW9uKGEpe0xmKHRoaXMsMixhKX07TS5nZXRNZWRpYW49ZnVuY3Rpb24oKXtyZXR1cm4gR2YodGhpcywzKX07TS5zZXRNZWRpYW49ZnVuY3Rpb24oYSl7TGYodGhpcywzLGEpfTtNLmdldEhpc3RvZ3JhbXNMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIElnKHRoaXMsRmosNCl9OwpNLnNldEhpc3RvZ3JhbXNMaXN0PWZ1bmN0aW9uKGEpe01nKHRoaXMsNCxhKX07TS5hZGRIaXN0b2dyYW1zPWZ1bmN0aW9uKGEpe3JldHVybiBOZyh0aGlzLDQsYSxGaix2b2lkIDApfTtNLmNsZWFySGlzdG9ncmFtc0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldEhpc3RvZ3JhbXNMaXN0KFtdKX07dmFyIEJqPVsxXTtNPUFqLnByb3RvdHlwZTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBEayhhLHRoaXMpfTtmdW5jdGlvbiBEayhhLGMpe3ZhciBkLGY9e3RvcFZhbHVlc0xpc3Q6dmYoYy5nZXRUb3BWYWx1ZXNMaXN0KCksQ2ssYSkscmFua0hpc3RvZ3JhbTooZD1jLmdldFJhbmtIaXN0b2dyYW0oKSkmJnJrKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfQpmdW5jdGlvbiBGayhhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9bmV3IHhqO2MucmVhZE1lc3NhZ2UoZCxFayk7YS5hZGRUb3BWYWx1ZXMoZCk7YnJlYWs7Y2FzZSAyOmQ9bmV3IElqO2MucmVhZE1lc3NhZ2UoZCx0ayk7YS5zZXRSYW5rSGlzdG9ncmFtKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1NLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyBkZTtIayh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBIayhhLGMpe3ZhciBkPWEuZ2V0VG9wVmFsdWVzTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMSxkLEdrKTtkPWEuZ2V0UmFua0hpc3RvZ3JhbSgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDIsZCx2ayl9Ck0uZ2V0VG9wVmFsdWVzTGlzdD1mdW5jdGlvbigpe3JldHVybiBJZyh0aGlzLHhqLDEpfTtNLnNldFRvcFZhbHVlc0xpc3Q9ZnVuY3Rpb24oYSl7TWcodGhpcywxLGEpfTtNLmFkZFRvcFZhbHVlcz1mdW5jdGlvbihhKXtyZXR1cm4gTmcodGhpcywxLGEseGosdm9pZCAwKX07TS5jbGVhclRvcFZhbHVlc0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldFRvcFZhbHVlc0xpc3QoW10pfTtNLmdldFJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyxJaiwyKX07TS5zZXRSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKGEpe0tnKHRoaXMsMixhKX07TS5jbGVhclJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXt0aGlzLnNldFJhbmtIaXN0b2dyYW0odm9pZCAwKX07TS5oYXNSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsMil9O009Q2oucHJvdG90eXBlO00udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGFrKGEsdGhpcyl9OwpmdW5jdGlvbiBhayhhLGMpe3ZhciBkLGY9e2NvbW1vblN0YXRzOihkPWMuZ2V0Q29tbW9uU3RhdHMoKSkmJndrKGEsZCksdW5pcXVlOkZmKGMsMiwwKSxhdmdOdW1CeXRlczpHZihjLDMpLG1pbk51bUJ5dGVzOkdmKGMsNCksbWF4TnVtQnl0ZXM6R2YoYyw1KX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIGZrKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgRWo7Yy5yZWFkTWVzc2FnZShkLHlrKTthLnNldENvbW1vblN0YXRzKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0VW5pcXVlKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZEZsb2F0KCk7YS5zZXRBdmdOdW1CeXRlcyhkKTticmVhaztjYXNlIDQ6ZD1jLnJlYWRGbG9hdCgpO2Euc2V0TWluTnVtQnl0ZXMoZCk7YnJlYWs7Y2FzZSA1OmQ9Yy5yZWFkRmxvYXQoKTthLnNldE1heE51bUJ5dGVzKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1NLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyBkZTtrayh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24ga2soYSxjKXt2YXIgZD1hLmdldENvbW1vblN0YXRzKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoMSxkLEFrKTtkPWEuZ2V0VW5pcXVlKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMixkKTtkPWEuZ2V0QXZnTnVtQnl0ZXMoKTswIT09ZCYmYy53cml0ZUZsb2F0KDMsZCk7ZD1hLmdldE1pbk51bUJ5dGVzKCk7MCE9PWQmJmMud3JpdGVGbG9hdCg0LGQpO2Q9YS5nZXRNYXhOdW1CeXRlcygpOzAhPT1kJiZjLndyaXRlRmxvYXQoNSxkKX1NLmdldENvbW1vblN0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMsRWosMSl9O00uc2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oYSl7S2codGhpcywxLGEpfTtNLmNsZWFyQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldENvbW1vblN0YXRzKHZvaWQgMCl9O00uaGFzQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcywxKX07TS5nZXRVbmlxdWU9ZnVuY3Rpb24oKXtyZXR1cm4gRmYodGhpcywyLDApfTsKTS5zZXRVbmlxdWU9ZnVuY3Rpb24oYSl7SmYodGhpcywyLGEpfTtNLmdldEF2Z051bUJ5dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIEdmKHRoaXMsMyl9O00uc2V0QXZnTnVtQnl0ZXM9ZnVuY3Rpb24oYSl7TGYodGhpcywzLGEpfTtNLmdldE1pbk51bUJ5dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIEdmKHRoaXMsNCl9O00uc2V0TWluTnVtQnl0ZXM9ZnVuY3Rpb24oYSl7TGYodGhpcyw0LGEpfTtNLmdldE1heE51bUJ5dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIEdmKHRoaXMsNSl9O00uc2V0TWF4TnVtQnl0ZXM9ZnVuY3Rpb24oYSl7TGYodGhpcyw1LGEpfTtNPURqLnByb3RvdHlwZTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBiayhhLHRoaXMpfTtmdW5jdGlvbiBiayhhLGMpe3ZhciBkLGY9e2NvbW1vblN0YXRzOihkPWMuZ2V0Q29tbW9uU3RhdHMoKSkmJndrKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfQpmdW5jdGlvbiBnayhhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9bmV3IEVqO2MucmVhZE1lc3NhZ2UoZCx5ayk7YS5zZXRDb21tb25TdGF0cyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9TS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7bGsodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gbGsoYSxjKXthPWEuZ2V0Q29tbW9uU3RhdHMoKTtudWxsIT1hJiZjLndyaXRlTWVzc2FnZSgxLGEsQWspfU0uZ2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyxFaiwxKX07TS5zZXRDb21tb25TdGF0cz1mdW5jdGlvbihhKXtLZyh0aGlzLDEsYSl9O00uY2xlYXJDb21tb25TdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0Q29tbW9uU3RhdHModm9pZCAwKX07Ck0uaGFzQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcywxKX07TT1Fai5wcm90b3R5cGU7TS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gd2soYSx0aGlzKX07CmZ1bmN0aW9uIHdrKGEsYyl7dmFyIGQsZj17bnVtTm9uTWlzc2luZzpGZihjLDEsMCksbnVtTWlzc2luZzpGZihjLDIsMCksbWluTnVtVmFsdWVzOkZmKGMsMywwKSxtYXhOdW1WYWx1ZXM6RmYoYyw0LDApLGF2Z051bVZhbHVlczpHZihjLDUpLHRvdE51bVZhbHVlczpGZihjLDgsMCksbnVtVmFsdWVzSGlzdG9ncmFtOihkPWMuZ2V0TnVtVmFsdWVzSGlzdG9ncmFtKCkpJiZxayhhLGQpLHdlaWdodGVkQ29tbW9uU3RhdHM6KGQ9Yy5nZXRXZWlnaHRlZENvbW1vblN0YXRzKCkpJiZuayhhLGQpLGZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtOihkPWMuZ2V0RmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW0oKSkmJnFrKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfQpmdW5jdGlvbiB5ayhhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkVWludDY0KCk7YS5zZXROdW1Ob25NaXNzaW5nKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0TnVtTWlzc2luZyhkKTticmVhaztjYXNlIDM6ZD1jLnJlYWRVaW50NjQoKTthLnNldE1pbk51bVZhbHVlcyhkKTticmVhaztjYXNlIDQ6ZD1jLnJlYWRVaW50NjQoKTthLnNldE1heE51bVZhbHVlcyhkKTticmVhaztjYXNlIDU6ZD1jLnJlYWRGbG9hdCgpO2Euc2V0QXZnTnVtVmFsdWVzKGQpO2JyZWFrO2Nhc2UgODpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0VG90TnVtVmFsdWVzKGQpO2JyZWFrO2Nhc2UgNjpkPW5ldyBGajtjLnJlYWRNZXNzYWdlKGQsc2spO2Euc2V0TnVtVmFsdWVzSGlzdG9ncmFtKGQpO2JyZWFrO2Nhc2UgNzpkPW5ldyBxajtjLnJlYWRNZXNzYWdlKGQsb2spO2Euc2V0V2VpZ2h0ZWRDb21tb25TdGF0cyhkKTsKYnJlYWs7Y2FzZSA5OmQ9bmV3IEZqO2MucmVhZE1lc3NhZ2UoZCxzayk7YS5zZXRGZWF0dXJlTGlzdExlbmd0aEhpc3RvZ3JhbShkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9TS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7QWsodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIEFrKGEsYyl7dmFyIGQ9YS5nZXROdW1Ob25NaXNzaW5nKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMSxkKTtkPWEuZ2V0TnVtTWlzc2luZygpOzAhPT1kJiZjLndyaXRlVWludDY0KDIsZCk7ZD1hLmdldE1pbk51bVZhbHVlcygpOzAhPT1kJiZjLndyaXRlVWludDY0KDMsZCk7ZD1hLmdldE1heE51bVZhbHVlcygpOzAhPT1kJiZjLndyaXRlVWludDY0KDQsZCk7ZD1hLmdldEF2Z051bVZhbHVlcygpOzAhPT1kJiZjLndyaXRlRmxvYXQoNSxkKTtkPWEuZ2V0VG90TnVtVmFsdWVzKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoOCxkKTtkPWEuZ2V0TnVtVmFsdWVzSGlzdG9ncmFtKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoNixkLHVrKTtkPWEuZ2V0V2VpZ2h0ZWRDb21tb25TdGF0cygpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDcsZCxwayk7ZD1hLmdldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoOSxkLHVrKX0KTS5nZXROdW1Ob25NaXNzaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEZmKHRoaXMsMSwwKX07TS5zZXROdW1Ob25NaXNzaW5nPWZ1bmN0aW9uKGEpe0pmKHRoaXMsMSxhKX07TS5nZXROdW1NaXNzaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEZmKHRoaXMsMiwwKX07TS5zZXROdW1NaXNzaW5nPWZ1bmN0aW9uKGEpe0pmKHRoaXMsMixhKX07TS5nZXRNaW5OdW1WYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gRmYodGhpcywzLDApfTtNLnNldE1pbk51bVZhbHVlcz1mdW5jdGlvbihhKXtKZih0aGlzLDMsYSl9O00uZ2V0TWF4TnVtVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIEZmKHRoaXMsNCwwKX07TS5zZXRNYXhOdW1WYWx1ZXM9ZnVuY3Rpb24oYSl7SmYodGhpcyw0LGEpfTtNLmdldEF2Z051bVZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBHZih0aGlzLDUpfTtNLnNldEF2Z051bVZhbHVlcz1mdW5jdGlvbihhKXtMZih0aGlzLDUsYSl9OwpNLmdldFRvdE51bVZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBGZih0aGlzLDgsMCl9O00uc2V0VG90TnVtVmFsdWVzPWZ1bmN0aW9uKGEpe0pmKHRoaXMsOCxhKX07TS5nZXROdW1WYWx1ZXNIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gSGcodGhpcyxGaiw2KX07TS5zZXROdW1WYWx1ZXNIaXN0b2dyYW09ZnVuY3Rpb24oYSl7S2codGhpcyw2LGEpfTtNLmNsZWFyTnVtVmFsdWVzSGlzdG9ncmFtPWZ1bmN0aW9uKCl7dGhpcy5zZXROdW1WYWx1ZXNIaXN0b2dyYW0odm9pZCAwKX07TS5oYXNOdW1WYWx1ZXNIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcyw2KX07TS5nZXRXZWlnaHRlZENvbW1vblN0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIEhnKHRoaXMscWosNyl9O00uc2V0V2VpZ2h0ZWRDb21tb25TdGF0cz1mdW5jdGlvbihhKXtLZyh0aGlzLDcsYSl9O00uY2xlYXJXZWlnaHRlZENvbW1vblN0YXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXRXZWlnaHRlZENvbW1vblN0YXRzKHZvaWQgMCl9OwpNLmhhc1dlaWdodGVkQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9d2YodGhpcyw3KX07TS5nZXRGZWF0dXJlTGlzdExlbmd0aEhpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBIZyh0aGlzLEZqLDkpfTtNLnNldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtPWZ1bmN0aW9uKGEpe0tnKHRoaXMsOSxhKX07TS5jbGVhckZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtPWZ1bmN0aW9uKCl7dGhpcy5zZXRGZWF0dXJlTGlzdExlbmd0aEhpc3RvZ3JhbSh2b2lkIDApfTtNLmhhc0ZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXdmKHRoaXMsOSl9O3ZhciBHaj1bM107RmoucHJvdG90eXBlLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBxayhhLHRoaXMpfTsKZnVuY3Rpb24gcWsoYSxjKXt2YXIgZD17bnVtTmFuOkZmKGMsMSwwKSxudW1VbmRlZmluZWQ6RmYoYywyLDApLGJ1Y2tldHNMaXN0OnZmKGMuZ2V0QnVja2V0c0xpc3QoKSxJayxhKSx0eXBlOkZmKGMsNCwwKSxuYW1lOkZmKGMsNSwiIil9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiBzayhhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkVWludDY0KCk7YS5zZXROdW1OYW4oZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXROdW1VbmRlZmluZWQoZCk7YnJlYWs7Y2FzZSAzOmQ9bmV3IEhqO2MucmVhZE1lc3NhZ2UoZCxKayk7YS5hZGRCdWNrZXRzKGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZEVudW0oKTthLnNldFR5cGUoZCk7YnJlYWs7Y2FzZSA1OmQ9Yy5yZWFkU3RyaW5nKCk7YS5zZXROYW1lKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1Gai5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGRlO3VrKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiB1ayhhLGMpe3ZhciBkPWEuZ2V0TnVtTmFuKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMSxkKTtkPWEuZ2V0TnVtVW5kZWZpbmVkKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMixkKTtkPWEuZ2V0QnVja2V0c0xpc3QoKTswPGQubGVuZ3RoJiZjLndyaXRlUmVwZWF0ZWRNZXNzYWdlKDMsZCxLayk7ZD1hLmdldFR5cGUoKTswIT09ZCYmYy53cml0ZUVudW0oNCxkKTtkPWEuZ2V0TmFtZSgpOzA8ZC5sZW5ndGgmJmMud3JpdGVTdHJpbmcoNSxkKX1NPUhqLnByb3RvdHlwZTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBJayhhLHRoaXMpfTtmdW5jdGlvbiBJayhhLGMpe3ZhciBkPXtsb3dWYWx1ZTpHZihjLDEpLGhpZ2hWYWx1ZTpHZihjLDIpLGRlcHJlY2F0ZWRDb3VudDpGZihjLDMsMCksc2FtcGxlQ291bnQ6R2YoYyw0KX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9CmZ1bmN0aW9uIEprKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWREb3VibGUoKTthLnNldExvd1ZhbHVlKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZERvdWJsZSgpO2Euc2V0SGlnaFZhbHVlKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0RGVwcmVjYXRlZENvdW50KGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZERvdWJsZSgpO2Euc2V0U2FtcGxlQ291bnQoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU0uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGRlO0trKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBLayhhLGMpe3ZhciBkPWEuZ2V0TG93VmFsdWUoKTswIT09ZCYmYy53cml0ZURvdWJsZSgxLGQpO2Q9YS5nZXRIaWdoVmFsdWUoKTswIT09ZCYmYy53cml0ZURvdWJsZSgyLGQpO2Q9YS5nZXREZXByZWNhdGVkQ291bnQoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgzLGQpO2Q9YS5nZXRTYW1wbGVDb3VudCgpOzAhPT1kJiZjLndyaXRlRG91YmxlKDQsZCl9TS5nZXRMb3dWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBHZih0aGlzLDEpfTtNLnNldExvd1ZhbHVlPWZ1bmN0aW9uKGEpe0xmKHRoaXMsMSxhKX07TS5nZXRIaWdoVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gR2YodGhpcywyKX07TS5zZXRIaWdoVmFsdWU9ZnVuY3Rpb24oYSl7TGYodGhpcywyLGEpfTtNLmdldERlcHJlY2F0ZWRDb3VudD1mdW5jdGlvbigpe3JldHVybiBGZih0aGlzLDMsMCl9O00uc2V0RGVwcmVjYXRlZENvdW50PWZ1bmN0aW9uKGEpe0pmKHRoaXMsMyxhKX07Ck0uZ2V0U2FtcGxlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gR2YodGhpcyw0KX07TS5zZXRTYW1wbGVDb3VudD1mdW5jdGlvbihhKXtMZih0aGlzLDQsYSl9O009RmoucHJvdG90eXBlO00uZ2V0TnVtTmFuPWZ1bmN0aW9uKCl7cmV0dXJuIEZmKHRoaXMsMSwwKX07TS5zZXROdW1OYW49ZnVuY3Rpb24oYSl7SmYodGhpcywxLGEpfTtNLmdldE51bVVuZGVmaW5lZD1mdW5jdGlvbigpe3JldHVybiBGZih0aGlzLDIsMCl9O00uc2V0TnVtVW5kZWZpbmVkPWZ1bmN0aW9uKGEpe0pmKHRoaXMsMixhKX07TS5nZXRCdWNrZXRzTGlzdD1mdW5jdGlvbigpe3JldHVybiBJZyh0aGlzLEhqLDMpfTtNLnNldEJ1Y2tldHNMaXN0PWZ1bmN0aW9uKGEpe01nKHRoaXMsMyxhKX07TS5hZGRCdWNrZXRzPWZ1bmN0aW9uKGEpe3JldHVybiBOZyh0aGlzLDMsYSxIaix2b2lkIDApfTtNLmNsZWFyQnVja2V0c0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldEJ1Y2tldHNMaXN0KFtdKX07Ck0uZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiBGZih0aGlzLDQsMCl9O00uc2V0VHlwZT1mdW5jdGlvbihhKXtOZih0aGlzLDQsYSl9O00uZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiBGZih0aGlzLDUsIiIpfTtNLnNldE5hbWU9ZnVuY3Rpb24oYSl7TWYodGhpcyw1LGEpfTt2YXIgSmo9WzFdO0lqLnByb3RvdHlwZS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gcmsoYSx0aGlzKX07ZnVuY3Rpb24gcmsoYSxjKXt2YXIgZD17YnVja2V0c0xpc3Q6dmYoYy5nZXRCdWNrZXRzTGlzdCgpLExrLGEpLG5hbWU6RmYoYywyLCIiKX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9CmZ1bmN0aW9uIHRrKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgS2o7Yy5yZWFkTWVzc2FnZShkLE1rKTthLmFkZEJ1Y2tldHMoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkU3RyaW5nKCk7YS5zZXROYW1lKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1Jai5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGRlO3ZrKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uIHZrKGEsYyl7dmFyIGQ9YS5nZXRCdWNrZXRzTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMSxkLE5rKTtkPWEuZ2V0TmFtZSgpOzA8ZC5sZW5ndGgmJmMud3JpdGVTdHJpbmcoMixkKX1NPUtqLnByb3RvdHlwZTtNLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBMayhhLHRoaXMpfTsKZnVuY3Rpb24gTGsoYSxjKXt2YXIgZD17bG93UmFuazpGZihjLDEsMCksaGlnaFJhbms6RmYoYywyLDApLGRlcHJlY2F0ZWRDb3VudDpGZihjLDMsMCksbGFiZWw6RmYoYyw0LCIiKSxzYW1wbGVDb3VudDpHZihjLDUpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH0KZnVuY3Rpb24gTWsoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWMucmVhZFVpbnQ2NCgpO2Euc2V0TG93UmFuayhkKTticmVhaztjYXNlIDI6ZD1jLnJlYWRVaW50NjQoKTthLnNldEhpZ2hSYW5rKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0RGVwcmVjYXRlZENvdW50KGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZFN0cmluZygpO2Euc2V0TGFiZWwoZCk7YnJlYWs7Y2FzZSA1OmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRTYW1wbGVDb3VudChkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9TS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZGU7TmsodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIE5rKGEsYyl7dmFyIGQ9YS5nZXRMb3dSYW5rKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMSxkKTtkPWEuZ2V0SGlnaFJhbmsoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgyLGQpO2Q9YS5nZXREZXByZWNhdGVkQ291bnQoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgzLGQpO2Q9YS5nZXRMYWJlbCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVTdHJpbmcoNCxkKTtkPWEuZ2V0U2FtcGxlQ291bnQoKTswIT09ZCYmYy53cml0ZURvdWJsZSg1LGQpfU0uZ2V0TG93UmFuaz1mdW5jdGlvbigpe3JldHVybiBGZih0aGlzLDEsMCl9O00uc2V0TG93UmFuaz1mdW5jdGlvbihhKXtKZih0aGlzLDEsYSl9O00uZ2V0SGlnaFJhbms9ZnVuY3Rpb24oKXtyZXR1cm4gRmYodGhpcywyLDApfTtNLnNldEhpZ2hSYW5rPWZ1bmN0aW9uKGEpe0pmKHRoaXMsMixhKX07TS5nZXREZXByZWNhdGVkQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gRmYodGhpcywzLDApfTsKTS5zZXREZXByZWNhdGVkQ291bnQ9ZnVuY3Rpb24oYSl7SmYodGhpcywzLGEpfTtNLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIEZmKHRoaXMsNCwiIil9O00uc2V0TGFiZWw9ZnVuY3Rpb24oYSl7TWYodGhpcyw0LGEpfTtNLmdldFNhbXBsZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIEdmKHRoaXMsNSl9O00uc2V0U2FtcGxlQ291bnQ9ZnVuY3Rpb24oYSl7TGYodGhpcyw1LGEpfTtNPUlqLnByb3RvdHlwZTtNLmdldEJ1Y2tldHNMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIElnKHRoaXMsS2osMSl9O00uc2V0QnVja2V0c0xpc3Q9ZnVuY3Rpb24oYSl7TWcodGhpcywxLGEpfTtNLmFkZEJ1Y2tldHM9ZnVuY3Rpb24oYSl7cmV0dXJuIE5nKHRoaXMsMSxhLEtqLHZvaWQgMCl9O00uY2xlYXJCdWNrZXRzTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0QnVja2V0c0xpc3QoW10pfTtNLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gRmYodGhpcywyLCIiKX07Ck0uc2V0TmFtZT1mdW5jdGlvbihhKXtNZih0aGlzLDIsYSl9OwovL35+V0VCUEFUSH5+ZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvZGVwcy5qcwovL35+V0VCUEFUSH5+L2FuYWx5dGljcy5odG1sLmpzCndpbmRvdy5nYT1mdW5jdGlvbigpe307Cjwvc2NyaXB0PgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPHN0eWxlPgpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3VZRUNNS29IY085eDF3ZG1ieUhJbTMtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9zVGRhQTZqMFBzYjkyMFZqdi1tcnpILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vX1ZZRngtczgyNGtYcV9VbDJCSHFZSC1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdG5qNFNCNkROYmRhUW5zTThDRnFCWC1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vb01NZ2ZaTVF0aE9yeVFvOW4yMmRjdXZ2RGluMXBLOGFLdGVMcGVaNWMwQS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vS3NfY1Z4aUNpd1VXVnNGV0ZBM0Jqbi1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9OSjR2eGxnV3dXYkVzdjE4ZEFocW5uLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2lzWi13YkNYTktBYm5qbzZfVHdIVG9YMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvLzc3RlhGalJiR3pONGFDclNGaGxoM29YMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2pTTjJDR1ZEYmNWeUNuZkpmalNkZklYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vVVg2aTRKeFFEbTNmVlRjMUNQdXdxb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9kLTZJWXBsT0ZvY0NhY0t6eHdYU09KQncxeFUxcktwdEpqXzBqYW5zOTIwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvLzk3dWFoeGlxWlJvbmNCYUNFSTNhVzRYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9Qd1pjLVliSUw0MTR3QjlyQjFJQVBZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0MxNHNZWWRKZzVkVTJxekpFVlN1dGEwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDX1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQ3d0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzFCVzI2UXhwU2otX1pLbV94VDRoV3cud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDOURpTnNSNWEtOU9lX0l2cHU4WFdsWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT3BYVXFUbzBVZ1FRaEdqX1NGZExXQmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL1d4clhKYTBDM0tkdEM3bE1hZkc0ZFJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9jREtoUmFYblFUT1ZiYW94d2RPcjl4a0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by8xaFpmMDJQT0FOaDMyazJWa2dFb1VCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by92UGN5blNMMHFIcV82ZFg3bEtWQnlYWWhqYlNwdmM0N2VlNnhSXzgwSG53LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by92U3p1bGZLU0swTExqamZlYXhjUkVoa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL0syM2N4V1ZUcklGRDZESnNFVmkwN1JrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9GbDR5MFFkT3h5eVRIRUdNWFg4a2NZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvLzBlQzZmbDA2bHVYRVlXcEJTSnZYQ0lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vSTNTMXdzZ1NnOVlDdXJWNlBVa1RPWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvLy1MMTRKazA2bTZwVUhCLTVtWFFRbllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9IZ28xM2stdGZTcG4wcWkxU0ZkVWZaQncxeFUxcktwdEpqXzBqYW5zOTIwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vUHJ1MzNxalNocFpTbUczejZWWXduWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vTllEV0JkRDRnSXEyNkc1WFliSHNGSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQxNHNZWWRKZzVkVTJxekpFVlN1dGEwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXRfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXR3dF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDFCVzI2UXhwU2otX1pLbV94VDRoV3cud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0NGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ2RThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0OURpTnNSNWEtOU9lX0l2cHU4WFdsWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vb0hpMzBrd1FXdnBDV3FBaHpIY0NTSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1pMcUtlZWxZYkFURzYwRXBaQlNEeTRYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9teDlVY2s2dUI2M1ZJS0ZZbkVNWHJZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9yR3ZIZEpucjJsNzVxYjBZTkQ5TnlJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9SeFpKZG56ZW8zUjV6U2V4Z2U4VVVaQncxeFUxcktwdEpqXzBqYW5zOTIwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vT2VGd1pObHJUZWZ6TFltbFZWMVVJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL21ibWhwck1INjlaaTZlRVBCWVZGaFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBWNHNZWWRKZzVkVTJxekpFVlN1dGEwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGZacmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwUXRfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFZCVzI2UXhwU2otX1pLbV94VDRoV3cud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBZZ3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwYUU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZERpTnNSNWEtOU9lX0l2cHU4WFdsWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFkxNHNZWWRKZzVkVTJxekpFVlN1dGEwLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFlfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFl3dF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTFCVzI2UXhwU2otX1pLbV94VDRoV3cud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk2RThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZOURpTnNSNWEtOU9lX0l2cHU4WFdsWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejF4LU0xSTF3NU9NaXFuVkY4eEJMaFUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6d1hhQVh1cDVtWmxmSzZ4UkxyaHNjby53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3bjZXcXhvLXh3eGlsRFhQVThjaFZVLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MVQ3YUpMSzZuS3BuMzZJTXdUY01NYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGel83OV9adVV4Q2lnTTJEZXNwVG5GYXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rno0Z2Q5T0VQVUNOM0FkWVcwZTh0YXQ0LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rno4YklRU1labldMYVdDOVFOQ3BUS19VLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KPC9zdHlsZT4KCgo8c3R5bGU+CiAgaHRtbCwKICBib2R5IHsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmOwogIH0KPC9zdHlsZT4KCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTthLnRleHRDb250ZW50PSJbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX0pKCk7Cjwvc2NyaXB0Pgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLWExMXkta2V5cy1iZWhhdmlvci9pcm9uLWExMXkta2V5cy1iZWhhdmlvci5odG1sLmpzCihmdW5jdGlvbigpe2Z1bmN0aW9uIGEoeCxDKXt2YXIgRj0iIjtpZih4KWlmKHg9eC50b0xvd2VyQ2FzZSgpLCIgIj09PXh8fEEudGVzdCh4KSlGPSJzcGFjZSI7ZWxzZSBpZih5LnRlc3QoeCkpRj0iZXNjIjtlbHNlIGlmKDE9PXgubGVuZ3RoKXtpZighQ3x8ci50ZXN0KHgpKUY9eH1lbHNlIEY9di50ZXN0KHgpP3gucmVwbGFjZSgiYXJyb3ciLCIiKToibXVsdGlwbHkiPT14PyIqIjp4O3JldHVybiBGfWZ1bmN0aW9uIGMoeCl7dmFyIEM9IiI7eCYmKHggaW4gbT9DPW1beF06dC50ZXN0KHgpPyh4PXBhcnNlSW50KHgucmVwbGFjZSgiVSsiLCIweCIpLDE2KSxDPVN0cmluZy5mcm9tQ2hhckNvZGUoeCkudG9Mb3dlckNhc2UoKSk6Qz14LnRvTG93ZXJDYXNlKCkpO3JldHVybiBDfWZ1bmN0aW9uIGQoeCl7dmFyIEM9IiI7TnVtYmVyKHgpJiYoQz02NTw9eCYmOTA+PXg/U3RyaW5nLmZyb21DaGFyQ29kZSgzMit4KToxMTI8PXgmJjEyMz49eD8iZiIrKHgtMTEyKzEpOjQ4PD14JiY1Nz49eD8KU3RyaW5nKHgtNDgpOjk2PD14JiYxMDU+PXg/U3RyaW5nKHgtOTYpOnBbeF0pO3JldHVybiBDfWZ1bmN0aW9uIGYoeCxDKXtyZXR1cm4geC5rZXk/YSh4LmtleSxDKTp4LmRldGFpbCYmeC5kZXRhaWwua2V5P2EoeC5kZXRhaWwua2V5LEMpOmMoeC5rZXlJZGVudGlmaWVyKXx8ZCh4LmtleUNvZGUpfHwiIn1mdW5jdGlvbiBnKHgsQyl7cmV0dXJuIGYoQyx4Lmhhc01vZGlmaWVycyk9PT14LmtleSYmKCF4Lmhhc01vZGlmaWVyc3x8ISFDLnNoaWZ0S2V5PT09ISF4LnNoaWZ0S2V5JiYhIUMuY3RybEtleT09PSEheC5jdHJsS2V5JiYhIUMuYWx0S2V5PT09ISF4LmFsdEtleSYmISFDLm1ldGFLZXk9PT0hIXgubWV0YUtleSl9ZnVuY3Rpb24gbCh4KXtyZXR1cm4gMT09PXgubGVuZ3RoP3tjb21ibzp4LGtleTp4LGV2ZW50OiJrZXlkb3duIn06eC5zcGxpdCgiKyIpLnJlZHVjZShmdW5jdGlvbihDLEYpe3ZhciBEPUYuc3BsaXQoIjoiKTtGPURbMF07RD1EWzFdO0YgaW4gcT8oQ1txW0ZdXT0hMCwKQy5oYXNNb2RpZmllcnM9ITApOihDLmtleT1GLEMuZXZlbnQ9RHx8ImtleWRvd24iKTtyZXR1cm4gQ30se2NvbWJvOnguc3BsaXQoIjoiKS5zaGlmdCgpfSl9ZnVuY3Rpb24gayh4KXtyZXR1cm4geC50cmltKCkuc3BsaXQoIiAiKS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIGwoQyl9KX12YXIgbT17IlUrMDAwOCI6ImJhY2tzcGFjZSIsIlUrMDAwOSI6InRhYiIsIlUrMDAxQiI6ImVzYyIsIlUrMDAyMCI6InNwYWNlIiwiVSswMDdGIjoiZGVsIn0scD17ODoiYmFja3NwYWNlIiw5OiJ0YWIiLDEzOiJlbnRlciIsMjc6ImVzYyIsMzM6InBhZ2V1cCIsMzQ6InBhZ2Vkb3duIiwzNToiZW5kIiwzNjoiaG9tZSIsMzI6InNwYWNlIiwzNzoibGVmdCIsMzg6InVwIiwzOToicmlnaHQiLDQwOiJkb3duIiw0NjoiZGVsIiwxMDY6IioifSxxPXtzaGlmdDoic2hpZnRLZXkiLGN0cmw6ImN0cmxLZXkiLGFsdDoiYWx0S2V5IixtZXRhOiJtZXRhS2V5In0scj0vW2EtejAtOSpdLyx0PS9VXCsvLHY9L15hcnJvdy8sCkE9L15zcGFjZShiYXIpPy8seT0vXmVzY2FwZSQvO1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2tleUV2ZW50VGFyZ2V0Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0sc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYm91bmRLZXlIYW5kbGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2ltcGVyYXRpdmVLZXlCaW5kaW5nczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19fSxvYnNlcnZlcnM6WyJfcmVzZXRLZXlFdmVudExpc3RlbmVycyhrZXlFdmVudFRhcmdldCwgX2JvdW5kS2V5SGFuZGxlcnMpIl0sa2V5QmluZGluZ3M6e30scmVnaXN0ZXJlZDpmdW5jdGlvbigpe3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSwKYWRkT3duS2V5QmluZGluZzpmdW5jdGlvbih4LEMpe3RoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5nc1t4XT1DO3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpO3RoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0scmVtb3ZlT3duS2V5QmluZGluZ3M6ZnVuY3Rpb24oKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3M9e307dGhpcy5fcHJlcEtleUJpbmRpbmdzKCk7dGhpcy5fcmVzZXRLZXlFdmVudExpc3RlbmVycygpfSxrZXlib2FyZEV2ZW50TWF0Y2hlc0tleXM6ZnVuY3Rpb24oeCxDKXtDPWsoQyk7Zm9yKHZhciBGPTA7RjxDLmxlbmd0aDsrK0YpaWYoZyhDW0ZdLHgpKXJldHVybiEwO3JldHVybiExfSxfY29sbGVjdEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5iZWhhdmlvcnMubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBDLmtleUJpbmRpbmdzfSk7LTE9PT14LmluZGV4T2YodGhpcy5rZXlCaW5kaW5ncykmJngucHVzaCh0aGlzLmtleUJpbmRpbmdzKTtyZXR1cm4geH0sCl9wcmVwS2V5QmluZGluZ3M6ZnVuY3Rpb24oKXt0aGlzLl9rZXlCaW5kaW5ncz17fTt0aGlzLl9jb2xsZWN0S2V5QmluZGluZ3MoKS5mb3JFYWNoKGZ1bmN0aW9uKEYpe2Zvcih2YXIgRCBpbiBGKXRoaXMuX2FkZEtleUJpbmRpbmcoRCxGW0RdKX0sdGhpcyk7Zm9yKHZhciB4IGluIHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5ncyl0aGlzLl9hZGRLZXlCaW5kaW5nKHgsdGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzW3hdKTtmb3IodmFyIEMgaW4gdGhpcy5fa2V5QmluZGluZ3MpdGhpcy5fa2V5QmluZGluZ3NbQ10uc29ydChmdW5jdGlvbihGLEQpe0Y9RlswXS5oYXNNb2RpZmllcnM7cmV0dXJuIEY9PT1EWzBdLmhhc01vZGlmaWVycz8wOkY/LTE6MX0pfSxfYWRkS2V5QmluZGluZzpmdW5jdGlvbih4LEMpe2soeCkuZm9yRWFjaChmdW5jdGlvbihGKXt0aGlzLl9rZXlCaW5kaW5nc1tGLmV2ZW50XT10aGlzLl9rZXlCaW5kaW5nc1tGLmV2ZW50XXx8W107dGhpcy5fa2V5QmluZGluZ3NbRi5ldmVudF0ucHVzaChbRiwKQ10pfSx0aGlzKX0sX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzKCk7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxfbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLmtleUV2ZW50VGFyZ2V0JiZPYmplY3Qua2V5cyh0aGlzLl9rZXlCaW5kaW5ncykuZm9yRWFjaChmdW5jdGlvbih4KXt2YXIgQz10aGlzLl9vbktleUJpbmRpbmdFdmVudC5iaW5kKHRoaXMsdGhpcy5fa2V5QmluZGluZ3NbeF0pO3RoaXMuX2JvdW5kS2V5SGFuZGxlcnMucHVzaChbdGhpcy5rZXlFdmVudFRhcmdldCx4LENdKTt0aGlzLmtleUV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoeCxDKX0sdGhpcyl9LF91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7Zm9yKHZhciB4LEMsRjt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLmxlbmd0aDspeD10aGlzLl9ib3VuZEtleUhhbmRsZXJzLnBvcCgpLApDPXhbMF0sRj14WzFdLHg9eFsyXSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoRix4KX0sX29uS2V5QmluZGluZ0V2ZW50OmZ1bmN0aW9uKHgsQyl7dGhpcy5zdG9wS2V5Ym9hcmRFdmVudFByb3BhZ2F0aW9uJiZDLnN0b3BQcm9wYWdhdGlvbigpO2lmKCFDLmRlZmF1bHRQcmV2ZW50ZWQpZm9yKHZhciBGPTA7Rjx4Lmxlbmd0aDtGKyspe3ZhciBEPXhbRl1bMF0sQj14W0ZdWzFdO2lmKGcoRCxDKSYmKHRoaXMuX3RyaWdnZXJLZXlIYW5kbGVyKEQsQixDKSxDLmRlZmF1bHRQcmV2ZW50ZWQpKWJyZWFrfX0sX3RyaWdnZXJLZXlIYW5kbGVyOmZ1bmN0aW9uKHgsQyxGKXt2YXIgRD1PYmplY3QuY3JlYXRlKHgpO0Qua2V5Ym9hcmRFdmVudD1GO3g9bmV3IEN1c3RvbUV2ZW50KHguZXZlbnQse2RldGFpbDpELGNhbmNlbGFibGU6ITB9KTt0aGlzW0NdLmNhbGwodGhpcyx4KTt4LmRlZmF1bHRQcmV2ZW50ZWQmJkYucHJldmVudERlZmF1bHQoKX19fSkoKTsKPC9zY3JpcHQ+CgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLWJlaGF2aW9ycy9pcm9uLWNvbnRyb2wtc3RhdGUuaHRtbC5qcwpQb2x5bWVyLklyb25Db250cm9sU3RhdGU9e3Byb3BlcnRpZXM6e2ZvY3VzZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfb2xkVGFiSW5kZXg6e3R5cGU6U3RyaW5nfSxfYm91bmRGb2N1c0JsdXJIYW5kbGVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvY3VzQmx1ckhhbmRsZXIuYmluZCh0aGlzKX19LF9faGFuZGxlRXZlbnRSZXRhcmdldGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc2hhZG93Um9vdCYmIVBvbHltZXIuRWxlbWVudH19fSxvYnNlcnZlcnM6WyJfY2hhbmdlZENvbnRyb2xTdGF0ZShmb2N1c2VkLCBkaXNhYmxlZCkiXSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLAp0aGlzLl9ib3VuZEZvY3VzQmx1ckhhbmRsZXIsITApO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fYm91bmRGb2N1c0JsdXJIYW5kbGVyLCEwKX0sX2ZvY3VzQmx1ckhhbmRsZXI6ZnVuY3Rpb24oYSl7aWYoUG9seW1lci5FbGVtZW50KXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWEudHlwZSk7ZWxzZSBpZihhLnRhcmdldD09PXRoaXMpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09YS50eXBlKTtlbHNlIGlmKHRoaXMuX19oYW5kbGVFdmVudFJldGFyZ2V0aW5nKXt2YXIgYz1Qb2x5bWVyLmRvbShhKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KGMpfHx0aGlzLmZpcmUoYS50eXBlLHtzb3VyY2VFdmVudDphfSx7bm9kZTp0aGlzLGJ1YmJsZXM6YS5idWJibGVzLGNhbmNlbGFibGU6YS5jYW5jZWxhYmxlfSl9fSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWRpc2FibGVkIixhPyJ0cnVlIjoiZmFsc2UiKTsKdGhpcy5zdHlsZS5wb2ludGVyRXZlbnRzPWE/Im5vbmUiOiIiO2E/KHRoaXMuX29sZFRhYkluZGV4PXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpLHRoaXMuX3NldEZvY3VzZWQoITEpLHRoaXMudGFiSW5kZXg9LTEsdGhpcy5ibHVyKCkpOnZvaWQgMCE9PXRoaXMuX29sZFRhYkluZGV4JiYobnVsbD09PXRoaXMuX29sZFRhYkluZGV4P3RoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpOnRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsdGhpcy5fb2xkVGFiSW5kZXgpKX0sX2NoYW5nZWRDb250cm9sU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkJiZ0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkKCl9fTsKPC9zY3JpcHQ+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tYmVoYXZpb3JzL2lyb24tYnV0dG9uLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsPXtwcm9wZXJ0aWVzOntwcmVzc2VkOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfcHJlc3NlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxwb2ludGVyRG93bjp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHZhbHVlOiExfSxyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITB9LGFyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLXByZXNzZWQiLG9ic2VydmVyOiJfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQifX0sbGlzdGVuZXJzOntkb3duOiJfZG93bkhhbmRsZXIiLHVwOiJfdXBIYW5kbGVyIix0YXA6Il90YXBIYW5kbGVyIn0sCm9ic2VydmVyczpbIl9mb2N1c0NoYW5nZWQoZm9jdXNlZCkiLCJfYWN0aXZlQ2hhbmdlZChhY3RpdmUsIGFyaWFBY3RpdmVBdHRyaWJ1dGUpIl0sa2V5QmluZGluZ3M6eyJlbnRlcjprZXlkb3duIjoiX2FzeW5jQ2xpY2siLCJzcGFjZTprZXlkb3duIjoiX3NwYWNlS2V5RG93bkhhbmRsZXIiLCJzcGFjZTprZXl1cCI6Il9zcGFjZUtleVVwSGFuZGxlciJ9LF9tb3VzZUV2ZW50UmU6L15tb3VzZS8sX3RhcEhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZXM/dGhpcy5fdXNlckFjdGl2YXRlKCF0aGlzLmFjdGl2ZSk6dGhpcy5hY3RpdmU9ITF9LF9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5fZGV0ZWN0S2V5Ym9hcmRGb2N1cyhhKTthfHx0aGlzLl9zZXRQcmVzc2VkKCExKX0sX2RldGVjdEtleWJvYXJkRm9jdXM6ZnVuY3Rpb24oYSl7dGhpcy5fc2V0UmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCghdGhpcy5wb2ludGVyRG93biYmYSl9LF91c2VyQWN0aXZhdGU6ZnVuY3Rpb24oYSl7dGhpcy5hY3RpdmUhPT0KYSYmKHRoaXMuYWN0aXZlPWEsdGhpcy5maXJlKCJjaGFuZ2UiKSl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3NldFBvaW50ZXJEb3duKCEwKTt0aGlzLl9zZXRQcmVzc2VkKCEwKTt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCExKX0sX3VwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3NldFBvaW50ZXJEb3duKCExKTt0aGlzLl9zZXRQcmVzc2VkKCExKX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24oYSl7YT1hLmRldGFpbC5rZXlib2FyZEV2ZW50O3ZhciBjPVBvbHltZXIuZG9tKGEpLmxvY2FsVGFyZ2V0O3RoaXMuaXNMaWdodERlc2NlbmRhbnQoYyl8fChhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLl9zZXRQcmVzc2VkKCEwKSl9LF9zcGFjZUtleVVwSGFuZGxlcjpmdW5jdGlvbihhKXthPVBvbHltZXIuZG9tKGEuZGV0YWlsLmtleWJvYXJkRXZlbnQpLmxvY2FsVGFyZ2V0O3RoaXMuaXNMaWdodERlc2NlbmRhbnQoYSl8fAoodGhpcy5wcmVzc2VkJiZ0aGlzLl9hc3luY0NsaWNrKCksdGhpcy5fc2V0UHJlc3NlZCghMSkpfSxfYXN5bmNDbGljazpmdW5jdGlvbigpe3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmNsaWNrKCl9LDEpfSxfcHJlc3NlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2FyaWFBY3RpdmVBdHRyaWJ1dGVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7YyYmYyE9YSYmdGhpcy5oYXNBdHRyaWJ1dGUoYykmJnRoaXMucmVtb3ZlQXR0cmlidXRlKGMpfSxfYWN0aXZlQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLnRvZ2dsZXM/dGhpcy5zZXRBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlLGE/InRydWUiOiJmYWxzZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKHRoaXMuYXJpYUFjdGl2ZUF0dHJpYnV0ZSk7dGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9jb250cm9sU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD90aGlzLl9zZXRQcmVzc2VkKCExKToKdGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9jaGFuZ2VkQnV0dG9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9idXR0b25TdGF0ZUNoYW5nZWQmJnRoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCgpfX07UG9seW1lci5Jcm9uQnV0dG9uU3RhdGU9W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsXTsKPC9zY3JpcHQ+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJpcHBsZSI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwoKICAgICAgICAvKiBTZWUgUG9seW1lckVsZW1lbnRzL3BhcGVyLWJlaGF2aW9ycy9pc3N1ZXMvMzQuIE9uIG5vbi1DaHJvbWUgYnJvd3NlcnMsCiAgICAgICAgICogY3JlYXRpbmcgYSBub2RlICh3aXRoIGEgcG9zaXRpb246YWJzb2x1dGUpIGluIHRoZSBtaWRkbGUgb2YgYW4gZXZlbnQKICAgICAgICAgKiBoYW5kbGVyICJpbnRlcnJ1cHRzIiB0aGF0IGV2ZW50IGhhbmRsZXIgKHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUKICAgICAgICAgKiByaXBwbGUgaXMgY3JlYXRlZCBvbiBkZW1hbmQpICovCiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFthbmltYXRpbmddKSB7CiAgICAgICAgLyogVGhpcyByZXNvbHZlcyBhIHJlbmRlcmluZyBpc3N1ZSBpbiBDaHJvbWUgKGFzIG9mIDQwKSB3aGVyZSB0aGUKICAgICAgICAgICByaXBwbGUgaXMgbm90IHByb3Blcmx5IGNsaXBwZWQgYnkgaXRzIHBhcmVudCAod2hpY2ggbWF5IGhhdmUKICAgICAgICAgICByb3VuZGVkIGNvcm5lcnMpLiBTZWU6IGh0dHA6Ly9qc2Jpbi5jb20vdGVtZXhhLzQKCiAgICAgICAgICAgTm90ZTogV2Ugb25seSBhcHBseSB0aGlzIHN0eWxlIGNvbmRpdGlvbmFsbHkuIE90aGVyd2lzZSwgdGhlIGJyb3dzZXIKICAgICAgICAgICB3aWxsIGNyZWF0ZSBhIG5ldyBjb21wb3NpdGluZyBsYXllciBmb3IgZXZlcnkgcmlwcGxlIGVsZW1lbnQgb24gdGhlCiAgICAgICAgICAgcGFnZSwgYW5kIHRoYXQgd291bGQgYmUgYmFkLiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgICAgfQoKICAgICAgI2JhY2tncm91bmQsCiAgICAgICN3YXZlcywKICAgICAgLndhdmUtY29udGFpbmVyLAogICAgICAud2F2ZSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI2JhY2tncm91bmQsCiAgICAgIC53YXZlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAjd2F2ZXMsCiAgICAgIC53YXZlIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jaXJjbGUpICNiYWNrZ3JvdW5kLAogICAgICA6aG9zdCguY2lyY2xlKSAjd2F2ZXMgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgLndhdmUtY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImJhY2tncm91bmQiPjwvZGl2PgogICAgPGRpdiBpZD0id2F2ZXMiPjwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLXJpcHBsZS9wYXBlci1yaXBwbGUuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGYpe3RoaXMuZWxlbWVudD1mO3RoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGg7dGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0O3RoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBjKGYpe3RoaXMuZWxlbWVudD1mO3RoaXMuY29sb3I9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZikuY29sb3I7dGhpcy53YXZlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMud2F2ZUNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmUuc3R5bGUuYmFja2dyb3VuZENvbG9yPXRoaXMuY29sb3I7dGhpcy53YXZlLmNsYXNzTGlzdC5hZGQoIndhdmUiKTt0aGlzLndhdmVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgid2F2ZS1jb250YWluZXIiKTtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIpLmFwcGVuZENoaWxkKHRoaXMud2F2ZSk7dGhpcy5yZXNldEludGVyYWN0aW9uU3RhdGUoKX0KdmFyIGQ9e2Rpc3RhbmNlOmZ1bmN0aW9uKGYsZyxsLGspe2YtPWw7Zy09aztyZXR1cm4gTWF0aC5zcXJ0KGYqZitnKmcpfSxub3c6d2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpOkRhdGUubm93fTthLnByb3RvdHlwZT17Z2V0IGJvdW5kaW5nUmVjdCgpe3JldHVybiB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9LGZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tOmZ1bmN0aW9uKGYsZyl7dmFyIGw9ZC5kaXN0YW5jZShmLGcsMCwwKSxrPWQuZGlzdGFuY2UoZixnLHRoaXMud2lkdGgsMCksbT1kLmRpc3RhbmNlKGYsZywwLHRoaXMuaGVpZ2h0KTtmPWQuZGlzdGFuY2UoZixnLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heChsLGssbSxmKX19O2MuTUFYX1JBRElVUz0zMDA7Yy5wcm90b3R5cGU9e2dldCByZWNlbnRlcnMoKXtyZXR1cm4gdGhpcy5lbGVtZW50LnJlY2VudGVyc30sCmdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmNlbnRlcn0sZ2V0IG1vdXNlRG93bkVsYXBzZWQoKXtpZighdGhpcy5tb3VzZURvd25TdGFydClyZXR1cm4gMDt2YXIgZj1kLm5vdygpLXRoaXMubW91c2VEb3duU3RhcnQ7dGhpcy5tb3VzZVVwU3RhcnQmJihmLT10aGlzLm1vdXNlVXBFbGFwc2VkKTtyZXR1cm4gZn0sZ2V0IG1vdXNlVXBFbGFwc2VkKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P2Qubm93KCktdGhpcy5tb3VzZVVwU3RhcnQ6MH0sZ2V0IG1vdXNlRG93bkVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZC8xRTN9LGdldCBtb3VzZVVwRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZVVwRWxhcHNlZC8xRTN9LGdldCBtb3VzZUludGVyYWN0aW9uU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWRTZWNvbmRzK3RoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzfSxnZXQgaW5pdGlhbE9wYWNpdHkoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmluaXRpYWxPcGFjaXR5fSwKZ2V0IG9wYWNpdHlEZWNheVZlbG9jaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5vcGFjaXR5RGVjYXlWZWxvY2l0eX0sZ2V0IHJhZGl1cygpe3ZhciBmPTEuMSpNYXRoLm1pbihNYXRoLnNxcnQodGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoKnRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCt0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQpLGMuTUFYX1JBRElVUykrNTtyZXR1cm4gTWF0aC5hYnMoZiooMS1NYXRoLnBvdyg4MCwtKHRoaXMubW91c2VJbnRlcmFjdGlvblNlY29uZHMvKDEuMS1mL2MuTUFYX1JBRElVUyouMikpKSkpfSxnZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9NYXRoLm1heCgwLHRoaXMuaW5pdGlhbE9wYWNpdHktdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMqdGhpcy5vcGFjaXR5RGVjYXlWZWxvY2l0eSk6dGhpcy5pbml0aWFsT3BhY2l0eX0sZ2V0IG91dGVyT3BhY2l0eSgpe3JldHVybiBNYXRoLm1heCgwLApNYXRoLm1pbiguMyp0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyx0aGlzLm9wYWNpdHkpKX0sZ2V0IGlzT3BhY2l0eUZ1bGx5RGVjYXllZCgpe3JldHVybi4wMT50aGlzLm9wYWNpdHkmJnRoaXMucmFkaXVzPj1NYXRoLm1pbih0aGlzLm1heFJhZGl1cyxjLk1BWF9SQURJVVMpfSxnZXQgaXNSZXN0aW5nQXRNYXhSYWRpdXMoKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj10aGlzLmluaXRpYWxPcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsYy5NQVhfUkFESVVTKX0sZ2V0IGlzQW5pbWF0aW9uQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/dGhpcy5pc09wYWNpdHlGdWxseURlY2F5ZWQ6dGhpcy5pc1Jlc3RpbmdBdE1heFJhZGl1c30sZ2V0IHRyYW5zbGF0aW9uRnJhY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oMSx0aGlzLnJhZGl1cy90aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSoyL01hdGguc3FydCgyKSl9LGdldCB4Tm93KCl7cmV0dXJuIHRoaXMueEVuZD8KdGhpcy54U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnhFbmQtdGhpcy54U3RhcnQpOnRoaXMueFN0YXJ0fSxnZXQgeU5vdygpe3JldHVybiB0aGlzLnlFbmQ/dGhpcy55U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnlFbmQtdGhpcy55U3RhcnQpOnRoaXMueVN0YXJ0fSxnZXQgaXNNb3VzZURvd24oKXtyZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCYmIXRoaXMubW91c2VVcFN0YXJ0fSxyZXNldEludGVyYWN0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnNsaWRlRGlzdGFuY2U9dGhpcy55RW5kPXRoaXMueEVuZD10aGlzLnlTdGFydD10aGlzLnhTdGFydD10aGlzLm1vdXNlVXBTdGFydD10aGlzLm1vdXNlRG93blN0YXJ0PXRoaXMubWF4UmFkaXVzPTA7dGhpcy5jb250YWluZXJNZXRyaWNzPW5ldyBhKHRoaXMuZWxlbWVudCl9LGRyYXc6ZnVuY3Rpb24oKXt0aGlzLndhdmUuc3R5bGUub3BhY2l0eT10aGlzLm9wYWNpdHk7dmFyIGY9dGhpcy5yYWRpdXMvCih0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZS8yKTt2YXIgZz10aGlzLnhOb3ctdGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzI7dmFyIGw9dGhpcy55Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitnKyJweCwgIitsKyJweCkiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIrZysicHgsICIrbCsicHgsIDApIjt0aGlzLndhdmUuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgiK2YrIiwiK2YrIikiO3RoaXMud2F2ZS5zdHlsZS50cmFuc2Zvcm09InNjYWxlM2QoIitmKyIsIitmKyIsMSkifSxkb3duQWN0aW9uOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yLGw9dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCk7dGhpcy5tb3VzZURvd25TdGFydD0KZC5ub3coKTt0aGlzLmNlbnRlcj8odGhpcy54U3RhcnQ9Zyx0aGlzLnlTdGFydD1sLHRoaXMuc2xpZGVEaXN0YW5jZT1kLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKToodGhpcy54U3RhcnQ9Zj9mLmRldGFpbC54LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QubGVmdDp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMix0aGlzLnlTdGFydD1mP2YuZGV0YWlsLnktdGhpcy5jb250YWluZXJNZXRyaWNzLmJvdW5kaW5nUmVjdC50b3A6dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yKTt0aGlzLnJlY2VudGVycyYmKHRoaXMueEVuZD1nLHRoaXMueUVuZD1sLHRoaXMuc2xpZGVEaXN0YW5jZT1kLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKTt0aGlzLm1heFJhZGl1cz10aGlzLmNvbnRhaW5lck1ldHJpY3MuZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb20odGhpcy54U3RhcnQsCnRoaXMueVN0YXJ0KTt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudG9wPSh0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKS8yKyJweCI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLmxlZnQ9KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSsicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4In0sdXBBY3Rpb246ZnVuY3Rpb24oKXt0aGlzLmlzTW91c2VEb3duJiYodGhpcy5tb3VzZVVwU3RhcnQ9ZC5ub3coKSl9LHJlbW92ZTpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMud2F2ZUNvbnRhaW5lci5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzLndhdmVDb250YWluZXIpfX07UG9seW1lcih7aXM6InBhcGVyLXJpcHBsZSIsCmJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl0scHJvcGVydGllczp7aW5pdGlhbE9wYWNpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi4yNX0sb3BhY2l0eURlY2F5VmVsb2NpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi44fSxyZWNlbnRlcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJpcHBsZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGFuaW1hdGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0saG9sZERvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hvbGREb3duQ2hhbmdlZCJ9LG5vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hbmltYXRpbmc6e3R5cGU6Qm9vbGVhbn0sX2JvdW5kQW5pbWF0ZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuaW1hdGUuYmluZCh0aGlzKX19fSwKZ2V0IHRhcmdldCgpe3JldHVybiB0aGlzLmtleUV2ZW50VGFyZ2V0fSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfb25FbnRlcktleWRvd24iLCJzcGFjZTprZXlkb3duIjoiX29uU3BhY2VLZXlkb3duIiwic3BhY2U6a2V5dXAiOiJfb25TcGFjZUtleXVwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLmtleUV2ZW50VGFyZ2V0PTExPT10aGlzLnBhcmVudE5vZGUubm9kZVR5cGU/UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCkuaG9zdDp0aGlzLnBhcmVudE5vZGU7dGhpcy5saXN0ZW4oZiwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy5saXN0ZW4oZiwiZG93biIsInVpRG93bkFjdGlvbiIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy51bmxpc3Rlbih0aGlzLmtleUV2ZW50VGFyZ2V0LCJkb3duIiwidWlEb3duQWN0aW9uIik7dGhpcy5rZXlFdmVudFRhcmdldD0KbnVsbH0sZ2V0IHNob3VsZEtlZXBBbmltYXRpbmcoKXtmb3IodmFyIGY9MDtmPHRoaXMucmlwcGxlcy5sZW5ndGg7KytmKWlmKCF0aGlzLnJpcHBsZXNbZl0uaXNBbmltYXRpb25Db21wbGV0ZSlyZXR1cm4hMDtyZXR1cm4hMX0sc2ltdWxhdGVkUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5kb3duQWN0aW9uKG51bGwpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLnVwQWN0aW9uKCl9LDEpfSx1aURvd25BY3Rpb246ZnVuY3Rpb24oZil7dGhpcy5ub2lua3x8dGhpcy5kb3duQWN0aW9uKGYpfSxkb3duQWN0aW9uOmZ1bmN0aW9uKGYpe3RoaXMuaG9sZERvd24mJjA8dGhpcy5yaXBwbGVzLmxlbmd0aHx8KHRoaXMuYWRkUmlwcGxlKCkuZG93bkFjdGlvbihmKSx0aGlzLl9hbmltYXRpbmd8fCh0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpKX0sdWlVcEFjdGlvbjpmdW5jdGlvbihmKXt0aGlzLm5vaW5rfHx0aGlzLnVwQWN0aW9uKGYpfSx1cEFjdGlvbjpmdW5jdGlvbihmKXt0aGlzLmhvbGREb3dufHwKKHRoaXMucmlwcGxlcy5mb3JFYWNoKGZ1bmN0aW9uKGcpe2cudXBBY3Rpb24oZil9KSx0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpfSxvbkFuaW1hdGlvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nPSExO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1udWxsO3RoaXMuZmlyZSgidHJhbnNpdGlvbmVuZCIpfSxhZGRSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgZj1uZXcgYyh0aGlzKTtQb2x5bWVyLmRvbSh0aGlzLiQud2F2ZXMpLmFwcGVuZENoaWxkKGYud2F2ZUNvbnRhaW5lcik7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yPWYuY29sb3I7dGhpcy5yaXBwbGVzLnB1c2goZik7dGhpcy5fc2V0QW5pbWF0aW5nKCEwKTtyZXR1cm4gZn0scmVtb3ZlUmlwcGxlOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXMucmlwcGxlcy5pbmRleE9mKGYpOzA+Z3x8KHRoaXMucmlwcGxlcy5zcGxpY2UoZywxKSxmLnJlbW92ZSgpLAp0aGlzLnJpcHBsZXMubGVuZ3RofHx0aGlzLl9zZXRBbmltYXRpbmcoITEpKX0sYW5pbWF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2FuaW1hdGluZyl7dmFyIGY7Zm9yKGY9MDtmPHRoaXMucmlwcGxlcy5sZW5ndGg7KytmKXt2YXIgZz10aGlzLnJpcHBsZXNbZl07Zy5kcmF3KCk7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUub3BhY2l0eT1nLm91dGVyT3BhY2l0eTtnLmlzT3BhY2l0eUZ1bGx5RGVjYXllZCYmIWcuaXNSZXN0aW5nQXRNYXhSYWRpdXMmJnRoaXMucmVtb3ZlUmlwcGxlKGcpfWlmKHRoaXMuc2hvdWxkS2VlcEFuaW1hdGluZ3x8MCE9PXRoaXMucmlwcGxlcy5sZW5ndGgpd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZEFuaW1hdGUpO2Vsc2UgdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKCl9fSxfb25FbnRlcktleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpO3RoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLDEpfSxfb25TcGFjZUtleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpfSwKX29uU3BhY2VLZXl1cDpmdW5jdGlvbigpe3RoaXMudWlVcEFjdGlvbigpfSxfaG9sZERvd25DaGFuZ2VkOmZ1bmN0aW9uKGYsZyl7dm9pZCAwIT09ZyYmKGY/dGhpcy5kb3duQWN0aW9uKCk6dGhpcy51cEFjdGlvbigpKX19KX0pKCk7Cjwvc2NyaXB0PgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9wYXBlci1iZWhhdmlvcnMvcGFwZXItcmlwcGxlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOntub2luazp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfbm9pbmtDaGFuZ2VkIn0sX3JpcHBsZUNvbnRhaW5lcjp7dHlwZTpPYmplY3R9fSxfYnV0dG9uU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5mb2N1c2VkJiZ0aGlzLmVuc3VyZVJpcHBsZSgpfSxfZG93bkhhbmRsZXI6ZnVuY3Rpb24oYSl7UG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsLl9kb3duSGFuZGxlci5jYWxsKHRoaXMsYSk7dGhpcy5wcmVzc2VkJiZ0aGlzLmVuc3VyZVJpcHBsZShhKX0sZW5zdXJlUmlwcGxlOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhhc1JpcHBsZSgpKXt0aGlzLl9yaXBwbGU9dGhpcy5fY3JlYXRlUmlwcGxlKCk7dGhpcy5fcmlwcGxlLm5vaW5rPXRoaXMubm9pbms7dmFyIGM9dGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzLnJvb3Q7YyYmUG9seW1lci5kb20oYykuYXBwZW5kQ2hpbGQodGhpcy5fcmlwcGxlKTtpZihhKXtjPQpQb2x5bWVyLmRvbSh0aGlzLl9yaXBwbGVDb250YWluZXJ8fHRoaXMpO3ZhciBkPVBvbHltZXIuZG9tKGEpLnJvb3RUYXJnZXQ7Yy5kZWVwQ29udGFpbnMoZCkmJnRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24oYSl9fX0sZ2V0UmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5lbnN1cmVSaXBwbGUoKTtyZXR1cm4gdGhpcy5fcmlwcGxlfSxoYXNSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX3JpcHBsZX0sX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1yaXBwbGUiKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLmhhc1JpcHBsZSgpJiYodGhpcy5fcmlwcGxlLm5vaW5rPWEpfX07Cjwvc2NyaXB0PgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9wYXBlci1iZWhhdmlvcnMvcGFwZXItYnV0dG9uLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7ZWxldmF0aW9uOnt0eXBlOk51bWJlcixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfY2FsY3VsYXRlRWxldmF0aW9uKGZvY3VzZWQsIGRpc2FibGVkLCBhY3RpdmUsIHByZXNzZWQsIHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIiwiX2NvbXB1dGVLZXlib2FyZENsYXNzKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAiLGFuaW1hdGVkOiEwfSxfY2FsY3VsYXRlRWxldmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9MTt0aGlzLmRpc2FibGVkP2E9MDp0aGlzLmFjdGl2ZXx8dGhpcy5wcmVzc2VkP2E9NDp0aGlzLnJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQmJihhPTMpO3RoaXMuX3NldEVsZXZhdGlvbihhKX0sX2NvbXB1dGVLZXlib2FyZENsYXNzOmZ1bmN0aW9uKGEpe3RoaXMudG9nZ2xlQ2xhc3MoImtleWJvYXJkLWZvY3VzIiwKYSl9LF9zcGFjZUtleURvd25IYW5kbGVyOmZ1bmN0aW9uKGEpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlEb3duSGFuZGxlci5jYWxsKHRoaXMsYSk7dGhpcy5oYXNSaXBwbGUoKSYmMT50aGlzLmdldFJpcHBsZSgpLnJpcHBsZXMubGVuZ3RoJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKCl9LF9zcGFjZUtleVVwSGFuZGxlcjpmdW5jdGlvbihhKXtQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGwuX3NwYWNlS2V5VXBIYW5kbGVyLmNhbGwodGhpcyxhKTt0aGlzLmhhc1JpcHBsZSgpJiZ0aGlzLl9yaXBwbGUudWlVcEFjdGlvbigpfX07UG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLFBvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGxdOwo8L3NjcmlwdD4KCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLXNoYWRvdy10cmFuc2l0aW9uOiB7CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI4cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctbm9uZTogewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH07CgogICAgICAvKiBmcm9tIGh0dHA6Ly9jb2RlcGVuLmlvL3NoeW5kbWFuL3Blbi9jNTM5NGRkZjJlOGIyYTVjOTE4NTkwNGI1NzQyMWNkYiAqLwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tM2RwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi00ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi02ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA0cHggMjJweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgIDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgIDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTI0ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbCksIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWJ1dHRvbi9wYXBlci1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvcl0scHJvcGVydGllczp7cmFpc2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExLG9ic2VydmVyOiJfY2FsY3VsYXRlRWxldmF0aW9uIn19LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt0aGlzLnJhaXNlZD9Qb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsLl9jYWxjdWxhdGVFbGV2YXRpb24uYXBwbHkodGhpcyk6dGhpcy5fc2V0RWxldmF0aW9uKDApfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAvKiBNYXRlcmlhbCBEZXNpZ24gY29sb3IgcGFsZXR0ZSBmb3IgR29vZ2xlIHByb2R1Y3RzICovCgogICAgICAtLWdvb2dsZS1yZWQtMTAwOiAjZjRjN2MzOwogICAgICAtLWdvb2dsZS1yZWQtMzAwOiAjZTY3YzczOwogICAgICAtLWdvb2dsZS1yZWQtNTAwOiAjZGI0NDM3OwogICAgICAtLWdvb2dsZS1yZWQtNzAwOiAjYzUzOTI5OwoKICAgICAgLS1nb29nbGUtYmx1ZS0xMDA6ICNjNmRhZmM7CiAgICAgIC0tZ29vZ2xlLWJsdWUtMzAwOiAjN2JhYWY3OwogICAgICAtLWdvb2dsZS1ibHVlLTUwMDogIzQyODVmNDsKICAgICAgLS1nb29nbGUtYmx1ZS03MDA6ICMzMzY3ZDY7CgogICAgICAtLWdvb2dsZS1ncmVlbi0xMDA6ICNiN2UxY2Q7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTMwMDogIzU3YmI4YTsKICAgICAgLS1nb29nbGUtZ3JlZW4tNTAwOiAjMGY5ZDU4OwogICAgICAtLWdvb2dsZS1ncmVlbi03MDA6ICMwYjgwNDM7CgogICAgICAtLWdvb2dsZS15ZWxsb3ctMTAwOiAjZmNlOGIyOwogICAgICAtLWdvb2dsZS15ZWxsb3ctMzAwOiAjZjdjYjRkOwogICAgICAtLWdvb2dsZS15ZWxsb3ctNTAwOiAjZjRiNDAwOwogICAgICAtLWdvb2dsZS15ZWxsb3ctNzAwOiAjZjA5MzAwOwoKICAgICAgLS1nb29nbGUtZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tZ29vZ2xlLWdyZXktMzAwOiAjZTBlMGUwOwogICAgICAtLWdvb2dsZS1ncmV5LTUwMDogIzllOWU5ZTsKICAgICAgLS1nb29nbGUtZ3JleS03MDA6ICM2MTYxNjE7CgogICAgICAvKiBNYXRlcmlhbCBEZXNpZ24gY29sb3IgcGFsZXR0ZSBmcm9tIG9ubGluZSBzcGVjIGRvY3VtZW50ICovCgogICAgICAtLXBhcGVyLXJlZC01MDogI2ZmZWJlZTsKICAgICAgLS1wYXBlci1yZWQtMTAwOiAjZmZjZGQyOwogICAgICAtLXBhcGVyLXJlZC0yMDA6ICNlZjlhOWE7CiAgICAgIC0tcGFwZXItcmVkLTMwMDogI2U1NzM3MzsKICAgICAgLS1wYXBlci1yZWQtNDAwOiAjZWY1MzUwOwogICAgICAtLXBhcGVyLXJlZC01MDA6ICNmNDQzMzY7CiAgICAgIC0tcGFwZXItcmVkLTYwMDogI2U1MzkzNTsKICAgICAgLS1wYXBlci1yZWQtNzAwOiAjZDMyZjJmOwogICAgICAtLXBhcGVyLXJlZC04MDA6ICNjNjI4Mjg7CiAgICAgIC0tcGFwZXItcmVkLTkwMDogI2I3MWMxYzsKICAgICAgLS1wYXBlci1yZWQtYTEwMDogI2ZmOGE4MDsKICAgICAgLS1wYXBlci1yZWQtYTIwMDogI2ZmNTI1MjsKICAgICAgLS1wYXBlci1yZWQtYTQwMDogI2ZmMTc0NDsKICAgICAgLS1wYXBlci1yZWQtYTcwMDogI2Q1MDAwMDsKCiAgICAgIC0tcGFwZXItcGluay01MDogI2ZjZTRlYzsKICAgICAgLS1wYXBlci1waW5rLTEwMDogI2Y4YmJkMDsKICAgICAgLS1wYXBlci1waW5rLTIwMDogI2Y0OGZiMTsKICAgICAgLS1wYXBlci1waW5rLTMwMDogI2YwNjI5MjsKICAgICAgLS1wYXBlci1waW5rLTQwMDogI2VjNDA3YTsKICAgICAgLS1wYXBlci1waW5rLTUwMDogI2U5MWU2MzsKICAgICAgLS1wYXBlci1waW5rLTYwMDogI2Q4MWI2MDsKICAgICAgLS1wYXBlci1waW5rLTcwMDogI2MyMTg1YjsKICAgICAgLS1wYXBlci1waW5rLTgwMDogI2FkMTQ1NzsKICAgICAgLS1wYXBlci1waW5rLTkwMDogIzg4MGU0ZjsKICAgICAgLS1wYXBlci1waW5rLWExMDA6ICNmZjgwYWI7CiAgICAgIC0tcGFwZXItcGluay1hMjAwOiAjZmY0MDgxOwogICAgICAtLXBhcGVyLXBpbmstYTQwMDogI2Y1MDA1NzsKICAgICAgLS1wYXBlci1waW5rLWE3MDA6ICNjNTExNjI7CgogICAgICAtLXBhcGVyLXB1cnBsZS01MDogI2YzZTVmNTsKICAgICAgLS1wYXBlci1wdXJwbGUtMTAwOiAjZTFiZWU3OwogICAgICAtLXBhcGVyLXB1cnBsZS0yMDA6ICNjZTkzZDg7CiAgICAgIC0tcGFwZXItcHVycGxlLTMwMDogI2JhNjhjODsKICAgICAgLS1wYXBlci1wdXJwbGUtNDAwOiAjYWI0N2JjOwogICAgICAtLXBhcGVyLXB1cnBsZS01MDA6ICM5YzI3YjA7CiAgICAgIC0tcGFwZXItcHVycGxlLTYwMDogIzhlMjRhYTsKICAgICAgLS1wYXBlci1wdXJwbGUtNzAwOiAjN2IxZmEyOwogICAgICAtLXBhcGVyLXB1cnBsZS04MDA6ICM2YTFiOWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTkwMDogIzRhMTQ4YzsKICAgICAgLS1wYXBlci1wdXJwbGUtYTEwMDogI2VhODBmYzsKICAgICAgLS1wYXBlci1wdXJwbGUtYTIwMDogI2UwNDBmYjsKICAgICAgLS1wYXBlci1wdXJwbGUtYTQwMDogI2Q1MDBmOTsKICAgICAgLS1wYXBlci1wdXJwbGUtYTcwMDogI2FhMDBmZjsKCiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNTA6ICNlZGU3ZjY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMTAwOiAjZDFjNGU5OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTIwMDogI2IzOWRkYjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0zMDA6ICM5NTc1Y2Q7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNDAwOiAjN2U1N2MyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwMDogIzY3M2FiNzsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS02MDA6ICM1ZTM1YjE7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNzAwOiAjNTEyZGE4OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTgwMDogIzQ1MjdhMDsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS05MDA6ICMzMTFiOTI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTEwMDogI2IzODhmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hMjAwOiAjN2M0ZGZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE0MDA6ICM2NTFmZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTcwMDogIzYyMDBlYTsKCiAgICAgIC0tcGFwZXItaW5kaWdvLTUwOiAjZThlYWY2OwogICAgICAtLXBhcGVyLWluZGlnby0xMDA6ICNjNWNhZTk7CiAgICAgIC0tcGFwZXItaW5kaWdvLTIwMDogIzlmYThkYTsKICAgICAgLS1wYXBlci1pbmRpZ28tMzAwOiAjNzk4NmNiOwogICAgICAtLXBhcGVyLWluZGlnby00MDA6ICM1YzZiYzA7CiAgICAgIC0tcGFwZXItaW5kaWdvLTUwMDogIzNmNTFiNTsKICAgICAgLS1wYXBlci1pbmRpZ28tNjAwOiAjMzk0OWFiOwogICAgICAtLXBhcGVyLWluZGlnby03MDA6ICMzMDNmOWY7CiAgICAgIC0tcGFwZXItaW5kaWdvLTgwMDogIzI4MzU5MzsKICAgICAgLS1wYXBlci1pbmRpZ28tOTAwOiAjMWEyMzdlOwogICAgICAtLXBhcGVyLWluZGlnby1hMTAwOiAjOGM5ZWZmOwogICAgICAtLXBhcGVyLWluZGlnby1hMjAwOiAjNTM2ZGZlOwogICAgICAtLXBhcGVyLWluZGlnby1hNDAwOiAjM2Q1YWZlOwogICAgICAtLXBhcGVyLWluZGlnby1hNzAwOiAjMzA0ZmZlOwoKICAgICAgLS1wYXBlci1ibHVlLTUwOiAjZTNmMmZkOwogICAgICAtLXBhcGVyLWJsdWUtMTAwOiAjYmJkZWZiOwogICAgICAtLXBhcGVyLWJsdWUtMjAwOiAjOTBjYWY5OwogICAgICAtLXBhcGVyLWJsdWUtMzAwOiAjNjRiNWY2OwogICAgICAtLXBhcGVyLWJsdWUtNDAwOiAjNDJhNWY1OwogICAgICAtLXBhcGVyLWJsdWUtNTAwOiAjMjE5NmYzOwogICAgICAtLXBhcGVyLWJsdWUtNjAwOiAjMWU4OGU1OwogICAgICAtLXBhcGVyLWJsdWUtNzAwOiAjMTk3NmQyOwogICAgICAtLXBhcGVyLWJsdWUtODAwOiAjMTU2NWMwOwogICAgICAtLXBhcGVyLWJsdWUtOTAwOiAjMGQ0N2ExOwogICAgICAtLXBhcGVyLWJsdWUtYTEwMDogIzgyYjFmZjsKICAgICAgLS1wYXBlci1ibHVlLWEyMDA6ICM0NDhhZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hNDAwOiAjMjk3OWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTcwMDogIzI5NjJmZjsKCiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDogI2UxZjVmZTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTEwMDogI2IzZTVmYzsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTIwMDogIzgxZDRmYTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTMwMDogIzRmYzNmNzsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTQwMDogIzI5YjZmNjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTUwMDogIzAzYTlmNDsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTYwMDogIzAzOWJlNTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTcwMDogIzAyODhkMTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTgwMDogIzAyNzdiZDsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTkwMDogIzAxNTc5YjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWExMDA6ICM4MGQ4ZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMjAwOiAjNDBjNGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTQwMDogIzAwYjBmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE3MDA6ICMwMDkxZWE7CgogICAgICAtLXBhcGVyLWN5YW4tNTA6ICNlMGY3ZmE7CiAgICAgIC0tcGFwZXItY3lhbi0xMDA6ICNiMmViZjI7CiAgICAgIC0tcGFwZXItY3lhbi0yMDA6ICM4MGRlZWE7CiAgICAgIC0tcGFwZXItY3lhbi0zMDA6ICM0ZGQwZTE7CiAgICAgIC0tcGFwZXItY3lhbi00MDA6ICMyNmM2ZGE7CiAgICAgIC0tcGFwZXItY3lhbi01MDA6ICMwMGJjZDQ7CiAgICAgIC0tcGFwZXItY3lhbi02MDA6ICMwMGFjYzE7CiAgICAgIC0tcGFwZXItY3lhbi03MDA6ICMwMDk3YTc7CiAgICAgIC0tcGFwZXItY3lhbi04MDA6ICMwMDgzOGY7CiAgICAgIC0tcGFwZXItY3lhbi05MDA6ICMwMDYwNjQ7CiAgICAgIC0tcGFwZXItY3lhbi1hMTAwOiAjODRmZmZmOwogICAgICAtLXBhcGVyLWN5YW4tYTIwMDogIzE4ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWE0MDA6ICMwMGU1ZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNzAwOiAjMDBiOGQ0OwoKICAgICAgLS1wYXBlci10ZWFsLTUwOiAjZTBmMmYxOwogICAgICAtLXBhcGVyLXRlYWwtMTAwOiAjYjJkZmRiOwogICAgICAtLXBhcGVyLXRlYWwtMjAwOiAjODBjYmM0OwogICAgICAtLXBhcGVyLXRlYWwtMzAwOiAjNGRiNmFjOwogICAgICAtLXBhcGVyLXRlYWwtNDAwOiAjMjZhNjlhOwogICAgICAtLXBhcGVyLXRlYWwtNTAwOiAjMDA5Njg4OwogICAgICAtLXBhcGVyLXRlYWwtNjAwOiAjMDA4OTdiOwogICAgICAtLXBhcGVyLXRlYWwtNzAwOiAjMDA3OTZiOwogICAgICAtLXBhcGVyLXRlYWwtODAwOiAjMDA2OTVjOwogICAgICAtLXBhcGVyLXRlYWwtOTAwOiAjMDA0ZDQwOwogICAgICAtLXBhcGVyLXRlYWwtYTEwMDogI2E3ZmZlYjsKICAgICAgLS1wYXBlci10ZWFsLWEyMDA6ICM2NGZmZGE7CiAgICAgIC0tcGFwZXItdGVhbC1hNDAwOiAjMWRlOWI2OwogICAgICAtLXBhcGVyLXRlYWwtYTcwMDogIzAwYmZhNTsKCiAgICAgIC0tcGFwZXItZ3JlZW4tNTA6ICNlOGY1ZTk7CiAgICAgIC0tcGFwZXItZ3JlZW4tMTAwOiAjYzhlNmM5OwogICAgICAtLXBhcGVyLWdyZWVuLTIwMDogI2E1ZDZhNzsKICAgICAgLS1wYXBlci1ncmVlbi0zMDA6ICM4MWM3ODQ7CiAgICAgIC0tcGFwZXItZ3JlZW4tNDAwOiAjNjZiYjZhOwogICAgICAtLXBhcGVyLWdyZWVuLTUwMDogIzRjYWY1MDsKICAgICAgLS1wYXBlci1ncmVlbi02MDA6ICM0M2EwNDc7CiAgICAgIC0tcGFwZXItZ3JlZW4tNzAwOiAjMzg4ZTNjOwogICAgICAtLXBhcGVyLWdyZWVuLTgwMDogIzJlN2QzMjsKICAgICAgLS1wYXBlci1ncmVlbi05MDA6ICMxYjVlMjA7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTEwMDogI2I5ZjZjYTsKICAgICAgLS1wYXBlci1ncmVlbi1hMjAwOiAjNjlmMGFlOwogICAgICAtLXBhcGVyLWdyZWVuLWE0MDA6ICMwMGU2NzY7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTcwMDogIzAwYzg1MzsKCiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNTA6ICNmMWY4ZTk7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMTAwOiAjZGNlZGM4OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTIwMDogI2M1ZTFhNTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0zMDA6ICNhZWQ1ODE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNDAwOiAjOWNjYzY1OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwMDogIzhiYzM0YTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi02MDA6ICM3Y2IzNDI7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNzAwOiAjNjg5ZjM4OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTgwMDogIzU1OGIyZjsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi05MDA6ICMzMzY5MWU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTEwMDogI2NjZmY5MDsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hMjAwOiAjYjJmZjU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE0MDA6ICM3NmZmMDM7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTcwMDogIzY0ZGQxNzsKCiAgICAgIC0tcGFwZXItbGltZS01MDogI2Y5ZmJlNzsKICAgICAgLS1wYXBlci1saW1lLTEwMDogI2YwZjRjMzsKICAgICAgLS1wYXBlci1saW1lLTIwMDogI2U2ZWU5YzsKICAgICAgLS1wYXBlci1saW1lLTMwMDogI2RjZTc3NTsKICAgICAgLS1wYXBlci1saW1lLTQwMDogI2Q0ZTE1NzsKICAgICAgLS1wYXBlci1saW1lLTUwMDogI2NkZGMzOTsKICAgICAgLS1wYXBlci1saW1lLTYwMDogI2MwY2EzMzsKICAgICAgLS1wYXBlci1saW1lLTcwMDogI2FmYjQyYjsKICAgICAgLS1wYXBlci1saW1lLTgwMDogIzllOWQyNDsKICAgICAgLS1wYXBlci1saW1lLTkwMDogIzgyNzcxNzsKICAgICAgLS1wYXBlci1saW1lLWExMDA6ICNmNGZmODE7CiAgICAgIC0tcGFwZXItbGltZS1hMjAwOiAjZWVmZjQxOwogICAgICAtLXBhcGVyLWxpbWUtYTQwMDogI2M2ZmYwMDsKICAgICAgLS1wYXBlci1saW1lLWE3MDA6ICNhZWVhMDA7CgogICAgICAtLXBhcGVyLXllbGxvdy01MDogI2ZmZmRlNzsKICAgICAgLS1wYXBlci15ZWxsb3ctMTAwOiAjZmZmOWM0OwogICAgICAtLXBhcGVyLXllbGxvdy0yMDA6ICNmZmY1OWQ7CiAgICAgIC0tcGFwZXIteWVsbG93LTMwMDogI2ZmZjE3NjsKICAgICAgLS1wYXBlci15ZWxsb3ctNDAwOiAjZmZlZTU4OwogICAgICAtLXBhcGVyLXllbGxvdy01MDA6ICNmZmViM2I7CiAgICAgIC0tcGFwZXIteWVsbG93LTYwMDogI2ZkZDgzNTsKICAgICAgLS1wYXBlci15ZWxsb3ctNzAwOiAjZmJjMDJkOwogICAgICAtLXBhcGVyLXllbGxvdy04MDA6ICNmOWE4MjU7CiAgICAgIC0tcGFwZXIteWVsbG93LTkwMDogI2Y1N2YxNzsKICAgICAgLS1wYXBlci15ZWxsb3ctYTEwMDogI2ZmZmY4ZDsKICAgICAgLS1wYXBlci15ZWxsb3ctYTIwMDogI2ZmZmYwMDsKICAgICAgLS1wYXBlci15ZWxsb3ctYTQwMDogI2ZmZWEwMDsKICAgICAgLS1wYXBlci15ZWxsb3ctYTcwMDogI2ZmZDYwMDsKCiAgICAgIC0tcGFwZXItYW1iZXItNTA6ICNmZmY4ZTE7CiAgICAgIC0tcGFwZXItYW1iZXItMTAwOiAjZmZlY2IzOwogICAgICAtLXBhcGVyLWFtYmVyLTIwMDogI2ZmZTA4MjsKICAgICAgLS1wYXBlci1hbWJlci0zMDA6ICNmZmQ1NGY7CiAgICAgIC0tcGFwZXItYW1iZXItNDAwOiAjZmZjYTI4OwogICAgICAtLXBhcGVyLWFtYmVyLTUwMDogI2ZmYzEwNzsKICAgICAgLS1wYXBlci1hbWJlci02MDA6ICNmZmIzMDA7CiAgICAgIC0tcGFwZXItYW1iZXItNzAwOiAjZmZhMDAwOwogICAgICAtLXBhcGVyLWFtYmVyLTgwMDogI2ZmOGYwMDsKICAgICAgLS1wYXBlci1hbWJlci05MDA6ICNmZjZmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItYTEwMDogI2ZmZTU3ZjsKICAgICAgLS1wYXBlci1hbWJlci1hMjAwOiAjZmZkNzQwOwogICAgICAtLXBhcGVyLWFtYmVyLWE0MDA6ICNmZmM0MDA7CiAgICAgIC0tcGFwZXItYW1iZXItYTcwMDogI2ZmYWIwMDsKCiAgICAgIC0tcGFwZXItb3JhbmdlLTUwOiAjZmZmM2UwOwogICAgICAtLXBhcGVyLW9yYW5nZS0xMDA6ICNmZmUwYjI7CiAgICAgIC0tcGFwZXItb3JhbmdlLTIwMDogI2ZmY2M4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMzAwOiAjZmZiNzRkOwogICAgICAtLXBhcGVyLW9yYW5nZS00MDA6ICNmZmE3MjY7CiAgICAgIC0tcGFwZXItb3JhbmdlLTUwMDogI2ZmOTgwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNjAwOiAjZmI4YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS03MDA6ICNmNTdjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTgwMDogI2VmNmMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtOTAwOiAjZTY1MTAwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hMTAwOiAjZmZkMTgwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hMjAwOiAjZmZhYjQwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hNDAwOiAjZmY5MTAwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hNzAwOiAjZmY2NTAwOwoKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS01MDogI2ZiZTllNzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0xMDA6ICNmZmNjYmM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMjAwOiAjZmZhYjkxOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTMwMDogI2ZmOGE2NTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS00MDA6ICNmZjcwNDM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTAwOiAjZmY1NzIyOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTYwMDogI2Y0NTExZTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS03MDA6ICNlNjRhMTk7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtODAwOiAjZDg0MzE1OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTkwMDogI2JmMzYwYzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMTAwOiAjZmY5ZTgwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWEyMDA6ICNmZjZlNDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTQwMDogI2ZmM2QwMDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hNzAwOiAjZGQyYzAwOwoKICAgICAgLS1wYXBlci1icm93bi01MDogI2VmZWJlOTsKICAgICAgLS1wYXBlci1icm93bi0xMDA6ICNkN2NjYzg7CiAgICAgIC0tcGFwZXItYnJvd24tMjAwOiAjYmNhYWE0OwogICAgICAtLXBhcGVyLWJyb3duLTMwMDogI2ExODg3ZjsKICAgICAgLS1wYXBlci1icm93bi00MDA6ICM4ZDZlNjM7CiAgICAgIC0tcGFwZXItYnJvd24tNTAwOiAjNzk1NTQ4OwogICAgICAtLXBhcGVyLWJyb3duLTYwMDogIzZkNGM0MTsKICAgICAgLS1wYXBlci1icm93bi03MDA6ICM1ZDQwMzc7CiAgICAgIC0tcGFwZXItYnJvd24tODAwOiAjNGUzNDJlOwogICAgICAtLXBhcGVyLWJyb3duLTkwMDogIzNlMjcyMzsKCiAgICAgIC0tcGFwZXItZ3JleS01MDogI2ZhZmFmYTsKICAgICAgLS1wYXBlci1ncmV5LTEwMDogI2Y1ZjVmNTsKICAgICAgLS1wYXBlci1ncmV5LTIwMDogI2VlZWVlZTsKICAgICAgLS1wYXBlci1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1wYXBlci1ncmV5LTQwMDogI2JkYmRiZDsKICAgICAgLS1wYXBlci1ncmV5LTUwMDogIzllOWU5ZTsKICAgICAgLS1wYXBlci1ncmV5LTYwMDogIzc1NzU3NTsKICAgICAgLS1wYXBlci1ncmV5LTcwMDogIzYxNjE2MTsKICAgICAgLS1wYXBlci1ncmV5LTgwMDogIzQyNDI0MjsKICAgICAgLS1wYXBlci1ncmV5LTkwMDogIzIxMjEyMTsKCiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTUwOiAjZWNlZmYxOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0xMDA6ICNjZmQ4ZGM7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTIwMDogI2IwYmVjNTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMzAwOiAjOTBhNGFlOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS00MDA6ICM3ODkwOWM7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTUwMDogIzYwN2Q4YjsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNjAwOiAjNTQ2ZTdhOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS03MDA6ICM0NTVhNjQ7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTgwMDogIzM3NDc0ZjsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktOTAwOiAjMjYzMjM4OwoKICAgICAgLyogb3BhY2l0eSBmb3IgZGFyayB0ZXh0IG9uIGEgbGlnaHQgYmFja2dyb3VuZCAqLwogICAgICAtLWRhcmstZGl2aWRlci1vcGFjaXR5OiAwLjEyOwogICAgICAtLWRhcmstZGlzYWJsZWQtb3BhY2l0eTogMC4zODsgLyogb3IgaGludCB0ZXh0IG9yIGljb24gKi8KICAgICAgLS1kYXJrLXNlY29uZGFyeS1vcGFjaXR5OiAwLjU0OwogICAgICAtLWRhcmstcHJpbWFyeS1vcGFjaXR5OiAwLjg3OwoKICAgICAgLyogb3BhY2l0eSBmb3IgbGlnaHQgdGV4dCBvbiBhIGRhcmsgYmFja2dyb3VuZCAqLwogICAgICAtLWxpZ2h0LWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1saWdodC1kaXNhYmxlZC1vcGFjaXR5OiAwLjM7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tbGlnaHQtc2Vjb25kYXJ5LW9wYWNpdHk6IDAuNzsKICAgICAgLS1saWdodC1wcmltYXJ5LW9wYWNpdHk6IDEuMDsKCiAgICB9CgogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLyoKICAgICAgICogWW91IGNhbiB1c2UgdGhlc2UgZ2VuZXJpYyB2YXJpYWJsZXMgaW4geW91ciBlbGVtZW50cyBmb3IgZWFzeSB0aGVtaW5nLgogICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYWxsIHlvdXIgZWxlbWVudHMgdXNlIGAtLXByaW1hcnktdGV4dC1jb2xvcmAgYXMgaXRzIG1haW4KICAgICAgICogY29sb3IsIHRoZW4gc3dpdGNoaW5nIGZyb20gYSBsaWdodCB0byBhIGRhcmsgdGhlbWUgaXMganVzdCBhIG1hdHRlciBvZgogICAgICAgKiBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgYC0tcHJpbWFyeS10ZXh0LWNvbG9yYCBpbiB5b3VyIGFwcGxpY2F0aW9uLgogICAgICAgKi8KICAgICAgLS1wcmltYXJ5LXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLXRleHQtY29sb3IpOwogICAgICAtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtYmFja2dyb3VuZC1jb2xvcik7CiAgICAgIC0tc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcik7CiAgICAgIC0tZGlzYWJsZWQtdGV4dC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtZGlzYWJsZWQtY29sb3IpOwogICAgICAtLWRpdmlkZXItY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3IpOwogICAgICAtLWVycm9yLWNvbG9yOiB2YXIoLS1wYXBlci1kZWVwLW9yYW5nZS1hNzAwKTsKCiAgICAgIC8qCiAgICAgICAqIFByaW1hcnkgYW5kIGFjY2VudCBjb2xvcnMuIEFsc28gc2VlIGNvbG9yLmh0bWwgZm9yIG1vcmUgY29sb3JzLgogICAgICAgKi8KICAgICAgLS1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgLS1saWdodC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tMTAwKTsKICAgICAgLS1kYXJrLXByaW1hcnktY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby03MDApOwoKICAgICAgLS1hY2NlbnQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstYTIwMCk7CiAgICAgIC0tbGlnaHQtYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWExMDApOwogICAgICAtLWRhcmstYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWE0MDApOwoKCiAgICAgIC8qCiAgICAgICAqIE1hdGVyaWFsIERlc2lnbiBMaWdodCBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tbGlnaHQtdGhlbWUtYmFzZS1jb2xvcjogIzAwMDAwMDsKICAgICAgLS1saWdodC10aGVtZS10ZXh0LWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTkwMCk7CiAgICAgIC0tbGlnaHQtdGhlbWUtc2Vjb25kYXJ5LWNvbG9yOiAjNzM3MzczOyAgLyogZm9yIHNlY29uZGFyeSB0ZXh0IGFuZCBpY29ucyAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yOiAjOWI5YjliOyAgLyogZGlzYWJsZWQvaGludCB0ZXh0ICovCiAgICAgIC0tbGlnaHQtdGhlbWUtZGl2aWRlci1jb2xvcjogI2RiZGJkYjsKCiAgICAgIC8qCiAgICAgICAqIE1hdGVyaWFsIERlc2lnbiBEYXJrIGJhY2tncm91bmQgdGhlbWUKICAgICAgICovCiAgICAgIC0tZGFyay10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTkwMCk7CiAgICAgIC0tZGFyay10aGVtZS1iYXNlLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWRhcmstdGhlbWUtdGV4dC1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXNlY29uZGFyeS1jb2xvcjogI2JjYmNiYzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1kYXJrLXRoZW1lLWRpc2FibGVkLWNvbG9yOiAjNjQ2NDY0OyAgLyogZGlzYWJsZWQvaGludCB0ZXh0ICovCiAgICAgIC0tZGFyay10aGVtZS1kaXZpZGVyLWNvbG9yOiAjM2MzYzNjOwoKICAgICAgLyoKICAgICAgICogRGVwcmVjYXRlZCB2YWx1ZXMgYmVjYXVzZSBvZiB0aGVpciBjb25mdXNpbmcgbmFtZXMuCiAgICAgICAqLwogICAgICAtLXRleHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tZGFyay10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1kZWZhdWx0LXByaW1hcnktY29sb3I6IHZhcigtLXByaW1hcnktY29sb3IpOwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLW1ldGEvaXJvbi1tZXRhLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uTWV0YT1mdW5jdGlvbihjKXtQb2x5bWVyLklyb25NZXRhWyIgIl0oYyk7dGhpcy50eXBlPWMmJmMudHlwZXx8ImRlZmF1bHQiO3RoaXMua2V5PWMmJmMua2V5O2MmJiJ2YWx1ZSJpbiBjJiYodGhpcy52YWx1ZT1jLnZhbHVlKX07UG9seW1lci5Jcm9uTWV0YVsiICJdPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLklyb25NZXRhLnR5cGVzPXt9O1BvbHltZXIuSXJvbk1ldGEucHJvdG90eXBlPXtnZXQgdmFsdWUoKXt2YXIgYz10aGlzLnR5cGUsZD10aGlzLmtleTtpZihjJiZkKXJldHVybiBQb2x5bWVyLklyb25NZXRhLnR5cGVzW2NdJiZQb2x5bWVyLklyb25NZXRhLnR5cGVzW2NdW2RdfSxzZXQgdmFsdWUoYyl7dmFyIGQ9dGhpcy50eXBlLGY9dGhpcy5rZXk7ZCYmZiYmKGQ9UG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXT1Qb2x5bWVyLklyb25NZXRhLnR5cGVzW2RdfHx7fSxudWxsPT1jP2RlbGV0ZSBkW2ZdOmRbZl09Yyl9LGdldCBsaXN0KCl7aWYodGhpcy50eXBlKXt2YXIgYz0KUG9seW1lci5Jcm9uTWV0YS50eXBlc1t0aGlzLnR5cGVdO3JldHVybiBjP09iamVjdC5rZXlzKGMpLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gYVt0aGlzLnR5cGVdW2RdfSx0aGlzKTpbXX19LGJ5S2V5OmZ1bmN0aW9uKGMpe3RoaXMua2V5PWM7cmV0dXJuIHRoaXMudmFsdWV9fTt2YXIgYT1Qb2x5bWVyLklyb25NZXRhLnR5cGVzO1BvbHltZXIoe2lzOiJpcm9uLW1ldGEiLHByb3BlcnRpZXM6e3R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJkZWZhdWx0In0sa2V5Ont0eXBlOlN0cmluZ30sdmFsdWU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZjp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfc2VsZkNoYW5nZWQifSxfX21ldGE6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX19jb21wdXRlTWV0YSh0eXBlLCBrZXksIHZhbHVlKSJ9fSxob3N0QXR0cmlidXRlczp7aGlkZGVuOiEwfSxfX2NvbXB1dGVNZXRhOmZ1bmN0aW9uKGMsZCxmKXtjPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOmMsCmtleTpkfSk7dm9pZCAwIT09ZiYmZiE9PWMudmFsdWU/Yy52YWx1ZT1mOnRoaXMudmFsdWUhPT1jLnZhbHVlJiYodGhpcy52YWx1ZT1jLnZhbHVlKTtyZXR1cm4gY30sZ2V0IGxpc3QoKXtyZXR1cm4gdGhpcy5fX21ldGEmJnRoaXMuX19tZXRhLmxpc3R9LF9zZWxmQ2hhbmdlZDpmdW5jdGlvbihjKXtjJiYodGhpcy52YWx1ZT10aGlzKX0sYnlLZXk6ZnVuY3Rpb24oYyl7cmV0dXJuKG5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOnRoaXMudHlwZSxrZXk6Y30pKS52YWx1ZX19KX0pKCk7Cjwvc2NyaXB0PgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLXZhbGlkYXRhYmxlLWJlaGF2aW9yL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YT1udWxsOwpQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnt2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxpbnZhbGlkOntub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIn19LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YT1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZToidmFsaWRhdG9yIn0pfSxfaW52YWxpZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmludmFsaWQ/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIsInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIil9LGdldCBfdmFsaWRhdG9yKCl7cmV0dXJuIFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhJiZQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YS5ieUtleSh0aGlzLnZhbGlkYXRvcil9LGhhc1ZhbGlkYXRvcjpmdW5jdGlvbigpe3JldHVybiBudWxsIT0KdGhpcy5fdmFsaWRhdG9yfSx2YWxpZGF0ZTpmdW5jdGlvbihhKXt0aGlzLmludmFsaWQ9dm9pZCAwPT09YSYmdm9pZCAwIT09dGhpcy52YWx1ZT8hdGhpcy5fZ2V0VmFsaWRpdHkodGhpcy52YWx1ZSk6IXRoaXMuX2dldFZhbGlkaXR5KGEpO3JldHVybiF0aGlzLmludmFsaWR9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oYXNWYWxpZGF0b3IoKT90aGlzLl92YWxpZGF0b3IudmFsaWRhdGUoYSk6ITB9fTsKPC9zY3JpcHQ+CgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLWZvcm0tZWxlbWVudC1iZWhhdmlvci9pcm9uLWZvcm0tZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3I9e3Byb3BlcnRpZXM6e25hbWU6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfcGFyZW50Rm9ybTp7dHlwZTpPYmplY3R9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuRWxlbWVudHx8dGhpcy5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC1yZWdpc3RlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpeyFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuX3BhcmVudEZvcm0mJnRoaXMuX3BhcmVudEZvcm0uZmlyZSgiaXJvbi1mb3JtLWVsZW1lbnQtdW5yZWdpc3RlciIse3RhcmdldDp0aGlzfSl9fTsKPC9zY3JpcHQ+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsbm90aWZ5OiEwLG9ic2VydmVyOiJfY2hlY2tlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9uIixvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcmVxdWlyZWRDaGFuZ2VkKHJlcXVpcmVkKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj0hMH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCF0aGlzLnJlcXVpcmVkfHx0aGlzLmNoZWNrZWR9LF9yZXF1aXJlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlcXVpcmVkP3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXJlcXVpcmVkIiwKInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIpfSxfY2hlY2tlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT10aGlzLmNoZWNrZWQ7dGhpcy5maXJlKCJpcm9uLWNoYW5nZSIpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy52YWx1ZXx8bnVsbD09PXRoaXMudmFsdWUpdGhpcy52YWx1ZT0ib24ifX07UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj1bUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsXTsKPC9zY3JpcHQ+CgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWJlaGF2aW9ycy9wYXBlci1pbmt5LWZvY3VzLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbD17b2JzZXJ2ZXJzOlsiX2ZvY3VzZWRDaGFuZ2VkKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIl0sX2ZvY3VzZWRDaGFuZ2VkOmZ1bmN0aW9uKGEpe2EmJnRoaXMuZW5zdXJlUmlwcGxlKCk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5ob2xkRG93bj1hKX0sX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3ZhciBhPVBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvci5fY3JlYXRlUmlwcGxlKCk7YS5pZD0iaW5rIjthLnNldEF0dHJpYnV0ZSgiY2VudGVyIiwiIik7YS5jbGFzc0xpc3QuYWRkKCJjaXJjbGUiKTtyZXR1cm4gYX19O1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcj1bUG9seW1lci5Jcm9uQnV0dG9uU3RhdGUsUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcixQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsXTsKPC9zY3JpcHQ+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWJlaGF2aW9ycy9wYXBlci1jaGVja2VkLWVsZW1lbnQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e19jaGVja2VkQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsLl9jaGVja2VkQ2hhbmdlZC5jYWxsKHRoaXMpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLmNoZWNrZWQ/dGhpcy5fcmlwcGxlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIiIpOnRoaXMuX3JpcHBsZS5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKSl9LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2J1dHRvblN0YXRlQ2hhbmdlZC5jYWxsKHRoaXMpOyF0aGlzLmRpc2FibGVkJiZ0aGlzLmlzQXR0YWNoZWQmJih0aGlzLmNoZWNrZWQ9dGhpcy5hY3RpdmUpfX07ClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yPVtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3IsUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGxdOwo8L3NjcmlwdD4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1jaGVja2JveCI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemU6IHZhcigtLXBhcGVyLWNoZWNrYm94LXNpemUsIDE4cHgpOwogICAgICAgIC8qIC0xcHggaXMgYSBzZW50aW5lbCBmb3IgdGhlIGRlZmF1bHQgYW5kIGlzIHJlcGxhY2VkIGluIGBhdHRhY2hlZGAuICovCiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1pbmstc2l6ZSwgLTFweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBsaW5lLWhlaWdodDogMDsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgI2NoZWNrYm94Q29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBtaW4td2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgbWFyZ2luOiB2YXIoLS1wYXBlci1jaGVja2JveC1tYXJnaW4sIGluaXRpYWwpOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB2YXIoLS1wYXBlci1jaGVja2JveC12ZXJ0aWNhbC1hbGlnbiwgbWlkZGxlKTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICB9CgogICAgICAjaW5rIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CgogICAgICAgIC8qIENlbnRlciB0aGUgcmlwcGxlIGluIHRoZSBjaGVja2JveCBieSBuZWdhdGl2ZSBvZmZzZXR0aW5nIGl0IGJ5CiAgICAgICAgICogKGlua1dpZHRoIC0gcmlwcGxlV2lkdGgpIC8gMiAqLwogICAgICAgIHRvcDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgICAgIGxlZnQ6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjaW5rOmRpcihydGwpIHsKICAgICAgICByaWdodDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgIH0KCiAgICAgICNpbmtbY2hlY2tlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICAjY2hlY2tib3ggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBib3JkZXI6IHNvbGlkIDJweDsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAxNDBtcywgYm9yZGVyLWNvbG9yIDE0MG1zOwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgICAgfQoKICAgICAgLyogY2hlY2tib3ggY2hlY2tlZCBhbmltYXRpb25zICovCiAgICAgICNjaGVja2JveC5jaGVja2VkICNjaGVja21hcmsgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjaGVja21hcmstZXhwYW5kIDE0MG1zIGVhc2Utb3V0IGZvcndhcmRzOwogICAgICAgIGFuaW1hdGlvbjogY2hlY2ttYXJrLWV4cGFuZCAxNDBtcyBlYXNlLW91dCBmb3J3YXJkczsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGNoZWNrbWFyay1leHBhbmQgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAsIDApIHJvdGF0ZSg0NWRlZyk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI2NoZWNrYm94LmNoZWNrZWQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI2NoZWNrbWFyayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAzNiU7CiAgICAgICAgaGVpZ2h0OiA3MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICAgIGJvcmRlci1yaWdodC13aWR0aDogY2FsYygyLzE1ICogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSk7CiAgICAgICAgYm9yZGVyLWJvdHRvbS13aWR0aDogY2FsYygyLzE1ICogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja21hcmstY29sb3IsIHdoaXRlKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogOTclIDg2JTsKICAgICAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgLyogcHJvdGVjdCBhZ2FpbnN0IHBhZ2UtbGV2ZWwgYm94LXNpemluZyAqLwogICAgICB9CgogICAgICAjY2hlY2ttYXJrOmRpcihydGwpIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogNTAlIDE0JTsKICAgICAgfQoKICAgICAgLyogbGFiZWwgKi8KICAgICAgI2NoZWNrYm94TGFiZWwgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBsaW5lLWhlaWdodDogbm9ybWFsOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItY2hlY2tib3gtbGFiZWw7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXSkgI2NoZWNrYm94TGFiZWwgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSkpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWNoZWNrYm94LWxhYmVsLWNoZWNrZWQ7CiAgICAgIH0KCiAgICAgICNjaGVja2JveExhYmVsOmRpcihydGwpIHsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgICAgIHBhZGRpbmctbGVmdDogMDsKICAgICAgfQoKICAgICAgI2NoZWNrYm94TGFiZWxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXVtjaGVja2VkXSkgI2NoZWNrYm94IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgI2NoZWNrYm94TGFiZWwgIHsKICAgICAgICBvcGFjaXR5OiAwLjY1OwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgICNjaGVja2JveC5pbnZhbGlkOm5vdCguY2hlY2tlZCkgewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtZXJyb3ItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY2hlY2tib3hDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJjaGVja2JveCIgY2xhc3MkPSJbW19jb21wdXRlQ2hlY2tib3hDbGFzcyhjaGVja2VkLCBpbnZhbGlkKV1dIj4KICAgICAgICA8ZGl2IGlkPSJjaGVja21hcmsiIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrbWFya0NsYXNzKGNoZWNrZWQpXV0iPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImNoZWNrYm94TGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItY2hlY2tib3gvcGFwZXItY2hlY2tib3guaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItY2hlY2tib3giLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjaGVja2JveCIsImFyaWEtY2hlY2tlZCI6ITEsdGFiaW5kZXg6MH0scHJvcGVydGllczp7YXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtY2hlY2tlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSIpLnRyaW0oKSl7dmFyIGE9dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplIikudHJpbSgpLGM9InB4IixkPWEubWF0Y2goL1tBLVphLXpdKyQvKTtudWxsIT09ZCYmKGM9ZFswXSk7YT1wYXJzZUZsb2F0KGEpOwpkPTgvMyphOyJweCI9PT1jJiYoZD1NYXRoLmZsb29yKGQpLGQlMiE9PWElMiYmZCsrKTt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUiOmQrY30pfX0pfSxfY29tcHV0ZUNoZWNrYm94Q2xhc3M6ZnVuY3Rpb24oYSxjKXt2YXIgZD0iIjthJiYoZCs9ImNoZWNrZWQgIik7YyYmKGQrPSJpbnZhbGlkIik7cmV0dXJuIGR9LF9jb21wdXRlQ2hlY2ttYXJrQ2xhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IiI6ImhpZGRlbiJ9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLmNoZWNrYm94Q29udGFpbmVyO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24taWNvbi9pcm9uLWljb24uaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pY29uIixwcm9wZXJ0aWVzOntpY29uOnt0eXBlOlN0cmluZ30sdGhlbWU6e3R5cGU6U3RyaW5nfSxzcmM6e3R5cGU6U3RyaW5nfSxfbWV0YTp7dmFsdWU6UG9seW1lci5CYXNlLmNyZWF0ZSgiaXJvbi1tZXRhIix7dHlwZToiaWNvbnNldCJ9KX19LG9ic2VydmVyczpbIl91cGRhdGVJY29uKF9tZXRhLCBpc0F0dGFjaGVkKSIsIl91cGRhdGVJY29uKHRoZW1lLCBpc0F0dGFjaGVkKSIsIl9zcmNDaGFuZ2VkKHNyYywgaXNBdHRhY2hlZCkiLCJfaWNvbkNoYW5nZWQoaWNvbiwgaXNBdHRhY2hlZCkiXSxfREVGQVVMVF9JQ09OU0VUOiJpY29ucyIsX2ljb25DaGFuZ2VkOmZ1bmN0aW9uKGEpe2E9KGF8fCIiKS5zcGxpdCgiOiIpO3RoaXMuX2ljb25OYW1lPWEucG9wKCk7dGhpcy5faWNvbnNldE5hbWU9YS5wb3AoKXx8dGhpcy5fREVGQVVMVF9JQ09OU0VUO3RoaXMuX3VwZGF0ZUljb24oKX0sX3NyY0NoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJY29uKCl9LApfdXNlc0ljb25zZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pY29ufHwhdGhpcy5zcmN9LF91cGRhdGVJY29uOmZ1bmN0aW9uKCl7dGhpcy5fdXNlc0ljb25zZXQoKT8odGhpcy5faW1nJiZ0aGlzLl9pbWcucGFyZW50Tm9kZSYmUG9seW1lci5kb20odGhpcy5yb290KS5yZW1vdmVDaGlsZCh0aGlzLl9pbWcpLCIiPT09dGhpcy5faWNvbk5hbWU/dGhpcy5faWNvbnNldCYmdGhpcy5faWNvbnNldC5yZW1vdmVJY29uKHRoaXMpOnRoaXMuX2ljb25zZXROYW1lJiZ0aGlzLl9tZXRhJiYoKHRoaXMuX2ljb25zZXQ9dGhpcy5fbWV0YS5ieUtleSh0aGlzLl9pY29uc2V0TmFtZSkpPyh0aGlzLl9pY29uc2V0LmFwcGx5SWNvbih0aGlzLHRoaXMuX2ljb25OYW1lLHRoaXMudGhlbWUpLHRoaXMudW5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKTp0aGlzLmxpc3Rlbih3aW5kb3csImlyb24taWNvbnNldC1hZGRlZCIsIl91cGRhdGVJY29uIikpKToodGhpcy5faWNvbnNldCYmCnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKSx0aGlzLl9pbWd8fCh0aGlzLl9pbWc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksdGhpcy5faW1nLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLl9pbWcuZHJhZ2dhYmxlPSExKSx0aGlzLl9pbWcuc3JjPXRoaXMuc3JjLFBvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQodGhpcy5faW1nKSl9fSk7Cjwvc2NyaXB0PgoKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1hMTF5LWFubm91bmNlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBjbGlwOiByZWN0KDBweCwwcHgsMHB4LDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGFyaWEtbGl2ZSQ9IltbbW9kZV1dIj5bW190ZXh0XV08L2Rpdj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1hMTF5LWFubm91bmNlci9pcm9uLWExMXktYW5ub3VuY2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlcj1mdW5jdGlvbigpe307UG9seW1lci5Jcm9uQTExeUFubm91bmNlcj1Qb2x5bWVyKHtpczoiaXJvbi1hMTF5LWFubm91bmNlciIscHJvcGVydGllczp7bW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBvbGl0ZSJ9LF90ZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlfHwoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZT10aGlzKTtkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImlyb24tYW5ub3VuY2UiLHRoaXMuX29uSXJvbkFubm91bmNlLmJpbmQodGhpcykpfSxhbm5vdW5jZTpmdW5jdGlvbihhKXt0aGlzLl90ZXh0PSIiO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl90ZXh0PWF9LDEwMCl9LF9vbklyb25Bbm5vdW5jZTpmdW5jdGlvbihhKXthLmRldGFpbCYmYS5kZXRhaWwudGV4dCYmdGhpcy5hbm5vdW5jZShhLmRldGFpbC50ZXh0KX19KTsKUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZT1udWxsO1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eT1mdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2V8fChQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tYTExeS1hbm5vdW5jZXIiKSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlKX19KSgpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWlucHV0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2xvdCBpZD0iY29udGVudCI+PC9zbG90PgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24taW5wdXQvaXJvbi1pbnB1dC5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWlucHV0IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e2JpbmRWYWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVWYWx1ZShiaW5kVmFsdWUpIn0sYWxsb3dlZFBhdHRlcm46e3R5cGU6U3RyaW5nfSxhdXRvVmFsaWRhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lucHV0RWxlbWVudDpPYmplY3R9LG9ic2VydmVyczpbIl9iaW5kVmFsdWVDaGFuZ2VkKGJpbmRWYWx1ZSwgX2lucHV0RWxlbWVudCkiXSxsaXN0ZW5lcnM6e2lucHV0OiJfb25JbnB1dCIsa2V5cHJlc3M6Il9vbktleXByZXNzIn0sY3JlYXRlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eSgpO3RoaXMuX3ByZXZpb3VzVmFsaWRJbnB1dD0iIjt0aGlzLl9wYXR0ZXJuQWxyZWFkeUNoZWNrZWQ9ITF9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9ClBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbigpe3RoaXMuX2luaXRTbG90dGVkSW5wdXQoKX0uYmluZCh0aGlzKSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJihQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlciksdGhpcy5fb2JzZXJ2ZXI9bnVsbCl9LGdldCBpbnB1dEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50fSxfaW5pdFNsb3R0ZWRJbnB1dDpmdW5jdGlvbigpe3RoaXMuX2lucHV0RWxlbWVudD10aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKClbMF07dGhpcy5pbnB1dEVsZW1lbnQmJnRoaXMuaW5wdXRFbGVtZW50LnZhbHVlJiYodGhpcy5iaW5kVmFsdWU9dGhpcy5pbnB1dEVsZW1lbnQudmFsdWUpO3RoaXMuZmlyZSgiaXJvbi1pbnB1dC1yZWFkeSIpfSxnZXQgX3BhdHRlcm5SZWdFeHAoKXtpZih0aGlzLmFsbG93ZWRQYXR0ZXJuKXZhciBhPW5ldyBSZWdFeHAodGhpcy5hbGxvd2VkUGF0dGVybik7CmVsc2Ugc3dpdGNoKHRoaXMuaW5wdXRFbGVtZW50LnR5cGUpe2Nhc2UgIm51bWJlciI6YT0vWzAtOS4sZS1dL31yZXR1cm4gYX0sX2JpbmRWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYSxjKXtjJiYodm9pZCAwPT09YT9jLnZhbHVlPW51bGw6YSE9PWMudmFsdWUmJih0aGlzLmlucHV0RWxlbWVudC52YWx1ZT1hKSx0aGlzLmF1dG9WYWxpZGF0ZSYmdGhpcy52YWxpZGF0ZSgpLHRoaXMuZmlyZSgiYmluZC12YWx1ZS1jaGFuZ2VkIix7dmFsdWU6YX0pKX0sX29uSW5wdXQ6ZnVuY3Rpb24oKXshdGhpcy5hbGxvd2VkUGF0dGVybnx8dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkfHx0aGlzLl9jaGVja1BhdHRlcm5WYWxpZGl0eSgpfHwodGhpcy5fYW5ub3VuY2VJbnZhbGlkQ2hhcmFjdGVyKCJJbnZhbGlkIHN0cmluZyBvZiBjaGFyYWN0ZXJzIG5vdCBlbnRlcmVkLiIpLHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlPXRoaXMuX3ByZXZpb3VzVmFsaWRJbnB1dCk7dGhpcy5iaW5kVmFsdWU9dGhpcy5fcHJldmlvdXNWYWxpZElucHV0PQp0aGlzLmlucHV0RWxlbWVudC52YWx1ZTt0aGlzLl9wYXR0ZXJuQWxyZWFkeUNoZWNrZWQ9ITF9LF9pc1ByaW50YWJsZTpmdW5jdGlvbihhKXt2YXIgYz0xOT09YS5rZXlDb2RlfHwyMD09YS5rZXlDb2RlfHw0NT09YS5rZXlDb2RlfHw0Nj09YS5rZXlDb2RlfHwxNDQ9PWEua2V5Q29kZXx8MTQ1PT1hLmtleUNvZGV8fDMyPGEua2V5Q29kZSYmNDE+YS5rZXlDb2RlfHwxMTE8YS5rZXlDb2RlJiYxMjQ+YS5rZXlDb2RlO3JldHVybiEoOD09YS5rZXlDb2RlfHw5PT1hLmtleUNvZGV8fDEzPT1hLmtleUNvZGV8fDI3PT1hLmtleUNvZGUpJiYhKDA9PWEuY2hhckNvZGUmJmMpfSxfb25LZXlwcmVzczpmdW5jdGlvbihhKXtpZih0aGlzLmFsbG93ZWRQYXR0ZXJufHwibnVtYmVyIj09PXRoaXMuaW5wdXRFbGVtZW50LnR5cGUpe3ZhciBjPXRoaXMuX3BhdHRlcm5SZWdFeHA7aWYoYyYmIShhLm1ldGFLZXl8fGEuY3RybEtleXx8YS5hbHRLZXkpKXt0aGlzLl9wYXR0ZXJuQWxyZWFkeUNoZWNrZWQ9CiEwO3ZhciBkPVN0cmluZy5mcm9tQ2hhckNvZGUoYS5jaGFyQ29kZSk7dGhpcy5faXNQcmludGFibGUoYSkmJiFjLnRlc3QoZCkmJihhLnByZXZlbnREZWZhdWx0KCksdGhpcy5fYW5ub3VuY2VJbnZhbGlkQ2hhcmFjdGVyKCJJbnZhbGlkIGNoYXJhY3RlciAiK2QrIiBub3QgZW50ZXJlZC4iKSl9fX0sX2NoZWNrUGF0dGVyblZhbGlkaXR5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fcGF0dGVyblJlZ0V4cDtpZighYSlyZXR1cm4hMDtmb3IodmFyIGM9MDtjPHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlLmxlbmd0aDtjKyspaWYoIWEudGVzdCh0aGlzLmlucHV0RWxlbWVudC52YWx1ZVtjXSkpcmV0dXJuITE7cmV0dXJuITB9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaW5wdXRFbGVtZW50KXJldHVybiB0aGlzLmludmFsaWQ9ITEsITA7dmFyIGE9dGhpcy5pbnB1dEVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpO2EmJih0aGlzLnJlcXVpcmVkJiYiIj09PXRoaXMuYmluZFZhbHVlP2E9ITE6CnRoaXMuaGFzVmFsaWRhdG9yKCkmJihhPVBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3IudmFsaWRhdGUuY2FsbCh0aGlzLHRoaXMuYmluZFZhbHVlKSkpO3RoaXMuaW52YWxpZD0hYTt0aGlzLmZpcmUoImlyb24taW5wdXQtdmFsaWRhdGUiKTtyZXR1cm4gYX0sX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcjpmdW5jdGlvbihhKXt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0OmF9KX0sX2NvbXB1dGVWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXI9e307UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRMYWJlbElEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRBZGRvbklEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEPTE7ClBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7bGFiZWw6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LHR5cGU6e3R5cGU6U3RyaW5nfSxsaXN0Ont0eXBlOlN0cmluZ30scGF0dGVybjp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LGNoYXJDb3VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLAp2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9hdXRvZm9jdXNDaGFuZ2VkIn0saW5wdXRtb2RlOnt0eXBlOlN0cmluZ30sbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbWluOnt0eXBlOlN0cmluZ30sbWF4Ont0eXBlOlN0cmluZ30sc3RlcDp7dHlwZTpTdHJpbmd9LG5hbWU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJlYWRvbmx5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNpemU6e3R5cGU6TnVtYmVyfSxhdXRvY2FwaXRhbGl6ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vbmUifSxhdXRvY29ycmVjdDp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9zYXZlOnt0eXBlOlN0cmluZ30scmVzdWx0czp7dHlwZTpOdW1iZXJ9LGFjY2VwdDp7dHlwZTpTdHJpbmd9LG11bHRpcGxlOnt0eXBlOkJvb2xlYW59LF9hcmlhRGVzY3JpYmVkQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSwKX2FyaWFMYWJlbGxlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2lucHV0SWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIn0sa2V5QmluZGluZ3M6eyJzaGlmdCt0YWI6a2V5ZG93biI6Il9vblNoaWZ0VGFiRG93biJ9LGhvc3RBdHRyaWJ1dGVzOnt0YWJpbmRleDowfSxnZXQgaW5wdXRFbGVtZW50KCl7dGhpcy4kfHwodGhpcy4kPXt9KTt0aGlzLiQuaW5wdXR8fCh0aGlzLl9nZW5lcmF0ZUlucHV0SWQoKSx0aGlzLiQuaW5wdXQ9dGhpcy4kJCgiIyIrdGhpcy5faW5wdXRJZCkpO3JldHVybiB0aGlzLiQuaW5wdXR9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3R5cGVzVGhhdEhhdmVUZXh0PSJkYXRlIGRhdGV0aW1lIGRhdGV0aW1lLWxvY2FsIG1vbnRoIHRpbWUgd2VlayBmaWxlIi5zcGxpdCgiICIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCk7CiFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy5pbnB1dEVsZW1lbnQudHlwZSkmJih0aGlzLmFsd2F5c0Zsb2F0TGFiZWw9ITApfSxfYXBwZW5kU3RyaW5nV2l0aFNwYWNlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE/YSsiICIrYzpjfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKGEpe2E9UG9seW1lci5kb20oYSkucm9vdFRhcmdldDtpZihhLmlkKXRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LGEuaWQpO2Vsc2V7dmFyIGM9InBhcGVyLWlucHV0LWFkZC1vbi0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRCsrO2EuaWQ9Yzt0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxjKX19LHZhbGlkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnZhbGlkYXRlKCl9LApfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbihhKXtQb2x5bWVyLklyb25Db250cm9sU3RhdGUuX2ZvY3VzQmx1ckhhbmRsZXIuY2FsbCh0aGlzLGEpO3RoaXMuZm9jdXNlZCYmIXRoaXMuX3NoaWZ0VGFiUHJlc3NlZCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITA7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixhKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfaGFuZGxlQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKX0sdXBkYXRlVmFsdWVBbmRQcmVzZXJ2ZUNhcmV0OmZ1bmN0aW9uKGEpe3RyeXt2YXIgYz0KdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7dGhpcy52YWx1ZT1hO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0PWM7dGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kPWN9Y2F0Y2goZCl7dGhpcy52YWx1ZT1hfX0sX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGN8fGF9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe3ZhciBhPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigibGFiZWwiKTtpZihhKXtpZihhLmlkKXZhciBjPWEuaWQ7ZWxzZSBjPSJwYXBlci1pbnB1dC1sYWJlbC0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRCsrLGEuaWQ9Yzt0aGlzLl9hcmlhTGFiZWxsZWRCeT1jfWVsc2UgdGhpcy5fYXJpYUxhYmVsbGVkQnk9IiJ9LF9nZW5lcmF0ZUlucHV0SWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dElkJiYiIiE9PXRoaXMuX2lucHV0SWR8fCh0aGlzLl9pbnB1dElkPQoiaW5wdXQtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dElucHV0SUQrKyl9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLnNoYWRvd1Jvb3QmJnRoaXMuZmlyZShhLnR5cGUse3NvdXJjZUV2ZW50OmF9LHtub2RlOnRoaXMsYnViYmxlczphLmJ1YmJsZXMsY2FuY2VsYWJsZTphLmNhbmNlbGFibGV9KX0sX2F1dG9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLmF1dG9mb2N1cyYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCl7dmFyIGE9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDthIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmEhPT1kb2N1bWVudC5ib2R5JiZhIT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0aGlzLl9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9fX07UG9seW1lci5QYXBlcklucHV0QmVoYXZpb3I9W1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbF07Cjwvc2NyaXB0PgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogU2hhcmVkIFN0eWxlcyAqLwogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsICdOb3RvJywgc2Fucy1zZXJpZjsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tY29kZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCAnQ29uc29sYXMnLCAnTWVubG8nLCBtb25vc3BhY2U7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWV4cGVuc2l2ZS1rZXJuaW5nOiB7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9OwoKICAgICAgLyogTWF0ZXJpYWwgRm9udCBTdHlsZXMgKi8KCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5NDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDExMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDQ0ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkzOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogNTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAyNmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA2MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiA0NXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDM0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWhlYWRsaW5lOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDEyZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtdGl0bGU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtc3ViaGVhZDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jYXB0aW9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LW1lbnU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYnV0dG9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9wYXBlci1pbnB1dC9wYXBlci1pbnB1dC1hZGRvbi1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJbnB1dEFkZG9uQmVoYXZpb3I9e2F0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJhZGRvbi1hdHRhY2hlZCIpfSx1cGRhdGU6ZnVuY3Rpb24oKXt9fTsKPC9zY3JpcHQ+CgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItaW5wdXQtY2hhci1jb3VudGVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNhcHRpb247CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY2hhci1jb3VudGVyOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmRpcihydGwpKSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4+W1tfY2hhckNvdW50ZXJTdHJdXTwvc3Bhbj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNoYXItY291bnRlciIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfY2hhckNvdW50ZXJTdHI6e3R5cGU6U3RyaW5nLHZhbHVlOiIwIn19LHVwZGF0ZTpmdW5jdGlvbihhKXtpZihhLmlucHV0RWxlbWVudCl7YS52YWx1ZT1hLnZhbHVlfHwiIjt2YXIgYz1hLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoLnRvU3RyaW5nKCk7YS5pbnB1dEVsZW1lbnQuaGFzQXR0cmlidXRlKCJtYXhsZW5ndGgiKSYmKGMrPSIvIithLmlucHV0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1heGxlbmd0aCIpKTt0aGlzLl9jaGFyQ291bnRlclN0cj1jfX19KTsKPC9zY3JpcHQ+CgoKCgoKCgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiB0byBtYWtlIGEgc3RhY2tpbmcgY29udGV4dCAqLwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWNvbnRhaW5lci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pbnB1dC1jb250YWluZXIiLHByb3BlcnRpZXM6e25vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF0dHJGb3JWYWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImJpbmQtdmFsdWUifSxhdXRvVmFsaWRhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saW52YWxpZDp7b2JzZXJ2ZXI6Il9pbnZhbGlkQ2hhbmdlZCIsdHlwZTpCb29sZWFuLHZhbHVlOiExfSxmb2N1c2VkOntyZWFkT25seTohMCx0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxfYWRkb25zOnt0eXBlOkFycmF5fSxfaW5wdXRIYXNDb250ZW50Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbnB1dFNlbGVjdG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiaW5wdXQsaXJvbi1pbnB1dCx0ZXh0YXJlYSwucGFwZXItaW5wdXQtaW5wdXQifSxfYm91bmRPbkZvY3VzOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uRm9jdXMuYmluZCh0aGlzKX19LApfYm91bmRPbkJsdXI6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25CbHVyLmJpbmQodGhpcyl9fSxfYm91bmRPbklucHV0Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKX19LF9ib3VuZFZhbHVlQ2hhbmdlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vblZhbHVlQ2hhbmdlZC5iaW5kKHRoaXMpfX19LGxpc3RlbmVyczp7ImFkZG9uLWF0dGFjaGVkIjoiX29uQWRkb25BdHRhY2hlZCIsImlyb24taW5wdXQtdmFsaWRhdGUiOiJfb25Jcm9uSW5wdXRWYWxpZGF0ZSJ9LGdldCBfdmFsdWVDaGFuZ2VkRXZlbnQoKXtyZXR1cm4gdGhpcy5hdHRyRm9yVmFsdWUrIi1jaGFuZ2VkIn0sZ2V0IF9wcm9wZXJ0eUZvclZhbHVlKCl7cmV0dXJuIFBvbHltZXIuQ2FzZU1hcC5kYXNoVG9DYW1lbENhc2UodGhpcy5hdHRyRm9yVmFsdWUpfSxnZXQgX2lucHV0RWxlbWVudCgpe3JldHVybiBQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKHRoaXMuX2lucHV0U2VsZWN0b3IpfSwKZ2V0IF9pbnB1dEVsZW1lbnRWYWx1ZSgpe3JldHVybiB0aGlzLl9pbnB1dEVsZW1lbnRbdGhpcy5fcHJvcGVydHlGb3JWYWx1ZV18fHRoaXMuX2lucHV0RWxlbWVudC52YWx1ZX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlPSEwO3RoaXMuX2FkZG9uc3x8KHRoaXMuX2FkZG9ucz1bXSk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fYm91bmRPbkZvY3VzLCEwKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kT25CbHVyLCEwKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmF0dHJGb3JWYWx1ZT90aGlzLl9pbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl92YWx1ZUNoYW5nZWRFdmVudCx0aGlzLl9ib3VuZFZhbHVlQ2hhbmdlZCk6dGhpcy5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsdGhpcy5fb25JbnB1dCk7dGhpcy5faW5wdXRFbGVtZW50VmFsdWUmJiIiIT10aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZT8KdGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50KTp0aGlzLl9oYW5kbGVWYWx1ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKGEpe3RoaXMuX2FkZG9uc3x8KHRoaXMuX2FkZG9ucz1bXSk7YT1hLnRhcmdldDstMT09PXRoaXMuX2FkZG9ucy5pbmRleE9mKGEpJiYodGhpcy5fYWRkb25zLnB1c2goYSksdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9oYW5kbGVWYWx1ZSh0aGlzLl9pbnB1dEVsZW1lbnQpKX0sX29uRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCEwKX0sX29uQmx1cjpmdW5jdGlvbigpe3RoaXMuX3NldEZvY3VzZWQoITEpO3RoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudCl9LF9vbklucHV0OmZ1bmN0aW9uKGEpe3RoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKGEudGFyZ2V0KX0sX29uVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3ZhciBjPQphLnRhcmdldDtpZih0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlJiYodGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMSx2b2lkIDA9PT1jLnZhbHVlfHwiIj09PWMudmFsdWUpKXJldHVybjt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZShhLnRhcmdldCl9LF9oYW5kbGVWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZTtjfHwwPT09Y3x8Im51bWJlciI9PT1hLnR5cGUmJiFhLmNoZWNrVmFsaWRpdHkoKT90aGlzLl9pbnB1dEhhc0NvbnRlbnQ9ITA6dGhpcy5faW5wdXRIYXNDb250ZW50PSExO3RoaXMudXBkYXRlQWRkb25zKHtpbnB1dEVsZW1lbnQ6YSx2YWx1ZTpjLGludmFsaWQ6dGhpcy5pbnZhbGlkfSl9LF9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZTpmdW5jdGlvbihhKXt0aGlzLmF1dG9WYWxpZGF0ZSYmYSYmKHRoaXMuaW52YWxpZD0hKGEudmFsaWRhdGU/YS52YWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZSk6YS5jaGVja1ZhbGlkaXR5KCkpKTsKdGhpcy5faGFuZGxlVmFsdWUoYSl9LF9vbklyb25JbnB1dFZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5pbnZhbGlkPXRoaXMuX2lucHV0RWxlbWVudC5pbnZhbGlkfSxfaW52YWxpZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hZGRvbnMmJnRoaXMudXBkYXRlQWRkb25zKHtpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSx1cGRhdGVBZGRvbnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQ9MDtjPXRoaXMuX2FkZG9uc1tkXTtkKyspYy51cGRhdGUoYSl9LF9jb21wdXRlSW5wdXRDb250ZW50Q2xhc3M6ZnVuY3Rpb24oYSxjLGQsZixnKXt2YXIgbD0iaW5wdXQtY29udGVudCI7YT8oZyYmKGwrPSIgbGFiZWwtaXMtaGlkZGVuIiksZiYmKGwrPSIgaXMtaW52YWxpZCIpKTooYT10aGlzLnF1ZXJ5U2VsZWN0b3IoImxhYmVsIiksY3x8Zz8obCs9IiBsYWJlbC1pcy1mbG9hdGluZyIsdGhpcy4kLmxhYmVsQW5kSW5wdXRDb250YWluZXIuc3R5bGUucG9zaXRpb249InN0YXRpYyIsZj9sKz0iIGlzLWludmFsaWQiOgpkJiYobCs9IiBsYWJlbC1pcy1oaWdobGlnaHRlZCIpKTooYSYmKHRoaXMuJC5sYWJlbEFuZElucHV0Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLGYmJihsKz0iIGlzLWludmFsaWQiKSkpO2QmJihsKz0iIGZvY3VzZWQiKTtyZXR1cm4gbH0sX2NvbXB1dGVVbmRlcmxpbmVDbGFzczpmdW5jdGlvbihhLGMpe3ZhciBkPSJ1bmRlcmxpbmUiO2M/ZCs9IiBpcy1pbnZhbGlkIjphJiYoZCs9IiBpcy1oaWdobGlnaHRlZCIpO3JldHVybiBkfSxfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9ImFkZC1vbi1jb250ZW50IjtjP2QrPSIgaXMtaW52YWxpZCI6YSYmKGQrPSIgaXMtaGlnaGxpZ2h0ZWQiKTtyZXR1cm4gZH19KTsKPC9zY3JpcHQ+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWVycm9yIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1lcnJvcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH07CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtZXJyb3IuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtZXJyb3IiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7aW52YWxpZDp7cmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbn19LHVwZGF0ZTpmdW5jdGlvbihhKXt0aGlzLl9zZXRJbnZhbGlkKGEuaW52YWxpZCl9fSk7Cjwvc2NyaXB0PgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QoW2ZvY3VzZWRdKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGlucHV0IHsKICAgICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgfQoKICAgICAgLyogSW4gMS54LCB0aGUgPGlucHV0PiBpcyBkaXN0cmlidXRlZCB0byBwYXBlci1pbnB1dC1jb250YWluZXIsIHdoaWNoIHN0eWxlcyBpdC4KICAgICAgSW4gMi54IHRoZSA8aXJvbi1pbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMKICAgICAgaXQsIGJ1dCBpbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrIGNvcnJlY3RseSwgd2UgbmVlZCB0byByZXNldCBzb21lCiAgICAgIG9mIHRoZSBuYXRpdmUgaW5wdXQncyBwcm9wZXJ0aWVzIHRvIGluaGVyaXQgKGZyb20gdGhlIGlyb24taW5wdXQpICovCiAgICAgIGlyb24taW5wdXQgPiBpbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBmb250LXdlaWdodDogaW5oZXJpdDsKICAgICAgICBmb250LXNpemU6IGluaGVyaXQ7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IGluaGVyaXQ7CiAgICAgICAgd29yZC1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0OwogICAgICAgIHRleHQtc2hhZG93OiBpbmhlcml0OwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIGN1cnNvcjogaW5oZXJpdDsKICAgICAgfQoKICAgICAgaW5wdXQ6ZGlzYWJsZWQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24sCiAgICAgIGlucHV0Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtd2Via2l0LXNwaW5uZXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNsZWFyLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1jbGVhcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1jYWxlbmRhci1waWNrZXItaW5kaWNhdG9yOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgfQoKICAgICAgaW5wdXQ6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtY2xlYXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1tcy1jbGVhcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi1tcy1yZXZlYWwgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1tcy1yZXZlYWw7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgaWQ9ImNvbnRhaW5lciIgbm8tbGFiZWwtZmxvYXQ9Iltbbm9MYWJlbEZsb2F0XV0iIGFsd2F5cy1mbG9hdC1sYWJlbD0iW1tfY29tcHV0ZUFsd2F5c0Zsb2F0TGFiZWwoYWx3YXlzRmxvYXRMYWJlbCxwbGFjZWhvbGRlcildXSIgYXV0by12YWxpZGF0ZSQ9IltbYXV0b1ZhbGlkYXRlXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiBpbnZhbGlkPSJbW2ludmFsaWRdXSI+CgogICAgICA8c2xvdCBuYW1lPSJwcmVmaXgiIHNsb3Q9InByZWZpeCI+PC9zbG90PgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPHNwYW4gaWQ9InRlbXBsYXRlLXBsYWNlaG9sZGVyIj48L3NwYW4+CgogICAgICA8c2xvdCBuYW1lPSJzdWZmaXgiIHNsb3Q9InN1ZmZpeCI+PC9zbG90PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Vycm9yTWVzc2FnZV1dIj4KICAgICAgICA8cGFwZXItaW5wdXQtZXJyb3IgYXJpYS1saXZlPSJhc3NlcnRpdmUiIHNsb3Q9ImFkZC1vbiI+W1tlcnJvck1lc3NhZ2VdXTwvcGFwZXItaW5wdXQtZXJyb3I+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhckNvdW50ZXJdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWNoYXItY291bnRlciBzbG90PSJhZGQtb24iPjwvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyPgogICAgICA8L3RlbXBsYXRlPgoKICAgIDwvcGFwZXItaW5wdXQtY29udGFpbmVyPgogIDwvdGVtcGxhdGU+CgogIAogIDx0ZW1wbGF0ZSBpZD0idjAiPgogICAgPGlucHV0IGlzPSJpcm9uLWlucHV0IiBzbG90PSJpbnB1dCIgY2xhc3M9ImlucHV0LWVsZW1lbnQiIGlkJD0iW1tfaW5wdXRJZF1dIiBhcmlhLWxhYmVsbGVkYnkkPSJbW19hcmlhTGFiZWxsZWRCeV1dIiBhcmlhLWRlc2NyaWJlZGJ5JD0iW1tfYXJpYURlc2NyaWJlZEJ5XV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiB0aXRsZSQ9IltbdGl0bGVdXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgcHJldmVudC1pbnZhbGlkLWlucHV0PSJbW3ByZXZlbnRJbnZhbGlkSW5wdXRdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIHZhbGlkYXRvcj0iW1t2YWxpZGF0b3JdXSIgdHlwZSQ9IltbdHlwZV1dIiBwYXR0ZXJuJD0iW1twYXR0ZXJuXV0iIHJlcXVpcmVkJD0iW1tyZXF1aXJlZF1dIiBhdXRvY29tcGxldGUkPSJbW2F1dG9jb21wbGV0ZV1dIiBhdXRvZm9jdXMkPSJbW2F1dG9mb2N1c11dIiBpbnB1dG1vZGUkPSJbW2lucHV0bW9kZV1dIiBtaW5sZW5ndGgkPSJbW21pbmxlbmd0aF1dIiBtYXhsZW5ndGgkPSJbW21heGxlbmd0aF1dIiBtaW4kPSJbW21pbl1dIiBtYXgkPSJbW21heF1dIiBzdGVwJD0iW1tzdGVwXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBsaXN0JD0iW1tsaXN0XV0iIHNpemUkPSJbW3NpemVdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIGF1dG9jb3JyZWN0JD0iW1thdXRvY29ycmVjdF1dIiBvbi1jaGFuZ2U9Il9vbkNoYW5nZSIgdGFiaW5kZXgkPSJbW3RhYkluZGV4XV0iIGF1dG9zYXZlJD0iW1thdXRvc2F2ZV1dIiByZXN1bHRzJD0iW1tyZXN1bHRzXV0iIGFjY2VwdCQ9IltbYWNjZXB0XV0iIG11bHRpcGxlJD0iW1ttdWx0aXBsZV1dIj4KICA8L3RlbXBsYXRlPgoKICA8dGVtcGxhdGUgaWQ9InYxIj4KICAgIAogICAgPGlyb24taW5wdXQgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBzbG90PSJpbnB1dCIgY2xhc3M9ImlucHV0LWVsZW1lbnQiIGlkJD0iW1tfaW5wdXRJZF1dIiBtYXhsZW5ndGgkPSJbW21heGxlbmd0aF1dIiBhbGxvd2VkLXBhdHRlcm49IltbYWxsb3dlZFBhdHRlcm5dXSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHZhbGlkYXRvcj0iW1t2YWxpZGF0b3JdXSI+CiAgICAgIDxpbnB1dCBhcmlhLWxhYmVsbGVkYnkkPSJbW19hcmlhTGFiZWxsZWRCeV1dIiBhcmlhLWRlc2NyaWJlZGJ5JD0iW1tfYXJpYURlc2NyaWJlZEJ5XV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiB0aXRsZSQ9IltbdGl0bGVdXSIgdHlwZSQ9IltbdHlwZV1dIiBwYXR0ZXJuJD0iW1twYXR0ZXJuXV0iIHJlcXVpcmVkJD0iW1tyZXF1aXJlZF1dIiBhdXRvY29tcGxldGUkPSJbW2F1dG9jb21wbGV0ZV1dIiBhdXRvZm9jdXMkPSJbW2F1dG9mb2N1c11dIiBpbnB1dG1vZGUkPSJbW2lucHV0bW9kZV1dIiBtaW5sZW5ndGgkPSJbW21pbmxlbmd0aF1dIiBtYXhsZW5ndGgkPSJbW21heGxlbmd0aF1dIiBtaW4kPSJbW21pbl1dIiBtYXgkPSJbW21heF1dIiBzdGVwJD0iW1tzdGVwXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBsaXN0JD0iW1tsaXN0XV0iIHNpemUkPSJbW3NpemVdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIGF1dG9jb3JyZWN0JD0iW1thdXRvY29ycmVjdF1dIiBvbi1jaGFuZ2U9Il9vbkNoYW5nZSIgdGFiaW5kZXgkPSJbW3RhYkluZGV4XV0iIGF1dG9zYXZlJD0iW1thdXRvc2F2ZV1dIiByZXN1bHRzJD0iW1tyZXN1bHRzXV0iIGFjY2VwdCQ9IltbYWNjZXB0XV0iIG11bHRpcGxlJD0iW1ttdWx0aXBsZV1dIj4KICAgIDwvaXJvbi1pbnB1dD4KICA8L3RlbXBsYXRlPgoKPC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWlucHV0L3BhcGVyLWlucHV0Lmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0IixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3JdLHByb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOlN0cmluZ319LGJlZm9yZVJlZ2lzdGVyOmZ1bmN0aW9uKCl7dmFyIGE9ImZ1bmN0aW9uIj09dHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24taW5wdXQiKS5faW5pdFNsb3R0ZWRJbnB1dD8idjEiOiJ2MCIsYz1Qb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoInBhcGVyLWlucHV0IiwidGVtcGxhdGUiKTthPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSMiK2EpOyhjPWMuY29udGVudC5xdWVyeVNlbGVjdG9yKCIjdGVtcGxhdGUtcGxhY2Vob2xkZXIiKSkmJmMucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYS5jb250ZW50LGMpfSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5FbGVtZW50P3RoaXMuaW5wdXRFbGVtZW50Ll9pbnB1dEVsZW1lbnQ6CnRoaXMuaW5wdXRFbGVtZW50fSxsaXN0ZW5lcnM6eyJpcm9uLWlucHV0LXJlYWR5IjoiX29uSXJvbklucHV0UmVhZHkifSxfb25Jcm9uSW5wdXRSZWFkeTpmdW5jdGlvbigpe3RoaXMuJC5uYXRpdmVJbnB1dHx8KHRoaXMuJC5uYXRpdmVJbnB1dD10aGlzLiQkKCJpbnB1dCIpKTt0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuJC5uYXRpdmVJbnB1dC50eXBlKSYmKHRoaXMuYWx3YXlzRmxvYXRMYWJlbD0hMCk7dGhpcy5pbnB1dEVsZW1lbnQuYmluZFZhbHVlJiZ0aGlzLiQuY29udGFpbmVyLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLmlucHV0RWxlbWVudCl9fSk7Cjwvc2NyaXB0PgoKCgoKCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1maXQtYmVoYXZpb3IvaXJvbi1maXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25GaXRCZWhhdmlvcj17cHJvcGVydGllczp7c2l6aW5nVGFyZ2V0Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0sZml0SW50bzp7dHlwZTpPYmplY3QsdmFsdWU6d2luZG93fSxub092ZXJsYXA6e3R5cGU6Qm9vbGVhbn0scG9zaXRpb25UYXJnZXQ6e3R5cGU6RWxlbWVudH0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZ30sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmd9LGR5bmFtaWNBbGlnbjp7dHlwZTpCb29sZWFufSxob3Jpem9udGFsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sdmVydGljYWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxhdXRvRml0T25BdHRhY2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2ZpdEluZm86e3R5cGU6T2JqZWN0fX0sZ2V0IF9maXRXaWR0aCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVyV2lkdGg6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRofSwKZ2V0IF9maXRIZWlnaHQoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93P3RoaXMuZml0SW50by5pbm5lckhlaWdodDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSxnZXQgX2ZpdExlZnQoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9LGdldCBfZml0VG9wKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz8wOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3B9LGdldCBfZGVmYXVsdFBvc2l0aW9uVGFyZ2V0KCl7dmFyIGE9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTthJiZhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiYoYT1hLmhvc3QpO3JldHVybiBhfSxnZXQgX2xvY2FsZUhvcml6b250YWxBbGlnbigpe2lmKHRoaXMuX2lzUlRMKXtpZigicmlnaHQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24pcmV0dXJuImxlZnQiOwppZigibGVmdCI9PT10aGlzLmhvcml6b250YWxBbGlnbilyZXR1cm4icmlnaHQifXJldHVybiB0aGlzLmhvcml6b250YWxBbGlnbn0sZ2V0IF9fc2hvdWxkUG9zaXRpb24oKXtyZXR1cm4odGhpcy5ob3Jpem9udGFsQWxpZ258fHRoaXMudmVydGljYWxBbGlnbikmJnRoaXMucG9zaXRpb25UYXJnZXR9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7InVuZGVmaW5lZCI9PT10eXBlb2YgdGhpcy5faXNSVEwmJih0aGlzLl9pc1JUTD0icnRsIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9uKTt0aGlzLnBvc2l0aW9uVGFyZ2V0PXRoaXMucG9zaXRpb25UYXJnZXR8fHRoaXMuX2RlZmF1bHRQb3NpdGlvblRhcmdldDt0aGlzLmF1dG9GaXRPbkF0dGFjaCYmKCJub25lIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpc3BsYXk/c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZml0KCl9LmJpbmQodGhpcykpOih3aW5kb3cuU2hhZHlET00mJlNoYWR5RE9NLmZsdXNoKCksCnRoaXMuZml0KCkpKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fZGVmZXJyZWRGaXQmJihjbGVhclRpbWVvdXQodGhpcy5fX2RlZmVycmVkRml0KSx0aGlzLl9fZGVmZXJyZWRGaXQ9bnVsbCl9LGZpdDpmdW5jdGlvbigpe3RoaXMucG9zaXRpb24oKTt0aGlzLmNvbnN0cmFpbigpO3RoaXMuY2VudGVyKCl9LF9kaXNjb3ZlckluZm86ZnVuY3Rpb24oKXtpZighdGhpcy5fZml0SW5mbyl7dmFyIGE9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksYz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnNpemluZ1RhcmdldCk7dGhpcy5fZml0SW5mbz17aW5saW5lU3R5bGU6e3RvcDp0aGlzLnN0eWxlLnRvcHx8IiIsbGVmdDp0aGlzLnN0eWxlLmxlZnR8fCIiLHBvc2l0aW9uOnRoaXMuc3R5bGUucG9zaXRpb258fCIifSxzaXplcklubGluZVN0eWxlOnttYXhXaWR0aDp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aHx8IiIsbWF4SGVpZ2h0OnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heEhlaWdodHx8CiIiLGJveFNpemluZzp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmd8fCIifSxwb3NpdGlvbmVkQnk6e3ZlcnRpY2FsbHk6ImF1dG8iIT09YS50b3A/InRvcCI6ImF1dG8iIT09YS5ib3R0b20/ImJvdHRvbSI6bnVsbCxob3Jpem9udGFsbHk6ImF1dG8iIT09YS5sZWZ0PyJsZWZ0IjoiYXV0byIhPT1hLnJpZ2h0PyJyaWdodCI6bnVsbH0sc2l6ZWRCeTp7aGVpZ2h0OiJub25lIiE9PWMubWF4SGVpZ2h0LHdpZHRoOiJub25lIiE9PWMubWF4V2lkdGgsbWluV2lkdGg6cGFyc2VJbnQoYy5taW5XaWR0aCwxMCl8fDAsbWluSGVpZ2h0OnBhcnNlSW50KGMubWluSGVpZ2h0LDEwKXx8MH0sbWFyZ2luOnt0b3A6cGFyc2VJbnQoYS5tYXJnaW5Ub3AsMTApfHwwLHJpZ2h0OnBhcnNlSW50KGEubWFyZ2luUmlnaHQsMTApfHwwLGJvdHRvbTpwYXJzZUludChhLm1hcmdpbkJvdHRvbSwxMCl8fDAsbGVmdDpwYXJzZUludChhLm1hcmdpbkxlZnQsMTApfHwwfX19fSxyZXNldEZpdDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLl9maXRJbmZvfHx7fSxjO2ZvcihjIGluIGEuc2l6ZXJJbmxpbmVTdHlsZSl0aGlzLnNpemluZ1RhcmdldC5zdHlsZVtjXT1hLnNpemVySW5saW5lU3R5bGVbY107Zm9yKGMgaW4gYS5pbmxpbmVTdHlsZSl0aGlzLnN0eWxlW2NdPWEuaW5saW5lU3R5bGVbY107dGhpcy5fZml0SW5mbz1udWxsfSxyZWZpdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbExlZnQsYz10aGlzLnNpemluZ1RhcmdldC5zY3JvbGxUb3A7dGhpcy5yZXNldEZpdCgpO3RoaXMuZml0KCk7dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdD1hO3RoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcD1jfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCI7dGhpcy5zdHlsZS5sZWZ0PSIwcHgiOwp0aGlzLnN0eWxlLnRvcD0iMHB4Ijt2YXIgYT10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMucG9zaXRpb25UYXJnZXQpLGQ9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byksZj10aGlzLl9maXRJbmZvLm1hcmdpbixnPXRoaXMuX19nZXRQb3NpdGlvbih0aGlzLl9sb2NhbGVIb3Jpem9udGFsQWxpZ24sdGhpcy52ZXJ0aWNhbEFsaWduLHt3aWR0aDphLndpZHRoK2YubGVmdCtmLnJpZ2h0LGhlaWdodDphLmhlaWdodCtmLnRvcCtmLmJvdHRvbX0sYSxjLGQpO2M9Zy5sZWZ0K2YubGVmdDtnPWcudG9wK2YudG9wO3ZhciBsPU1hdGgubWluKGQucmlnaHQtZi5yaWdodCxjK2Eud2lkdGgpLGs9TWF0aC5taW4oZC5ib3R0b20tZi5ib3R0b20sZythLmhlaWdodCk7Yz1NYXRoLm1heChkLmxlZnQrZi5sZWZ0LE1hdGgubWluKGMsbC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluV2lkdGgpKTtnPU1hdGgubWF4KGQudG9wKwpmLnRvcCxNYXRoLm1pbihnLGstdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbkhlaWdodCkpO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRoPU1hdGgubWF4KGwtYyx0aGlzLl9maXRJbmZvLnNpemVkQnkubWluV2lkdGgpKyJweCI7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0PU1hdGgubWF4KGstZyx0aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSsicHgiO3RoaXMuc3R5bGUubGVmdD1jLWEubGVmdCsicHgiO3RoaXMuc3R5bGUudG9wPWctYS50b3ArInB4In19LGNvbnN0cmFpbjpmdW5jdGlvbigpe2lmKCF0aGlzLl9fc2hvdWxkUG9zaXRpb24pe3RoaXMuX2Rpc2NvdmVySW5mbygpO3ZhciBhPXRoaXMuX2ZpdEluZm87YS5wb3NpdGlvbmVkQnkudmVydGljYWxseXx8KHRoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIix0aGlzLnN0eWxlLnRvcD0iMHB4Iik7YS5wb3NpdGlvbmVkQnkuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLAp0aGlzLnN0eWxlLmxlZnQ9IjBweCIpO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCI7dmFyIGM9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTthLnNpemVkQnkuaGVpZ2h0fHx0aGlzLl9fc2l6ZURpbWVuc2lvbihjLGEucG9zaXRpb25lZEJ5LnZlcnRpY2FsbHksInRvcCIsImJvdHRvbSIsIkhlaWdodCIpO2Euc2l6ZWRCeS53aWR0aHx8dGhpcy5fX3NpemVEaW1lbnNpb24oYyxhLnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHksImxlZnQiLCJyaWdodCIsIldpZHRoIil9fSxfc2l6ZURpbWVuc2lvbjpmdW5jdGlvbihhLGMsZCxmLGcpe3RoaXMuX19zaXplRGltZW5zaW9uKGEsYyxkLGYsZyl9LF9fc2l6ZURpbWVuc2lvbjpmdW5jdGlvbihhLGMsZCxmLGcpe3ZhciBsPXRoaXMuX2ZpdEluZm8saz10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKTtrPSJXaWR0aCI9PT1nP2sud2lkdGg6ay5oZWlnaHQ7Yz1jPT09Zjt2YXIgbT0KIm9mZnNldCIrZzt0aGlzLnNpemluZ1RhcmdldC5zdHlsZVsibWF4IitnXT1rLWwubWFyZ2luW2M/ZDpmXS0oYz9rLWFbZl06YVtkXSktKHRoaXNbbV0tdGhpcy5zaXppbmdUYXJnZXRbbV0pKyJweCJ9LGNlbnRlcjpmdW5jdGlvbigpe2lmKCF0aGlzLl9fc2hvdWxkUG9zaXRpb24pe3RoaXMuX2Rpc2NvdmVySW5mbygpO3ZhciBhPXRoaXMuX2ZpdEluZm8ucG9zaXRpb25lZEJ5O2lmKCFhLnZlcnRpY2FsbHl8fCFhLmhvcml6b250YWxseSl7dGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO2EudmVydGljYWxseXx8KHRoaXMuc3R5bGUudG9wPSIwcHgiKTthLmhvcml6b250YWxseXx8KHRoaXMuc3R5bGUubGVmdD0iMHB4Iik7dmFyIGM9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2EudmVydGljYWxseXx8KHRoaXMuc3R5bGUudG9wPWQudG9wLWMudG9wKyhkLmhlaWdodC1jLmhlaWdodCkvMisicHgiKTthLmhvcml6b250YWxseXx8Cih0aGlzLnN0eWxlLmxlZnQ9ZC5sZWZ0LWMubGVmdCsoZC53aWR0aC1jLndpZHRoKS8yKyJweCIpfX19LF9fZ2V0Tm9ybWFsaXplZFJlY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGE9PT13aW5kb3c/e3RvcDowLGxlZnQ6MCx3aWR0aDp3aW5kb3cuaW5uZXJXaWR0aCxoZWlnaHQ6d2luZG93LmlubmVySGVpZ2h0LHJpZ2h0OndpbmRvdy5pbm5lcldpZHRoLGJvdHRvbTp3aW5kb3cuaW5uZXJIZWlnaHR9OmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9LF9fZ2V0T2Zmc2NyZWVuQXJlYTpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIE1hdGguYWJzKE1hdGgubWluKDAsYS50b3ApK01hdGgubWluKDAsZC5ib3R0b20tKGEudG9wK2MuaGVpZ2h0KSkpKmMud2lkdGgrTWF0aC5hYnMoTWF0aC5taW4oMCxhLmxlZnQpK01hdGgubWluKDAsZC5yaWdodC0oYS5sZWZ0K2Mud2lkdGgpKSkqYy5oZWlnaHR9LF9fZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSxjLApkLGYsZyxsKXt2YXIgaz1be3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6Zy50b3ArdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmcubGVmdCt0aGlzLmhvcml6b250YWxPZmZzZXR9LHt2ZXJ0aWNhbEFsaWduOiJ0b3AiLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDpnLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6Zy5yaWdodC1kLndpZHRoLXRoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6Zy5ib3R0b20tZC5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmcubGVmdCt0aGlzLmhvcml6b250YWxPZmZzZXR9LHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDpnLmJvdHRvbS1kLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6Zy5yaWdodC1kLndpZHRoLXRoaXMuaG9yaXpvbnRhbE9mZnNldH1dOwppZih0aGlzLm5vT3ZlcmxhcCl7Zm9yKHZhciBtPTAscD1rLmxlbmd0aDttPHA7bSsrKXt2YXIgcT17fSxyO2ZvcihyIGluIGtbbV0pcVtyXT1rW21dW3JdO2sucHVzaChxKX1rWzBdLnRvcD1rWzFdLnRvcCs9Zy5oZWlnaHQ7a1syXS50b3A9a1szXS50b3AtPWcuaGVpZ2h0O2tbNF0ubGVmdD1rWzZdLmxlZnQrPWcud2lkdGg7a1s1XS5sZWZ0PWtbN10ubGVmdC09Zy53aWR0aH1jPSJhdXRvIj09PWM/bnVsbDpjO2E9ImF1dG8iPT09YT9udWxsOmE7YSYmImNlbnRlciIhPT1hfHwoay5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJ0b3AiLGhvcml6b250YWxBbGlnbjoiY2VudGVyIix0b3A6Zy50b3ArdGhpcy52ZXJ0aWNhbE9mZnNldCsodGhpcy5ub092ZXJsYXA/Zy5oZWlnaHQ6MCksbGVmdDpnLmxlZnQtZi53aWR0aC8yK2cud2lkdGgvMit0aGlzLmhvcml6b250YWxPZmZzZXR9KSxrLnB1c2goe3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDpnLmJvdHRvbS0KZC5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldC0odGhpcy5ub092ZXJsYXA/Zy5oZWlnaHQ6MCksbGVmdDpnLmxlZnQtZi53aWR0aC8yK2cud2lkdGgvMit0aGlzLmhvcml6b250YWxPZmZzZXR9KSk7YyYmIm1pZGRsZSIhPT1jfHwoay5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoibGVmdCIsdG9wOmcudG9wLWYuaGVpZ2h0LzIrZy5oZWlnaHQvMit0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6Zy5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldCsodGhpcy5ub092ZXJsYXA/Zy53aWR0aDowKX0pLGsucHVzaCh7dmVydGljYWxBbGlnbjoibWlkZGxlIixob3Jpem9udGFsQWxpZ246InJpZ2h0Iix0b3A6Zy50b3AtZi5oZWlnaHQvMitnLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpnLnJpZ2h0LWQud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9nLndpZHRoOjApfSkpOyJtaWRkbGUiPT09YyYmImNlbnRlciI9PT0KYSYmay5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoiY2VudGVyIix0b3A6Zy50b3AtZi5oZWlnaHQvMitnLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpnLmxlZnQtZi53aWR0aC8yK2cud2lkdGgvMit0aGlzLmhvcml6b250YWxPZmZzZXR9KTtmb3IobT0wO208ay5sZW5ndGg7bSsrKXtmPWtbbV07Zz1mLnZlcnRpY2FsQWxpZ249PT1jO3A9Zi5ob3Jpem9udGFsQWxpZ249PT1hO2lmKCF0aGlzLmR5bmFtaWNBbGlnbiYmIXRoaXMubm9PdmVybGFwJiZnJiZwKXt2YXIgdD1mO2JyZWFrfXE9KCFjfHxnKSYmKCFhfHxwKTtpZih0aGlzLmR5bmFtaWNBbGlnbnx8cSl7Zi5vZmZzY3JlZW5BcmVhPXRoaXMuX19nZXRPZmZzY3JlZW5BcmVhKGYsZCxsKTtpZigwPT09Zi5vZmZzY3JlZW5BcmVhJiZxKXt0PWY7YnJlYWt9dD10fHxmO3E9Zi5vZmZzY3JlZW5BcmVhLXQub2Zmc2NyZWVuQXJlYTtpZigwPnF8fDA9PT1xJiYoZ3x8cCkpdD1mfX1yZXR1cm4gdH19Owo8L3NjcmlwdD4KCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tcmVzaXphYmxlLWJlaGF2aW9yL2lyb24tcmVzaXphYmxlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e19wYXJlbnRSZXNpemFibGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfcGFyZW50UmVzaXphYmxlQ2hhbmdlZCJ9LF9ub3RpZnlpbmdEZXNjZW5kYW50Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxsaXN0ZW5lcnM6eyJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiOiJfb25Jcm9uUmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMifSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXM9W107dGhpcy5fYm91bmROb3RpZnlSZXNpemU9dGhpcy5ub3RpZnlSZXNpemUuYmluZCh0aGlzKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9yZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3BhcmVudFJlc2l6YWJsZT90aGlzLl9wYXJlbnRSZXNpemFibGUuc3RvcFJlc2l6ZU5vdGlmaWNhdGlvbnNGb3IodGhpcyk6d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsCnRoaXMuX2JvdW5kTm90aWZ5UmVzaXplKTt0aGlzLl9wYXJlbnRSZXNpemFibGU9bnVsbH0sbm90aWZ5UmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzLnJlc2l6ZXJTaG91bGROb3RpZnkoYSkmJnRoaXMuX25vdGlmeURlc2NlbmRhbnQoYSl9LHRoaXMpLHRoaXMuX2ZpcmVSZXNpemUoKSl9LGFzc2lnblBhcmVudFJlc2l6YWJsZTpmdW5jdGlvbihhKXt0aGlzLl9wYXJlbnRSZXNpemFibGU9YX0sc3RvcFJlc2l6ZU5vdGlmaWNhdGlvbnNGb3I6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMuaW5kZXhPZihhKTstMTxjJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMuc3BsaWNlKGMsMSksdGhpcy51bmxpc3RlbihhLCJpcm9uLXJlc2l6ZSIsIl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplIikpfSxyZXNpemVyU2hvdWxkTm90aWZ5OmZ1bmN0aW9uKCl7cmV0dXJuITB9LApfb25EZXNjZW5kYW50SXJvblJlc2l6ZTpmdW5jdGlvbihhKXt0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50P2Euc3RvcFByb3BhZ2F0aW9uKCk6UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3d8fHRoaXMuX2ZpcmVSZXNpemUoKX0sX2ZpcmVSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImlyb24tcmVzaXplIixudWxsLHtub2RlOnRoaXMsYnViYmxlczohMX0pfSxfb25Jcm9uUmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnM6ZnVuY3Rpb24oYSl7dmFyIGM9UG9seW1lci5kb20oYSkucm9vdFRhcmdldDtjIT09dGhpcyYmKC0xPT09dGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMuaW5kZXhPZihjKSYmKHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLnB1c2goYyksdGhpcy5saXN0ZW4oYywiaXJvbi1yZXNpemUiLCJfb25EZXNjZW5kYW50SXJvblJlc2l6ZSIpKSxjLmFzc2lnblBhcmVudFJlc2l6YWJsZSh0aGlzKSx0aGlzLl9ub3RpZnlEZXNjZW5kYW50KGMpLGEuc3RvcFByb3BhZ2F0aW9uKCkpfSwKX3BhcmVudFJlc2l6YWJsZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7YSYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpfSxfbm90aWZ5RGVzY2VuZGFudDpmdW5jdGlvbihhKXt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSEwLGEubm90aWZ5UmVzaXplKCksdGhpcy5fbm90aWZ5aW5nRGVzY2VuZGFudD0hMSl9LF9yZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZClpZigibG9hZGluZyI9PT1kb2N1bWVudC5yZWFkeVN0YXRlKXt2YXIgYT10aGlzLl9yZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucy5iaW5kKHRoaXMpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uIGQoKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixkKTthKCl9KX1lbHNlIHRoaXMuZmlyZSgiaXJvbi1yZXF1ZXN0LXJlc2l6ZS1ub3RpZmljYXRpb25zIiwKbnVsbCx7bm9kZTp0aGlzLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pLHRoaXMuX3BhcmVudFJlc2l6YWJsZXx8KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX2JvdW5kTm90aWZ5UmVzaXplKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX19Owo8L3NjcmlwdD4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLW92ZXJsYXktYmFja2Ryb3AiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1iYWNrZ3JvdW5kLWNvbG9yLCAjMDAwKTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yczsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1pcm9uLW92ZXJsYXktYmFja2Ryb3A7CiAgICAgIH0KCiAgICAgIDpob3N0KC5vcGVuZWQpIHsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3Atb3BhY2l0eSwgMC42KTsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICBAYXBwbHkgLS1pcm9uLW92ZXJsYXktYmFja2Ryb3Atb3BlbmVkOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKPC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLW92ZXJsYXktYmFja2Ryb3AuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiaXJvbi1vdmVybGF5LWJhY2tkcm9wIixwcm9wZXJ0aWVzOntvcGVuZWQ6e3JlZmxlY3RUb0F0dHJpYnV0ZTohMCx0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIn19LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX29uVHJhbnNpdGlvbmVuZCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fb3BlbmVkUmFmPW51bGx9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuX29wZW5lZENoYW5nZWQodGhpcy5vcGVuZWQpfSxwcmVwYXJlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJiF0aGlzLnBhcmVudE5vZGUmJlBvbHltZXIuZG9tKGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHRoaXMpfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITB9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITF9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWR8fHRoaXMucGFyZW50Tm9kZSE9PQpkb2N1bWVudC5ib2R5fHxQb2x5bWVyLmRvbSh0aGlzLnBhcmVudE5vZGUpLnJlbW92ZUNoaWxkKHRoaXMpfSxfb25UcmFuc2l0aW9uZW5kOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0PT09dGhpcyYmdGhpcy5jb21wbGV0ZSgpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihhKXthP3RoaXMucHJlcGFyZSgpOihhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLCIwcyIhPT1hLnRyYW5zaXRpb25EdXJhdGlvbiYmMCE9YS5vcGFjaXR5fHx0aGlzLmNvbXBsZXRlKCkpO3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX19vcGVuZWRSYWYmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fX29wZW5lZFJhZiksdGhpcy5fX29wZW5lZFJhZj1udWxsKSx0aGlzLnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcCx0aGlzLl9fb3BlbmVkUmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0aGlzLl9fb3BlbmVkUmFmPW51bGw7dGhpcy50b2dnbGVDbGFzcygib3BlbmVkIiwKdGhpcy5vcGVuZWQpfS5iaW5kKHRoaXMpKSl9fSl9KSgpOwo8L3NjcmlwdD4KCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1tYW5hZ2VyLmh0bWwuanMKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcz1mdW5jdGlvbigpe3RoaXMuX292ZXJsYXlzPVtdO3RoaXMuX21pbmltdW1aPTEwMTt0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9bnVsbDtQb2x5bWVyLkdlc3R1cmVzLmFkZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsInRhcCIsZnVuY3Rpb24oKXt9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfTsKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3MsZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3RoaXMuX2JhY2tkcm9wRWxlbWVudHx8KHRoaXMuX2JhY2tkcm9wRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLW92ZXJsYXktYmFja2Ryb3AiKSk7cmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudH0sZ2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIGE9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDthJiYhMSE9PWEgaW5zdGFuY2VvZiBFbGVtZW50fHwoYT1kb2N1bWVudC5ib2R5KTtmb3IoO2Eucm9vdCYmUG9seW1lci5kb20oYS5yb290KS5hY3RpdmVFbGVtZW50OylhPVBvbHltZXIuZG9tKGEucm9vdCkuYWN0aXZlRWxlbWVudDtyZXR1cm4gYX0sX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX292ZXJsYXlzW2FdO2lmKGMpe3ZhciBkPQp0aGlzLl9vdmVybGF5cy5sZW5ndGgtMSxmPXRoaXMuX292ZXJsYXlzW2RdO2YmJnRoaXMuX3Nob3VsZEJlQmVoaW5kT3ZlcmxheShjLGYpJiZkLS07aWYoIShhPj1kKSl7Zj1NYXRoLm1heCh0aGlzLmN1cnJlbnRPdmVybGF5WigpLHRoaXMuX21pbmltdW1aKTtmb3IodGhpcy5fZ2V0WihjKTw9ZiYmdGhpcy5fYXBwbHlPdmVybGF5WihjLGYpO2E8ZDspdGhpcy5fb3ZlcmxheXNbYV09dGhpcy5fb3ZlcmxheXNbYSsxXSxhKys7dGhpcy5fb3ZlcmxheXNbZF09Y319fSxhZGRPclJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYSl7YS5vcGVuZWQ/dGhpcy5hZGRPdmVybGF5KGEpOnRoaXMucmVtb3ZlT3ZlcmxheShhKX0sYWRkT3ZlcmxheTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9vdmVybGF5cy5pbmRleE9mKGEpO2lmKDA8PWMpdGhpcy5fYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQoYyk7ZWxzZXtjPXRoaXMuX292ZXJsYXlzLmxlbmd0aDt2YXIgZD10aGlzLl9vdmVybGF5c1tjLTFdLGY9Ck1hdGgubWF4KHRoaXMuX2dldFooZCksdGhpcy5fbWluaW11bVopLGc9dGhpcy5fZ2V0WihhKTtkJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoYSxkKSYmKHRoaXMuX2FwcGx5T3ZlcmxheVooZCxmKSxjLS0sZj1NYXRoLm1heCh0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlzW2MtMV0pLHRoaXMuX21pbmltdW1aKSk7Zzw9ZiYmdGhpcy5fYXBwbHlPdmVybGF5WihhLGYpO3RoaXMuX292ZXJsYXlzLnNwbGljZShjLDAsYSl9dGhpcy50cmFja0JhY2tkcm9wKCl9LHJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYSl7YT10aGlzLl9vdmVybGF5cy5pbmRleE9mKGEpOy0xIT09YSYmKHRoaXMuX292ZXJsYXlzLnNwbGljZShhLDEpLHRoaXMudHJhY2tCYWNrZHJvcCgpKX0sY3VycmVudE92ZXJsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdGhpcy5fb3ZlcmxheXMubGVuZ3RoLTFdfSxjdXJyZW50T3ZlcmxheVo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLmN1cnJlbnRPdmVybGF5KCkpfSwKZW5zdXJlTWluaW11bVo6ZnVuY3Rpb24oYSl7dGhpcy5fbWluaW11bVo9TWF0aC5tYXgodGhpcy5fbWluaW11bVosYSl9LGZvY3VzT3ZlcmxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VycmVudE92ZXJsYXkoKTthJiZhLl9hcHBseUZvY3VzKCl9LHRyYWNrQmFja2Ryb3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCk7aWYoYXx8dGhpcy5fYmFja2Ryb3BFbGVtZW50KXRoaXMuYmFja2Ryb3BFbGVtZW50LnN0eWxlLnpJbmRleD10aGlzLl9nZXRaKGEpLTEsdGhpcy5iYWNrZHJvcEVsZW1lbnQub3BlbmVkPSEhYSx0aGlzLmJhY2tkcm9wRWxlbWVudC5wcmVwYXJlKCl9LGdldEJhY2tkcm9wczpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxjPTA7Yzx0aGlzLl9vdmVybGF5cy5sZW5ndGg7YysrKXRoaXMuX292ZXJsYXlzW2NdLndpdGhCYWNrZHJvcCYmYS5wdXNoKHRoaXMuX292ZXJsYXlzW2NdKTtyZXR1cm4gYX0sYmFja2Ryb3BaOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpKS0KMX0sX292ZXJsYXlXaXRoQmFja2Ryb3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fb3ZlcmxheXMubGVuZ3RoLTE7MDw9YTthLS0paWYodGhpcy5fb3ZlcmxheXNbYV0ud2l0aEJhY2tkcm9wKXJldHVybiB0aGlzLl9vdmVybGF5c1thXX0sX2dldFo6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fbWluaW11bVo7YSYmKGE9TnVtYmVyKGEuc3R5bGUuekluZGV4fHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS56SW5kZXgpLGE9PT1hJiYoYz1hKSk7cmV0dXJuIGN9LF9zZXRaOmZ1bmN0aW9uKGEsYyl7YS5zdHlsZS56SW5kZXg9Y30sX2FwcGx5T3ZlcmxheVo6ZnVuY3Rpb24oYSxjKXt0aGlzLl9zZXRaKGEsYysyKX0sX292ZXJsYXlJblBhdGg6ZnVuY3Rpb24oYSl7YT1hfHxbXTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZihhW2NdLl9tYW5hZ2VyPT09dGhpcylyZXR1cm4gYVtjXX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0KMTtpZigtMSE9PWMpZm9yKHZhciBkPVBvbHltZXIuZG9tKGEpLnBhdGgsZjsoZj10aGlzLl9vdmVybGF5c1tjXSkmJnRoaXMuX292ZXJsYXlJblBhdGgoZCkhPT1mOylpZihmLl9vbkNhcHR1cmVDbGljayhhKSxmLmFsbG93Q2xpY2tUaHJvdWdoKWMtLTtlbHNlIGJyZWFrfSxfb25DYXB0dXJlRm9jdXM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2MmJmMuX29uQ2FwdHVyZUZvY3VzKGEpfSxfb25DYXB0dXJlS2V5RG93bjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmN1cnJlbnRPdmVybGF5KCk7YyYmKFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3Iua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGEsImVzYyIpP2MuX29uQ2FwdHVyZUVzYyhhKTpQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhhLCJ0YWIiKSYmYy5fb25DYXB0dXJlVGFiKGEpKX0sX3Nob3VsZEJlQmVoaW5kT3ZlcmxheTpmdW5jdGlvbihhLGMpe3JldHVybiFhLmFsd2F5c09uVG9wJiYKYy5hbHdheXNPblRvcH19O1BvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyPW5ldyBQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzOwo8L3NjcmlwdD4KCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLXNjcm9sbC1tYW5hZ2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGE9MCxjPTAsZD1udWxsLGY9W10sZz1bIndoZWVsIiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSJdO1BvbHltZXIuSXJvblNjcm9sbE1hbmFnZXI9e2dldCBjdXJyZW50TG9ja2luZ0VsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbG9ja2luZ0VsZW1lbnRzW3RoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgtMV19LGVsZW1lbnRJc1Njcm9sbExvY2tlZDpmdW5jdGlvbihsKXt2YXIgaz10aGlzLmN1cnJlbnRMb2NraW5nRWxlbWVudDtpZih2b2lkIDA9PT1rKXJldHVybiExO2lmKHRoaXMuX2hhc0NhY2hlZExvY2tlZEVsZW1lbnQobCkpcmV0dXJuITA7aWYodGhpcy5faGFzQ2FjaGVkVW5sb2NrZWRFbGVtZW50KGwpKXJldHVybiExOyhrPSEhayYmayE9PWwmJiF0aGlzLl9jb21wb3NlZFRyZWVDb250YWlucyhrLGwpKT90aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUucHVzaChsKTp0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5wdXNoKGwpOwpyZXR1cm4ga30scHVzaFNjcm9sbExvY2s6ZnVuY3Rpb24obCl7MDw9dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmluZGV4T2YobCl8fCgwPT09dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCYmdGhpcy5fbG9ja1Njcm9sbEludGVyYWN0aW9ucygpLHRoaXMuX2xvY2tpbmdFbGVtZW50cy5wdXNoKGwpLHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZT1bXSx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZT1bXSl9LHJlbW92ZVNjcm9sbExvY2s6ZnVuY3Rpb24obCl7bD10aGlzLl9sb2NraW5nRWxlbWVudHMuaW5kZXhPZihsKTstMSE9PWwmJih0aGlzLl9sb2NraW5nRWxlbWVudHMuc3BsaWNlKGwsMSksdGhpcy5fbG9ja2VkRWxlbWVudENhY2hlPVtdLHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlPVtdLDA9PT10aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl91bmxvY2tTY3JvbGxJbnRlcmFjdGlvbnMoKSl9LF9sb2NraW5nRWxlbWVudHM6W10sX2xvY2tlZEVsZW1lbnRDYWNoZTpudWxsLApfdW5sb2NrZWRFbGVtZW50Q2FjaGU6bnVsbCxfaGFzQ2FjaGVkTG9ja2VkRWxlbWVudDpmdW5jdGlvbihsKXtyZXR1cm4tMTx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUuaW5kZXhPZihsKX0sX2hhc0NhY2hlZFVubG9ja2VkRWxlbWVudDpmdW5jdGlvbihsKXtyZXR1cm4tMTx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5pbmRleE9mKGwpfSxfY29tcG9zZWRUcmVlQ29udGFpbnM6ZnVuY3Rpb24obCxrKXt2YXIgbSxwO2lmKGwuY29udGFpbnMoaykpcmV0dXJuITA7bD1Qb2x5bWVyLmRvbShsKS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50LHNsb3QiKTtmb3IobT0wO208bC5sZW5ndGg7KyttKXt2YXIgcT1Qb2x5bWVyLmRvbShsW21dKS5nZXREaXN0cmlidXRlZE5vZGVzKCk7Zm9yKHA9MDtwPHEubGVuZ3RoOysrcClpZihxW3BdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuX2NvbXBvc2VkVHJlZUNvbnRhaW5zKHFbcF0saykpcmV0dXJuITB9cmV0dXJuITF9LF9zY3JvbGxJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24obCl7bC5jYW5jZWxhYmxlJiYKdGhpcy5fc2hvdWxkUHJldmVudFNjcm9sbGluZyhsKSYmbC5wcmV2ZW50RGVmYXVsdCgpO2wudGFyZ2V0VG91Y2hlcyYmKGw9bC50YXJnZXRUb3VjaGVzWzBdLGE9bC5wYWdlWCxjPWwucGFnZVkpfSxfbG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fHRoaXMuX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlci5iaW5kKHRoaXMpO2Zvcih2YXIgbD0wLGs9Zy5sZW5ndGg7bDxrO2wrKylkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGdbbF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sX3VubG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe2Zvcih2YXIgbD0wLGs9Zy5sZW5ndGg7bDxrO2wrKylkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGdbbF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sCl9zaG91bGRQcmV2ZW50U2Nyb2xsaW5nOmZ1bmN0aW9uKGwpe3ZhciBrPVBvbHltZXIuZG9tKGwpLnJvb3RUYXJnZXQ7InRvdWNobW92ZSIhPT1sLnR5cGUmJmQhPT1rJiYoZD1rLGY9dGhpcy5fZ2V0U2Nyb2xsYWJsZU5vZGVzKFBvbHltZXIuZG9tKGwpLnBhdGgpKTtpZighZi5sZW5ndGgpcmV0dXJuITA7aWYoInRvdWNoc3RhcnQiPT09bC50eXBlKXJldHVybiExO2w9dGhpcy5fZ2V0U2Nyb2xsSW5mbyhsKTtyZXR1cm4hdGhpcy5fZ2V0U2Nyb2xsaW5nTm9kZShmLGwuZGVsdGFYLGwuZGVsdGFZKX0sX2dldFNjcm9sbGFibGVOb2RlczpmdW5jdGlvbihsKXtmb3IodmFyIGs9W10sbT1sLmluZGV4T2YodGhpcy5jdXJyZW50TG9ja2luZ0VsZW1lbnQpLHA9MDtwPD1tO3ArKylpZihsW3BdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBxPWxbcF0scj1xLnN0eWxlOyJzY3JvbGwiIT09ci5vdmVyZmxvdyYmImF1dG8iIT09ci5vdmVyZmxvdyYmKHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUocSkpOwoic2Nyb2xsIiE9PXIub3ZlcmZsb3cmJiJhdXRvIiE9PXIub3ZlcmZsb3d8fGsucHVzaChxKX1yZXR1cm4ga30sX2dldFNjcm9sbGluZ05vZGU6ZnVuY3Rpb24obCxrLG0pe2lmKGt8fG0pZm9yKHZhciBwPU1hdGguYWJzKG0pPj1NYXRoLmFicyhrKSxxPTA7cTxsLmxlbmd0aDtxKyspe3ZhciByPWxbcV07aWYocD8wPm0/MDxyLnNjcm9sbFRvcDpyLnNjcm9sbFRvcDxyLnNjcm9sbEhlaWdodC1yLmNsaWVudEhlaWdodDowPms/MDxyLnNjcm9sbExlZnQ6ci5zY3JvbGxMZWZ0PHIuc2Nyb2xsV2lkdGgtci5jbGllbnRXaWR0aClyZXR1cm4gcn19LF9nZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKGwpe3ZhciBrPXtkZWx0YVg6bC5kZWx0YVgsZGVsdGFZOmwuZGVsdGFZfTsiZGVsdGFYImluIGx8fCgid2hlZWxEZWx0YVgiaW4gbCYmIndoZWVsRGVsdGFZImluIGw/KGsuZGVsdGFYPS1sLndoZWVsRGVsdGFYLGsuZGVsdGFZPS1sLndoZWVsRGVsdGFZKToid2hlZWxEZWx0YSJpbiBsPyhrLmRlbHRhWD0KMCxrLmRlbHRhWT0tbC53aGVlbERlbHRhKToiYXhpcyJpbiBsPyhrLmRlbHRhWD0xPT09bC5heGlzP2wuZGV0YWlsOjAsay5kZWx0YVk9Mj09PWwuYXhpcz9sLmRldGFpbDowKTpsLnRhcmdldFRvdWNoZXMmJihsPWwudGFyZ2V0VG91Y2hlc1swXSxrLmRlbHRhWD1hLWwucGFnZVgsay5kZWx0YVk9Yy1sLnBhZ2VZKSk7cmV0dXJuIGt9fX0pKCk7Cjwvc2NyaXB0PgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tZm9jdXNhYmxlcy1oZWxwZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT1FbGVtZW50LnByb3RvdHlwZSxjPWEubWF0Y2hlc3x8YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1BvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXI9e2dldFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZCl7dmFyIGY9W107cmV0dXJuIHRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKGQsZik/dGhpcy5fc29ydEJ5VGFiSW5kZXgoZik6Zn0saXNGb2N1c2FibGU6ZnVuY3Rpb24oZCl7cmV0dXJuIGMuY2FsbChkLCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBvYmplY3QiKT9jLmNhbGwoZCwiOm5vdChbZGlzYWJsZWRdKSIpOmMuY2FsbChkLCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpZnJhbWUsIFt0YWJpbmRleF0sIFtjb250ZW50RWRpdGFibGVdIil9LGlzVGFiYmFibGU6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuaXNGb2N1c2FibGUoZCkmJgpjLmNhbGwoZCwnOm5vdChbdGFiaW5kZXhceDNkIi0xIl0pJykmJnRoaXMuX2lzVmlzaWJsZShkKX0sX25vcm1hbGl6ZWRUYWJJbmRleDpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZShkKT8oZD1kLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8MCxOdW1iZXIoZCkpOi0xfSxfY29sbGVjdFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZCxmKXtpZihkLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREV8fCF0aGlzLl9pc1Zpc2libGUoZCkpcmV0dXJuITE7dmFyIGc9dGhpcy5fbm9ybWFsaXplZFRhYkluZGV4KGQpLGw9MDxnOzA8PWcmJmYucHVzaChkKTtkPSJjb250ZW50Ij09PWQubG9jYWxOYW1lfHwic2xvdCI9PT1kLmxvY2FsTmFtZT9Qb2x5bWVyLmRvbShkKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6UG9seW1lci5kb20oZC5yb290fHxkKS5jaGlsZHJlbjtmb3IoZz0wO2c8ZC5sZW5ndGg7ZysrKWw9dGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoZFtnXSxmKXx8bDsKcmV0dXJuIGx9LF9pc1Zpc2libGU6ZnVuY3Rpb24oZCl7dmFyIGY9ZC5zdHlsZTtyZXR1cm4iaGlkZGVuIiE9PWYudmlzaWJpbGl0eSYmIm5vbmUiIT09Zi5kaXNwbGF5PyhmPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGQpLCJoaWRkZW4iIT09Zi52aXNpYmlsaXR5JiYibm9uZSIhPT1mLmRpc3BsYXkpOiExfSxfc29ydEJ5VGFiSW5kZXg6ZnVuY3Rpb24oZCl7dmFyIGY9ZC5sZW5ndGg7aWYoMj5mKXJldHVybiBkO3ZhciBnPU1hdGguY2VpbChmLzIpO2Y9dGhpcy5fc29ydEJ5VGFiSW5kZXgoZC5zbGljZSgwLGcpKTtkPXRoaXMuX3NvcnRCeVRhYkluZGV4KGQuc2xpY2UoZykpO3JldHVybiB0aGlzLl9tZXJnZVNvcnRCeVRhYkluZGV4KGYsZCl9LF9tZXJnZVNvcnRCeVRhYkluZGV4OmZ1bmN0aW9uKGQsZil7Zm9yKHZhciBnPVtdOzA8ZC5sZW5ndGgmJjA8Zi5sZW5ndGg7KXRoaXMuX2hhc0xvd2VyVGFiT3JkZXIoZFswXSxmWzBdKT9nLnB1c2goZi5zaGlmdCgpKTpnLnB1c2goZC5zaGlmdCgpKTsKcmV0dXJuIGcuY29uY2F0KGQsZil9LF9oYXNMb3dlclRhYk9yZGVyOmZ1bmN0aW9uKGQsZil7ZD1NYXRoLm1heChkLnRhYkluZGV4LDApO2Y9TWF0aC5tYXgoZi50YWJJbmRleCwwKTtyZXR1cm4gMD09PWR8fDA9PT1mP2Y+ZDpkPmZ9fX0pKCk7Cjwvc2NyaXB0PgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLW92ZXJsYXktYmVoYXZpb3IvaXJvbi1vdmVybGF5LWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7b3BlbmVkOntvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGNhbmNlbGVkOntvYnNlcnZlcjoiX2NhbmNlbGVkQ2hhbmdlZCIscmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExfSx3aXRoQmFja2Ryb3A6e29ic2VydmVyOiJfd2l0aEJhY2tkcm9wQ2hhbmdlZCIsdHlwZTpCb29sZWFufSxub0F1dG9Gb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uRXNjS2V5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2luZ1JlYXNvbjp7dHlwZTpPYmplY3R9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dDbGlja1Rocm91Z2g6e3R5cGU6Qm9vbGVhbn0sYWx3YXlzT25Ub3A6e3R5cGU6Qm9vbGVhbn0sCnNjcm9sbEFjdGlvbjp7dHlwZTpTdHJpbmd9LF9tYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTpQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlcn0sX2ZvY3VzZWRDaGlsZDp7dHlwZTpPYmplY3R9fSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6Il9vbklyb25SZXNpemUifSxvYnNlcnZlcnM6WyJfX3VwZGF0ZVNjcm9sbE9ic2VydmVycyhpc0F0dGFjaGVkLCBvcGVuZWQsIHNjcm9sbEFjdGlvbikiXSxnZXQgYmFja2Ryb3BFbGVtZW50KCl7cmV0dXJuIHRoaXMuX21hbmFnZXIuYmFja2Ryb3BFbGVtZW50fSxnZXQgX2ZvY3VzTm9kZSgpe3JldHVybiB0aGlzLl9mb2N1c2VkQ2hpbGR8fFBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IoIlthdXRvZm9jdXNdIil8fHRoaXN9LGdldCBfZm9jdXNhYmxlTm9kZXMoKXtyZXR1cm4gUG9seW1lci5Jcm9uRm9jdXNhYmxlc0hlbHBlci5nZXRUYWJiYWJsZU5vZGVzKHRoaXMpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0KdGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGw7dGhpcy5fX3JhZnM9e307dGhpcy5fX3Njcm9sbFRvcD10aGlzLl9fc2Nyb2xsTGVmdD10aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT1udWxsO3RoaXMuX19vbkNhcHR1cmVTY3JvbGw9dGhpcy5fX29uQ2FwdHVyZVNjcm9sbC5iaW5kKHRoaXMpO3RoaXMuX19yb290Tm9kZXM9bnVsbDt0aGlzLl9lbnN1cmVTZXR1cCgpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiZ0aGlzLl9vcGVuZWRDaGFuZ2VkKHRoaXMub3BlbmVkKTt0aGlzLl9vYnNlcnZlcj1Qb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXModGhpcy5fb25Ob2Rlc0NoYW5nZSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpO3RoaXMuX29ic2VydmVyPW51bGw7Zm9yKHZhciBhIGluIHRoaXMuX19yYWZzKW51bGwhPT0KdGhpcy5fX3JhZnNbYV0mJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX19yYWZzW2FdKTt0aGlzLl9fcmFmcz17fTt0aGlzLl9tYW5hZ2VyLnJlbW92ZU92ZXJsYXkodGhpcyk7dGhpcy5fX2lzQW5pbWF0aW5nJiYodGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6KHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKSkpfSx0b2dnbGU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9IXRoaXMub3BlbmVkfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSEwfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hMX0sY2FuY2VsOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNhbmNlbGVkIixhLHtjYW5jZWxhYmxlOiEwfSkuZGVmYXVsdFByZXZlbnRlZHx8KHRoaXMuX3NldENhbmNlbGVkKCEwKSx0aGlzLm9wZW5lZD0KITEpfSxpbnZhbGlkYXRlVGFiYmFibGVzOmZ1bmN0aW9uKCl7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9bnVsbH0sX2Vuc3VyZVNldHVwOmZ1bmN0aW9uKCl7dGhpcy5fb3ZlcmxheVNldHVwfHwodGhpcy5fb3ZlcmxheVNldHVwPSEwLHRoaXMuc3R5bGUub3V0bGluZT0ibm9uZSIsdGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIil9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGEpe2E/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIik6dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpO3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX19pc0FuaW1hdGluZz0hMCx0aGlzLl9fZGVyYWYoIl9fb3BlbmVkQ2hhbmdlZCIsdGhpcy5fX29wZW5lZENoYW5nZWQpKX0sX2NhbmNlbGVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuY2xvc2luZ1JlYXNvbj10aGlzLmNsb3NpbmdSZWFzb258fHt9O3RoaXMuY2xvc2luZ1JlYXNvbi5jYW5jZWxlZD0KdGhpcy5jYW5jZWxlZH0sX3dpdGhCYWNrZHJvcENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLndpdGhCYWNrZHJvcCYmIXRoaXMuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpPyh0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMCk6dGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4JiYodGhpcy5yZW1vdmVBdHRyaWJ1dGUoInRhYmluZGV4IiksdGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4PSExKTt0aGlzLm9wZW5lZCYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9tYW5hZ2VyLnRyYWNrQmFja2Ryb3AoKX0sX3ByZXBhcmVSZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50O3RoaXMuX3ByZXBhcmVQb3NpdGlvbmluZygpO3RoaXMucmVmaXQoKTt0aGlzLl9maW5pc2hQb3NpdGlvbmluZygpO3RoaXMubm9BdXRvRm9jdXMmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT0KdGhpcy5fZm9jdXNOb2RlJiYodGhpcy5fZm9jdXNOb2RlLmJsdXIoKSx0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZS5mb2N1cygpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpfSxfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF9maW5pc2hSZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLm5vdGlmeVJlc2l6ZSgpO3RoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1vcGVuZWQiKX0sX2ZpbmlzaFJlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5zdHlsZS56SW5kZXg9IiI7dGhpcy5ub3RpZnlSZXNpemUoKTt0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktY2xvc2VkIix0aGlzLmNsb3NpbmdSZWFzb24pfSxfcHJlcGFyZVBvc2l0aW9uaW5nOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS50cmFuc2l0aW9uPQp0aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249Im5vbmUiO3RoaXMuc3R5bGUudHJhbnNmb3JtPXRoaXMuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJub25lIjt0aGlzLnN0eWxlLmRpc3BsYXk9IiJ9LF9maW5pc2hQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3A7dGhpcy5zdHlsZS50cmFuc2l0aW9uPXRoaXMuc3R5bGUud2Via2l0VHJhbnNpdGlvbj0iIjt0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0iIjt0aGlzLnN0eWxlLmRpc3BsYXk9IiI7dGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3B9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7aWYodGhpcy5vcGVuZWQpdGhpcy5ub0F1dG9Gb2N1c3x8dGhpcy5fZm9jdXNOb2RlLmZvY3VzKCk7ZWxzZXt0aGlzLl9mb2N1c05vZGUuYmx1cigpO3RoaXMuX2ZvY3VzZWRDaGlsZD1udWxsO2lmKHRoaXMucmVzdG9yZUZvY3VzT25DbG9zZSYmCnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlKXt2YXIgYT10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50OyhhPT09ZG9jdW1lbnQuYm9keXx8UG9seW1lci5kb20odGhpcykuZGVlcENvbnRhaW5zKGEpKSYmdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKX10aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT1udWxsOyhhPXRoaXMuX21hbmFnZXIuY3VycmVudE92ZXJsYXkoKSkmJnRoaXMhPT1hJiZhLl9hcHBseUZvY3VzKCl9fSxfb25DYXB0dXJlQ2xpY2s6ZnVuY3Rpb24oYSl7dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrfHx0aGlzLmNhbmNlbChhKX0sX29uQ2FwdHVyZUZvY3VzOmZ1bmN0aW9uKGEpe2lmKHRoaXMud2l0aEJhY2tkcm9wKXt2YXIgYz1Qb2x5bWVyLmRvbShhKS5wYXRoOy0xPT09Yy5pbmRleE9mKHRoaXMpPyhhLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX2FwcGx5Rm9jdXMoKSk6dGhpcy5fZm9jdXNlZENoaWxkPWNbMF19fSxfb25DYXB0dXJlRXNjOmZ1bmN0aW9uKGEpe3RoaXMubm9DYW5jZWxPbkVzY0tleXx8CnRoaXMuY2FuY2VsKGEpfSxfb25DYXB0dXJlVGFiOmZ1bmN0aW9uKGEpe2lmKHRoaXMud2l0aEJhY2tkcm9wKXt0aGlzLl9fZW5zdXJlRmlyc3RMYXN0Rm9jdXNhYmxlcygpO3ZhciBjPWEuc2hpZnRLZXksZD1jP3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlO2M9Yz90aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZTtpZihkPT09YylkPSEwO2Vsc2V7dmFyIGY9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDtkPWY9PT1kfHxmPT09dGhpc31kJiYoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzZWRDaGlsZD1jLHRoaXMuX2FwcGx5Rm9jdXMoKSl9fSxfb25Jcm9uUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJiF0aGlzLl9faXNBbmltYXRpbmcmJnRoaXMuX19kZXJhZigicmVmaXQiLHRoaXMucmVmaXQpfSxfb25Ob2Rlc0NoYW5nZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiYKKHRoaXMuaW52YWxpZGF0ZVRhYmJhYmxlcygpLHRoaXMubm90aWZ5UmVzaXplKCkpfSxfX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXM6ZnVuY3Rpb24oKXtpZighdGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZXx8IXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZSl7dmFyIGE9dGhpcy5fZm9jdXNhYmxlTm9kZXM7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT1hWzBdO3RoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1hW2EubGVuZ3RoLTFdfX0sX19vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/KHRoaXMuX3ByZXBhcmVSZW5kZXJPcGVuZWQoKSx0aGlzLl9tYW5hZ2VyLmFkZE92ZXJsYXkodGhpcyksdGhpcy5fYXBwbHlGb2N1cygpLHRoaXMuX3JlbmRlck9wZW5lZCgpKToodGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJDbG9zZWQoKSl9LF9fZGVyYWY6ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLl9fcmFmczsKbnVsbCE9PWRbYV0mJmNhbmNlbEFuaW1hdGlvbkZyYW1lKGRbYV0pO2RbYV09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7ZFthXT1udWxsO2MuY2FsbCh0aGlzKX0uYmluZCh0aGlzKSl9LF9fdXBkYXRlU2Nyb2xsT2JzZXJ2ZXJzOmZ1bmN0aW9uKGEsYyxkKXthJiZjJiZ0aGlzLl9faXNWYWxpZFNjcm9sbEFjdGlvbihkKT8oImxvY2siPT09ZCYmKHRoaXMuX19zYXZlU2Nyb2xsUG9zaXRpb24oKSxQb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyLnB1c2hTY3JvbGxMb2NrKHRoaXMpKSx0aGlzLl9fYWRkU2Nyb2xsTGlzdGVuZXJzKCkpOihQb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyLnJlbW92ZVNjcm9sbExvY2sodGhpcyksdGhpcy5fX3JlbW92ZVNjcm9sbExpc3RlbmVycygpKX0sX19hZGRTY3JvbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Jvb3ROb2Rlcyl7dGhpcy5fX3Jvb3ROb2Rlcz1bXTtpZihQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdylmb3IodmFyIGE9CnRoaXM7YTspYS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmYS5ob3N0JiZ0aGlzLl9fcm9vdE5vZGVzLnB1c2goYSksYT1hLmhvc3R8fGEuYXNzaWduZWRTbG90fHxhLnBhcmVudE5vZGU7dGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGRvY3VtZW50KX10aGlzLl9fcm9vdE5vZGVzLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX19vbkNhcHR1cmVTY3JvbGwse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pfSx0aGlzKX0sX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl9fcm9vdE5vZGVzJiZ0aGlzLl9fcm9vdE5vZGVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX19vbkNhcHR1cmVTY3JvbGwse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pfSx0aGlzKTt0aGlzLmlzQXR0YWNoZWR8fCh0aGlzLl9fcm9vdE5vZGVzPW51bGwpfSxfX2lzVmFsaWRTY3JvbGxBY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImxvY2siPT09CmF8fCJyZWZpdCI9PT1hfHwiY2FuY2VsIj09PWF9LF9fb25DYXB0dXJlU2Nyb2xsOmZ1bmN0aW9uKGEpe2lmKCEodGhpcy5fX2lzQW5pbWF0aW5nfHwwPD1Qb2x5bWVyLmRvbShhKS5wYXRoLmluZGV4T2YodGhpcykpKXN3aXRjaCh0aGlzLnNjcm9sbEFjdGlvbil7Y2FzZSAibG9jayI6dGhpcy5fX3Jlc3RvcmVTY3JvbGxQb3NpdGlvbigpO2JyZWFrO2Nhc2UgInJlZml0Ijp0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KTticmVhaztjYXNlICJjYW5jZWwiOnRoaXMuY2FuY2VsKGEpfX0sX19zYXZlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyh0aGlzLl9fc2Nyb2xsVG9wPWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wLHRoaXMuX19zY3JvbGxMZWZ0PWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdCk6KHRoaXMuX19zY3JvbGxUb3A9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwKZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApLHRoaXMuX19zY3JvbGxMZWZ0PU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCkpfSxfX3Jlc3RvcmVTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe2RvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ/KGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wPXRoaXMuX19zY3JvbGxUb3AsZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxMZWZ0PXRoaXMuX19zY3JvbGxMZWZ0KTooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcD1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0PWRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCl9fTtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3I9W1BvbHltZXIuSXJvbkZpdEJlaGF2aW9yLFBvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLApQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsXX0pKCk7Cjwvc2NyaXB0PgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcj17cHJvcGVydGllczp7YW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZW50cnlBbmltYXRpb246e29ic2VydmVyOiJfZW50cnlBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ30sZXhpdEFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9leGl0QW5pbWF0aW9uQ2hhbmdlZCIsdHlwZTpTdHJpbmd9fSxfZW50cnlBbmltYXRpb25DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Db25maWc9dGhpcy5hbmltYXRpb25Db25maWd8fHt9O3RoaXMuYW5pbWF0aW9uQ29uZmlnLmVudHJ5PVt7bmFtZTp0aGlzLmVudHJ5QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfZXhpdEFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e307dGhpcy5hbmltYXRpb25Db25maWcuZXhpdD1be25hbWU6dGhpcy5leGl0QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfY29weVByb3BlcnRpZXM6ZnVuY3Rpb24oYSwKYyl7Zm9yKHZhciBkIGluIGMpYVtkXT1jW2RdfSxfY2xvbmVDb25maWc6ZnVuY3Rpb24oYSl7dmFyIGM9e2lzQ2xvbmU6ITB9O3RoaXMuX2NvcHlQcm9wZXJ0aWVzKGMsYSk7cmV0dXJuIGN9LF9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmU6ZnVuY3Rpb24oYSxjLGQpe2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnKWlmKHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZXt2YXIgZj1hP3RoaXMuYW5pbWF0aW9uQ29uZmlnW2FdOnRoaXMuYW5pbWF0aW9uQ29uZmlnO0FycmF5LmlzQXJyYXkoZil8fChmPVtmXSk7aWYoZilmb3IodmFyIGcsbD0wO2c9CmZbbF07bCsrKWlmKGcuYW5pbWF0YWJsZSlnLmFuaW1hdGFibGUuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShnLnR5cGV8fGEsYyxkKTtlbHNlIGlmKGcuaWQpe3ZhciBrPWNbZy5pZF07az8oay5pc0Nsb25lfHwoY1tnLmlkXT10aGlzLl9jbG9uZUNvbmZpZyhrKSxrPWNbZy5pZF0pLHRoaXMuX2NvcHlQcm9wZXJ0aWVzKGssZykpOmNbZy5pZF09Z31lbHNlIGQucHVzaChnKX19LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbihhKXt2YXIgYz17fSxkPVtdO3RoaXMuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShhLGMsZCk7Zm9yKHZhciBmIGluIGMpZC5wdXNoKGNbZl0pO3JldHVybiBkfX07Cjwvc2NyaXB0PgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGlvbi1ydW5uZXItYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGw9e19jb25maWd1cmVBbmltYXRpb25zOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W107aWYoMDxhLmxlbmd0aClmb3IodmFyIGYsZz0wO2Y9YVtnXTtnKyspe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZi5uYW1lKTtpZihsLmlzTmVvbkFuaW1hdGlvbil7dmFyIGs9bnVsbDtsLmNvbmZpZ3VyZXx8KGwuY29uZmlndXJlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9KTtrPWwuY29uZmlndXJlKGYpO2QucHVzaCh7cmVzdWx0OmssY29uZmlnOmZ9KX1lbHNlIGNvbnNvbGUud2Fybih0aGlzLmlzKyI6IixmLm5hbWUsIm5vdCBmb3VuZCEiKX1mb3IoYT0wO2E8ZC5sZW5ndGg7YSsrKXtrPWRbYV0ucmVzdWx0O2Y9ZFthXS5jb25maWc7dHJ5eyJmdW5jdGlvbiIhPXR5cGVvZiBrLmNhbmNlbCYmKGs9ZG9jdW1lbnQudGltZWxpbmUucGxheShrKSl9Y2F0Y2gobSl7az1udWxsLGNvbnNvbGUud2FybigiQ291bGRudCBwbGF5IiwKIigiLGYubmFtZSwiKS4iLG0pfWsmJmMucHVzaCh7bmVvbkFuaW1hdGlvbjpsLGNvbmZpZzpmLGFuaW1hdGlvbjprfSl9cmV0dXJuIGN9LF9zaG91bGRDb21wbGV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9ITAsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKCJmaW5pc2hlZCIhPWFbZF0uYW5pbWF0aW9uLnBsYXlTdGF0ZSl7Yz0hMTticmVha31yZXR1cm4gY30sX2NvbXBsZXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10ubmVvbkFuaW1hdGlvbi5jb21wbGV0ZShhW2NdLmNvbmZpZyk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLmFuaW1hdGlvbi5jYW5jZWwoKX0scGxheUFuaW1hdGlvbjpmdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMuZ2V0QW5pbWF0aW9uQ29uZmlnKGEpO2lmKGQpe3RoaXMuX2FjdGl2ZT10aGlzLl9hY3RpdmV8fHt9O3RoaXMuX2FjdGl2ZVthXSYmKHRoaXMuX2NvbXBsZXRlKHRoaXMuX2FjdGl2ZVthXSksZGVsZXRlIHRoaXMuX2FjdGl2ZVthXSk7CnZhciBmPXRoaXMuX2NvbmZpZ3VyZUFuaW1hdGlvbnMoZCk7aWYoMD09Zi5sZW5ndGgpdGhpcy5maXJlKCJuZW9uLWFuaW1hdGlvbi1maW5pc2giLGMse2J1YmJsZXM6ITF9KTtlbHNlIGZvcih0aGlzLl9hY3RpdmVbYV09ZixkPTA7ZDxmLmxlbmd0aDtkKyspZltkXS5hbmltYXRpb24ub25maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRDb21wbGV0ZShmKSYmKHRoaXMuX2NvbXBsZXRlKGYpLGRlbGV0ZSB0aGlzLl9hY3RpdmVbYV0sdGhpcy5maXJlKCJuZW9uLWFuaW1hdGlvbi1maW5pc2giLGMse2J1YmJsZXM6ITF9KSl9LmJpbmQodGhpcyl9fSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gdGhpcy5fYWN0aXZlKXt2YXIgYz10aGlzLl9hY3RpdmVbYV0sZDtmb3IoZCBpbiBjKWNbZF0uYW5pbWF0aW9uLmNhbmNlbCgpfXRoaXMuX2FjdGl2ZT17fX19OwpQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcj1bUG9seW1lci5OZW9uQW5pbWF0YWJsZUJlaGF2aW9yLFBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9ySW1wbF07Cjwvc2NyaXB0PgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tZHJvcGRvd24vaXJvbi1kcm9wZG93bi1zY3JvbGwtbWFuYWdlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkRyb3Bkb3duU2Nyb2xsTWFuYWdlcj1Qb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyfSkoKTsKPC9zY3JpcHQ+CgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWRyb3Bkb3duIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgICNjb250ZW50V3JhcHBlciA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIuYW5pbWF0aW5nIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJjb250ZW50V3JhcHBlciI+CiAgICAgIDxzbG90IGlkPSJjb250ZW50IiBuYW1lPSJkcm9wZG93bi1jb250ZW50Ij48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1kcm9wZG93bi9pcm9uLWRyb3Bkb3duLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Imlyb24tZHJvcGRvd24iLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yLFBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sb3BlbkFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3R9LGNsb3NlQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZm9jdXNUYXJnZXQ6e3R5cGU6T2JqZWN0fSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkIn19LApsaXN0ZW5lcnM6eyJuZW9uLWFuaW1hdGlvbi1maW5pc2giOiJfb25OZW9uQW5pbWF0aW9uRmluaXNoIn0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZU92ZXJsYXlQb3NpdGlvbihwb3NpdGlvblRhcmdldCwgdmVydGljYWxBbGlnbiwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbE9mZnNldCwgaG9yaXpvbnRhbE9mZnNldCkiXSxnZXQgY29udGFpbmVkRWxlbWVudCgpe2Zvcih2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzLiQuY29udGVudCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpLGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspaWYoYVtjXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiBhW2NdfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsQWN0aW9ufHwodGhpcy5zY3JvbGxBY3Rpb249dGhpcy5hbGxvd091dHNpZGVTY3JvbGw/InJlZml0IjoibG9jayIpO3RoaXMuX3JlYWRpZWQ9ITB9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zaXppbmdUYXJnZXQmJnRoaXMuc2l6aW5nVGFyZ2V0IT09CnRoaXN8fCh0aGlzLnNpemluZ1RhcmdldD10aGlzLmNvbnRhaW5lZEVsZW1lbnR8fHRoaXMpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuZGlzYWJsZWQ/dGhpcy5jYW5jZWwoKToodGhpcy5jYW5jZWxBbmltYXRpb24oKSx0aGlzLl91cGRhdGVBbmltYXRpb25Db25maWcoKSxQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9vcGVuZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXshdGhpcy5ub0FuaW1hdGlvbnMmJnRoaXMuYW5pbWF0aW9uQ29uZmlnLm9wZW4/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oIm9wZW4iKSk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fcmVuZGVyT3BlbmVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sCl9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXshdGhpcy5ub0FuaW1hdGlvbnMmJnRoaXMuYW5pbWF0aW9uQ29uZmlnLmNsb3NlPyh0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgiYW5pbWF0aW5nIiksdGhpcy5wbGF5QW5pbWF0aW9uKCJjbG9zZSIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJDbG9zZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfb25OZW9uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoImFuaW1hdGluZyIpO3RoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfdXBkYXRlQW5pbWF0aW9uQ29uZmlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuY29udGFpbmVkRWxlbWVudCxjPVtdLmNvbmNhdCh0aGlzLm9wZW5BbmltYXRpb25Db25maWd8fFtdKS5jb25jYXQodGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ3x8CltdKSxkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXS5ub2RlPWE7dGhpcy5hbmltYXRpb25Db25maWc9e29wZW46dGhpcy5vcGVuQW5pbWF0aW9uQ29uZmlnLGNsb3NlOnRoaXMuY2xvc2VBbmltYXRpb25Db25maWd9fSxfdXBkYXRlT3ZlcmxheVBvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLm5vdGlmeVJlc2l6ZSgpfSxfYWxsb3dPdXRzaWRlU2Nyb2xsQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9yZWFkaWVkJiYoYT90aGlzLnNjcm9sbEFjdGlvbiYmImxvY2siIT09dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj0icmVmaXQiKTp0aGlzLnNjcm9sbEFjdGlvbj0ibG9jayIpfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZm9jdXNUYXJnZXR8fHRoaXMuY29udGFpbmVkRWxlbWVudDthJiZ0aGlzLm9wZW5lZCYmIXRoaXMubm9BdXRvRm9jdXM/YS5mb2N1cygpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX2FwcGx5Rm9jdXMuYXBwbHkodGhpcywKYXJndW1lbnRzKX19KX0pKCk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRpb24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcj17cHJvcGVydGllczp7YW5pbWF0aW9uVGltaW5nOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntkdXJhdGlvbjo1MDAsZWFzaW5nOiJjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIixmaWxsOiJib3RoIn19fX0saXNOZW9uQW5pbWF0aW9uOiEwLGNyZWF0ZWQ6ZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmFuaW1hdGV8fGNvbnNvbGUud2FybigiTm8gd2ViIGFuaW1hdGlvbnMgZGV0ZWN0ZWQuIFRoaXMgZWxlbWVudCB3aWxsIG5vdCBmdW5jdGlvbiB3aXRob3V0IGEgd2ViIGFuaW1hdGlvbnMgcG9seWZpbGwuIil9LHRpbWluZ0Zyb21Db25maWc6ZnVuY3Rpb24oYSl7aWYoYS50aW1pbmcpZm9yKHZhciBjIGluIGEudGltaW5nKXRoaXMuYW5pbWF0aW9uVGltaW5nW2NdPWEudGltaW5nW2NdO3JldHVybiB0aGlzLmFuaW1hdGlvblRpbWluZ30sc2V0UHJlZml4ZWRQcm9wZXJ0eTpmdW5jdGlvbihhLGMsZCl7Zm9yKHZhciBmPQp7dHJhbnNmb3JtOlsid2Via2l0VHJhbnNmb3JtIl0sdHJhbnNmb3JtT3JpZ2luOlsibW96VHJhbnNmb3JtT3JpZ2luIiwid2Via2l0VHJhbnNmb3JtT3JpZ2luIl19W2NdLGcsbD0wO2c9ZltsXTtsKyspYS5zdHlsZVtnXT1kO2Euc3R5bGVbY109ZH0sY29tcGxldGU6ZnVuY3Rpb24oKXt9fTsKPC9zY3JpcHQ+CgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vbmVvbi1hbmltYXRpb24vYW5pbWF0aW9ucy9mYWRlLWluLWFuaW1hdGlvbi5odG1sLmpzClBvbHltZXIoe2lzOiJmYWRlLWluLWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGEubm9kZSxbe29wYWNpdHk6IjAifSx7b3BhY2l0eToiMSJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYSkpfX0pOwo8L3NjcmlwdD4KCgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L25lb24tYW5pbWF0aW9uL2FuaW1hdGlvbnMvZmFkZS1vdXQtYW5pbWF0aW9uLmh0bWwuanMKUG9seW1lcih7aXM6ImZhZGUtb3V0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGEubm9kZSxbe29wYWNpdHk6IjEifSx7b3BhY2l0eToiMCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYSkpfX0pOwo8L3NjcmlwdD4KCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItbWVudS1idXR0b24vcGFwZXItbWVudS1idXR0b24tYW5pbWF0aW9ucy5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGEpe3ZhciBjPWEubm9kZSxkPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGMsW3toZWlnaHQ6ZC8yKyJweCJ9LHtoZWlnaHQ6ZCsicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGEpKX19KTtQb2x5bWVyKHtpczoicGFwZXItbWVudS1ncm93LXdpZHRoLWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGEpe3ZhciBjPWEubm9kZSxkPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoYyxbe3dpZHRoOmQvMisicHgifSx7d2lkdGg6ZCsicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGEpKX19KTsKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGEpe3ZhciBjPWEubm9kZSxkPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoYyxbe3dpZHRoOmQrInB4In0se3dpZHRoOmQtZC8yMCsicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGEpKX19KTsKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtc2hyaW5rLWhlaWdodC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihhKXt2YXIgYz1hLm5vZGUsZD1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDt0aGlzLnNldFByZWZpeGVkUHJvcGVydHkoYywidHJhbnNmb3JtT3JpZ2luIiwiMCAwIik7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoYyxbe2hlaWdodDpkKyJweCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDApIn0se2hlaWdodDpkLzIrInB4Iix0cmFuc2Zvcm06InRyYW5zbGF0ZVkoLTIwcHgpIn1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhhKSl9fSk7Cjwvc2NyaXB0PgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItbWVudS1idXR0b24vcGFwZXItbWVudS1idXR0b24uaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT17QU5JTUFUSU9OX0NVQklDX0JFWklFUjoiY3ViaWMtYmV6aWVyKC4zLC45NSwuNSwxKSIsTUFYX0FOSU1BVElPTl9USU1FX01TOjQwMH07UG9seW1lci5QYXBlck1lbnVCdXR0b249ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5yZWdpc3RlcmVkPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuYWRkT3duS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlbW92ZU93bktleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NvbGxlY3RLZXlCaW5kaW5ncz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9wcmVwS2V5QmluZGluZ3M9CmZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2FkZEtleUJpbmRpbmc9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fcmVzZXRLZXlFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX29uS2V5QmluZGluZ0V2ZW50PWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3RyaWdnZXJLZXlIYW5kbGVyPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2ZvY3VzQmx1ckhhbmRsZXI9ZnVuY3Rpb24oYyl7aWYoUG9seW1lci5FbGVtZW50KXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PQpjLnR5cGUpO2Vsc2UgaWYoYy50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWMudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGQ9UG9seW1lci5kb20oYykubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8dGhpcy5maXJlKGMudHlwZSx7c291cmNlRXZlbnQ6Y30se25vZGU6dGhpcyxidWJibGVzOmMuYnViYmxlcyxjYW5jZWxhYmxlOmMuY2FuY2VsYWJsZX0pfX07UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9jaGFuZ2VkQ29udHJvbFN0YXRlPWZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3NldEZvY3VzZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uPVBvbHltZXIoe2lzOiJwYXBlci1tZW51LWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLApQb2x5bWVyLklyb25Db250cm9sU3RhdGVdLHByb3BlcnRpZXM6e29wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saWdub3JlU2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NlT25BY3RpdmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtaW4tYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoyMDB9fSx7bmFtZToicGFwZXItbWVudS1ncm93LXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246MTUwLGVhc2luZzphLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fSx7bmFtZToicGFwZXItbWVudS1ncm93LWhlaWdodC1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjI3NSxlYXNpbmc6YS5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX1dfX0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLHRpbWluZzp7ZHVyYXRpb246MTUwfX0se25hbWU6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246NTAsZWFzaW5nOmEuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LAp7bmFtZToicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoyMDAsZWFzaW5nOiJlYXNlLWluIn19XX19LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9kcm9wZG93bkNvbnRlbnQ6e3R5cGU6T2JqZWN0fX0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imdyb3VwIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxsaXN0ZW5lcnM6eyJpcm9uLWFjdGl2YXRlIjoiX29uSXJvbkFjdGl2YXRlIiwiaXJvbi1zZWxlY3QiOiJfb25Jcm9uU2VsZWN0In0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBjPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZD0wLGY9Yy5sZW5ndGg7ZDxmO2QrKylpZihjW2RdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGNbZF19LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPwp0aGlzLmNsb3NlKCk6dGhpcy5vcGVuKCl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkfHx0aGlzLiQuZHJvcGRvd24ub3BlbigpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuJC5kcm9wZG93bi5jbG9zZSgpfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmVTZWxlY3R8fHRoaXMuY2xvc2UoKX0sX29uSXJvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZU9uQWN0aXZhdGUmJnRoaXMuY2xvc2UoKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oYyxkKXtjPyh0aGlzLl9kcm9wZG93bkNvbnRlbnQ9dGhpcy5jb250ZW50RWxlbWVudCx0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLW9wZW4iKSk6bnVsbCE9ZCYmdGhpcy5maXJlKCJwYXBlci1kcm9wZG93bi1jbG9zZSIpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGMpe1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZS5fZGlzYWJsZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtjJiZ0aGlzLm9wZW5lZCYmCnRoaXMuY2xvc2UoKX0sX19vbklyb25PdmVybGF5Q2FuY2VsZWQ6ZnVuY3Rpb24oYyl7dmFyIGQ9dGhpcy4kLnRyaWdnZXI7LTE8UG9seW1lci5kb20oYy5kZXRhaWwpLnBhdGguaW5kZXhPZihkKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0pO09iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oYyl7UG9seW1lci5QYXBlck1lbnVCdXR0b25bY109YVtjXX0pfSkoKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLWljb25zZXQtc3ZnL2lyb24taWNvbnNldC1zdmcuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pY29uc2V0LXN2ZyIscHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9uYW1lQ2hhbmdlZCJ9LHNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjI0fSxydGxNaXJyb3Jpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sdXNlR2xvYmFsUnRsQXR0cmlidXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fbWV0YT1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZToiaWNvbnNldCIsa2V5Om51bGwsdmFsdWU6bnVsbH0pfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGdldEljb25OYW1lczpmdW5jdGlvbigpe3RoaXMuX2ljb25zPXRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5faWNvbnMpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5uYW1lKyI6IithfSx0aGlzKX0sYXBwbHlJY29uOmZ1bmN0aW9uKGEsYyl7dGhpcy5yZW1vdmVJY29uKGEpOwppZihjPXRoaXMuX2Nsb25lSWNvbihjLHRoaXMucnRsTWlycm9yaW5nJiZ0aGlzLl90YXJnZXRJc1JUTChhKSkpe3ZhciBkPVBvbHltZXIuZG9tKGEucm9vdHx8YSk7ZC5pbnNlcnRCZWZvcmUoYyxkLmNoaWxkTm9kZXNbMF0pO3JldHVybiBhLl9zdmdJY29uPWN9cmV0dXJuIG51bGx9LHJlbW92ZUljb246ZnVuY3Rpb24oYSl7YS5fc3ZnSWNvbiYmKFBvbHltZXIuZG9tKGEucm9vdHx8YSkucmVtb3ZlQ2hpbGQoYS5fc3ZnSWNvbiksYS5fc3ZnSWNvbj1udWxsKX0sX3RhcmdldElzUlRMOmZ1bmN0aW9uKGEpe251bGw9PXRoaXMuX190YXJnZXRJc1JUTCYmKHRoaXMudXNlR2xvYmFsUnRsQXR0cmlidXRlP3RoaXMuX190YXJnZXRJc1JUTD0icnRsIj09PShkb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZSgiZGlyIik/ZG9jdW1lbnQuYm9keTpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldEF0dHJpYnV0ZSgiZGlyIik6KGEmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmCihhPWEuaG9zdCksdGhpcy5fX3RhcmdldElzUlRMPWEmJiJydGwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkuZGlyZWN0aW9uKSk7cmV0dXJuIHRoaXMuX190YXJnZXRJc1JUTH0sX25hbWVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fbWV0YS52YWx1ZT1udWxsO3RoaXMuX21ldGEua2V5PXRoaXMubmFtZTt0aGlzLl9tZXRhLnZhbHVlPXRoaXM7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgiaXJvbi1pY29uc2V0LWFkZGVkIix0aGlzLHtub2RlOndpbmRvd30pfSl9LF9jcmVhdGVJY29uTWFwOmZ1bmN0aW9uKCl7dmFyIGE9T2JqZWN0LmNyZWF0ZShudWxsKTtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJbaWRdIikuZm9yRWFjaChmdW5jdGlvbihjKXthW2MuaWRdPWN9KTtyZXR1cm4gYX0sX2Nsb25lSWNvbjpmdW5jdGlvbihhLGMpe3RoaXMuX2ljb25zPXRoaXMuX2ljb25zfHx0aGlzLl9jcmVhdGVJY29uTWFwKCk7cmV0dXJuIHRoaXMuX3ByZXBhcmVTdmdDbG9uZSh0aGlzLl9pY29uc1thXSwKdGhpcy5zaXplLGMpfSxfcHJlcGFyZVN2Z0Nsb25lOmZ1bmN0aW9uKGEsYyxkKXtpZihhKXthPWEuY2xvbmVOb2RlKCEwKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIik7Yz1hLmdldEF0dHJpYnV0ZSgidmlld0JveCIpfHwiMCAwICIrYysiICIrYzt2YXIgZz0icG9pbnRlci1ldmVudHM6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyI7ZCYmYS5oYXNBdHRyaWJ1dGUoIm1pcnJvci1pbi1ydGwiKSYmKGcrPSItd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm06c2NhbGUoLTEsMSk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7Iik7Zi5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLGMpO2Yuc2V0QXR0cmlidXRlKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQgbWVldCIpO2Yuc2V0QXR0cmlidXRlKCJmb2N1c2FibGUiLCJmYWxzZSIpO2Yuc3R5bGUuY3NzVGV4dD0KZztmLmFwcGVuZENoaWxkKGEpLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKTtyZXR1cm4gZn1yZXR1cm4gbnVsbH19KTsKPC9zY3JpcHQ+CgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAKICAgIDxzcGFuIHJvbGU9ImJ1dHRvbiI+PC9zcGFuPgogICAgPHBhcGVyLW1lbnUtYnV0dG9uIGlkPSJtZW51QnV0dG9uIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIHZlcnRpY2FsLW9mZnNldD0iW1tfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldChub0xhYmVsRmxvYXQsIHZlcnRpY2FsT2Zmc2V0KV1dIiBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBvbi1pcm9uLXNlbGVjdD0iX29uSXJvblNlbGVjdCIgb24taXJvbi1kZXNlbGVjdD0iX29uSXJvbkRlc2VsZWN0IiBvcGVuZWQ9Int7b3BlbmVkfX0iIGNsb3NlLW9uLWFjdGl2YXRlIGFsbG93LW91dHNpZGUtc2Nyb2xsPSJbW2FsbG93T3V0c2lkZVNjcm9sbF1dIiByZXN0b3JlLWZvY3VzLW9uLWNsb3NlPSJbW3Jlc3RvcmVGb2N1c09uQ2xvc2VdXSI+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIAogICAgICAgIDxwYXBlci1pbnB1dCB0eXBlPSJ0ZXh0IiBpbnZhbGlkPSJbW2ludmFsaWRdXSIgcmVhZG9ubHkgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbdmFsdWVdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJdXSIgZXJyb3ItbWVzc2FnZT0iW1tlcnJvck1lc3NhZ2VdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW2Fsd2F5c0Zsb2F0TGFiZWxdXSIgbm8tbGFiZWwtZmxvYXQ9Iltbbm9MYWJlbEZsb2F0XV0iIGxhYmVsPSJbW2xhYmVsXV0iPgogICAgICAgICAgCiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWRyb3Bkb3duLW1lbnUvcGFwZXItZHJvcGRvd24tbWVudS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJwYXBlci1kcm9wZG93bi1tZW51IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlbGVjdGVkSXRlbUxhYmVsOnt0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxsYWJlbDp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30sZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZ30sb3BlbmVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJyaWdodCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AifSx2ZXJ0aWNhbE9mZnNldDpOdW1iZXIsZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dGFwOiJfb25UYXAifSxrZXlCaW5kaW5nczp7InVwIGRvd24iOiJvcGVuIixlc2M6ImNsb3NlIn0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImNvbWJvYm94IiwiYXJpYS1hdXRvY29tcGxldGUiOiJub25lIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0pIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5jb250ZW50RWxlbWVudDthJiZhLnNlbGVjdGVkSXRlbSYmdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGEuc2VsZWN0ZWRJdGVtKX0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBhPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGFbY119LG9wZW46ZnVuY3Rpb24oKXt0aGlzLiQubWVudUJ1dHRvbi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbihhKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oYS5kZXRhaWwuaXRlbSl9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKX0sX29uVGFwOmZ1bmN0aW9uKGEpe1BvbHltZXIuR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0KGEpPT09dGhpcyYmCnRoaXMub3BlbigpfSxfc2VsZWN0ZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLnZhbHVlPWE9YT9hLmxhYmVsfHxhLmdldEF0dHJpYnV0ZSgibGFiZWwiKXx8YS50ZXh0Q29udGVudC50cmltKCk6IiI7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtTGFiZWwoYSl9LF9jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/YzphPy00Ojh9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5yZXF1aXJlZCYmISF0aGlzLnZhbHVlfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3BlbmVkPyJ0cnVlIjoiZmFsc2UiLGM9dGhpcy5jb250ZW50RWxlbWVudDtjJiZjLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYSl9fSl9KSgpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3Rpb24uaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3Rpb249ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb249W107dGhpcy5zZWxlY3RDYWxsYmFjaz1hfTsKUG9seW1lci5Jcm9uU2VsZWN0aW9uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX0sY2xlYXI6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb24uc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGMpeyghYXx8MD5hLmluZGV4T2YoYykpJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChjLCExKX0sdGhpcyl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8PXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYSl9LHNldEl0ZW1TZWxlY3RlZDpmdW5jdGlvbihhLGMpe2lmKG51bGwhPWEmJmMhPT10aGlzLmlzU2VsZWN0ZWQoYSkpe2lmKGMpdGhpcy5zZWxlY3Rpb24ucHVzaChhKTtlbHNle3ZhciBkPXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYSk7MDw9ZCYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGQsMSl9dGhpcy5zZWxlY3RDYWxsYmFjayYmdGhpcy5zZWxlY3RDYWxsYmFjayhhLGMpfX0sc2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMubXVsdGk/CnRoaXMudG9nZ2xlKGEpOnRoaXMuZ2V0KCkhPT1hJiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQoYSwhMCkpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dGhpcy5zZXRJdGVtU2VsZWN0ZWQoYSwhdGhpcy5pc1NlbGVjdGVkKGEpKX19Owo8L3NjcmlwdD4KCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1zZWxlY3Rvci9pcm9uLXNlbGVjdGFibGUuaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2F0dHJGb3JTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LGFjdGl2YXRlRXZlbnQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJ0YXAiLG9ic2VydmVyOiJfYWN0aXZhdGVFdmVudENoYW5nZWQifSxzZWxlY3RhYmxlOlN0cmluZyxzZWxlY3RlZENsYXNzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXJvbi1zZWxlY3RlZCJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxmYWxsYmFja1NlbGVjdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0saXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfZXhjbHVkZWRMb2NhbE5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0ZW1wbGF0ZToxLAoiZG9tLWJpbmQiOjEsImRvbS1pZiI6MSwiZG9tLXJlcGVhdCI6MX19fX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZChhdHRyRm9yU2VsZWN0ZWQpIiwiX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkKSIsIl9jaGVja0ZhbGxiYWNrKGZhbGxiYWNrU2VsZWN0aW9uKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9iaW5kRmlsdGVySXRlbT10aGlzLl9maWx0ZXJJdGVtLmJpbmQodGhpcyk7dGhpcy5fc2VsZWN0aW9uPW5ldyBQb2x5bWVyLklyb25TZWxlY3Rpb24odGhpcy5fYXBwbHlTZWxlY3Rpb24uYmluZCh0aGlzKSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9dGhpcy5fb2JzZXJ2ZUl0ZW1zKHRoaXMpO3RoaXMuX2FkZExpc3RlbmVyKHRoaXMuYWN0aXZhdGVFdmVudCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJlBvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKTt0aGlzLl9yZW1vdmVMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSwKaW5kZXhPZjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pdGVtcz90aGlzLml0ZW1zLmluZGV4T2YoYSk6LTF9LHNlbGVjdDpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdGVkPWF9LHNlbGVjdFByZXZpb3VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pdGVtcy5sZW5ndGg7YT0oTnVtYmVyKHRoaXMuX3ZhbHVlVG9JbmRleCh0aGlzLnNlbGVjdGVkKSktMSthKSVhO3RoaXMuc2VsZWN0ZWQ9dGhpcy5faW5kZXhUb1ZhbHVlKGEpfSxzZWxlY3ROZXh0OmZ1bmN0aW9uKCl7dmFyIGE9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpKzEpJXRoaXMuaXRlbXMubGVuZ3RoO3RoaXMuc2VsZWN0ZWQ9dGhpcy5faW5kZXhUb1ZhbHVlKGEpfSxzZWxlY3RJbmRleDpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdCh0aGlzLl9pbmRleFRvVmFsdWUoYSkpfSxmb3JjZVN5bmNocm9ub3VzSXRlbVVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuX29ic2VydmVyLmZsdXNoPwp0aGlzLl9vYnNlcnZlci5mbHVzaCgpOnRoaXMuX3VwZGF0ZUl0ZW1zKCl9LGdldCBfc2hvdWxkVXBkYXRlU2VsZWN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuc2VsZWN0ZWR9LF9jaGVja0ZhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sX2FkZExpc3RlbmVyOmZ1bmN0aW9uKGEpe3RoaXMubGlzdGVuKHRoaXMsYSwiX2FjdGl2YXRlSGFuZGxlciIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oYSl7dGhpcy51bmxpc3Rlbih0aGlzLGEsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX2FjdGl2YXRlRXZlbnRDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoYyk7dGhpcy5fYWRkTGlzdGVuZXIoYSl9LF91cGRhdGVJdGVtczpmdW5jdGlvbigpe3ZhciBhPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyh0aGlzLnNlbGVjdGFibGV8fCIqIik7YT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSx0aGlzLl9iaW5kRmlsdGVySXRlbSk7CnRoaXMuX3NldEl0ZW1zKGEpfSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEl0ZW0mJih0aGlzLnNlbGVjdGVkPXRoaXMuX3ZhbHVlRm9ySXRlbSh0aGlzLnNlbGVjdGVkSXRlbSkpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9zZWxlY3RTZWxlY3RlZCh0aGlzLnNlbGVjdGVkKX0sX3NlbGVjdFNlbGVjdGVkOmZ1bmN0aW9uKCl7aWYodGhpcy5pdGVtcyl7dmFyIGE9dGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5zZWxlY3RlZCk7YT90aGlzLl9zZWxlY3Rpb24uc2VsZWN0KGEpOnRoaXMuX3NlbGVjdGlvbi5jbGVhcigpO3RoaXMuZmFsbGJhY2tTZWxlY3Rpb24mJnRoaXMuaXRlbXMubGVuZ3RoJiZ2b2lkIDA9PT10aGlzLl9zZWxlY3Rpb24uZ2V0KCkmJih0aGlzLnNlbGVjdGVkPXRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfX0sX2ZpbHRlckl0ZW06ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuX2V4Y2x1ZGVkTG9jYWxOYW1lc1thLmxvY2FsTmFtZV19LApfdmFsdWVUb0l0ZW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/bnVsbDp0aGlzLml0ZW1zW3RoaXMuX3ZhbHVlVG9JbmRleChhKV19LF92YWx1ZVRvSW5kZXg6ZnVuY3Rpb24oYSl7aWYodGhpcy5hdHRyRm9yU2VsZWN0ZWQpZm9yKHZhciBjPTAsZDtkPXRoaXMuaXRlbXNbY107YysrKXtpZih0aGlzLl92YWx1ZUZvckl0ZW0oZCk9PWEpcmV0dXJuIGN9ZWxzZSByZXR1cm4gTnVtYmVyKGEpfSxfaW5kZXhUb1ZhbHVlOmZ1bmN0aW9uKGEpe2lmKHRoaXMuYXR0ckZvclNlbGVjdGVkKXtpZihhPXRoaXMuaXRlbXNbYV0pcmV0dXJuIHRoaXMuX3ZhbHVlRm9ySXRlbShhKX1lbHNlIHJldHVybiBhfSxfdmFsdWVGb3JJdGVtOmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiBudWxsO2lmKCF0aGlzLmF0dHJGb3JTZWxlY3RlZClyZXR1cm4gYT10aGlzLmluZGV4T2YoYSksLTE9PT1hP251bGw6YTt2YXIgYz1hW1BvbHltZXIuQ2FzZU1hcC5kYXNoVG9DYW1lbENhc2UodGhpcy5hdHRyRm9yU2VsZWN0ZWQpXTsKcmV0dXJuIHZvaWQgMCE9Yz9jOmEuZ2V0QXR0cmlidXRlKHRoaXMuYXR0ckZvclNlbGVjdGVkKX0sX2FwcGx5U2VsZWN0aW9uOmZ1bmN0aW9uKGEsYyl7dGhpcy5zZWxlY3RlZENsYXNzJiZ0aGlzLnRvZ2dsZUNsYXNzKHRoaXMuc2VsZWN0ZWRDbGFzcyxjLGEpO3RoaXMuc2VsZWN0ZWRBdHRyaWJ1dGUmJnRoaXMudG9nZ2xlQXR0cmlidXRlKHRoaXMuc2VsZWN0ZWRBdHRyaWJ1dGUsYyxhKTt0aGlzLl9zZWxlY3Rpb25DaGFuZ2UoKTt0aGlzLmZpcmUoImlyb24tIisoYz8ic2VsZWN0IjoiZGVzZWxlY3QiKSx7aXRlbTphfSl9LF9zZWxlY3Rpb25DaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0odGhpcy5fc2VsZWN0aW9uLmdldCgpKX0sX29ic2VydmVJdGVtczpmdW5jdGlvbihhKXtyZXR1cm4gUG9seW1lci5kb20oYSkub2JzZXJ2ZU5vZGVzKGZ1bmN0aW9uKGMpe3RoaXMuX3VwZGF0ZUl0ZW1zKCk7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKTt0aGlzLmZpcmUoImlyb24taXRlbXMtY2hhbmdlZCIsCmMse2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMX0pfSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oYSl7YT1hLnRhcmdldDtmb3IodmFyIGM9dGhpcy5pdGVtczthJiZhIT10aGlzOyl7dmFyIGQ9Yy5pbmRleE9mKGEpO2lmKDA8PWQpe2M9dGhpcy5faW5kZXhUb1ZhbHVlKGQpO3RoaXMuX2l0ZW1BY3RpdmF0ZShjLGEpO2JyZWFrfWE9YS5wYXJlbnROb2RlfX0sX2l0ZW1BY3RpdmF0ZTpmdW5jdGlvbihhLGMpe3RoaXMuZmlyZSgiaXJvbi1hY3RpdmF0ZSIse3NlbGVjdGVkOmEsaXRlbTpjfSx7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fHRoaXMuc2VsZWN0KGEpfX07Cjwvc2NyaXB0PgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLXNlbGVjdG9yL2lyb24tbXVsdGktc2VsZWN0YWJsZS5odG1sLmpzClBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7bXVsdGk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoibXVsdGlDaGFuZ2VkIn0sc2VsZWN0ZWRWYWx1ZXM6e3R5cGU6QXJyYXksbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxzZWxlY3RlZEl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZFZhbHVlcy5zcGxpY2VzKSJdLHNlbGVjdDpmdW5jdGlvbihhKXt0aGlzLm11bHRpP3RoaXMuX3RvZ2dsZVNlbGVjdGVkKGEpOnRoaXMuc2VsZWN0ZWQ9YX0sbXVsdGlDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuX3NlbGVjdGlvbi5tdWx0aT1hO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LGdldCBfc2hvdWxkVXBkYXRlU2VsZWN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuc2VsZWN0ZWR8fApudWxsIT10aGlzLnNlbGVjdGVkVmFsdWVzJiZ0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aH0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMubXVsdGk/dGhpcy5zZWxlY3RlZEl0ZW1zJiYwPHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGgmJih0aGlzLnNlbGVjdGVkVmFsdWVzPXRoaXMuc2VsZWN0ZWRJdGVtcy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2luZGV4VG9WYWx1ZSh0aGlzLmluZGV4T2YoYSkpfSx0aGlzKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWF9LHRoaXMpKTpQb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3IuX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZC5hcHBseSh0aGlzKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLl9zZWxlY3RNdWx0aSh0aGlzLnNlbGVjdGVkVmFsdWVzKTp0aGlzLl9zZWxlY3RTZWxlY3RlZCh0aGlzLnNlbGVjdGVkKX0sX3NlbGVjdE11bHRpOmZ1bmN0aW9uKGEpe2E9CmF8fFtdO2E9KHRoaXMuX3ZhbHVlc1RvSXRlbXMoYSl8fFtdKS5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIG51bGwhPT1kJiZ2b2lkIDAhPT1kfSk7dGhpcy5fc2VsZWN0aW9uLmNsZWFyKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuX3NlbGVjdGlvbi5zZXRJdGVtU2VsZWN0ZWQoYVtjXSwhMCk7dGhpcy5mYWxsYmFja1NlbGVjdGlvbiYmIXRoaXMuX3NlbGVjdGlvbi5nZXQoKS5sZW5ndGgmJnRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pJiZ0aGlzLnNlbGVjdCh0aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX0sX3NlbGVjdGlvbkNoYW5nZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3NlbGVjdGlvbi5nZXQoKTt0aGlzLm11bHRpPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKGEpLHRoaXMuX3NldFNlbGVjdGVkSXRlbShhLmxlbmd0aD9hWzBdOm51bGwpKTpudWxsIT09YSYmdm9pZCAwIT09YT8odGhpcy5fc2V0U2VsZWN0ZWRJdGVtcyhbYV0pLAp0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oYSkpOih0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFtdKSx0aGlzLl9zZXRTZWxlY3RlZEl0ZW0obnVsbCkpfSxfdG9nZ2xlU2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zZWxlY3RlZFZhbHVlcy5pbmRleE9mKGEpOzA+Yz90aGlzLnB1c2goInNlbGVjdGVkVmFsdWVzIixhKTp0aGlzLnNwbGljZSgic2VsZWN0ZWRWYWx1ZXMiLGMsMSl9LF92YWx1ZXNUb0l0ZW1zOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP251bGw6YS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMuX3ZhbHVlVG9JdGVtKGMpfSx0aGlzKX19O1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yPVtQb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsXTsKPC9zY3JpcHQ+CgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLW1lbnUtYmVoYXZpb3IvaXJvbi1tZW51LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7Zm9jdXNlZEl0ZW06e29ic2VydmVyOiJfZm9jdXNlZEl0ZW1DaGFuZ2VkIixyZWFkT25seTohMCx0eXBlOk9iamVjdH0sYXR0ckZvckl0ZW1UaXRsZTp7dHlwZTpTdHJpbmd9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQifX0sX01PRElGSUVSX0tFWVM6IkFsdCBBbHRHcmFwaCBDYXBzTG9jayBDb250cm9sIEZuIEZuTG9jayBIeXBlciBNZXRhIE51bUxvY2sgT1MgU2Nyb2xsTG9jayBTaGlmdCBTdXBlciBTeW1ib2wgU3ltYm9sTG9jayIuc3BsaXQoIiAiKSxfU0VBUkNIX1JFU0VUX1RJTUVPVVRfTVM6MUUzLF9wcmV2aW91c1RhYkluZGV4OjAsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6Im1lbnUifSxvYnNlcnZlcnM6WyJfdXBkYXRlTXVsdGlzZWxlY3RhYmxlKG11bHRpKSJdLGxpc3RlbmVyczp7Zm9jdXM6Il9vbkZvY3VzIixrZXlkb3duOiJfb25LZXlkb3duIiwKImlyb24taXRlbXMtY2hhbmdlZCI6Il9vbklyb25JdGVtc0NoYW5nZWQifSxrZXlCaW5kaW5nczp7dXA6Il9vblVwS2V5Iixkb3duOiJfb25Eb3duS2V5Iixlc2M6Il9vbkVzY0tleSIsInNoaWZ0K3RhYjprZXlkb3duIjoiX29uU2hpZnRUYWJEb3duIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9yZXNldFRhYmluZGljZXMoKX0sc2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMuX2RlZmF1bHRGb2N1c0FzeW5jJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYyksdGhpcy5fZGVmYXVsdEZvY3VzQXN5bmM9bnVsbCk7dmFyIGM9dGhpcy5fdmFsdWVUb0l0ZW0oYSk7YyYmYy5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fCh0aGlzLl9zZXRGb2N1c2VkSXRlbShjKSxQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGwuc2VsZWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LF9yZXNldFRhYmluZGljZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm11bHRpPwp0aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtc1swXTp0aGlzLnNlbGVjdGVkSXRlbTt0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixjPT09YT8iMCI6Ii0xIil9LHRoaXMpfSxfdXBkYXRlTXVsdGlzZWxlY3RhYmxlOmZ1bmN0aW9uKGEpe2E/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLW11bHRpc2VsZWN0YWJsZSIpfSxfZm9jdXNXaXRoS2V5Ym9hcmRFdmVudDpmdW5jdGlvbihhKXtpZigtMT09PXRoaXMuX01PRElGSUVSX0tFWVMuaW5kZXhPZihhLmtleSkpe3RoaXMuY2FuY2VsRGVib3VuY2VyKCJfY2xlYXJTZWFyY2hUZXh0Iik7dmFyIGM9dGhpcy5fc2VhcmNoVGV4dHx8IiI7Yys9KGEua2V5JiYxPT1hLmtleS5sZW5ndGg/YS5rZXk6U3RyaW5nLmZyb21DaGFyQ29kZShhLmtleUNvZGUpKS50b0xvY2FsZUxvd2VyQ2FzZSgpOwphPWMubGVuZ3RoO2Zvcih2YXIgZD0wLGY7Zj10aGlzLml0ZW1zW2RdO2QrKylpZighZi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpe3ZhciBnPXRoaXMuYXR0ckZvckl0ZW1UaXRsZXx8InRleHRDb250ZW50IjtnPShmW2ddfHxmLmdldEF0dHJpYnV0ZShnKXx8IiIpLnRyaW0oKTtpZighKGcubGVuZ3RoPGEpJiZnLnNsaWNlKDAsYSkudG9Mb2NhbGVMb3dlckNhc2UoKT09Yyl7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZik7YnJlYWt9fXRoaXMuX3NlYXJjaFRleHQ9Yzt0aGlzLmRlYm91bmNlKCJfY2xlYXJTZWFyY2hUZXh0Iix0aGlzLl9jbGVhclNlYXJjaFRleHQsdGhpcy5fU0VBUkNIX1JFU0VUX1RJTUVPVVRfTVMpfX0sX2NsZWFyU2VhcmNoVGV4dDpmdW5jdGlvbigpe3RoaXMuX3NlYXJjaFRleHQ9IiJ9LF9mb2N1c1ByZXZpb3VzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuaXRlbXMubGVuZ3RoLGM9TnVtYmVyKHRoaXMuaW5kZXhPZih0aGlzLmZvY3VzZWRJdGVtKSksZD0xO2Q8CmErMTtkKyspe3ZhciBmPXRoaXMuaXRlbXNbKGMtZCthKSVhXTtpZighZi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpe3ZhciBnPVBvbHltZXIuZG9tKGYpLmdldE93bmVyUm9vdCgpfHxkb2N1bWVudDt0aGlzLl9zZXRGb2N1c2VkSXRlbShmKTtpZihQb2x5bWVyLmRvbShnKS5hY3RpdmVFbGVtZW50PT1mKWJyZWFrfX19LF9mb2N1c05leHQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5pdGVtcy5sZW5ndGgsYz1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxkPTE7ZDxhKzE7ZCsrKXt2YXIgZj10aGlzLml0ZW1zWyhjK2QpJWFdO2lmKCFmLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGc9UG9seW1lci5kb20oZikuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGYpO2lmKFBvbHltZXIuZG9tKGcpLmFjdGl2ZUVsZW1lbnQ9PWYpYnJlYWt9fX0sX2FwcGx5U2VsZWN0aW9uOmZ1bmN0aW9uKGEsYyl7Yz9hLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsCiJ0cnVlIik6YS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiKTtQb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3IuX2FwcGx5U2VsZWN0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX2ZvY3VzZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbihhLGMpe2MmJmMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIik7IWF8fGEuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpfHx0aGlzLmRpc2FibGVkfHwoYS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiMCIpLGEuZm9jdXMoKSl9LF9vbklyb25JdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYSl7YS5kZXRhaWwuYWRkZWROb2Rlcy5sZW5ndGgmJnRoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITA7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0obnVsbCk7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwKIi0xIik7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsYSk7UG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkPSExfSwxKX0sX29uRm9jdXM6ZnVuY3Rpb24oYSl7IVBvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZCYmKGE9UG9seW1lci5kb20oYSkucm9vdFRhcmdldCxhPT09dGhpc3x8InVuZGVmaW5lZCI9PT10eXBlb2YgYS50YWJJbmRleHx8dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChhKSkmJih0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz10aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtc1swXTp0aGlzLnNlbGVjdGVkSXRlbTt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTtjP3RoaXMuX3NldEZvY3VzZWRJdGVtKGMpOnRoaXMuaXRlbXNbMF0mJnRoaXMuX2ZvY3VzTmV4dCgpfSkpfSxfb25VcEtleTpmdW5jdGlvbihhKXt0aGlzLl9mb2N1c1ByZXZpb3VzKCk7CmEuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRG93bktleTpmdW5jdGlvbihhKXt0aGlzLl9mb2N1c05leHQoKTthLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkVzY0tleTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZm9jdXNlZEl0ZW07YSYmYS5ibHVyKCl9LF9vbktleWRvd246ZnVuY3Rpb24oYSl7dGhpcy5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXMoYSwidXAgZG93biBlc2MiKXx8dGhpcy5fZm9jdXNXaXRoS2V5Ym9hcmRFdmVudChhKTthLnN0b3BQcm9wYWdhdGlvbigpfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGEpe1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYWN0aXZhdGVIYW5kbGVyLmNhbGwodGhpcyxhKTthLnN0b3BQcm9wYWdhdGlvbigpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGEpe2E/KHRoaXMuX3ByZXZpb3VzVGFiSW5kZXg9dGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iik/dGhpcy50YWJJbmRleDoKMCx0aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKSk6dGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsdGhpcy5fcHJldmlvdXNUYWJJbmRleCl9fTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITE7UG9seW1lci5Jcm9uTWVudUJlaGF2aW9yPVtQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGxdOwo8L3NjcmlwdD4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbGlzdGJveCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CgogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWxpc3Rib3gtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1saXN0Ym94OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItbGlzdGJveC9wYXBlci1saXN0Ym94Lmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InBhcGVyLWxpc3Rib3giLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToibGlzdGJveCJ9fSl9KSgpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWl0ZW0vcGFwZXItaXRlbS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToib3B0aW9uIix0YWJpbmRleDoiMCJ9fTtQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvckltcGxdOwo8L3NjcmlwdD4KCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0tc2hhcmVkLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgLnBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLW1pbi1oZWlnaHQsIDQ4cHgpOwogICAgICAgIHBhZGRpbmc6IDBweCAxNnB4OwogICAgICB9CgogICAgICAucGFwZXItaXRlbSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwogICAgICAgIGJvcmRlcjpub25lOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pLCAucGFwZXItaXRlbVtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcm9uLXNlbGVjdGVkKSwgLnBhcGVyLWl0ZW0uaXJvbi1zZWxlY3RlZCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQtd2VpZ2h0LCBib2xkKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1zZWxlY3RlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSksIC5wYXBlci1pdGVtW2Rpc2FibGVkXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWl0ZW0tZGlzYWJsZWQtY29sb3IsIHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSwgLnBhcGVyLWl0ZW06Zm9jdXMgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdXRsaW5lOiAwOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cyk6YmVmb3JlLCAucGFwZXItaXRlbTpmb2N1czpiZWZvcmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CgogICAgICAgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1kYXJrLWRpdmlkZXItb3BhY2l0eSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZm9jdXNlZC1iZWZvcmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWl0ZW0vcGFwZXItaXRlbS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JdfSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3Z6LXNvcnRpbmcvc29ydGluZy5qcwp2YXIgT2s7CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGcsbCl7bGV0IGs7KGZ1bmN0aW9uKHApe3BbcC5OQVRVUkFMPTBdPSJOQVRVUkFMIjtwW3AuUkVBTD0xXT0iUkVBTCI7cFtwLkVYUE9ORU5UX1NJR049Ml09IkVYUE9ORU5UX1NJR04iO3BbcC5FWFBPTkVOVD0zXT0iRVhQT05FTlQifSkoa3x8KGs9e30pKTtsZXQgbT1rLk5BVFVSQUw7Zm9yKDtsPGcubGVuZ3RoO2wrKylpZihtPT09ay5OQVRVUkFMKWlmKCIuIj09PWdbbF0pbT1rLlJFQUw7ZWxzZSBpZigiZSI9PT1nW2xdfHwiRSI9PT1nW2xdKW09ay5FWFBPTkVOVF9TSUdOO2Vsc2V7aWYoIWQoZ1tsXSkpYnJlYWt9ZWxzZSBpZihtPT09ay5SRUFMKWlmKCJlIj09PWdbbF18fCJFIj09PWdbbF0pbT1rLkVYUE9ORU5UX1NJR047ZWxzZXtpZighZChnW2xdKSlicmVha31lbHNlIGlmKG09PT1rLkVYUE9ORU5UX1NJR04paWYoZChnW2xdKXx8IisiPT09Z1tsXXx8Ii0iPT09Z1tsXSltPWsuRVhQT05FTlQ7ZWxzZSBicmVhaztlbHNlIGlmKG09PT1rLkVYUE9ORU5UJiYKIWQoZ1tsXSkpYnJlYWs7cmV0dXJuIGx9ZnVuY3Rpb24gZChnKXtyZXR1cm4iMCI8PWcmJiI5Ij49Z31mdW5jdGlvbiBmKGcpe3JldHVybiIvIj09PWd8fCJfIj09PWd8fGQoZyl9YS5jb21wYXJlVGFnTmFtZXM9ZnVuY3Rpb24oZyxsKXtsZXQgaz0wLG09MDtmb3IoOzspe2lmKGs9PT1nLmxlbmd0aClyZXR1cm4gbT09PWwubGVuZ3RoPzA6LTE7aWYobT09PWwubGVuZ3RoKXJldHVybiAxO2lmKGQoZ1trXSkmJmQobFttXSkpe3ZhciBwPWsscT1tO2s9YyhnLGsrMSk7bT1jKGwsbSsxKTtwPXBhcnNlRmxvYXQoZy5zbGljZShwLGspKTtxPXBhcnNlRmxvYXQobC5zbGljZShxLG0pKTtpZihwPHEpcmV0dXJuLTE7aWYocD5xKXJldHVybiAxfWVsc2V7aWYoZihnW2tdKSl7aWYoIWYobFttXSkpcmV0dXJuLTF9ZWxzZXtpZihmKGxbbV0pKXJldHVybiAxO2lmKGdba108bFttXSlyZXR1cm4tMTtpZihnW2tdPmxbbV0pcmV0dXJuIDF9aysrO20rK319fX0pKE9rfHwoT2s9e30pKTsKPC9zY3JpcHQ+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWJhY2tlbmQvcmVxdWVzdE1hbmFnZXIuanMKdmFyIFBrOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhyLHQsdixBKXtjb25zdCB5PW5ldyBYTUxIdHRwUmVxdWVzdDt5Lm9wZW4ocix0KTt2JiYoeS53aXRoQ3JlZGVudGlhbHM9dik7QSYmeS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLEEpO3JldHVybiB5fWZ1bmN0aW9uIGQocil7Y29uc3QgdD1uZXcgcDtpZighcilyZXR1cm4gdC5tZXRob2RUeXBlPW0uR0VULHQ7dC5tZXRob2RUeXBlPW0uUE9TVDt0LmJvZHk9ZihyKTtyZXR1cm4gdH1mdW5jdGlvbiBmKHIpe2NvbnN0IHQ9bmV3IEZvcm1EYXRhO2ZvcihsZXQgdiBpbiByKXYmJnQuYXBwZW5kKHYsclt2XSk7cmV0dXJuIHR9Y2xhc3MgZyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt0aGlzLm5hbWU9IlJlcXVlc3RDYW5jZWxsYXRpb25FcnJvciJ9fWEuUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yPWc7Y2xhc3MgbCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIpO3RoaXMubmFtZT0KIkludmFsaWRSZXF1ZXN0T3B0aW9uc0Vycm9yIjtPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxsLnByb3RvdHlwZSl9fWEuSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3I9bDtjbGFzcyBrIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3Iocix0KXtzdXBlcigpO3RoaXMubWVzc2FnZT1gUmVxdWVzdE5ldHdvcmtFcnJvcjogJHtyLnN0YXR1c30gYXQgJHt0fWA7dGhpcy5uYW1lPSJSZXF1ZXN0TmV0d29ya0Vycm9yIjt0aGlzLnJlcT1yO3RoaXMudXJsPXR9fWEuUmVxdWVzdE5ldHdvcmtFcnJvcj1rO2xldCBtOyhmdW5jdGlvbihyKXtyLkdFVD0iR0VUIjtyLlBPU1Q9IlBPU1QifSkobT1hLkh0dHBNZXRob2RUeXBlfHwoYS5IdHRwTWV0aG9kVHlwZT17fSkpO2NsYXNzIHB7dmFsaWRhdGUoKXtpZih0aGlzLm1ldGhvZFR5cGU9PT1tLkdFVCYmdGhpcy5ib2R5KXRocm93IG5ldyBsKCJib2R5IG11c3QgYmUgbWlzc2luZyBmb3IgYSBHRVQgcmVxdWVzdC4iKTt9fWEuUmVxdWVzdE9wdGlvbnM9CnA7Y2xhc3MgcXtjb25zdHJ1Y3RvcihyPTEwLHQ9Myl7dGhpcy5fcXVldWU9W107dGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTA7dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXI7dGhpcy5fbWF4UmV0cmllcz10fXJlcXVlc3Qocix0KXt0PWQodCk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHIsdCl9cmVxdWVzdFdpdGhPcHRpb25zKHIsdCl7dC52YWxpZGF0ZSgpO3JldHVybihuZXcgUHJvbWlzZSgodixBKT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6dixyZWplY3Q6QX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT50aGlzLnByb21pc2VXaXRoUmV0cmllcyhyLHRoaXMuX21heFJldHJpZXMsdCkpLnRoZW4odj0+e3RoaXMuX25BY3RpdmVSZXF1ZXN0cy0tO3RoaXMubGF1bmNoUmVxdWVzdHMoKTtyZXR1cm4gdn0sdj0+eyJSZXF1ZXN0TmV0d29ya0Vycm9yIj09PXYubmFtZSYmKHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSk7CnJldHVybiBQcm9taXNlLnJlamVjdCh2KX0pfWZldGNoKHIsdCl7cmV0dXJuKG5ldyBQcm9taXNlKCh2LEEpPT57dGhpcy5fcXVldWUucHVzaCh7cmVzb2x2ZTp2LHJlamVjdDpBfSk7dGhpcy5sYXVuY2hSZXF1ZXN0cygpfSkpLnRoZW4oKCk9PntsZXQgdj0xO3JldHVybiBuZXcgUHJvbWlzZShBPT57Y29uc3QgeT0oKT0+e2ZldGNoKHIsdCkudGhlbih4PT57IXgub2smJnRoaXMuX21heFJldHJpZXM+dj8odisrLHkoKSk6KEEoeCksdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKX0pfTt5KCl9KX0pfWNsZWFyUXVldWUoKXtmb3IoOzA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9xdWV1ZS5wb3AoKS5yZWplY3QobmV3IGcoIlJlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUiKSl9YWN0aXZlUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzfW91dHN0YW5kaW5nUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKwp0aGlzLl9xdWV1ZS5sZW5ndGh9bGF1bmNoUmVxdWVzdHMoKXtmb3IoO3RoaXMuX25BY3RpdmVSZXF1ZXN0czx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHMmJjA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9uQWN0aXZlUmVxdWVzdHMrKyx0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCl9cHJvbWlzZVdpdGhSZXRyaWVzKHIsdCx2KXtyZXR1cm4gdGhpcy5fcHJvbWlzZUZyb21Vcmwocix2KS50aGVuKEE9PkEsQT0+MDx0P3RoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHIsdC0xLHYpOlByb21pc2UucmVqZWN0KEEpKX1fcHJvbWlzZUZyb21Vcmwocix0KXtyZXR1cm4gbmV3IFByb21pc2UoKHYsQSk9Pntjb25zdCB5PWModC5tZXRob2RUeXBlLHIsdC53aXRoQ3JlZGVudGlhbHMsdC5jb250ZW50VHlwZSk7eS5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT15LnN0YXR1cz92KEpTT04ucGFyc2UoeS5yZXNwb25zZVRleHQpKTpBKG5ldyBrKHkscikpfTt5Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBrKHksCnIpKX07dC5ib2R5P3kuc2VuZCh0LmJvZHkpOnkuc2VuZCgpfSl9fWEuUmVxdWVzdE1hbmFnZXI9cX0pKFBrfHwoUGs9e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1iYWNrZW5kL3VybFBhdGhIZWxwZXJzLmpzCihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZCkucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9YS5hZGRQYXJhbXM9ZnVuY3Rpb24oZCxmKXt2YXIgZz1PYmplY3Qua2V5cyhmKS5zb3J0KCkuZmlsdGVyKGs9PnZvaWQgMCE9PWZba10pO2lmKCFnLmxlbmd0aClyZXR1cm4gZDtjb25zdCBsPS0xIT09ZC5pbmRleE9mKCI/Iik/Ilx4MjYiOiI/IjtnPVtdLmNvbmNhdCguLi5nLm1hcChrPT57Y29uc3QgbT1mW2tdO3JldHVybihBcnJheS5pc0FycmF5KG0pP206W21dKS5tYXAocD0+YCR7a309JHtjKHApfWApfSkpLmpvaW4oIlx4MjYiKTtyZXR1cm4gZCtsK2d9fSkoUGt8fChQaz17fSkpOwo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWJhY2tlbmQvcm91dGVyLmpzCihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGw9ImRhdGEiKXsiLyI9PT1sW2wubGVuZ3RoLTFdJiYobD1sLnNsaWNlKDAsbC5sZW5ndGgtMSkpO3JldHVybntlbnZpcm9ubWVudDooKT0+ZChsLCIvZW52aXJvbm1lbnQiKSxleHBlcmltZW50czooKT0+ZChsLCIvZXhwZXJpbWVudHMiKSxwbHVnaW5Sb3V0ZTooayxtLHApPT5kKGwrIi9wbHVnaW4iLGAvJHtrfSR7bX1gLHApLHBsdWdpbnNMaXN0aW5nOigpPT5kKGwsIi9wbHVnaW5zX2xpc3RpbmciKSxydW5zOms9Pntjb25zdCBtPW5ldyBVUkxTZWFyY2hQYXJhbXM7bS5zZXQoImV4cGVyaW1lbnQiLGt8fCIiKTtyZXR1cm4gZChsLCIvcnVucyIsbSl9LHJ1bnNGb3JFeHBlcmltZW50Oms9PmQobCwiL2V4cGVyaW1lbnRfcnVucyIsZih7ZXhwZXJpbWVudDpTdHJpbmcoayl9KSl9fWZ1bmN0aW9uIGQobCxrLG09bmV3IFVSTFNlYXJjaFBhcmFtcyl7bCs9aztTdHJpbmcobSkmJihrPWsuaW5jbHVkZXMoIj8iKT8iXHgyNiI6Ij8iLGwrPWsrU3RyaW5nKG0pKTsKcmV0dXJuIGx9ZnVuY3Rpb24gZihsPXt9KXtjb25zdCBrPU9iamVjdC5rZXlzKGwpLnNvcnQoKS5maWx0ZXIocD0+bFtwXSksbT1uZXcgVVJMU2VhcmNoUGFyYW1zO2suZm9yRWFjaChwPT57Y29uc3QgcT1sW3BdOyhBcnJheS5pc0FycmF5KHEpP3E6W3FdKS5mb3JFYWNoKHI9Pm0uYXBwZW5kKHAscikpfSk7cmV0dXJuIG19bGV0IGc9YygpO2EuY3JlYXRlUm91dGVyPWM7YS5nZXRSb3V0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZ307YS5nZXRFeHBlcmltZW50SWQ9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSkuZ2V0KCJleHBlcmltZW50Iil8fCIifTthLnNldFJvdXRlcj1mdW5jdGlvbihsKXtpZihudWxsPT1sKXRocm93IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrbCk7Zz1sfTthLmNyZWF0ZVNlYXJjaFBhcmFtPWZ9KShQa3x8KFBrPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtYmFja2VuZC9iYXNlU3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZil7dGhpcy5saXN0ZW5lcj1mfX1hLkxpc3RlbktleT1jO2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBhLlJlcXVlc3RNYW5hZ2VyKDEpO3RoaXMuX2xpc3RlbmVycz1uZXcgU2V0O3RoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgpPT57dGhpcy5pbml0aWFsaXplZD0hMH0pfWFkZExpc3RlbmVyKGYpe2Y9bmV3IGMoZik7dGhpcy5fbGlzdGVuZXJzLmFkZChmKTtyZXR1cm4gZn1yZW1vdmVMaXN0ZW5lckJ5S2V5KGYpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUoZil9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGY9Pnt0cnl7Zi5saXN0ZW5lcigpfWNhdGNoKGcpe319KX19YS5CYXNlU3RvcmU9ZH0pKFBrfHwoUGs9e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1iYWNrZW5kL2Vudmlyb25tZW50U3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBhLkJhc2VTdG9yZXtsb2FkKCl7Y29uc3QgZD1hLmdldFJvdXRlcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKGY9PntmPXtkYXRhTG9jYXRpb246Zi5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOmYud2luZG93X3RpdGxlfTtfLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxmKXx8KHRoaXMuZW52aXJvbm1lbnQ9Zix0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXREYXRhTG9jYXRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmRhdGFMb2NhdGlvbjoiIn1nZXRXaW5kb3dUaXRsZSgpe3JldHVybiB0aGlzLmVudmlyb25tZW50P3RoaXMuZW52aXJvbm1lbnQud2luZG93VGl0bGU6IiJ9fWEuRW52aXJvbm1lbnRTdG9yZT1jO2EuZW52aXJvbm1lbnRTdG9yZT1uZXcgY30pKFBrfHwoUGs9e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1iYWNrZW5kL2V4cGVyaW1lbnRzU3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBhLkJhc2VTdG9yZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dGhpcy5fZXhwZXJpbWVudHM9W119bG9hZCgpe2NvbnN0IGQ9YS5nZXRSb3V0ZXIoKS5leHBlcmltZW50cygpO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZCkudGhlbihmPT57Xy5pc0VxdWFsKHRoaXMuX2V4cGVyaW1lbnRzLGYpfHwodGhpcy5fZXhwZXJpbWVudHM9Zix0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRFeHBlcmltZW50cygpe3JldHVybiB0aGlzLl9leHBlcmltZW50cy5zbGljZSgpfX1hLkV4cGVyaW1lbnRzU3RvcmU9YzthLmV4cGVyaW1lbnRzU3RvcmU9bmV3IGN9KShQa3x8KFBrPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtYmFja2VuZC9ydW5zU3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBhLkJhc2VTdG9yZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dGhpcy5fcnVucz1bXX1sb2FkKCl7Y29uc3QgZD1hLmdldFJvdXRlcigpLnJ1bnMoYS5nZXRFeHBlcmltZW50SWQoKSk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKGY9PntfLmlzRXF1YWwodGhpcy5fcnVucyxmKXx8KHRoaXMuX3J1bnM9Zix0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRSdW5zKCl7cmV0dXJuIHRoaXMuX3J1bnMuc2xpY2UoKX19YS5SdW5zU3RvcmU9YzthLnJ1bnNTdG9yZT1uZXcgY30pKFBrfHwoUGs9e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1iYWNrZW5kL2JhY2tlbmQuanMKKGZ1bmN0aW9uKGEpe2EuVFlQRVM9W107YS5nZXRSdW5zTmFtZWQ9ZnVuY3Rpb24oYyl7cmV0dXJuIF8ua2V5cyhjKS5zb3J0KE9rLmNvbXBhcmVUYWdOYW1lcyl9O2EuZ2V0VGFncz1mdW5jdGlvbihjKXtyZXR1cm4gXy51bmlvbi5hcHBseShudWxsLF8udmFsdWVzKGMpKS5zb3J0KE9rLmNvbXBhcmVUYWdOYW1lcyl9O2EuZmlsdGVyVGFncz1mdW5jdGlvbihjLGQpe2xldCBmPVtdO2QuZm9yRWFjaChnPT5mPWYuY29uY2F0KGNbZ10pKTtyZXR1cm4gXy51bmlxKGYpLnNvcnQoT2suY29tcGFyZVRhZ05hbWVzKX19KShQa3x8KFBrPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtYmFja2VuZC9jYW5jZWxsZXIuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUoZCl7Y29uc3QgZj10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBnPT5kKHt2YWx1ZTpnLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09Zn0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319YS5DYW5jZWxsZXI9Y30pKFBrfHwoUGs9e30pKTsKPC9zY3JpcHQ+Cgo8ZG9tLW1vZHVsZSBpZD0idGYtYmFja2VuZCI+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWJhY2tlbmQvdGYtYmFja2VuZC1wb2x5bWVyLmpzCihmdW5jdGlvbihhKXtQb2x5bWVyKHtpczoidGYtYmFja2VuZCIsdGZfYmFja2VuZDphfSl9KShQa3x8KFBrPXt9KSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtY2F0ZWdvcml6YXRpb24tdXRpbHMvY2F0ZWdvcml6YXRpb25VdGlscy5qcwp2YXIgUWs7CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHAscSl7Y29uc3Qgcj0oKCk9Pnt0cnl7cmV0dXJuIG5ldyBSZWdFeHAocSl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSkoKTtyZXR1cm57bmFtZTpxLG1ldGFkYXRhOnt0eXBlOm0uU0VBUkNIX1JFU1VMVFMsdmFsaWRSZWdleDohIXIsdW5pdmVyc2FsUmVnZXg6Ii4qIj09PXF9LGl0ZW1zOnI/cC5maWx0ZXIodD0+dC5tYXRjaChyKSk6W119fWZ1bmN0aW9uIGQocCxxPSIvIil7Y29uc3Qgcj1bXSx0PXt9O3AuZm9yRWFjaCh2PT57dmFyIEE9di5pbmRleE9mKHEpO0E9MDw9QT92LnNsaWNlKDAsQSk6djtpZighdFtBXSl7Y29uc3QgeT17bmFtZTpBLG1ldGFkYXRhOnt0eXBlOm0uUFJFRklYX0dST1VQfSxpdGVtczpbXX07dFtBXT15O3IucHVzaCh5KX10W0FdLml0ZW1zLnB1c2godil9KTtyZXR1cm4gcn1mdW5jdGlvbiBmKHAscT0iIil7cT1bYyhwLHEpXTtwPWQocCk7cmV0dXJuW10uY29uY2F0KHEscCl9ZnVuY3Rpb24gZyhwLHEscil7Y29uc3QgdD0KUGsuZ2V0VGFncyhwKTtyPWYodCxyKTtjb25zdCB2PWwoXy5waWNrKHAscSkpO3JldHVybiByLm1hcCgoe25hbWU6QSxtZXRhZGF0YTp5LGl0ZW1zOnh9KT0+KHtuYW1lOkEsbWV0YWRhdGE6eSxpdGVtczp4Lm1hcChDPT4oe3RhZzpDLHJ1bnM6KHYuZ2V0KEMpfHxbXSkuc2xpY2UoKX0pKX0pKX1mdW5jdGlvbiBsKHApe2NvbnN0IHE9bmV3IE1hcDtPYmplY3Qua2V5cyhwKS5mb3JFYWNoKHI9PntwW3JdLmZvckVhY2godD0+e2NvbnN0IHY9cS5nZXQodCl8fFtdO3YucHVzaChyKTtxLnNldCh0LHYpfSl9KTtyZXR1cm4gcX1mdW5jdGlvbiBrKHAscSl7Y29uc3Qgcj1Pay5jb21wYXJlVGFnTmFtZXMocC50YWcscS50YWcpO3JldHVybiAwIT1yP3I6T2suY29tcGFyZVRhZ05hbWVzKHAucnVuLHEucnVuKX1sZXQgbTsoZnVuY3Rpb24ocCl7cFtwLlNFQVJDSF9SRVNVTFRTPTBdPSJTRUFSQ0hfUkVTVUxUUyI7cFtwLlBSRUZJWF9HUk9VUD0xXT0iUFJFRklYX0dST1VQIn0pKG09YS5DYXRlZ29yeVR5cGV8fAooYS5DYXRlZ29yeVR5cGU9e30pKTthLmNhdGVnb3JpemVCeVNlYXJjaFF1ZXJ5PWM7YS5jYXRlZ29yaXplQnlQcmVmaXg9ZDthLmNhdGVnb3JpemU9ZjthLmNhdGVnb3JpemVUYWdzPWc7YS5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zPWZ1bmN0aW9uKHAscSxyKXtyZXR1cm4gZyhwLHEscikubWFwKGZ1bmN0aW9uKHQpe2NvbnN0IHY9Xy5mbGF0dGVuKHQuaXRlbXMubWFwKCh7dGFnOkEscnVuczp5fSk9PnkubWFwKHg9Pih7dGFnOkEscnVuOnh9KSkpKTt2LnNvcnQoayk7cmV0dXJue25hbWU6dC5uYW1lLG1ldGFkYXRhOnQubWV0YWRhdGEsaXRlbXM6dn19KX19KShRa3x8KFFrPXt9KSk7Cjwvc2NyaXB0PgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1nbG9iYWxzL2dsb2JhbHMuanMKdmFyIFJrOyhmdW5jdGlvbihhKXtsZXQgYz0hMTthLnNldFVzZUhhc2g9ZnVuY3Rpb24oZil7Yz1mfTthLnVzZUhhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gY307bGV0IGQ9IiI7YS5zZXRGYWtlSGFzaD1mdW5jdGlvbihmKXtkPWZ9O2EuZ2V0RmFrZUhhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gZH19KShSa3x8KFJrPXt9KSk7Cjwvc2NyaXB0PgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtc3RvcmFnZS9saXN0ZW5lcnMuanMKdmFyIFZsOwooZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3RvcihnKXt0aGlzLmxpc3RlbmVyPWd9fWEuTGlzdGVuS2V5PWM7Y29uc3QgZD1uZXcgU2V0LGY9bmV3IFNldDt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGFzaGNoYW5nZSIsKCk9PntkLmZvckVhY2goZz0+Zy5saXN0ZW5lcigpKX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzdG9yYWdlIiwoKT0+e2YuZm9yRWFjaChnPT5nLmxpc3RlbmVyKCkpfSk7YS5hZGRIYXNoTGlzdGVuZXI9ZnVuY3Rpb24oZyl7Zz1uZXcgYyhnKTtkLmFkZChnKTtyZXR1cm4gZ307YS5hZGRTdG9yYWdlTGlzdGVuZXI9ZnVuY3Rpb24oZyl7Zz1uZXcgYyhnKTtmLmFkZChnKTtyZXR1cm4gZ307YS5maXJlU3RvcmFnZUNoYW5nZWQ9ZnVuY3Rpb24oKXtmLmZvckVhY2goZz0+Zy5saXN0ZW5lcigpKX07YS5yZW1vdmVIYXNoTGlzdGVuZXJCeUtleT1mdW5jdGlvbihnKXtkLmRlbGV0ZShnKX07YS5yZW1vdmVTdG9yYWdlTGlzdGVuZXJCeUtleT1mdW5jdGlvbihnKXtmLmRlbGV0ZShnKX19KShWbHx8CihWbD17fSkpOwo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLXN0b3JhZ2Uvc3RvcmFnZS5qcwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhxLHIpe2Z1bmN0aW9uIHQoeCxDPXt9KXtjb25zdCB7ZGVmYXVsdFZhbHVlOkYsdXNlTG9jYWxTdG9yYWdlOkQ9ITF9PUM7eD1EP3dpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh4KTprKGYoKSlbeF07cmV0dXJuIHZvaWQgMD09eD9fLmNsb25lRGVlcChGKTpxKHgpfWZ1bmN0aW9uIHYoeCxDLEY9e30pe2NvbnN0IHtkZWZhdWx0VmFsdWU6RCx1c2VMb2NhbFN0b3JhZ2U6Qj0hMSx1c2VMb2NhdGlvblJlcGxhY2U6Rz0hMX09RjtGPXIoQyk7Qj8od2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHgsRiksYS5maXJlU3RvcmFnZUNoYW5nZWQoKSk6Xy5pc0VxdWFsKEMsdCh4LHt1c2VMb2NhbFN0b3JhZ2U6Qn0pKXx8KF8uaXNFcXVhbChDLEQpP20oeCk6KEM9ayhmKCkpLENbeF09RixnKGwoQyksRykpKX1jb25zdCBBPVtdLHk9W107cmV0dXJue2dldDp0LHNldDp2LGdldEluaXRpYWxpemVyOmZ1bmN0aW9uKHgsQyl7Y29uc3QgRj1PYmplY3QuYXNzaWduKHtkZWZhdWx0VmFsdWU6Qy5kZWZhdWx0VmFsdWUsCnBvbHltZXJQcm9wZXJ0eTp4LHVzZUxvY2FsU3RvcmFnZTohMX0sQyk7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgRD1kKHRoaXMseCksQj0oKT0+e2NvbnN0IEs9dChELEYpO18uaXNFcXVhbChLLHRoaXNbRi5wb2x5bWVyUHJvcGVydHldKXx8KHRoaXNbRi5wb2x5bWVyUHJvcGVydHldPUspfSxHPShGLnVzZUxvY2FsU3RvcmFnZT9hLmFkZFN0b3JhZ2VMaXN0ZW5lcjphLmFkZEhhc2hMaXN0ZW5lcikoKCk9PkIoKSk7Ri51c2VMb2NhbFN0b3JhZ2U/eS5wdXNoKEcpOkEucHVzaChHKTtCKCk7cmV0dXJuIHRoaXNbRi5wb2x5bWVyUHJvcGVydHldfX0sZ2V0T2JzZXJ2ZXI6ZnVuY3Rpb24oeCxDKXtjb25zdCBGPU9iamVjdC5hc3NpZ24oe2RlZmF1bHRWYWx1ZTpDLmRlZmF1bHRWYWx1ZSxwb2x5bWVyUHJvcGVydHk6eCx1c2VMb2NhbFN0b3JhZ2U6ITF9LEMpO3JldHVybiBmdW5jdGlvbigpe2NvbnN0IEQ9ZCh0aGlzLHgpO3YoRCx0aGlzW0YucG9seW1lclByb3BlcnR5XSxGKX19LGRpc3Bvc2VCaW5kaW5nOmZ1bmN0aW9uKCl7QS5mb3JFYWNoKHg9PgphLnJlbW92ZUhhc2hMaXN0ZW5lckJ5S2V5KHgpKTt5LmZvckVhY2goeD0+YS5yZW1vdmVTdG9yYWdlTGlzdGVuZXJCeUtleSh4KSl9fX1mdW5jdGlvbiBkKHEscil7cT1xW2EuRElTQU1CSUdVQVRPUl07cmV0dXJuKG51bGw9PXE/W3JdOltxLHJdKS5qb2luKCIuIil9ZnVuY3Rpb24gZigpe3JldHVybiBSay51c2VIYXNoKCk/d2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSk6UmsuZ2V0RmFrZUhhc2goKX1mdW5jdGlvbiBnKHEscj0hMSl7UmsudXNlSGFzaCgpP3I/d2luZG93LmxvY2F0aW9uLnJlcGxhY2UoIiMiK3EpOndpbmRvdy5sb2NhdGlvbi5oYXNoPXE6Umsuc2V0RmFrZUhhc2gocSl9ZnVuY3Rpb24gbChxKXtsZXQgcj0iIjt2b2lkIDAhPT1xW2EuVEFCXSYmKHIrPXFbYS5UQUJdKTtjb25zdCB0PU9iamVjdC5rZXlzKHEpLm1hcCh2PT5bdixxW3ZdXSkuZmlsdGVyKHY9PnZbMF0hPT1hLlRBQikubWFwKHY9PmVuY29kZVVSSUNvbXBvbmVudCh2WzBdKSsiXHgzZCIrZW5jb2RlVVJJQ29tcG9uZW50KHZbMV0pKS5qb2luKCJceDI2Iik7CnJldHVybiAwPHQubGVuZ3RoP3IrIlx4MjYiK3Q6cn1mdW5jdGlvbiBrKHEpe2NvbnN0IHI9e307cS5zcGxpdCgiXHgyNiIpLmZvckVhY2godD0+e3Q9dC5zcGxpdCgiXHgzZCIpOzE9PT10Lmxlbmd0aD9yW2EuVEFCXT10WzBdOjI9PT10Lmxlbmd0aCYmKHJbZGVjb2RlVVJJQ29tcG9uZW50KHRbMF0pXT1kZWNvZGVVUklDb21wb25lbnQodFsxXSkpfSk7cmV0dXJuIHJ9ZnVuY3Rpb24gbShxKXtjb25zdCByPWsoZigpKTtkZWxldGUgcltxXTtnKGwocikpfWEuVEFCPSJfX3RhYl9fIjthLkRJU0FNQklHVUFUT1I9ImRpc2FtYmlndWF0b3IiO3ZhciBwPWMocT0+cSxxPT5xKTthLmdldFN0cmluZz1wLmdldDthLnNldFN0cmluZz1wLnNldDthLmdldFN0cmluZ0luaXRpYWxpemVyPXAuZ2V0SW5pdGlhbGl6ZXI7YS5nZXRTdHJpbmdPYnNlcnZlcj1wLmdldE9ic2VydmVyO2EuZGlzcG9zZVN0cmluZ0JpbmRpbmc9cC5kaXNwb3NlQmluZGluZztwPWMocT0+InRydWUiPT09cT8hMDoiZmFsc2UiPT09CnE/ITE6dm9pZCAwLHE9PnEudG9TdHJpbmcoKSk7YS5nZXRCb29sZWFuPXAuZ2V0O2Euc2V0Qm9vbGVhbj1wLnNldDthLmdldEJvb2xlYW5Jbml0aWFsaXplcj1wLmdldEluaXRpYWxpemVyO2EuZ2V0Qm9vbGVhbk9ic2VydmVyPXAuZ2V0T2JzZXJ2ZXI7YS5kaXNwb3NlQm9vbGVhbkJpbmRpbmc9cC5kaXNwb3NlQmluZGluZztwPWMocT0+K3EscT0+cS50b1N0cmluZygpKTthLmdldE51bWJlcj1wLmdldDthLnNldE51bWJlcj1wLnNldDthLmdldE51bWJlckluaXRpYWxpemVyPXAuZ2V0SW5pdGlhbGl6ZXI7YS5nZXROdW1iZXJPYnNlcnZlcj1wLmdldE9ic2VydmVyO2EuZGlzcG9zZU51bWJlckJpbmRpbmc9cC5kaXNwb3NlQmluZGluZztwPWMocT0+SlNPTi5wYXJzZShhdG9iKHEpKSxxPT5idG9hKEpTT04uc3RyaW5naWZ5KHEpKSk7YS5nZXRPYmplY3Q9cC5nZXQ7YS5zZXRPYmplY3Q9cC5zZXQ7YS5nZXRPYmplY3RJbml0aWFsaXplcj1wLmdldEluaXRpYWxpemVyO2EuZ2V0T2JqZWN0T2JzZXJ2ZXI9CnAuZ2V0T2JzZXJ2ZXI7YS5kaXNwb3NlT2JqZWN0QmluZGluZz1wLmRpc3Bvc2VCaW5kaW5nO2EubWFrZUJpbmRpbmdzPWN9KShWbHx8KFZsPXt9KSk7Cjwvc2NyaXB0PgoKPGRvbS1tb2R1bGUgaWQ9InRmLXN0b3JhZ2UiPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1zdG9yYWdlL3RmLXN0b3JhZ2UtcG9seW1lci5qcwooZnVuY3Rpb24oYSl7UG9seW1lcih7aXM6InRmLXN0b3JhZ2UiLHRmX3N0b3JhZ2U6YX0pfSkoVmx8fChWbD17fSkpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1jYXRlZ29yaXphdGlvbi11dGlscy90Zi10YWctZmlsdGVyZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGFnLWZpbHRlcmVyIixwcm9wZXJ0aWVzOnt0YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIoX3RhZ0ZpbHRlcikifSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZTpWbC5nZXRTdHJpbmdJbml0aWFsaXplcigidGFnRmlsdGVyIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMSxwb2x5bWVyUHJvcGVydHk6Il90YWdGaWx0ZXIifSksb2JzZXJ2ZXI6Il90YWdGaWx0ZXJPYnNlcnZlciJ9fSxfdGFnRmlsdGVyT2JzZXJ2ZXI6VmwuZ2V0U3RyaW5nT2JzZXJ2ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLF9jb21wdXRlVGFnRmlsdGVyKCl7cmV0dXJuIHRoaXMuX3RhZ0ZpbHRlcn19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1kYXNoYm9hcmQtY29tbW9uL2FycmF5LXVwZGF0ZS1oZWxwZXIuanMKdmFyIFdsOyhmdW5jdGlvbihhKXthLkFycmF5VXBkYXRlSGVscGVyPXt1cGRhdGVBcnJheVByb3AoYyxkLGYpe2xldCBnPXRoaXMuZ2V0KGMpO2lmKCFBcnJheS5pc0FycmF5KGQpKXRocm93IFJhbmdlRXJyb3IoYEV4cGVjdGVkIG5ldyB2YWx1ZSB0byAnJHtjfScgdG8gYmUgYW4gYXJyYXkuYCk7QXJyYXkuaXNBcnJheShnKXx8KGc9W10sdGhpcy5zZXQoYyxnKSk7Y29uc3QgbD1uZXcgU2V0KGQubWFwKChwLHEpPT5mKHAscSkpKTtsZXQgaz0wLG09MDtmb3IoO2s8Zy5sZW5ndGgmJm08ZC5sZW5ndGg7KWwuaGFzKGYoZ1trXSxrKSk/KGYoZ1trXSxrKT09ZihkW21dLG0pP3RoaXMuc2V0KGAke2N9LiR7a31gLGRbbV0pOnRoaXMuc3BsaWNlKGMsaywwLGRbbV0pLG0rKyxrKyspOnRoaXMuc3BsaWNlKGMsaywxKTtrPGcubGVuZ3RoJiZ0aGlzLnNwbGljZShjLGspO208ZC5sZW5ndGgmJnRoaXMucHVzaChjLC4uLmQuc2xpY2UobSkpfX19KShXbHx8KFdsPXt9KSk7Cjwvc2NyaXB0PgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwsCiAgICAgIC5sYXlvdXQudmVydGljYWwgewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAubGF5b3V0LmlubGluZSB7CiAgICAgICAgZGlzcGxheTogLW1zLWlubGluZS1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWZsZXg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuaG9yaXpvbnRhbCB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQudmVydGljYWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAgewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAubGF5b3V0Lm5vLXdyYXAgewogICAgICAgIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICAtd2Via2l0LWZsZXgtd3JhcDogbm93cmFwOwogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1qdXN0aWZpZWQsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogY2VudGVyOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5mbGV4IHsKICAgICAgICAtbXMtZmxleDogMSAxIDAuMDAwMDAwMDAxcHg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgLXdlYmtpdC1mbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICAgIGZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgIH0KCiAgICAgIC5mbGV4LWF1dG8gewogICAgICAgIC1tcy1mbGV4OiAxIDEgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICAuZmxleC1ub25lIHsKICAgICAgICAtbXMtZmxleDogbm9uZTsKICAgICAgICAtd2Via2l0LWZsZXg6IG5vbmU7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleC1yZXZlcnNlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5sYXlvdXQuaG9yaXpvbnRhbC1yZXZlcnNlLAogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQudmVydGljYWwtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQud3JhcC1yZXZlcnNlIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgICBmbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleC1hbGlnbm1lbnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLyoqCiAgICAgICAqIEFsaWdubWVudCBpbiBjcm9zcyBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IHN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuY2VudGVyLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuZW5kIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5iYXNlbGluZSB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFsaWdubWVudCBpbiBtYWluIGF4aXMuCiAgICAgICAqLwogICAgICAubGF5b3V0LnN0YXJ0LWp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1qdXN0aWZpZWQsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogY2VudGVyOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuZW5kLWp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZW5kOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAubGF5b3V0LmFyb3VuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGRpc3RyaWJ1dGU7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZiBhbGlnbm1lbnQuCiAgICAgICAqLwogICAgICAuc2VsZi1zdGFydCB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5zZWxmLWNlbnRlciB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5zZWxmLWVuZCB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5zZWxmLXN0cmV0Y2ggewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9CgogICAgICAuc2VsZi1iYXNlbGluZSB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBtdWx0aS1saW5lIGFsaWdubWVudCBpbiBtYWluIGF4aXMuCiAgICAgICAqLwogICAgICAubGF5b3V0LnN0YXJ0LWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogc3RhcnQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuZW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZW5kOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGNlbnRlcjsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5iZXR3ZWVuLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazoganVzdGlmeTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBkaXN0cmlidXRlOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtZmFjdG9ycyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuZmxleCwKICAgICAgLmZsZXgtMSB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC0yIHsKICAgICAgICAtbXMtZmxleDogMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDI7CiAgICAgICAgZmxleDogMjsKICAgICAgfQoKICAgICAgLmZsZXgtMyB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH0KCiAgICAgIC5mbGV4LTQgewogICAgICAgIC1tcy1mbGV4OiA0OwogICAgICAgIC13ZWJraXQtZmxleDogNDsKICAgICAgICBmbGV4OiA0OwogICAgICB9CgogICAgICAuZmxleC01IHsKICAgICAgICAtbXMtZmxleDogNTsKICAgICAgICAtd2Via2l0LWZsZXg6IDU7CiAgICAgICAgZmxleDogNTsKICAgICAgfQoKICAgICAgLmZsZXgtNiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH0KCiAgICAgIC5mbGV4LTcgewogICAgICAgIC1tcy1mbGV4OiA3OwogICAgICAgIC13ZWJraXQtZmxleDogNzsKICAgICAgICBmbGV4OiA3OwogICAgICB9CgogICAgICAuZmxleC04IHsKICAgICAgICAtbXMtZmxleDogODsKICAgICAgICAtd2Via2l0LWZsZXg6IDg7CiAgICAgICAgZmxleDogODsKICAgICAgfQoKICAgICAgLmZsZXgtOSB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH0KCiAgICAgIC5mbGV4LTEwIHsKICAgICAgICAtbXMtZmxleDogMTA7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMDsKICAgICAgICBmbGV4OiAxMDsKICAgICAgfQoKICAgICAgLmZsZXgtMTEgewogICAgICAgIC1tcy1mbGV4OiAxMTsKICAgICAgICAtd2Via2l0LWZsZXg6IDExOwogICAgICAgIGZsZXg6IDExOwogICAgICB9CgogICAgICAuZmxleC0xMiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLXBvc2l0aW9uaW5nIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5ibG9jayB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5pbnZpc2libGUgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAucmVsYXRpdmUgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmZpdCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgYm9keS5mdWxsYmxlZWQgewogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICB9CgogICAgICAuc2Nyb2xsIHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCiAgICAgIC5maXhlZC1ib3R0b20sCiAgICAgIC5maXhlZC1sZWZ0LAogICAgICAuZml4ZWQtcmlnaHQsCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQoKICAgICAgLmZpeGVkLXRvcCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1yaWdodCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLmZpeGVkLWJvdHRvbSB7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1sZWZ0IHsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgOnJvb3QgewogICAgLS10Yi1vcmFuZ2Utd2VhazogI2ZmYTcyNjsKICAgIC0tdGItb3JhbmdlLXN0cm9uZzogI2Y1N2MwMDsKICAgIC0tdGItb3JhbmdlLWRhcms6ICNkYzczMjA7CiAgICAtLXRiLWdyZXktZGFya2VyOiAjZTJlMmUyOwogICAgLS10Yi1ncmV5LWxpZ2h0ZXI6ICNmM2YzZjM7CiAgICAtLXRiLXVpLWRhcmstYWNjZW50OiAjNzU3NTc1OwogICAgLS10Yi11aS1saWdodC1hY2NlbnQ6ICNlMGUwZTA7CiAgICAtLXRiLWdyYXBoLWZhZGVkOiAjZTBkNGIzOwogIH0KPC9zdHlsZT4KCgo8ZG9tLW1vZHVsZSBpZD0iZGFzaGJvYXJkLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0iaXJvbi1mbGV4Ij48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmc6IDE1cHg7CiAgICAgICAgLS1zaWRlYmFyLWxlZnQtcGFkZGluZzogMzBweDsKICAgICAgfQoKICAgICAgW3Nsb3Q9J3NpZGViYXInXSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1hcmdpbi1yaWdodDogMjBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgcGFkZGluZzogNXB4IDA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIHRmLXJ1bnMtc2VsZWN0b3IgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBsZWZ0OiB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSAqIDIpOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuc2VhcmNoLWlucHV0IHsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDAgMTBweDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiB7CiAgICAgICAgYm9yZGVyLXRvcDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7CiAgICAgICAgcGFkZGluZzogdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSAwCiAgICAgICAgICB2YXIoLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmcpIHZhcigtLXNpZGViYXItbGVmdC1wYWRkaW5nKTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBwYXBlci1idXR0b246Zmlyc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBwYXBlci1idXR0b246bGFzdC1vZi10eXBlIHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiA+IDpmaXJzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBwYWRkaW5nLXRvcDogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiA+IDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAwOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMTBweCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InNjcm9sbGJhci1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5zY3JvbGxiYXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAwIDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTkwMCk7CiAgICAgIH0KICAgICAgLnNjcm9sbGJhciB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGFzaGJvYXJkLWxheW91dCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0ic2lkZWJhciI+CiAgICAgIDxzbG90IG5hbWU9InNpZGViYXIiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImNlbnRlciI+CiAgICAgIDxzbG90IG5hbWU9ImNlbnRlciIgY2xhc3M9InNjb2xsYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjc2lkZWJhciB7CiAgICAgICAgZmxleDogMCAwIHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1iYXNpcywgMjUlKTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgbWF4LXdpZHRoOiB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItbWF4LXdpZHRoLCAzNTBweCk7CiAgICAgICAgbWluLXdpZHRoOiB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItbWluLXdpZHRoLCAyNzBweCk7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQoKICAgICAgI2NlbnRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQoW3Nsb3Q9J2NlbnRlciddKSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgIC50Zi1ncmFwaC1kYXNoYm9hcmQgI2NlbnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1kYXNoYm9hcmQtY29tbW9uL3RmLWRhc2hib2FyZC1sYXlvdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGFzaGJvYXJkLWxheW91dCJ9KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3B0aW9uLXNlbGVjdG9yIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJ3cmFwIj4KICAgICAgPGgzPltbbmFtZV1dPC9oMz4KICAgICAgPGRpdiBjbGFzcz0iY29udGVudC13cmFwcGVyIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRlbnQtd3JhcHBlciA6OnNsb3R0ZWQoKikgewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgfQoKICAgICAgLmNvbnRlbnQtd3JhcHBlciA6OnNsb3R0ZWQoKikgewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgfQoKICAgICAgLmNvbnRlbnQtd3JhcHBlciA6OnNsb3R0ZWQoLnNlbGVjdGVkKSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDAgMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1vcHRpb24tc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3B0aW9uLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntuYW1lOlN0cmluZyxzZWxlY3RlZElkOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZElkQ2hhbmdlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzLmxpc3RlbihhLCJ0YXAiLCJfc2VsZWN0VGFyZ2V0Iil9LmJpbmQodGhpcykpfSl9LF9zZWxlY3RUYXJnZXQ6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3RlZElkPWEuY3VycmVudFRhcmdldC5pZH0sX3NlbGVjdGVkSWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCIjIit0aGlzLnNlbGVjdGVkSWQpO2EmJih0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihjKXtjLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIil9KSxhLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWNvbGxhcHNlIj4KCiAgPHRlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMzAwbXMpOwogICAgICAgIC8qIFNhZmFyaSAxMCBuZWVkcyB0aGlzIHByb3BlcnR5IHByZWZpeGVkIHRvIGNvcnJlY3RseSBhcHBseSB0aGUgY3VzdG9tIHByb3BlcnR5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tY29sbGFwc2UtY2xvc2VkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1jb2xsYXBzZS1vcGVuZWQpKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+Cgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1jb2xsYXBzZS9pcm9uLWNvbGxhcHNlLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24tY29sbGFwc2UiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e2hvcml6b250YWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hvcml6b250YWxDaGFuZ2VkIn0sb3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LHRyYW5zaXRpb25pbmc6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITB9LG5vQW5pbWF0aW9uOnt0eXBlOkJvb2xlYW59LF9kZXNpcmVkU2l6ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxnZXQgZGltZW5zaW9uKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8id2lkdGgiOiJoZWlnaHQifSxnZXQgX2RpbWVuc2lvbk1heCgpe3JldHVybiB0aGlzLmhvcml6b250YWw/Im1heFdpZHRoIjoibWF4SGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXhDc3MoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXgtd2lkdGgiOgoibWF4LWhlaWdodCJ9LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJncm91cCIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX29uVHJhbnNpdGlvbkVuZCJ9LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sc2hvdzpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSEwfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITF9LHVwZGF0ZVNpemU6ZnVuY3Rpb24oYSxjKXthPSJhdXRvIj09PWE/IiI6YTtjPWMmJiF0aGlzLm5vQW5pbWF0aW9uJiZ0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2Rlc2lyZWRTaXplIT09YTt0aGlzLl9kZXNpcmVkU2l6ZT1hO3RoaXMuX3VwZGF0ZVRyYW5zaXRpb24oITEpO2MmJihjPXRoaXMuX2NhbGNTaXplKCksIiI9PT1hJiYodGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPSIiLGE9dGhpcy5fY2FsY1NpemUoKSksdGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPWMsdGhpcy5zY3JvbGxUb3A9CnRoaXMuc2Nyb2xsVG9wLHRoaXMuX3VwZGF0ZVRyYW5zaXRpb24oITApLGM9YSE9PWMpO3RoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT1hO2N8fHRoaXMuX3RyYW5zaXRpb25FbmQoKX0sZW5hYmxlVHJhbnNpdGlvbjpmdW5jdGlvbihhKXtQb2x5bWVyLkJhc2UuX3dhcm4oImBlbmFibGVUcmFuc2l0aW9uKClgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgbm9BbmltYXRpb25gIGluc3RlYWQuIik7dGhpcy5ub0FuaW1hdGlvbj0hYX0sX3VwZGF0ZVRyYW5zaXRpb246ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249YSYmIXRoaXMubm9BbmltYXRpb24/IiI6IjBzIn0sX2hvcml6b250YWxDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHk9dGhpcy5fZGltZW5zaW9uTWF4Q3NzO3RoaXMuc3R5bGVbIm1heFdpZHRoIj09PXRoaXMuX2RpbWVuc2lvbk1heD8ibWF4SGVpZ2h0IjoibWF4V2lkdGgiXT0iIjt0aGlzLnVwZGF0ZVNpemUodGhpcy5vcGVuZWQ/CiJhdXRvIjoiMHB4IiwhMSl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwhdGhpcy5vcGVuZWQpO3RoaXMuX3NldFRyYW5zaXRpb25pbmcoITApO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2UtY2xvc2VkIiwhMSk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1vcGVuZWQiLCExKTt0aGlzLnVwZGF0ZVNpemUodGhpcy5vcGVuZWQ/ImF1dG8iOiIwcHgiLCEwKTt0aGlzLm9wZW5lZCYmdGhpcy5mb2N1cygpfSxfdHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT10aGlzLl9kZXNpcmVkU2l6ZTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLWNsb3NlZCIsIXRoaXMub3BlbmVkKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLW9wZW5lZCIsdGhpcy5vcGVuZWQpO3RoaXMuX3VwZGF0ZVRyYW5zaXRpb24oITEpO3RoaXMubm90aWZ5UmVzaXplKCk7CnRoaXMuX3NldFRyYW5zaXRpb25pbmcoITEpfSxfb25UcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKGEpe1BvbHltZXIuZG9tKGEpLnJvb3RUYXJnZXQ9PT10aGlzJiZ0aGlzLl90cmFuc2l0aW9uRW5kKCl9LF9jYWxjU2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW3RoaXMuZGltZW5zaW9uXSsicHgifX0pOwo8L3NjcmlwdD4KCgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1wYWdpbmF0ZWQtdmlldy90Zi1kb20tcmVwZWF0Lmh0bWwuanMKdmFyIFhsOwooZnVuY3Rpb24oYSl7YS5UZkRvbVJlcGVhdEJlaGF2aW9yPVtXbC5BcnJheVVwZGF0ZUhlbHBlcix7cHJvcGVydGllczp7YXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2RvbUJvb3RzdHJhcHBlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3Rvcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+bnVsbH0sX3JlbmRlcmVkSXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcmVuZGVyZWRUZW1wbGF0ZUluc3Q6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfbHJ1Q2FjaGVkSXRlbXM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfY2FjaGVTaXplOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2dldEl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmM9PkpTT04uc3RyaW5naWZ5KGMpfX0sb2JzZXJ2ZXJzOlsiX2Jvb3RzdHJhcERvbShfaXRlbXNSZW5kZXJlZCwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlRG9tKF9yZW5kZXJlZEl0ZW1zLiosIF9kb21Cb290c3RyYXBwZWQpIiwKIl91cGRhdGVBY3RpdmUoX2NvbnRlbnRBY3RpdmUpIiwiX3RyaW1DYWNoZShfY2FjaGVTaXplKSJdLHNldENhY2hlU2l6ZShjKXt0aGlzLl9jYWNoZVNpemU9Y30sc2V0R2V0SXRlbUtleShjKXt0aGlzLl9nZXRJdGVtS2V5PWN9LHVwZGF0ZURvbShjKXt0aGlzLnVwZGF0ZUFycmF5UHJvcCgiX3JlbmRlcmVkSXRlbXMiLGMsdGhpcy5fZ2V0SXRlbUtleSl9LF9lbnN1cmVUZW1wbGF0aXplZCgpe2lmKCF0aGlzLmlzQXR0YWNoZWQpcmV0dXJuITE7dGhpcy5fY3Rvcnx8KHRoaXMuX2N0b3I9UG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGhpcy5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZSIpLHRoaXMse3BhcmVudE1vZGVsOiEwLGluc3RhbmNlUHJvcHM6e1t0aGlzLmFzXTohMCxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKGMsZCl7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZm9yRWFjaChmPT57Zi5mb3J3YXJkSG9zdFByb3AoYywKZCl9KX19KSk7cmV0dXJuITB9LF9ib290c3RyYXBEb20oKXt0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpJiYhdGhpcy5fZG9tQm9vdHN0cmFwcGVkJiYoQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5mb3JFYWNoKGM9PntQb2x5bWVyLmRvbSh0aGlzKS5yZW1vdmVDaGlsZChjKX0pLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmNsZWFyKCksdGhpcy5fcmVuZGVyZWRJdGVtcy5mb3JFYWNoKChjLGQpPT50aGlzLl9pbnNlcnRJdGVtKGMsZCkpLHRoaXMuX2RvbUJvb3RzdHJhcHBlZD0hMCl9LF91cGRhdGVBY3RpdmUoKXt0aGlzLl9kb21Cb290c3RyYXBwZWQmJkFycmF5LmZyb20odGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QudmFsdWVzKCkpLmZvckVhY2goYz0+e2Mubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKX0pfSxfdXBkYXRlRG9tKGMpe2lmKHRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmIl9yZW5kZXJlZEl0ZW1zIiE9Yy5wYXRoJiYKIl9yZW5kZXJlZEl0ZW1zLmxlbmd0aCIhPWMucGF0aClpZigiX3JlbmRlcmVkSXRlbXMuc3BsaWNlcyI9PT1jLnBhdGgpYy52YWx1ZS5pbmRleFNwbGljZXMuZm9yRWFjaChkPT57Y29uc3Qge2luZGV4OmYsYWRkZWRDb3VudDpnLG9iamVjdDpsLHJlbW92ZWQ6a309ZDtrLmZvckVhY2gobT0+e3RoaXMuX3JlbW92ZUl0ZW0obSx0aGlzLmNoaWxkcmVuW2ZdKX0pO2wuc2xpY2UoZixmK2cpLmZvckVhY2goKG0scCk9PnRoaXMuX2luc2VydEl0ZW0obSxmK3ApKTt0aGlzLl90cmltQ2FjaGUoKX0pO2Vsc2V7Y29uc3QgZD10aGlzLl9nZXRJdGVtS2V5KGMudmFsdWUpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmhhcyhkKT90aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZCkubm90aWZ5UGF0aCh0aGlzLmFzLGMudmFsdWUpOmNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7ZH0nIHRvIGV4aXN0IGluIHRoZSBET00gYnV0IGArImNvdWxkIG5vdCBmaW5kIG9uZS4iKX19LF9pbnNlcnRJdGVtKGMsCmQpe2lmKCF0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpKXRocm93IEVycm9yKCJFeHBlY3RlZCB0ZW1wbGF0aXplZCBiZWZvcmUgaW5zZXJ0aW5nIGFuIGl0ZW0iKTtjb25zdCBmPXRoaXMuX2dldEl0ZW1LZXkoYyk7aWYodGhpcy5fbHJ1Q2FjaGVkSXRlbXMuaGFzKGYpKWM9dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZ2V0KGYpLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZShmKSx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZikubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKTtlbHNle2NvbnN0IGc9bmV3IHRoaXMuX2N0b3Ioe1t0aGlzLmFzXTpjLGFjdGl2ZTp0aGlzLl9jb250ZW50QWN0aXZlfSk7Yz1nLnJvb3Q7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Quc2V0KGYsZyl9dGhpcy5jaGlsZHJlbltkXT9Qb2x5bWVyLmRvbSh0aGlzKS5pbnNlcnRCZWZvcmUoYyx0aGlzLmNoaWxkcmVuW2RdKTooKGMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT8KQXJyYXkuZnJvbShjLmNoaWxkcmVuKTpbY10pLmZvckVhY2goZz0+Zy5zZXRBdHRyaWJ1dGUoInNsb3QiLCJpdGVtcyIpKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChjKSl9LF9yZW1vdmVJdGVtKGMsZCl7UG9seW1lci5kb20oZC5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZChkKTtjPXRoaXMuX2dldEl0ZW1LZXkoYyk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2V0KGMsZCk7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGMpLm5vdGlmeVBhdGgoImFjdGl2ZSIsITEpfSxfdHJpbUNhY2hlKCl7Zm9yKDt0aGlzLl9scnVDYWNoZWRJdGVtcy5zaXplPnRoaXMuX2NhY2hlU2l6ZTspe2NvbnN0IFtjXT10aGlzLl9scnVDYWNoZWRJdGVtcy5rZXlzKCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGMpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmRlbGV0ZShjKX19fV19KShYbHx8KFhsPXt9KSk7Cjwvc2NyaXB0PgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtcGFnaW5hdGVkLXZpZXcvcGFnaW5hdGVkVmlld1N0b3JlLmpzCnZhciBZbDsKKGZ1bmN0aW9uKGEpe2xldCBjPW51bGw7Y29uc3QgZD1uZXcgU2V0O2EuYWRkTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihmKXtkLmFkZChmKX07YS5yZW1vdmVMaW1pdExpc3RlbmVyPWZ1bmN0aW9uKGYpe2QuZGVsZXRlKGYpfTthLmdldExpbWl0PWZ1bmN0aW9uKCl7bnVsbD09YyYmKGM9VmwuZ2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0Iix7dXNlTG9jYWxTdG9yYWdlOiEwfSksbnVsbD09Y3x8IWlzRmluaXRlKGMpfHwwPj1jKSYmKGM9MTIpO3JldHVybiBjfTthLnNldExpbWl0PWZ1bmN0aW9uKGYpe2lmKGYhPT1NYXRoLmZsb29yKGYpKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBnb3Q6ICR7Zn1gKTtpZigwPj1mKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBidXQgZ290OiAke2Z9YCk7ZiE9PWMmJihjPWYsVmwuc2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0IixjLAp7dXNlTG9jYWxTdG9yYWdlOiEwfSksZC5mb3JFYWNoKGc9PntnKCl9KSl9fSkoWWx8fChZbD17fSkpOwo8L3NjcmlwdD4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3BhbmVSZW5kZXJlZF1dIiBpZD0iaWZSZW5kZXJlZCI+CiAgICAgIDxidXR0b24gY2xhc3M9ImhlYWRpbmciIG9uLXRhcD0iX3RvZ2dsZVBhbmUiIG9wZW4tYnV0dG9uJD0iW1tvcGVuZWRdXSI+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuPlRhZ3MgbWF0Y2hpbmcgbXVsdGlwbGUgZXhwZXJpbWVudHM8L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0ludmFsaWRTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICAgICAgPHNwYW4+Jm5ic3A7PHN0cm9uZz4obWFsZm9ybWVkIHJlZ3VsYXIgZXhwcmVzc2lvbik8L3N0cm9uZz48L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+VGFncyBtYXRjaGluZyAvPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIj5bW2NhdGVnb3J5Lm5hbWVdXTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHQiPi88L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5XV0iPgogICAgICAgICAgICAgICAgPHNwYW4+IChhbGwgdGFncyk8L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gPHN0cm9uZz4obWFsZm9ybWVkIHJlZ3VsYXIgZXhwcmVzc2lvbik8L3N0cm9uZz48L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIj5bW2NhdGVnb3J5Lm5hbWVdXTwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudCI+PHNwYW4+W1tfY291bnRdXTwvc3Bhbj48L3NwYW4+CiAgICAgIDwvYnV0dG9uPgogICAgICAKICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW29wZW5lZF1dIiBuby1hbmltYXRpb24+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgICA8c3BhbiBpZD0idG9wLW9mLWNvbnRhaW5lciI+PC9zcGFuPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tdWx0aXBsZVBhZ2VzRXhpc3RdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNQcmV2aW91c1BhZ2VdXSI+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybU5leHRQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIj5OZXh0IHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDxkaXYgaWQ9Iml0ZW1zIj4KICAgICAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tdWx0aXBsZVBhZ2VzRXhpc3RdXSI+CiAgICAgICAgICAgIDxkaXYgaWQ9ImNvbnRyb2xzLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAwIDVweCI+CiAgICAgICAgICAgICAgICBQYWdlCiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgaWQ9InBhZ2UtaW5wdXQiIHR5cGU9Im51bWJlciIgbm8tbGFiZWwtZmxvYXQgbWluPSIxIiBtYXg9IltbX3BhZ2VDb3VudF1dIiB2YWx1ZT0iW1tfcGFnZUlucHV0VmFsdWVdXSIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IFtbX2lucHV0V2lkdGhdXTsiIG9uLWlucHV0PSJfaGFuZGxlUGFnZUlucHV0RXZlbnQiIG9uLWNoYW5nZT0iX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCIgb24tZm9jdXM9Il9oYW5kbGVQYWdlRm9jdXNFdmVudCIgb24tYmx1cj0iX2hhbmRsZVBhZ2VCbHVyRXZlbnQiPjwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICBvZiBbW19wYWdlQ291bnRdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNQcmV2aW91c1BhZ2VdXSI+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybU5leHRQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIj5OZXh0IHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIDVweCAxcHggMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZpcnN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6bGFzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIHsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLm5hbWUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CgogICAgICAubGlnaHQgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgIH0KCiAgICAgIC5jYXRlZ29yeS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgICB9CgogICAgICAuY291bnQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgLmhlYWRpbmc6Oi1tb3otZm9jdXMtaW5uZXIgewogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZWRlZGU7CiAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgfQoKICAgICAgLm5hbWUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CgogICAgICAubGlnaHQgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgIH0KCiAgICAgICNjb250cm9scy1jb250YWluZXIgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250cm9scy1jb250YWluZXIgcGFwZXItYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyBwYXBlci1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZmxleC1iYXNpczogMDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyBwYXBlci1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICB9CgogICAgICBzbG90IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLXBhZ2luYXRlZC12aWV3L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Iixwcm9wZXJ0aWVzOntjYXRlZ29yeTpPYmplY3QsaW5pdGlhbE9wZW5lZDpCb29sZWFuLG9wZW5lZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMH0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVDb250ZW50QWN0aXZlKG9wZW5lZCkifSxkaXNhYmxlUGFnaW5hdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiopIn0sX3BhbmVSZW5kZXJlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVBhbmVSZW5kZXJlZChjYXRlZ29yeSkiLG9ic2VydmVyOiJfb25QYW5lUmVuZGVyZWRDaGFuZ2VkIn0sX2l0ZW1zUmVuZGVyZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJdGVtc1JlbmRlcmVkKG9wZW5lZCwgX3BhbmVSZW5kZXJlZCkifSwKX2lzU2VhcmNoUmVzdWx0czp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzU2VhcmNoUmVzdWx0cyhjYXRlZ29yeS5tZXRhZGF0YS50eXBlKSJ9LF9pc0ludmFsaWRTZWFyY2hSZXN1bHRzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNJbnZhbGlkU2VhcmNoUmVzdWx0cyhjYXRlZ29yeS5tZXRhZGF0YSkifSxfaXNVbml2ZXJzYWxTZWFyY2hRdWVyeTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzVW5pdmVyc2FsU2VhcmNoUXVlcnkoY2F0ZWdvcnkubWV0YWRhdGEpIn0sZ2V0Q2F0ZWdvcnlJdGVtS2V5Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5hPT5KU09OLnN0cmluZ2lmeShhKSxvYnNlcnZlcjoiX2dldENhdGVnb3J5SXRlbUtleUNoYW5nZWQifSxfbGltaXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjEyLG9ic2VydmVyOiJfbGltaXRDaGFuZ2VkIn0sX2FjdGl2ZUluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfY3VycmVudFBhZ2U6e3R5cGU6TnVtYmVyLApjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50UGFnZShfbGltaXQsIF9hY3RpdmVJbmRleCkifSxfcGFnZUNvdW50Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVQYWdlQ291bnQoY2F0ZWdvcnkuaXRlbXMuKiwgX2xpbWl0KSJ9LF9tdWx0aXBsZVBhZ2VzRXhpc3Q6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVNdWx0aXBsZVBhZ2VzRXhpc3QoX3BhZ2VDb3VudCwgZGlzYWJsZVBhZ2luYXRpb24pIn0sX2hhc1ByZXZpb3VzUGFnZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc1ByZXZpb3VzUGFnZShfY3VycmVudFBhZ2UpIn0sX2hhc05leHRQYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTmV4dFBhZ2UoX2N1cnJlbnRQYWdlLCBfcGFnZUNvdW50KSJ9LF9pbnB1dFdpZHRoOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVJbnB1dFdpZHRoKF9wYWdlQ291bnQpIn0sX3BhZ2VJbnB1dFZhbHVlOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUlucHV0VmFsdWUoX3BhZ2VJbnB1dEZvY3VzZWQsIF9wYWdlSW5wdXRSYXdWYWx1ZSwgX2N1cnJlbnRQYWdlKSIsb2JzZXJ2ZXI6Il91cGRhdGVQYWdlSW5wdXRWYWx1ZSJ9LF9wYWdlSW5wdXRSYXdWYWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9wYWdlSW5wdXRGb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfY2xhbXBBY3RpdmVJbmRleChjYXRlZ29yeS5pdGVtcy4qKSIsIl91cGRhdGVSZW5kZXJlZEl0ZW1zKF9pdGVtc1JlbmRlcmVkLCBjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQsIF9hY3RpdmVJbmRleCwgX3BhZ2VDb3VudCwgZGlzYWJsZVBhZ2luYXRpb24pIl0sYmVoYXZpb3JzOltYbC5UZkRvbVJlcGVhdEJlaGF2aW9yXSxfY29tcHV0ZUNvdW50KCl7cmV0dXJuIHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RofSxfdG9nZ2xlUGFuZSgpe3RoaXMuX3NldE9wZW5lZCghdGhpcy5vcGVuZWQpfSxfY29tcHV0ZUNvbnRlbnRBY3RpdmUoKXtyZXR1cm4gdGhpcy5vcGVuZWR9LApfb25QYW5lUmVuZGVyZWRDaGFuZ2VkKGEsYyl7YSYmYSE9PWMmJnRoaXMuJC5pZlJlbmRlcmVkLnJlbmRlcigpfSxfY29tcHV0ZVBhbmVSZW5kZXJlZChhKXtyZXR1cm4hKGEubWV0YWRhdGEudHlwZT09PVFrLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmIiI9PT1hLm5hbWUpfSxfY29tcHV0ZUl0ZW1zUmVuZGVyZWQoKXtyZXR1cm4gdGhpcy5fcGFuZVJlbmRlcmVkJiZ0aGlzLm9wZW5lZH0sX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoYSl7cmV0dXJuIGE9PT1Ray5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFN9LF9jb21wdXRlSXNJbnZhbGlkU2VhcmNoUmVzdWx0cyhhKXtyZXR1cm4gYS50eXBlPT09UWsuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYhYS52YWxpZFJlZ2V4fSxfY29tcHV0ZUlzVW5pdmVyc2FsU2VhcmNoUXVlcnkoYSl7cmV0dXJuIGEudHlwZT09PVFrLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmYS51bml2ZXJzYWxSZWdleH0sX2lzQ29tcG9zaXRlU2VhcmNoKCl7Y29uc3Qge3R5cGU6YSwKY29tcG9zaXRlU2VhcmNoOmN9PXRoaXMuY2F0ZWdvcnkubWV0YWRhdGE7cmV0dXJuIGMmJmE9PT1Ray5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFN9LHJlYWR5KCl7dGhpcy5fc2V0T3BlbmVkKG51bGw9PXRoaXMuaW5pdGlhbE9wZW5lZD8hMDp0aGlzLmluaXRpYWxPcGVuZWQpO3RoaXMuX2xpbWl0TGlzdGVuZXI9KCk9Pnt0aGlzLnNldCgiX2xpbWl0IixZbC5nZXRMaW1pdCgpKX07WWwuYWRkTGltaXRMaXN0ZW5lcih0aGlzLl9saW1pdExpc3RlbmVyKTt0aGlzLl9saW1pdExpc3RlbmVyKCl9LGRldGFjaGVkKCl7WWwucmVtb3ZlTGltaXRMaXN0ZW5lcih0aGlzLl9saW1pdExpc3RlbmVyKX0sX3VwZGF0ZVJlbmRlcmVkSXRlbXMoYSxjLGQsZixnLGwpe2EmJihhPU1hdGguZmxvb3IoZi9kKSxjPXRoaXMuY2F0ZWdvcnkuaXRlbXN8fFtdLHRoaXMudXBkYXRlRG9tKGw/YzpjLnNsaWNlKGEqZCwoYSsxKSpkKSx0aGlzLmdldENhdGVnb3J5SXRlbUtleSkpfSxfbGltaXRDaGFuZ2VkKGEpe3RoaXMuc2V0Q2FjaGVTaXplKDIqCmEpfSxfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCgpe3RoaXMuc2V0R2V0SXRlbUtleSh0aGlzLmdldENhdGVnb3J5SXRlbUtleSl9LF9jb21wdXRlQ3VycmVudFBhZ2UoYSxjKXtyZXR1cm4gTWF0aC5mbG9vcihjL2EpKzF9LF9jb21wdXRlUGFnZUNvdW50KGEsYyl7cmV0dXJuIHRoaXMuY2F0ZWdvcnk/TWF0aC5jZWlsKHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RoL2MpOjB9LF9jb21wdXRlTXVsdGlwbGVQYWdlc0V4aXN0KGEsYyl7cmV0dXJuIWMmJjE8YX0sX2NvbXB1dGVIYXNQcmV2aW91c1BhZ2UoYSl7cmV0dXJuIDE8YX0sX2NvbXB1dGVIYXNOZXh0UGFnZShhLGMpe3JldHVybiBhPGN9LF9jb21wdXRlSW5wdXRXaWR0aChhKXtyZXR1cm5gY2FsYygke2EudG9TdHJpbmcoKS5sZW5ndGh9ZW0gKyAyMHB4KWB9LF9zZXRBY3RpdmVJbmRleChhKXtjb25zdCBjPSh0aGlzLmNhdGVnb3J5Lml0ZW1zfHxbXSkubGVuZ3RoLTE7YT5jJiYoYT1jKTswPmEmJihhPTApO3RoaXMuc2V0KCJfYWN0aXZlSW5kZXgiLAphKX0sX2NsYW1wQWN0aXZlSW5kZXgoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleCl9LF9wZXJmb3JtUHJldmlvdXNQYWdlKCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgtdGhpcy5fbGltaXQpfSxfcGVyZm9ybU5leHRQYWdlKCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgrdGhpcy5fbGltaXQpfSxfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKGEsYyxkKXtyZXR1cm4gYT9jOmQudG9TdHJpbmcoKX0sX2hhbmRsZVBhZ2VJbnB1dEV2ZW50KGEpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLGEudGFyZ2V0LnZhbHVlKTthPWEudGFyZ2V0LnZhbHVlQXNOdW1iZXI7aXNOYU4oYSl8fHRoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2xpbWl0KihNYXRoLm1heCgxLE1hdGgubWluKGEsdGhpcy5fcGFnZUNvdW50KSktMSkpfSxfaGFuZGxlUGFnZUNoYW5nZUV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRSYXdWYWx1ZSIsCnRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpfSxfaGFuZGxlUGFnZUZvY3VzRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9wYWdlSW5wdXRWYWx1ZSk7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMCl9LF9oYW5kbGVQYWdlQmx1ckV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMSl9LF91cGRhdGVQYWdlSW5wdXRWYWx1ZShhKXtjb25zdCBjPXRoaXMuJCQoIiNwYWdlLWlucHV0IGlucHV0Iik7YyYmKGMudmFsdWU9YSl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItZGlhbG9nLWJlaGF2aW9yL3BhcGVyLWRpYWxvZy1iZWhhdmlvci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvckltcGw9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJkaWFsb2ciLHRhYmluZGV4OiItMSJ9LHByb3BlcnRpZXM6e21vZGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9fcmVhZGllZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX21vZGFsQ2hhbmdlZChtb2RhbCwgX19yZWFkaWVkKSJdLGxpc3RlbmVyczp7dGFwOiJfb25EaWFsb2dDbGljayJ9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljazt0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uRXNjS2V5O3RoaXMuX19wcmV2V2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wO3RoaXMuX19yZWFkaWVkPSEwfSxfbW9kYWxDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7YyYmKGE/KHRoaXMuX19wcmV2Tm9DYW5jZWxPbk91dHNpZGVDbGljaz0KdGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXksdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3AsdGhpcy53aXRoQmFja2Ryb3A9dGhpcy5ub0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljaz0hMCk6KHRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljaz10aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2smJnRoaXMuX19wcmV2Tm9DYW5jZWxPbk91dHNpZGVDbGljayx0aGlzLm5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uRXNjS2V5JiZ0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXksdGhpcy53aXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3AmJnRoaXMuX19wcmV2V2l0aEJhY2tkcm9wKSl9LF91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkOmZ1bmN0aW9uKGEpe3RoaXMuY2xvc2luZ1JlYXNvbj10aGlzLmNsb3NpbmdSZWFzb258fAp7fTt0aGlzLmNsb3NpbmdSZWFzb24uY29uZmlybWVkPWF9LF9vbkRpYWxvZ0NsaWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1Qb2x5bWVyLmRvbShhKS5wYXRoLGQ9MCxmPWMuaW5kZXhPZih0aGlzKTtkPGY7ZCsrKXt2YXIgZz1jW2RdO2lmKGcuaGFzQXR0cmlidXRlJiYoZy5oYXNBdHRyaWJ1dGUoImRpYWxvZy1kaXNtaXNzIil8fGcuaGFzQXR0cmlidXRlKCJkaWFsb2ctY29uZmlybSIpKSl7dGhpcy5fdXBkYXRlQ2xvc2luZ1JlYXNvbkNvbmZpcm1lZChnLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWNvbmZpcm0iKSk7dGhpcy5jbG9zZSgpO2Euc3RvcFByb3BhZ2F0aW9uKCk7YnJlYWt9fX19O1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcj1bUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yLFBvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvckltcGxdfSkoKTsKPC9zY3JpcHQ+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kaWFsb2ctc2hhcmVkLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAyNHB4IDQwcHg7CgogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWRpYWxvZy1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZGlhbG9nLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1ib2R5MTsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nOwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwIDI0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5uby1wYWRkaW5nKSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCo6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgqOmxhc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CgogICAgICAvKiBJbiAxLngsIHRoaXMgc2VsZWN0b3Igd2FzIGA6aG9zdCA+IDo6Y29udGVudCBoMmAuIEluIDIueCA8c2xvdD4gYWxsb3dzCiAgICAgIHRvIHNlbGVjdCBkaXJlY3QgY2hpbGRyZW4gb25seSwgd2hpY2ggaW5jcmVhc2VzIHRoZSB3ZWlnaHQgb2YgdGhpcwogICAgICBzZWxlY3Rvciwgc28gd2UgaGF2ZSB0byByZS1kZWZpbmUgZmlyc3QtY2hpbGQvbGFzdC1jaGlsZCBtYXJnaW5zIGJlbG93LiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMikgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtdGl0bGU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlOwogICAgICB9CgogICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi10b3AuICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyOmZpcnN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctdGl0bGU7CiAgICAgIH0KCiAgICAgIC8qIEFwcGx5IG1peGluIGFnYWluLCBpbiBjYXNlIGl0IHNldHMgbWFyZ2luLWJvdHRvbS4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDI6bGFzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlOwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgucGFwZXItZGlhbG9nLWJ1dHRvbnMpLAogICAgICA6aG9zdCA+IDo6c2xvdHRlZCguYnV0dG9ucykgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBwYWRkaW5nOiA4cHggOHB4IDhweCAyNHB4OwogICAgICAgIG1hcmdpbjogMDsKCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWRpYWxvZy1idXR0b24tY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItZGlhbG9nLXNoYXJlZC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWRpYWxvZy9wYXBlci1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcl0sbGlzdGVuZXJzOnsibmVvbi1hbmltYXRpb24tZmluaXNoIjoiX29uTmVvbkFuaW1hdGlvbkZpbmlzaCJ9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpO3RoaXMucGxheUFuaW1hdGlvbigiZW50cnkiKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5wbGF5QW5pbWF0aW9uKCJleGl0Iil9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKX19KTsKPC9zY3JpcHQ+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jb2xvci1zY2FsZSI+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWNvbG9yLXNjYWxlL3BhbGV0dGVzLmpzCnZhciBabDsKKGZ1bmN0aW9uKGEpe2EucGFsZXR0ZXM9e2dvb2dsZVN0YW5kYXJkOiIjZGI0NDM3ICNmZjcwNDMgI2Y0YjQwMCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgI2FiNDdiYyIuc3BsaXQoIiAiKSxnb29nbGVDb29sOiIjOWU5ZDI0ICMwZjlkNTggIzAwNzk2YiAjMDBhY2MxICM0Mjg1ZjQgIzVjNmJjMCAjNjA3ZDhiIi5zcGxpdCgiICIpLGdvb2dsZVdhcm06IiM3OTU1NDggI2FiNDdiYyAjZjA2MjkyICNjMjE4NWIgI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAiLnNwbGl0KCIgIiksZ29vZ2xlQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDBBQ0MxICNBQjQ3QkMgIzJBNTZDNiAjMGI4MDQzICNGN0NCNEQgI2MwY2EzMyAjNWUzNWIxICNBNTI3MTQiLnNwbGl0KCIgIiksdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiIjZmY3MDQzICMwMDc3YmIgI2NjMzMxMSAjMzNiYmVlICNlZTMzNzcgIzAwOTk4OCAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3QxOiIjNDQ3N2FhICM0NGFhYWEgI2FhYWE0NCAjYWE3NzQ0ICNhYTQ0NTUgI2FhNDQ4OCIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MjoiIzg4Y2NlZSAjNDRhYTk5ICMxMTc3MzMgIzk5OTkzMyAjZGRjYzc3ICNjYzY2NzcgIzg4MjI1NSAjYWE0NDk5Ii5zcGxpdCgiICIpLApjb2xvckJsaW5kQXNzaXN0MzoiIzMzMjI4OCAjNjY5OWNjICM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICNhYTQ0NjYgIzg4MjI1NSAjNjYxMTAwICNhYTQ0OTkiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDQ6IiM0NDc3YWEgIzY2Y2NlZSAjMjI4ODMzICNjY2JiNDQgI2VlNjY3NyAjYWEzMzc3ICNiYmJiYmIiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDU6IiNGRjZEQjYgIzkyMDAwMCAjOTI0OTAwICNEQkQxMDAgIzI0RkYyNCAjMDA2RERCICM0OTAwOTIiLnNwbGl0KCIgIiksbWxkYXNoOiIjRTQ3RUFEICNGNDY0MEQgI0ZBQTMwMCAjRjVFNjM2ICMwMEEwNzcgIzAwNzdCOCAjMDBCN0VEIi5zcGxpdCgiICIpfTthLnN0YW5kYXJkPWEucGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0fSkoWmx8fChabD17fSkpOwo8L3NjcmlwdD4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtY29sb3Itc2NhbGUvY29sb3JTY2FsZS5qcwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhmLGcpe2Z1bmN0aW9uIGwoKXtrLnNldERvbWFpbihnKCkpfWNvbnN0IGs9bmV3IGQ7Zi5hZGRMaXN0ZW5lcihsKTtsKCk7cmV0dXJuIG09PmsuZ2V0Q29sb3IobSl9Y2xhc3MgZHtjb25zdHJ1Y3RvcihmPWEuc3RhbmRhcmQpe3RoaXMucGFsZXR0ZT1mO3RoaXMuaWRlbnRpZmllcnM9ZDMubWFwKCl9c2V0RG9tYWluKGYpe3RoaXMuaWRlbnRpZmllcnM9ZDMubWFwKCk7Zi5mb3JFYWNoKChnLGwpPT57dGhpcy5pZGVudGlmaWVycy5zZXQoZyx0aGlzLnBhbGV0dGVbbCV0aGlzLnBhbGV0dGUubGVuZ3RoXSl9KX1nZXRDb2xvcihmKXtpZighdGhpcy5pZGVudGlmaWVycy5oYXMoZikpdGhyb3cgRXJyb3IoYFN0cmluZyAke2Z9IHdhcyBub3QgaW4gdGhlIGRvbWFpbi5gKTtyZXR1cm4gdGhpcy5pZGVudGlmaWVycy5nZXQoZil9fWEuQ29sb3JTY2FsZT1kO2EucnVuc0NvbG9yU2NhbGU9YyhQay5ydW5zU3RvcmUsKCk9PlBrLnJ1bnNTdG9yZS5nZXRSdW5zKCkpOwphLmV4cGVyaW1lbnRzQ29sb3JTY2FsZT1jKFBrLmV4cGVyaW1lbnRzU3RvcmUsKCk9PlBrLmV4cGVyaW1lbnRzU3RvcmUuZ2V0RXhwZXJpbWVudHMoKS5tYXAoKHtuYW1lOmZ9KT0+ZikpfSkoWmx8fChabD17fSkpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0iaWNvbnMiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9IjNkLXJvdGF0aW9uIj48cGF0aCBkPSJNNy41MiAyMS40OEM0LjI1IDE5Ljk0IDEuOTEgMTYuNzYgMS41NSAxM0guMDVDLjU2IDE5LjE2IDUuNzEgMjQgMTIgMjRsLjY2LS4wMy0zLjgxLTMuODEtMS4zMyAxLjMyem0uODktNi41MmMtLjE5IDAtLjM3LS4wMy0uNTItLjA4LS4xNi0uMDYtLjI5LS4xMy0uNC0uMjQtLjExLS4xLS4yLS4yMi0uMjYtLjM3LS4wNi0uMTQtLjA5LS4zLS4wOS0uNDdoLTEuM2MwIC4zNi4wNy42OC4yMS45NS4xNC4yNy4zMy41LjU2LjY5LjI0LjE4LjUxLjMyLjgyLjQxLjMuMS42Mi4xNS45Ni4xNS4zNyAwIC43Mi0uMDUgMS4wMy0uMTUuMzItLjEuNi0uMjUuODMtLjQ0cy40Mi0uNDMuNTUtLjcyYy4xMy0uMjkuMi0uNjEuMi0uOTcgMC0uMTktLjAyLS4zOC0uMDctLjU2LS4wNS0uMTgtLjEyLS4zNS0uMjMtLjUxLS4xLS4xNi0uMjQtLjMtLjQtLjQzLS4xNy0uMTMtLjM3LS4yMy0uNjEtLjMxLjItLjA5LjM3LS4yLjUyLS4zMy4xNS0uMTMuMjctLjI3LjM3LS40Mi4xLS4xNS4xNy0uMy4yMi0uNDYuMDUtLjE2LjA3LS4zMi4wNy0uNDggMC0uMzYtLjA2LS42OC0uMTgtLjk2LS4xMi0uMjgtLjI5LS41MS0uNTEtLjY5LS4yLS4xOS0uNDctLjMzLS43Ny0uNDNDOS4xIDguMDUgOC43NiA4IDguMzkgOGMtLjM2IDAtLjY5LjA1LTEgLjE2LS4zLjExLS41Ny4yNi0uNzkuNDUtLjIxLjE5LS4zOC40MS0uNTEuNjctLjEyLjI2LS4xOC41NC0uMTguODVoMS4zYzAtLjE3LjAzLS4zMi4wOS0uNDVzLjE0LS4yNS4yNS0uMzRjLjExLS4wOS4yMy0uMTcuMzgtLjIyLjE1LS4wNS4zLS4wOC40OC0uMDguNCAwIC43LjEuODkuMzEuMTkuMi4yOS40OS4yOS44NiAwIC4xOC0uMDMuMzQtLjA4LjQ5LS4wNS4xNS0uMTQuMjctLjI1LjM3LS4xMS4xLS4yNS4xOC0uNDEuMjQtLjE2LjA2LS4zNi4wOS0uNTguMDlINy41djEuMDNoLjc3Yy4yMiAwIC40Mi4wMi42LjA3cy4zMy4xMy40NS4yM2MuMTIuMTEuMjIuMjQuMjkuNC4wNy4xNi4xLjM1LjEuNTcgMCAuNDEtLjEyLjcyLS4zNS45My0uMjMuMjMtLjU1LjMzLS45NS4zM3ptOC41NS01LjkyYy0uMzItLjMzLS43LS41OS0xLjE0LS43Ny0uNDMtLjE4LS45Mi0uMjctMS40Ni0uMjdIMTJ2OGgyLjNjLjU1IDAgMS4wNi0uMDkgMS41MS0uMjcuNDUtLjE4Ljg0LS40MyAxLjE2LS43Ni4zMi0uMzMuNTctLjczLjc0LTEuMTkuMTctLjQ3LjI2LS45OS4yNi0xLjU3di0uNGMwLS41OC0uMDktMS4xLS4yNi0xLjU3LS4xOC0uNDctLjQzLS44Ny0uNzUtMS4yem0tLjM5IDMuMTZjMCAuNDItLjA1Ljc5LS4xNCAxLjEzLS4xLjMzLS4yNC42Mi0uNDMuODUtLjE5LjIzLS40My40MS0uNzEuNTMtLjI5LjEyLS42Mi4xOC0uOTkuMThoLS45MVY5LjEyaC45N2MuNzIgMCAxLjI3LjIzIDEuNjQuNjkuMzguNDYuNTcgMS4xMi41NyAxLjk5di40ek0xMiAwbC0uNjYuMDMgMy44MSAzLjgxIDEuMzMtMS4zM2MzLjI3IDEuNTUgNS42MSA0LjcyIDUuOTYgOC40OGgxLjVDMjMuNDQgNC44NCAxOC4yOSAwIDEyIDB6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2liaWxpdHkiPjxwYXRoIGQ9Ik0xMiAyYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptOSA3aC02djEzaC0ydi02aC0ydjZIOVY5SDNWN2gxOHYyeiIgLz48L2c+CjxnIGlkPSJhY2Nlc3NpYmxlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjQiIHI9IjIiIC8+PHBhdGggZD0iTTE5IDEzdi0yYy0xLjU0LjAyLTMuMDktLjc1LTQuMDctMS44M2wtMS4yOS0xLjQzYy0uMTctLjE5LS4zOC0uMzQtLjYxLS40NS0uMDEgMC0uMDEtLjAxLS4wMi0uMDFIMTNjLS4zNS0uMi0uNzUtLjMtMS4xOS0uMjZDMTAuNzYgNy4xMSAxMCA4LjA0IDEwIDkuMDlWMTVjMCAxLjEuOSAyIDIgMmg1djVoMnYtNS41YzAtMS4xLS45LTItMi0yaC0zdi0zLjQ1YzEuMjkgMS4wNyAzLjI1IDEuOTQgNSAxLjk1em0tNi4xNyA1Yy0uNDEgMS4xNi0xLjUyIDItMi44MyAyLTEuNjYgMC0zLTEuMzQtMy0zIDAtMS4zMS44NC0yLjQxIDItMi44M1YxMi4xYy0yLjI4LjQ2LTQgMi40OC00IDQuOSAwIDIuNzYgMi4yNCA1IDUgNSAyLjQyIDAgNC40NC0xLjcyIDQuOS00aC0yLjA3eiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWJhbGFuY2UiPjxwYXRoIGQ9Ik00IDEwdjdoM3YtN0g0em02IDB2N2gzdi03aC0zek0yIDIyaDE5di0zSDJ2M3ptMTQtMTJ2N2gzdi03aC0zem0tNC41LTlMMiA2djJoMTlWNmwtOS41LTV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZS13YWxsZXQiPjxwYXRoIGQ9Ik0yMSAxOHYxYzAgMS4xLS45IDItMiAySDVjLTEuMTEgMC0yLS45LTItMlY1YzAtMS4xLjg5LTIgMi0yaDE0YzEuMSAwIDIgLjkgMiAydjFoLTljLTEuMTEgMC0yIC45LTIgMnY4YzAgMS4xLjg5IDIgMiAyaDl6bS05LTJoMTBWOEgxMnY4em00LTIuNWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYm94Ij48cGF0aCBkPSJNMyA1djE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJINWMtMS4xMSAwLTIgLjktMiAyem0xMiA0YzAgMS42Ni0xLjM0IDMtMyAzcy0zLTEuMzQtMy0zIDEuMzQtMyAzLTMgMyAxLjM0IDMgM3ptLTkgOGMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MUg2di0xeiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgM2MxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTAgMTQuMmMtMi41IDAtNC43MS0xLjI4LTYtMy4yMi4wMy0xLjk5IDQtMy4wOCA2LTMuMDggMS45OSAwIDUuOTcgMS4wOSA2IDMuMDgtMS4yOSAxLjk0LTMuNSAzLjIyLTYgMy4yMnoiIC8+PC9nPgo8ZyBpZD0iYWRkIj48cGF0aCBkPSJNMTkgMTNoLTZ2NmgtMnYtNkg1di0yaDZWNWgydjZoNnYyeiIgLz48L2c+CjxnIGlkPSJhZGQtYWxlcnQiPjxwYXRoIGQ9Ik0xMC4wMSAyMS4wMWMwIDEuMS44OSAxLjk5IDEuOTkgMS45OXMxLjk5LS44OSAxLjk5LTEuOTloLTMuOTh6bTguODctNC4xOVYxMWMwLTMuMjUtMi4yNS01Ljk3LTUuMjktNi42OXYtLjcyQzEzLjU5IDIuNzEgMTIuODggMiAxMiAycy0xLjU5LjcxLTEuNTkgMS41OXYuNzJDNy4zNyA1LjAzIDUuMTIgNy43NSA1LjEyIDExdjUuODJMMyAxOC45NFYyMGgxOHYtMS4wNmwtMi4xMi0yLjEyek0xNiAxMy4wMWgtM3YzaC0ydi0zSDhWMTFoM1Y4aDJ2M2gzdjIuMDF6IiAvPjwvZz4KPGcgaWQ9ImFkZC1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMGgtNHY0aC0ydi00SDd2LTJoNFY3aDJ2NGg0djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem01IDExaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZS1vdXRsaW5lIj48cGF0aCBkPSJNMTMgN2gtMnY0SDd2Mmg0djRoMnYtNGg0di0yaC00Vjd6bS0xLTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJhZGQtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTExIDloMlY2aDNWNGgtM1YxaC0ydjNIOHYyaDN2M3ptLTQgOWMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnptMTAgMGMtMS4xIDAtMS45OS45LTEuOTkgMnMuODkgMiAxLjk5IDIgMi0uOSAyLTItLjktMi0yLTJ6bS05LjgzLTMuMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy44Ni03LjAxTDE5LjQyIDRoLS4wMWwtMS4xIDItMi43NiA1SDguNTNsLS4xMy0uMjdMNi4xNiA2bC0uOTUtMi0uOTQtMkgxdjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjEzIDAtLjI1LS4xMS0uMjUtLjI1eiIgLz48L2c+CjxnIGlkPSJhbGFybSI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyLjUgOEgxMXY2bDQuNzUgMi44NS43NS0xLjIzLTQtMi4zN1Y4ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3oiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tYWRkIj48cGF0aCBkPSJNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNMTIgNGMtNC45NyAwLTkgNC4wMy05IDlzNC4wMiA5IDkgOWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptMCAxNmMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6bTEtMTFoLTJ2M0g4djJoM3YzaDJ2LTNoM3YtMmgtM1Y5eiIgLz48L2c+CjxnIGlkPSJhbGFybS1vZmYiPjxwYXRoIGQ9Ik0xMiA2YzMuODcgMCA3IDMuMTMgNyA3IDAgLjg0LS4xNiAxLjY1LS40MyAyLjRsMS41MiAxLjUyYy41OC0xLjE5LjkxLTIuNTEuOTEtMy45MiAwLTQuOTctNC4wMy05LTktOS0xLjQxIDAtMi43My4zMy0zLjkyLjkxTDkuNiA2LjQzQzEwLjM1IDYuMTYgMTEuMTYgNiAxMiA2em0xMC0uMjhsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0yLjkyIDIuMjlMMS42NSAzLjU3IDIuOTggNC45bC0xLjExLjkzIDEuNDIgMS40MiAxLjExLS45NC44LjhDMy44MyA4LjY5IDMgMTAuNzUgMyAxM2MwIDQuOTcgNC4wMiA5IDkgOSAyLjI1IDAgNC4zMS0uODMgNS44OS0yLjJsMi4yIDIuMiAxLjI3LTEuMjdMMy44OSAzLjI3bC0uOTctLjk4em0xMy41NSAxNi4xQzE1LjI2IDE5LjM5IDEzLjcgMjAgMTIgMjBjLTMuODcgMC03LTMuMTMtNy03IDAtMS43LjYxLTMuMjYgMS42MS00LjQ3bDkuODYgOS44NnpNOC4wMiAzLjI4TDYuNiAxLjg2bC0uODYuNzEgMS40MiAxLjQyLjg2LS43MXoiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tb24iPjxwYXRoIGQ9Ik0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptLTEuNDYtNS40N0w4LjQxIDEyLjRsLTEuMDYgMS4wNiAzLjE4IDMuMTggNi02LTEuMDYtMS4wNi00LjkzIDQuOTV6IiAvPjwvZz4KPGcgaWQ9ImFsbC1vdXQiPjxwYXRoIGQ9Ik0xNi4yMSA0LjE2bDQgNHYtNHptNCAxMmwtNCA0aDR6bS0xMiA0bC00LTR2NHptLTQtMTJsNC00aC00em0xMi45NS0uOTVjLTIuNzMtMi43My03LjE3LTIuNzMtOS45IDBzLTIuNzMgNy4xNyAwIDkuOSA3LjE3IDIuNzMgOS45IDAgMi43My03LjE2IDAtOS45em0tMS4xIDguOGMtMi4xMyAyLjEzLTUuNTcgMi4xMy03LjcgMHMtMi4xMy01LjU3IDAtNy43IDUuNTctMi4xMyA3LjcgMCAyLjEzIDUuNTcgMCA3Ljd6IiAvPjwvZz4KPGcgaWQ9ImFuZHJvaWQiPjxwYXRoIGQ9Ik02IDE4YzAgLjU1LjQ1IDEgMSAxaDF2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgydjMuNWMwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjVWMTloMWMuNTUgMCAxLS40NSAxLTFWOEg2djEwek0zLjUgOEMyLjY3IDggMiA4LjY3IDIgOS41djdjMCAuODMuNjcgMS41IDEuNSAxLjVTNSAxNy4zMyA1IDE2LjV2LTdDNSA4LjY3IDQuMzMgOCAzLjUgOHptMTcgMGMtLjgzIDAtMS41LjY3LTEuNSAxLjV2N2MwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjV2LTdjMC0uODMtLjY3LTEuNS0xLjUtMS41em0tNC45Ny01Ljg0bDEuMy0xLjNjLjItLjIuMi0uNTEgMC0uNzEtLjItLjItLjUxLS4yLS43MSAwbC0xLjQ4IDEuNDhDMTMuODUgMS4yMyAxMi45NSAxIDEyIDFjLS45NiAwLTEuODYuMjMtMi42Ni42M0w3Ljg1LjE1Yy0uMi0uMi0uNTEtLjItLjcxIDAtLjIuMi0uMi41MSAwIC43MWwxLjMxIDEuMzFDNi45NyAzLjI2IDYgNS4wMSA2IDdoMTJjMC0xLjk5LS45Ny0zLjc1LTIuNDctNC44NHpNMTAgNUg5VjRoMXYxem01IDBoLTFWNGgxdjF6IiAvPjwvZz4KPGcgaWQ9ImFubm91bmNlbWVudCI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyA5aC0yVjVoMnY2em0wIDRoLTJ2LTJoMnYyeiIgLz48L2c+CjxnIGlkPSJhcHBzIj48cGF0aCBkPSJNNCA4aDRWNEg0djR6bTYgMTJoNHYtNGgtNHY0em0tNiAwaDR2LTRINHY0em0wLTZoNHYtNEg0djR6bTYgMGg0di00aC00djR6bTYtMTB2NGg0VjRoLTR6bS02IDRoNFY0aC00djR6bTYgNmg0di00aC00djR6bTAgNmg0di00aC00djR6IiAvPjwvZz4KPGcgaWQ9ImFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NCA1LjIzbC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTYuNTVMMy40NiA1LjIzQzMuMTcgNS41NyAzIDYuMDIgMyA2LjVWMTljMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2LjVjMC0uNDgtLjE3LS45My0uNDYtMS4yN3pNMTIgMTcuNUw2LjUgMTJIMTB2LTJoNHYyaDMuNUwxMiAxNy41ek01LjEyIDVsLjgxLTFoMTJsLjk0IDFINS4xMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctYmFjayI+PHBhdGggZD0iTTIwIDExSDcuODNsNS41OS01LjU5TDEyIDRsLTggOCA4IDggMS40MS0xLjQxTDcuODMgMTNIMjB2LTJ6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRvd253YXJkIj48cGF0aCBkPSJNMjAgMTJsLTEuNDEtMS40MUwxMyAxNi4xN1Y0aC0ydjEyLjE3bC01LjU4LTUuNTlMNCAxMmw4IDggOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLWRvd24iPjxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93bi1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDEybC00LTRoOGwtNCA0eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLXVwIj48cGF0aCBkPSJNNyAxNGw1LTUgNSA1eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1mb3J3YXJkIj48cGF0aCBkPSJNMTIgNGwtMS40MSAxLjQxTDE2LjE3IDExSDR2MmgxMi4xN2wtNS41OCA1LjU5TDEyIDIwbDgtOHoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctdXB3YXJkIj48cGF0aCBkPSJNNCAxMmwxLjQxIDEuNDFMMTEgNy44M1YyMGgyVjcuODNsNS41OCA1LjU5TDIwIDEybC04LTgtOCA4eiIgLz48L2c+CjxnIGlkPSJhc3BlY3QtcmF0aW8iPjxwYXRoIGQ9Ik0xOSAxMmgtMnYzaC0zdjJoNXYtNXpNNyA5aDNWN0g1djVoMlY5em0xNC02SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2Vzc21lbnQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0yIDE0SDd2LTJoN3Yyem0zLTRIN3YtMmgxMHYyem0wLTRIN1Y3aDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtaW5kIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTAgNGMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJINnYtMS40YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMVYxOXoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1sYXRlIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNiAxNWgtMnYtMmgydjJ6bTAtNGgtMlY4aDJ2NnptLTEtOWMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXJldHVybiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem00IDEyaC00djNsLTUtNSA1LTV2M2g0djR6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuZWQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCAxNWwtNS01aDNWOWg0djRoM2wtNSA1eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXR1cm5lZC1pbiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0tMiAxNGwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJhdHRhY2htZW50Ij48cGF0aCBkPSJNMiAxMi41QzIgOS40NiA0LjQ2IDcgNy41IDdIMThjMi4yMSAwIDQgMS43OSA0IDRzLTEuNzkgNC00IDRIOS41QzguMTIgMTUgNyAxMy44OCA3IDEyLjVTOC4xMiAxMCA5LjUgMTBIMTd2Mkg5LjQxYy0uNTUgMC0uNTUgMSAwIDFIMThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0ySDcuNUM1LjU3IDkgNCAxMC41NyA0IDEyLjVTNS41NyAxNiA3LjUgMTZIMTd2Mkg3LjVDNC40NiAxOCAyIDE1LjU0IDIgMTIuNXoiIC8+PC9nPgo8ZyBpZD0iYXV0b3JlbmV3Ij48cGF0aCBkPSJNMTIgNnYzbDQtNC00LTR2M2MtNC40MiAwLTggMy41OC04IDggMCAxLjU3LjQ2IDMuMDMgMS4yNCA0LjI2TDYuNyAxNC44Yy0uNDUtLjgzLS43LTEuNzktLjctMi44IDAtMy4zMSAyLjY5LTYgNi02em02Ljc2IDEuNzRMMTcuMyA5LjJjLjQ0Ljg0LjcgMS43OS43IDIuOCAwIDMuMzEtMi42OSA2LTYgNnYtM2wtNCA0IDQgNHYtM2M0LjQyIDAgOC0zLjU4IDgtOCAwLTEuNTctLjQ2LTMuMDMtMS4yNC00LjI2eiIgLz48L2c+CjxnIGlkPSJiYWNrc3BhY2UiPjxwYXRoIGQ9Ik0yMiAzSDdjLS42OSAwLTEuMjMuMzUtMS41OS44OEwwIDEybDUuNDEgOC4xMWMuMzYuNTMuOS44OSAxLjU5Ljg5aDE1YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0zIDEyLjU5TDE3LjU5IDE3IDE0IDEzLjQxIDEwLjQxIDE3IDkgMTUuNTkgMTIuNTkgMTIgOSA4LjQxIDEwLjQxIDcgMTQgMTAuNTkgMTcuNTkgNyAxOSA4LjQxIDE1LjQxIDEyIDE5IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJiYWNrdXAiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE0IDEzdjRoLTR2LTRIN2w1LTUgNSA1aC0zeiIgLz48L2c+CjxnIGlkPSJibG9jayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTQgMTJjMC00LjQyIDMuNTgtOCA4LTggMS44NSAwIDMuNTUuNjMgNC45IDEuNjlMNS42OSAxNi45QzQuNjMgMTUuNTUgNCAxMy44NSA0IDEyem04IDhjLTEuODUgMC0zLjU1LS42My00LjktMS42OUwxOC4zMSA3LjFDMTkuMzcgOC40NSAyMCAxMC4xNSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iYm9vayI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmsiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImJvb2ttYXJrLWJvcmRlciI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0iYnVnLXJlcG9ydCI+PHBhdGggZD0iTTIwIDhoLTIuODFjLS40NS0uNzgtMS4wNy0xLjQ1LTEuODItMS45NkwxNyA0LjQxIDE1LjU5IDNsLTIuMTcgMi4xN0MxMi45NiA1LjA2IDEyLjQ5IDUgMTIgNWMtLjQ5IDAtLjk2LjA2LTEuNDEuMTdMOC40MSAzIDcgNC40MWwxLjYyIDEuNjNDNy44OCA2LjU1IDcuMjYgNy4yMiA2LjgxIDhINHYyaDIuMDljLS4wNS4zMy0uMDkuNjYtLjA5IDF2MUg0djJoMnYxYzAgLjM0LjA0LjY3LjA5IDFINHYyaDIuODFjMS4wNCAxLjc5IDIuOTcgMyA1LjE5IDNzNC4xNS0xLjIxIDUuMTktM0gyMHYtMmgtMi4wOWMuMDUtLjMzLjA5LS42Ni4wOS0xdi0xaDJ2LTJoLTJ2LTFjMC0uMzQtLjA0LS42Ny0uMDktMUgyMFY4em0tNiA4aC00di0yaDR2MnptMC00aC00di0yaDR2MnoiIC8+PC9nPgo8ZyBpZD0iYnVpbGQiPjxwYXRoIGQ9Ik0yMi43IDE5bC05LjEtOS4xYy45LTIuMy40LTUtMS41LTYuOS0yLTItNS0yLjQtNy40LTEuM0w5IDYgNiA5IDEuNiA0LjdDLjQgNy4xLjkgMTAuMSAyLjkgMTIuMWMxLjkgMS45IDQuNiAyLjQgNi45IDEuNWw5LjEgOS4xYy40LjQgMSAuNCAxLjQgMGwyLjMtMi4zYy41LS40LjUtMS4xLjEtMS40eiIgLz48L2c+CjxnIGlkPSJjYWNoZWQiPjxwYXRoIGQ9Ik0xOSA4bC00IDRoM2MwIDMuMzEtMi42OSA2LTYgNi0xLjAxIDAtMS45Ny0uMjUtMi44LS43bC0xLjQ2IDEuNDZDOC45NyAxOS41NCAxMC40MyAyMCAxMiAyMGM0LjQyIDAgOC0zLjU4IDgtOGgzbC00LTR6TTYgMTJjMC0zLjMxIDIuNjktNiA2LTYgMS4wMSAwIDEuOTcuMjUgMi44LjdsMS40Ni0xLjQ2QzE1LjAzIDQuNDYgMTMuNTcgNCAxMiA0Yy00LjQyIDAtOCAzLjU4LTggOEgxbDQgNCA0LTRINnoiIC8+PC9nPgo8ZyBpZD0iY2FtZXJhLWVuaGFuY2UiPjxwYXRoIGQ9Ik05IDNMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMmgtMy4xN0wxNSAzSDl6bTMgMTVjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLTFsMS4yNS0yLjc1TDE2IDEzbC0yLjc1LTEuMjVMMTIgOWwtMS4yNSAyLjc1TDggMTNsMi43NSAxLjI1eiIgLz48L2c+CjxnIGlkPSJjYW5jZWwiPjxwYXRoIGQ9Ik0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem01IDEzLjU5TDE1LjU5IDE3IDEyIDEzLjQxIDguNDEgMTcgNyAxNS41OSAxMC41OSAxMiA3IDguNDEgOC40MSA3IDEyIDEwLjU5IDE1LjU5IDcgMTcgOC40MSAxMy40MSAxMiAxNyAxNS41OXoiIC8+PC9nPgo8ZyBpZD0iY2FyZC1naWZ0Y2FyZCI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJjYXJkLW1lbWJlcnNoaXAiPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDR2NWw0LTIgNCAydi01aDRjMS4xMSAwIDItLjg5IDItMlY0YzAtMS4xMS0uODktMi0yLTJ6bTAgMTNINHYtMmgxNnYyem0wLTVINFY0aDE2djZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtdHJhdmVsIj48cGF0aCBkPSJNMjAgNmgtM1Y0YzAtMS4xMS0uODktMi0yLTJIOWMtMS4xMSAwLTIgLjg5LTIgMnYySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yek05IDRoNnYySDlWNHptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDN2MmgyVjhoNnYyaDJWOGgzdjZ6IiAvPjwvZz4KPGcgaWQ9ImNoYW5nZS1oaXN0b3J5Ij48cGF0aCBkPSJNMTIgNy43N0wxOC4zOSAxOEg1LjYxTDEyIDcuNzdNMTIgNEwyIDIwaDIwTDEyIDR6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrIj48cGF0aCBkPSJNOSAxNi4xN0w0LjgzIDEybC0xLjQyIDEuNDFMOSAxOSAyMSA3bC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTkgMTRsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94LW91dGxpbmUtYmxhbmsiPjxwYXRoIGQ9Ik0xOSA1djE0SDVWNWgxNG0wLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJjaGVjay1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNWwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPGcgaWQ9ImNocm9tZS1yZWFkZXItbW9kZSI+PHBhdGggZD0iTTEzIDEyaDd2MS41aC03em0wLTIuNWg3VjExaC03em0wIDVoN1YxNmgtN3pNMjEgNEgzYy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTVoLTlWNmg5djEzeiIgLz48L2c+CjxnIGlkPSJjbGFzcyI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iY2xlYXIiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3NlIj48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIgLz48L2c+CjxnIGlkPSJjbG91ZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNC41IDE0SDhjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTNsLjE0LjAxQzguNTggOC4yOCAxMC4xMyA3IDEyIDdjMi4yMSAwIDQgMS43OSA0IDRoLjVjMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjVTMTcuODggMTYgMTYuNSAxNnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtZG9uZSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTAgMTdsLTMuNS0zLjUgMS40MS0xLjQxTDEwIDE0LjE3IDE1LjE4IDlsMS40MSAxLjQxTDEwIDE3eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb3dubG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTcgMTNsLTUgNS01LTVoM1Y5aDR2NGgzeiIgLz48L2c+CjxnIGlkPSJjbG91ZC1vZmYiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNGMtMS40OCAwLTIuODUuNDMtNC4wMSAxLjE3bDEuNDYgMS40NkMxMC4yMSA2LjIzIDExLjA4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgMyAwIDEuMTMtLjY0IDIuMTEtMS41NiAyLjYybDEuNDUgMS40NUMyMy4xNiAxOC4xNiAyNCAxNi42OCAyNCAxNWMwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMyA1LjI3bDIuNzUgMi43NEMyLjU2IDguMTUgMCAxMC43NyAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDExLjczbDIgMkwyMSAyMC43MyA0LjI3IDQgMyA1LjI3ek03LjczIDEwbDggOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aDEuNzN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXF1ZXVlIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xOSAxOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aC43MUM3LjM3IDcuNjkgOS40OCA2IDEyIDZjMy4wNCAwIDUuNSAyLjQ2IDUuNSA1LjV2LjVIMTljMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXVwbG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImNvZGUiPjxwYXRoIGQ9Ik05LjQgMTYuNkw0LjggMTJsNC42LTQuNkw4IDZsLTYgNiA2IDYgMS40LTEuNHptNS4yIDBsNC42LTQuNi00LjYtNC42TDE2IDZsNiA2LTYgNi0xLjQtMS40eiIgLz48L2c+CjxnIGlkPSJjb21wYXJlLWFycm93cyI+PHBhdGggZD0iTTkuMDEgMTRIMnYyaDcuMDF2M0wxMyAxNWwtMy45OS00djN6bTUuOTgtMXYtM0gyMlY4aC03LjAxVjVMMTEgOWwzLjk5IDR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY29weSI+PHBhdGggZD0iTTE2IDFINGMtMS4xIDAtMiAuOS0yIDJ2MTRoMlYzaDEyVjF6bTMgNEg4Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDExYzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTZIOFY3aDExdjE0eiIgLz48L2c+CjxnIGlkPSJjb250ZW50LWN1dCI+PHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1wYXN0ZSI+PHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiIC8+PC9nPgo8ZyBpZD0iY29weXJpZ2h0Ij48cGF0aCBkPSJNMTAuMDggMTAuODZjLjA1LS4zMy4xNi0uNjIuMy0uODdzLjM0LS40Ni41OS0uNjJjLjI0LS4xNS41NC0uMjIuOTEtLjIzLjIzLjAxLjQ0LjA1LjYzLjEzLjIuMDkuMzguMjEuNTIuMzZzLjI1LjMzLjM0LjUzLjEzLjQyLjE0LjY0aDEuNzljLS4wMi0uNDctLjExLS45LS4yOC0xLjI5cy0uNC0uNzMtLjctMS4wMS0uNjYtLjUtMS4wOC0uNjYtLjg4LS4yMy0xLjM5LS4yM2MtLjY1IDAtMS4yMi4xMS0xLjcuMzRzLS44OC41My0xLjIuOTItLjU2Ljg0LS43MSAxLjM2UzggMTEuMjkgOCAxMS44N3YuMjdjMCAuNTguMDggMS4xMi4yMyAxLjY0cy4zOS45Ny43MSAxLjM1LjcyLjY5IDEuMi45MSAxLjA1LjM0IDEuNy4zNGMuNDcgMCAuOTEtLjA4IDEuMzItLjIzcy43Ny0uMzYgMS4wOC0uNjMuNTYtLjU4Ljc0LS45NC4yOS0uNzQuMy0xLjE1aC0xLjc5Yy0uMDEuMjEtLjA2LjQtLjE1LjU4cy0uMjEuMzMtLjM2LjQ2LS4zMi4yMy0uNTIuM2MtLjE5LjA3LS4zOS4wOS0uNi4xLS4zNi0uMDEtLjY2LS4wOC0uODktLjIzLS4yNS0uMTYtLjQ1LS4zNy0uNTktLjYycy0uMjUtLjU1LS4zLS44OC0uMDgtLjY3LS4wOC0xdi0uMjdjMC0uMzUuMDMtLjY4LjA4LTEuMDF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJjcmVhdGUiPjxwYXRoIGQ9Ik0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZS1uZXctZm9sZGVyIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE4YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTEgOGgtM3YzaC0ydi0zaC0zdi0yaDNWOWgydjNoM3YyeiIgLz48L2c+CjxnIGlkPSJjcmVkaXQtY2FyZCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0iZGFzaGJvYXJkIj48cGF0aCBkPSJNMyAxM2g4VjNIM3YxMHptMCA4aDh2LTZIM3Y2em0xMCAwaDhWMTFoLTh2MTB6bTAtMTh2Nmg4VjNoLTh6IiAvPjwvZz4KPGcgaWQ9ImRhdGUtcmFuZ2UiPjxwYXRoIGQ9Ik05IDExSDd2Mmgydi0yem00IDBoLTJ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem0yLTdoLTFWMmgtMnYySDhWMkg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAyMGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOWgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtZm9yZXZlciI+PHBhdGggZD0iTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlLXN3ZWVwIj48cGF0aCBkPSJNMTUgMTZoNHYyaC00em0wLThoN3YyaC03em0wIDRoNnYyaC02ek0zIDE4YzAgMS4xLjkgMiAyIDJoNmMxLjEgMCAyLS45IDItMlY4SDN2MTB6TTE0IDVoLTNsLTEtMUg2TDUgNUgydjJoMTJ6IiAvPjwvZz4KPGcgaWQ9ImRlc2NyaXB0aW9uIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE2SDh2LTJoOHYyem0wLTRIOHYtMmg4djJ6bS0zLTVWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0iZG5zIj48cGF0aCBkPSJNMjAgMTNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXpNNyAxOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6TTIwIDNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xek03IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJkb25lIj48cGF0aCBkPSJNOSAxNi4yTDQuOCAxMmwtMS40IDEuNEw5IDE5IDIxIDdsLTEuNC0xLjRMOSAxNi4yeiIgLz48L2c+CjxnIGlkPSJkb25lLWFsbCI+PHBhdGggZD0iTTE4IDdsLTEuNDEtMS40MS02LjM0IDYuMzQgMS40MSAxLjQxTDE4IDd6bTQuMjQtMS40MUwxMS42NiAxNi4xNyA3LjQ4IDEybC0xLjQxIDEuNDFMMTEuNjYgMTlsMTItMTItMS40Mi0xLjQxek0uNDEgMTMuNDFMNiAxOWwxLjQxLTEuNDFMMS44MyAxMiAuNDEgMTMuNDF6IiAvPjwvZz4KPGcgaWQ9ImRvbnV0LWxhcmdlIj48cGF0aCBkPSJNMTEgNS4wOFYyYy01IC41LTkgNC44MS05IDEwczQgOS41IDkgMTB2LTMuMDhjLTMtLjQ4LTYtMy40LTYtNi45MnMzLTYuNDQgNi02Ljkyek0xOC45NyAxMUgyMmMtLjQ3LTUtNC04LjUzLTktOXYzLjA4QzE2IDUuNTEgMTguNTQgOCAxOC45NyAxMXpNMTMgMTguOTJWMjJjNS0uNDcgOC41My00IDktOWgtMy4wM2MtLjQzIDMtMi45NyA1LjQ5LTUuOTcgNS45MnoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtc21hbGwiPjxwYXRoIGQ9Ik0xMSA5LjE2VjJjLTUgLjUtOSA0Ljc5LTkgMTBzNCA5LjUgOSAxMHYtNy4xNmMtMS0uNDEtMi0xLjUyLTItMi44NHMxLTIuNDMgMi0yLjg0ek0xNC44NiAxMUgyMmMtLjQ4LTQuNzUtNC04LjUzLTktOXY3LjE2YzEgLjMgMS41Mi45OCAxLjg2IDEuODR6TTEzIDE0Ljg0VjIyYzUtLjQ3IDguNTItNC4yNSA5LTloLTcuMTRjLS4zNC44Ni0uODYgMS41NC0xLjg2IDEuODR6IiAvPjwvZz4KPGcgaWQ9ImRyYWZ0cyI+PHBhdGggZD0iTTIxLjk5IDhjMC0uNzItLjM3LTEuMzUtLjk0LTEuN0wxMiAxIDIuOTUgNi4zQzIuMzggNi42NSAyIDcuMjggMiA4djEwYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJsLS4wMS0xMHpNMTIgMTNMMy43NCA3Ljg0IDEyIDNsOC4yNiA0Ljg0TDEyIDEzeiIgLz48L2c+CjxnIGlkPSJlamVjdCI+PHBhdGggZD0iTTUgMTdoMTR2Mkg1em03LTEyTDUuMzMgMTVoMTMuMzR6IiAvPjwvZz4KPGcgaWQ9ImVycm9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiIC8+PC9nPgo8ZyBpZD0iZXJyb3Itb3V0bGluZSI+PHBhdGggZD0iTTExIDE1aDJ2MmgtMnptMC04aDJ2NmgtMnptLjk5LTVDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iZXVyby1zeW1ib2wiPjxwYXRoIGQ9Ik0xNSAxOC41Yy0yLjUxIDAtNC42OC0xLjQyLTUuNzYtMy41SDE1di0ySDguNThjLS4wNS0uMzMtLjA4LS42Ni0uMDgtMXMuMDMtLjY3LjA4LTFIMTVWOUg5LjI0QzEwLjMyIDYuOTIgMTIuNSA1LjUgMTUgNS41YzEuNjEgMCAzLjA5LjU5IDQuMjMgMS41N0wyMSA1LjNDMTkuNDEgMy44NyAxNy4zIDMgMTUgM2MtMy45MiAwLTcuMjQgMi41MS04LjQ4IDZIM3YyaDMuMDZjLS4wNC4zMy0uMDYuNjYtLjA2IDEgMCAuMzQuMDIuNjcuMDYgMUgzdjJoMy41MmMxLjI0IDMuNDkgNC41NiA2IDguNDggNiAyLjMxIDAgNC40MS0uODcgNi0yLjNsLTEuNzgtMS43N2MtMS4xMy45OC0yLjYgMS41Ny00LjIyIDEuNTd6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50Ij48cGF0aCBkPSJNMTcgMTJoLTV2NWg1di01ek0xNiAxdjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJoLTFWMWgtMnptMyAxOEg1VjhoMTR2MTF6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50LXNlYXQiPjxwYXRoIGQ9Ik00IDE4djNoM3YtM2gxMHYzaDN2LTZINHptMTUtOGgzdjNoLTN6TTIgMTBoM3YzSDJ6bTE1IDNIN1Y1YzAtMS4xLjktMiAyLTJoNmMxLjEgMCAyIC45IDIgMnY4eiIgLz48L2c+CjxnIGlkPSJleGl0LXRvLWFwcCI+PHBhdGggZD0iTTEwLjA5IDE1LjU5TDExLjUgMTdsNS01LTUtNS0xLjQxIDEuNDFMMTIuNjcgMTFIM3YyaDkuNjdsLTIuNTggMi41OXpNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2NGgyVjVoMTR2MTRINXYtNEgzdjRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLWxlc3MiPjxwYXRoIGQ9Ik0xMiA4bC02IDYgMS40MSAxLjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNHoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLW1vcmUiPjxwYXRoIGQ9Ik0xNi41OSA4LjU5TDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9ImV4cGxvcmUiPjxwYXRoIGQ9Ik0xMiAxMC45Yy0uNjEgMC0xLjEuNDktMS4xIDEuMXMuNDkgMS4xIDEuMSAxLjFjLjYxIDAgMS4xLS40OSAxLjEtMS4xcy0uNDktMS4xLTEuMS0xLjF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTIuMTkgMTIuMTlMNiAxOGwzLjgxLTguMTlMMTggNmwtMy44MSA4LjE5eiIgLz48L2c+CjxnIGlkPSJleHRlbnNpb24iPjxwYXRoIGQ9Ik0yMC41IDExSDE5VjdjMC0xLjEtLjktMi0yLTJoLTRWMy41QzEzIDIuMTIgMTEuODggMSAxMC41IDFTOCAyLjEyIDggMy41VjVINGMtMS4xIDAtMS45OS45LTEuOTkgMnYzLjhIMy41YzEuNDkgMCAyLjcgMS4yMSAyLjcgMi43cy0xLjIxIDIuNy0yLjcgMi43SDJWMjBjMCAxLjEuOSAyIDIgMmgzLjh2LTEuNWMwLTEuNDkgMS4yMS0yLjcgMi43LTIuNyAxLjQ5IDAgMi43IDEuMjEgMi43IDIuN1YyMkgxN2MxLjEgMCAyLS45IDItMnYtNGgxLjVjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjVTMjEuODggMTEgMjAuNSAxMXoiIC8+PC9nPgo8ZyBpZD0iZmFjZSI+PHBhdGggZD0iTTkgMTEuNzVjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1em02IDBjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1ek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOCAwLS4yOS4wMi0uNTguMDUtLjg2IDIuMzYtMS4wNSA0LjIzLTIuOTggNS4yMS01LjM3QzExLjA3IDguMzMgMTQuMDUgMTAgMTcuNDIgMTBjLjc4IDAgMS41My0uMDkgMi4yNS0uMjYuMjEuNzEuMzMgMS40Ny4zMyAyLjI2IDAgNC40MS0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJmYXZvcml0ZSI+PHBhdGggZD0iTTEyIDIxLjM1bC0xLjQ1LTEuMzJDNS40IDE1LjM2IDIgMTIuMjggMiA4LjUgMiA1LjQyIDQuNDIgMyA3LjUgM2MxLjc0IDAgMy40MS44MSA0LjUgMi4wOUMxMy4wOSAzLjgxIDE0Ljc2IDMgMTYuNSAzIDE5LjU4IDMgMjIgNS40MiAyMiA4LjVjMCAzLjc4LTMuNCA2Ljg2LTguNTUgMTEuNTRMMTIgMjEuMzV6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlLWJvcmRlciI+PHBhdGggZD0iTTE2LjUgM2MtMS43NCAwLTMuNDEuODEtNC41IDIuMDlDMTAuOTEgMy44MSA5LjI0IDMgNy41IDMgNC40MiAzIDIgNS40MiAyIDguNWMwIDMuNzggMy40IDYuODYgOC41NSAxMS41NEwxMiAyMS4zNWwxLjQ1LTEuMzJDMTguNiAxNS4zNiAyMiAxMi4yOCAyMiA4LjUgMjIgNS40MiAxOS41OCAzIDE2LjUgM3ptLTQuNCAxNS41NWwtLjEuMS0uMS0uMUM3LjE0IDE0LjI0IDQgMTEuMzkgNCA4LjUgNCA2LjUgNS41IDUgNy41IDVjMS41NCAwIDMuMDQuOTkgMy41NyAyLjM2aDEuODdDMTMuNDYgNS45OSAxNC45NiA1IDE2LjUgNWMyIDAgMy41IDEuNSAzLjUgMy41IDAgMi44OS0zLjE0IDUuNzQtNy45IDEwLjA1eiIgLz48L2c+CjxnIGlkPSJmZWVkYmFjayI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyAxMmgtMnYtMmgydjJ6bTAtNGgtMlY2aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iZmlsZS1kb3dubG9hZCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsZS11cGxvYWQiPjxwYXRoIGQ9Ik05IDE2aDZ2LTZoNGwtNy03LTcgN2g0em0tNCAyaDE0djJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsdGVyLWxpc3QiPjxwYXRoIGQ9Ik0xMCAxOGg0di0yaC00djJ6TTMgNnYyaDE4VjZIM3ptMyA3aDEydi0ySDZ2MnoiIC8+PC9nPgo8ZyBpZD0iZmluZC1pbi1wYWdlIj48cGF0aCBkPSJNMjAgMTkuNTlWOGwtNi02SDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMuNDUgMCAuODUtLjE1IDEuMTktLjRsLTQuNDMtNC40M2MtLjguNTItMS43NC44My0yLjc2LjgzLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNWMwIDEuMDItLjMxIDEuOTYtLjgzIDIuNzVMMjAgMTkuNTl6TTkgMTNjMCAxLjY2IDEuMzQgMyAzIDNzMy0xLjM0IDMtMy0xLjM0LTMtMy0zLTMgMS4zNC0zIDN6IiAvPjwvZz4KPGcgaWQ9ImZpbmQtcmVwbGFjZSI+PHBhdGggZD0iTTExIDZjMS4zOCAwIDIuNjMuNTYgMy41NCAxLjQ2TDEyIDEwaDZWNGwtMi4wNSAyLjA1QzE0LjY4IDQuNzggMTIuOTMgNCAxMSA0Yy0zLjUzIDAtNi40MyAyLjYxLTYuOTIgNkg2LjFjLjQ2LTIuMjggMi40OC00IDQuOS00em01LjY0IDkuMTRjLjY2LS45IDEuMTItMS45NyAxLjI4LTMuMTRIMTUuOWMtLjQ2IDIuMjgtMi40OCA0LTQuOSA0LTEuMzggMC0yLjYzLS41Ni0zLjU0LTEuNDZMMTAgMTJINHY2bDIuMDUtMi4wNUM3LjMyIDE3LjIyIDkuMDcgMTggMTEgMThjMS41NSAwIDIuOTgtLjUxIDQuMTQtMS4zNkwyMCAyMS40OSAyMS40OSAyMGwtNC44NS00Ljg2eiIgLz48L2c+CjxnIGlkPSJmaW5nZXJwcmludCI+PHBhdGggZD0iTTE3LjgxIDQuNDdjLS4wOCAwLS4xNi0uMDItLjIzLS4wNkMxNS42NiAzLjQyIDE0IDMgMTIuMDEgM2MtMS45OCAwLTMuODYuNDctNS41NyAxLjQxLS4yNC4xMy0uNTQuMDQtLjY4LS4yLS4xMy0uMjQtLjA0LS41NS4yLS42OEM3LjgyIDIuNTIgOS44NiAyIDEyLjAxIDJjMi4xMyAwIDMuOTkuNDcgNi4wMyAxLjUyLjI1LjEzLjM0LjQzLjIxLjY3LS4wOS4xOC0uMjYuMjgtLjQ0LjI4ek0zLjUgOS43MmMtLjEgMC0uMi0uMDMtLjI5LS4wOS0uMjMtLjE2LS4yOC0uNDctLjEyLS43Ljk5LTEuNCAyLjI1LTIuNSAzLjc1LTMuMjdDOS45OCA0LjA0IDE0IDQuMDMgMTcuMTUgNS42NWMxLjUuNzcgMi43NiAxLjg2IDMuNzUgMy4yNS4xNi4yMi4xMS41NC0uMTIuNy0uMjMuMTYtLjU0LjExLS43LS4xMi0uOS0xLjI2LTIuMDQtMi4yNS0zLjM5LTIuOTQtMi44Ny0xLjQ3LTYuNTQtMS40Ny05LjQuMDEtMS4zNi43LTIuNSAxLjctMy40IDIuOTYtLjA4LjE0LS4yMy4yMS0uMzkuMjF6bTYuMjUgMTIuMDdjLS4xMyAwLS4yNi0uMDUtLjM1LS4xNS0uODctLjg3LTEuMzQtMS40My0yLjAxLTIuNjQtLjY5LTEuMjMtMS4wNS0yLjczLTEuMDUtNC4zNCAwLTIuOTcgMi41NC01LjM5IDUuNjYtNS4zOXM1LjY2IDIuNDIgNS42NiA1LjM5YzAgLjI4LS4yMi41LS41LjVzLS41LS4yMi0uNS0uNWMwLTIuNDItMi4wOS00LjM5LTQuNjYtNC4zOS0yLjU3IDAtNC42NiAxLjk3LTQuNjYgNC4zOSAwIDEuNDQuMzIgMi43Ny45MyAzLjg1LjY0IDEuMTUgMS4wOCAxLjY0IDEuODUgMi40Mi4xOS4yLjE5LjUxIDAgLjcxLS4xMS4xLS4yNC4xNS0uMzcuMTV6bTcuMTctMS44NWMtMS4xOSAwLTIuMjQtLjMtMy4xLS44OS0xLjQ5LTEuMDEtMi4zOC0yLjY1LTIuMzgtNC4zOSAwLS4yOC4yMi0uNS41LS41cy41LjIyLjUuNWMwIDEuNDEuNzIgMi43NCAxLjk0IDMuNTYuNzEuNDggMS41NC43MSAyLjU0LjcxLjI0IDAgLjY0LS4wMyAxLjA0LS4xLjI3LS4wNS41My4xMy41OC40MS4wNS4yNy0uMTMuNTMtLjQxLjU4LS41Ny4xMS0xLjA3LjEyLTEuMjEuMTJ6TTE0LjkxIDIyYy0uMDQgMC0uMDktLjAxLS4xMy0uMDItMS41OS0uNDQtMi42My0xLjAzLTMuNzItMi4xLTEuNC0xLjM5LTIuMTctMy4yNC0yLjE3LTUuMjIgMC0xLjYyIDEuMzgtMi45NCAzLjA4LTIuOTQgMS43IDAgMy4wOCAxLjMyIDMuMDggMi45NCAwIDEuMDcuOTMgMS45NCAyLjA4IDEuOTRzMi4wOC0uODcgMi4wOC0xLjk0YzAtMy43Ny0zLjI1LTYuODMtNy4yNS02LjgzLTIuODQgMC01LjQ0IDEuNTgtNi42MSA0LjAzLS4zOS44MS0uNTkgMS43Ni0uNTkgMi44IDAgLjc4LjA3IDIuMDEuNjcgMy42MS4xLjI2LS4wMy41NS0uMjkuNjQtLjI2LjEtLjU1LS4wNC0uNjQtLjI5LS40OS0xLjMxLS43My0yLjYxLS43My0zLjk2IDAtMS4yLjIzLTIuMjkuNjgtMy4yNCAxLjMzLTIuNzkgNC4yOC00LjYgNy41MS00LjYgNC41NSAwIDguMjUgMy41MSA4LjI1IDcuODMgMCAxLjYyLTEuMzggMi45NC0zLjA4IDIuOTRzLTMuMDgtMS4zMi0zLjA4LTIuOTRjMC0xLjA3LS45My0xLjk0LTIuMDgtMS45NHMtMi4wOC44Ny0yLjA4IDEuOTRjMCAxLjcxLjY2IDMuMzEgMS44NyA0LjUxLjk1Ljk0IDEuODYgMS40NiAzLjI3IDEuODUuMjcuMDcuNDIuMzUuMzUuNjEtLjA1LjIzLS4yNi4zOC0uNDcuMzh6IiAvPjwvZz4KPGcgaWQ9ImZpcnN0LXBhZ2UiPjxwYXRoIGQ9Ik0xOC40MSAxNi41OUwxMy44MiAxMmw0LjU5LTQuNTlMMTcgNmwtNiA2IDYgNnpNNiA2aDJ2MTJINnoiIC8+PC9nPgo8ZyBpZD0iZmxhZyI+PHBhdGggZD0iTTE0LjQgNkwxNCA0SDV2MTdoMnYtN2g1LjZsLjQgMmg3VjZ6IiAvPjwvZz4KPGcgaWQ9ImZsaWdodC1sYW5kIj48cGF0aCBkPSJNMi41IDE5aDE5djJoLTE5em03LjE4LTUuNzNsNC4zNSAxLjE2IDUuMzEgMS40MmMuOC4yMSAxLjYyLS4yNiAxLjg0LTEuMDYuMjEtLjgtLjI2LTEuNjItMS4wNi0xLjg0bC01LjMxLTEuNDItMi43Ni05LjAyTDEwLjEyIDJ2OC4yOEw1LjE1IDguOTVsLS45My0yLjMyLTEuNDUtLjM5djUuMTdsMS42LjQzIDUuMzEgMS40M3oiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LXRha2VvZmYiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTE5LjU3LTkuMzZjLS4yMS0uOC0xLjA0LTEuMjgtMS44NC0xLjA2TDE0LjkyIDEwbC02LjktNi40My0xLjkzLjUxIDQuMTQgNy4xNy00Ljk3IDEuMzMtMS45Ny0xLjU0LTEuNDUuMzkgMS44MiAzLjE2Ljc3IDEuMzMgMS42LS40MyA1LjMxLTEuNDIgNC4zNS0xLjE2TDIxIDExLjQ5Yy44MS0uMjMgMS4yOC0xLjA1IDEuMDctMS44NXoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1iYWNrIj48cGF0aCBkPSJNOSA3SDd2MmgyVjd6bTAgNEg3djJoMnYtMnptMC04Yy0xLjExIDAtMiAuOS0yIDJoMlYzem00IDEyaC0ydjJoMnYtMnptNi0xMnYyaDJjMC0xLjEtLjktMi0yLTJ6bS02IDBoLTJ2MmgyVjN6TTkgMTd2LTJIN2MwIDEuMS44OSAyIDIgMnptMTAtNGgydi0yaC0ydjJ6bTAtNGgyVjdoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6TTUgN0gzdjEyYzAgMS4xLjg5IDIgMiAyaDEydi0ySDVWN3ptMTAtMmgyVjNoLTJ2MnptMCAxMmgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9ImZsaXAtdG8tZnJvbnQiPjxwYXRoIGQ9Ik0zIDEzaDJ2LTJIM3Yyem0wIDRoMnYtMkgzdjJ6bTIgNHYtMkgzYzAgMS4xLjg5IDIgMiAyek0zIDloMlY3SDN2MnptMTIgMTJoMnYtMmgtMnYyem00LTE4SDljLTEuMTEgMC0yIC45LTIgMnYxMGMwIDEuMS44OSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEySDlWNWgxMHYxMHptLTggNmgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlciI+PHBhdGggZD0iTTEwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMmgtOGwtMi0yeiIgLz48L2c+CjxnIGlkPSJmb2xkZXItb3BlbiI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0wIDEySDRWOGgxNnYxMHoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyLXNoYXJlZCI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0tNSAzYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptNCA4aC04di0xYzAtMS4zMyAyLjY3LTIgNC0yczQgLjY3IDQgMnYxeiIgLz48L2c+CjxnIGlkPSJmb250LWRvd25sb2FkIj48cGF0aCBkPSJNOS45MyAxMy41aDQuMTRMMTIgNy45OHpNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS00LjA1IDE2LjVsLTEuMTQtM0g5LjE3bC0xLjEyIDNINS45Nmw1LjExLTEzaDEuODZsNS4xMSAxM2gtMi4wOXoiIC8+PC9nPgo8ZyBpZD0iZm9yd2FyZCI+PHBhdGggZD0iTTEyIDhWNGw4IDgtOCA4di00SDRWOHoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbiI+PHBhdGggZD0iTTcgMTRINXY1aDV2LTJIN3YtM3ptLTItNGgyVjdoM1Y1SDV2NXptMTIgN2gtM3YyaDV2LTVoLTJ2M3pNMTQgNXYyaDN2M2gyVjVoLTV6IiAvPjwvZz4KPGcgaWQ9ImZ1bGxzY3JlZW4tZXhpdCI+PHBhdGggZD0iTTUgMTZoM3YzaDJ2LTVINXYyem0zLThINXYyaDVWNUg4djN6bTYgMTFoMnYtM2gzdi0yaC01djV6bTItMTFWNWgtMnY1aDVWOGgtM3oiIC8+PC9nPgo8ZyBpZD0iZy10cmFuc2xhdGUiPjxwYXRoIGQ9Ik0yMCA1aC05LjEyTDEwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTNjMCAxLjEuOSAyIDIgMmg3bDEgM2g4YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6TTcuMTcgMTQuNTljLTIuMjUgMC00LjA5LTEuODMtNC4wOS00LjA5czEuODMtNC4wOSA0LjA5LTQuMDljMS4wNCAwIDEuOTkuMzcgMi43NCAxLjA3bC4wNy4wNi0xLjIzIDEuMTgtLjA2LS4wNWMtLjI5LS4yNy0uNzgtLjU5LTEuNTItLjU5LTEuMzEgMC0yLjM4IDEuMDktMi4zOCAyLjQyczEuMDcgMi40MiAyLjM4IDIuNDJjMS4zNyAwIDEuOTYtLjg3IDIuMTItMS40Nkg3LjA4VjkuOTFoMy45NWwuMDEuMDdjLjA0LjIxLjA1LjQuMDUuNjEgMCAyLjM1LTEuNjEgNC0zLjkyIDR6bTYuMDMtMS43MWMuMzMuNi43NCAxLjE4IDEuMTkgMS43bC0uNTQuNTMtLjY1LTIuMjN6bS43Ny0uNzZoLS45OWwtLjMxLTEuMDRoMy45OXMtLjM0IDEuMzEtMS41NiAyLjc0Yy0uNTItLjYyLS44OS0xLjIzLTEuMTMtMS43ek0yMSAyMGMwIC41NS0uNDUgMS0xIDFoLTdsMi0yLS44MS0yLjc3LjkyLS45MkwxNy43OSAxOGwuNzMtLjczLTIuNzEtMi42OGMuOS0xLjAzIDEuNi0yLjI1IDEuOTItMy41MUgxOXYtMS4wNGgtMy42NFY5aC0xLjA0djEuMDRoLTEuOTZMMTEuMTggNkgyMGMuNTUgMCAxIC40NSAxIDF2MTN6IiAvPjwvZz4KPGcgaWQ9ImdhdmVsIj48cGF0aCBkPSJNMSAyMWgxMnYySDF6TTUuMjQ1IDguMDdsMi44My0yLjgyNyAxNC4xNCAxNC4xNDItMi44MjggMi44Mjh6TTEyLjMxNyAxbDUuNjU3IDUuNjU2LTIuODMgMi44My01LjY1NC01LjY2ek0zLjgyNSA5LjQ4NWw1LjY1NyA1LjY1Ny0yLjgyOCAyLjgyOC01LjY1Ny01LjY1N3oiIC8+PC9nPgo8ZyBpZD0iZ2VzdHVyZSI+PHBhdGggZD0iTTQuNTkgNi44OWMuNy0uNzEgMS40LTEuMzUgMS43MS0xLjIyLjUuMiAwIDEuMDMtLjMgMS41Mi0uMjUuNDItMi44NiAzLjg5LTIuODYgNi4zMSAwIDEuMjguNDggMi4zNCAxLjM0IDIuOTguNzUuNTYgMS43NC43MyAyLjY0LjQ2IDEuMDctLjMxIDEuOTUtMS40IDMuMDYtMi43NyAxLjIxLTEuNDkgMi44My0zLjQ0IDQuMDgtMy40NCAxLjYzIDAgMS42NSAxLjAxIDEuNzYgMS43OS0zLjc4LjY0LTUuMzggMy42Ny01LjM4IDUuMzcgMCAxLjcgMS40NCAzLjA5IDMuMjEgMy4wOSAxLjYzIDAgNC4yOS0xLjMzIDQuNjktNi4xSDIxdi0yLjVoLTIuNDdjLS4xNS0xLjY1LTEuMDktNC4yLTQuMDMtNC4yLTIuMjUgMC00LjE4IDEuOTEtNC45NCAyLjg0LS41OC43My0yLjA2IDIuNDgtMi4yOSAyLjcyLS4yNS4zLS42OC44NC0xLjExLjg0LS40NSAwLS43Mi0uODMtLjM2LTEuOTIuMzUtMS4wOSAxLjQtMi44NiAxLjg1LTMuNTIuNzgtMS4xNCAxLjMtMS45MiAxLjMtMy4yOEM4Ljk1IDMuNjkgNy4zMSAzIDYuNDQgMyA1LjEyIDMgMy45NyA0IDMuNzIgNC4yNWMtLjM2LjM2LS42Ni42Ni0uODguOTNsMS43NSAxLjcxem05LjI5IDExLjY2Yy0uMzEgMC0uNzQtLjI2LS43NC0uNzIgMC0uNi43My0yLjIgMi44Ny0yLjc2LS4zIDIuNjktMS40MyAzLjQ4LTIuMTMgMy40OHoiIC8+PC9nPgo8ZyBpZD0iZ2V0LWFwcCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZ2lmIj48cGF0aCBkPSJNMTEuNSA5SDEzdjZoLTEuNXpNOSA5SDZjLS42IDAtMSAuNS0xIDF2NGMwIC41LjQgMSAxIDFoM2MuNiAwIDEtLjUgMS0xdi0ySDguNXYxLjVoLTJ2LTNIMTBWMTBjMC0uNS0uNC0xLTEtMXptMTAgMS41VjloLTQuNXY2SDE2di0yaDJ2LTEuNWgtMnYtMXoiIC8+PC9nPgo8ZyBpZD0iZ3JhZGUiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0iZ3JvdXAtd29yayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6IiAvPjwvZz4KPGcgaWQ9ImhlbHAiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE3aC0ydi0yaDJ2MnptMi4wNy03Ljc1bC0uOS45MkMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xLjQ1LTIuMSAxLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0xLjEtLjktMi0yLTJzLTIgLjktMiAySDhjMC0yLjIxIDEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+PC9nPgo8ZyBpZD0iaGVscC1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMThoMnYtMmgtMnYyem0xLTE2QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMC0xNGMtMi4yMSAwLTQgMS43OS00IDRoMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgMi0zIDEuNzUtMyA1aDJjMC0yLjI1IDMtMi41IDMtNSAwLTIuMjEtMS43OS00LTQtNHoiIC8+PC9nPgo8ZyBpZD0iaGlnaGxpZ2h0LW9mZiI+PHBhdGggZD0iTTE0LjU5IDhMMTIgMTAuNTkgOS40MSA4IDggOS40MSAxMC41OSAxMiA4IDE0LjU5IDkuNDEgMTYgMTIgMTMuNDEgMTQuNTkgMTYgMTYgMTQuNTkgMTMuNDEgMTIgMTYgOS40MSAxNC41OSA4ek0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iaGlzdG9yeSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0iaG9tZSI+PHBhdGggZD0iTTEwIDIwdi02aDR2Nmg1di04aDNMMTIgMyAyIDEyaDN2OHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWVtcHR5Ij48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6bTEwIDE0LjVWMjBIOHYtMy41bDQtNCA0IDR6bS00LTVsLTQtNFY0aDh2My41bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImhvdXJnbGFzcy1mdWxsIj48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6IiAvPjwvZz4KPGcgaWQ9Imh0dHAiPjxwYXRoIGQ9Ik00LjUgMTFoLTJWOUgxdjZoMS41di0yLjVoMlYxNUg2VjlINC41djJ6bTIuNS0uNWgxLjVWMTVIMTB2LTQuNWgxLjVWOUg3djEuNXptNS41IDBIMTRWMTVoMS41di00LjVIMTdWOWgtNC41djEuNXptOS0xLjVIMTh2NmgxLjV2LTJoMmMuOCAwIDEuNS0uNyAxLjUtMS41di0xYzAtLjgtLjctMS41LTEuNS0xLjV6bTAgMi41aC0ydi0xaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iaHR0cHMiPjxwYXRoIGQ9Ik0xOCA4aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bS02IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyem0zLjEtOUg4LjlWNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYyeiIgLz48L2c+CjxnIGlkPSJpbXBvcnRhbnQtZGV2aWNlcyI+PHBhdGggZD0iTTIzIDExLjAxTDE4IDExYy0uNTUgMC0xIC40NS0xIDF2OWMwIC41NS40NSAxIDEgMWg1Yy41NSAwIDEtLjQ1IDEtMXYtOWMwLS41NS0uNDUtLjk5LTEtLjk5ek0yMyAyMGgtNXYtN2g1djd6TTIwIDJIMkMuODkgMiAwIDIuODkgMCA0djEyYzAgMS4xLjg5IDIgMiAyaDd2Mkg3djJoOHYtMmgtMnYtMmgydi0ySDJWNGgxOHY1aDJWNGMwLTEuMTEtLjktMi0yLTJ6bS04LjAzIDdMMTEgNmwtLjk3IDNIN2wyLjQ3IDEuNzYtLjk0IDIuOTEgMi40Ny0xLjggMi40NyAxLjgtLjk0LTIuOTFMMTUgOWgtMy4wM3oiIC8+PC9nPgo8ZyBpZD0iaW5ib3giPjxwYXRoIGQ9Ik0xOSAzSDQuOTljLTEuMTEgMC0xLjk4Ljg5LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjExLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHoiIC8+PC9nPgo8ZyBpZD0iaW5kZXRlcm1pbmF0ZS1jaGVjay1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTIgMTBIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJpbmZvIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtNmgydjZ6bTAtOGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5mby1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTdoMnYtNmgtMnY2em0xLTE1QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHpNMTEgOWgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5wdXQiPjxwYXRoIGQ9Ik0yMSAzLjAxSDNjLTEuMSAwLTIgLjktMiAyVjloMlY0Ljk5aDE4djE0LjAzSDNWMTVIMXY0LjAxYzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4di0xNGMwLTEuMTEtLjktMi0yLTJ6TTExIDE2bDQtNC00LTR2M0gxdjJoMTB2M3oiIC8+PC9nPgo8ZyBpZD0iaW52ZXJ0LWNvbG9ycyI+PHBhdGggZD0iTTE3LjY2IDcuOTNMMTIgMi4yNyA2LjM0IDcuOTNjLTMuMTIgMy4xMi0zLjEyIDguMTkgMCAxMS4zMUM3LjkgMjAuOCA5Ljk1IDIxLjU4IDEyIDIxLjU4YzIuMDUgMCA0LjEtLjc4IDUuNjYtMi4zNCAzLjEyLTMuMTIgMy4xMi04LjE5IDAtMTEuMzF6TTEyIDE5LjU5Yy0xLjYgMC0zLjExLS42Mi00LjI0LTEuNzZDNi42MiAxNi42OSA2IDE1LjE5IDYgMTMuNTlzLjYyLTMuMTEgMS43Ni00LjI0TDEyIDUuMXYxNC40OXoiIC8+PC9nPgo8ZyBpZD0ibGFiZWwiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2eiIgLz48L2c+CjxnIGlkPSJsYWJlbC1vdXRsaW5lIj48cGF0aCBkPSJNMTcuNjMgNS44NEMxNy4yNyA1LjMzIDE2LjY3IDUgMTYgNUw1IDUuMDFDMy45IDUuMDEgMyA1LjkgMyA3djEwYzAgMS4xLjkgMS45OSAyIDEuOTlMMTYgMTljLjY3IDAgMS4yNy0uMzMgMS42My0uODRMMjIgMTJsLTQuMzctNi4xNnpNMTYgMTdINVY3aDExbDMuNTUgNUwxNiAxN3oiIC8+PC9nPgo8ZyBpZD0ibGFuZ3VhZ2UiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem02LjkzIDZoLTIuOTVjLS4zMi0xLjI1LS43OC0yLjQ1LTEuMzgtMy41NiAxLjg0LjYzIDMuMzcgMS45MSA0LjMzIDMuNTZ6TTEyIDQuMDRjLjgzIDEuMiAxLjQ4IDIuNTMgMS45MSAzLjk2aC0zLjgyYy40My0xLjQzIDEuMDgtMi43NiAxLjkxLTMuOTZ6TTQuMjYgMTRDNC4xIDEzLjM2IDQgMTIuNjkgNCAxMnMuMS0xLjM2LjI2LTJoMy4zOGMtLjA4LjY2LS4xNCAxLjMyLS4xNCAyIDAgLjY4LjA2IDEuMzQuMTQgMkg0LjI2em0uODIgMmgyLjk1Yy4zMiAxLjI1Ljc4IDIuNDUgMS4zOCAzLjU2LTEuODQtLjYzLTMuMzctMS45LTQuMzMtMy41NnptMi45NS04SDUuMDhjLjk2LTEuNjYgMi40OS0yLjkzIDQuMzMtMy41NkM4LjgxIDUuNTUgOC4zNSA2Ljc1IDguMDMgOHpNMTIgMTkuOTZjLS44My0xLjItMS40OC0yLjUzLTEuOTEtMy45NmgzLjgyYy0uNDMgMS40My0xLjA4IDIuNzYtMS45MSAzLjk2ek0xNC4zNCAxNEg5LjY2Yy0uMDktLjY2LS4xNi0xLjMyLS4xNi0yIDAtLjY4LjA3LTEuMzUuMTYtMmg0LjY4Yy4wOS42NS4xNiAxLjMyLjE2IDIgMCAuNjgtLjA3IDEuMzQtLjE2IDJ6bS4yNSA1LjU2Yy42LTEuMTEgMS4wNi0yLjMxIDEuMzgtMy41NmgyLjk1Yy0uOTYgMS42NS0yLjQ5IDIuOTMtNC4zMyAzLjU2ek0xNi4zNiAxNGMuMDgtLjY2LjE0LTEuMzIuMTQtMiAwLS42OC0uMDYtMS4zNC0uMTQtMmgzLjM4Yy4xNi42NC4yNiAxLjMxLjI2IDJzLS4xIDEuMzYtLjI2IDJoLTMuMzh6IiAvPjwvZz4KPGcgaWQ9Imxhc3QtcGFnZSI+PHBhdGggZD0iTTUuNTkgNy40MUwxMC4xOCAxMmwtNC41OSA0LjU5TDcgMThsNi02LTYtNnpNMTYgNmgydjEyaC0yeiIgLz48L2c+CjxnIGlkPSJsYXVuY2giPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ibGlnaHRidWxiLW91dGxpbmUiPjxwYXRoIGQ9Ik05IDIxYzAgLjU1LjQ1IDEgMSAxaDRjLjU1IDAgMS0uNDUgMS0xdi0xSDl2MXptMy0xOUM4LjE0IDIgNSA1LjE0IDUgOWMwIDIuMzggMS4xOSA0LjQ3IDMgNS43NFYxN2MwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMXYtMi4yNmMxLjgxLTEuMjcgMy0zLjM2IDMtNS43NCAwLTMuODYtMy4xNC03LTctN3ptMi44NSAxMS4xbC0uODUuNlYxNmgtNHYtMi4zbC0uODUtLjZDNy44IDEyLjE2IDcgMTAuNjMgNyA5YzAtMi43NiAyLjI0LTUgNS01czUgMi4yNCA1IDVjMCAxLjYzLS44IDMuMTYtMi4xNSA0LjF6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtc3R5bGUiPjxwYXRoIGQ9Ik0zIDE2aDV2LTJIM3Yyem02LjUgMGg1di0yaC01djJ6bTYuNSAwaDV2LTJoLTV2MnpNMyAyMGgydi0ySDN2MnptNCAwaDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0zIDEyaDh2LTJIM3Yyem0xMCAwaDh2LTJoLTh2MnpNMyA0djRoMThWNEgzeiIgLz48L2c+CjxnIGlkPSJsaW5lLXdlaWdodCI+PHBhdGggZD0iTTMgMTdoMTh2LTJIM3Yyem0wIDNoMTh2LTFIM3Yxem0wLTdoMTh2LTNIM3Yzem0wLTl2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmsiPjxwYXRoIGQ9Ik0zLjkgMTJjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFoNFY3SDdjLTIuNzYgMC01IDIuMjQtNSA1czIuMjQgNSA1IDVoNHYtMS45SDdjLTEuNzEgMC0zLjEtMS4zOS0zLjEtMy4xek04IDEzaDh2LTJIOHYyem05LTZoLTR2MS45aDRjMS43MSAwIDMuMSAxLjM5IDMuMSAzLjFzLTEuMzkgMy4xLTMuMSAzLjFoLTRWMTdoNGMyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXoiIC8+PC9nPgo8ZyBpZD0ibGlzdCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTQgNGgxNHYtMkg3djJ6bTAgNGgxNHYtMkg3djJ6TTcgN3YyaDE0VjdIN3oiIC8+PC9nPgo8ZyBpZD0ibG9jayI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3BlbiI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNmgxLjljMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0wIDEySDZWMTBoMTJ2MTB6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3V0bGluZSI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6TTguOSA2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xczMuMSAxLjM5IDMuMSAzLjF2Mkg4LjlWNnpNMTggMjBINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG93LXByaW9yaXR5Ij48cGF0aCBkPSJNMTQgNWg4djJoLTh6bTAgNS41aDh2MmgtOHptMCA1LjVoOHYyaC04ek0yIDExLjVDMiAxNS4wOCA0LjkyIDE4IDguNSAxOEg5djJsMy0zLTMtM3YyaC0uNUM2LjAyIDE2IDQgMTMuOTggNCAxMS41UzYuMDIgNyA4LjUgN0gxMlY1SDguNUM0LjkyIDUgMiA3LjkyIDIgMTEuNXoiIC8+PC9nPgo8ZyBpZD0ibG95YWx0eSI+PHBhdGggZD0iTTIxLjQxIDExLjU4bC05LTlDMTIuMDUgMi4yMiAxMS41NSAyIDExIDJINGMtMS4xIDAtMiAuOS0yIDJ2N2MwIC41NS4yMiAxLjA1LjU5IDEuNDJsOSA5Yy4zNi4zNi44Ni41OCAxLjQxLjU4LjU1IDAgMS4wNS0uMjIgMS40MS0uNTlsNy03Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0uNTUtLjIzLTEuMDYtLjU5LTEuNDJ6TTUuNSA3QzQuNjcgNyA0IDYuMzMgNCA1LjVTNC42NyA0IDUuNSA0IDcgNC42NyA3IDUuNSA2LjMzIDcgNS41IDd6bTExLjc3IDguMjdMMTMgMTkuNTRsLTQuMjctNC4yN0M4LjI4IDE0LjgxIDggMTQuMTkgOCAxMy41YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41LjY5IDAgMS4zMi4yOCAxLjc3Ljc0bC43My43Mi43My0uNzNjLjQ1LS40NSAxLjA4LS43MyAxLjc3LS43MyAxLjM4IDAgMi41IDEuMTIgMi41IDIuNSAwIC42OS0uMjggMS4zMi0uNzMgMS43N3oiIC8+PC9nPgo8ZyBpZD0ibWFpbCI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCA0bC04IDUtOC01VjZsOCA1IDgtNXYyeiIgLz48L2c+CjxnIGlkPSJtYXJrdW5yZWFkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQtbWFpbGJveCI+PHBhdGggZD0iTTIwIDZIMTB2Nkg4VjRoNlYwSDZ2Nkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1lbnUiPjxwYXRoIGQ9Ik0zIDE4aDE4di0ySDN2MnptMC01aDE4di0ySDN2MnptMC03djJoMThWNkgzeiIgLz48L2c+CjxnIGlkPSJtb3JlLWhvcml6Ij48cGF0aCBkPSJNNiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyIDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW9yZS12ZXJ0Ij48cGF0aCBkPSJNMTIgOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTAgMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1vdG9yY3ljbGUiPjxwYXRoIGQ9Ik0xOS40NCA5LjAzTDE1LjQxIDVIMTF2MmgzLjU5bDIgMkg1Yy0yLjggMC01IDIuMi01IDVzMi4yIDUgNSA1YzIuNDYgMCA0LjQ1LTEuNjkgNC45LTRoMS42NWwyLjc3LTIuNzdjLS4yMS41NC0uMzIgMS4xNC0uMzIgMS43NyAwIDIuOCAyLjIgNSA1IDVzNS0yLjIgNS01YzAtMi42NS0xLjk3LTQuNzctNC41Ni00Ljk3ek03LjgyIDE1QzcuNCAxNi4xNSA2LjI4IDE3IDUgMTdjLTEuNjMgMC0zLTEuMzctMy0zczEuMzctMyAzLTNjMS4yOCAwIDIuNC44NSAyLjgyIDJINXYyaDIuODJ6TTE5IDE3Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0ibW92ZS10by1pbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguOS0xLjk4IDJMMyAxOWMwIDEuMS44OCAyIDEuOTkgMkgxOWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHptLTMtNWgtMlY3aC00djNIOGw0IDQgNC00eiIgLz48L2c+CjxnIGlkPSJuZXh0LXdlZWsiPjxwYXRoIGQ9Ik0yMCA3aC00VjVjMC0uNTUtLjIyLTEuMDUtLjU5LTEuNDFDMTUuMDUgMy4yMiAxNC41NSAzIDE0IDNoLTRjLTEuMSAwLTIgLjktMiAydjJINGMtMS4xIDAtMiAuOS0yIDJ2MTFjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY5YzAtMS4xLS45LTItMi0yek0xMCA1aDR2MmgtNFY1em0xIDEzLjVsLTEtMSAzLTMtMy0zIDEtMSA0IDQtNCA0eiIgLz48L2c+CjxnIGlkPSJub3RlLWFkZCI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptMiAxNGgtM3YzaC0ydi0zSDh2LTJoM3YtM2gydjNoM3Yyem0tMy03VjMuNUwxOC41IDlIMTN6IiAvPjwvZz4KPGcgaWQ9Im9mZmxpbmUtcGluIj48cGF0aCBkPSJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJ6bTUgMTZIN3YtMmgxMHYyem0tNi43LTRMNyAxMC43bDEuNC0xLjQgMS45IDEuOSA1LjMtNS4zTDE3IDcuMyAxMC4zIDE0eiIgLz48L2c+CjxnIGlkPSJvcGFjaXR5Ij48cGF0aCBkPSJNMTcuNjYgOEwxMiAyLjM1IDYuMzQgOEM0Ljc4IDkuNTYgNCAxMS42NCA0IDEzLjY0cy43OCA0LjExIDIuMzQgNS42NyAzLjYxIDIuMzUgNS42NiAyLjM1IDQuMS0uNzkgNS42Ni0yLjM1UzIwIDE1LjY0IDIwIDEzLjY0IDE5LjIyIDkuNTYgMTcuNjYgOHpNNiAxNGMuMDEtMiAuNjItMy4yNyAxLjc2LTQuNEwxMiA1LjI3bDQuMjQgNC4zOEMxNy4zOCAxMC43NyAxNy45OSAxMiAxOCAxNEg2eiIgLz48L2c+CjxnIGlkPSJvcGVuLWluLWJyb3dzZXIiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg0di0ySDVWOGgxNHYxMGgtNHYyaDRjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uODktMi0yLTJ6bS03IDZsLTQgNGgzdjZoMnYtNmgzbC00LTR6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tbmV3Ij48cGF0aCBkPSJNMTkgMTlINVY1aDdWM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTdoLTJ2N3pNMTQgM3YyaDMuNTlsLTkuODMgOS44MyAxLjQxIDEuNDFMMTkgNi40MVYxMGgyVjNoLTd6IiAvPjwvZz4KPGcgaWQ9Im9wZW4td2l0aCI+PHBhdGggZD0iTTEwIDloNFY2aDNsLTUtNS01IDVoM3Yzem0tMSAxSDZWN2wtNSA1IDUgNXYtM2gzdi00em0xNCAybC01LTV2M2gtM3Y0aDN2M2w1LTV6bS05IDNoLTR2M0g3bDUgNSA1LTVoLTN2LTN6IiAvPjwvZz4KPGcgaWQ9InBhZ2V2aWV3Ij48cGF0aCBkPSJNMTEuNSA5QzEwLjEyIDkgOSAxMC4xMiA5IDExLjVzMS4xMiAyLjUgMi41IDIuNSAyLjUtMS4xMiAyLjUtMi41UzEyLjg4IDkgMTEuNSA5ek0yMCA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTMuMjEgMTQuMjFsLTIuOTEtMi45MWMtLjY5LjQ0LTEuNTEuNy0yLjM5LjdDOS4wMSAxNiA3IDEzLjk5IDcgMTEuNVM5LjAxIDcgMTEuNSA3IDE2IDkuMDEgMTYgMTEuNWMwIC44OC0uMjYgMS42OS0uNyAyLjM5bDIuOTEgMi45LTEuNDIgMS40MnoiIC8+PC9nPgo8ZyBpZD0icGFuLXRvb2wiPjxwYXRoIGQ9Ik0yMyA1LjVWMjBjMCAyLjItMS44IDQtNCA0aC03LjNjLTEuMDggMC0yLjEtLjQzLTIuODUtMS4xOUwxIDE0LjgzczEuMjYtMS4yMyAxLjMtMS4yNWMuMjItLjE5LjQ5LS4yOS43OS0uMjkuMjIgMCAuNDIuMDYuNi4xNi4wNC4wMSA0LjMxIDIuNDYgNC4zMSAyLjQ2VjRjMC0uODMuNjctMS41IDEuNS0xLjVTMTEgMy4xNyAxMSA0djdoMVYxLjVjMC0uODMuNjctMS41IDEuNS0xLjVTMTUgLjY3IDE1IDEuNVYxMWgxVjIuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNVYxMWgxVjUuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGF5bWVudCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0icGVybS1jYW1lcmEtbWljIj48cGF0aCBkPSJNMjAgNWgtMy4xN0wxNSAzSDlMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoN3YtMi4wOWMtMi44My0uNDgtNS0yLjk0LTUtNS45MWgyYzAgMi4yMSAxLjc5IDQgNCA0czQtMS43OSA0LTRoMmMwIDIuOTctMi4xNyA1LjQzLTUgNS45MVYyMWg3YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bS02IDhjMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yVjljMC0xLjEuOS0yIDItMnMyIC45IDIgMnY0eiIgLz48L2c+CjxnIGlkPSJwZXJtLWNvbnRhY3QtY2FsZW5kYXIiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxeiIgLz48L2c+CjxnIGlkPSJwZXJtLWRhdGEtc2V0dGluZyI+PHBhdGggZD0iTTE4Ljk5IDExLjVjLjM0IDAgLjY3LjAzIDEgLjA3TDIwIDAgMCAyMGgxMS41NmMtLjA0LS4zMy0uMDctLjY2LS4wNy0xIDAtNC4xNCAzLjM2LTcuNSA3LjUtNy41em0zLjcxIDcuOTljLjAyLS4xNi4wNC0uMzIuMDQtLjQ5IDAtLjE3LS4wMS0uMzMtLjA0LS40OWwxLjA2LS44M2MuMDktLjA4LjEyLS4yMS4wNi0uMzJsLTEtMS43M2MtLjA2LS4xMS0uMTktLjE1LS4zMS0uMTFsLTEuMjQuNWMtLjI2LS4yLS41NC0uMzctLjg1LS40OWwtLjE5LTEuMzJjLS4wMS0uMTItLjEyLS4yMS0uMjQtLjIxaC0yYy0uMTIgMC0uMjMuMDktLjI1LjIxbC0uMTkgMS4zMmMtLjMuMTMtLjU5LjI5LS44NS40OWwtMS4yNC0uNWMtLjExLS4wNC0uMjQgMC0uMzEuMTFsLTEgMS43M2MtLjA2LjExLS4wNC4yNC4wNi4zMmwxLjA2LjgzYy0uMDIuMTYtLjAzLjMyLS4wMy40OSAwIC4xNy4wMS4zMy4wMy40OWwtMS4wNi44M2MtLjA5LjA4LS4xMi4yMS0uMDYuMzJsMSAxLjczYy4wNi4xMS4xOS4xNS4zMS4xMWwxLjI0LS41Yy4yNi4yLjU0LjM3Ljg1LjQ5bC4xOSAxLjMyYy4wMi4xMi4xMi4yMS4yNS4yMWgyYy4xMiAwIC4yMy0uMDkuMjUtLjIxbC4xOS0xLjMyYy4zLS4xMy41OS0uMjkuODQtLjQ5bDEuMjUuNWMuMTEuMDQuMjQgMCAuMzEtLjExbDEtMS43M2MuMDYtLjExLjAzLS4yNC0uMDYtLjMybC0xLjA3LS44M3ptLTMuNzEgMS4wMWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGV2aWNlLWluZm9ybWF0aW9uIj48cGF0aCBkPSJNMTMgN2gtMnYyaDJWN3ptMCA0aC0ydjZoMnYtNnptNC05Ljk5TDcgMWMtMS4xIDAtMiAuOS0yIDJ2MThjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0taWRlbnRpdHkiPjxwYXRoIGQ9Ik0xMiA1LjljMS4xNiAwIDIuMS45NCAyLjEgMi4xcy0uOTQgMi4xLTIuMSAyLjFTOS45IDkuMTYgOS45IDhzLjk0LTIuMSAyLjEtMi4xbTAgOWMyLjk3IDAgNi4xIDEuNDYgNi4xIDIuMXYxLjFINS45VjE3YzAtLjY0IDMuMTMtMi4xIDYuMS0yLjFNMTIgNEM5Ljc5IDQgOCA1Ljc5IDggOHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMCA5Yy0yLjY3IDAtOCAxLjM0LTggNHYzaDE2di0zYzAtMi42Ni01LjMzLTQtOC00eiIgLz48L2c+CjxnIGlkPSJwZXJtLW1lZGlhIj48cGF0aCBkPSJNMiA2SDB2NWguMDFMMCAyMGMwIDEuMS45IDIgMiAyaDE4di0ySDJWNnptMjAtMmgtOGwtMi0ySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6TTcgMTVsNC41LTYgMy41IDQuNTEgMi41LTMuMDFMMjEgMTVIN3oiIC8+PC9nPgo8ZyBpZD0icGVybS1waG9uZS1tc2ciPjxwYXRoIGQ9Ik0yMCAxNS41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTIgM3YxMGwzLTNoNlYzaC05eiIgLz48L2c+CjxnIGlkPSJwZXJtLXNjYW4td2lmaSI+PHBhdGggZD0iTTEyIDNDNi45NSAzIDMuMTUgNC44NSAwIDcuMjNMMTIgMjIgMjQgNy4yNUMyMC44NSA0Ljg3IDE3LjA1IDMgMTIgM3ptMSAxM2gtMnYtNmgydjZ6bS0yLThWNmgydjJoLTJ6IiAvPjwvZz4KPGcgaWQ9InBldHMiPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjkiIGN5PSI1LjUiIHI9IjIuNSIgLz48Y2lyY2xlIGN4PSIxNSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE5LjUiIGN5PSI5LjUiIHI9IjIuNSIgLz48cGF0aCBkPSJNMTcuMzQgMTQuODZjLS44Ny0xLjAyLTEuNi0xLjg5LTIuNDgtMi45MS0uNDYtLjU0LTEuMDUtMS4wOC0xLjc1LTEuMzItLjExLS4wNC0uMjItLjA3LS4zMy0uMDktLjI1LS4wNC0uNTItLjA0LS43OC0uMDRzLS41MyAwLS43OS4wNWMtLjExLjAyLS4yMi4wNS0uMzMuMDktLjcuMjQtMS4yOC43OC0xLjc1IDEuMzItLjg3IDEuMDItMS42IDEuODktMi40OCAyLjkxLTEuMzEgMS4zMS0yLjkyIDIuNzYtMi42MiA0Ljc5LjI5IDEuMDIgMS4wMiAyLjAzIDIuMzMgMi4zMi43My4xNSAzLjA2LS40NCA1LjU0LS40NGguMThjMi40OCAwIDQuODEuNTggNS41NC40NCAxLjMxLS4yOSAyLjA0LTEuMzEgMi4zMy0yLjMyLjMxLTIuMDQtMS4zLTMuNDktMi42MS00Ljh6IiAvPjwvZz4KPGcgaWQ9InBpY3R1cmUtaW4tcGljdHVyZSI+PHBhdGggZD0iTTE5IDdoLTh2Nmg4Vjd6bTItNEgzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDEuOTggMiAxLjk4aDE4YzEuMSAwIDItLjg4IDItMS45OFY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OGgxOHYxNC4wM3oiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlLWFsdCI+PHBhdGggZD0iTTE5IDExaC04djZoOHYtNnptNCA4VjQuOThDMjMgMy44OCAyMi4xIDMgMjEgM0gzYy0xLjEgMC0yIC44OC0yIDEuOThWMTljMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnptLTIgLjAySDNWNC45N2gxOHYxNC4wNXoiIC8+PC9nPgo8ZyBpZD0icGxheS1mb3Itd29yayI+PHBhdGggZD0iTTExIDV2NS41OUg3LjVsNC41IDQuNSA0LjUtNC41SDEzVjVoLTJ6bS01IDljMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmgtMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNEg2eiIgLz48L2c+CjxnIGlkPSJwb2x5bWVyIj48cGF0aCBkPSJNMTkgNGgtNEw3LjExIDE2LjYzIDQuNSAxMiA5IDRINUwuNSAxMiA1IDIwaDRsNy44OS0xMi42M0wxOS41IDEyIDE1IDIwaDRsNC41LTh6IiAvPjwvZz4KPGcgaWQ9InBvd2VyLXNldHRpbmdzLW5ldyI+PHBhdGggZD0iTTEzIDNoLTJ2MTBoMlYzem00LjgzIDIuMTdsLTEuNDIgMS40MkMxNy45OSA3Ljg2IDE5IDkuODEgMTkgMTJjMCAzLjg3LTMuMTMgNy03IDdzLTctMy4xMy03LTdjMC0yLjE5IDEuMDEtNC4xNCAyLjU4LTUuNDJMNi4xNyA1LjE3QzQuMjMgNi44MiAzIDkuMjYgMyAxMmMwIDQuOTcgNC4wMyA5IDkgOXM5LTQuMDMgOS05YzAtMi43NC0xLjIzLTUuMTgtMy4xNy02LjgzeiIgLz48L2c+CjxnIGlkPSJwcmVnbmFudC13b21hbiI+PHBhdGggZD0iTTkgNGMwLTEuMTEuODktMiAyLTJzMiAuODkgMiAyLS44OSAyLTIgMi0yLS44OS0yLTJ6bTcgOWMtLjAxLTEuMzQtLjgzLTIuNTEtMi0zIDAtMS42Ni0xLjM0LTMtMy0zcy0zIDEuMzQtMyAzdjdoMnY1aDN2LTVoM3YtNHoiIC8+PC9nPgo8ZyBpZD0icHJpbnQiPjxwYXRoIGQ9Ik0xOSA4SDVjLTEuNjYgMC0zIDEuMzQtMyAzdjZoNHY0aDEydi00aDR2LTZjMC0xLjY2LTEuMzQtMy0zLTN6bS0zIDExSDh2LTVoOHY1em0zLTdjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptLTEtOUg2djRoMTJWM3oiIC8+PC9nPgo8ZyBpZD0icXVlcnktYnVpbGRlciI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0icXVlc3Rpb24tYW5zd2VyIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi1jaGVja2VkIj48cGF0aCBkPSJNMTIgN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNSA1LTIuMjQgNS01LTIuMjQtNS01LTV6bTAtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVjZWlwdCI+PHBhdGggZD0iTTE4IDE3SDZ2LTJoMTJ2MnptMC00SDZ2LTJoMTJ2MnptMC00SDZWN2gxMnYyek0zIDIybDEuNS0xLjVMNiAyMmwxLjUtMS41TDkgMjJsMS41LTEuNUwxMiAyMmwxLjUtMS41TDE1IDIybDEuNS0xLjVMMTggMjJsMS41LTEuNUwyMSAyMlYybC0xLjUgMS41TDE4IDJsLTEuNSAxLjVMMTUgMmwtMS41IDEuNUwxMiAybC0xLjUgMS41TDkgMiA3LjUgMy41IDYgMiA0LjUgMy41IDMgMnYyMHoiIC8+PC9nPgo8ZyBpZD0icmVjb3JkLXZvaWNlLW92ZXIiPjxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSI0IiAvPjxwYXRoIGQ9Ik05IDE1Yy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00em03Ljc2LTkuNjRsLTEuNjggMS42OWMuODQgMS4xOC44NCAyLjcxIDAgMy44OWwxLjY4IDEuNjljMi4wMi0yLjAyIDIuMDItNS4wNyAwLTcuMjd6TTIwLjA3IDJsLTEuNjMgMS42M2MyLjc3IDMuMDIgMi43NyA3LjU2IDAgMTAuNzRMMjAuMDcgMTZjMy45LTMuODkgMy45MS05Ljk1IDAtMTR6IiAvPjwvZz4KPGcgaWQ9InJlZGVlbSI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJyZWRvIj48cGF0aCBkPSJNMTguNCAxMC42QzE2LjU1IDguOTkgMTQuMTUgOCAxMS41IDhjLTQuNjUgMC04LjU4IDMuMDMtOS45NiA3LjIyTDMuOSAxNmMxLjA1LTMuMTkgNC4wNS01LjUgNy42LTUuNSAxLjk1IDAgMy43My43MiA1LjEyIDEuODhMMTMgMTZoOVY3bC0zLjYgMy42eiIgLz48L2c+CjxnIGlkPSJyZWZyZXNoIj48cGF0aCBkPSJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZSI+PHBhdGggZD0iTTE5IDEzSDV2LTJoMTR2MnoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik03IDExdjJoMTB2LTJIN3ptNS05QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLXNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik0yMi43MyAyMi43M0wyLjc3IDIuNzcgMiAybC0uNzMtLjczTDAgMi41NGw0LjM5IDQuMzkgMi4yMSA0LjY2LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmg3LjQ2bDEuMzggMS4zOGMtLjUuMzYtLjgzLjk1LS44MyAxLjYyIDAgMS4xLjg5IDIgMS45OSAyIC42NyAwIDEuMjYtLjMzIDEuNjItLjg0TDIxLjQ2IDI0bDEuMjctMS4yN3pNNy40MiAxNWMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDIuMzZsMiAySDcuNDJ6bTguMTMtMmMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINi41NGw5LjAxIDl6TTcgMThjLTEuMSAwLTEuOTkuOS0xLjk5IDJTNS45IDIyIDcgMjJzMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InJlb3JkZXIiPjxwYXRoIGQ9Ik0zIDE1aDE4di0ySDN2MnptMCA0aDE4di0ySDN2MnptMC04aDE4VjlIM3Yyem0wLTZ2MmgxOFY1SDN6IiAvPjwvZz4KPGcgaWQ9InJlcGx5Ij48cGF0aCBkPSJNMTAgOVY1bC03IDcgNyA3di00LjFjNSAwIDguNSAxLjYgMTEgNS4xLTEtNS00LTEwLTExLTExeiIgLz48L2c+CjxnIGlkPSJyZXBseS1hbGwiPjxwYXRoIGQ9Ik03IDhWNWwtNyA3IDcgN3YtM2wtNC00IDQtNHptNiAxVjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydCI+PHBhdGggZD0iTTE1LjczIDNIOC4yN0wzIDguMjd2Ny40Nkw4LjI3IDIxaDcuNDZMMjEgMTUuNzNWOC4yN0wxNS43MyAzek0xMiAxNy4zYy0uNzIgMC0xLjMtLjU4LTEuMy0xLjMgMC0uNzIuNTgtMS4zIDEuMy0xLjMuNzIgMCAxLjMuNTggMS4zIDEuMyAwIC43Mi0uNTggMS4zLTEuMyAxLjN6bTEtNC4zaC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJyZXBvcnQtcHJvYmxlbSI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZS1wYWdlIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0tMiAxNmMtMi4wNSAwLTMuODEtMS4yNC00LjU4LTNoMS43MWMuNjMuOSAxLjY4IDEuNSAyLjg3IDEuNSAxLjkzIDAgMy41LTEuNTcgMy41LTMuNVMxMy45MyA5LjUgMTIgOS41Yy0xLjM1IDAtMi41Mi43OC0zLjEgMS45bDEuNiAxLjZoLTRWOWwxLjMgMS4zQzguNjkgOC45MiAxMC4yMyA4IDEyIDhjMi43NiAwIDUgMi4yNCA1IDVzLTIuMjQgNS01IDV6IiAvPjwvZz4KPGcgaWQ9InJvb20iPjxwYXRoIGQ9Ik0xMiAyQzguMTMgMiA1IDUuMTMgNSA5YzAgNS4yNSA3IDEzIDcgMTNzNy03Ljc1IDctMTNjMC0zLjg3LTMuMTMtNy03LTd6bTAgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0icm91bmRlZC1jb3JuZXIiPjxwYXRoIGQ9Ik0xOSAxOWgydjJoLTJ2LTJ6bTAtMmgydi0yaC0ydjJ6TTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTAtNGgyVjNIM3Yyem00IDBoMlYzSDd2MnptOCAxNmgydi0yaC0ydjJ6bS00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem0tOCAwaDJ2LTJIN3Yyem0tNCAwaDJ2LTJIM3Yyek0yMSA4YzAtMi43Ni0yLjI0LTUtNS01aC01djJoNWMxLjY1IDAgMyAxLjM1IDMgM3Y1aDJWOHoiIC8+PC9nPgo8ZyBpZD0icm93aW5nIj48cGF0aCBkPSJNOC41IDE0LjVMNCAxOWwxLjUgMS41TDkgMTdoMmwtMi41LTIuNXpNMTUgMWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTYgMjAuMDFMMTggMjRsLTIuOTktMy4wMVYxOS41bC03LjEtNy4wOWMtLjMxLjA1LS42MS4wNy0uOTEuMDd2LTIuMTZjMS42Ni4wMyAzLjYxLS44NyA0LjY3LTIuMDRsMS40LTEuNTVjLjE5LS4yMS40My0uMzguNjktLjUuMjktLjE0LjYyLS4yMy45Ni0uMjNoLjAzQzE1Ljk5IDYuMDEgMTcgNy4wMiAxNyA4LjI2djUuNzVjMCAuODQtLjM1IDEuNjEtLjkyIDIuMTZsLTMuNTgtMy41OHYtMi4yN2MtLjYzLjUyLTEuNDMgMS4wMi0yLjI5IDEuMzlMMTYuNSAxOEgxOGwzIDMuMDF6IiAvPjwvZz4KPGcgaWQ9InNhdmUiPjxwYXRoIGQ9Ik0xNyAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY3bC00LTR6bS01IDE2Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMy0xMEg1VjVoMTB2NHoiIC8+PC9nPgo8ZyBpZD0ic2NoZWR1bGUiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bS41LTEzSDExdjZsNS4yNSAzLjE1Ljc1LTEuMjMtNC41LTIuNjd6IiAvPjwvZz4KPGcgaWQ9InNlYXJjaCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6IiAvPjwvZz4KPGcgaWQ9InNlbGVjdC1hbGwiPjxwYXRoIGQ9Ik0zIDVoMlYzYy0xLjEgMC0yIC45LTIgMnptMCA4aDJ2LTJIM3Yyem00IDhoMnYtMkg3djJ6TTMgOWgyVjdIM3Yyem0xMC02aC0ydjJoMlYzem02IDB2MmgyYzAtMS4xLS45LTItMi0yek01IDIxdi0ySDNjMCAxLjEuOSAyIDIgMnptLTItNGgydi0ySDN2MnpNOSAzSDd2MmgyVjN6bTIgMThoMnYtMmgtMnYyem04LThoMnYtMmgtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC0xMmgyVjdoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQgNGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6TTcgMTdoMTBWN0g3djEwem0yLThoNnY2SDlWOXoiIC8+PC9nPgo8ZyBpZD0ic2VuZCI+PHBhdGggZD0iTTIuMDEgMjFMMjMgMTIgMi4wMSAzIDIgMTBsMTUgMi0xNSAyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncyI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWFwcGxpY2F0aW9ucyI+PHBhdGggZD0iTTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNy03SDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS0xLjc1IDljMCAuMjMtLjAyLjQ2LS4wNS42OGwxLjQ4IDEuMTZjLjEzLjExLjE3LjMuMDguNDVsLTEuNCAyLjQyYy0uMDkuMTUtLjI3LjIxLS40My4xNWwtMS43NC0uN2MtLjM2LjI4LS43Ni41MS0xLjE4LjY5bC0uMjYgMS44NWMtLjAzLjE3LS4xOC4zLS4zNS4zaC0yLjhjLS4xNyAwLS4zMi0uMTMtLjM1LS4yOWwtLjI2LTEuODVjLS40My0uMTgtLjgyLS40MS0xLjE4LS42OWwtMS43NC43Yy0uMTYuMDYtLjM0IDAtLjQzLS4xNWwtMS40LTIuNDJjLS4wOS0uMTUtLjA1LS4zNC4wOC0uNDVsMS40OC0xLjE2Yy0uMDMtLjIzLS4wNS0uNDYtLjA1LS42OSAwLS4yMy4wMi0uNDYuMDUtLjY4bC0xLjQ4LTEuMTZjLS4xMy0uMTEtLjE3LS4zLS4wOC0uNDVsMS40LTIuNDJjLjA5LS4xNS4yNy0uMjEuNDMtLjE1bDEuNzQuN2MuMzYtLjI4Ljc2LS41MSAxLjE4LS42OWwuMjYtMS44NWMuMDMtLjE3LjE4LS4zLjM1LS4zaDIuOGMuMTcgMCAuMzIuMTMuMzUuMjlsLjI2IDEuODVjLjQzLjE4LjgyLjQxIDEuMTguNjlsMS43NC0uN2MuMTYtLjA2LjM0IDAgLjQzLjE1bDEuNCAyLjQyYy4wOS4xNS4wNS4zNC0uMDguNDVsLTEuNDggMS4xNmMuMDMuMjMuMDUuNDYuMDUuNjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJhY2t1cC1yZXN0b3JlIj48cGF0aCBkPSJNMTQgMTJjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAyIC45IDIgMiAyIDItLjkgMi0yem0tMi05Yy00Ljk3IDAtOSA0LjAzLTkgOUgwbDQgNCA0LTRINWMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuNTEgMC0yLjkxLS40OS00LjA2LTEuM2wtMS40MiAxLjQ0QzguMDQgMjAuMyA5Ljk0IDIxIDEyIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ibHVldG9vdGgiPjxwYXRoIGQ9Ik0xMSAyNGgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6bTggMGgydi0yaC0ydjJ6bTIuNzEtMTguMjlMMTIgMGgtMXY3LjU5TDYuNDEgMyA1IDQuNDEgMTAuNTkgMTAgNSAxNS41OSA2LjQxIDE3IDExIDEyLjQxVjIwaDFsNS43MS01LjcxLTQuMy00LjI5IDQuMy00LjI5ek0xMyAzLjgzbDEuODggMS44OEwxMyA3LjU5VjMuODN6bTEuODggMTAuNDZMMTMgMTYuMTd2LTMuNzZsMS44OCAxLjg4eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1icmlnaHRuZXNzIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyek04IDE2aDIuNWwxLjUgMS41IDEuNS0xLjVIMTZ2LTIuNWwxLjUtMS41LTEuNS0xLjVWOGgtMi41TDEyIDYuNSAxMC41IDhIOHYyLjVMNi41IDEyIDggMTMuNVYxNnptNC03YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzVjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWNlbGwiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0xNiAuMDFMOCAwQzYuOSAwIDYgLjkgNiAydjE2YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNiAxNkg4VjRoOHYxMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtZXRoZXJuZXQiPjxwYXRoIGQ9Ik03Ljc3IDYuNzZMNi4yMyA1LjQ4LjgyIDEybDUuNDEgNi41MiAxLjU0LTEuMjhMMy40MiAxMmw0LjM1LTUuMjR6TTcgMTNoMnYtMkg3djJ6bTEwLTJoLTJ2Mmgydi0yem0tNiAyaDJ2LTJoLTJ2MnptNi43Ny03LjUybC0xLjU0IDEuMjhMMjAuNTggMTJsLTQuMzUgNS4yNCAxLjU0IDEuMjhMMjMuMTggMTJsLTUuNDEtNi41MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtYW50ZW5uYSI+PHBhdGggZD0iTTEyIDVjLTMuODcgMC03IDMuMTMtNyA3aDJjMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xIDkuMjljLjg4LS4zOSAxLjUtMS4yNiAxLjUtMi4yOSAwLTEuMzgtMS4xMi0yLjUtMi41LTIuNVM5LjUgMTAuNjIgOS41IDEyYzAgMS4wMi42MiAxLjkgMS41IDIuMjl2My4zTDcuNTkgMjEgOSAyMi40MWwzLTMgMyAzTDE2LjQxIDIxIDEzIDE3LjU5di0zLjN6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyaDJjMC00Ljk3IDQuMDMtOSA5LTlzOSA0LjAzIDkgOWgyYzAtNi4wNy00LjkzLTExLTExLTExeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1jb21wb25lbnQiPjxwYXRoIGQ9Ik01IDJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEgxdjZoNlY2SDVWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMkg5djJ6bS04IDBjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4QzYuMTYgMTguNCA3IDE3LjMgNyAxNnYtMkgxdjJ6TTIxIDZWMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0aC0ydjZoNlY2aC0yem0tOC00YzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIOXY2aDZWNmgtMlYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0yaC02djJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvc2l0ZSI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtaGRtaSI+PHBhdGggZD0iTTE4IDdWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYzSDV2NmwzIDZ2M2g4di0zbDMtNlY3aC0xek04IDRoOHYzaC0yVjVoLTF2MmgtMlY1aC0xdjJIOFY0eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1zdmlkZW8iPjxwYXRoIGQ9Ik04IDExLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41UzUgMTAuNjcgNSAxMS41IDUuNjcgMTMgNi41IDEzIDggMTIuMzMgOCAxMS41em03LTVjMC0uODMtLjY3LTEuNS0xLjUtMS41aC0zQzkuNjcgNSA5IDUuNjcgOSA2LjVTOS42NyA4IDEwLjUgOGgzYy44MyAwIDEuNS0uNjcgMS41LTEuNXpNOC41IDE1Yy0uODMgMC0xLjUuNjctMS41IDEuNVM3LjY3IDE4IDguNSAxOHMxLjUtLjY3IDEuNS0xLjVTOS4zMyAxNSA4LjUgMTV6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyczQuOTMgMTEgMTEgMTEgMTEtNC45MyAxMS0xMVMxOC4wNyAxIDEyIDF6bTAgMjBjLTQuOTYgMC05LTQuMDQtOS05czQuMDQtOSA5LTkgOSA0LjA0IDkgOS00LjA0IDktOSA5em01LjUtMTFjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em0tMiA1Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtb3ZlcnNjYW4iPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBob25lIj48cGF0aCBkPSJNMTMgOWgtMnYyaDJWOXptNCAwaC0ydjJoMlY5em0zIDYuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDIuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU4bDIuMi0yLjIxYy4yOC0uMjcuMzYtLjY2LjI1LTEuMDFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6TTE5IDl2MmgyVjloLTJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBvd2VyIj48cGF0aCBkPSJNNyAyNGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptMi0yMmgtMnYxMGgyVjJ6bTMuNTYgMi40NGwtMS40NSAxLjQ1QzE2Ljg0IDYuOTQgMTggOC44MyAxOCAxMWMwIDMuMzEtMi42OSA2LTYgNnMtNi0yLjY5LTYtNmMwLTIuMTcgMS4xNi00LjA2IDIuODgtNS4xMkw3LjQ0IDQuNDRDNS4zNiA1Ljg4IDQgOC4yOCA0IDExYzAgNC40MiAzLjU4IDggOCA4czgtMy41OCA4LThjMC0yLjcyLTEuMzYtNS4xMi0zLjQ0LTYuNTZ6TTE1IDI0aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcmVtb3RlIj48cGF0aCBkPSJNMTUgOUg5Yy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoNmMuNTUgMCAxLS40NSAxLTFWMTBjMC0uNTUtLjQ1LTEtMS0xem0tMyA2Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNNy4wNSA2LjA1bDEuNDEgMS40MUM5LjM3IDYuNTYgMTAuNjIgNiAxMiA2czIuNjMuNTYgMy41NCAxLjQ2bDEuNDEtMS40MUMxNS42OCA0Ljc4IDEzLjkzIDQgMTIgNHMtMy42OC43OC00Ljk1IDIuMDV6TTEyIDBDOC45NiAwIDYuMjEgMS4yMyA0LjIyIDMuMjJsMS40MSAxLjQxQzcuMjYgMy4wMSA5LjUxIDIgMTIgMnM0Ljc0IDEuMDEgNi4zNiAyLjY0bDEuNDEtMS40MUMxNy43OSAxLjIzIDE1LjA0IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtdm9pY2UiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem01LTExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zTDE1IDRjMC0xLjY2LTEuMzQtMy0zLTNTOSAyLjM0IDkgNHY2YzAgMS42NiAxLjM0IDMgMyAzem0tMSAxMWgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQtMTRoLTEuN2MwIDMtMi41NCA1LjEtNS4zIDUuMVM2LjcgMTMgNi43IDEwSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjBoMnYtMy4yOGMzLjI4LS40OSA2LTMuMzEgNi02LjcyeiIgLz48L2c+CjxnIGlkPSJzaG9wIj48cGF0aCBkPSJNMTYgNlY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2MkgydjEzYzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjZoLTZ6bS02LTJoNHYyaC00VjR6TTkgMThWOWw3LjUgNEw5IDE4eiIgLz48L2c+CjxnIGlkPSJzaG9wLXR3byI+PHBhdGggZD0iTTMgOUgxdjExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0ySDNWOXptMTUtNFYzYzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg1djExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0yVjVoLTV6bS02LTJoNHYyaC00VjN6bTAgMTJWOGw1LjUgMy01LjUgNHoiIC8+PC9nPgo8ZyBpZD0ic2hvcHBpbmctYmFza2V0Ij48cGF0aCBkPSJNMTcuMjEgOWwtNC4zOC02LjU2Yy0uMTktLjI4LS41MS0uNDItLjgzLS40Mi0uMzIgMC0uNjQuMTQtLjgzLjQzTDYuNzkgOUgyYy0uNTUgMC0xIC40NS0xIDEgMCAuMDkuMDEuMTguMDQuMjdsMi41NCA5LjI3Yy4yMy44NCAxIDEuNDYgMS45MiAxLjQ2aDEzYy45MiAwIDEuNjktLjYyIDEuOTMtMS40NmwyLjU0LTkuMjdMMjMgMTBjMC0uNTUtLjQ1LTEtMS0xaC00Ljc5ek05IDlsMy00LjRMMTUgOUg5em0zIDhjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnpNMSAydjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDcuNDVjLjc1IDAgMS40MS0uNDEgMS43NS0xLjAzbDMuNTgtNi40OWMuMDgtLjE0LjEyLS4zMS4xMi0uNDggMC0uNTUtLjQ1LTEtMS0xSDUuMjFsLS45NC0ySDF6bTE2IDE2Yy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic29ydCI+PHBhdGggZD0iTTMgMThoNnYtMkgzdjJ6TTMgNnYyaDE4VjZIM3ptMCA3aDEydi0ySDN2MnoiIC8+PC9nPgo8ZyBpZD0ic3BlYWtlci1ub3RlcyI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek04IDE0SDZ2LTJoMnYyem0wLTNINlY5aDJ2MnptMC0zSDZWNmgydjJ6bTcgNmgtNXYtMmg1djJ6bTMtM2gtOFY5aDh2MnptMC0zaC04VjZoOHYyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzLW9mZiI+PHBhdGggZD0iTTEwLjU0IDExbC0uNTQtLjU0TDcuNTQgOCA2IDYuNDYgMi4zOCAyLjg0IDEuMjcgMS43MyAwIDNsMi4wMSAyLjAxTDIgMjJsNC00aDlsNS43MyA1LjczTDIyIDIyLjQ2IDE3LjU0IDE4bC03LTd6TTggMTRINnYtMmgydjJ6bS0yLTNWOWwyIDJINnptMTQtOUg0LjA4TDEwIDcuOTJWNmg4djJoLTcuOTJsMSAxSDE4djJoLTQuOTJsNi45OSA2Ljk5QzIxLjE0IDE3Ljk1IDIyIDE3LjA4IDIyIDE2VjRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InNwZWxsY2hlY2siPjxwYXRoIGQ9Ik0xMi40NSAxNmgyLjA5TDkuNDMgM0g3LjU3TDIuNDYgMTZoMi4wOWwxLjEyLTNoNS42NGwxLjE0IDN6bS02LjAyLTVMOC41IDUuNDggMTAuNTcgMTFINi40M3ptMTUuMTYuNTlsLTguMDkgOC4wOUw5LjgzIDE2bC0xLjQxIDEuNDEgNS4wOSA1LjA5TDIzIDEzbC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9InN0YXIiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0ic3Rhci1ib3JkZXIiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40bC0zLjc2IDIuMjcgMS00LjI4LTMuMzItMi44OCA0LjM4LS4zOEwxMiA2LjFsMS43MSA0LjA0IDQuMzguMzgtMy4zMiAyLjg4IDEgNC4yOEwxMiAxNS40eiIgLz48L2c+CjxnIGlkPSJzdGFyLWhhbGYiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40VjYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXJzIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnptNC4yNCAxNkwxMiAxNS40NSA3Ljc3IDE4bDEuMTItNC44MS0zLjczLTMuMjMgNC45Mi0uNDJMMTIgNWwxLjkyIDQuNTMgNC45Mi40Mi0zLjczIDMuMjNMMTYuMjMgMTh6IiAvPjwvZz4KPGcgaWQ9InN0b3JlIj48cGF0aCBkPSJNMjAgNEg0djJoMTZWNHptMSAxMHYtMmwtMS01SDRsLTEgNXYyaDF2NmgxMHYtNmg0djZoMnYtNmgxem0tOSA0SDZ2LTRoNnY0eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctbGVmdCI+PHBhdGggZD0iTTExIDlsMS40MiAxLjQyTDguODMgMTRIMThWNGgydjEySDguODNsMy41OSAzLjU4TDExIDIxbC02LTYgNi02eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQiPjxwYXRoIGQ9Ik0xOSAxNWwtNiA2LTEuNDItMS40MkwxNS4xNyAxNkg0VjRoMnYxMGg5LjE3bC0zLjU5LTMuNThMMTMgOWw2IDZ6IiAvPjwvZz4KPGcgaWQ9InN1YmplY3QiPjxwYXRoIGQ9Ik0xNCAxN0g0djJoMTB2LTJ6bTYtOEg0djJoMTZWOXpNNCAxNWgxNnYtMkg0djJ6TTQgNXYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0ic3VwZXJ2aXNvci1hY2NvdW50Ij48cGF0aCBkPSJNMTYuNSAxMmMxLjM4IDAgMi40OS0xLjEyIDIuNDktMi41UzE3Ljg4IDcgMTYuNSA3QzE1LjEyIDcgMTQgOC4xMiAxNCA5LjVzMS4xMiAyLjUgMi41IDIuNXpNOSAxMWMxLjY2IDAgMi45OS0xLjM0IDIuOTktM1MxMC42NiA1IDkgNUM3LjM0IDUgNiA2LjM0IDYgOHMxLjM0IDMgMyAzem03LjUgM2MtMS44MyAwLTUuNS45Mi01LjUgMi43NVYxOWgxMXYtMi4yNWMwLTEuODMtMy42Ny0yLjc1LTUuNS0yLjc1ek05IDEzYy0yLjMzIDAtNyAxLjE3LTcgMy41VjE5aDd2LTIuMjVjMC0uODUuMzMtMi4zNCAyLjM3LTMuNDdDMTAuNSAxMy4xIDkuNjYgMTMgOSAxM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC1ob3JpeiI+PHBhdGggZD0iTTYuOTkgMTFMMyAxNWwzLjk5IDR2LTNIMTR2LTJINi45OXYtM3pNMjEgOWwtMy45OS00djNIMTB2Mmg3LjAxdjNMMjEgOXoiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0Ij48cGF0aCBkPSJNMTYgMTcuMDFWMTBoLTJ2Ny4wMWgtM0wxNSAyMWw0LTMuOTloLTN6TTkgM0w1IDYuOTloM1YxNGgyVjYuOTloM0w5IDN6IiAvPjwvZz4KPGcgaWQ9InN3YXAtdmVydGljYWwtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNi41IDlMMTAgNS41IDEzLjUgOUgxMXY0SDlWOUg2LjV6bTExIDZMMTQgMTguNSAxMC41IDE1SDEzdi00aDJ2NGgyLjV6IiAvPjwvZz4KPGcgaWQ9InN5c3RlbS11cGRhdGUtYWx0Ij48cGF0aCBkPSJNMTIgMTYuNWw0LTRoLTN2LTloLTJ2OUg4bDQgNHptOS0xM2gtNnYxLjk5aDZ2MTQuMDNIM1Y1LjQ5aDZWMy41SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTE0YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0YWIiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkgzVjVoMTB2NGg4djEweiIgLz48L2c+CjxnIGlkPSJ0YWItdW5zZWxlY3RlZCI+PHBhdGggZD0iTTEgOWgyVjdIMXYyem0wIDRoMnYtMkgxdjJ6bTAtOGgyVjNjLTEuMSAwLTIgLjktMiAyem04IDE2aDJ2LTJIOXYyem0tOC00aDJ2LTJIMXYyem0yIDR2LTJIMWMwIDEuMS45IDIgMiAyek0yMSAzaC04djZoMTBWNWMwLTEuMS0uOS0yLTItMnptMCAxNGgydi0yaC0ydjJ6TTkgNWgyVjNIOXYyek01IDIxaDJ2LTJINXYyek01IDVoMlYzSDV2MnptMTYgMTZjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC04aDJ2LTJoLTJ2MnptLTggOGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9InRleHQtZm9ybWF0Ij48cGF0aCBkPSJNNSAxN3YyaDE0di0ySDV6bTQuNS00LjJoNWwuOSAyLjJoMi4xTDEyLjc1IDRoLTEuNUw2LjUgMTVoMi4xbC45LTIuMnpNMTIgNS45OEwxMy44NyAxMWgtMy43NEwxMiA1Ljk4eiIgLz48L2c+CjxnIGlkPSJ0aGVhdGVycyI+PHBhdGggZD0iTTE4IDN2MmgtMlYzSDh2Mkg2VjNINHYxOGgydi0yaDJ2Mmg4di0yaDJ2MmgyVjNoLTJ6TTggMTdINnYtMmgydjJ6bTAtNEg2di0yaDJ2MnptMC00SDZWN2gydjJ6bTEwIDhoLTJ2LTJoMnYyem0wLTRoLTJ2LTJoMnYyem0wLTRoLTJWN2gydjJ6IiAvPjwvZz4KPGcgaWQ9InRodW1iLWRvd24iPjxwYXRoIGQ9Ik0xNSAzSDZjLS44MyAwLTEuNTQuNS0xLjg0IDEuMjJsLTMuMDIgNy4wNWMtLjA5LjIzLS4xNC40Ny0uMTQuNzN2MS45MWwuMDEuMDFMMSAxNGMwIDEuMS45IDIgMiAyaDYuMzFsLS45NSA0LjU3LS4wMy4zMmMwIC40MS4xNy43OS40NCAxLjA2TDkuODMgMjNsNi41OS02LjU5Yy4zNi0uMzYuNTgtLjg2LjU4LTEuNDFWNWMwLTEuMS0uOS0yLTItMnptNCAwdjEyaDRWM2gtNHoiIC8+PC9nPgo8ZyBpZD0idGh1bWItdXAiPjxwYXRoIGQ9Ik0xIDIxaDRWOUgxdjEyem0yMi0xMWMwLTEuMS0uOS0yLTItMmgtNi4zMWwuOTUtNC41Ny4wMy0uMzJjMC0uNDEtLjE3LS43OS0uNDQtMS4wNkwxNC4xNyAxIDcuNTkgNy41OUM3LjIyIDcuOTUgNyA4LjQ1IDcgOXYxMGMwIDEuMS45IDIgMiAyaDljLjgzIDAgMS41NC0uNSAxLjg0LTEuMjJsMy4wMi03LjA1Yy4wOS0uMjMuMTQtLjQ3LjE0LS43M3YtMS45MWwtLjAxLS4wMUwyMyAxMHoiIC8+PC9nPgo8ZyBpZD0idGh1bWJzLXVwLWRvd24iPjxwYXRoIGQ9Ik0xMiA2YzAtLjU1LS40NS0xLTEtMUg1LjgybC42Ni0zLjE4LjAyLS4yM2MwLS4zMS0uMTMtLjU5LS4zMy0uOEw1LjM4IDAgLjQ0IDQuOTRDLjE3IDUuMjEgMCA1LjU5IDAgNnY2LjVjMCAuODMuNjcgMS41IDEuNSAxLjVoNi43NWMuNjIgMCAxLjE1LS4zOCAxLjM4LS45MWwyLjI2LTUuMjljLjA3LS4xNy4xMS0uMzYuMTEtLjU1VjZ6bTEwLjUgNGgtNi43NWMtLjYyIDAtMS4xNS4zOC0xLjM4LjkxbC0yLjI2IDUuMjljLS4wNy4xNy0uMTEuMzYtLjExLjU1VjE4YzAgLjU1LjQ1IDEgMSAxaDUuMThsLS42NiAzLjE4LS4wMi4yNGMwIC4zMS4xMy41OS4zMy44bC43OS43OCA0Ljk0LTQuOTRjLjI3LS4yNy40NC0uNjUuNDQtMS4wNnYtNi41YzAtLjgzLS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0idGltZWxpbmUiPjxwYXRoIGQ9Ik0yMyA4YzAgMS4xLS45IDItMiAyLS4xOCAwLS4zNS0uMDItLjUxLS4wN2wtMy41NiAzLjU1Yy4wNS4xNi4wNy4zNC4wNy41MiAwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJjMC0uMTguMDItLjM2LjA3LS41MmwtMi41NS0yLjU1Yy0uMTYuMDUtLjM0LjA3LS41Mi4wN3MtLjM2LS4wMi0uNTItLjA3bC00LjU1IDQuNTZjLjA1LjE2LjA3LjMzLjA3LjUxIDAgMS4xLS45IDItMiAycy0yLS45LTItMiAuOS0yIDItMmMuMTggMCAuMzUuMDIuNTEuMDdsNC41Ni00LjU1QzguMDIgOS4zNiA4IDkuMTggOCA5YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAuMTgtLjAyLjM2LS4wNy41MmwyLjU1IDIuNTVjLjE2LS4wNS4zNC0uMDcuNTItLjA3cy4zNi4wMi41Mi4wN2wzLjU1LTMuNTZDMTkuMDIgOC4zNSAxOSA4LjE4IDE5IDhjMC0xLjEuOS0yIDItMnMyIC45IDIgMnoiIC8+PC9nPgo8ZyBpZD0idG9jIj48cGF0aCBkPSJNMyA5aDE0VjdIM3Yyem0wIDRoMTR2LTJIM3Yyem0wIDRoMTR2LTJIM3Yyem0xNiAwaDJ2LTJoLTJ2MnptMC0xMHYyaDJWN2gtMnptMCA2aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idG9kYXkiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjhoMTR2MTF6TTcgMTBoNXY1SDd6IiAvPjwvZz4KPGcgaWQ9InRvbGwiPjxwYXRoIGQ9Ik0xNSA0Yy00LjQyIDAtOCAzLjU4LTggOHMzLjU4IDggOCA4IDgtMy41OCA4LTgtMy41OC04LTgtOHptMCAxNGMtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNiA2IDIuNjkgNiA2LTIuNjkgNi02IDZ6TTMgMTJjMC0yLjYxIDEuNjctNC44MyA0LTUuNjVWNC4yNkMzLjU1IDUuMTUgMSA4LjI3IDEgMTJzMi41NSA2Ljg1IDYgNy43NHYtMi4wOWMtMi4zMy0uODItNC0zLjA0LTQtNS42NXoiIC8+PC9nPgo8ZyBpZD0idG91Y2gtYXBwIj48cGF0aCBkPSJNOSAxMS4yNFY3LjVDOSA2LjEyIDEwLjEyIDUgMTEuNSA1UzE0IDYuMTIgMTQgNy41djMuNzRjMS4yMS0uODEgMi0yLjE4IDItMy43NEMxNiA1LjAxIDEzLjk5IDMgMTEuNSAzUzcgNS4wMSA3IDcuNWMwIDEuNTYuNzkgMi45MyAyIDMuNzR6bTkuODQgNC42M2wtNC41NC0yLjI2Yy0uMTctLjA3LS4zNS0uMTEtLjU0LS4xMUgxM3YtNmMwLS44My0uNjctMS41LTEuNS0xLjVTMTAgNi42NyAxMCA3LjV2MTAuNzRsLTMuNDMtLjcyYy0uMDgtLjAxLS4xNS0uMDMtLjI0LS4wMy0uMzEgMC0uNTkuMTMtLjc5LjMzbC0uNzkuOCA0Ljk0IDQuOTRjLjI3LjI3LjY1LjQ0IDEuMDYuNDRoNi43OWMuNzUgMCAxLjMzLS41NSAxLjQ0LTEuMjhsLjc1LTUuMjdjLjAxLS4wNy4wMi0uMTQuMDItLjIgMC0uNjItLjM4LTEuMTYtLjkxLTEuMzh6IiAvPjwvZz4KPGcgaWQ9InRyYWNrLWNoYW5nZXMiPjxwYXRoIGQ9Ik0xOS4wNyA0LjkzbC0xLjQxIDEuNDFDMTkuMSA3Ljc5IDIwIDkuNzkgMjAgMTJjMCA0LjQyLTMuNTggOC04IDhzLTgtMy41OC04LThjMC00LjA4IDMuMDUtNy40NCA3LTcuOTN2Mi4wMkM4LjE2IDYuNTcgNiA5LjAzIDYgMTJjMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmMwLTEuNjYtLjY3LTMuMTYtMS43Ni00LjI0bC0xLjQxIDEuNDFDMTUuNTUgOS45IDE2IDEwLjkgMTYgMTJjMCAyLjIxLTEuNzkgNC00IDRzLTQtMS43OS00LTRjMC0xLjg2IDEuMjgtMy40MSAzLTMuODZ2Mi4xNGMtLjYuMzUtMSAuOTgtMSAxLjcyIDAgMS4xLjkgMiAyIDJzMi0uOSAyLTJjMC0uNzQtLjQtMS4zOC0xLTEuNzJWMmgtMUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwYzAtMi43Ni0xLjEyLTUuMjYtMi45My03LjA3eiIgLz48L2c+CjxnIGlkPSJ0cmFuc2xhdGUiPjxwYXRoIGQ9Ik0xMi44NyAxNS4wN2wtMi41NC0yLjUxLjAzLS4wM2MxLjc0LTEuOTQgMi45OC00LjE3IDMuNzEtNi41M0gxN1Y0aC03VjJIOHYySDF2MS45OWgxMS4xN0MxMS41IDcuOTIgMTAuNDQgOS43NSA5IDExLjM1IDguMDcgMTAuMzIgNy4zIDkuMTkgNi42OSA4aC0yYy43MyAxLjYzIDEuNzMgMy4xNyAyLjk4IDQuNTZsLTUuMDkgNS4wMkw0IDE5bDUtNSAzLjExIDMuMTEuNzYtMi4wNHpNMTguNSAxMGgtMkwxMiAyMmgybDEuMTItM2g0Ljc1TDIxIDIyaDJsLTQuNS0xMnptLTIuNjIgN2wxLjYyLTQuMzNMMTkuMTIgMTdoLTMuMjR6IiAvPjwvZz4KPGcgaWQ9InRyZW5kaW5nLWRvd24iPjxwYXRoIGQ9Ik0xNiAxOGwyLjI5LTIuMjktNC44OC00Ljg4LTQgNEwyIDcuNDEgMy40MSA2bDYgNiA0LTQgNi4zIDYuMjlMMjIgMTJ2NnoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZmxhdCI+PHBhdGggZD0iTTIyIDEybC00LTR2M0gzdjJoMTV2M3oiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctdXAiPjxwYXRoIGQ9Ik0xNiA2bDIuMjkgMi4yOS00Ljg4IDQuODgtNC00TDIgMTYuNTkgMy40MSAxOGw2LTYgNCA0IDYuMy02LjI5TDIyIDEyVjZ6IiAvPjwvZz4KPGcgaWQ9InR1cm5lZC1pbiI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluLW5vdCI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0idW5hcmNoaXZlIj48cGF0aCBkPSJNMjAuNTUgNS4yMmwtMS4zOS0xLjY4QzE4Ljg4IDMuMjEgMTguNDcgMyAxOCAzSDZjLS40NyAwLS44OC4yMS0xLjE1LjU1TDMuNDYgNS4yMkMzLjE3IDUuNTcgMyA2LjAxIDMgNi41VjE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OS0uMTctLjkzLS40NS0xLjI4ek0xMiA5LjVsNS41IDUuNUgxNHYyaC00di0ySDYuNUwxMiA5LjV6TTUuMTIgNWwuODItMWgxMmwuOTMgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJ1bmRvIj48cGF0aCBkPSJNMTIuNSA4Yy0yLjY1IDAtNS4wNS45OS02LjkgMi42TDIgN3Y5aDlsLTMuNjItMy42MmMxLjM5LTEuMTYgMy4xNi0xLjg4IDUuMTItMS44OCAzLjU0IDAgNi41NSAyLjMxIDcuNiA1LjVsMi4zNy0uNzhDMjEuMDggMTEuMDMgMTcuMTUgOCAxMi41IDh6IiAvPjwvZz4KPGcgaWQ9InVuZm9sZC1sZXNzIj48cGF0aCBkPSJNNy40MSAxOC41OUw4LjgzIDIwIDEyIDE2LjgzIDE1LjE3IDIwbDEuNDEtMS40MUwxMiAxNGwtNC41OSA0LjU5em05LjE4LTEzLjE4TDE1LjE3IDQgMTIgNy4xNyA4LjgzIDQgNy40MSA1LjQxIDEyIDEwbDQuNTktNC41OXoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLW1vcmUiPjxwYXRoIGQ9Ik0xMiA1LjgzTDE1LjE3IDlsMS40MS0xLjQxTDEyIDMgNy40MSA3LjU5IDguODMgOSAxMiA1Ljgzem0wIDEyLjM0TDguODMgMTVsLTEuNDEgMS40MUwxMiAyMWw0LjU5LTQuNTlMMTUuMTcgMTUgMTIgMTguMTd6IiAvPjwvZz4KPGcgaWQ9InVwZGF0ZSI+PHBhdGggZD0iTTIxIDEwLjEyaC02Ljc4bDIuNzQtMi44MmMtMi43My0yLjctNy4xNS0yLjgtOS44OC0uMS0yLjczIDIuNzEtMi43MyA3LjA4IDAgOS43OSAyLjczIDIuNzEgNy4xNSAyLjcxIDkuODggMEMxOC4zMiAxNS42NSAxOSAxNC4wOCAxOSAxMi4xaDJjMCAxLjk4LS44OCA0LjU1LTIuNjQgNi4yOS0zLjUxIDMuNDgtOS4yMSAzLjQ4LTEyLjcyIDAtMy41LTMuNDctMy41My05LjExLS4wMi0xMi41OCAzLjUxLTMuNDcgOS4xNC0zLjQ3IDEyLjY1IDBMMjEgM3Y3LjEyek0xMi41IDh2NC4yNWwzLjUgMi4wOC0uNzIgMS4yMUwxMSAxM1Y4aDEuNXoiIC8+PC9nPgo8ZyBpZD0idmVyaWZpZWQtdXNlciI+PHBhdGggZD0iTTEyIDFMMyA1djZjMCA1LjU1IDMuODQgMTAuNzQgOSAxMiA1LjE2LTEuMjYgOS02LjQ1IDktMTJWNWwtOS00em0tMiAxNmwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFnZW5kYSI+PHBhdGggZD0iTTIwIDEzSDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMXYtNmMwLS41NS0uNDUtMS0xLTF6bTAtMTBIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFycmF5Ij48cGF0aCBkPSJNNCAxOGgzVjVINHYxM3pNMTggNXYxM2gzVjVoLTN6TTggMThoOVY1SDh2MTN6IiAvPjwvZz4KPGcgaWQ9InZpZXctY2Fyb3VzZWwiPjxwYXRoIGQ9Ik03IDE5aDEwVjRIN3YxNXptLTUtMmg0VjZIMnYxMXpNMTggNnYxMWg0VjZoLTR6IiAvPjwvZz4KPGcgaWQ9InZpZXctY29sdW1uIj48cGF0aCBkPSJNMTAgMThoNVY1aC01djEzem0tNiAwaDVWNUg0djEzek0xNiA1djEzaDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1kYXkiPjxwYXRoIGQ9Ik0yIDIxaDE5di0zSDJ2M3pNMjAgOEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6TTIgM3YzaDE5VjNIMnoiIC8+PC9nPgo8ZyBpZD0idmlldy1oZWFkbGluZSI+PHBhdGggZD0iTTQgMTVoMTZ2LTJINHYyem0wIDRoMTZ2LTJINHYyem0wLThoMTZWOUg0djJ6bTAtNnYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0idmlldy1saXN0Ij48cGF0aCBkPSJNNCAxNGg0di00SDR2NHptMCA1aDR2LTRINHY0ek00IDloNFY1SDR2NHptNSA1aDEydi00SDl2NHptMCA1aDEydi00SDl2NHpNOSA1djRoMTJWNUg5eiIgLz48L2c+CjxnIGlkPSJ2aWV3LW1vZHVsZSI+PHBhdGggZD0iTTQgMTFoNVY1SDR2NnptMCA3aDV2LTZINHY2em02IDBoNXYtNmgtNXY2em02IDBoNXYtNmgtNXY2em0tNi03aDVWNWgtNXY2em02LTZ2Nmg1VjVoLTV6IiAvPjwvZz4KPGcgaWQ9InZpZXctcXVpbHQiPjxwYXRoIGQ9Ik0xMCAxOGg1di02aC01djZ6bS02IDBoNVY1SDR2MTN6bTEyIDBoNXYtNmgtNXY2ek0xMCA1djZoMTFWNUgxMHoiIC8+PC9nPgo8ZyBpZD0idmlldy1zdHJlYW0iPjxwYXRoIGQ9Ik00IDE4aDE3di02SDR2NnpNNCA1djZoMTdWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LXdlZWsiPjxwYXRoIGQ9Ik02IDVIM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xem0xNCAwaC0zYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bS03IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXoiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDQuNUM3IDQuNSAyLjczIDcuNjEgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41czkuMjctMy4xMSAxMS03LjVjLTEuNzMtNC4zOS02LTcuNS0xMS03LjV6TTEyIDE3Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXptMC04Yy0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTMtMS4zNC0zLTMtM3oiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eS1vZmYiPjxwYXRoIGQ9Ik0xMiA3YzIuNzYgMCA1IDIuMjQgNSA1IDAgLjY1LS4xMyAxLjI2LS4zNiAxLjgzbDIuOTIgMi45MmMxLjUxLTEuMjYgMi43LTIuODkgMy40My00Ljc1LTEuNzMtNC4zOS02LTcuNS0xMS03LjUtMS40IDAtMi43NC4yNS0zLjk4LjdsMi4xNiAyLjE2QzEwLjc0IDcuMTMgMTEuMzUgNyAxMiA3ek0yIDQuMjdsMi4yOCAyLjI4LjQ2LjQ2QzMuMDggOC4zIDEuNzggMTAuMDIgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41IDEuNTUgMCAzLjAzLS4zIDQuMzgtLjg0bC40Mi40MkwxOS43MyAyMiAyMSAyMC43MyAzLjI3IDMgMiA0LjI3ek03LjUzIDkuOGwxLjU1IDEuNTVjLS4wNS4yMS0uMDguNDMtLjA4LjY1IDAgMS42NiAxLjM0IDMgMyAzIC4yMiAwIC40NC0uMDMuNjUtLjA4bDEuNTUgMS41NWMtLjY3LjMzLTEuNDEuNTMtMi4yLjUzLTIuNzYgMC01LTIuMjQtNS01IDAtLjc5LjItMS41My41My0yLjJ6bTQuMzEtLjc4bDMuMTUgMy4xNS4wMi0uMTZjMC0xLjY2LTEuMzQtMy0zLTNsLS4xNy4wMXoiIC8+PC9nPgo8ZyBpZD0id2FybmluZyI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0id2F0Y2gtbGF0ZXIiPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNC4yIDE0LjJMMTEgMTNWN2gxLjV2NS4ybDQuNSAyLjctLjggMS4zeiIgLz48L2c+CjxnIGlkPSJ3ZWVrZW5kIj48cGF0aCBkPSJNMjEgMTBjLTEuMSAwLTIgLjktMiAydjNINXYtM2MwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJ2NWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0ydi01YzAtMS4xLS45LTItMi0yem0tMy01SDZjLTEuMSAwLTIgLjktMiAydjIuMTVjMS4xNi40MSAyIDEuNTEgMiAyLjgyVjE0aDEydi0yLjAzYzAtMS4zLjg0LTIuNCAyLTIuODJWN2MwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0id29yayI+PHBhdGggZD0iTTIwIDZoLTRWNGMwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNiAwaC00VjRoNHYyeiIgLz48L2c+CjxnIGlkPSJ5b3V0dWJlLXNlYXJjaGVkLWZvciI+PHBhdGggZD0iTTE3LjAxIDE0aC0uOGwtLjI3LS4yN2MuOTgtMS4xNCAxLjU3LTIuNjEgMS41Ny00LjIzIDAtMy41OS0yLjkxLTYuNS02LjUtNi41cy02LjUgMy02LjUgNi41SDJsMy44NCA0IDQuMTYtNEg2LjUxQzYuNTEgNyA4LjUzIDUgMTEuMDEgNXM0LjUgMi4wMSA0LjUgNC41YzAgMi40OC0yLjAyIDQuNS00LjUgNC41LS42NSAwLTEuMjYtLjE0LTEuODItLjM4TDcuNzEgMTUuMWMuOTcuNTcgMi4wOS45IDMuMy45IDEuNjEgMCAzLjA4LS41OSA0LjIyLTEuNTdsLjI3LjI3di43OWw1LjAxIDQuOTlMMjIgMTlsLTQuOTktNXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1pbiI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6bTIuNS00aC0ydjJIOXYtMkg3VjloMlY3aDF2MmgydjF6IiAvPjwvZz4KPGcgaWQ9Inpvb20tb3V0Ij48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpNNyA5aDV2MUg3eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItaWNvbi1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB6LWluZGV4OiAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwoKICAgICAgICB3aWR0aDogNDBweDsKICAgICAgICBoZWlnaHQ6IDQwcHg7CgogICAgICAgIC8qIE5PVEU6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlIHZhbHVlIHRvIGJlIGB0cmFuc3BhcmVudGAuICovCiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CgogICAgICAgIC8qIEJlY2F1c2Ugb2YgcG9seW1lci8yNTU4LCB0aGlzIHN0eWxlIGhhcyBsb3dlciBzcGVjaWZpY2l0eSB0aGFuICogKi8KICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdCAjaW5rIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaWNvbi1idXR0b24taW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaWNvbi1idXR0b24tZGlzYWJsZWQtdGV4dCwgdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcikpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGN1cnNvcjogYXV0bzsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6aG92ZXIpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1ob3ZlcjsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICAtLWlyb24taWNvbi13aWR0aDogMTAwJTsKICAgICAgICAtLWlyb24taWNvbi1oZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGlyb24taWNvbiBpZD0iaWNvbiIgc3JjPSJbW3NyY11dIiBpY29uPSJbW2ljb25dXSIgYWx0JD0iW1thbHRdXSI+PC9pcm9uLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWljb24tYnV0dG9uL3BhcGVyLWljb24tYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWljb24tYnV0dG9uIixob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIix0YWJpbmRleDoiMCJ9LGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yXSxwcm9wZXJ0aWVzOntzcmM6e3R5cGU6U3RyaW5nfSxpY29uOnt0eXBlOlN0cmluZ30sYWx0Ont0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2FsdENoYW5nZWQifX0sX2FsdENoYW5nZWQ6ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpO2QmJmMhPWR8fHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIixhKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icnVuLWNvbG9yLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIFtjb2xvci1jbGFzcz0nbGlnaHQtYmx1ZSddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1saWdodC1ibHVlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3JlZCddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1yZWQtOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nZ3JlZW4nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncHVycGxlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXB1cnBsZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSd0ZWFsJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXRlYWwtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncGluayddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J29yYW5nZSddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1vcmFuZ2UtOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nYnJvd24nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0naW5kaWdvJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW11bHRpLWNoZWNrYm94Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InJ1bi1jb2xvci1zdHlsZSI+PC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQgaWQ9Im5hbWVzLXJlZ2V4IiBuby1sYWJlbC1mbG9hdCBsYWJlbD0iV3JpdGUgYSByZWdleCB0byBmaWx0ZXIgcnVucyIgdmFsdWU9IltbcmVnZXhdXSIgb24tYmluZC12YWx1ZS1jaGFuZ2VkPSJfZGVib3VuY2VkUmVnZXhDaGFuZ2UiPjwvcGFwZXItaW5wdXQ+CiAgICA8ZGl2IGlkPSJvdXRlci1jb250YWluZXIiIGNsYXNzPSJzY3JvbGxiYXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW25hbWVzTWF0Y2hpbmdSZWdleF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGVja2JveCB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iIG5hbWU9IltbaXRlbV1dIiBjaGVja2VkJD0iW1tfaXNDaGVja2VkKGl0ZW0sIHNlbGVjdGlvblN0YXRlLiopXV0iIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIj48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBpc29sYXRvci1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiIGNsYXNzPSJpc29sYXRvciB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIG9uLXRhcD0iX2lzb2xhdGVOYW1lIiBuYW1lPSJbW2l0ZW1dXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5uYW1lLXJvdyB7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1kYXNoYm9hcmQtY29tbW9uL3RmLW11bHRpLWNoZWNrYm94LmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1tdWx0aS1jaGVja2JveCIscHJvcGVydGllczp7bmFtZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxjb2xvcmluZzp7dHlwZTpPYmplY3QsdmFsdWU6e2dldENvbG9yOigpPT4iIn19LHJlZ2V4Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsdmFsdWU6IiJ9LF9yZWdleDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9tYWtlUmVnZXgocmVnZXgpIn0sbmFtZXNNYXRjaGluZ1JlZ2V4Ont0eXBlOkFycmF5LGNvbXB1dGVkOiJjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4KG5hbWVzLiosIF9yZWdleCkifSxzZWxlY3Rpb25TdGF0ZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOigpPT4oe30pfSxvdXRTZWxlY3RlZDp7dHlwZTpBcnJheSxub3RpZnk6ITAsY29tcHV0ZWQ6ImNvbXB1dGVPdXRTZWxlY3RlZChuYW1lc01hdGNoaW5nUmVnZXguKiwgc2VsZWN0aW9uU3RhdGUuKikifSxtYXhOYW1lc1RvRW5hYmxlQnlEZWZhdWx0Ont0eXBlOk51bWJlciwKdmFsdWU6NDB9LF9kZWJvdW5jZWRSZWdleENoYW5nZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT1fLmRlYm91bmNlKGM9Pnt0aGlzLnJlZ2V4PWN9LDE1MCx7bGVhZGluZzohMX0pO3JldHVybiBmdW5jdGlvbigpe3ZhciBjPXRoaXMuJCQoIiNuYW1lcy1yZWdleCIpLnZhbHVlOyIiPT1jP3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnJlZ2V4PWN9LDMwKTphKGMpfX19fSxsaXN0ZW5lcnM6eyJkb20tY2hhbmdlIjoic3luY2hyb25pemVDb2xvcnMifSxvYnNlcnZlcnM6WyJfc2V0SXNvbGF0b3JJY29uKHNlbGVjdGlvblN0YXRlLCBuYW1lcykiXSxfbWFrZVJlZ2V4OmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChhKX1jYXRjaChjKXtyZXR1cm4gbnVsbH19LF9zZXRJc29sYXRvckljb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlbGVjdGlvblN0YXRlLGM9Xy5maWx0ZXIoXy52YWx1ZXMoYSkpLmxlbmd0aDtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmlzb2xhdG9yIikpLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5pY29uPQoxPT09YyYmYVtkLm5hbWVdPyJyYWRpby1idXR0b24tY2hlY2tlZCI6InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQifSl9LGNvbXB1dGVOYW1lc01hdGNoaW5nUmVnZXg6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMuX3JlZ2V4O3JldHVybiBhP3RoaXMubmFtZXMuZmlsdGVyKGM9PmEudGVzdChjKSk6dGhpcy5uYW1lc30sY29tcHV0ZU91dFNlbGVjdGVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25TdGF0ZSxjPXRoaXMubmFtZXNNYXRjaGluZ1JlZ2V4Lmxlbmd0aDw9dGhpcy5tYXhOYW1lc1RvRW5hYmxlQnlEZWZhdWx0O3JldHVybiB0aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5maWx0ZXIoZD0+bnVsbD09YVtkXT9jOmFbZF0pfSxzeW5jaHJvbml6ZUNvbG9yczpmdW5jdGlvbigpe3RoaXMuX3NldElzb2xhdG9ySWNvbigpO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci1jaGVja2JveCIpLmZvckVhY2goYT0+e2NvbnN0IGM9dGhpcy5jb2xvcmluZy5nZXRDb2xvcihhLm5hbWUpOwphLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciI6YywiLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvciI6YywiLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IiOmMsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvciI6Y30pfSk7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc29sYXRvciIpLmZvckVhY2goYT0+e2NvbnN0IGM9dGhpcy5jb2xvcmluZy5nZXRDb2xvcihhLm5hbWUpO2Euc3R5bGUuY29sb3I9Y30pO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLnVwZGF0ZVN0eWxlcygpfSl9LF9pc29sYXRlTmFtZTpmdW5jdGlvbihhKXt2YXIgYz1Qb2x5bWVyLmRvbShhKS5sb2NhbFRhcmdldC5uYW1lLGQ9e307dGhpcy5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2RbZl09Zj09Y30pO3RoaXMuc2VsZWN0aW9uU3RhdGU9ZH0sX2NoZWNrYm94Q2hhbmdlOmZ1bmN0aW9uKGEpe2E9ClBvbHltZXIuZG9tKGEpLmxvY2FsVGFyZ2V0O2NvbnN0IGM9Xy5jbG9uZSh0aGlzLnNlbGVjdGlvblN0YXRlKTtjW2EubmFtZV09YS5jaGVja2VkO3RoaXMuc2VsZWN0aW9uU3RhdGU9Y30sX2lzQ2hlY2tlZDpmdW5jdGlvbihhKXtyZXR1cm4tMSE9dGhpcy5vdXRTZWxlY3RlZC5pbmRleE9mKGEpfSx0b2dnbGVBbGw6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMubmFtZXNNYXRjaGluZ1JlZ2V4LnNvbWUoZD0+dGhpcy5vdXRTZWxlY3RlZC5pbmNsdWRlcyhkKSksYz17fTt0aGlzLm5hbWVzLmZvckVhY2goZD0+e2NbZF09IWF9KTt0aGlzLnNlbGVjdGlvblN0YXRlPWN9fSl9KShXbHx8KFdsPXt9KSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtd2JyLXN0cmluZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19wYXJ0c11dIiBhcz0icGFydCI+W1twYXJ0XV08d2JyPjwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtcnVucy1zZWxlY3Rvci90Zi13YnItc3RyaW5nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXdici1zdHJpbmciLHByb3BlcnRpZXM6e3ZhbHVlOlN0cmluZyxfcGFydHM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlUGFydHModmFsdWUpIn19LF9jb21wdXRlUGFydHMoYSl7Y29uc3QgYz1bXSxkPS9bLz1fLC1dLztmb3IobnVsbD09YSYmKGE9IiIpOzspe2NvbnN0IGY9YS5zZWFyY2goZCk7aWYoLTE9PT1mKXtjLnB1c2goYSk7YnJlYWt9ZWxzZSBjLnB1c2goYS5zbGljZSgwLGYrMSkpLGE9YS5zbGljZShmKzEpfXJldHVybiBjfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcnVucy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wIGlkPSJkYXRhLWxvY2F0aW9uLWRpYWxvZyI+CiAgICAgIDxoMj5EYXRhIExvY2F0aW9uPC9oMj4KICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbZGF0YUxvY2F0aW9uXV0iIC8+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxkaXYgaWQ9InRvcC10ZXh0Ij4KICAgICAgPGgzIGlkPSJ0b29sdGlwLWhlbHAiIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+UnVuczwvaDM+CiAgICA8L2Rpdj4KICAgIDx0Zi1tdWx0aS1jaGVja2JveCBpZD0ibXVsdGlDaGVja2JveCIgbmFtZXM9IltbcnVuc11dIiBzZWxlY3Rpb24tc3RhdGU9Int7cnVuU2VsZWN0aW9uU3RhdGV9fSIgb3V0LXNlbGVjdGVkPSJ7e3NlbGVjdGVkUnVuc319IiByZWdleD0ie3tyZWdleElucHV0fX0iIGNvbG9yaW5nPSJbW2NvbG9yaW5nXV0iPjwvdGYtbXVsdGktY2hlY2tib3g+CiAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgaWQ9InRvZ2dsZS1hbGwiIG9uLXRhcD0iX3RvZ2dsZUFsbCI+CiAgICAgIFRvZ2dsZSBBbGwgUnVucwogICAgPC9wYXBlci1idXR0b24+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZGF0YUxvY2F0aW9uXV0iPgogICAgICA8ZGl2IGlkPSJkYXRhLWxvY2F0aW9uIj4KICAgICAgICA8dGYtd2JyLXN0cmluZyB2YWx1ZT0iW1tfY2xpcHBlZERhdGFMb2NhdGlvbl1dIiAvPjx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKV1dIj48YSBocmVmPSIiIG9uLWNsaWNrPSJfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZyI+4oCmPC9hPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICB9CiAgICAgICN0b3AtdGV4dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ydW5zLXNlbGVjdG9yL3RmLXJ1bnMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcnVucy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuU2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSIsdmFsdWU6VmwuZ2V0T2JqZWN0SW5pdGlhbGl6ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSl9LHJlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOlZsLmdldFN0cmluZ0luaXRpYWxpemVyKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Il9yZWdleE9ic2VydmVyIn0sc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LG5vdGlmeTohMH0scnVuczpBcnJheSxkYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2NsaXBwZWREYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKSJ9LF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoOnt0eXBlOk51bWJlciwKdmFsdWU6MjUwLHJlYWRPbmx5OiEwfSxjb2xvcmluZzp7dHlwZTpPYmplY3QsdmFsdWU6e2dldENvbG9yOlpsLnJ1bnNDb2xvclNjYWxlfX19LGF0dGFjaGVkKCl7dGhpcy5fcnVuU3RvcmVMaXN0ZW5lcj1Qay5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9Pnt0aGlzLnNldCgicnVucyIsUGsucnVuc1N0b3JlLmdldFJ1bnMoKSl9KTt0aGlzLnNldCgicnVucyIsUGsucnVuc1N0b3JlLmdldFJ1bnMoKSk7dGhpcy5fZW52U3RvcmVMaXN0ZW5lcj1Qay5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsUGsuZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9KTt0aGlzLnNldCgiZGF0YUxvY2F0aW9uIixQay5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpKX0sZGV0YWNoZWQoKXtQay5ydW5zU3RvcmUucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9ydW5TdG9yZUxpc3RlbmVyKTtQay5lbnZpcm9ubWVudFN0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fZW52U3RvcmVMaXN0ZW5lcil9LApfdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9LF9nZXRDbGlwcGVkRGF0YUxvY2F0aW9uOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YSYmIShhLmxlbmd0aD5jKSlyZXR1cm4gYX0sX29wZW5EYXRhTG9jYXRpb25EaWFsb2c6ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuJCQoIiNkYXRhLWxvY2F0aW9uLWRpYWxvZyIpLm9wZW4oKX0sX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oYSxjKXtyZXR1cm4gYSYmYS5sZW5ndGg+Y30sX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGU6VmwuZ2V0T2JqZWN0T2JzZXJ2ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSksX3JlZ2V4T2JzZXJ2ZXI6VmwuZ2V0U3RyaW5nT2JzZXJ2ZXIoInJlZ2V4SW5wdXQiLHtkZWZhdWx0VmFsdWU6IiJ9KX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi10ZW5zb3Jib2FyZC9yZWdpc3RyeS5qcwp2YXIgJGw7CihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7Yy5OT1RfTE9BREVEPSJOT1RfTE9BREVEIjtjLkxPQURFRD0iTE9BREVEIjtjLkZBSUxFRD0iRkFJTEVEIn0pKGEuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZXx8KGEuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT17fSkpO2EuZGFzaGJvYXJkUmVnaXN0cnk9e307YS5yZWdpc3RlckRhc2hib2FyZD1mdW5jdGlvbihjKXtpZighYy5wbHVnaW4pdGhyb3cgRXJyb3IoIkRhc2hib2FyZC5wbHVnaW4gbXVzdCBiZSBwcmVzZW50Iik7aWYoIWMuZWxlbWVudE5hbWUpdGhyb3cgRXJyb3IoIkRhc2hib2FyZC5lbGVtZW50TmFtZSBtdXN0IGJlIHByZXNlbnQiKTtpZihjLnBsdWdpbiBpbiBhLmRhc2hib2FyZFJlZ2lzdHJ5KXRocm93IEVycm9yKGBQbHVnaW4gYWxyZWFkeSByZWdpc3RlcmVkOiAke2MucGx1Z2lufWApO2MudGFiTmFtZXx8KGMudGFiTmFtZT1jLnBsdWdpbik7YS5kYXNoYm9hcmRSZWdpc3RyeVtjLnBsdWdpbl09Y319KSgkbHx8KCRsPQp7fSkpOwo8L3NjcmlwdD4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi11dGlscy91dGlscy5qcwp2YXIgYW07CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGQsZixnKXtyZXR1cm4gMT09PWQ/ZjpnfWEuYWdncmVnYXRlVGFnSW5mbz1mdW5jdGlvbihkLGYpe2xldCBnPXZvaWQgMDtjb25zdCBsPXt9O09iamVjdC5rZXlzKGQpLmZvckVhY2gobT0+e2NvbnN0IHA9ZFttXTt2b2lkIDA9PT1nJiYoZz1wLmRpc3BsYXlOYW1lKTtnIT09cC5kaXNwbGF5TmFtZSYmKGc9bnVsbCk7dm9pZCAwPT09bFtwLmRlc2NyaXB0aW9uXSYmKGxbcC5kZXNjcmlwdGlvbl09W10pO2xbcC5kZXNjcmlwdGlvbl0ucHVzaChtKX0pO2Y9bnVsbCE9Zz9nOmY7Y29uc3Qgaz0oKCk9Pntjb25zdCBtPU9iamVjdC5rZXlzKGwpO3JldHVybiAwPT09bS5sZW5ndGg/IiI6MT09PW0ubGVuZ3RoP21bMF06YCR7Ilx4M2NwXHgzZVx4M2NzdHJvbmdceDNlTXVsdGlwbGUgZGVzY3JpcHRpb25zOlx4M2Mvc3Ryb25nXHgzZVx4M2MvcFx4M2UifTx1bD4ke20ubWFwKHA9Pntjb25zdCBxPWxbcF0ubWFwKHQ9PmA8Y29kZT4ke3QucmVwbGFjZSgvPC9nLCJceDI2bHQ7IikucmVwbGFjZSgvPi9nLAoiXHgyNmd0OyIpLnJlcGxhY2UoLyYvZywiXHgyNmFtcDsiKX08L2NvZGU+YCkscj0yPHEubGVuZ3RoP3Euc2xpY2UoMCxxLmxlbmd0aC0xKS5qb2luKCIsICIpKyIsIGFuZCAiK3FbcS5sZW5ndGgtMV06cS5qb2luKCIgYW5kICIpO3JldHVybmA8bGk+PHA+Rm9yICR7YyhxLmxlbmd0aCwicnVuIiwicnVucyIpfSAke3J9OjwvcD4ke3B9PC9saT5gfSkuam9pbigiIil9PC91bD5gfSkoKTtyZXR1cm57ZGlzcGxheU5hbWU6ZixkZXNjcmlwdGlvbjprfX19KShhbXx8KGFtPXt9KSk7Cjwvc2NyaXB0PgoKCgoKCgoKCgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX19hY3RpdmVDaGFuZ2VkIn0sYWx0Ont0eXBlOlN0cmluZyx2YWx1ZToibG9hZGluZyIsb2JzZXJ2ZXI6Il9fYWx0Q2hhbmdlZCJ9LF9fY29vbGluZ0Rvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LF9fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXM6ZnVuY3Rpb24oYSxjKXtyZXR1cm5bYXx8Yz8iYWN0aXZlIjoiIixjPyJjb29sZG93biI6IiJdLmpvaW4oIiAiKX0sX19hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dGhpcy5fX3NldEFyaWFIaWRkZW4oIWEpO3RoaXMuX19jb29saW5nRG93bj0hYSYmY30sX19hbHRDaGFuZ2VkOmZ1bmN0aW9uKGEpeyJsb2FkaW5nIj09PWE/dGhpcy5hbHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKXx8YToodGhpcy5fX3NldEFyaWFIaWRkZW4oIiI9PT0KYSksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGEpKX0sX19zZXRBcmlhSGlkZGVuOmZ1bmN0aW9uKGEpe2E/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSxfX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fX2Nvb2xpbmdEb3duPXRoaXMuYWN0aXZlPSExfX07Cjwvc2NyaXB0PgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgLyogU1RZTEVTIEZPUiBUSEUgU1BJTk5FUiAqLwogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKgogICAgICAgKiBDb25zdGFudHM6CiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKQogICAgICAgKiAgICAgIEFSQ1RJTUUgICAgID0gMTMzM21zICh0aW1lIGl0IHRha2VzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgYXJjKQogICAgICAgKiAgICAgIEFSQ1NUQVJUUk9UID0gMjE2IGRlZ3JlZXMgKGhvdyBtdWNoIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgYXJjCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGEKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgcG9pbnRlZCBzdGFyIHNoYXBlIChpdCdzIDM2MC81ICogMykuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSA3IHBvaW50ZWQgc3Rhciwgd2UgbWlnaHQgZG8KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpCiAgICAgICAqICAgICAgU0hSSU5LX1RJTUUgPSA0MDBtcwogICAgICAgKi8KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKCiAgICAgICAgLyogMzYwICogQVJDVElNRSAvIChBUkNTVEFSVFJPVCArICgzNjAtQVJDU0laRSkpICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbjogMTU2OG1zOwoKICAgICAgICAvKiBBUkNUSU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbjogMTMzM21zOwoKICAgICAgICAvKiA0ICogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uOiA1MzMybXM7CgogICAgICAgIC8qIFNIUklOS19USU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uOiA0MDBtczsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKCiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlCiAgICAgICAgICogZmxpcHBlZCBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIEFsd2F5cyB1c2UgbHRyIHNvIHRoYXQgdGhlCiAgICAgICAgICogc3R5bGUgd29ya3Mgb3V0IGNvcnJlY3RseSBpbiBib3RoIGNhc2VzLiAqLwogICAgICAgIGRpcmVjdGlvbjogbHRyOwogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjb250YWluZXItcm90YXRlIHsKICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0KICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTEgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTEtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItMiB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3IsIHZhcigtLWdvb2dsZS15ZWxsb3ctNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci00IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci00LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKToKICAgICAgICoKICAgICAgICogaU9TIFNhZmFyaSAodGVzdGVkIG9uIGlPUyA4LjEpIGRvZXMgbm90IGhhbmRsZSBhbmltYXRpb24tZGVsYXkgdmVyeSB3ZWxsIC0gaXQgZG9lc24ndAogICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nCiAgICAgICAqIGFuaW1hdGlvbi1kZWxheSBhbmQgaW5zdGVhZCBzZXQgY3VzdG9tIGtleWZyYW1lcyBmb3IgZWFjaCBjb2xvciAoYXMgbGF5ZXItMnVuZGFudCBhcyBpdAogICAgICAgKiBzZWVtcykuCiAgICAgICAqLwogICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0xIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMi1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0zIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci00IHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovCiAgICAgICAgMjUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovCiAgICAgICAgNjIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovCiAgICAgICAgdG8gICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi8KICAgICAgICAzNy41JSB7IHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi8KICAgICAgICA3NSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovCiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0xLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMi1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTMtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhdGNoIHRoZSBnYXAgdGhhdCBhcHBlYXIgYmV0d2VlbiB0aGUgdHdvIGFkamFjZW50IGRpdi5jaXJjbGUtY2xpcHBlciB3aGlsZSB0aGUKICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLgogICAgICAgKi8KICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyIHsKICAgICAgICBsZWZ0OiA0NSU7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLAogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMjAwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0OjphZnRlciB7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IC0xMDAlOwogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmdhcC1wYXRjaDo6YWZ0ZXIsCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluOwogICAgICB9CgogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlLCBmYWRlLW91dCB2YXIoLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uKSBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItbGl0ZSI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogICAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItc3Bpbm5lci9wYXBlci1zcGlubmVyLWxpdGUuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItc3Bpbm5lci1saXRlIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3JdfSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZGFzaGJvYXJkLWNvbW1vbi9kYXRhLWxvYWRlci1iZWhhdmlvci5qcwooZnVuY3Rpb24oYSl7YS5EYXRhTG9hZGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfbG9hZERhdGFJZkFjdGl2ZSJ9LGxvYWRLZXk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxkYXRhVG9Mb2FkOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5jPT5TdHJpbmcoYyl9LGxvYWREYXRhQ2FsbGJhY2s6RnVuY3Rpb24scmVxdWVzdERhdGE6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYz0+dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHRoaXMuZ2V0RGF0YUxvYWRVcmwoYykpfX0sZ2V0RGF0YUxvYWRVcmw6RnVuY3Rpb24sZGF0YUxvYWRpbmc6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LF9sb2FkZWREYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFNldH0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT5uZXcgUGsuQ2FuY2VsbGVyfX0sb2JzZXJ2ZXJzOlsiX2RhdGFUb0xvYWRDaGFuZ2VkKGlzQXR0YWNoZWQsIGRhdGFUb0xvYWQuKikiXSxvbkxvYWRGaW5pc2goKXt9LHJlbG9hZCgpe3RoaXMuX2xvYWRlZERhdGEuY2xlYXIoKTt0aGlzLl9sb2FkRGF0YSgpfSxyZXNldCgpe3RoaXMuX2NhbmNlbGxlciYmdGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3RoaXMuX2xvYWRlZERhdGEmJnRoaXMuX2xvYWRlZERhdGEuY2xlYXIoKTt0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2xvYWREYXRhKCl9LF9kYXRhVG9Mb2FkQ2hhbmdlZCgpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sY3JlYXRlZCgpe3RoaXMuX2xvYWREYXRhPV8uZGVib3VuY2UodGhpcy5fbG9hZERhdGFJbXBsLDEwMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pfSxkZXRhY2hlZCgpe3RoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTt0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpfSwKX2xvYWREYXRhSWZBY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbG9hZERhdGEoKX0sX2xvYWREYXRhSW1wbCgpe3RoaXMuYWN0aXZlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9sb2FkRGF0YUFzeW5jKSx0aGlzLl9sb2FkRGF0YUFzeW5jPXRoaXMuYXN5bmMoKCk9Pnt0aGlzLl9zZXREYXRhTG9hZGluZyghMCk7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2NvbnN0IGM9dGhpcy5kYXRhVG9Mb2FkLmZpbHRlcihkPT57ZD10aGlzLmdldERhdGFMb2FkTmFtZShkKTtyZXR1cm4hdGhpcy5fbG9hZGVkRGF0YS5oYXMoZCl9KS5tYXAoZD0+e2NvbnN0IGY9dGhpcy5nZXREYXRhTG9hZE5hbWUoZCksZz10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUobD0+e2wuY2FuY2VsbGVkfHwodGhpcy5fbG9hZGVkRGF0YS5hZGQoZiksdGhpcy5sb2FkRGF0YUNhbGxiYWNrKHRoaXMsZCxsLnZhbHVlKSl9KTtyZXR1cm4gdGhpcy5yZXF1ZXN0RGF0YShkKS50aGVuKGcpfSk7cmV0dXJuIFByb21pc2UuYWxsKGMpLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9Pgp7dGhpcy5fc2V0RGF0YUxvYWRpbmcoITEpO2lmKCFkLmNhbmNlbGxlZCl0aGlzLm9uTG9hZEZpbmlzaCgpfSkpfSkpfX19KShXbHx8KFdsPXt9KSk7Cjwvc2NyaXB0PgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1pbXBvcnRzL3Bsb3R0YWJsZS5qcwovKgogTUlUCiBNSVQKIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyB0aGUgU2lnbmF0dXJlIEFQSSB0byBoZWxwIGluIGNvbXBhcmluZyB3aGVuIHR3bwogUGxvdHRhYmxlIG9iamVjdHMgaGF2ZSAiY2hhbmdlZCIuCgogTWVtb2l6YXRpb24gaW4gUGxvdHRhYmxlIGlzIGNvbXBsaWNhdGVkIGJ5IG11dGFibGUgc2NhbGVzIGFuZCBkYXRhc2V0cy4gV2UgY2Fubm90IHNpbXBseQogcmVmZXJlbmNlIGNvbXBhcmUgdHdvIGUuZy4gc2NhbGVzIHNpbmNlIGl0IG1heSBoYXZlIGludGVybmFsbHkgbXV0YXRlZC4gVG8gcmVzb2x2ZSB0aGlzLAogd2Ugd3JpdGUgYSByZWN1cnNpdmUgU2lnbmF0dXJlIGludGVyZmFjZSB0aGF0IGhvbGRzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiB3aGF0ZXZlcgogc3RhdGUgdGhlIHNjYWxlL2RhdGEgd2FzIGluIGF0IHRoZSB0aW1lLiBUaGVuIG9uIG1lbW9pemVkIGZ1bmN0aW9uIGludm9jYXRpb24gd2Ugc2lnbiB0aGUKIG5ldyBpbnB1dHMgYW5kIGNvbXBhcmUgdGhlIHNpZ25hdHVyZXMgdG8gZGVjaWRlIGlmIHdlIHNob3VsZCByZWNvbXB1dGUuCgogV2UgbXVzdCBoYW5kLXdyaXRlIGEgc2lnbmF0dXJlIGZvciBlYWNoIGN1c3RvbSBjbGFzcyB3ZSB3aXNoIHRvIHN1cHBvcnQuCiBNSVQKCiBAZmlsZW92ZXJ2aWV3IG1hbnVhbGx5IGFkZCBkMy1zZWxlY3Rpb24tbXVsdGkgdG8gZDMgZGVmYXVsdCBidW5kbGUuIE1vc3Qgb2YgdGhpcyBjb2RlIGlzCiBjb3BpZWQgZnJvbSBkMy1zZWxlY3Rpb24tbXVsdGlAMS4wLjAuCiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLXNlbGVjdGlvbi1tdWx0aS9pc3N1ZXMvMTEgZm9yIHdoeSB3ZSBoYXZlIHRvIGRvIHRoaXMKIE1JVAogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIGEgY29udmVuaWVudCB0aHVuayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIGNvbW1vbiBjYXNlCiBvZiBjcmVhdGluZyBhIG1lbW9pemVkIGZ1bmN0aW9uIHRoYXQgdGFrZXMgaXRzIGlucHV0cyBmcm9tIG11dGFibGUgY2xhc3MgcHJvcGVydGllcy4KIE1JVAogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIGEgZnVuY3Rpb24gbWVtb2l6ZXIgdXNpbmcgdGhlIFNpZ25hdHVyZSBBUEkuCiBQbG90dGFibGUgMy43LjAgKGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci9wbG90dGFibGUpCiBDb3B5cmlnaHQgMjAxNC0yMDE3IFBhbGFudGlyIFRlY2hub2xvZ2llcwogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvcGxvdHRhYmxlL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpCiBpcy1wbGFpbi1vYmplY3QgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLXBsYWluLW9iamVjdD4KCiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgSm9uIFNjaGxpbmtlcnQuCiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiBpc29iamVjdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXNvYmplY3Q+CgogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LgogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgoqLwooZnVuY3Rpb24oYSxjKXsib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9YyhyZXF1aXJlKCJkMyIpKToiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJkMyJdLGMpOiJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5QbG90dGFibGU9YyhyZXF1aXJlKCJkMyIpKTphLlBsb3R0YWJsZT1jKGEuZDMpfSkodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZChnKXtpZihmW2ddKXJldHVybiBmW2ddLmV4cG9ydHM7dmFyIGw9ZltnXT17aTpnLGw6ITEsZXhwb3J0czp7fX07Y1tnXS5jYWxsKGwuZXhwb3J0cyxsLGwuZXhwb3J0cyxkKTtsLmw9ITA7cmV0dXJuIGwuZXhwb3J0c312YXIgZj17fTtkLm09YztkLmM9ZjtkLmk9ZnVuY3Rpb24oZyl7cmV0dXJuIGd9O2QuZD1mdW5jdGlvbihnLGwsayl7ZC5vKGcsbCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLApsLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6a30pfTtkLm49ZnVuY3Rpb24oZyl7dmFyIGw9ZyYmZy5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGdbImRlZmF1bHQiXX06ZnVuY3Rpb24oKXtyZXR1cm4gZ307ZC5kKGwsImEiLGwpO3JldHVybiBsfTtkLm89ZnVuY3Rpb24oZyxsKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGcsbCl9O2QucD0iIjtyZXR1cm4gZChkLnM9MTQwKX0oW2Z1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fChkW2tdPWxba10pfWM9ZigxMDcpO2QuQXJyYXk9YztjPWYoMTEwKTtkLkNvbG9yPWM7Yz1mKDU1KTtkLkRPTT1jO2M9Zig1Nik7ZC5NYXRoPWM7Yz1mKDExMyk7ZC5PYmplY3Q9YztjPWYoNTcpO2QuUlRyZWU9YztjPWYoMTE1KTtkLlN0YWNraW5nPWM7Yz1mKDM1KTtkLldpbmRvdz1jO2coZigxMDgpKTtnKGYoMTA5KSk7ZyhmKDEyKSk7CmcoZigxMTEpKTtnKGYoMTEyKSk7ZyhmKDU4KSk7ZyhmKDExNikpfSxmdW5jdGlvbihjKXtjLmV4cG9ydHM9YX0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoRixELEIpe3ZhciBHPUQuYWNjZXNzb3I7RD1ELnNjYWxlO2lmKG51bGw9PUQpcmV0dXJuW107dmFyIEs9Ri5kYXRhKCk7bnVsbCE9QiYmKEs9Sy5maWx0ZXIoZnVuY3Rpb24oTCxKKXtyZXR1cm4gQihMLEosRil9KSk7Sz1LLm1hcChmdW5jdGlvbihMLEope3JldHVybiBHKEwsSixGKX0pO3JldHVybiBELmV4dGVudE9mVmFsdWVzKEspfXZhciBsPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihGLEQpe2Z1bmN0aW9uIEIoKXt0aGlzLmNvbnN0cnVjdG9yPUZ9Zm9yKHZhciBHIGluIEQpRC5oYXNPd25Qcm9wZXJ0eShHKSYmKEZbR109RFtHXSk7Ri5wcm90b3R5cGU9bnVsbD09PUQ/T2JqZWN0LmNyZWF0ZShEKTooQi5wcm90b3R5cGU9RC5wcm90b3R5cGUsbmV3IEIpfSxrPWYoMSksbT1mKDcpO2M9Zig0KTt2YXIgcD0KZigxOCkscT1mKDYpLHI9Zig5KSx0PWYoMjApLHY9ZigwKSxBPWYoMTIpLHk9ZigxMCkseD1mKDUxKSxDPWYoNTIpO2QuUmVuZGVyZXI9eS5tYWtlRW51bShbInN2ZyIsImNhbnZhcyJdKTtmPWZ1bmN0aW9uKEYpe2Z1bmN0aW9uIEQoKXt2YXIgQj1GLmNhbGwodGhpcyl8fHRoaXM7Qi5fZGF0YUNoYW5nZWQ9ITE7Qi5fYXR0ckV4dGVudHM9e307Qi5fYW5pbWF0ZT0hMTtCLl9hbmltYXRvcnM9e307Qi5fcHJvcGVydHlFeHRlbnRzPXt9O0IuX3Jlc2V0RW50aXR5U3RvcmU9ZnVuY3Rpb24oKXtCLl9jYWNoZWRFbnRpdHlTdG9yZT12b2lkIDB9O0IuX292ZXJmbG93SGlkZGVuPSEwO0IuYWRkQ2xhc3MoInBsb3QiKTtCLl9kYXRhc2V0VG9EcmF3ZXI9bmV3IHYuTWFwO0IuX2F0dHJCaW5kaW5ncz1rLm1hcCgpO0IuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24oSyxMKXtyZXR1cm4gQi5faW5jbHVkZWRWYWx1ZXNGb3JTY2FsZShLLEwpfTtCLl9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBCLnJlbmRlcigpfTsKQi5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQi5fb25EYXRhc2V0VXBkYXRlKCl9O0IuX3Byb3BlcnR5QmluZGluZ3M9ay5tYXAoKTt2YXIgRz0obmV3IG0uRWFzaW5nKS5tYXhUb3RhbER1cmF0aW9uKEQuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0IuYW5pbWF0b3IoeC5BbmltYXRvci5NQUlOLEcpO0IuYW5pbWF0b3IoeC5BbmltYXRvci5SRVNFVCxuZXcgbS5OdWxsKTtCLl9kZWZlcnJlZFJlc2V0RW50aXR5U3RvcmU9di5XaW5kb3cuZGVib3VuY2UoQy5EZWZlcnJlZFJlbmRlcmVyLkRFRkVSUkVEX1JFTkRFUklOR19ERUxBWSxCLl9yZXNldEVudGl0eVN0b3JlKTtyZXR1cm4gQn1sKEQsRik7RC5nZXRUb3RhbERyYXdUaW1lPWZ1bmN0aW9uKEIsRyl7cmV0dXJuIEcucmVkdWNlKGZ1bmN0aW9uKEssTCl7cmV0dXJuIEsrTC5hbmltYXRvci50b3RhbFRpbWUoQi5sZW5ndGgpfSwwKX07RC5hcHBseURyYXdTdGVwcz1mdW5jdGlvbihCLEcpe3JldHVybiBCLm1hcChmdW5jdGlvbihLKXt2YXIgTD0KSy5hdHRyVG9Qcm9qZWN0b3IsSj17fTtPYmplY3Qua2V5cyhMKS5mb3JFYWNoKGZ1bmN0aW9uKFApe0pbUF09ZnVuY3Rpb24oUyxOKXtyZXR1cm4gTFtQXShTLE4sRyl9fSk7cmV0dXJue2F0dHJUb0FwcGxpZWRQcm9qZWN0b3I6SixhbmltYXRvcjpLLmFuaW1hdG9yfX0pfTtELnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24oQil7Qj1BLmNvZXJjZUV4dGVybmFsRDMoQik7Ri5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyxCKTt0aGlzLl9kYXRhQ2hhbmdlZD0hMDt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgQj10aGlzO3RoaXMuX2lzU2V0dXB8fChGLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSxudWxsIT10aGlzLl9jYW52YXMmJnRoaXMuX2FwcGVuZENhbnZhc05vZGUoKSx0aGlzLl9yZW5kZXJBcmVhPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInJlbmRlci1hcmVhIiwKITApLHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEcpe3JldHVybiBCLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQoRyl9KSl9O0QucHJvdG90eXBlLl9hcHBlbmRDYW52YXNOb2RlPWZ1bmN0aW9uKCl7dmFyIEI9dGhpcy5lbGVtZW50KCkuc2VsZWN0KCIucGxvdC1jYW52YXMtY29udGFpbmVyIik7Qi5lbXB0eSgpJiYoQj10aGlzLmVsZW1lbnQoKS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoInBsb3QtY2FudmFzLWNvbnRhaW5lciIsITApLEIubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX2NhbnZhcy5ub2RlKCkpKX07RC5wcm90b3R5cGUuc2V0Qm91bmRzPWZ1bmN0aW9uKEIsRyxLLEwpe0YucHJvdG90eXBlLnNldEJvdW5kcy5jYWxsKHRoaXMsQixHLEssTCk7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO251bGwhPXRoaXMuX2NhbnZhcyYmKHRoaXMuX2J1ZmZlckNhbnZhcyYmIXRoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkJiYodGhpcy5fYnVmZmVyQ2FudmFzLmF0dHIoIndpZHRoIiwKdGhpcy5fY2FudmFzLmF0dHIoIndpZHRoIikpLHRoaXMuX2J1ZmZlckNhbnZhcy5hdHRyKCJoZWlnaHQiLHRoaXMuX2NhbnZhcy5hdHRyKCJoZWlnaHQiKSksKEs9dGhpcy5fYnVmZmVyQ2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKSYmSy5kcmF3SW1hZ2UodGhpcy5fY2FudmFzLm5vZGUoKSwwLDApLHRoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkPSEwKSxLPW51bGwhPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvP3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjEsdGhpcy5fY2FudmFzLmF0dHIoIndpZHRoIixCKkspLHRoaXMuX2NhbnZhcy5hdHRyKCJoZWlnaHQiLEcqSyksTD10aGlzLl9jYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIikpJiYoTC5zZXRUcmFuc2Zvcm0oSywwLDAsSywwLDApLHRoaXMuX2J1ZmZlckNhbnZhcyYmTC5kcmF3SW1hZ2UodGhpcy5fYnVmZmVyQ2FudmFzLm5vZGUoKSwwLDAsQixHKSl9O0QucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgQj10aGlzOwpGLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fc2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihHKXtyZXR1cm4gRy5vZmZVcGRhdGUoQi5fcmVuZGVyQ2FsbGJhY2spfSk7dGhpcy5kYXRhc2V0cyhbXSl9O0QucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oQil7Qj10aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KEIpOyJzdmciPT09dGhpcy5yZW5kZXJlcigpP0IudXNlU1ZHKHRoaXMuX3JlbmRlckFyZWEpOkIudXNlQ2FudmFzKHRoaXMuX2NhbnZhcyk7cmV0dXJuIEJ9O0QucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHEuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIuU1ZHRHJhd2VyKCJwYXRoIiwiIil9LGZ1bmN0aW9uKEIpe3JldHVybiBuZXcgcC5DYW52YXNEcmF3ZXIoQixmdW5jdGlvbigpe30pfSl9O0QucHJvdG90eXBlLl9nZXRBbmltYXRvcj1mdW5jdGlvbihCKXtyZXR1cm4gdGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpPwp0aGlzLl9hbmltYXRvcnNbQl18fG5ldyBtLk51bGw6bmV3IG0uTnVsbH07RC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUV4dGVudHMoKTt0aGlzLl9kYXRhQ2hhbmdlZD0hMDt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7dGhpcy5yZW5kZXJMb3dQcmlvcml0eSgpfTtELnByb3RvdHlwZS5hdHRyPWZ1bmN0aW9uKEIsRyxLKXtpZihudWxsPT1HKXJldHVybiB0aGlzLl9hdHRyQmluZGluZ3MuZ2V0KEIpO3RoaXMuX2JpbmRBdHRyKEIsRyxLKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fYmluZFByb3BlcnR5PWZ1bmN0aW9uKEIsRyxLLEwpe3ZhciBKPXRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEIpO0o9bnVsbCE9Sj9KLnNjYWxlOm51bGw7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5zZXQoQix7YWNjZXNzb3I6ImZ1bmN0aW9uIj09PXR5cGVvZiBHP0c6ZnVuY3Rpb24oKXtyZXR1cm4gR30sc2NhbGU6Syxwb3N0U2NhbGU6TH0pOwpudWxsIT1KJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShKLEIpO251bGwhPUsmJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShLLEIpO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX07RC5wcm90b3R5cGUuX2JpbmRBdHRyPWZ1bmN0aW9uKEIsRyxLKXt2YXIgTD10aGlzLl9hdHRyQmluZGluZ3MuZ2V0KEIpO0w9bnVsbCE9TD9MLnNjYWxlOm51bGw7dGhpcy5fYXR0ckJpbmRpbmdzLnNldChCLHthY2Nlc3NvcjoiZnVuY3Rpb24iPT09dHlwZW9mIEc/RzpmdW5jdGlvbigpe3JldHVybiBHfSxzY2FsZTpLfSk7bnVsbCE9TCYmdGhpcy5fdW5pbnN0YWxsU2NhbGVGb3JLZXkoTCxCKTtudWxsIT1LJiZ0aGlzLl9pbnN0YWxsU2NhbGVGb3JLZXkoSyxCKTt0aGlzLl9jbGVhckF0dHJUb1Byb2plY3RvckNhY2hlKCl9O0QucHJvdG90eXBlLl9jbGVhckF0dHJUb1Byb2plY3RvckNhY2hlPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcn07RC5wcm90b3R5cGUuX2dldEF0dHJUb1Byb2plY3Rvcj0KZnVuY3Rpb24oKXtudWxsPT10aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3ImJih0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3I9dGhpcy5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IoKSk7cmV0dXJuIHYuT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3IpfTtELnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQj17fTt0aGlzLl9hdHRyQmluZGluZ3MuZWFjaChmdW5jdGlvbihLLEwpe0JbTF09RC5fc2NhbGVkQWNjZXNzb3IoSyl9KTt2YXIgRz10aGlzLl9wcm9wZXJ0eVByb2plY3RvcnMoKTtPYmplY3Qua2V5cyhHKS5mb3JFYWNoKGZ1bmN0aW9uKEspe251bGw9PUJbS10mJihCW0tdPUdbS10pfSk7cmV0dXJuIEJ9O0QucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7Ri5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9pc0FuY2hvcmVkJiYodGhpcy5fcGFpbnQoKSwKdGhpcy5fZGF0YUNoYW5nZWQ9ITEpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW5kZXJMb3dQcmlvcml0eT1mdW5jdGlvbigpe3RoaXMuX3JlbmRlckNhbGxiYWNrKCl9O0QucHJvdG90eXBlLmFuaW1hdGVkPWZ1bmN0aW9uKEIpe2lmKG51bGw9PUIpcmV0dXJuIHRoaXMuX2FuaW1hdGU7dGhpcy5fYW5pbWF0ZT1CO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXtGLnByb3RvdHlwZS5kZXRhY2guY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9zY2FsZXM9ZnVuY3Rpb24oKXt2YXIgQj1bXTt0aGlzLl9hdHRyQmluZGluZ3MuZWFjaChmdW5jdGlvbihHKXtHPUcuc2NhbGU7bnVsbCE9RyYmLTE9PT1CLmluZGV4T2YoRykmJkIucHVzaChHKX0pO3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZWFjaChmdW5jdGlvbihHKXtHPUcuc2NhbGU7bnVsbCE9RyYmLTE9PT1CLmluZGV4T2YoRykmJkIucHVzaChHKX0pOwpyZXR1cm4gQn07RC5wcm90b3R5cGUuX3VwZGF0ZUV4dGVudHM9ZnVuY3Rpb24oKXt2YXIgQj10aGlzO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEcpe3JldHVybiBHLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIoQi5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9KX07RC5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O0QucHJvdG90eXBlLmdldEV4dGVudHNGb3JBdHRyPWZ1bmN0aW9uKEIpe3ZhciBHPXRoaXM7bnVsbD09dGhpcy5fYXR0ckV4dGVudHNbQl0mJih0aGlzLl9hdHRyRXh0ZW50c1tCXT10Lm1lbVRodW5rKGZ1bmN0aW9uKCl7cmV0dXJuIEcuZGF0YXNldHMoKX0sZnVuY3Rpb24oKXtyZXR1cm4gRy5fYXR0ckJpbmRpbmdzLmdldChCKX0sZnVuY3Rpb24oSyxMKXtyZXR1cm4gbnVsbD09THx8bnVsbD09TC5hY2Nlc3Nvcj9udWxsOksubWFwKGZ1bmN0aW9uKEope3JldHVybiBnKEosCkwsbnVsbCl9KX0pKTtyZXR1cm4gdGhpcy5fYXR0ckV4dGVudHNbQl0oKX07RC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKEIpe3ZhciBHPXRoaXM7bnVsbD09dGhpcy5fcHJvcGVydHlFeHRlbnRzW0JdJiYodGhpcy5fcHJvcGVydHlFeHRlbnRzW0JdPXQubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4gRy5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiBHLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChCKX0sZnVuY3Rpb24oKXtyZXR1cm4gRy5fZmlsdGVyRm9yUHJvcGVydHkoQil9LGZ1bmN0aW9uKEssTCxKKXtyZXR1cm4gbnVsbD09THx8bnVsbD09TC5hY2Nlc3Nvcj9udWxsOksubWFwKGZ1bmN0aW9uKFApe3JldHVybiBnKFAsTCxKKX0pfSkpO3JldHVybiB0aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl0oKX07RC5wcm90b3R5cGUuX2luY2x1ZGVkVmFsdWVzRm9yU2NhbGU9ZnVuY3Rpb24oQixHKXt2YXIgSz10aGlzO2lmKCF0aGlzLl9pc0FuY2hvcmVkJiYKIUcpcmV0dXJuW107dmFyIEw9W107dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSixQKXtKLnNjYWxlPT09QiYmKEo9Sy5nZXRFeHRlbnRzRm9yQXR0cihQKSxudWxsIT1KJiYoTD1MLmNvbmNhdChrLm1lcmdlKEopKSkpfSk7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEosUCl7Si5zY2FsZT09PUImJihKPUsuZ2V0RXh0ZW50c0ZvclByb3BlcnR5KFApLG51bGwhPUomJihMPUwuY29uY2F0KGsubWVyZ2UoSikpKSl9KTtyZXR1cm4gTH07RC5wcm90b3R5cGUuYW5pbWF0b3I9ZnVuY3Rpb24oQixHKXtpZih2b2lkIDA9PT1HKXJldHVybiB0aGlzLl9hbmltYXRvcnNbQl07dGhpcy5fYW5pbWF0b3JzW0JdPUc7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbmRlcmVyPWZ1bmN0aW9uKEIpe3ZhciBHPXRoaXM7aWYodm9pZCAwPT09QilyZXR1cm4gbnVsbD09dGhpcy5fY2FudmFzPyJzdmciOiJjYW52YXMiO251bGw9PXRoaXMuX2NhbnZhcyYmImNhbnZhcyI9PT0KQj8odGhpcy5fY2FudmFzPWsuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpKS5jbGFzc2VkKCJwbG90LWNhbnZhcyIsITApLHRoaXMuX2J1ZmZlckNhbnZhcz1rLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSksbnVsbCE9dGhpcy5lbGVtZW50KCkmJnRoaXMuX2FwcGVuZENhbnZhc05vZGUoKSx0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbihLKXtLLnVzZUNhbnZhcyhHLl9jYW52YXMpfSksdGhpcy5yZW5kZXIoKSk6bnVsbCE9dGhpcy5fY2FudmFzJiYic3ZnIj09QiYmKHRoaXMuX2NhbnZhcy5yZW1vdmUoKSx0aGlzLl9idWZmZXJDYW52YXM9dGhpcy5fY2FudmFzPW51bGwsdGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goZnVuY3Rpb24oSyl7Sy51c2VTVkcoRy5fcmVuZGVyQXJlYSl9KSx0aGlzLnJlbmRlcigpKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuYWRkRGF0YXNldD1mdW5jdGlvbihCKXt0aGlzLl9hZGREYXRhc2V0KEIpOwp0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oQil7dGhpcy5fcmVtb3ZlRGF0YXNldChCKTt2YXIgRz10aGlzLl9jcmVhdGVEcmF3ZXIoQik7dGhpcy5fZGF0YXNldFRvRHJhd2VyLnNldChCLEcpO3RoaXMuX2lzU2V0dXAmJnRoaXMuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldChCKTtCLm9uVXBkYXRlKHRoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihCKXt0aGlzLl9yZW1vdmVEYXRhc2V0KEIpO3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpfTtELnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbihCKXtpZigtMT09PXRoaXMuZGF0YXNldHMoKS5pbmRleE9mKEIpKXJldHVybiB0aGlzO3RoaXMuX3JlbW92ZURhdGFzZXROb2RlcyhCKTtCLm9mZlVwZGF0ZSh0aGlzLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjayk7dGhpcy5fZGF0YXNldFRvRHJhd2VyLmRlbGV0ZShCKTsKcmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oQil7dGhpcy5fZGF0YXNldFRvRHJhd2VyLmdldChCKS5yZW1vdmUoKX07RC5wcm90b3R5cGUuZGF0YXNldHM9ZnVuY3Rpb24oQil7dmFyIEc9dGhpcyxLPVtdO3RoaXMuX2RhdGFzZXRUb0RyYXdlci5mb3JFYWNoKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEsucHVzaChKKX0pO2lmKG51bGw9PUIpcmV0dXJuIEs7Sy5mb3JFYWNoKGZ1bmN0aW9uKEwpe3JldHVybiBHLl9yZW1vdmVEYXRhc2V0KEwpfSk7Qi5mb3JFYWNoKGZ1bmN0aW9uKEwpe3JldHVybiBHLl9hZGREYXRhc2V0KEwpfSk7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyBtLk51bGx9XX07RC5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD0KZnVuY3Rpb24oKXt9O0QucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzPWZ1bmN0aW9uKEIpe3ZhciBHPXRoaXMsSz1bXTtCLmZvckVhY2goZnVuY3Rpb24oTCxKKXt2YXIgUD1HLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KEwpLFM9MDtMLmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKE4sVCl7dmFyIFk9Ry5fcGl4ZWxQb2ludChOLFQsTCk7di5NYXRoLmlzTmFOKFkueCl8fHYuTWF0aC5pc05hTihZLnkpfHwoSy5wdXNoKHtkYXR1bTpOLGdldCBwb3NpdGlvbigpe3JldHVybiBHLl9waXhlbFBvaW50LmNhbGwoRyxOLFQsTCl9LGluZGV4OlQsZGF0YXNldDpMLGRhdGFzZXRJbmRleDpKLGNvbXBvbmVudDpHLGRyYXdlcjpQLHZhbGlkRGF0dW1JbmRleDpTfSksUysrKX0pfSk7cmV0dXJuIEt9O0QucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEI9bmV3IHYuTWFwO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEcpe3JldHVybiBCLnNldChHLApHLmRhdGEoKSl9KTtyZXR1cm4gQn07RC5wcm90b3R5cGUuX3BhaW50PWZ1bmN0aW9uKCl7dmFyIEI9dGhpcztkZWxldGUgdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yO3ZhciBHPXRoaXMuX2dlbmVyYXRlRHJhd1N0ZXBzKCksSz10aGlzLl9nZXREYXRhVG9EcmF3KCksTD10aGlzLmRhdGFzZXRzKCkubWFwKGZ1bmN0aW9uKFApe3JldHVybiBCLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KFApfSk7aWYoImNhbnZhcyI9PT10aGlzLnJlbmRlcmVyKCkpe3ZhciBKPXRoaXMuX2NhbnZhcy5ub2RlKCk7Si5nZXRDb250ZXh0KCIyZCIpLmNsZWFyUmVjdCgwLDAsSi5jbGllbnRXaWR0aCxKLmNsaWVudEhlaWdodCk7dGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQ9ITF9dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oUCxTKXt2YXIgTj1ELmFwcGx5RHJhd1N0ZXBzKEcsUCk7TFtTXS5kcmF3KEsuZ2V0KFApLE4pfSk7Sj10aGlzLmRhdGFzZXRzKCkubWFwKGZ1bmN0aW9uKFApe3JldHVybiBELmdldFRvdGFsRHJhd1RpbWUoSy5nZXQoUCksCkcpfSk7Sj12Lk1hdGgubWF4KEosMCk7dGhpcy5fYWRkaXRpb25hbFBhaW50KEopfTtELnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEIpe3ZhciBHPXRoaXM7dm9pZCAwPT09QiYmKEI9dGhpcy5kYXRhc2V0cygpKTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSlyZXR1cm4gay5zZWxlY3RBbGwoKTt2YXIgSz1bXTtCLmZvckVhY2goZnVuY3Rpb24oTCl7TD1HLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KEwpO251bGwhPUwmJihMPUwuZ2V0VmlzdWFsUHJpbWl0aXZlcygpLEsucHVzaC5hcHBseShLLEwpKX0pO3JldHVybiBrLnNlbGVjdEFsbChLKX07RC5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oQil7dmFyIEc9dGhpcztyZXR1cm4gdGhpcy5fZ2V0RW50aXR5U3RvcmUoQikuZW50aXRpZXMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEcuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShLKX0pfTtELnByb3RvdHlwZS5fZ2V0RW50aXR5U3RvcmU9ZnVuY3Rpb24oQil7ZnVuY3Rpb24gRyhKKXtyZXR1cm4gSy5fZW50aXR5Qm91bmRzKEopfQp2YXIgSz10aGlzO2lmKHZvaWQgMCE9PUIpe3ZhciBMPW5ldyB2LkVudGl0eVN0b3JlO0wuYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXMoQiksRyx0aGlzLl9sb2NhbE9yaWdpbkJvdW5kcygpKTtyZXR1cm4gTH12b2lkIDA9PT10aGlzLl9jYWNoZWRFbnRpdHlTdG9yZSYmKEw9bmV3IHYuRW50aXR5U3RvcmUsTC5hZGRBbGwodGhpcy5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcyh0aGlzLmRhdGFzZXRzKCkpLEcsdGhpcy5fbG9jYWxPcmlnaW5Cb3VuZHMoKSksdGhpcy5fY2FjaGVkRW50aXR5U3RvcmU9TCk7cmV0dXJuIHRoaXMuX2NhY2hlZEVudGl0eVN0b3JlfTtELnByb3RvdHlwZS5fbG9jYWxPcmlnaW5Cb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm57dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6dGhpcy53aWR0aCgpLHk6dGhpcy5oZWlnaHQoKX19fTtELnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKEIpe0I9dGhpcy5fcGl4ZWxQb2ludChCLmRhdHVtLApCLmluZGV4LEIuZGF0YXNldCk7cmV0dXJue3g6Qi54LHk6Qi55LHdpZHRoOjAsaGVpZ2h0OjB9fTtELnByb3RvdHlwZS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5PWZ1bmN0aW9uKEIpe3JldHVybntib3VuZHM6dGhpcy5fZW50aXR5Qm91bmRzKEIpLGNvbXBvbmVudDpCLmNvbXBvbmVudCxkYXRhc2V0OkIuZGF0YXNldCxkYXRhc2V0SW5kZXg6Qi5kYXRhc2V0SW5kZXgsZGF0dW06Qi5kYXR1bSxpbmRleDpCLmluZGV4LHBvc2l0aW9uOkIucG9zaXRpb24sc2VsZWN0aW9uOmsuc2VsZWN0KEIuZHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZXMoKVtCLnZhbGlkRGF0dW1JbmRleF0pfX07RC5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJwbG90cyBtdXN0IGltcGxlbWVudCBlbnRpdGllc0F0Iik7fTtELnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKEIpe0I9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdHlOZWFyZXN0KEIpOwpyZXR1cm4gdm9pZCAwPT09Qj92b2lkIDA6dGhpcy5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KEIpfTtELnByb3RvdHlwZS5lbnRpdGllc0luPWZ1bmN0aW9uKEIsRyl7cmV0dXJuIHRoaXMuZW50aXRpZXNJbkJvdW5kcyhudWxsPT1HP3t4OkIudG9wTGVmdC54LHk6Qi50b3BMZWZ0Lnksd2lkdGg6Qi5ib3R0b21SaWdodC54LUIudG9wTGVmdC54LGhlaWdodDpCLmJvdHRvbVJpZ2h0LnktQi50b3BMZWZ0Lnl9Ont4OkIubWluLHk6Ry5taW4sd2lkdGg6Qi5tYXgtQi5taW4saGVpZ2h0OkcubWF4LUcubWlufSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24oQil7dmFyIEc9dGhpcztpZihCPXRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXNJbkJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEcuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShLKX0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz0KZnVuY3Rpb24oQil7dmFyIEc9dGhpcztpZihCPXRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXNJblhCb3VuZHMoQikpcmV0dXJuIEIubWFwKGZ1bmN0aW9uKEspe3JldHVybiBHLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoSyl9KX07RC5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHM9ZnVuY3Rpb24oQil7dmFyIEc9dGhpcztpZihCPXRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXNJbllCb3VuZHMoQikpcmV0dXJuIEIubWFwKGZ1bmN0aW9uKEspe3JldHVybiBHLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoSyl9KX07RC5wcm90b3R5cGUuX3VuaW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKEIpe0Iub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtCLm9mZlVwZGF0ZSh0aGlzLl9kZWZlcnJlZFJlc2V0RW50aXR5U3RvcmUpO0IucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX07CkQucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24oQil7Qi5vblVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7Qi5vblVwZGF0ZSh0aGlzLl9kZWZlcnJlZFJlc2V0RW50aXR5U3RvcmUpO0IuYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX07RC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3JldHVybnt9fTtELl9zY2FsZWRBY2Nlc3Nvcj1mdW5jdGlvbihCKXt2YXIgRz1CLnNjYWxlLEs9Qi5hY2Nlc3NvcixMPUIucG9zdFNjYWxlLEo9bnVsbD09Rz9LOmZ1bmN0aW9uKFAsUyxOKXtyZXR1cm4gRy5zY2FsZShLKFAsUyxOKSl9O3JldHVybiBudWxsPT1MP0o6ZnVuY3Rpb24oUCxTLE4pe3JldHVybiBMKEooUCxTLE4pLFAsUyxOKX19O0QucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJue3g6MCx5OjB9fTtELnByb3RvdHlwZS5fYW5pbWF0ZU9uTmV4dFJlbmRlcj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5pbWF0ZSYmdGhpcy5fZGF0YUNoYW5nZWR9O3JldHVybiBEfShjLkNvbXBvbmVudCk7Zi5fQU5JTUFUSU9OX01BWF9EVVJBVElPTj02MDA7ZC5QbG90PWZ9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKG0pe2Zvcih2YXIgcCBpbiBtKWQuaGFzT3duUHJvcGVydHkocCl8fChkW3BdPW1bcF0pfWM9ZigxMDUpO2QuVGlja0dlbmVyYXRvcnM9YztnKGYoNTQpKTtnKGYoMTAxKSk7ZyhmKDEwMikpO2coZigxMDMpKTtnKGYoMTA0KSk7ZyhmKDEwNikpO3ZhciBsPWYoNTQpLGs9ZigxMSk7ZC5pc1RyYW5zZm9ybWFibGU9ZnVuY3Rpb24obSl7cmV0dXJuIG0gaW5zdGFuY2VvZiBrLlF1YW50aXRhdGl2ZVNjYWxlfHxtIGluc3RhbmNlb2YgbC5DYXRlZ29yeX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDEpLGw9ZigzMCksaz1mKDApLG09ZigxMik7Yz1mKDEwKTtkLlhBbGlnbm1lbnQ9Yy5tYWtlRW51bShbImxlZnQiLCJjZW50ZXIiLCJyaWdodCJdKTsKZC5ZQWxpZ25tZW50PWMubWFrZUVudW0oWyJ0b3AiLCJjZW50ZXIiLCJib3R0b20iXSk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIHAoKXt0aGlzLl9vdmVyZmxvd0hpZGRlbj0hMTt0aGlzLl9vcmlnaW49e3g6MCx5OjB9O3RoaXMuX3hBbGlnbm1lbnQ9ImxlZnQiO3RoaXMuX3lBbGlnbm1lbnQ9InRvcCI7dGhpcy5faXNBbmNob3JlZD10aGlzLl9pc1NldHVwPSExO3RoaXMuX2Nzc0NsYXNzZXM9bmV3IGsuU2V0O3RoaXMuX2Rlc3Ryb3llZD0hMTt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDt0aGlzLl9vbkRldGFjaENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDt0aGlzLl9jc3NDbGFzc2VzLmFkZCgiY29tcG9uZW50Iil9cC5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKHEpe3E9bS5jb2VyY2VFeHRlcm5hbEQzKHEpO2lmKHRoaXMuX2Rlc3Ryb3llZCl0aHJvdyBFcnJvcigiQ2FuJ3QgcmV1c2UgZGVzdHJveSgpLWVkIENvbXBvbmVudHMhIik7dGhpcy5pc1Jvb3QoKSYmCih0aGlzLl9yb290RWxlbWVudD1xLHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzZWQoInBsb3R0YWJsZSIsITApKTtudWxsIT10aGlzLl9lbGVtZW50P3Eubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQubm9kZSgpKToodGhpcy5fZWxlbWVudD1xLmFwcGVuZCgiZGl2IiksdGhpcy5fc2V0dXAoKSk7dGhpcy5faXNBbmNob3JlZD0hMDt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5vbkFuY2hvcj1mdW5jdGlvbihxKXt0aGlzLl9pc0FuY2hvcmVkJiZxKHRoaXMpO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmQW5jaG9yPWZ1bmN0aW9uKHEpe3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmRlbGV0ZShxKX07cC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIHE9dGhpczt0aGlzLl9pc1NldHVwfHwodGhpcy5fY3NzQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKHIpe3EuX2VsZW1lbnQuY2xhc3NlZChyLAohMCl9KSx0aGlzLl9jc3NDbGFzc2VzPW5ldyBrLlNldCx0aGlzLl9iYWNrZ3JvdW5kQ29udGFpbmVyPXRoaXMuX2VsZW1lbnQuYXBwZW5kKCJzdmciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kLWNvbnRhaW5lciIsITApLHRoaXMuX2NvbnRlbnQ9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImNvbnRlbnQiLCEwKSx0aGlzLl9mb3JlZ3JvdW5kQ29udGFpbmVyPXRoaXMuX2VsZW1lbnQuYXBwZW5kKCJzdmciKS5jbGFzc2VkKCJmb3JlZ3JvdW5kLWNvbnRhaW5lciIsITApLHRoaXMuX292ZXJmbG93SGlkZGVuP3RoaXMuX2NvbnRlbnQuY2xhc3NlZCgiY29tcG9uZW50LW92ZXJmbG93LWhpZGRlbiIsITApOnRoaXMuX2NvbnRlbnQuY2xhc3NlZCgiY29tcG9uZW50LW92ZXJmbG93LXZpc2libGUiLCEwKSx0aGlzLl9pc1NldHVwPSEwKX07cC5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm57bWluV2lkdGg6MCxtaW5IZWlnaHQ6MH19O3AucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHEscix0KXtpZihudWxsPT1xfHxudWxsPT1yfHxudWxsPT10KXtpZihudWxsPT10aGlzLl9lbGVtZW50KXRocm93IEVycm9yKCJhbmNob3IoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY29tcHV0ZUxheW91dCgpIik7aWYobnVsbCE9dGhpcy5fcm9vdEVsZW1lbnQpcT17eDowLHk6MH0sdD10aGlzLl9yb290RWxlbWVudC5ub2RlKCkscj1rLkRPTS5lbGVtZW50V2lkdGgodCksdD1rLkRPTS5lbGVtZW50SGVpZ2h0KHQpO2Vsc2UgdGhyb3cgRXJyb3IoIm51bGwgYXJndW1lbnRzIGNhbm5vdCBiZSBwYXNzZWQgdG8gY29tcHV0ZUxheW91dCgpIG9uIGEgbm9uLXJvb3QsIHVuYW5jaG9yZWQgbm9kZSIpO312YXIgdj10aGlzLl9zaXplRnJvbU9mZmVyKHIsdCksQT12LmhlaWdodDt2PXYud2lkdGg7dGhpcy5zZXRCb3VuZHModixBLHEueCsoci12KSpwLl94QWxpZ25Ub1Byb3BvcnRpb25bdGhpcy5feEFsaWdubWVudF0scS55Kyh0LUEpKnAuX3lBbGlnblRvUHJvcG9ydGlvblt0aGlzLl95QWxpZ25tZW50XSk7CnJldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zZXRCb3VuZHM9ZnVuY3Rpb24ocSxyLHQsdil7dm9pZCAwPT09dCYmKHQ9MCk7dm9pZCAwPT09diYmKHY9MCk7dGhpcy5fd2lkdGg9cTt0aGlzLl9oZWlnaHQ9cjt0aGlzLl9vcmlnaW49e3g6dCx5OnZ9O251bGwhPXRoaXMuX2VsZW1lbnQmJnRoaXMuX2VsZW1lbnQuc3R5bGVzKHtsZWZ0OnQrInB4IixoZWlnaHQ6cisicHgiLHRvcDp2KyJweCIsd2lkdGg6cSsicHgifSk7bnVsbCE9dGhpcy5fcmVzaXplSGFuZGxlciYmdGhpcy5fcmVzaXplSGFuZGxlcih7d2lkdGg6cSxoZWlnaHQ6cn0pfTtwLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihxLHIpe3ZhciB0PXRoaXMucmVxdWVzdGVkU3BhY2UocSxyKTtyZXR1cm57d2lkdGg6dGhpcy5maXhlZFdpZHRoKCk/TWF0aC5taW4ocSx0Lm1pbldpZHRoKTpxLGhlaWdodDp0aGlzLmZpeGVkSGVpZ2h0KCk/TWF0aC5taW4ocix0Lm1pbkhlaWdodCk6cn19O3AucHJvdG90eXBlLnJlbmRlcj0KZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9pc1NldHVwJiYwPD10aGlzLndpZHRoKCkmJjA8PXRoaXMuaGVpZ2h0KCkmJmwucmVnaXN0ZXJUb1JlbmRlcih0aGlzKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucmVuZGVyTG93UHJpb3JpdHk9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigpfTtwLnByb3RvdHlwZS5fc2NoZWR1bGVDb21wdXRlTGF5b3V0PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmbC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcih0aGlzKX07cC5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24ocSl7dGhpcy5fcmVzaXplSGFuZGxlcj1xO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9pc1NldHVwJiYodGhpcy5pc1Jvb3QoKT90aGlzLl9zY2hlZHVsZUNvbXB1dGVMYXlvdXQoKToKdGhpcy5wYXJlbnQoKS5yZWRyYXcoKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe307cC5wcm90b3R5cGUucmVuZGVyVG89ZnVuY3Rpb24ocSl7dGhpcy5kZXRhY2goKTtpZihudWxsIT1xKXtxPSJzdHJpbmciPT09dHlwZW9mIHE/Zy5zZWxlY3QocSk6cSBpbnN0YW5jZW9mIEVsZW1lbnQ/Zy5zZWxlY3QocSk6bS5jb2VyY2VFeHRlcm5hbEQzKHEpO2lmKCFxLm5vZGUoKXx8bnVsbD09cS5ub2RlKCkubm9kZU5hbWUpdGhyb3cgRXJyb3IoIlBsb3R0YWJsZSByZXF1aXJlcyBhIHZhbGlkIEVsZW1lbnQgdG8gcmVuZGVyVG8iKTtpZigic3ZnIj09PXEubm9kZSgpLm5vZGVOYW1lKXRocm93IEVycm9yKCJQbG90dGFibGUgMy54IGFuZCBsYXRlciBjYW4gb25seSByZW5kZXJUbyBhbiBIVE1MIGNvbXBvbmVudDsgcGFzcyBhIGRpdiBpbnN0ZWFkISIpO3RoaXMuYW5jaG9yKHEpfWlmKG51bGw9PXRoaXMuX2VsZW1lbnQpdGhyb3cgRXJyb3IoIklmIGEgQ29tcG9uZW50IGhhcyBuZXZlciBiZWVuIHJlbmRlcmVkIGJlZm9yZSwgdGhlbiByZW5kZXJUbyBtdXN0IGJlIGdpdmVuIGEgbm9kZSB0byByZW5kZXIgdG8sIG9yIGEgZDMuU2VsZWN0aW9uLCBvciBhIHNlbGVjdG9yIHN0cmluZyIpOwpsLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyKHRoaXMpO2wuZmx1c2goKX07cC5wcm90b3R5cGUueEFsaWdubWVudD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl94QWxpZ25tZW50O3E9cS50b0xvd2VyQ2FzZSgpO2lmKG51bGw9PXAuX3hBbGlnblRvUHJvcG9ydGlvbltxXSl0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgYWxpZ25tZW50OiAiK3EpO3RoaXMuX3hBbGlnbm1lbnQ9cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS55QWxpZ25tZW50PWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX3lBbGlnbm1lbnQ7cT1xLnRvTG93ZXJDYXNlKCk7aWYobnVsbD09cC5feUFsaWduVG9Qcm9wb3J0aW9uW3FdKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBhbGlnbm1lbnQ6ICIrcSk7dGhpcy5feUFsaWdubWVudD1xO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmhhc0NsYXNzPWZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT0KcT8hMTpudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuaGFzKHEpOnRoaXMuX2VsZW1lbnQuY2xhc3NlZChxKX07cC5wcm90b3R5cGUuYWRkQ2xhc3M9ZnVuY3Rpb24ocSl7bnVsbCE9cSYmKG51bGw9PXRoaXMuX2VsZW1lbnQ/dGhpcy5fY3NzQ2xhc3Nlcy5hZGQocSk6dGhpcy5fZWxlbWVudC5jbGFzc2VkKHEsITApKX07cC5wcm90b3R5cGUucmVtb3ZlQ2xhc3M9ZnVuY3Rpb24ocSl7bnVsbCE9cSYmKG51bGw9PXRoaXMuX2VsZW1lbnQ/dGhpcy5fY3NzQ2xhc3Nlcy5kZWxldGUocSk6dGhpcy5fZWxlbWVudC5jbGFzc2VkKHEsITEpKX07cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiExfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiExfTtwLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLnBhcmVudChudWxsKTt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9lbGVtZW50LnJlbW92ZSgpO3RoaXMuX2lzQW5jaG9yZWQ9CiExO3RoaXMuX29uRGV0YWNoQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9uRGV0YWNoPWZ1bmN0aW9uKHEpe3RoaXMuX29uRGV0YWNoQ2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmRGV0YWNoPWZ1bmN0aW9uKHEpe3RoaXMuX29uRGV0YWNoQ2FsbGJhY2tzLmRlbGV0ZShxKX07cC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHEpe2lmKHZvaWQgMD09PXEpcmV0dXJuIHRoaXMuX3BhcmVudDtpZihudWxsIT09cSYmIXEuaGFzKHRoaXMpKXRocm93IEVycm9yKCJQYXNzZWQgaW52YWxpZCBwYXJlbnQiKTt0aGlzLl9wYXJlbnQ9cTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuYm91bmRzPWZ1bmN0aW9uKCl7dmFyIHE9dGhpcy5vcmlnaW4oKTtyZXR1cm57dG9wTGVmdDpxLGJvdHRvbVJpZ2h0Ont4OnEueCt0aGlzLndpZHRoKCkseTpxLnkrdGhpcy5oZWlnaHQoKX19fTtwLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fZGVzdHJveWVkPQohMDt0aGlzLmRldGFjaCgpfTtwLnByb3RvdHlwZS53aWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWR0aH07cC5wcm90b3R5cGUuaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlaWdodH07cC5wcm90b3R5cGUub3JpZ2luPWZ1bmN0aW9uKCl7cmV0dXJue3g6dGhpcy5fb3JpZ2luLngseTp0aGlzLl9vcmlnaW4ueX19O3AucHJvdG90eXBlLm9yaWdpblRvUm9vdD1mdW5jdGlvbigpe2Zvcih2YXIgcT10aGlzLm9yaWdpbigpLHI9dGhpcy5wYXJlbnQoKTtudWxsIT1yOyl7dmFyIHQ9ci5vcmlnaW4oKTtxLngrPXQueDtxLnkrPXQueTtyPXIucGFyZW50KCl9cmV0dXJuIHF9O3AucHJvdG90eXBlLnJvb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHE9dGhpczshcS5pc1Jvb3QoKTspcT1xLnBhcmVudCgpO3JldHVybiBxfTtwLnByb3RvdHlwZS5pc1Jvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5wYXJlbnQoKX07cC5wcm90b3R5cGUuZm9yZWdyb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb3JlZ3JvdW5kQ29udGFpbmVyfTsKcC5wcm90b3R5cGUuY29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250ZW50fTtwLnByb3RvdHlwZS5lbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnR9O3AucHJvdG90eXBlLnJvb3RFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdCgpLl9yb290RWxlbWVudH07cC5wcm90b3R5cGUuYmFja2dyb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29udGFpbmVyfTtyZXR1cm4gcH0oKTtjLl94QWxpZ25Ub1Byb3BvcnRpb249e2xlZnQ6MCxjZW50ZXI6LjUscmlnaHQ6MX07Yy5feUFsaWduVG9Qcm9wb3J0aW9uPXt0b3A6MCxjZW50ZXI6LjUsYm90dG9tOjF9O2QuQ29tcG9uZW50PWN9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fChkW2tdPWxba10pfWcoZig1OSkpO2coZig2MikpO2coZigxMzMpKTtnKGYoMjEpKTtnKGYoNjQpKTtnKGYoNjYpKX0sCmZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyxsKXt0aGlzLl9zdmdEcmF3ZXJGYWN0b3J5PWc7dGhpcy5fY2FudmFzRHJhd2VyRmFjdG9yeT1sfWYucHJvdG90eXBlLnVzZVNWRz1mdW5jdGlvbihnKXtudWxsIT10aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpO3ZhciBsPXRoaXMuX3N2Z0RyYXdlckZhY3RvcnkoKTtsLmF0dGFjaFRvKGcpO3RoaXMuX2N1cnJlbnREcmF3ZXI9bH07Zi5wcm90b3R5cGUudXNlQ2FudmFzPWZ1bmN0aW9uKGcpe251bGwhPXRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCk7dGhpcy5fY3VycmVudERyYXdlcj10aGlzLl9jYW52YXNEcmF3ZXJGYWN0b3J5KGcubm9kZSgpLmdldENvbnRleHQoIjJkIikpfTtmLnByb3RvdHlwZS5nZXREcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudERyYXdlcn07Zi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7bnVsbCE9CnRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCl9O2YucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oZyxsKXt0aGlzLl9jdXJyZW50RHJhd2VyLmRyYXcoZyxsKX07Zi5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZXMoKX07Zi5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihnKXtyZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4KGcpfTtyZXR1cm4gZn0oKTtkLlByb3h5RHJhd2VyPWN9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fChkW2tdPWxba10pfWcoZig3MCkpO2coZig3MSkpfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhtKXt2b2lkIDA9PT1tJiYobT0zKTtsKG0pO3JldHVybiBmdW5jdGlvbihwKXtyZXR1cm4gcC50b0ZpeGVkKG0pfX0KZnVuY3Rpb24gbChtKXtpZigwPm18fDIwPG0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkZvcm1hdHRlciBwcmVjaXNpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIwIik7aWYobSE9PU1hdGguZmxvb3IobSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkZvcm1hdHRlciBwcmVjaXNpb24gbXVzdCBiZSBhbiBpbnRlZ2VyIik7fXZhciBrPWYoMSk7ZC5jdXJyZW5jeT1mdW5jdGlvbihtLHAscSl7dm9pZCAwPT09bSYmKG09Mik7dm9pZCAwPT09cCYmKHA9IiQiKTt2b2lkIDA9PT1xJiYocT0hMCk7dmFyIHI9ZyhtKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHY9cihNYXRoLmFicyh0KSk7IiIhPT12JiYodj1xP3Ardjp2K3AsMD50JiYodj0iLSIrdikpO3JldHVybiB2fX07ZC5maXhlZD1nO2QuZ2VuZXJhbD1mdW5jdGlvbihtKXt2b2lkIDA9PT1tJiYobT0zKTtsKG0pO3JldHVybiBmdW5jdGlvbihwKXtpZigibnVtYmVyIj09PXR5cGVvZiBwKXt2YXIgcT1NYXRoLnBvdygxMCxtKTtyZXR1cm4gU3RyaW5nKE1hdGgucm91bmQocCoKcSkvcSl9cmV0dXJuIFN0cmluZyhwKX19O2QuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obSl7cmV0dXJuIFN0cmluZyhtKX19O2QucGVyY2VudGFnZT1mdW5jdGlvbihtKXt2b2lkIDA9PT1tJiYobT0wKTt2YXIgcD1nKG0pO3JldHVybiBmdW5jdGlvbihxKXt2YXIgcj1xLnRvU3RyaW5nKCk7cj1NYXRoLnBvdygxMCxyLmxlbmd0aC0oci5pbmRleE9mKCIuIikrMSkpO3JldHVybiBwKHBhcnNlSW50KCgxMDAqcSpyKS50b1N0cmluZygpLDEwKS9yKSsiJSJ9fTtkLnNpU3VmZml4PWZ1bmN0aW9uKG0pe3ZvaWQgMD09PW0mJihtPTMpO2wobSk7cmV0dXJuIGZ1bmN0aW9uKHApe3JldHVybiBrLmZvcm1hdCgiLiIrbSsicyIpKHApfX07ZC5zaG9ydFNjYWxlPWZ1bmN0aW9uKCl7dmFyIG09MDt2b2lkIDA9PT1tJiYobT0zKTtsKG0pO3ZhciBwPWsuZm9ybWF0KCIuIittKyJlIikscT1rLmZvcm1hdCgiLiIrbSsiZiIpLHI9TWF0aC5wb3coMTAsMTgpLHQ9TWF0aC5wb3coMTAsCi1tKTtyZXR1cm4gZnVuY3Rpb24odil7dmFyIEE9TWF0aC5hYnModik7aWYoKEE8dHx8QT49cikmJjAhPT1BKXJldHVybiBwKHYpO2Zvcih2YXIgeT0tMTtBPj1NYXRoLnBvdygxRTMseSsyKSYmND55Oyl5Kys7QT0tMT09PXk/cSh2KTpxKHYvTWF0aC5wb3coMUUzLHkrMSkpKyJLTUJUUSJbeV07aWYoMDx2JiYiMTAwMCI9PT1BLnN1YnN0cigwLDQpfHwwPnYmJiItMTAwMCI9PT1BLnN1YnN0cigwLDUpKTQ+eT8oeSsrLEE9cSh2L01hdGgucG93KDFFMyx5KzEpKSsiS01CVFEiW3ldKTpBPXAodik7cmV0dXJuIEF9fTtkLm11bHRpVGltZT1mdW5jdGlvbigpe3ZhciBtPVt7c3BlY2lmaWVyOiIuJUwiLHByZWRpY2F0ZTpmdW5jdGlvbihwKXtyZXR1cm4gMCE9PXAuZ2V0TWlsbGlzZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiI6JVMiLHByZWRpY2F0ZTpmdW5jdGlvbihwKXtyZXR1cm4gMCE9PXAuZ2V0U2Vjb25kcygpfX0se3NwZWNpZmllcjoiJUk6JU0iLHByZWRpY2F0ZTpmdW5jdGlvbihwKXtyZXR1cm4gMCE9PQpwLmdldE1pbnV0ZXMoKX19LHtzcGVjaWZpZXI6IiVJICVwIixwcmVkaWNhdGU6ZnVuY3Rpb24ocCl7cmV0dXJuIDAhPT1wLmdldEhvdXJzKCl9fSx7c3BlY2lmaWVyOiIlYSAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAwIT09cC5nZXREYXkoKSYmMSE9PXAuZ2V0RGF0ZSgpfX0se3NwZWNpZmllcjoiJWIgJWQiLHByZWRpY2F0ZTpmdW5jdGlvbihwKXtyZXR1cm4gMSE9PXAuZ2V0RGF0ZSgpfX0se3NwZWNpZmllcjoiJWIiLHByZWRpY2F0ZTpmdW5jdGlvbihwKXtyZXR1cm4gMCE9PXAuZ2V0TW9udGgoKX19XTtyZXR1cm4gZnVuY3Rpb24ocCl7dmFyIHE9bS5maWx0ZXIoZnVuY3Rpb24ocil7cmV0dXJuIHIucHJlZGljYXRlKHApfSk7cmV0dXJuIGsudGltZUZvcm1hdCgwPHEubGVuZ3RoP3FbMF0uc3BlY2lmaWVyOiIlWSIpKHApfX07ZC50aW1lPWZ1bmN0aW9uKG0pe3JldHVybiBrLnRpbWVGb3JtYXQobSl9fSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigxKSxsPWYoMCk7CmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKG0scCl7dGhpcy5fcm9vdD1nLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKTt0aGlzLl9jbGFzc05hbWU9cDt0aGlzLl9zdmdFbGVtZW50TmFtZT1tfWsucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24obSxwKXt2YXIgcT10aGlzO3RoaXMuX2NyZWF0ZUFuZERlc3Ryb3lET01FbGVtZW50cyhtKTt2YXIgcj0wO3AuZm9yRWFjaChmdW5jdGlvbih0KXtsLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHEuX2RyYXdTdGVwKHQpfSxyKTtyKz10LmFuaW1hdG9yLnRvdGFsVGltZShtLmxlbmd0aCl9KX07ay5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe251bGw9PXRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlcyYmKHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlcz10aGlzLl9zZWxlY3Rpb24ubm9kZXMoKSk7cmV0dXJuIHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlc307CmsucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMuZ2V0VmlzdWFsUHJpbWl0aXZlcygpW21dfTtrLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yb290LnJlbW92ZSgpfTtrLnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbihtKXttLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9yb290Lm5vZGUoKSl9O2sucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH07ay5wcm90b3R5cGUuc2VsZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ZnRWxlbWVudE5hbWV9O2sucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7fTtrLnByb3RvdHlwZS5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzPWZ1bmN0aW9uKG0pe209bS5maWx0ZXIoZnVuY3Rpb24ocCl7cmV0dXJuIG51bGwhPXB9KTttPXRoaXMuX3Jvb3Quc2VsZWN0QWxsKHRoaXMuc2VsZWN0b3IoKSkuZGF0YShtKTsKdGhpcy5fc2VsZWN0aW9uPW0uZW50ZXIoKS5hcHBlbmQodGhpcy5fc3ZnRWxlbWVudE5hbWUpLm1lcmdlKG0pO20uZXhpdCgpLnJlbW92ZSgpO3RoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlcz1udWxsO251bGwhPXRoaXMuX2NsYXNzTmFtZSYmdGhpcy5fc2VsZWN0aW9uLmNsYXNzZWQodGhpcy5fY2xhc3NOYW1lLCEwKTt0aGlzLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzKHRoaXMuX3NlbGVjdGlvbil9O2sucHJvdG90eXBlLl9kcmF3U3RlcD1mdW5jdGlvbihtKXt2YXIgcD10aGlzO1siZmlsbCIsInN0cm9rZSJdLmZvckVhY2goZnVuY3Rpb24ocSl7bnVsbCE9bS5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW3FdJiZwLl9zZWxlY3Rpb24uYXR0cihxLG0uYXR0clRvQXBwbGllZFByb2plY3RvcltxXSl9KTttLmFuaW1hdG9yLmFuaW1hdGUodGhpcy5fc2VsZWN0aW9uLG0uYXR0clRvQXBwbGllZFByb2plY3Rvcik7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsCiEwKX07cmV0dXJuIGt9KCk7ZC5TVkdEcmF3ZXI9Y30sZnVuY3Rpb24oYyxkKXtkLm1ha2VFbnVtPWZ1bmN0aW9uKGYpe3JldHVybiBmLnJlZHVjZShmdW5jdGlvbihnLGwpe2dbbF09bDtyZXR1cm4gZ30se30pfX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLHEpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciB0IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh0KSYmKHBbdF09cVt0XSk7cC5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKTooci5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHIpfSxsPWYoMSksaz1mKDI2KSxtPWYoMCk7Yz1mdW5jdGlvbihwKXtmdW5jdGlvbiBxKCl7dmFyIHI9cC5jYWxsKHRoaXMpfHx0aGlzO3IuX3RpY2tHZW5lcmF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVmYXVsdFRpY2tzKCl9O3IuX3BhZFByb3BvcnRpb249LjA1O3IuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD0KITA7ci5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnM9bmV3IG0uU2V0O3JldHVybiByfWcocSxwKTtxLnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7dGhpcy5fZG9tYWluTWF4PXRoaXMuX2RvbWFpbk1pbj1udWxsO3AucHJvdG90eXBlLmF1dG9Eb21haW4uY2FsbCh0aGlzKX07cS5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGU9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLl9kb21haW5NaW4mJm51bGwhPXRoaXMuX2RvbWFpbk1heCl0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbix0aGlzLl9kb21haW5NYXhdKTtlbHNle3ZhciByPXRoaXMuX2dldEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbj8ocj1yWzFdLHRoaXMuX2RvbWFpbk1pbj49ciYmKHI9dGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4oW3RoaXMuX2RvbWFpbk1pbix0aGlzLl9kb21haW5NaW5dKVsxXSksdGhpcy5fc2V0RG9tYWluKFt0aGlzLl9kb21haW5NaW4scl0pKToKbnVsbCE9dGhpcy5fZG9tYWluTWF4PyhyPXJbMF0sdGhpcy5fZG9tYWluTWF4PD1yJiYocj10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWF4LHRoaXMuX2RvbWFpbk1heF0pWzBdKSx0aGlzLl9zZXREb21haW4oW3IsdGhpcy5fZG9tYWluTWF4XSkpOnAucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlLmNhbGwodGhpcyl9fTtxLnByb3RvdHlwZS5fZ2V0VW5ib3VuZGVkRXh0ZW50PWZ1bmN0aW9uKHIpe3ZvaWQgMD09PXImJihyPSExKTtyPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKHIpO3ZhciB0PXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09ci5sZW5ndGgmJihyPVttLk1hdGgubWluKHIsdFswXSksbS5NYXRoLm1heChyLHRbMV0pXSx0PXRoaXMuX3BhZERvbWFpbihyKSk7cmV0dXJuIHR9O3EucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgcj10aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoKTtudWxsIT10aGlzLl9kb21haW5NaW4mJgooclswXT10aGlzLl9kb21haW5NaW4pO251bGwhPXRoaXMuX2RvbWFpbk1heCYmKHJbMV09dGhpcy5fZG9tYWluTWF4KTtyZXR1cm4gcn07cS5wcm90b3R5cGUuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcj1mdW5jdGlvbihyKXt0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5hZGQocik7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTtxLnByb3RvdHlwZS5yZW1vdmVQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHIpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmRlbGV0ZShyKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O3EucHJvdG90eXBlLnBhZFByb3BvcnRpb249ZnVuY3Rpb24ocil7aWYobnVsbD09cilyZXR1cm4gdGhpcy5fcGFkUHJvcG9ydGlvbjtpZigwPnIpdGhyb3cgRXJyb3IoInBhZFByb3BvcnRpb24gbXVzdCBiZSBub24tbmVnYXRpdmUiKTt0aGlzLl9wYWRQcm9wb3J0aW9uPXI7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpOwpyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3BhZERvbWFpbj1mdW5jdGlvbihyKXt2YXIgdD10aGlzO2lmKHJbMF0udmFsdWVPZigpPT09clsxXS52YWx1ZU9mKCkpcmV0dXJuIHRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKHIpO2lmKDA9PT10aGlzLl9wYWRQcm9wb3J0aW9uKXJldHVybiByO3ZhciB2PXRoaXMuX3BhZFByb3BvcnRpb24vMixBPXJbMF0seT1yWzFdLHg9ITEsQz0hMTt0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uKEQpe0QodCkuZm9yRWFjaChmdW5jdGlvbihCKXtCLnZhbHVlT2YoKT09PUEudmFsdWVPZigpJiYoeD0hMCk7Qi52YWx1ZU9mKCk9PT15LnZhbHVlT2YoKSYmKEM9ITApfSl9KTt2YXIgRj10aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKTt0aGlzLl9iYWNraW5nU2NhbGVEb21haW4ocik7cj14P0E6dGhpcy5pbnZlcnQodGhpcy5zY2FsZShBKS0odGhpcy5zY2FsZSh5KS10aGlzLnNjYWxlKEEpKSp2KTt2PUM/Cnk6dGhpcy5pbnZlcnQodGhpcy5zY2FsZSh5KSsodGhpcy5zY2FsZSh5KS10aGlzLnNjYWxlKEEpKSp2KTt0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oRik7cmV0dXJuIHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD90aGlzLl9uaWNlRG9tYWluKFtyLHZdKTpbcix2XX07cS5wcm90b3R5cGUuc25hcHBpbmdEb21haW5FbmFibGVkPWZ1bmN0aW9uKHIpe251bGwhPXImJih0aGlzLl9zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9cix0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCkpfTtxLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24ocil7cmV0dXJuIHJ9O3EucHJvdG90eXBlLmludmVydD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnQiKTt9O3EucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihyKXtudWxsIT1yJiYodGhpcy5fZG9tYWluTWluPXJbMF0sdGhpcy5fZG9tYWluTWF4PXJbMV0pOwpyZXR1cm4gcC5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyxyKX07cS5wcm90b3R5cGUuZG9tYWluTWluPWZ1bmN0aW9uKHIpe2lmKG51bGw9PXIpcmV0dXJuIHRoaXMuZG9tYWluKClbMF07dGhpcy5fZG9tYWluTWluPXI7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5kb21haW5NYXg9ZnVuY3Rpb24ocil7aWYobnVsbD09cilyZXR1cm4gdGhpcy5kb21haW4oKVsxXTt0aGlzLl9kb21haW5NYXg9cjt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHIpe3I9bC5leHRlbnQoci5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIG0uTWF0aC5pc1ZhbGlkTnVtYmVyKCt0KX0pKTtyZXR1cm4gbnVsbD09clswXXx8bnVsbD09clsxXT9bXTpyfTtxLnByb3RvdHlwZS56b29tPWZ1bmN0aW9uKHIsdCl7dmFyIHY9dGhpczt0aGlzLmRvbWFpbih0aGlzLnJhbmdlKCkubWFwKGZ1bmN0aW9uKEEpe3JldHVybiB2LmludmVydChrLnpvb21PdXQoQSwKcix0KSl9KSl9O3EucHJvdG90eXBlLnBhbj1mdW5jdGlvbihyKXt2YXIgdD10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24odil7cmV0dXJuIHQuaW52ZXJ0KHYrcil9KSl9O3EucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGVUcmFuc2Zvcm1hdGlvbiIpO307cS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnRlZFRyYW5zZm9ybWF0aW9uIik7fTtxLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkV4dGVudCIpO307cS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4iKTsKfTtxLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpO307cS5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihyKXtmdW5jdGlvbiB0KHYpe3JldHVybiBtLk1hdGguaXNOYU4odil8fEluZmluaXR5PT09dnx8LUluZmluaXR5PT09dn10KHJbMF0pfHx0KHJbMV0pP20uV2luZG93Lndhcm4oIldhcm5pbmc6IFF1YW50aXRhdGl2ZVNjYWxlcyBjYW5ub3QgdGFrZSBOYU4gb3IgSW5maW5pdHkgYXMgYSBkb21haW4gdmFsdWUuIElnbm9yaW5nLiIpOnAucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLHIpfTtxLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERlZmF1bHRUaWNrcyIpO307cS5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0dlbmVyYXRvcih0aGlzKX07CnEucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9uaWNlRG9tYWluIik7fTtxLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZGVmYXVsdEV4dGVudCIpO307cS5wcm90b3R5cGUudGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3ZhciByPVBsb3R0YWJsZS5TY2FsZXMuVGlja0dlbmVyYXRvcnMuaW50ZWdlclRpY2tHZW5lcmF0b3IoKTtudWxsIT1yJiYodGhpcy5fdGlja0dlbmVyYXRvcj1yKX07cmV0dXJuIHF9KGYoMTcpLlNjYWxlKTtjLl9ERUZBVUxUX05VTV9USUNLUz0xMDtkLlF1YW50aXRhdGl2ZVNjYWxlPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDEpO2QuY29lcmNlRXh0ZXJuYWxEMz1mdW5jdGlvbihsKXtpZihudWxsPT1sLmF0dHJzKXtpZihudWxsPT1sLm5vZGVzKXt2YXIgaz1bXTtsLmVhY2goZnVuY3Rpb24oKXtrLnB1c2godGhpcyl9KTsKcmV0dXJuIGcuc2VsZWN0QWxsKGspfXJldHVybiBnLnNlbGVjdEFsbChsLm5vZGVzKCkpfXJldHVybiBsfX0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDgzKSk7ZyhmKDg0KSk7ZyhmKDg1KSl9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fChkW2tdPWxba10pfWcoZig0NCkpO2coZig0NSkpO2coZig0NikpO2coZigxOCkpO2coZig2KSk7ZyhmKDMzKSk7ZyhmKDM0KSk7ZyhmKDQ3KSk7ZyhmKDkpKTtnKGYoNDgpKX0sZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZigpe3ZhciBnPXRoaXM7dGhpcy5fYW5jaG9yQ2FsbGJhY2s9ZnVuY3Rpb24obCl7cmV0dXJuIGcuX2FuY2hvcihsKX07dGhpcy5fZW5hYmxlZD0hMH1mLnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbihnKXt0aGlzLl9kaXNjb25uZWN0KCk7CnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG89Zzt0aGlzLl9jb25uZWN0KCk7cmV0dXJuIHRoaXN9O2YucHJvdG90eXBlLmRldGFjaEZyb209ZnVuY3Rpb24oKXt0aGlzLmRldGFjaCgpfTtmLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLl9kaXNjb25uZWN0KCk7dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1udWxsO3JldHVybiB0aGlzfTtmLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKGcpe2lmKG51bGw9PWcpcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9Zyk/dGhpcy5fY29ubmVjdCgpOnRoaXMuX2Rpc2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307Zi5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITB9O2YucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITF9O2YucHJvdG90eXBlLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlPWZ1bmN0aW9uKGcpe3ZhciBsPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub3JpZ2luVG9Sb290KCk7CnJldHVybnt4OmcueC1sLngseTpnLnktbC55fX07Zi5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PWZ1bmN0aW9uKGcpe3JldHVybiAwPD1nLngmJjA8PWcueSYmZy54PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJmcueTw9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5oZWlnaHQoKX07Zi5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXtpZih0aGlzLmVuYWJsZWQoKSYmbnVsbCE9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyYmIXRoaXMuX2lzQW5jaG9yZWQpdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vbkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9O2YucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fdW5hbmNob3IoKTtudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiZ0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9mZkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9O3JldHVybiBmfSgpOwpkLkludGVyYWN0aW9uPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbD1mKDMpLGs9ZigwKSxtPWYoNTIpLHA9ZigyKTtjPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHIoKXt2YXIgdD1xLmNhbGwodGhpcyl8fHRoaXM7dC5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTt0Ll9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPSExO3QuX2RlZmVycmVkUmVuZGVyaW5nPSExO3QuX2FwcGx5RGVmZXJyZWRSZW5kZXJpbmdUcmFuc2Zvcm09ZnVuY3Rpb24odixBLHkseCl7dC5faXNBbmNob3JlZCYmKG51bGwhPXQuX3JlbmRlckFyZWEmJnQuX3JlbmRlckFyZWEuYXR0cigidHJhbnNmb3JtIiwKInRyYW5zbGF0ZSgiK3YrIiwgIitBKyIpIHNjYWxlKCIreSsiLCAiK3grIikiKSxudWxsIT10Ll9jYW52YXMmJnQuX2NhbnZhcy5zdHlsZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdisicHgsICIrQSsicHgpIHNjYWxlKCIreSsiLCAiK3grIikiKSl9O3QuYWRkQ2xhc3MoInh5LXBsb3QiKTt0Ll9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHQuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YKCl9O3QuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdC5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKX07dC5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtpZih0LmRlZmVycmVkUmVuZGVyaW5nKCkpe3ZhciB2PXQueCgpJiZ0LngoKS5zY2FsZSxBPXQueSgpJiZ0LnkoKS5zY2FsZTt0Ll9kZWZlcnJlZFJlbmRlcmVyLnVwZGF0ZURvbWFpbnModixBKX1lbHNlIHQucmVuZGVyKCl9Owp0Ll9kZWZlcnJlZFJlbmRlcmVyPW5ldyBtLkRlZmVycmVkUmVuZGVyZXIoZnVuY3Rpb24oKXtyZXR1cm4gdC5yZW5kZXIoKX0sdC5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybSk7cmV0dXJuIHR9ZyhyLHEpO3IucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuZGVmZXJyZWRSZW5kZXJpbmcoKSYmdGhpcy5fZGVmZXJyZWRSZW5kZXJlci5yZXNldFRyYW5zZm9ybXMoKTtyZXR1cm4gcS5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyl9O3IucHJvdG90eXBlLmRlZmVycmVkUmVuZGVyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlZmVycmVkUmVuZGVyaW5nfTtyLnByb3RvdHlwZS54PWZ1bmN0aW9uKHQsdixBKXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChyLl9YX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHIuX1hfS0VZLHQsdixBKTt0PXRoaXMud2lkdGgoKTtudWxsIT12JiZudWxsIT10JiZ2LnJhbmdlKFswLHRdKTsKdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUueT1mdW5jdGlvbih0LHYsQSl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoci5fWV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShyLl9ZX0tFWSx0LHYsQSk7dD10aGlzLmhlaWdodCgpO251bGwhPXYmJm51bGwhPXQmJih2IGluc3RhbmNlb2YgbC5DYXRlZ29yeT92LnJhbmdlKFswLHRdKTp2LnJhbmdlKFt0LDBdKSk7dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PWZ1bmN0aW9uKHQpe3JldHVybiJ4Ij09PXQmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/dGhpcy5fbWFrZUZpbHRlckJ5UHJvcGVydHkoInkiKToKInkiPT09dCYmdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieCIpOm51bGx9O3IucHJvdG90eXBlLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eT1mdW5jdGlvbih0KXt0PXRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHQpO2lmKG51bGwhPXQpe3ZhciB2PXQuYWNjZXNzb3IsQT10LnNjYWxlO2lmKG51bGwhPUEpcmV0dXJuIGZ1bmN0aW9uKHkseCxDKXt2YXIgRj1BLnJhbmdlKCk7cmV0dXJuIGsuTWF0aC5pblJhbmdlKEEuc2NhbGUodih5LHgsQykpLEZbMF0sRlsxXSl9fXJldHVybiBudWxsfTtyLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odCx2KXtxLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLHQsdik7dC5vZmZVcGRhdGUodj09PXIuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9OwpyLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKHQsdil7cS5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdCx2KTt0Lm9uVXBkYXRlKHY9PT1yLl9YX0tFWT90aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrOnRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spfTtyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjayk7dGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPwoieCI6dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj8ieSI6Im5vbmUiO3N3aXRjaCh0KXtjYXNlICJ4Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSEwO3RoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKTticmVhaztjYXNlICJ5Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3RoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITA7dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKTticmVhaztjYXNlICJub25lIjp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPXRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiSW52YWxpZCBzY2FsZSBuYW1lICciK3QrIicsIG11c3QgYmUgJ3gnLCAneScgb3IgJ25vbmUnIik7fXJldHVybiB0aGlzfTtyLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHQsdixBKXtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcywKdCx2LEEpO3Q9KHQ9dGhpcy54KCkpJiZ0LnNjYWxlO251bGwhPXQmJnQucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk7dD0odD10aGlzLnkoKSkmJnQuc2NhbGU7bnVsbCE9dCYmKHQgaW5zdGFuY2VvZiBsLkNhdGVnb3J5P3QucmFuZ2UoWzAsdGhpcy5oZWlnaHQoKV0pOnQucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMueCgpLnNjYWxlO251bGwhPXQmJnQuYXV0b0RvbWFpbigpfTtyLnByb3RvdHlwZS5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55KCkuc2NhbGU7bnVsbCE9dCYmdC5hdXRvRG9tYWluKCl9O3IucHJvdG90eXBlLnNob3dBbGxEYXRhPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7cmV0dXJuIHRoaXN9OwpyLnByb3RvdHlwZS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVg9ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSYmdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCl9O3IucHJvdG90eXBlLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWT1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKX07ci5wcm90b3R5cGUuX3Byb2plY3RvcnNSZWFkeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMueCgpLHY9dGhpcy55KCk7cmV0dXJuIG51bGwhPXQmJm51bGwhPXQuYWNjZXNzb3ImJm51bGwhPXYmJm51bGwhPXYuYWNjZXNzb3J9O3IucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKHQsdixBKXt2YXIgeT1wLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx4PXAuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOwpyZXR1cm57eDp5KHQsdixBKSx5OngodCx2LEEpfX07ci5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHkseCxDKXt2YXIgRj1wLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHYueCgpKSh5LHgsQyk7eT1wLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHYueSgpKSh5LHgsQyk7cmV0dXJuIGsuTWF0aC5pc1ZhbGlkTnVtYmVyKEYpJiZrLk1hdGguaXNWYWxpZE51bWJlcih5KX12YXIgdj10aGlzLEE9cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbih5KXtBLnNldCh5LEEuZ2V0KHkpLmZpbHRlcihmdW5jdGlvbih4LEMpe3JldHVybiB0KHgsQyx5KX0pKX0pO3JldHVybiBBfTtyZXR1cm4gcn0ocC5QbG90KTtjLl9YX0tFWT0ieCI7Yy5fWV9LRVk9InkiO2QuWFlQbG90PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDApO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9CiEwO3RoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITE7dGhpcy5fdXBkYXRlSWQ9MDt0aGlzLl9jYWxsYmFja3M9bmV3IGcuQ2FsbGJhY2tTZXQ7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnM9bmV3IGcuU2V0fWwucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O2wucHJvdG90eXBlLl9nZXRBbGxJbmNsdWRlZFZhbHVlcz1mdW5jdGlvbihrKXt2YXIgbT10aGlzO3ZvaWQgMD09PWsmJihrPSExKTt2YXIgcD1bXTt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3E9cShtLGspO3A9cC5jb25jYXQocSl9KTtyZXR1cm4gcH07bC5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybltdfTtsLnByb3RvdHlwZS5vblVwZGF0ZT1mdW5jdGlvbihrKXt0aGlzLl9jYWxsYmFja3MuYWRkKGspO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5vZmZVcGRhdGU9ZnVuY3Rpb24oayl7dGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShrKTsKcmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9kaXNwYXRjaFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUlkKys7dGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyl9O2wucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMDt0aGlzLl9zZXREb21haW4odGhpcy5fZ2V0RXh0ZW50KCkpfTtsLnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5JiZ0aGlzLmF1dG9Eb21haW4oKX07bC5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGUiKTt9O2wucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9O2wucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9nZXREb21haW4oKTsKdGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9ITE7dGhpcy5fc2V0RG9tYWluKGspO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9nZXREb21haW4iKTt9O2wucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24oayl7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzc3x8KHRoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITAsdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKGspLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMSl9O2wucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2JhY2tpbmdEb21haW4iKTt9O2wucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2dldFJhbmdlKCk7CnRoaXMuX3NldFJhbmdlKGspO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldFJhbmdlIik7fTtsLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX3NldFJhbmdlIik7fTtsLnByb3RvdHlwZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKGspe3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmFkZChrKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnJlbW92ZUluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24oayl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuZGVsZXRlKGspO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07bC5wcm90b3R5cGUudXBkYXRlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlSWR9OwpyZXR1cm4gbH0oKTtkLlNjYWxlPWN9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKHIsdCx2LEEpe2Zvcih2YXIgeT17fSx4PTA7eDx0Lmxlbmd0aDt4Kyspe3ZhciBDPXRbeF07ci5oYXNPd25Qcm9wZXJ0eShDKSYmKHlbQ109cltDXSh2LEEpKX1yZXR1cm4geX1mdW5jdGlvbiBsKHIpe3JldHVybihudWxsIT1yWyJzdHJva2Utb3BhY2l0eSJdP3BhcnNlRmxvYXQoclsic3Ryb2tlLW9wYWNpdHkiXSk6MSkqKG51bGwhPXIub3BhY2l0eT9wYXJzZUZsb2F0KHIub3BhY2l0eSk6MSl9ZnVuY3Rpb24gayhyKXtyZXR1cm4obnVsbCE9clsiZmlsbC1vcGFjaXR5Il0/cGFyc2VGbG9hdChyWyJmaWxsLW9wYWNpdHkiXSk6MSkqKG51bGwhPXIub3BhY2l0eT9wYXJzZUZsb2F0KHIub3BhY2l0eSk6MSl9ZnVuY3Rpb24gbShyKXtyZXR1cm4gbnVsbCE9clsic3Ryb2tlLXdpZHRoIl0/cGFyc2VGbG9hdChyWyJzdHJva2Utd2lkdGgiXSk6MX1mdW5jdGlvbiBwKHIsdCl7aWYodC5zdHJva2Upe3IubGluZVdpZHRoPQptKHQpO3ZhciB2PXEuY29sb3IodC5zdHJva2UpO3Yub3BhY2l0eSo9bCh0KTtyLnN0cm9rZVN0eWxlPXYudG9TdHJpbmcoKTtyLnN0cm9rZSgpfXQuZmlsbCYmKHY9cS5jb2xvcih0LmZpbGwpLHYub3BhY2l0eSo9ayh0KSxyLmZpbGxTdHlsZT12LnRvU3RyaW5nKCksci5maWxsKCkpfXZhciBxPWYoMSk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIHIodCx2KXt0aGlzLl9jb250ZXh0PXQ7dGhpcy5fZHJhd1N0ZXA9dn1yLnByb3RvdHlwZS5nZXREcmF3U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmF3U3RlcH07ci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbih0LHYpe3Y9dlt2Lmxlbmd0aC0xXS5hdHRyVG9BcHBsaWVkUHJvamVjdG9yO3RoaXMuX2NvbnRleHQuc2F2ZSgpO3RoaXMuX2RyYXdTdGVwKHRoaXMuX2NvbnRleHQsdCx2KTt0aGlzLl9jb250ZXh0LnJlc3RvcmUoKX07ci5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe3JldHVybltdfTtyLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PQpmdW5jdGlvbigpe3JldHVybiBudWxsfTtyLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9O3JldHVybiByfSgpO2QuQ2FudmFzRHJhd2VyPWM7ZC5Db250ZXh0U3R5bGVBdHRycz0iZmlsbC1vcGFjaXR5IGZpbGwgb3BhY2l0eSBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggc3Ryb2tlIi5zcGxpdCgiICIpO2QucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzPWZ1bmN0aW9uKHIsdCx2LEEpe3JldHVybiBnKHIsZC5Db250ZXh0U3R5bGVBdHRycy5jb25jYXQodCksdixBKX07ZC5yZXNvbHZlQXR0cmlidXRlcz1nO2QuZ2V0U3Ryb2tlV2lkdGg9bTtkLnJlbmRlckFyZWE9ZnVuY3Rpb24ocix0LHYsQSl7ci5zYXZlKCk7ci5iZWdpblBhdGgoKTt0LmNvbnRleHQocik7dCh2KTtyLmxpbmVKb2luPSJyb3VuZCI7cChyLEEpO3IucmVzdG9yZSgpfTtkLnJlbmRlckxpbmU9ZnVuY3Rpb24ocix0LHYsQSl7ci5zYXZlKCk7ci5iZWdpblBhdGgoKTt0LmNvbnRleHQocik7dCh2KTsKci5saW5lSm9pbj0icm91bmQiO3AocixBKTtyLnJlc3RvcmUoKX07ZC5yZW5kZXJQYXRoV2l0aFN0eWxlPXB9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fChkW2tdPWxba10pfWcoZig1MCkpO2coZigyNykpO2coZig1MSkpO2coZig5MykpO2coZig1MykpO2coZig5NCkpO2coZig5NSkpO2coZig5NikpO2coZig5NykpO2coZig5OCkpO2coZig5OSkpO2coZigxMDApKX0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDkyKSk7ZyhmKDkxKSk7Yz1mKDQ5KTtkLnNpZ249Yy5zaWdufSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoMTM0KSk7ZyhmKDEzNSkpO2coZigxMzYpKTtnKGYoMTM3KSl9LGZ1bmN0aW9uKGMsCmQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEscil7ZnVuY3Rpb24gdCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIHYgaW4gcilyLmhhc093blByb3BlcnR5KHYpJiYocVt2XT1yW3ZdKTtxLnByb3RvdHlwZT1udWxsPT09cj9PYmplY3QuY3JlYXRlKHIpOih0LnByb3RvdHlwZT1yLnByb3RvdHlwZSxuZXcgdCl9LGw9ZigxKSxrPWYoNSk7Yz1mKDQpO3ZhciBtPWYoOCkscD1mKDApO2Y9ZigxMCk7ZC5BeGlzT3JpZW50YXRpb249Zi5tYWtlRW51bShbImJvdHRvbSIsImxlZnQiLCJyaWdodCIsInRvcCJdKTtmPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHIodCx2KXt2YXIgQT1xLmNhbGwodGhpcyl8fHRoaXM7QS5fZW5kVGlja0xlbmd0aD01O0EuX2lubmVyVGlja0xlbmd0aD01O0EuX3RpY2tMYWJlbFBhZGRpbmc9MTA7QS5fbWFyZ2luPTE1O0EuX3Nob3dFbmRUaWNrTGFiZWxzPSExO0EuX2Fubm90YXRpb25zRW5hYmxlZD0hMTtBLl9hbm5vdGF0aW9uVGllckNvdW50PQoxO2lmKG51bGw9PXR8fG51bGw9PXYpdGhyb3cgRXJyb3IoIkF4aXMgcmVxdWlyZXMgYSBzY2FsZSBhbmQgb3JpZW50YXRpb24iKTtBLl9zY2FsZT10O0Eub3JpZW50YXRpb24odik7QS5fc2V0RGVmYXVsdEFsaWdubWVudCgpO0EuYWRkQ2xhc3MoImF4aXMiKTtBLmlzSG9yaXpvbnRhbCgpP0EuYWRkQ2xhc3MoIngtYXhpcyIpOkEuYWRkQ2xhc3MoInktYXhpcyIpO0EuZm9ybWF0dGVyKG0uaWRlbnRpdHkoKSk7QS5fcmVzY2FsZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEEuX3Jlc2NhbGUoKX07QS5fc2NhbGUub25VcGRhdGUoQS5fcmVzY2FsZUNhbGxiYWNrKTtBLl9hbm5vdGF0ZWRUaWNrcz1bXTtBLl9hbm5vdGF0aW9uRm9ybWF0dGVyPW0uaWRlbnRpdHkoKTtyZXR1cm4gQX1nKHIscSk7ci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVzY2FsZUNhbGxiYWNrKX07CnIucHJvdG90eXBlLnRpY2tMYWJlbERhdGFPbkVsZW1lbnQ9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7Zm9yKHZhciB2O251bGwhPXQmJnQuY2xhc3NMaXN0JiZ2b2lkIDA9PT12Oyl0LmNsYXNzTGlzdC5jb250YWlucyhyLlRJQ0tfTEFCRUxfQ0xBU1MpP3Y9dDp0PXQucGFyZW50Tm9kZTtyZXR1cm4gdm9pZCAwPT09dD92b2lkIDA6bC5zZWxlY3QodCkuZGF0dW0oKX19O3IucHJvdG90eXBlLl9jb21wdXRlV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3IucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpfTtyLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3ZhciB0PTAsdj0wO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2lmKHY9dGhpcy5fY29tcHV0ZUhlaWdodCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKXt2YXIgQT0KdGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMipyLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkc7dis9QSp0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKX19ZWxzZSB0PXRoaXMuX2NvbXB1dGVXaWR0aCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpJiYoQT10aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnIuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyx0Kz1BKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKTtyZXR1cm57bWluV2lkdGg6dCxtaW5IZWlnaHQ6dn19O3IucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsKCl9O3IucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0hvcml6b250YWwoKX07ci5wcm90b3R5cGUuX3Jlc2NhbGU9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigpfTtyLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbih0LHYsQSl7cS5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsdCx2LEEpO3RoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5fc2NhbGUucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk6dGhpcy5fc2NhbGUucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih0LHYpe3ZhciBBPXRoaXMucmVxdWVzdGVkU3BhY2UodCx2KTtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT97d2lkdGg6dCxoZWlnaHQ6QS5taW5IZWlnaHR9OntoZWlnaHQ6dix3aWR0aDpBLm1pbldpZHRofX07ci5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fdGlja01hcmtDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChyLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lcj0KdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChyLlRJQ0tfTEFCRUxfQ0xBU1MrIi1jb250YWluZXIiLCEwKTt0aGlzLl9iYXNlbGluZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jb250YWluZXIiLCEwKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tbGluZS1jb250YWluZXIiLCEwKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tY2lyY2xlLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIsITApO3ZhciB0PXRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiLAohMCk7dD1uZXcgay5TdmdDb250ZXh0KHQubm9kZSgpKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXI9bmV3IGsuQ2FjaGVNZWFzdXJlcih0KTt0aGlzLl9hbm5vdGF0aW9uV3JpdGVyPW5ldyBrLldyaXRlcih0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIsdCl9O3IucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3IucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHY9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIityLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh0KSxBPXYuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHIuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh2KTtBLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpKTtsLnNlbGVjdChBLm5vZGVzKClbMF0pLmNsYXNzZWQoci5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTsKbC5zZWxlY3QoQS5ub2RlcygpW3QubGVuZ3RoLTFdKS5jbGFzc2VkKHIuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCkuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCEwKSk7di5leGl0KCkucmVtb3ZlKCk7dGhpcy5fYmFzZWxpbmUuYXR0cnModGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCkpO3RoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5fZHJhd0Fubm90YXRpb25zKCk6dGhpcy5fcmVtb3ZlQW5ub3RhdGlvbnMoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuYW5ub3RhdGVkVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGVkVGlja3N9O3IucHJvdG90eXBlLmFubm90YXRpb25Gb3JtYXR0ZXI9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fYW5ub3RhdGlvbkZvcm1hdHRlcjt0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyPXQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuYW5ub3RhdGlvbnNFbmFibGVkPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uc0VuYWJsZWR9O3IucHJvdG90eXBlLmFubm90YXRpb25UaWVyQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGlvblRpZXJDb3VudH07ci5wcm90b3R5cGUuX2RyYXdBbm5vdGF0aW9ucz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaGEpe3N3aXRjaChDLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnJldHVybiB5KGhhKTtjYXNlICJ0b3AiOmNhc2UgImxlZnQiOnJldHVybiB5KGhhKS1ELmdldChoYSkuaGVpZ2h0fX1mdW5jdGlvbiB2KGhhKXtyZXR1cm4gTC5oYXMoaGEpPyJoaWRkZW4iOiJ2aXNpYmxlIn1mdW5jdGlvbiBBKGhhKXtyZXR1cm4gQy5fc2NhbGUuc2NhbGUoaGEpfWZ1bmN0aW9uIHkoaGEpe3N3aXRjaChDLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnJldHVybiBLLmdldChoYSkqRytQO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIEotClAtSy5nZXQoaGEpKkd9fWZ1bmN0aW9uIHgoaGEsWCxjYSl7aGE9aGEuc2VsZWN0QWxsKCIuIitjYSkuZGF0YShCKTtYPWhhLmVudGVyKCkuYXBwZW5kKFgpLmNsYXNzZWQoY2EsITApLm1lcmdlKGhhKTtoYS5leGl0KCkucmVtb3ZlKCk7cmV0dXJuIFh9dmFyIEM9dGhpcyxGPXIuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyxEPW5ldyBwLk1hcCxCPXRoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKTtCLmZvckVhY2goZnVuY3Rpb24oaGEpe3ZhciBYPUMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKEMuYW5ub3RhdGlvbkZvcm1hdHRlcigpKGhhKSk7RC5zZXQoaGEse3dpZHRoOlgud2lkdGgrMipGLGhlaWdodDpYLmhlaWdodCsyKkZ9KX0pO3ZhciBHPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqRixLPXRoaXMuX2Fubm90YXRpb25Ub1RpZXIoRCksTD1uZXcgcC5TZXQsSj10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLApQPXRoaXMuX2NvcmVTaXplKCksUz1NYXRoLm1pbih0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSxNYXRoLmZsb29yKChKLVApL0cpKTtLLmZvckVhY2goZnVuY3Rpb24oaGEsWCl7KC0xPT09aGF8fGhhPj1TKSYmTC5hZGQoWCl9KTtzd2l0Y2godGhpcy5vcmllbnRhdGlvbigpKXtjYXNlICJib3R0b20iOmNhc2UgInJpZ2h0Ijp2YXIgTj0wO2JyZWFrO2Nhc2UgInRvcCI6Tj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOk49dGhpcy53aWR0aCgpfXZhciBUPXRoaXMuaXNIb3Jpem9udGFsKCk7eCh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGluZS1jb250YWluZXIiKSwibGluZSIsci5BTk5PVEFUSU9OX0xJTkVfQ0xBU1MpLmF0dHJzKHt4MTpUP0E6Tix4MjpUP0E6eSx5MTpUP046QSx5MjpUP3k6QSx2aXNpYmlsaXR5OnZ9KTt4KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiksCiJjaXJjbGUiLHIuQU5OT1RBVElPTl9DSVJDTEVfQ0xBU1MpLmF0dHJzKHtjeDpUP0E6TixjeTpUP046QSxyOjN9KTt4KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIpLCJyZWN0IixyLkFOTk9UQVRJT05fUkVDVF9DTEFTUykuYXR0cnMoe3g6VD9BOnQseTpUP3Q6QSx3aWR0aDpUP2Z1bmN0aW9uKGhhKXtyZXR1cm4gRC5nZXQoaGEpLndpZHRofTpmdW5jdGlvbihoYSl7cmV0dXJuIEQuZ2V0KGhhKS5oZWlnaHR9LGhlaWdodDpUP2Z1bmN0aW9uKGhhKXtyZXR1cm4gRC5nZXQoaGEpLmhlaWdodH06ZnVuY3Rpb24oaGEpe3JldHVybiBELmdldChoYSkud2lkdGh9LHZpc2liaWxpdHk6dn0pO3ZhciBZPXRoaXMuX2Fubm90YXRpb25Xcml0ZXIsYWE9dGhpcy5hbm5vdGF0aW9uRm9ybWF0dGVyKCk7Tj14KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiKSwiZyIsci5BTk5PVEFUSU9OX0xBQkVMX0NMQVNTKTsKTi5zZWxlY3RBbGwoIi50ZXh0LWNvbnRhaW5lciIpLnJlbW92ZSgpO04uYXR0cnMoe3RyYW5zZm9ybTpmdW5jdGlvbihoYSl7dmFyIFg9VD9BKGhhKTp0KGhhKTtoYT1UP3QoaGEpOkEoaGEpO3JldHVybiJ0cmFuc2xhdGUoIitYKyIsIitoYSsiKSJ9LHZpc2liaWxpdHk6dn0pLmVhY2goZnVuY3Rpb24oaGEpe1kud3JpdGUoYWEoaGEpLFQ/RC5nZXQoaGEpLndpZHRoOkQuZ2V0KGhhKS5oZWlnaHQsVD9ELmdldChoYSkuaGVpZ2h0OkQuZ2V0KGhhKS53aWR0aCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246VD8wOjkwfSxsLnNlbGVjdCh0aGlzKS5ub2RlKCkpfSl9O3IucHJvdG90eXBlLl9hbm5vdGF0ZWRUaWNrc1RvUmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyx2PXRoaXMuX3NjYWxlLnJhbmdlKCk7cmV0dXJuIHAuQXJyYXkudW5pcSh0aGlzLmFubm90YXRlZFRpY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKEEpe3JldHVybiBudWxsPT1BPyExOnAuTWF0aC5pblJhbmdlKHQuX3NjYWxlLnNjYWxlKEEpLAp2WzBdLHZbMV0pfSkpfTtyLnByb3RvdHlwZS5fY29yZVNpemU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLHY9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLl9jb21wdXRlSGVpZ2h0KCk6dGhpcy5fY29tcHV0ZVdpZHRoKCk7cmV0dXJuIE1hdGgubWluKHYsdCl9O3IucHJvdG90eXBlLl9hbm5vdGF0aW9uVGllckhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnIuX0FOTk9UQVRJT05fTEFCRUxfUEFERElOR307ci5wcm90b3R5cGUuX2Fubm90YXRpb25Ub1RpZXI9ZnVuY3Rpb24odCl7dmFyIHY9dGhpcyxBPVtbXV0seT1uZXcgcC5NYXAseD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMud2lkdGgoKTp0aGlzLmhlaWdodCgpO3RoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKS5mb3JFYWNoKGZ1bmN0aW9uKEMpe3ZhciBGPXYuX3NjYWxlLnNjYWxlKEMpLApEPXQuZ2V0KEMpLndpZHRoO2lmKDA+Rnx8RitEPngpeS5zZXQoQywtMSk7ZWxzZXtmb3IodmFyIEI9ZnVuY3Rpb24oSyl7cmV0dXJuIEFbS10uc29tZShmdW5jdGlvbihMKXt2YXIgSj12Ll9zY2FsZS5zY2FsZShMKTtMPXQuZ2V0KEwpLndpZHRoO3JldHVybiBGK0Q+PUomJkY8PUorTH0pfSxHPTA7QihHKTspRysrLEEubGVuZ3RoPT09RyYmQS5wdXNoKFtdKTtBW0ddLnB1c2goQyk7eS5zZXQoQyxHKX19KTtyZXR1cm4geX07ci5wcm90b3R5cGUuX3JlbW92ZUFubm90YXRpb25zPWZ1bmN0aW9uKCl7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLWxpbmUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tY2lyY2xlIikucmVtb3ZlKCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLXJlY3QiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGFiZWwiKS5yZW1vdmUoKX07CnIucHJvdG90eXBlLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2g9ZnVuY3Rpb24oKXt2YXIgdD17eDE6MCx5MTowLHgyOjAseTI6MH07c3dpdGNoKHRoaXMuX29yaWVudGF0aW9uKXtjYXNlICJib3R0b20iOnQueDI9dGhpcy53aWR0aCgpO2JyZWFrO2Nhc2UgInRvcCI6dC54Mj10aGlzLndpZHRoKCk7dC55MT10aGlzLmhlaWdodCgpO3QueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJsZWZ0Ijp0LngxPXRoaXMud2lkdGgoKTt0LngyPXRoaXMud2lkdGgoKTt0LnkyPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSAicmlnaHQiOnQueTI9dGhpcy5oZWlnaHQoKX1yZXR1cm4gdH07ci5wcm90b3R5cGUuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaD1mdW5jdGlvbih0KXtmdW5jdGlvbiB2KHgpe3JldHVybiBBLl9zY2FsZS5zY2FsZSh4KX12YXIgQT10aGlzO3ZvaWQgMD09PXQmJih0PSExKTt2YXIgeT17eDE6MCx5MTowLHgyOjAseTI6MH07dGhpcy5pc0hvcml6b250YWwoKT8oeS54MT0Kdix5LngyPXYpOih5LnkxPXYseS55Mj12KTt0PXQ/dGhpcy5fZW5kVGlja0xlbmd0aDp0aGlzLl9pbm5lclRpY2tMZW5ndGg7c3dpdGNoKHRoaXMuX29yaWVudGF0aW9uKXtjYXNlICJib3R0b20iOnkueTI9dDticmVhaztjYXNlICJ0b3AiOnkueTE9dGhpcy5oZWlnaHQoKTt5LnkyPXRoaXMuaGVpZ2h0KCktdDticmVhaztjYXNlICJsZWZ0Ijp5LngxPXRoaXMud2lkdGgoKTt5LngyPXRoaXMud2lkdGgoKS10O2JyZWFrO2Nhc2UgInJpZ2h0Ijp5LngyPXR9cmV0dXJuIHl9O3IucHJvdG90eXBlLl9zZXREZWZhdWx0QWxpZ25tZW50PWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX29yaWVudGF0aW9uKXtjYXNlICJib3R0b20iOnRoaXMueUFsaWdubWVudCgidG9wIik7YnJlYWs7Y2FzZSAidG9wIjp0aGlzLnlBbGlnbm1lbnQoImJvdHRvbSIpO2JyZWFrO2Nhc2UgImxlZnQiOnRoaXMueEFsaWdubWVudCgicmlnaHQiKTticmVhaztjYXNlICJyaWdodCI6dGhpcy54QWxpZ25tZW50KCJsZWZ0Iil9fTsKci5wcm90b3R5cGUuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKCl7cmV0dXJuInRvcCI9PT10aGlzLl9vcmllbnRhdGlvbnx8ImJvdHRvbSI9PT10aGlzLl9vcmllbnRhdGlvbn07ci5wcm90b3R5cGUuZ2V0U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NhbGV9O3IucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXQ7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuaW5uZXJUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lubmVyVGlja0xlbmd0aH07ci5wcm90b3R5cGUuZW5kVGlja0xlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmRUaWNrTGVuZ3RofTtyLnByb3RvdHlwZS5fbWF4TGFiZWxUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2hvd0VuZFRpY2tMYWJlbHMoKT9NYXRoLm1heCh0aGlzLmlubmVyVGlja0xlbmd0aCgpLAp0aGlzLmVuZFRpY2tMZW5ndGgoKSk6dGhpcy5pbm5lclRpY2tMZW5ndGgoKX07ci5wcm90b3R5cGUudGlja0xhYmVsUGFkZGluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl90aWNrTGFiZWxQYWRkaW5nO2lmKDA+dCl0aHJvdyBFcnJvcigidGljayBsYWJlbCBwYWRkaW5nIG11c3QgYmUgcG9zaXRpdmUiKTt0aGlzLl90aWNrTGFiZWxQYWRkaW5nPXQ7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUubWFyZ2luPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX21hcmdpbjtpZigwPnQpdGhyb3cgRXJyb3IoIm1hcmdpbiBzaXplIG11c3QgYmUgcG9zaXRpdmUiKTt0aGlzLl9tYXJnaW49dDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt0PXQudG9Mb3dlckNhc2UoKTtpZigidG9wIiE9PXQmJiJib3R0b20iIT09CnQmJiJsZWZ0IiE9PXQmJiJyaWdodCIhPT10KXRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCBvcmllbnRhdGlvbiIpO3RoaXMuX29yaWVudGF0aW9uPXQ7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuc2hvd0VuZFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd0VuZFRpY2tMYWJlbHN9O3IucHJvdG90eXBlLl9zaG93QWxsVGlja01hcmtzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIityLlRJQ0tfTUFSS19DTEFTUykuZWFjaChmdW5jdGlvbigpe2wuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpfSl9O3IucHJvdG90eXBlLl9zaG93QWxsVGlja0xhYmVscz1mdW5jdGlvbigpe3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3IuVElDS19MQUJFTF9DTEFTUykuZWFjaChmdW5jdGlvbigpe2wuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpfSl9OwpyLnByb3RvdHlwZS5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudCgpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx2PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3IuVElDS19MQUJFTF9DTEFTUyk7di5lbXB0eSgpfHx2LmVhY2goZnVuY3Rpb24oKXtwLkRPTS5jbGllbnRSZWN0SW5zaWRlKHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdCl8fGwuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9KX07ci5wcm90b3R5cGUuX2hpZGVUaWNrTWFya3NXaXRob3V0TGFiZWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3IuVElDS19NQVJLX0NMQVNTKSx2PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3IuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIEE9bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTsKcmV0dXJuImluaGVyaXQiPT09QXx8InZpc2libGUiPT09QX0pLmRhdGEoKTt0LmVhY2goZnVuY3Rpb24oQSl7LTE9PT12LmluZGV4T2YoQSkmJmwuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9KX07ci5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLnJlc2V0KCl9O3JldHVybiByfShjLkNvbXBvbmVudCk7Zi5FTkRfVElDS19NQVJLX0NMQVNTPSJlbmQtdGljay1tYXJrIjtmLlRJQ0tfTUFSS19DTEFTUz0idGljay1tYXJrIjtmLlRJQ0tfTEFCRUxfQ0xBU1M9InRpY2stbGFiZWwiO2YuQU5OT1RBVElPTl9MSU5FX0NMQVNTPSJhbm5vdGF0aW9uLWxpbmUiO2YuQU5OT1RBVElPTl9SRUNUX0NMQVNTPSJhbm5vdGF0aW9uLXJlY3QiO2YuQU5OT1RBVElPTl9DSVJDTEVfQ0xBU1M9ImFubm90YXRpb24tY2lyY2xlIjtmLkFOTk9UQVRJT05fTEFCRUxfQ0xBU1M9CiJhbm5vdGF0aW9uLWxhYmVsIjtmLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkc9NDtkLkF4aXM9Zn0sZnVuY3Rpb24oYyxkKXtkLlNIT1dfV0FSTklOR1M9ITA7ZC5BRERfVElUTEVfRUxFTUVOVFM9ITB9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDApO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbj17fTt0aGlzLl9ldmVudFRhcmdldD1kb2N1bWVudDt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0PXt9O3RoaXMuX2Nvbm5lY3RlZD0hMX1sLnByb3RvdHlwZS5faGFzTm9DYWxsYmFja3M9ZnVuY3Rpb24oKXtmb3IodmFyIGs9T2JqZWN0LmtleXModGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldCksbT0wO208ay5sZW5ndGg7bSsrKWlmKDAhPT10aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2tbbV1dLnNpemUpcmV0dXJuITE7cmV0dXJuITB9O2wucHJvdG90eXBlLl9jb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGs9dGhpczsKdGhpcy5fY29ubmVjdGVkfHwoT2JqZWN0LmtleXModGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbikuZm9yRWFjaChmdW5jdGlvbihtKXtrLl9ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKG0say5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvblttXSl9KSx0aGlzLl9jb25uZWN0ZWQ9ITApfTtsLnByb3RvdHlwZS5fZGlzY29ubmVjdD1mdW5jdGlvbigpe3ZhciBrPXRoaXM7dGhpcy5fY29ubmVjdGVkJiZ0aGlzLl9oYXNOb0NhbGxiYWNrcygpJiYoT2JqZWN0LmtleXModGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbikuZm9yRWFjaChmdW5jdGlvbihtKXtrLl9ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKG0say5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvblttXSl9KSx0aGlzLl9jb25uZWN0ZWQ9ITEpfTtsLnByb3RvdHlwZS5fYWRkQ2FsbGJhY2tGb3JFdmVudD1mdW5jdGlvbihrLG0pe251bGw9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRba10mJgoodGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXT1uZXcgZy5DYWxsYmFja1NldCk7dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXS5hZGQobSk7dGhpcy5fY29ubmVjdCgpfTtsLnByb3RvdHlwZS5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudD1mdW5jdGlvbihrLG0pe251bGwhPXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRba10mJnRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRba10uZGVsZXRlKG0pO3RoaXMuX2Rpc2Nvbm5lY3QoKX07bC5wcm90b3R5cGUuX2NhbGxDYWxsYmFja3NGb3JFdmVudD1mdW5jdGlvbihrKXtmb3IodmFyIG09W10scD0xO3A8YXJndW1lbnRzLmxlbmd0aDtwKyspbVtwLTFdPWFyZ3VtZW50c1twXTtwPXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRba107bnVsbCE9cCYmcC5jYWxsQ2FsbGJhY2tzLmFwcGx5KHAsbSl9O3JldHVybiBsfSgpO2QuRGlzcGF0Y2hlcj1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwKKGRba109bFtrXSl9ZyhmKDg3KSk7ZyhmKDg4KSk7ZyhmKDQwKSk7ZyhmKDg5KSk7ZyhmKDkwKSk7Yz1mKDI2KTtkLnpvb21PdXQ9Yy56b29tT3V0fSxmdW5jdGlvbihjLGQpe2Z1bmN0aW9uIGYocSxyLHQpe3JldHVybiB0LSh0LXEpKnJ9ZnVuY3Rpb24gZyhxLHIsdCl7cmV0dXJuKHEqci10KS8oci0xKX1mdW5jdGlvbiBsKHEscix0LHYpe3ZhciBBPTE8cjt0PUE/djp0O2lmKG51bGw9PXQpcmV0dXJuIHI7cT1xLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7cmV0dXJuKEE/TWF0aC5taW46TWF0aC5tYXgpKHIsdC9NYXRoLmFicyhxWzFdLXFbMF0pKX1mdW5jdGlvbiBrKHEscix0LHYsQSl7aWYoMT49cilyZXR1cm57Y2VudGVyUG9pbnQ6dCx6b29tQW1vdW50OnJ9O2lmKG51bGw9PXYmJm51bGw9PUEpcmV0dXJue2NlbnRlclBvaW50OnQsem9vbUFtb3VudDpyfTt2YXIgeT1tKHEpLHg9cChxKSxDPXg/SW5maW5pdHk6LUluZmluaXR5O3g9eD8tSW5maW5pdHk6SW5maW5pdHk7dj1udWxsPT0Kdj9DOnY7QT1udWxsPT1BP3g6QTt4PXEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtDPXhbMF07eD14WzFdO0E9cS5zY2FsZVRyYW5zZm9ybWF0aW9uKEEpO3g9cS5zY2FsZVRyYW5zZm9ybWF0aW9uKHgpO3ZhciBGPWYoeCxyLHQpO3Y9cS5zY2FsZVRyYW5zZm9ybWF0aW9uKHYpO3E9cS5zY2FsZVRyYW5zZm9ybWF0aW9uKEMpO0M9ZihxLHIsdCk7cmV0dXJuIE1hdGguYWJzKEYtQyk+TWF0aC5hYnMoQS12KT8ocj0oQS12KS8oeC1xKSwxIT09cj97Y2VudGVyUG9pbnQ6Zyh4LHIsQSksem9vbUFtb3VudDpyfTp7Y2VudGVyUG9pbnQ6dCx6b29tQW1vdW50OnJ9KTpGPkEhPXk/e2NlbnRlclBvaW50OmcoeCxyLEEpLHpvb21BbW91bnQ6cn06Qzx2IT15P3tjZW50ZXJQb2ludDpnKHEscix2KSx6b29tQW1vdW50OnJ9OntjZW50ZXJQb2ludDp0LHpvb21BbW91bnQ6cn19ZnVuY3Rpb24gbShxKXtxPXEucmFuZ2UoKTtyZXR1cm4gcVsxXTxxWzBdfWZ1bmN0aW9uIHAocSl7cT1xLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7CnJldHVybiBxWzFdPHFbMF19ZC56b29tT3V0PWY7ZC5jb25zdHJhaW5lZFpvb209ZnVuY3Rpb24ocSxyLHQsdixBLHkseCl7cj1sKHEscix2LEEpO3JldHVybiBrKHEscix0LHkseCl9O2QuY29uc3RyYWluWm9vbUV4dGVudHM9bDtkLmNvbnN0cmFpblpvb21WYWx1ZXM9aztkLmNvbnN0cmFpbmVkVHJhbnNsYXRpb249ZnVuY3Rpb24ocSxyLHQsdil7dmFyIEE9cS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpLHk9QVswXSx4PUFbMV07QT1tKHEpOzA8ciE9PUE/KHQ9dixudWxsIT10JiYoeT1xLnNjYWxlVHJhbnNmb3JtYXRpb24oeCkscT1xLnNjYWxlVHJhbnNmb3JtYXRpb24odCkscj0oQT9NYXRoLm1heDpNYXRoLm1pbikoeStyLHEpLXkpKTpudWxsIT10JiYoeT1xLnNjYWxlVHJhbnNmb3JtYXRpb24oeSkscT1xLnNjYWxlVHJhbnNmb3JtYXRpb24odCkscj0oQT9NYXRoLm1pbjpNYXRoLm1heCkoeStyLHEpLXkpO3JldHVybiByfX0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoRywKSyxMKXt2YXIgSj1HLnNjYWxlO2lmKEogaW5zdGFuY2VvZiB5LkNhdGVnb3J5KUw9Si5yYW5nZUJhbmQoKTtlbHNle3ZhciBQPUcuYWNjZXNzb3I7Rz1rLnNldChDLkFycmF5LmZsYXR0ZW4oSy5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuIFMuZGF0YSgpLm1hcChmdW5jdGlvbihOLFQpe3JldHVybiBQKE4sVCxTKX0pLmZpbHRlcihmdW5jdGlvbihOKXtyZXR1cm4gbnVsbCE9Tn0pLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi52YWx1ZU9mKCl9KX0pKSkudmFsdWVzKCkubWFwKGZ1bmN0aW9uKFMpe3JldHVybitTfSk7Ry5zb3J0KGZ1bmN0aW9uKFMsTil7cmV0dXJuIFMtTn0pO0c9Ry5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuIEouc2NhbGUoUyl9KTtHPWsucGFpcnMoRyk7TD1DLk1hdGgubWluKEcsZnVuY3Rpb24oUyl7cmV0dXJuIE1hdGguYWJzKFNbMV0tU1swXSl9LEwqQi5fU0lOR0xFX0JBUl9ESU1FTlNJT05fUkFUSU8pO0wqPUIuX0JBUl9USElDS05FU1NfUkFUSU99cmV0dXJuIEx9CnZhciBsPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihHLEspe2Z1bmN0aW9uIEwoKXt0aGlzLmNvbnN0cnVjdG9yPUd9Zm9yKHZhciBKIGluIEspSy5oYXNPd25Qcm9wZXJ0eShKKSYmKEdbSl09S1tKXSk7Ry5wcm90b3R5cGU9bnVsbD09PUs/T2JqZWN0LmNyZWF0ZShLKTooTC5wcm90b3R5cGU9Sy5wcm90b3R5cGUsbmV3IEwpfSxrPWYoMSksbT1mKDUpLHA9Zig3KSxxPWYoOCkscj1mKDE0KSx0PWYoNiksdj1mKDM0KSxBPWYoMjApLHk9ZigzKSx4PWYoMTEpLEM9ZigwKTtjPWYoMTApO3ZhciBGPWYoMTkpLEQ9ZigyKTtmPWYoMTYpO2QuQmFyT3JpZW50YXRpb249Yy5tYWtlRW51bShbInZlcnRpY2FsIiwiaG9yaXpvbnRhbCJdKTtkLkxhYmVsc1Bvc2l0aW9uPWMubWFrZUVudW0oWyJzdGFydCIsIm1pZGRsZSIsImVuZCIsIm91dHNpZGUiXSk7ZC5CYXJBbGlnbm1lbnQ9Yy5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIl0pO3ZhciBCPWZ1bmN0aW9uKEcpe2Z1bmN0aW9uIEsoTCl7dm9pZCAwPT09CkwmJihMPSJ2ZXJ0aWNhbCIpO3ZhciBKPUcuY2FsbCh0aGlzKXx8dGhpcztKLl9sYWJlbEZvcm1hdHRlcj1xLmlkZW50aXR5KCk7Si5fbGFiZWxzRW5hYmxlZD0hMTtKLl9sYWJlbHNQb3NpdGlvbj1kLkxhYmVsc1Bvc2l0aW9uLmVuZDtKLl9oaWRlQmFyc0lmQW55QXJlVG9vV2lkZT0hMDtKLl9iYXJBbGlnbm1lbnQ9Im1pZGRsZSI7Si5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzPUEubWVtb2l6ZShnKTtKLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSEwO0ouYWRkQ2xhc3MoImJhci1wbG90Iik7aWYoInZlcnRpY2FsIiE9PUwmJiJob3Jpem9udGFsIiE9PUwpdGhyb3cgRXJyb3IoTCsiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBQbG90cy5CYXIiKTtKLl9pc1ZlcnRpY2FsPSJ2ZXJ0aWNhbCI9PT1MO0ouYW5pbWF0b3IoImJhc2VsaW5lIixuZXcgcC5OdWxsKTtKLmF0dHIoImZpbGwiLChuZXcgeS5Db2xvcikucmFuZ2UoKVswXSk7Si5hdHRyKEsuX0JBUl9USElDS05FU1NfS0VZLApmdW5jdGlvbigpe3JldHVybiBKLl9iYXJQaXhlbFRoaWNrbmVzcygpfSk7Si5fbGFiZWxDb25maWc9bmV3IEMuTWFwO0ouX2Jhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltKLmJhc2VsaW5lVmFsdWUoKV19O3JldHVybiBKfWwoSyxHKTtLLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKEwsSixQKXtHLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxMLEosUCk7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3JldHVybiB0aGlzfTtLLnByb3RvdHlwZS54PWZ1bmN0aW9uKEwsSil7aWYobnVsbD09TClyZXR1cm4gRy5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUo/Ry5wcm90b3R5cGUueC5jYWxsKHRoaXMsTCk6Ry5wcm90b3R5cGUueC5jYWxsKHRoaXMsTCxKKTt0aGlzLl91cGRhdGVUaGlja25lc3NBdHRyKCk7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUueT1mdW5jdGlvbihMLEope2lmKG51bGw9PQpMKXJldHVybiBHLnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09Sj9HLnByb3RvdHlwZS55LmNhbGwodGhpcyxMKTpHLnByb3RvdHlwZS55LmNhbGwodGhpcyxMLEopO3RoaXMuX3VwZGF0ZUxlbmd0aFNjYWxlKCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLmxlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueSgpOnRoaXMueCgpfTtLLnByb3RvdHlwZS5wb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueCgpOnRoaXMueSgpfTtLLnByb3RvdHlwZS5iYXJFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoSy5fQkFSX0VORF9LRVkpfTtLLnByb3RvdHlwZS5iYXJBbGlnbm1lbnQ9ZnVuY3Rpb24oTCl7aWYobnVsbD09TClyZXR1cm4gdGhpcy5fYmFyQWxpZ25tZW50O3RoaXMuX2JhckFsaWdubWVudD1MO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKTt0aGlzLnJlbmRlcigpOwpyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUub3JpZW50YXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD8idmVydGljYWwiOiJob3Jpem9udGFsIn07Sy5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdi5SZWN0YW5nbGVTVkdEcmF3ZXIoSy5fQkFSX0FSRUFfQ0xBU1MpfSxmdW5jdGlvbihMKXtyZXR1cm4gbmV3IHIuUmVjdGFuZ2xlQ2FudmFzRHJhd2VyKEwpfSl9O0sucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe0cucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2Jhc2VsaW5lPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKX07Sy5wcm90b3R5cGUuYmFzZWxpbmVWYWx1ZT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuX2Jhc2VsaW5lVmFsdWUpcmV0dXJuIHRoaXMuX2Jhc2VsaW5lVmFsdWU7aWYoIXRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXJldHVybiAwOwp2YXIgTD10aGlzLmxlbmd0aCgpLnNjYWxlO3JldHVybiBMP0wgaW5zdGFuY2VvZiB5LlRpbWU/bmV3IERhdGUoMCk6MDowfTtLLnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEwpe0cucHJvdG90eXBlLmFkZERhdGFzZXQuY2FsbCh0aGlzLEwpO3JldHVybiB0aGlzfTtLLnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihMKXtHLnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsTCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oTCl7Ry5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsTCl9O0sucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEwpe0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxMKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUuZGF0YXNldHM9ZnVuY3Rpb24oTCl7aWYobnVsbD09TClyZXR1cm4gRy5wcm90b3R5cGUuZGF0YXNldHMuY2FsbCh0aGlzKTtHLnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMsCkwpO3JldHVybiB0aGlzfTtLLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEwpe2lmKG51bGw9PUwpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7dGhpcy5fbGFiZWxzRW5hYmxlZD1MO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtLLnByb3RvdHlwZS5sYWJlbEZvcm1hdHRlcj1mdW5jdGlvbihMKXtpZihudWxsPT1MKXJldHVybiB0aGlzLl9sYWJlbEZvcm1hdHRlcjt0aGlzLl9sYWJlbEZvcm1hdHRlcj1MO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtLLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKEwpe3ZhciBKPUcucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLEwpLFA9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKEsuX0xBQkVMX0FSRUFfQ0xBU1MsITApLApTPW5ldyBtLlN2Z0NvbnRleHQoUC5ub2RlKCkpLE49bmV3IG0uQ2FjaGVNZWFzdXJlcihTKTtTPW5ldyBtLldyaXRlcihOLFMpO3RoaXMuX2xhYmVsQ29uZmlnLnNldChMLHtsYWJlbEFyZWE6UCxtZWFzdXJlcjpOLHdyaXRlcjpTfSk7cmV0dXJuIEp9O0sucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oTCl7Ry5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsTCk7dmFyIEo9dGhpcy5fbGFiZWxDb25maWcuZ2V0KEwpO251bGwhPUomJihKLmxhYmVsQXJlYS5yZW1vdmUoKSx0aGlzLl9sYWJlbENvbmZpZy5kZWxldGUoTCkpfTtLLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKEwpe3ZhciBKPXRoaXM7cmV0dXJuIHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChmdW5jdGlvbigpe2Z1bmN0aW9uIFAoYmEsbGEsd2EsQ2Epe3JldHVybiBKLl9waXhlbFBvaW50QmFyKGhhKGJhLGxhLHdhKSxYLENhKX12YXIgUz0KSi5faXNWZXJ0aWNhbD9MLng6TC55LE49Si5faXNWZXJ0aWNhbD9MLnk6TC54LFQ9Si5ib3VuZHMoKSxZPXttaW46MCxtYXg6VC5ib3R0b21SaWdodC54LVQudG9wTGVmdC54fSxhYT17bWluOjAsbWF4OlQuYm90dG9tUmlnaHQueS1ULnRvcExlZnQueX0saGE9RC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihKLmxlbmd0aCgpKSxYPUoubGVuZ3RoKCkuc2NhbGUuc2NhbGUoSi5iYXNlbGluZVZhbHVlKCkpLGNhPUluZmluaXR5LGVhPUluZmluaXR5LGthO0ouX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGJhKXt2YXIgbGE9Si5fZW50aXR5Qm91bmRzKGJhKTtpZihDLkRPTS5pbnRlcnNlY3RzQkJveChZLGFhLGxhKSl7dmFyIHdhPTAsQ2E9MDtpZighQy5ET00uaW50ZXJzZWN0c0JCb3goTC54LEwueSxsYSwuNSkpe0NhPVAoYmEuZGF0dW0sYmEuaW5kZXgsYmEuZGF0YXNldCxsYSk7d2E9TWF0aC5hYnMoUy0oSi5faXNWZXJ0aWNhbD9DYS54OkNhLnkpKTt2YXIgeGE9CkouX2lzVmVydGljYWw/bGEueTpsYS54O2xhPXhhKyhKLl9pc1ZlcnRpY2FsP2xhLmhlaWdodDpsYS53aWR0aCk7Q2E9Tj49eGEtLjUmJk48PWxhKy41PzA6TWF0aC5hYnMoTi0oSi5faXNWZXJ0aWNhbD9DYS55OkNhLngpKX1pZih3YTxjYXx8d2E9PT1jYSYmQ2E8ZWEpa2E9YmEsY2E9d2EsZWE9Q2F9fSk7aWYodm9pZCAwIT09a2EpcmV0dXJuIEouX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShrYSl9KX07Sy5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihMKXtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcoTC54LEwueSl9O0sucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbihMLEope3ZhciBQPXRoaXMsUz1bXTt0aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihOKXtDLkRPTS5pbnRlcnNlY3RzQkJveChMLEosUC5fZW50aXR5Qm91bmRzKE4pKSYmUy5wdXNoKFAuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShOKSl9KTsKcmV0dXJuIFN9O0sucHJvdG90eXBlLl91cGRhdGVMZW5ndGhTY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgTD10aGlzLmxlbmd0aCgpLnNjYWxlO0wgaW5zdGFuY2VvZiB4LlF1YW50aXRhdGl2ZVNjYWxlJiYoTC5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksTC5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfX07Sy5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgTD10aGlzO3RoaXMuX2JhclBpeGVsVGhpY2tuZXNzKCk7cmV0dXJuIHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChmdW5jdGlvbigpe3JldHVybiBHLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKEwpfSl9O0sucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oTCl7dmFyIEo9dGhpcyxQPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpOwpQPXt4MTp0aGlzLl9pc1ZlcnRpY2FsPzA6UCx5MTp0aGlzLl9pc1ZlcnRpY2FsP1A6MCx4Mjp0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTpQLHkyOnRoaXMuX2lzVmVydGljYWw/UDp0aGlzLmhlaWdodCgpfTt0aGlzLl9nZXRBbmltYXRvcigiYmFzZWxpbmUiKS5hbmltYXRlKHRoaXMuX2Jhc2VsaW5lLFApO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKFMpe3JldHVybiBKLl9sYWJlbENvbmZpZy5nZXQoUykubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSk7dGhpcy5fbGFiZWxzRW5hYmxlZCYmQy5XaW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBKLl9kcmF3TGFiZWxzKCl9LEwpfTtLLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oTCl7dmFyIEo9dGhpcyxQPUcucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsTCk7aWYoIngiPT09TCYmdGhpcy5faXNWZXJ0aWNhbClMPXRoaXMueCgpOwplbHNle2lmKCJ5IiE9PUx8fHRoaXMuX2lzVmVydGljYWwpcmV0dXJuIFA7TD10aGlzLnkoKX1pZighKEwmJkwuc2NhbGUmJkwuc2NhbGUgaW5zdGFuY2VvZiB4LlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm4gUDt2YXIgUz1MLnNjYWxlLE49dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gUD1QLm1hcChmdW5jdGlvbihUKXtyZXR1cm4gay5leHRlbnQoW1MuaW52ZXJ0KEouX2dldFBvc2l0aW9uQXR0cihTLnNjYWxlKFRbMF0pLE4pKSxTLmludmVydChKLl9nZXRQb3NpdGlvbkF0dHIoUy5zY2FsZShUWzBdKSxOKStOKSxTLmludmVydChKLl9nZXRQb3NpdGlvbkF0dHIoUy5zY2FsZShUWzFdKSxOKSksUy5pbnZlcnQoSi5fZ2V0UG9zaXRpb25BdHRyKFMuc2NhbGUoVFsxXSksTikrTildKX0pfTtLLnByb3RvdHlwZS5fZ2V0UG9zaXRpb25BdHRyPWZ1bmN0aW9uKEwsSil7dGhpcy5faXNWZXJ0aWNhbHx8KEwtPUosSio9LTEpO3N3aXRjaCh0aGlzLl9iYXJBbGlnbm1lbnQpe2Nhc2UgInN0YXJ0IjpyZXR1cm4gTDsKY2FzZSAiZW5kIjpyZXR1cm4gTC1KO2RlZmF1bHQ6cmV0dXJuIEwtSi8yfX07Sy5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgTD10aGlzLEo9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLFA9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksUz10aGlzLmRhdGFzZXRzKCkuc29tZShmdW5jdGlvbihOKXtyZXR1cm4gSi5nZXQoTikuc29tZShmdW5jdGlvbihULFkpe3JldHVybiBudWxsPT1UPyExOkwuX2RyYXdMYWJlbChULFksTixQKX0pfSk7dGhpcy5faGlkZUJhcnNJZkFueUFyZVRvb1dpZGUmJlMmJnRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE4pe3JldHVybiBMLl9sYWJlbENvbmZpZy5nZXQoTikubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSl9O0sucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24oTCxKLFAsUyl7dmFyIE49dGhpcy5fbGFiZWxDb25maWcuZ2V0KFApLFQ9Ti5sYWJlbEFyZWEsWT1OLm1lYXN1cmVyO049Ti53cml0ZXI7CnZhciBhYT10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLGhhPWFhKEwsSixQKTthYT10aGlzLmxlbmd0aCgpLnNjYWxlO3ZhciBYPW51bGwhPWFhP2FhLnNjYWxlKGhhKTpoYSxjYT1udWxsIT1hYT9hYS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk6dGhpcy5iYXNlbGluZVZhbHVlKCksZWE9e3g6Uy54KEwsSixQKSx5OlMueShMLEosUCl9O2FhPXt3aWR0aDpTLndpZHRoKEwsSixQKSxoZWlnaHQ6Uy5oZWlnaHQoTCxKLFApfTtoYT10aGlzLl9sYWJlbEZvcm1hdHRlcihoYSxMLEosUCk7WT1ZLm1lYXN1cmUoaGEpO3ZhciBrYT10aGlzLl9zaG91bGRTaG93TGFiZWxPbkJhcihlYSxhYSxZKTtlYT10aGlzLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXMoZWEsYWEsWSxrYSx0aGlzLl9pc1ZlcnRpY2FsP1g8PWNhOlg8Y2EpO1g9ZWEuY29udGFpbmVyRGltZW5zaW9ucztjYT1lYS5sYWJlbENvbnRhaW5lck9yaWdpbjtlYT1lYS5hbGlnbm1lbnQ7TD1TLmZpbGwoTCxKLFApO1Q9dGhpcy5fY3JlYXRlTGFiZWxDb250YWluZXIoVCwKY2Esa2EsTCk7Ti53cml0ZShoYSxYLndpZHRoLFguaGVpZ2h0LHt4QWxpZ246ZWEueCx5QWxpZ246ZWEueX0sVC5ub2RlKCkpO3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP2FhLndpZHRoPFkud2lkdGg6YWEuaGVpZ2h0PFkuaGVpZ2h0fTtLLnByb3RvdHlwZS5fc2hvdWxkU2hvd0xhYmVsT25CYXI9ZnVuY3Rpb24oTCxKLFApe2lmKHRoaXMuX2xhYmVsc1Bvc2l0aW9uPT09ZC5MYWJlbHNQb3NpdGlvbi5vdXRzaWRlKXJldHVybiExO0w9dGhpcy5faXNWZXJ0aWNhbD9MLnk6TC54O3ZhciBTPXRoaXMuX2lzVmVydGljYWw/Si5oZWlnaHQ6Si53aWR0aDtKPXRoaXMuX2lzVmVydGljYWw/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCk7UD10aGlzLl9pc1ZlcnRpY2FsP1AuaGVpZ2h0OlAud2lkdGg7dmFyIE49TCtTO04+Sj9TPUotTDowPkwmJihTPU4pO3JldHVybiBQK0suX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSPD1TfTtLLnByb3RvdHlwZS5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzPQpmdW5jdGlvbihMLEosUCxTLE4pe2Z1bmN0aW9uIFQobGEpe3N3aXRjaChsYSl7Y2FzZSAidG9wTGVmdCI6Y2E9WS5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCI7a2ErPUsuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSO2JhKz1LLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjticmVhaztjYXNlICJjZW50ZXIiOmJhKz0oaGErWCkvMjticmVhaztjYXNlICJib3R0b21SaWdodCI6Y2E9WS5faXNWZXJ0aWNhbD8iYm90dG9tIjoicmlnaHQiLGthLT1LLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUixiYSs9ZWEtSy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVItWH19dmFyIFk9dGhpcyxhYT10aGlzLl9pc1ZlcnRpY2FsP0wueTpMLngsaGE9dGhpcy5faXNWZXJ0aWNhbD9KLmhlaWdodDpKLndpZHRoLFg9dGhpcy5faXNWZXJ0aWNhbD9QLmhlaWdodDpQLndpZHRoLGNhPSJjZW50ZXIiLGVhPWhhLGthPWFhLGJhPWFhO2lmKFMpc3dpdGNoKHRoaXMuX2xhYmVsc1Bvc2l0aW9uKXtjYXNlIGQuTGFiZWxzUG9zaXRpb24uc3RhcnQ6Tj8KVCgiYm90dG9tUmlnaHQiKTpUKCJ0b3BMZWZ0Iik7YnJlYWs7Y2FzZSBkLkxhYmVsc1Bvc2l0aW9uLm1pZGRsZTpUKCJjZW50ZXIiKTticmVhaztjYXNlIGQuTGFiZWxzUG9zaXRpb24uZW5kOk4/VCgidG9wTGVmdCIpOlQoImJvdHRvbVJpZ2h0Iil9ZWxzZSBOPyhjYT10aGlzLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IixlYT1oYStLLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitYLGthLT1LLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitYLGJhLT1LLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitYKTooY2E9dGhpcy5faXNWZXJ0aWNhbD8iYm90dG9tIjoicmlnaHQiLGVhPWhhK0suX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK1gsYmErPWhhK0suX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSKTtyZXR1cm57Y29udGFpbmVyRGltZW5zaW9uczp7d2lkdGg6dGhpcy5faXNWZXJ0aWNhbD9KLndpZHRoOmVhLGhlaWdodDp0aGlzLl9pc1ZlcnRpY2FsP2VhOkouaGVpZ2h0fSxsYWJlbENvbnRhaW5lck9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsPwpMLng6a2EseTp0aGlzLl9pc1ZlcnRpY2FsP2thOkwueX0sbGFiZWxPcmlnaW46e3g6dGhpcy5faXNWZXJ0aWNhbD9MLngrSi53aWR0aC8yLVAud2lkdGgvMjpiYSx5OnRoaXMuX2lzVmVydGljYWw/YmE6TC55K0ouaGVpZ2h0LzItUC5oZWlnaHQvMn0sYWxpZ25tZW50Ont4OnRoaXMuX2lzVmVydGljYWw/ImNlbnRlciI6Y2EseTp0aGlzLl9pc1ZlcnRpY2FsP2NhOiJjZW50ZXIifX19O0sucHJvdG90eXBlLl9jcmVhdGVMYWJlbENvbnRhaW5lcj1mdW5jdGlvbihMLEosUCxTKXtMPUwuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrSi54KyIsICIrSi55KyIpIik7UD8oTC5jbGFzc2VkKCJvbi1iYXItbGFiZWwiLCEwKSxQPTEuNipDLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsUyk8Qy5Db2xvci5jb250cmFzdCgiYmxhY2siLFMpLEwuY2xhc3NlZChQPyJkYXJrLWxhYmVsIjoibGlnaHQtbGFiZWwiLCEwKSk6TC5jbGFzc2VkKCJvZmYtYmFyLWxhYmVsIiwhMCk7CnJldHVybiBMfTtLLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgTD1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBKPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLFA9dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksUz10aGlzLl9pc1ZlcnRpY2FsPyJoZWlnaHQiOiJ3aWR0aCI7Slt0aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCJdPWZ1bmN0aW9uKCl7cmV0dXJuIFB9O0pbU109ZnVuY3Rpb24oKXtyZXR1cm4gMH07TC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6SixhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihGLkFuaW1hdG9yLlJFU0VUKX0pfUwucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEYuQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gTH07Sy5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe2Z1bmN0aW9uIEwoZWEsa2EsYmEpe3JldHVybiBNYXRoLmFicyhTLWFhKGVhLGthLGJhKSl9dmFyIEo9dGhpcyxQPUcucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLFM9dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksTj10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsVD10aGlzLl9pc1ZlcnRpY2FsPyJ4IjoieSIsWT1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMucG9zaXRpb24oKSksYWE9RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmxlbmd0aCgpKSxoYT1QW0suX0JBUl9USElDS05FU1NfS0VZXSxYPVAuZ2FwLGNhPW51bGw9PVg/aGE6ZnVuY3Rpb24oZWEsa2EsYmEpe3JldHVybiBoYShlYSxrYSxiYSktWChlYSxrYSxiYSl9O1Aud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD9jYTpMO1AuaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/TDpjYTtQW05dPWZ1bmN0aW9uKGVhLGthLGJhKXtlYT0KYWEoZWEsa2EsYmEpO3JldHVybiBlYT5TP1M6ZWF9O1BbVF09ZnVuY3Rpb24oZWEsa2EsYmEpe3JldHVybiBKLl9nZXRQb3NpdGlvbkF0dHIoWShlYSxrYSxiYSksaGEoZWEsa2EsYmEpKX07cmV0dXJuIFB9O0sucHJvdG90eXBlLl91cGRhdGVUaGlja25lc3NBdHRyPWZ1bmN0aW9uKCl7dmFyIEw9dGhpcyxKPXRoaXMucG9zaXRpb24oKSxQPXRoaXMuYmFyRW5kKCk7bnVsbCE9SiYmbnVsbCE9UD8odGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz0hMSx0aGlzLmF0dHIoSy5fQkFSX1RISUNLTkVTU19LRVksZnVuY3Rpb24oUyxOLFQpe3ZhciBZPUouYWNjZXNzb3IoUyxOLFQpO1M9UC5hY2Nlc3NvcihTLE4sVCk7WT1KLnNjYWxlP0ouc2NhbGUuc2NhbGUoWSk6WTtTPVAuc2NhbGU/UC5zY2FsZS5zY2FsZShTKTpTO3JldHVybiBNYXRoLmFicyhTLVkpfSkpOih0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSEwLHRoaXMuYXR0cihLLl9CQVJfVEhJQ0tORVNTX0tFWSxmdW5jdGlvbigpe3JldHVybiBMLl9iYXJQaXhlbFRoaWNrbmVzcygpfSkpfTsKSy5wcm90b3R5cGUuX2JhclBpeGVsVGhpY2tuZXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M/dGhpcy5fcHJvamVjdG9yc1JlYWR5KCk/dGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzKHRoaXMucG9zaXRpb24oKSx0aGlzLmRhdGFzZXRzKCksdGhpcy5faXNWZXJ0aWNhbD90aGlzLndpZHRoKCk6dGhpcy5oZWlnaHQoKSk6MDowfTtLLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihMKXt2b2lkIDA9PT1MJiYoTD10aGlzLmRhdGFzZXRzKCkpO3JldHVybiB0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT9HLnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsTCk6W119O0sucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oTCl7cmV0dXJuIHRoaXMuX3BpeGVsQm91bmRzKEwuZGF0dW0sTC5pbmRleCxMLmRhdGFzZXQpfTtLLnByb3RvdHlwZS5fcGl4ZWxCb3VuZHM9ZnVuY3Rpb24oTCxKLFApe3ZhciBTPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpOwpyZXR1cm57eDpTLngoTCxKLFApLHk6Uy55KEwsSixQKSx3aWR0aDpTLndpZHRoKEwsSixQKSxoZWlnaHQ6Uy5oZWlnaHQoTCxKLFApfX07Sy5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oTCxKLFApe3ZhciBTPXRoaXMuX3BpeGVsQm91bmRzKEwsSixQKTtMPSh0aGlzLl9pc1ZlcnRpY2FsP0QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOkQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpKShMLEosUCk7Sj0odGhpcy5faXNWZXJ0aWNhbD90aGlzLnkoKS5zY2FsZTp0aGlzLngoKS5zY2FsZSkuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpO3JldHVybiB0aGlzLl9waXhlbFBvaW50QmFyKEwsSixTKX07Sy5wcm90b3R5cGUuX3BpeGVsUG9pbnRCYXI9ZnVuY3Rpb24oTCxKLFApe2lmKHRoaXMuX2lzVmVydGljYWwpe3ZhciBTPVAueCtQLndpZHRoLzI7TD1MPD1KP1AueTpQLnkrUC5oZWlnaHR9ZWxzZSBTPUw+PUo/UC54K1Aud2lkdGg6UC54LEw9UC55K1AuaGVpZ2h0LwoyO3JldHVybnt4OlMseTpMfX07Sy5wcm90b3R5cGUuX3VuaW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKEwsSil7Ry5wcm90b3R5cGUuX3VuaW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyxMLEopfTtLLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBMPXRoaXMsSj1uZXcgQy5NYXAsUD10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxTPXRoaXMud2lkdGgoKSxOPXRoaXMuaGVpZ2h0KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oVCl7dmFyIFk9VC5kYXRhKCkubWFwKGZ1bmN0aW9uKGFhLGhhKXtyZXR1cm4gTC5faXNEYXR1bU9uU2NyZWVuKFAsUyxOLGFhLGhhLFQpP2FhOm51bGx9KTtKLnNldChULFkpfSk7cmV0dXJuIEp9O0sucHJvdG90eXBlLl9pc0RhdHVtT25TY3JlZW49ZnVuY3Rpb24oTCxKLFAsUyxOLFQpe3ZhciBZPUwueChTLE4sVCksYWE9TC55KFMsTixUKSxoYT1MLndpZHRoKFMsTixUKTtMPUwuaGVpZ2h0KFMsTixUKTsKcmV0dXJuIEMuTWF0aC5pc1ZhbGlkTnVtYmVyKFkpJiZDLk1hdGguaXNWYWxpZE51bWJlcihhYSkmJkMuTWF0aC5pc1ZhbGlkTnVtYmVyKGhhKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoTCk/Qy5NYXRoLmJvdW5kc0ludGVyc2VjdHMoWSxhYSxoYSxMLEosUCk6ITF9O3JldHVybiBLfShmLlhZUGxvdCk7Qi5fQkFSX1RISUNLTkVTU19SQVRJTz0uOTU7Qi5fU0lOR0xFX0JBUl9ESU1FTlNJT05fUkFUSU89LjQ7Qi5fQkFSX0FSRUFfQ0xBU1M9ImJhci1hcmVhIjtCLl9CQVJfRU5EX0tFWT0iYmFyRW5kIjtCLl9CQVJfVEhJQ0tORVNTX0tFWT0id2lkdGgiO0IuX0xBQkVMX0FSRUFfQ0xBU1M9ImJhci1sYWJlbC10ZXh0LWFyZWEiO0IuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSPTEwO2QuQmFyPUJ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odixBKXtmdW5jdGlvbiB5KCl7dGhpcy5jb25zdHJ1Y3Rvcj12fWZvcih2YXIgeCBpbiBBKUEuaGFzT3duUHJvcGVydHkoeCkmJgoodlt4XT1BW3hdKTt2LnByb3RvdHlwZT1udWxsPT09QT9PYmplY3QuY3JlYXRlKEEpOih5LnByb3RvdHlwZT1BLnByb3RvdHlwZSxuZXcgeSl9LGw9ZigxKSxrPWYoNSksbT1mKDgpLHA9ZigzKSxxPWYoMCk7Yz1mKDEwKTt2YXIgcj1mKDIyKTtkLlRpbWVJbnRlcnZhbD1jLm1ha2VFbnVtKCJzZWNvbmQgbWludXRlIGhvdXIgZGF5IHdlZWsgbW9udGggeWVhciIuc3BsaXQoIiAiKSk7ZC5UaW1lQXhpc09yaWVudGF0aW9uPWMubWFrZUVudW0oWyJ0b3AiLCJib3R0b20iXSk7ZC5UaWVyTGFiZWxQb3NpdGlvbj1jLm1ha2VFbnVtKFsiYmV0d2VlbiIsImNlbnRlciJdKTtmPWZ1bmN0aW9uKHYpe2Z1bmN0aW9uIEEoeSx4KXt5PXYuY2FsbCh0aGlzLHkseCl8fHRoaXM7eS5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uPW51bGw7eS5fdGllckxhYmVsUG9zaXRpb25zPVtdO3kuYWRkQ2xhc3MoInRpbWUtYXhpcyIpO3kudGlja0xhYmVsUGFkZGluZyg1KTt5LmF4aXNDb25maWd1cmF0aW9ucyhBLl9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUyk7CnkuYW5ub3RhdGlvbkZvcm1hdHRlcihtLnRpbWUoIiVhICViICVkLCAlWSIpKTtyZXR1cm4geX1nKEEsdik7QS5wcm90b3R5cGUudGllckxhYmVsUG9zaXRpb25zPWZ1bmN0aW9uKHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX3RpZXJMYWJlbFBvc2l0aW9ucztpZigheS5ldmVyeShmdW5jdGlvbih4KXtyZXR1cm4iYmV0d2VlbiI9PT14LnRvTG93ZXJDYXNlKCl8fCJjZW50ZXIiPT09eC50b0xvd2VyQ2FzZSgpfSkpdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIHBvc2l0aW9uIGZvciB0aWVyIGxhYmVscyIpO3RoaXMuX3RpZXJMYWJlbFBvc2l0aW9ucz15O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLm1heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb247dGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uPXk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307QS5wcm90b3R5cGUuY3VycmVudEF4aXNDb25maWd1cmF0aW9uPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF19O0EucHJvdG90eXBlLmF4aXNDb25maWd1cmF0aW9ucz1mdW5jdGlvbih5KXtpZihudWxsIT15KXt0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnM9eTt0aGlzLl9udW1UaWVycz1xLk1hdGgubWF4KHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIEYubGVuZ3RofSksMCk7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fc2V0dXBEb21FbGVtZW50cygpO3k9dGhpcy50aWVyTGFiZWxQb3NpdGlvbnMoKTtmb3IodmFyIHg9W10sQz0wO0M8dGhpcy5fbnVtVGllcnM7QysrKXgucHVzaCh5W0NdfHwiYmV0d2VlbiIpO3RoaXMudGllckxhYmVsUG9zaXRpb25zKHgpO3RoaXMucmVkcmF3KCl9fTtBLnByb3RvdHlwZS5fZ2V0TW9zdFByZWNpc2VDb25maWd1cmF0aW9uSW5kZXg9CmZ1bmN0aW9uKCl7dmFyIHk9dGhpcyx4PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5sZW5ndGg7dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmZvckVhY2goZnVuY3Rpb24oQyxGKXtGPHgmJkMuZXZlcnkoZnVuY3Rpb24oRCl7cmV0dXJuIHkuX2NoZWNrVGltZUF4aXNUaWVyQ29uZmlndXJhdGlvbihEKX0pJiYoeD1GKX0pO3g9PT10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoJiYocS5XaW5kb3cud2Fybigiem9vbWVkIG91dCB0b28gZmFyOiBjb3VsZCBub3QgZmluZCBzdWl0YWJsZSBpbnRlcnZhbCB0byBkaXNwbGF5IGxhYmVscyIpLC0teCk7cmV0dXJuIHh9O0EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHkpe2lmKHkmJigicmlnaHQiPT09eS50b0xvd2VyQ2FzZSgpfHwibGVmdCI9PT15LnRvTG93ZXJDYXNlKCkpKXRocm93IEVycm9yKHkrIiBpcyBub3QgYSBzdXBwb3J0ZWQgb3JpZW50YXRpb24gZm9yIFRpbWVBeGlzIC0gb25seSBob3Jpem9udGFsIG9yaWVudGF0aW9ucyBhcmUgc3VwcG9ydGVkIik7CnJldHVybiB2LnByb3RvdHlwZS5vcmllbnRhdGlvbi5jYWxsKHRoaXMseSl9O0EucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHk9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt0aGlzLl90aWVySGVpZ2h0cz1bXTtmb3IodmFyIHg9MDt4PHRoaXMuX251bVRpZXJzO3grKyl0aGlzLl90aWVySGVpZ2h0cy5wdXNoKHkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrKCJiZXR3ZWVuIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT8wOnRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpKSk7cmV0dXJuIGwuc3VtKHRoaXMuX3RpZXJIZWlnaHRzKX07QS5wcm90b3R5cGUuX2dldEludGVydmFsTGVuZ3RoPWZ1bmN0aW9uKHkpe3ZhciB4PXRoaXMuX3NjYWxlLmRvbWFpbigpWzBdO3k9cC5UaW1lLnRpbWVJbnRlcnZhbFRvRDNUaW1lKHkuaW50ZXJ2YWwpLm9mZnNldCh4LHkuc3RlcCk7cmV0dXJuIHk+dGhpcy5fc2NhbGUuZG9tYWluKClbMV0/dGhpcy53aWR0aCgpOgpNYXRoLmFicyh0aGlzLl9zY2FsZS5zY2FsZSh5KS10aGlzLl9zY2FsZS5zY2FsZSh4KSl9O0EucHJvdG90eXBlLl9tYXhXaWR0aEZvckludGVydmFsPWZ1bmN0aW9uKHkpe3JldHVybiB0aGlzLl9tZWFzdXJlci5tZWFzdXJlKHkuZm9ybWF0dGVyKEEuX0xPTkdfREFURSkpLndpZHRofTtBLnByb3RvdHlwZS5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uPWZ1bmN0aW9uKHkpe2lmKG51bGwhPXRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbil7dmFyIHg9QS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbdGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uXSxDPUEuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYW3kuaW50ZXJ2YWxdO2lmKG51bGwhPXgmJm51bGwhPUMmJkM8eClyZXR1cm4hMX14PXRoaXMuX21heFdpZHRoRm9ySW50ZXJ2YWwoeSkrMip0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtyZXR1cm4gTWF0aC5taW4odGhpcy5fZ2V0SW50ZXJ2YWxMZW5ndGgoeSksCnRoaXMud2lkdGgoKSk+PXh9O0EucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHkseCl7dmFyIEM9di5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIuY2FsbCh0aGlzLHkseCk7eT10aGlzLl90aWVySGVpZ2h0cy5yZWR1Y2UoZnVuY3Rpb24oRixEKXtyZXR1cm4gRitEPkMuaGVpZ2h0P0Y6RitEfSk7eD10aGlzLm1hcmdpbigpKyh0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKnRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk6MCk7Qy5oZWlnaHQ9TWF0aC5taW4oQy5oZWlnaHQseSt4KTtyZXR1cm4gQ307QS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7di5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fc2V0dXBEb21FbGVtZW50cygpfTtBLnByb3RvdHlwZS5fc2V0dXBEb21FbGVtZW50cz1mdW5jdGlvbigpe3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIrQS5USU1FX0FYSVNfVElFUl9DTEFTUykucmVtb3ZlKCk7CnRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnM9W107dGhpcy5fdGllck1hcmtDb250YWluZXJzPVtdO3RoaXMuX3RpZXJCYXNlbGluZXM9W107dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnJlbW92ZSgpO3RoaXMuX2Jhc2VsaW5lLnJlbW92ZSgpO2Zvcih2YXIgeT0wO3k8dGhpcy5fbnVtVGllcnM7Kyt5KXt2YXIgeD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKEEuVElNRV9BWElTX1RJRVJfQ0xBU1MsITApO3RoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnMucHVzaCh4LmFwcGVuZCgiZyIpLmNsYXNzZWQoci5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MrIi1jb250YWluZXIiLCEwKSk7dGhpcy5fdGllck1hcmtDb250YWluZXJzLnB1c2goeC5hcHBlbmQoImciKS5jbGFzc2VkKHIuQXhpcy5USUNLX01BUktfQ0xBU1MrIi1jb250YWluZXIiLCEwKSk7dGhpcy5fdGllckJhc2VsaW5lcy5wdXNoKHguYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKSl9eT1uZXcgay5TdmdDb250ZXh0KHRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbMF0ubm9kZSgpKTsKdGhpcy5fbWVhc3VyZXI9bmV3IGsuQ2FjaGVNZWFzdXJlcih5KX07QS5wcm90b3R5cGUuX2dldFRpY2tJbnRlcnZhbFZhbHVlcz1mdW5jdGlvbih5KXtyZXR1cm4gdGhpcy5fc2NhbGUudGlja0ludGVydmFsKHkuaW50ZXJ2YWwseS5zdGVwKX07QS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgeT10aGlzO3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF0ucmVkdWNlKGZ1bmN0aW9uKHgsQyl7cmV0dXJuIHguY29uY2F0KHkuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyhDKSl9LFtdKX07QS5wcm90b3R5cGUuX2NsZWFuVGllcnM9ZnVuY3Rpb24oKXtmb3IodmFyIHk9MDt5PHRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnMubGVuZ3RoO3krKyl0aGlzLl90aWVyTGFiZWxDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrci5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLnJlbW92ZSgpLHRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iKwpyLkF4aXMuVElDS19NQVJLX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyQmFzZWxpbmVzW3ldLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9O0EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbj1mdW5jdGlvbih5KXt5PXRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbCh5LmludGVydmFsLHkuc3RlcCk7dmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKCksQz15Lm1hcChmdW5jdGlvbihGKXtyZXR1cm4gRi52YWx1ZU9mKCl9KTstMT09PUMuaW5kZXhPZih4WzBdLnZhbHVlT2YoKSkmJnkudW5zaGlmdCh4WzBdKTstMT09PUMuaW5kZXhPZih4WzFdLnZhbHVlT2YoKSkmJnkucHVzaCh4WzFdKTtyZXR1cm4geX07QS5wcm90b3R5cGUuX3JlbmRlclRpZXJMYWJlbHM9ZnVuY3Rpb24oeSx4LEMpe3ZhciBGPXRoaXMsRD10aGlzLl9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbih4KSxCPVtdOyJiZXR3ZWVuIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXSYmCjE9PT14LnN0ZXA/RC5tYXAoZnVuY3Rpb24oUCxTKXtTKzE+PUQubGVuZ3RofHxCLnB1c2gobmV3IERhdGUoKERbUysxXS52YWx1ZU9mKCktRFtTXS52YWx1ZU9mKCkpLzIrRFtTXS52YWx1ZU9mKCkpKX0pOkI9RDt5PXkuc2VsZWN0QWxsKCIuIityLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShCLGZ1bmN0aW9uKFApe3JldHVybiBTdHJpbmcoUC52YWx1ZU9mKCkpfSk7dmFyIEc9eS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoci5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsITApO0cuYXBwZW5kKCJ0ZXh0Iik7dmFyIEs9ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ118fDE9PT14LnN0ZXA/MDp0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt2YXIgTD0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT9sLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMrMSkpLXRoaXMudGlja0xhYmVsUGFkZGluZygpOiJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdPwp0aGlzLmhlaWdodCgpLWwuc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQykpLXRoaXMudGlja0xhYmVsUGFkZGluZygpLXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpOnRoaXMuaGVpZ2h0KCktbC5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7Rz15Lm1lcmdlKEcpO3ZhciBKPUcuc2VsZWN0QWxsKCJ0ZXh0Iik7MDxKLnNpemUoKSYmSi5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitLKyIsIitMKyIpIik7eS5leGl0KCkucmVtb3ZlKCk7Ry5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKFApe3JldHVybiJ0cmFuc2xhdGUoIitGLl9zY2FsZS5zY2FsZShQKSsiLDApIn0pO0M9ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ118fDE9PT14LnN0ZXA/Im1pZGRsZSI6InN0YXJ0IjtHLnNlbGVjdEFsbCgidGV4dCIpLnRleHQoeC5mb3JtYXR0ZXIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsQyl9O0EucHJvdG90eXBlLl9yZW5kZXJUaWNrTWFya3M9CmZ1bmN0aW9uKHkseCl7eT10aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbeF0uc2VsZWN0QWxsKCIuIityLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHkpO3ZhciBDPXkuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHIuQXhpcy5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHkpLEY9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCksRD10aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLHgpLnJlZHVjZShmdW5jdGlvbihCLEcpe3JldHVybiBCK0d9LDApOyJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhGLnkxPUQsRi55Mj1EKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmlubmVyVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3hdKSk6KEYueTE9dGhpcy5oZWlnaHQoKS1ELEYueTI9dGhpcy5oZWlnaHQoKS0oRCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbeF0/dGhpcy5pbm5lclRpY2tMZW5ndGgoKToKdGhpcy5fdGllckhlaWdodHNbeF0pKSk7Qy5hdHRycyhGKTsiYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT8oRi55MT1ELEYueTI9RCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbeF0/dGhpcy5lbmRUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbeF0pKTooRi55MT10aGlzLmhlaWdodCgpLUQsRi55Mj10aGlzLmhlaWdodCgpLShEKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmVuZFRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t4XSkpKTtsLnNlbGVjdChDLm5vZGVzKClbMF0pLmF0dHJzKEYpO2wuc2VsZWN0KEMubm9kZXMoKVtDLnNpemUoKS0xXSkuYXR0cnMoRik7bC5zZWxlY3QoQy5ub2RlcygpWzBdKS5jbGFzc2VkKHIuQXhpcy5FTkRfVElDS19NQVJLX0NMQVNTLCEwKTtsLnNlbGVjdChDLm5vZGVzKClbQy5zaXplKCktMV0pLmNsYXNzZWQoci5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsITApO3kuZXhpdCgpLnJlbW92ZSgpfTsKQS5wcm90b3R5cGUuX3JlbmRlckxhYmVsbGVzc1RpY2tNYXJrcz1mdW5jdGlvbih5KXt5PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrci5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh5KTt2YXIgeD15LmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChyLkF4aXMuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh5KSxDPXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpO0MueTI9ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6dGhpcy5oZWlnaHQoKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt4LmF0dHJzKEMpO3kuZXhpdCgpLnJlbW92ZSgpfTtBLnByb3RvdHlwZS5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcz1mdW5jdGlvbigpe3JldHVybiAxPnRoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXg/W106dGhpcy5fZ2V0VGlja0ludGVydmFsVmFsdWVzKHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4LQoxXVswXSl9O0EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHk9dGhpczt0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4PXRoaXMuX2dldE1vc3RQcmVjaXNlQ29uZmlndXJhdGlvbkluZGV4KCk7dmFyIHg9dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdO3RoaXMuX2NsZWFuVGllcnMoKTt4LmZvckVhY2goZnVuY3Rpb24oRyxLKXtyZXR1cm4geS5fcmVuZGVyVGllckxhYmVscyh5Ll90aWVyTGFiZWxDb250YWluZXJzW0tdLEcsSyl9KTtmb3IodmFyIEM9eC5tYXAoZnVuY3Rpb24oRyl7cmV0dXJuIHkuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKEcpfSksRj0wLEQ9MDtEPE1hdGgubWF4KHgubGVuZ3RoLDEpOysrRCl7dmFyIEI9dGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCk7Qi55MSs9ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/RjotRjtCLnkyPUIueTE7CnRoaXMuX3RpZXJCYXNlbGluZXNbRF0uYXR0cnMoQikuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iik7Ris9dGhpcy5fdGllckhlaWdodHNbRF19Rj1bXTtEPXRoaXMuX3NjYWxlLmRvbWFpbigpO0Q9dGhpcy5fc2NhbGUuc2NhbGUoRFsxXSktdGhpcy5fc2NhbGUuc2NhbGUoRFswXSk7MS41KnRoaXMuX2dldEludGVydmFsTGVuZ3RoKHhbMF0pPj1EJiYoRj10aGlzLl9nZW5lcmF0ZUxhYmVsbGVzc1RpY2tzKCkpO3RoaXMuX3JlbmRlckxhYmVsbGVzc1RpY2tNYXJrcyhGKTt0aGlzLl9oaWRlT3ZlcmZsb3dpbmdUaWVycygpO2ZvcihEPTA7RDx4Lmxlbmd0aDsrK0QpdGhpcy5fcmVuZGVyVGlja01hcmtzKENbRF0sRCksdGhpcy5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzKEQpO3RoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5fZHJhd0Fubm90YXRpb25zKCk6dGhpcy5fcmVtb3ZlQW5ub3RhdGlvbnMoKTtyZXR1cm4gdGhpc307QS5wcm90b3R5cGUuX2hpZGVPdmVyZmxvd2luZ1RpZXJzPQpmdW5jdGlvbigpe3ZhciB5PXRoaXMseD10aGlzLmhlaWdodCgpLEM9MDt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK0EuVElNRV9BWElTX1RJRVJfQ0xBU1MpLmF0dHIoInZpc2liaWxpdHkiLGZ1bmN0aW9uKEYsRCl7Qys9eS5fdGllckhlaWdodHNbRF07cmV0dXJuIEM8PXg/ImluaGVyaXQiOiJoaWRkZW4ifSl9O0EucHJvdG90eXBlLl9oaWRlT3ZlcmxhcHBpbmdBbmRDdXRPZmZMYWJlbHM9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geChHKXtyZXR1cm4gTWF0aC5mbG9vcihGLmxlZnQpPD1NYXRoLmNlaWwoRy5sZWZ0KSYmTWF0aC5mbG9vcihGLnRvcCk8PU1hdGguY2VpbChHLnRvcCkmJk1hdGguZmxvb3IoRy5yaWdodCk8PU1hdGguY2VpbChGLmxlZnQrQy53aWR0aCgpKSYmTWF0aC5mbG9vcihHLmJvdHRvbSk8PU1hdGguY2VpbChGLnRvcCtDLmhlaWdodCgpKX12YXIgQz10aGlzLEY9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEQ9dGhpcy5fdGllck1hcmtDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrCnIuQXhpcy5USUNLX01BUktfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBHPWwuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuInZpc2libGUiPT09R3x8ImluaGVyaXQiPT09R30pLm5vZGVzKCkubWFwKGZ1bmN0aW9uKEcpe3JldHVybiBHLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSksQjt0aGlzLl90aWVyTGFiZWxDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrci5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBHPWwuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuInZpc2libGUiPT09R3x8ImluaGVyaXQiPT09R30pLmVhY2goZnVuY3Rpb24oRyxLKXtHPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIEw9bC5zZWxlY3QodGhpcyksSj1EW0tdLFA9RFtLKzFdO0s9bnVsbCE9QiYmcS5ET00uY2xpZW50UmVjdHNPdmVybGFwKEcsQik7Sj1udWxsIT1KJiZxLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoRywKSik7UD1udWxsIT1QJiZxLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoRyxQKTsheChHKXx8S3x8Snx8UD9MLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik6KEI9RyxMLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpKX0pfTtBLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt2LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gQX0oci5BeGlzKTtmLlRJTUVfQVhJU19USUVSX0NMQVNTPSJ0aW1lLWF4aXMtdGllciI7Zi5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVg9KHQ9e30sdFtkLlRpbWVJbnRlcnZhbC5zZWNvbmRdPTAsdFtkLlRpbWVJbnRlcnZhbC5taW51dGVdPTEsdFtkLlRpbWVJbnRlcnZhbC5ob3VyXT0yLHRbZC5UaW1lSW50ZXJ2YWwuZGF5XT0zLHRbZC5UaW1lSW50ZXJ2YWwud2Vla109NCx0W2QuVGltZUludGVydmFsLm1vbnRoXT01LHRbZC5UaW1lSW50ZXJ2YWwueWVhcl09CjYsdCk7Zi5fREVGQVVMVF9USU1FX0FYSVNfQ09ORklHVVJBVElPTlM9W1t7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6NSxmb3JtYXR0ZXI6bS50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MTAsZm9ybWF0dGVyOm0udGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjE1LApmb3JtYXR0ZXI6bS50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MzAsZm9ybWF0dGVyOm0udGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjUsZm9ybWF0dGVyOm0udGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJUIgJWUsICVZIil9XSwKW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxMCxmb3JtYXR0ZXI6bS50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTUsZm9ybWF0dGVyOm0udGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjMwLGZvcm1hdHRlcjptLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjptLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LApzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLmhvdXIsc3RlcDozLGZvcm1hdHRlcjptLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjptLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6Nixmb3JtYXR0ZXI6bS50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEyLGZvcm1hdHRlcjptLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjptLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjptLnRpbWUoIiVhICVlIil9LAp7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjptLnRpbWUoIiVCICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJWUiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlQiAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJUIiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjptLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlYiIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDozLGZvcm1hdHRlcjptLnRpbWUoIiViIil9LAp7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm0udGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDo2LGZvcm1hdHRlcjptLnRpbWUoIiViIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bS50aW1lKCIleSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NSxmb3JtYXR0ZXI6bS50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MjUsZm9ybWF0dGVyOm0udGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUwLGZvcm1hdHRlcjptLnRpbWUoIiVZIil9XSwKW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MTAwLGZvcm1hdHRlcjptLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoyMDAsZm9ybWF0dGVyOm0udGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUwMCxmb3JtYXR0ZXI6bS50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MUUzLGZvcm1hdHRlcjptLnRpbWUoIiVZIil9XV07Zi5fTE9OR19EQVRFPW5ldyBEYXRlKDk5OTksOCwyOSwxMiw1OSw5OTk5KTtkLlRpbWU9Zjt2YXIgdH0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG0pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPWt9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKGtbcV09bVtxXSk7ay5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToocC5wcm90b3R5cGU9Cm0ucHJvdG90eXBlLG5ldyBwKX0sbD1mKDEyKTtjPWZ1bmN0aW9uKGspe2Z1bmN0aW9uIG0oKXt2YXIgcD1rLmNhbGwodGhpcyl8fHRoaXM7cC5fZGV0YWNoQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIHAucmVtb3ZlKHEpfTtyZXR1cm4gcH1nKG0sayk7bS5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKHApe3ZhciBxPXRoaXM7cD1sLmNvZXJjZUV4dGVybmFsRDMocCk7ay5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyxwKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHIpe3JldHVybiByLmFuY2hvcihxLmVsZW1lbnQoKSl9KTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihwKXtyZXR1cm4gcC5yZW5kZXIoKX0pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiaGFzKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpO307bS5wcm90b3R5cGUuX2Fkb3B0QW5kQW5jaG9yPQpmdW5jdGlvbihwKXtwLnBhcmVudCh0aGlzKTtwLm9uRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKTt0aGlzLl9pc0FuY2hvcmVkJiZwLmFuY2hvcih0aGlzLmVsZW1lbnQoKSl9O20ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihwKXt0aGlzLmhhcyhwKSYmKHAub2ZmRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKSx0aGlzLl9yZW1vdmUocCkscC5kZXRhY2goKSx0aGlzLnJlZHJhdygpKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbigpe307bS5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiX2ZvckVhY2goKSBpcyBub3QgaW1wbGVtZW50ZWQgb24gQ29tcG9uZW50Q29udGFpbmVyIik7fTttLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2ZvckVhY2goZnVuY3Rpb24ocCl7cmV0dXJuIHAuZGVzdHJveSgpfSl9O20ucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT0KZnVuY3Rpb24oKXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHApe3JldHVybiBwLmludmFsaWRhdGVDYWNoZSgpfSl9O3JldHVybiBtfShmKDQpLkNvbXBvbmVudCk7ZC5Db21wb25lbnRDb250YWluZXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoQSl7cS5hZGQoQSk7cC5hZGQoQSk7bCgpfWZ1bmN0aW9uIGwoKXtyfHwocj0hMCx2LnJlbmRlcigpKX12YXIgaz1mKDApO2M9ZigxMCk7dmFyIG09ZigzOSkscD1uZXcgay5TZXQscT1uZXcgay5TZXQscj0hMSx0PSExO2QuUG9saWN5PWMubWFrZUVudW0oWyJpbW1lZGlhdGUiLCJhbmltYXRpb25GcmFtZSIsInRpbWVvdXQiXSk7dmFyIHY9bmV3IG0uQW5pbWF0aW9uRnJhbWU7ZC5yZW5kZXJQb2xpY3k9ZnVuY3Rpb24oKXt2YXIgQT1QbG90dGFibGUuUmVuZGVyQ29udHJvbGxlci5Qb2xpY3kuaW1tZWRpYXRlO2lmKG51bGwhPUEpc3dpdGNoKEEpe2Nhc2UgZC5Qb2xpY3kuaW1tZWRpYXRlOnY9bmV3IG0uSW1tZWRpYXRlO2JyZWFrOwpjYXNlIGQuUG9saWN5LmFuaW1hdGlvbkZyYW1lOnY9bmV3IG0uQW5pbWF0aW9uRnJhbWU7YnJlYWs7Y2FzZSBkLlBvbGljeS50aW1lb3V0OnY9bmV3IG0uVGltZW91dDticmVhaztkZWZhdWx0OmsuV2luZG93Lndhcm4oIlVucmVjb2duaXplZCByZW5kZXJQb2xpY3k6ICIrQSl9fTtkLnJlZ2lzdGVyVG9SZW5kZXI9ZnVuY3Rpb24oQSl7dCYmay5XaW5kb3cud2FybigiUmVnaXN0ZXJlZCB0byByZW5kZXIgd2hpbGUgb3RoZXIgY29tcG9uZW50cyBhcmUgZmx1c2hpbmc6IHJlcXVlc3QgbWF5IGJlIGlnbm9yZWQiKTtwLmFkZChBKTtsKCl9O2QucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXI9ZztkLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0PWZ1bmN0aW9uKEEpe2coQSl9O2QuZmx1c2g9ZnVuY3Rpb24oKXtpZihyKXtxLmZvckVhY2goZnVuY3Rpb24oeSl7cmV0dXJuIHkuY29tcHV0ZUxheW91dCgpfSk7cC5mb3JFYWNoKGZ1bmN0aW9uKHkpe3JldHVybiB5LnJlbmRlcigpfSk7CnQ9ITA7dmFyIEE9bmV3IGsuU2V0O3AuZm9yRWFjaChmdW5jdGlvbih5KXt0cnl7eS5yZW5kZXJJbW1lZGlhdGVseSgpfWNhdGNoKHgpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgeDt9LDApLEEuYWRkKHkpfX0pO3E9bmV3IGsuU2V0O3A9QTt0PXI9ITF9fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMSk7ZC5jaXJjbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oayl7cmV0dXJuIGcuc3ltYm9sKCkudHlwZShnLnN5bWJvbENpcmNsZSkuc2l6ZShNYXRoLlBJKk1hdGgucG93KGsvMiwyKSl9fTtkLnNxdWFyZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gZy5zeW1ib2woKS50eXBlKGcuc3ltYm9sU3F1YXJlKS5zaXplKE1hdGgucG93KGssMikpfX07ZC5jcm9zcz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gZy5zeW1ib2woKS50eXBlKGcuc3ltYm9sQ3Jvc3MpLnNpemUoNS85Kk1hdGgucG93KGssMikpfX07ZC5kaWFtb25kPQpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gZy5zeW1ib2woKS50eXBlKGcuc3ltYm9sRGlhbW9uZCkuc2l6ZShNYXRoLnRhbihNYXRoLlBJLzYpKk1hdGgucG93KGssMikvMil9fTtkLnRyaWFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBnLnN5bWJvbCgpLnR5cGUoZy5zeW1ib2xUcmlhbmdsZSkuc2l6ZShNYXRoLnNxcnQoMykqTWF0aC5wb3coay8yLDIpKX19O2Quc3Rhcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gZy5zeW1ib2woKS50eXBlKGcuc3ltYm9sU3Rhcikuc2l6ZSguODkwODEzMDkxNTI5Mjg1MipNYXRoLnBvdyhrLzIsMikpfX07dmFyIGw9MyooMS9NYXRoLnNxcnQoMTIpLzIrMSk7ZC53eWU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oayl7cmV0dXJuIGcuc3ltYm9sKCkudHlwZShnLnN5bWJvbFd5ZSkuc2l6ZShsKk1hdGgucG93KGsvMi40LDIpKX19fSxmdW5jdGlvbihjLGQsZil7dmFyIGc9CnRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHIpe2Z1bmN0aW9uIHQoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciB2IGluIHIpci5oYXNPd25Qcm9wZXJ0eSh2KSYmKHFbdl09clt2XSk7cS5wcm90b3R5cGU9bnVsbD09PXI/T2JqZWN0LmNyZWF0ZShyKToodC5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IHQpfSxsPWYoMjUpLGs9ZigwKSxtPWYoMTIpLHA9ZigzNyk7Yz1mdW5jdGlvbihxKXtmdW5jdGlvbiByKCl7dmFyIHQ9cS5jYWxsKHRoaXMpfHx0aGlzO3QuX2RldGVjdGlvblJhZGl1cz0zO3QuX3Jlc2l6YWJsZT0hMTt0Ll9tb3ZhYmxlPSExO3QuX2hhc0Nvcm5lcnM9ITA7dC5hZGRDbGFzcygiZHJhZy1ib3gtbGF5ZXIiKTt0Ll9kcmFnSW50ZXJhY3Rpb249bmV3IGwuRHJhZzt0Ll9zZXRVcENhbGxiYWNrcygpO3QuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh0KTt0Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7dC5fZHJhZ0NhbGxiYWNrcz0KbmV3IGsuQ2FsbGJhY2tTZXQ7dC5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtyZXR1cm4gdH1nKHIscSk7ci5wcm90b3R5cGUuX3NldFVwQ2FsbGJhY2tzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChHLEspezA9PT1CJiZHLng9PT1LLngmJkcueT09PUsueSYmeS5ib3hWaXNpYmxlKCExKTt5Ll9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24gdihHLEspe3N3aXRjaChCKXtjYXNlIDA6Ri54PUsueDtGLnk9Sy55O2JyZWFrO2Nhc2UgMTp4LmJvdHRvbT9GLnk9Sy55OngudG9wJiYoQy55PUsueSk7eC5yaWdodD9GLng9Sy54OngubGVmdCYmKEMueD1LLngpO2JyZWFrO2Nhc2UgMjpHPUsueC1ELng7dmFyIEw9Sy55LUQueTtDLngrPUc7Qy55Kz1MO0YueCs9RztGLnkrPUw7RD1LfXkuX3NldEJvdW5kcyh7dG9wTGVmdDpDLGJvdHRvbVJpZ2h0OkZ9KTt5Ll94Qm91bmRzTW9kZT09PXAuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT0KeS54U2NhbGUoKSYmeS5fc2V0WEV4dGVudChbeS54U2NhbGUoKS5pbnZlcnQoQy54KSx5LnhTY2FsZSgpLmludmVydChGLngpXSk7eS5feUJvdW5kc01vZGU9PT1wLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS55U2NhbGUoKSYmeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoQy55KSx5LnlTY2FsZSgpLmludmVydChGLnkpXSk7eS5yZW5kZXIoKTt5Ll9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24gQShHKXt4PXkuX2dldFJlc2l6aW5nRWRnZXMoRyk7dmFyIEs9eS5ib3VuZHMoKTtLPUsudG9wTGVmdC54PD1HLngmJkcueDw9Sy5ib3R0b21SaWdodC54JiZLLnRvcExlZnQueTw9Ry55JiZHLnk8PUsuYm90dG9tUmlnaHQueTt5LmJveFZpc2libGUoKSYmKHgudG9wfHx4LmJvdHRvbXx8eC5sZWZ0fHx4LnJpZ2h0KT9CPTE6eS5ib3hWaXNpYmxlKCkmJnkubW92YWJsZSgpJiZLP0I9MjooQj0wLHkuX3NldEJvdW5kcyh7dG9wTGVmdDpHLApib3R0b21SaWdodDpHfSkseS5feEJvdW5kc01vZGU9PT1wLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS54U2NhbGUoKSYmeS5fc2V0WEV4dGVudChbeS54U2NhbGUoKS5pbnZlcnQoRy54KSx5LnhTY2FsZSgpLmludmVydChHLngpXSkseS5feUJvdW5kc01vZGU9PT1wLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS55U2NhbGUoKSYmeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoRy55KSx5LnlTY2FsZSgpLmludmVydChHLnkpXSkseS5yZW5kZXIoKSk7eS5ib3hWaXNpYmxlKCEwKTtLPXkuYm91bmRzKCk7Qz17eDpLLnRvcExlZnQueCx5OksudG9wTGVmdC55fTtGPXt4OksuYm90dG9tUmlnaHQueCx5OksuYm90dG9tUmlnaHQueX07RD1HO3kuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKEspfXZhciB5PXRoaXMseCxDLEYsRCxCPTA7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KEEpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcodik7CnRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdFbmQodCk7dGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uPWZ1bmN0aW9uKCl7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWdTdGFydChBKTt5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZyh2KTt5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ0VuZCh0KTt5Ll9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9fTtyLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHYuX2JveC5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCxzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSl9dmFyIHY9dGhpcztxLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlVD10KCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZUI9dCgpLmNsYXNzZWQoImRyYWctZWRnZS10YiIsITApO3RoaXMuX2RldGVjdGlvbkVkZ2VMPQp0KCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZVI9dCgpLmNsYXNzZWQoImRyYWctZWRnZS1sciIsITApO2lmKHRoaXMuX2hhc0Nvcm5lcnMpe3ZhciBBPWZ1bmN0aW9uKCl7cmV0dXJuIHYuX2JveC5hcHBlbmQoImNpcmNsZSIpLnN0eWxlcyh7b3BhY2l0eTowLGZpbGw6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVGaWxsIn0pfTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdGwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYmwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYnIiLCEwKX19O3IucHJvdG90eXBlLl9nZXRSZXNpemluZ0VkZ2VzPWZ1bmN0aW9uKHQpe3ZhciB2PXt0b3A6ITEsCmJvdHRvbTohMSxsZWZ0OiExLHJpZ2h0OiExfTtpZighdGhpcy5yZXNpemFibGUoKSlyZXR1cm4gdjt2YXIgQT10aGlzLmJvdW5kcygpLHk9QS50b3BMZWZ0LnkseD1BLmJvdHRvbVJpZ2h0LnksQz1BLnRvcExlZnQueDtBPUEuYm90dG9tUmlnaHQueDt2YXIgRj10aGlzLl9kZXRlY3Rpb25SYWRpdXM7Qy1GPD10LngmJnQueDw9QStGJiYodi50b3A9eS1GPD10LnkmJnQueTw9eStGLHYuYm90dG9tPXgtRjw9dC55JiZ0Lnk8PXgrRik7eS1GPD10LnkmJnQueTw9eCtGJiYodi5sZWZ0PUMtRjw9dC54JiZ0Lng8PUMrRix2LnJpZ2h0PUEtRjw9dC54JiZ0Lng8PUErRik7cmV0dXJuIHZ9O3IucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLmJveFZpc2libGUoKSl7dmFyIHQ9dGhpcy5ib3VuZHMoKSx2PXQudG9wTGVmdC55LEE9dC5ib3R0b21SaWdodC55LHk9dC50b3BMZWZ0Lng7dD0KdC5ib3R0b21SaWdodC54O3RoaXMuX2RldGVjdGlvbkVkZ2VULmF0dHJzKHt4MTp5LHkxOnYseDI6dCx5Mjp2LCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5fZGV0ZWN0aW9uRWRnZUIuYXR0cnMoe3gxOnkseTE6QSx4Mjp0LHkyOkEsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlTC5hdHRycyh7eDE6eSx5MTp2LHgyOnkseTI6QSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VSLmF0dHJzKHt4MTp0LHkxOnYseDI6dCx5MjpBLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5faGFzQ29ybmVycyYmKHRoaXMuX2RldGVjdGlvbkNvcm5lclRMLmF0dHJzKHtjeDp5LGN5OnYscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUi5hdHRycyh7Y3g6dCxjeTp2LHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksCnRoaXMuX2RldGVjdGlvbkNvcm5lckJMLmF0dHJzKHtjeDp5LGN5OkEscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUi5hdHRycyh7Y3g6dCxjeTpBLHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSkpfXJldHVybiB0aGlzfTtyLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfTtyLnByb3RvdHlwZS5yZXNpemFibGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcmVzaXphYmxlO3RoaXMuX3Jlc2l6YWJsZT10O3RoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzPWZ1bmN0aW9uKHQpe3QmJnRoaXMuZW5hYmxlZCgpPyh0aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpLHRoaXMuYWRkQ2xhc3MoInktcmVzaXphYmxlIikpOih0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpLAp0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpKX07ci5wcm90b3R5cGUubW92YWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb3ZhYmxlfTtyLnByb3RvdHlwZS5fc2V0TW92YWJsZUNsYXNzPWZ1bmN0aW9uKCl7dGhpcy5tb3ZhYmxlKCkmJnRoaXMuZW5hYmxlZCgpP3RoaXMuYWRkQ2xhc3MoIm1vdmFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJtb3ZhYmxlIil9O3IucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQodCl9O3IucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbih0KXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHQpfTtyLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24odCl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQodCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24odCl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodCl9O3IucHJvdG90eXBlLm9uRHJhZ0VuZD0KZnVuY3Rpb24odCl7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5hZGQodCl9O3IucHJvdG90eXBlLm9mZkRyYWdFbmQ9ZnVuY3Rpb24odCl7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodCl9O3IucHJvdG90eXBlLmRyYWdJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259O3IucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCh0KTt0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKHRoaXMucmVzaXphYmxlKCkpO3RoaXMuX3NldE1vdmFibGVDbGFzcygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztxLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24odil7cmV0dXJuIHQuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHYpfSk7CnRoaXMuX2RyYWdDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih2KXtyZXR1cm4gdC5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodil9KTt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24odil7cmV0dXJuIHQuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHYpfSk7dGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9O3IucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX3Jlc2V0U3RhdGUoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCk7cS5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbih0KXt0PW0uY29lcmNlRXh0ZXJuYWxEMyh0KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7cS5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyx0KTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuX3Jlc2V0U3RhdGU9ZnVuY3Rpb24oKXt0aGlzLmJvdW5kcyh7dG9wTGVmdDp7eDowLAp5OjB9LGJvdHRvbVJpZ2h0Ont4OjAseTowfX0pfTtyZXR1cm4gcn0oZig0MykuU2VsZWN0aW9uQm94TGF5ZXIpO2QuRHJhZ0JveExheWVyPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihtW3JdPXBbcl0pO20ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDE4KTtjPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAoKXtyZXR1cm4gbS5jYWxsKHRoaXMsInBhdGgiLCJsaW5lIil8fHRoaXN9ZyhwLG0pO3AucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHEpe3Euc3R5bGUoImZpbGwiLCJub25lIil9O3AucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gbS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsCjApfTtyZXR1cm4gcH0oZig5KS5TVkdEcmF3ZXIpO2QuTGluZVNWR0RyYXdlcj1jO3ZhciBrPVsib3BhY2l0eSIsInN0cm9rZS1vcGFjaXR5Iiwic3Ryb2tlLXdpZHRoIiwic3Ryb2tlIl07ZC5tYWtlTGluZUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKG0pe3JldHVybiBmdW5jdGlvbihwLHEscil7cj1sLnJlc29sdmVBdHRyaWJ1dGVzKHIsayxxWzBdLDApO2wucmVuZGVyTGluZShwLG0oKSxxWzBdLHIpfX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihtW3JdPXBbcl0pO20ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDE4KTtjPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAocSl7dm9pZCAwPT09cSYmKHE9IiIpO3ZhciByPQptLmNhbGwodGhpcywicmVjdCIsIiIpfHx0aGlzO3IuX3Jvb3RDbGFzc05hbWU9cTtyLl9yb290LmNsYXNzZWQoci5fcm9vdENsYXNzTmFtZSwhMCk7cmV0dXJuIHJ9ZyhwLG0pO3JldHVybiBwfShmKDkpLlNWR0RyYXdlcik7ZC5SZWN0YW5nbGVTVkdEcmF3ZXI9Yzt2YXIgaz1bIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiXTtkLlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKG0scCxxKXttLnNhdmUoKTtwLmZvckVhY2goZnVuY3Rpb24ocix0KXtudWxsIT1yJiYocj1sLnJlc29sdmVBdHRyaWJ1dGVzU3Vic2V0V2l0aFN0eWxlcyhxLGsscix0KSxtLmJlZ2luUGF0aCgpLG0ucmVjdChyLngsci55LHIud2lkdGgsci5oZWlnaHQpLGwucmVuZGVyUGF0aFdpdGhTdHlsZShtLHIpKX0pO20ucmVzdG9yZSgpfTtjPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAocSl7cmV0dXJuIG0uY2FsbCh0aGlzLHEsZC5SZWN0YW5nbGVDYW52YXNEcmF3U3RlcCl8fHRoaXN9ZyhwLG0pO3JldHVybiBwfShsLkNhbnZhc0RyYXdlcik7CmQuUmVjdGFuZ2xlQ2FudmFzRHJhd2VyPWN9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKG0pe2suU0hPV19XQVJOSU5HUyYmY29uc29sZS53YXJuKG0pfWZ1bmN0aW9uIGwobSxwKXtmb3IodmFyIHE9W10scj0yO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspcVtyLTJdPWFyZ3VtZW50c1tyXTtyZXR1cm4gMD09PXA/KG0ocSksLTEpOndpbmRvdy5zZXRUaW1lb3V0KG0scCxxKX12YXIgaz1mKDIzKTtkLndhcm49ZztkLnNldFRpbWVvdXQ9bDtkLmRlYm91bmNlPWZ1bmN0aW9uKG0scCxxKXtmdW5jdGlvbiByKCl7cC5hcHBseShxLHYpfXZhciB0PW51bGwsdj1bXTtyZXR1cm4gZnVuY3Rpb24oKXt2PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7Y2xlYXJUaW1lb3V0KHQpO3Q9bChyLG0pfX07ZC5kZXByZWNhdGVkPWZ1bmN0aW9uKG0scCxxKXt2b2lkIDA9PT1xJiYocT0iIik7ZygiTWV0aG9kICIrbSsiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAiKwpwKyIuIFBsZWFzZSByZWZlciB0byB0aGUgcmVsZWFzZSBub3Rlcy4gIitxKX19LGZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyl7dGhpcy5ydWxlcj1udWxsIT1nLmNyZWF0ZVJ1bGVyP2cuY3JlYXRlUnVsZXIoKTpnfWYucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24oZyl7dm9pZCAwPT09ZyYmKGc9Zi5IRUlHSFRfVEVYVCk7cmV0dXJuIHRoaXMucnVsZXIoZyl9O3JldHVybiBmfSgpO2MuSEVJR0hUX1RFWFQ9ImJkcHFsIjtkLkFic3RyYWN0TWVhc3VyZXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDMyKSk7ZyhmKDc0KSk7ZyhmKDc1KSk7ZyhmKDQxKSk7ZyhmKDQyKSk7ZyhmKDc2KSk7ZyhmKDc3KSk7ZyhmKDc4KSk7ZyhmKDc5KSk7ZyhmKDQzKSk7ZyhmKDgwKSk7ZyhmKDgxKSk7ZyhmKDgyKSl9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDApO2M9CmZ1bmN0aW9uKCl7ZnVuY3Rpb24gbChrLG0pe3ZvaWQgMD09PWsmJihrPVtdKTt2b2lkIDA9PT1tJiYobT17fSk7dGhpcy5fdXBkYXRlSWQ9MDt0aGlzLl9kYXRhPWs7dGhpcy5fbWV0YWRhdGE9bTt0aGlzLl9jYWxsYmFja3M9bmV3IGcuQ2FsbGJhY2tTZXR9bC5wcm90b3R5cGUub25VcGRhdGU9ZnVuY3Rpb24oayl7dGhpcy5fY2FsbGJhY2tzLmFkZChrKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUub2ZmVXBkYXRlPWZ1bmN0aW9uKGspe3RoaXMuX2NhbGxiYWNrcy5kZWxldGUoayk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLmRhdGE9ZnVuY3Rpb24oayl7aWYobnVsbD09aylyZXR1cm4gdGhpcy5fZGF0YTt0aGlzLl9kYXRhPWs7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUubWV0YWRhdGE9ZnVuY3Rpb24oayl7aWYobnVsbD09aylyZXR1cm4gdGhpcy5fbWV0YWRhdGE7dGhpcy5fbWV0YWRhdGE9azt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpOwpyZXR1cm4gdGhpc307bC5wcm90b3R5cGUudXBkYXRlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlSWR9O2wucHJvdG90eXBlLl9kaXNwYXRjaFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUlkKys7dGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyl9O3JldHVybiBsfSgpO2QuRGF0YXNldD1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigwKSxsPWYoMzApO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7fWsucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe2wuZmx1c2goKX07cmV0dXJuIGt9KCk7ZC5JbW1lZGlhdGU9YztjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe31rLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtnLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbChsLmZsdXNoKX07cmV0dXJuIGt9KCk7ZC5BbmltYXRpb25GcmFtZT1jO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7dGhpcy5fdGltZW91dE1zZWM9Zy5ET00uU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFN9CmsucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3NldFRpbWVvdXQobC5mbHVzaCx0aGlzLl90aW1lb3V0TXNlYyl9O3JldHVybiBrfSgpO2QuVGltZW91dD1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobVtyXT1wW3JdKTttLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigxMyksaz1mKDApO2M9ZnVuY3Rpb24obSl7ZnVuY3Rpb24gcCgpe3ZhciBxPW51bGwhPT1tJiZtLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztxLl9rZXlQcmVzc0NhbGxiYWNrcz17fTtxLl9rZXlSZWxlYXNlQ2FsbGJhY2tzPXt9O3EuX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuITF9O3EuX2Rvd25lZEtleXM9bmV3IGsuU2V0OwpxLl9rZXlEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5faGFuZGxlS2V5RG93bkV2ZW50KHIsdCl9O3EuX2tleVVwQ2FsbGJhY2s9ZnVuY3Rpb24ocil7cmV0dXJuIHEuX2hhbmRsZUtleVVwRXZlbnQocil9O3JldHVybiBxfWcocCxtKTtwLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHEpe20ucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLHEpO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlcj1sLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyPWwuS2V5LmdldERpc3BhdGNoZXIoKTt0aGlzLl9rZXlEaXNwYXRjaGVyLm9uS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub25LZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKX07cC5wcm90b3R5cGUuX3VuYW5jaG9yPQpmdW5jdGlvbigpe20ucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlcj1udWxsO3RoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5VXAodGhpcy5fa2V5VXBDYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlcj1udWxsfTtwLnByb3RvdHlwZS5faGFuZGxlS2V5RG93bkV2ZW50PWZ1bmN0aW9uKHEscil7dmFyIHQ9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIubGFzdE1vdXNlUG9zaXRpb24oKSk7dGhpcy5faXNJbnNpZGVDb21wb25lbnQodCkmJiFyLnJlcGVhdCYmKHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdJiZ0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1txXS5jYWxsQ2FsbGJhY2tzKHEpLAp0aGlzLl9kb3duZWRLZXlzLmFkZChxKSl9O3AucHJvdG90eXBlLl9oYW5kbGVLZXlVcEV2ZW50PWZ1bmN0aW9uKHEpe3RoaXMuX2Rvd25lZEtleXMuaGFzKHEpJiZ0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdJiZ0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdLmNhbGxDYWxsYmFja3MocSk7dGhpcy5fZG93bmVkS2V5cy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uS2V5UHJlc3M9ZnVuY3Rpb24ocSxyKXt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1txXXx8KHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdPW5ldyBrLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1txXS5hZGQocik7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZktleVByZXNzPWZ1bmN0aW9uKHEscil7dGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbcV0uZGVsZXRlKHIpOzA9PT10aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1txXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbcV07CnJldHVybiB0aGlzfTtwLnByb3RvdHlwZS5vbktleVJlbGVhc2U9ZnVuY3Rpb24ocSxyKXt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdfHwodGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1txXT1uZXcgay5DYWxsYmFja1NldCk7dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1txXS5hZGQocik7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZktleVJlbGVhc2U9ZnVuY3Rpb24ocSxyKXt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdLmRlbGV0ZShyKTswPT09dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1txXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1txXTtyZXR1cm4gdGhpc307cmV0dXJuIHB9KGYoMTUpLkludGVyYWN0aW9uKTtkLktleT1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGssbSl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9a31mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYKKGtbcV09bVtxXSk7ay5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToocC5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IHApfSxsPWYoMCk7Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBtKHApe3ZvaWQgMD09PXAmJihwPVtdKTt2YXIgcT1rLmNhbGwodGhpcyl8fHRoaXM7cS5fY29tcG9uZW50cz1bXTtxLmFkZENsYXNzKCJjb21wb25lbnQtZ3JvdXAiKTtwLmZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIHEuYXBwZW5kKHIpfSk7cmV0dXJuIHF9ZyhtLGspO20ucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKHApe3RoaXMuY29tcG9uZW50cygpLmZvckVhY2gocCl9O20ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihwKXtyZXR1cm4gMDw9dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKHApfTttLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbihwLHEpe3ZhciByPXRoaXMuX2NvbXBvbmVudHMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcXVlc3RlZFNwYWNlKHAsCnEpfSk7cmV0dXJue21pbldpZHRoOmwuTWF0aC5tYXgocixmdW5jdGlvbih0KXtyZXR1cm4gdC5taW5XaWR0aH0sMCksbWluSGVpZ2h0OmwuTWF0aC5tYXgocixmdW5jdGlvbih0KXtyZXR1cm4gdC5taW5IZWlnaHR9LDApfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihwLHEscil7dmFyIHQ9dGhpcztrLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxwLHEscik7dGhpcy5fZm9yRWFjaChmdW5jdGlvbih2KXt2LmNvbXB1dGVMYXlvdXQoe3g6MCx5OjB9LHQud2lkdGgoKSx0LmhlaWdodCgpKX0pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihwLHEpe3JldHVybnt3aWR0aDpwLGhlaWdodDpxfX07bS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKHApe3JldHVybiBwLmZpeGVkV2lkdGgoKX0pfTttLnByb3RvdHlwZS5maXhlZEhlaWdodD0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50cy5ldmVyeShmdW5jdGlvbihwKXtyZXR1cm4gcC5maXhlZEhlaWdodCgpfSl9O20ucHJvdG90eXBlLmNvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50cy5zbGljZSgpfTttLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24ocCl7bnVsbD09cHx8dGhpcy5oYXMocCl8fChwLmRldGFjaCgpLHRoaXMuX2NvbXBvbmVudHMucHVzaChwKSx0aGlzLl9hZG9wdEFuZEFuY2hvcihwKSx0aGlzLnJlZHJhdygpKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihwKXtwPXRoaXMuX2NvbXBvbmVudHMuaW5kZXhPZihwKTswPD1wJiZ0aGlzLl9jb21wb25lbnRzLnNwbGljZShwLDEpfTtyZXR1cm4gbX0oZigyOSkuQ29tcG9uZW50Q29udGFpbmVyKTtkLkdyb3VwPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxtKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj0Ka31mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYoa1txXT1tW3FdKTtrLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihwLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgcCl9O2YoMCk7Yz1mKDQpO3ZhciBsOyhmdW5jdGlvbihrKXtrW2suVkFMVUU9MF09IlZBTFVFIjtrW2suUElYRUw9MV09IlBJWEVMIn0pKGx8fChsPXt9KSk7Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBtKHApe3ZhciBxPWsuY2FsbCh0aGlzKXx8dGhpcztxLl9tb2RlPWwuVkFMVUU7aWYocCE9PW0uT1JJRU5UQVRJT05fVkVSVElDQUwmJnAhPT1tLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpdGhyb3cgRXJyb3IocCsiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBHdWlkZUxpbmVMYXllciIpO3EuX29yaWVudGF0aW9uPXA7cS5fb3ZlcmZsb3dIaWRkZW49ITA7cS5hZGRDbGFzcygiZ3VpZGUtbGluZS1sYXllciIpO3EuX2lzVmVydGljYWwoKT9xLmFkZENsYXNzKCJ2ZXJ0aWNhbCIpOgpxLmFkZENsYXNzKCJob3Jpem9udGFsIik7cS5fc2NhbGVVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3EuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTtxLnJlbmRlcigpfTtyZXR1cm4gcX1nKG0sayk7bS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fZ3VpZGVMaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImd1aWRlLWxpbmUiLCEwKX07bS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24ocCxxKXtyZXR1cm57d2lkdGg6cCxoZWlnaHQ6cX19O20ucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uPT09bS5PUklFTlRBVElPTl9WRVJUSUNBTH07bS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTttLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTttLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihwLHEscil7ay5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMscCxxLHIpO251bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX2lzVmVydGljYWwoKT90aGlzLnNjYWxlKCkucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk6dGhpcy5zY2FsZSgpLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5fZ3VpZGVMaW5lLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOgp0aGlzLnBpeGVsUG9zaXRpb24oKX0pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZT1mdW5jdGlvbigpe251bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX21vZGU9PT1sLlZBTFVFJiZudWxsIT10aGlzLnZhbHVlKCk/dGhpcy5fcGl4ZWxQb3NpdGlvbj10aGlzLnNjYWxlKCkuc2NhbGUodGhpcy52YWx1ZSgpKTp0aGlzLl9tb2RlPT09bC5QSVhFTCYmbnVsbCE9dGhpcy5waXhlbFBvc2l0aW9uKCkmJih0aGlzLl92YWx1ZT10aGlzLnNjYWxlKCkuaW52ZXJ0KHRoaXMucGl4ZWxQb3NpdGlvbigpKSkpfTttLnByb3RvdHlwZS5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGU9ZnVuY3Rpb24ocCl7dGhpcy5fcGl4ZWxQb3NpdGlvbj1wO251bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKTt0aGlzLnJlbmRlcigpfTttLnByb3RvdHlwZS5zY2FsZT0KZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fc2NhbGU7dmFyIHE9dGhpcy5fc2NhbGU7bnVsbCE9cSYmcS5vZmZVcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayk7dGhpcy5fc2NhbGU9cDt0aGlzLl9zY2FsZS5vblVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fdmFsdWU7dGhpcy5fdmFsdWU9cDt0aGlzLl9tb2RlPWwuVkFMVUU7dGhpcy5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnBpeGVsUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGl4ZWxQb3NpdGlvbn07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2sucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTsKbnVsbCE9dGhpcy5zY2FsZSgpJiZ0aGlzLnNjYWxlKCkub2ZmVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spfTtyZXR1cm4gbX0oYy5Db21wb25lbnQpO2MuT1JJRU5UQVRJT05fVkVSVElDQUw9InZlcnRpY2FsIjtjLk9SSUVOVEFUSU9OX0hPUklaT05UQUw9Imhvcml6b250YWwiO2QuR3VpZGVMaW5lTGF5ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihtLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW19Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG1bcl09cFtyXSk7bS5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMCk7Yz1mKDQpO3ZhciBrOyhmdW5jdGlvbihtKXttW20uVkFMVUU9MF09IlZBTFVFIjttW20uUElYRUw9MV09IlBJWEVMIn0pKGs9ZC5Qcm9wZXJ0eU1vZGV8fChkLlByb3BlcnR5TW9kZT0Ke30pKTtjPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAoKXt2YXIgcT1tLmNhbGwodGhpcyl8fHRoaXM7cS5fYm94VmlzaWJsZT0hMTtxLl9ib3hCb3VuZHM9e3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OjAseTowfX07cS5feEJvdW5kc01vZGU9ay5QSVhFTDtxLl95Qm91bmRzTW9kZT1rLlBJWEVMO3EuYWRkQ2xhc3MoInNlbGVjdGlvbi1ib3gtbGF5ZXIiKTtxLl9hZGp1c3RCb3VuZHNDYWxsYmFjaz1mdW5jdGlvbigpe3EucmVuZGVyKCl9O3EuX292ZXJmbG93SGlkZGVuPSEwO3EuX3hFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO3EuX3lFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO3JldHVybiBxfWcocCxtKTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXttLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9ib3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic2VsZWN0aW9uLWJveCIsITApLnJlbW92ZSgpO3RoaXMuX2JveEFyZWE9dGhpcy5fYm94LmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInNlbGVjdGlvbi1hcmVhIiwKITApfTtwLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihxLHIpe3JldHVybnt3aWR0aDpxLGhlaWdodDpyfX07cC5wcm90b3R5cGUuYm91bmRzPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2dldEJvdW5kcygpO3RoaXMuX3NldEJvdW5kcyhxKTt0aGlzLl95Qm91bmRzTW9kZT10aGlzLl94Qm91bmRzTW9kZT1rLlBJWEVMO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24ocSl7dGhpcy5fYm94Qm91bmRzPXt0b3BMZWZ0Ont4Ok1hdGgubWluKHEudG9wTGVmdC54LHEuYm90dG9tUmlnaHQueCkseTpNYXRoLm1pbihxLnRvcExlZnQueSxxLmJvdHRvbVJpZ2h0LnkpfSxib3R0b21SaWdodDp7eDpNYXRoLm1heChxLnRvcExlZnQueCxxLmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5tYXgocS50b3BMZWZ0LnkscS5ib3R0b21SaWdodC55KX19fTtwLnByb3RvdHlwZS5fZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT0Kay5QSVhFTD90aGlzLl9ib3hCb3VuZHMudG9wTGVmdC54Om51bGw9PXRoaXMuX3hTY2FsZT8wOk1hdGgubWluKHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMF0pLHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09ay5QSVhFTD90aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55Om51bGw9PXRoaXMuX3lTY2FsZT8wOk1hdGgubWluKHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMF0pLHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMV0pKX0sYm90dG9tUmlnaHQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT1rLlBJWEVMP3RoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54Om51bGw9PXRoaXMuX3hTY2FsZT8wOk1hdGgubWF4KHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMF0pLHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09CmsuUElYRUw/dGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0Lnk6bnVsbD09dGhpcy5feVNjYWxlPzA6TWF0aC5tYXgodGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfX19O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLl9ib3hWaXNpYmxlKXt2YXIgcT10aGlzLmJvdW5kcygpLHI9cS50b3BMZWZ0LnksdD1xLmJvdHRvbVJpZ2h0Lnksdj1xLnRvcExlZnQueDtxPXEuYm90dG9tUmlnaHQueDtpZighKGwuTWF0aC5pc1ZhbGlkTnVtYmVyKHIpJiZsLk1hdGguaXNWYWxpZE51bWJlcih0KSYmbC5NYXRoLmlzVmFsaWROdW1iZXIodikmJmwuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpKSl0aHJvdyBFcnJvcigiYm91bmRzIGhhdmUgbm90IGJlZW4gcHJvcGVybHkgc2V0Iik7dGhpcy5fYm94QXJlYS5hdHRycyh7eDp2LAp5OnIsd2lkdGg6cS12LGhlaWdodDp0LXJ9KTt0aGlzLmNvbnRlbnQoKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fYm94Lm5vZGUoKSl9ZWxzZSB0aGlzLl9ib3gucmVtb3ZlKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmJveFZpc2libGU9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fYm94VmlzaWJsZTt0aGlzLl9ib3hWaXNpYmxlPXE7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS54U2NhbGU9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5feFNjYWxlO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5feFNjYWxlPXE7dGhpcy5feEJvdW5kc01vZGU9ay5WQUxVRTt0aGlzLl94U2NhbGUub25VcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spOwp0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5feVNjYWxlO251bGwhPXRoaXMuX3lTY2FsZSYmdGhpcy5feVNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5feVNjYWxlPXE7dGhpcy5feUJvdW5kc01vZGU9ay5WQUxVRTt0aGlzLl95U2NhbGUub25VcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnhFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0WEV4dGVudCgpfTtwLnByb3RvdHlwZS5fZ2V0WEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl94Qm91bmRzTW9kZT09PWsuVkFMVUU/dGhpcy5feEV4dGVudDpudWxsPT10aGlzLl94U2NhbGU/W3ZvaWQgMCx2b2lkIDBdOlt0aGlzLl94U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy50b3BMZWZ0LngpLAp0aGlzLl94U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54KV19O3AucHJvdG90eXBlLl9zZXRYRXh0ZW50PWZ1bmN0aW9uKHEpe3RoaXMuX3hFeHRlbnQ9cX07cC5wcm90b3R5cGUueUV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRZRXh0ZW50KCl9O3AucHJvdG90eXBlLl9nZXRZRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3lCb3VuZHNNb2RlPT09ay5WQUxVRT90aGlzLl95RXh0ZW50Om51bGw9PXRoaXMuX3lTY2FsZT9bdm9pZCAwLHZvaWQgMF06W3RoaXMuX3lTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLnRvcExlZnQueSksdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueSldfTtwLnByb3RvdHlwZS5fc2V0WUV4dGVudD1mdW5jdGlvbihxKXt0aGlzLl95RXh0ZW50PXF9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXttLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7bnVsbCE9CnRoaXMuX3hTY2FsZSYmdGhpcy54U2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO251bGwhPXRoaXMuX3lTY2FsZSYmdGhpcy55U2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spfTtyZXR1cm4gcH0oYy5Db21wb25lbnQpO2QuU2VsZWN0aW9uQm94TGF5ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobS5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG0pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXtyZXR1cm4gbC5jYWxsKHRoaXMsInBhdGgiLCJhcmMgZmlsbCIpfHx0aGlzfWcoayxsKTtrLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz0KZnVuY3Rpb24obSl7bS5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTtyZXR1cm4ga30oZig5KS5TVkdEcmF3ZXIpO2QuQXJjU1ZHRHJhd2VyPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxrKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgcCBpbiBrKWsuaGFzT3duUHJvcGVydHkocCkmJihsW3BdPWtbcF0pO2wucHJvdG90eXBlPW51bGw9PT1rP09iamVjdC5jcmVhdGUoayk6KG0ucHJvdG90eXBlPWsucHJvdG90eXBlLG5ldyBtKX07Yz1mdW5jdGlvbihsKXtmdW5jdGlvbiBrKCl7cmV0dXJuIGwuY2FsbCh0aGlzLCJwYXRoIiwiYXJjIG91dGxpbmUiKXx8dGhpc31nKGssbCk7ay5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24obSl7bS5zdHlsZSgiZmlsbCIsIm5vbmUiKX07cmV0dXJuIGt9KGYoOSkuU1ZHRHJhd2VyKTtkLkFyY091dGxpbmVTVkdEcmF3ZXI9Y30sZnVuY3Rpb24oYywKZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihtW3JdPXBbcl0pO20ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDE4KTtjPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAoKXtyZXR1cm4gbS5jYWxsKHRoaXMsInBhdGgiLCJhcmVhIil8fHRoaXN9ZyhwLG0pO3AucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHEpe3Euc3R5bGUoInN0cm9rZSIsIm5vbmUiKX07cC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbigpe3JldHVybiBtLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4LmNhbGwodGhpcywwKX07cmV0dXJuIHB9KGYoOSkuU1ZHRHJhd2VyKTtkLkFyZWFTVkdEcmF3ZXI9CmM7dmFyIGs9WyJmaWxsIiwib3BhY2l0eSIsImZpbGwtb3BhY2l0eSJdO2QubWFrZUFyZWFDYW52YXNEcmF3U3RlcD1mdW5jdGlvbihtKXtyZXR1cm4gZnVuY3Rpb24ocCxxLHIpe3I9bC5yZXNvbHZlQXR0cmlidXRlcyhyLGsscVswXSwwKTtsLnJlbmRlckFyZWEocCxtKCkscVswXSxyKX19fSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihtLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbSl9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3JldHVybiBsLmNhbGwodGhpcywibGluZSIsIiIpfHx0aGlzfWcoayxsKTtyZXR1cm4ga30oZig5KS5TVkdEcmF3ZXIpO2QuU2VnbWVudFNWR0RyYXdlcj1jfSxmdW5jdGlvbihjLApkLGYpe2Z1bmN0aW9uIGcocSxyLHQsdixBKXtyZXR1cm4gMDw9dCtBJiZ0LUE8PXEmJjA8PXYrQSYmdi1BPD1yfWZ1bmN0aW9uIGwocSxyLHQpe2lmKG51bGw9PXEpcmV0dXJuITE7Zm9yKHZhciB2PTA7djx0Lmxlbmd0aDt2Kyspe3ZhciBBPXRbdl07aWYocVtBXSE9cltBXSlyZXR1cm4hMX1yZXR1cm4hMH12YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbT1mKDg2KSxwPWYoMTgpO2M9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gcigpe3JldHVybiBxLmNhbGwodGhpcywicGF0aCIsInN5bWJvbCIpfHx0aGlzfWsocixxKTtyZXR1cm4gcn0oZig5KS5TVkdEcmF3ZXIpO2QuU3ltYm9sU1ZHRHJhd2VyPQpjO2QubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKHEscix0KXt2YXIgdj10aGlzO3JldHVybiBmdW5jdGlvbihBLHkseCl7dmFyIEM9QS5jYW52YXMsRj1DLmNsaWVudFdpZHRoO0M9Qy5jbGllbnRIZWlnaHQ7Zm9yKHZhciBEPW5ldyBtLkNhbnZhc0J1ZmZlcigwLDApLEI9cigpLEc9dCgpLEs9bnVsbCxMPW51bGwsSj1udWxsLFA9MDtQPHkubGVuZ3RoO1ArKyl7dmFyIFM9eVtQXTtpZihudWxsIT1TKXt2YXIgTj1wLnJlc29sdmVBdHRyaWJ1dGVzU3Vic2V0V2l0aFN0eWxlcyh4LFsieCIsInkiXSxTLFApLFQ9RyhTLFAscSk7aWYoZyhGLEMsTi54LE4ueSxUKSl7dmFyIFk9bChLLE4scC5Db250ZXh0U3R5bGVBdHRycyk7Uz1CKFMsUCx2Ll9kYXRhc2V0KTtZJiZKPT1UJiZMPT1TfHwoSz1wLmdldFN0cm9rZVdpZHRoKE4pLEs9VCtLKzEsKEs+RC5zY3JlZW5XaWR0aHx8Sz5ELnNjcmVlbkhlaWdodCkmJkQucmVzaXplKEssSywhMCksRC5jbGVhcigpLEs9RC5jdHgsSy5iZWdpblBhdGgoKSwKUyhUKS5jb250ZXh0KEspKG51bGwpLEsuY2xvc2VQYXRoKCkscC5yZW5kZXJQYXRoV2l0aFN0eWxlKEssTiksTD1TLEo9VCxLPU4pO0QuYmxpdENlbnRlcihBLE4ueCxOLnkpfX19fX19LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKEQpe3JldHVybiBEIGluc3RhbmNlb2YgeT9EOkQgaW5zdGFuY2VvZiBEYXRlP20oRC52YWx1ZU9mKCkpOkQgaW5zdGFuY2VvZiBBLlNjYWxlP2woRCk6RCBpbnN0YW5jZW9mIHYuRGF0YXNldD9rKEQpOnQoRCk/cShEKTpBcnJheS5pc0FycmF5KEQpP3AoRCk6bShEKX1mdW5jdGlvbiBsKEQpe0Q9e2RvbWFpbjpELmRvbWFpbigpLHJhbmdlOkQucmFuZ2UoKSx1cGRhdGVJZDpELnVwZGF0ZUlkKCkscmVmOm0oRCl9O3JldHVybiBxKEQpfWZ1bmN0aW9uIGsoRCl7RD17cmVmOm0oRCksdXBkYXRlSWQ6RC51cGRhdGVJZCgpfTtyZXR1cm4gcShEKX1mdW5jdGlvbiBtKEQpe3JldHVybiBuZXcgQyhEKX1mdW5jdGlvbiBwKEQpe3JldHVybiBuZXcgeChELm1hcChmdW5jdGlvbihCKXtyZXR1cm4gZyhCKX0pKX0KZnVuY3Rpb24gcShEKXt2YXIgQj17fSxHO2ZvcihHIGluIEQpRC5oYXNPd25Qcm9wZXJ0eShHKSYmKEJbR109ZyhEW0ddKSk7cmV0dXJuIG5ldyBGKEIpfXZhciByPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihELEIpe2Z1bmN0aW9uIEcoKXt0aGlzLmNvbnN0cnVjdG9yPUR9Zm9yKHZhciBLIGluIEIpQi5oYXNPd25Qcm9wZXJ0eShLKSYmKERbS109QltLXSk7RC5wcm90b3R5cGU9bnVsbD09PUI/T2JqZWN0LmNyZWF0ZShCKTooRy5wcm90b3R5cGU9Qi5wcm90b3R5cGUsbmV3IEcpfSx0PWYoMTI4KSx2PWYoMzgpLEE9ZigxNyk7ZC5zaWduPWc7ZC5zaWduU2NhbGU9bDtkLnNpZ25EYXRhc2V0PWs7ZC5zaWduUmVmPW07ZC5zaWduQXJyYXk9cDtkLnNpZ25PYmo9cTt2YXIgeT1mdW5jdGlvbigpe2Z1bmN0aW9uIEQoKXt9RC5wcm90b3R5cGUuaXNEaWZmZXJlbnQ9ZnVuY3Rpb24oQil7cmV0dXJuIEIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP3RoaXMuaXNTaWduYXR1cmVEaWZmZXJlbnQoQik6CiEwfTtyZXR1cm4gRH0oKTtkLlNpZ25hdHVyZT15O3ZhciB4PWZ1bmN0aW9uKEQpe2Z1bmN0aW9uIEIoRyl7dmFyIEs9RC5jYWxsKHRoaXMpfHx0aGlzO0suYXJyYXk9RztyZXR1cm4gS31yKEIsRCk7Qi5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24oRyl7aWYoRy5hcnJheS5sZW5ndGghPT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4hMDtmb3IodmFyIEs9MDtLPHRoaXMuYXJyYXkubGVuZ3RoO0srKylpZih0aGlzLmFycmF5W0tdLmlzRGlmZmVyZW50KEcuYXJyYXlbS10pKXJldHVybiEwO3JldHVybiExfTtyZXR1cm4gQn0oeSk7ZC5BcnJheVNpZ25hdHVyZT14O3ZhciBDPWZ1bmN0aW9uKEQpe2Z1bmN0aW9uIEIoRyl7dmFyIEs9RC5jYWxsKHRoaXMpfHx0aGlzO0sucmVmPUc7cmV0dXJuIEt9cihCLEQpO0IucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKEcpe3JldHVybiB0aGlzLnJlZiE9PUcucmVmfTtyZXR1cm4gQn0oeSk7ZC5SZWZlcmVuY2VTaWduYXR1cmU9CkM7dmFyIEY9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihHKXt2YXIgSz1ELmNhbGwodGhpcyl8fHRoaXM7Sy5vYmo9RztyZXR1cm4gS31yKEIsRCk7Qi5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24oRyl7dmFyIEs9T2JqZWN0LmtleXModGhpcy5vYmopLEw9T2JqZWN0LmtleXMoRy5vYmopO2lmKEsubGVuZ3RoIT09TC5sZW5ndGgpcmV0dXJuITA7Zm9yKEw9MDtMPEsubGVuZ3RoO0wrKyl7dmFyIEo9S1tMXTtpZighRy5vYmouaGFzT3duUHJvcGVydHkoSil8fHRoaXMub2JqW0pdLmlzRGlmZmVyZW50KEcub2JqW0pdKSlyZXR1cm4hMH1yZXR1cm4hMX07cmV0dXJuIEJ9KHkpO2QuT2JqZWN0U2lnbmF0dXJlPUZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oeSx4KXtmdW5jdGlvbiBDKCl7dGhpcy5jb25zdHJ1Y3Rvcj15fWZvcih2YXIgRiBpbiB4KXguaGFzT3duUHJvcGVydHkoRikmJih5W0ZdPXhbRl0pO3kucHJvdG90eXBlPQpudWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOihDLnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgQyl9LGw9ZigxKSxrPWYoMyksbT1mKDApLHA9ZigxNCkscT1mKDQ2KSxyPWYoNiksdD1mKDMzKSx2PWYoMTkpO2M9Zig1Myk7dmFyIEE9ZigyKTtmPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHgoKXt2YXIgQz15LmNhbGwodGhpcyl8fHRoaXM7Qy5hZGRDbGFzcygiYXJlYS1wbG90Iik7Qy55MCgwKTtDLmF0dHIoImZpbGwtb3BhY2l0eSIsLjI1KTtDLmF0dHIoImZpbGwiLChuZXcgay5Db2xvcikucmFuZ2UoKVswXSk7Qy5fbGluZURyYXdlcnM9bmV3IG0uTWFwO3JldHVybiBDfWcoeCx5KTt4LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsRil7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PUY/eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyxGKTtudWxsIT1GJiYoQz10aGlzLnkwKCkuYWNjZXNzb3IsbnVsbCE9CkMmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9ZMF9LRVksQyxGKSx0aGlzLl91cGRhdGVZU2NhbGUoKSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLnkwPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1kwX0tFWSk7dmFyIEY9dGhpcy55KCk7dGhpcy5fYmluZFByb3BlcnR5KHguX1kwX0tFWSxDLEYmJkYuc2NhbGUpO3RoaXMuX3VwZGF0ZVlTY2FsZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt5LnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7dGhpcy5fdXBkYXRlWVNjYWxlKCl9O3gucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEMpe3ZhciBGPXRoaXM7dGhpcy5fbGluZURyYXdlcnMuc2V0KEMsbmV3IHAuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuTGluZVNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBwLkNhbnZhc0RyYXdlcihELAp0Lm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXt2YXIgQj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEYueCgpKSxHPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi55KCkpO3JldHVybiBGLl9kM0xpbmVGYWN0b3J5KEMsQixHKX0pKX0pKTt5LnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsQyk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oQyl7eS5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsQyk7Qz10aGlzLl9saW5lRHJhd2Vycy5nZXQoQyk7InN2ZyI9PT10aGlzLnJlbmRlcmVyKCk/Qy51c2VTVkcodGhpcy5fcmVuZGVyQXJlYSk6Qy51c2VDYW52YXModGhpcy5fY2FudmFzKTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihDKXt5LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxDKTt0aGlzLl9saW5lRHJhd2Vycy5nZXQoQykucmVtb3ZlKCl9Owp4LnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKCl7dmFyIEM9dGhpcyxGPXRoaXMuX2dlbmVyYXRlTGluZURyYXdTdGVwcygpLEQ9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBHPUEuUGxvdC5hcHBseURyYXdTdGVwcyhGLEIpO0MuX2xpbmVEcmF3ZXJzLmdldChCKS5kcmF3KEQuZ2V0KEIpLEcpfSl9O3gucHJvdG90eXBlLl9nZW5lcmF0ZUxpbmVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBGPXRoaXMuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3RvcigpO0YuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkpO0MucHVzaCh7YXR0clRvUHJvamVjdG9yOkYsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3Iodi5BbmltYXRvci5SRVNFVCl9KX1DLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKSwKYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3Iodi5BbmltYXRvci5NQUlOKX0pO3JldHVybiBDfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7Qy5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBDfTt4LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEMpe3ZhciBGPXRoaXM7cmV0dXJuIG5ldyByLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxLkFyZWFTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEQpe3JldHVybiBuZXcgcC5DYW52YXNEcmF3ZXIoRCxxLm1ha2VBcmVhQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXt2YXIgQj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEYueCgpKSxHPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi55KCkpLApLPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi55MCgpKTtyZXR1cm4gRi5fY3JlYXRlQXJlYUdlbmVyYXRvcihCLEcsSyxGLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yKEIsRyksQyl9KSl9KX07eC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIEM9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgRj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtGLmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKSk7Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RixhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih2LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHYuQW5pbWF0b3IuTUFJTil9KTsKcmV0dXJuIEN9O3gucHJvdG90eXBlLl91cGRhdGVZU2NhbGU9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLmdldEV4dGVudHNGb3JQcm9wZXJ0eSgieTAiKTtDPW0uQXJyYXkudW5pcShtLkFycmF5LmZsYXR0ZW4oQykpO3ZhciBGPTE9PT1DLmxlbmd0aD9DWzBdOm51bGw7Qz0oQz10aGlzLnkoKSkmJkMuc2NhbGU7bnVsbCE9QyYmKG51bGwhPXRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyJiYoQy5yZW1vdmVQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSx0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcj1udWxsKSxudWxsIT1GJiYodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5bRl19LEMuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcikpKX07eC5wcm90b3R5cGUuX2dldFJlc2V0WUZ1bmN0aW9uPQpmdW5jdGlvbigpe3JldHVybiBBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSl9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7Qy5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpKTtyZXR1cm4gQ307eC5wcm90b3R5cGUuc2VsZWN0aW9ucz1mdW5jdGlvbihDKXt2YXIgRj10aGlzO3ZvaWQgMD09PUMmJihDPXRoaXMuZGF0YXNldHMoKSk7aWYoImNhbnZhcyI9PT10aGlzLnJlbmRlcmVyKCkpcmV0dXJuIGwuc2VsZWN0QWxsKCk7dmFyIEQ9eS5wcm90b3R5cGUuc2VsZWN0aW9ucy5jYWxsKHRoaXMsQykubm9kZXMoKTtDLm1hcChmdW5jdGlvbihCKXtyZXR1cm4gRi5fbGluZURyYXdlcnMuZ2V0KEIpfSkuZmlsdGVyKGZ1bmN0aW9uKEIpe3JldHVybiBudWxsIT0KQn0pLmZvckVhY2goZnVuY3Rpb24oQil7cmV0dXJuIEQucHVzaC5hcHBseShELEIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpKX0pO3JldHVybiBsLnNlbGVjdEFsbChEKX07eC5wcm90b3R5cGUuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3I9ZnVuY3Rpb24oQyxGLEQpe3ZhciBCPXRoaXMsRz10aGlzLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gZnVuY3Rpb24oSyxMLEope3JldHVybiBCLl9jcmVhdGVBcmVhR2VuZXJhdG9yKEMsRixELEcsSikoSyl9fTt4LnByb3RvdHlwZS5fY3JlYXRlRGVmaW5lZFByb2plY3Rvcj1mdW5jdGlvbihDLEYpe3JldHVybiBmdW5jdGlvbihELEIsRyl7dmFyIEs9QyhELEIsRyk7RD1GKEQsQixHKTtyZXR1cm4gbS5NYXRoLmlzVmFsaWROdW1iZXIoSykmJm0uTWF0aC5pc1ZhbGlkTnVtYmVyKEQpfX07eC5wcm90b3R5cGUuX2NyZWF0ZUFyZWFHZW5lcmF0b3I9CmZ1bmN0aW9uKEMsRixELEIsRyl7dmFyIEs9dGhpcy5fZ2V0Q3VydmVGYWN0b3J5KCk7cmV0dXJuIGwuYXJlYSgpLngoZnVuY3Rpb24oTCxKKXtyZXR1cm4gQyhMLEosRyl9KS55MShmdW5jdGlvbihMLEope3JldHVybiBGKEwsSixHKX0pLnkwKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEQoTCxKLEcpfSkuY3VydmUoSykuZGVmaW5lZChmdW5jdGlvbihMLEope3JldHVybiBCKEwsSixHKX0pfTtyZXR1cm4geH0oYy5MaW5lKTtmLl9ZMF9LRVk9InkwIjtkLkFyZWE9Zn0sZnVuY3Rpb24oYyxkKXsoZnVuY3Rpb24oZil7Zi5NQUlOPSJtYWluIjtmLlJFU0VUPSJyZXNldCJ9KShkLkFuaW1hdG9yfHwoZC5BbmltYXRvcj17fSkpfSxmdW5jdGlvbihjLGQpe3ZhciBmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZygpe3ZhciBsPXRoaXM7dGhpcy50cmFuc2xhdGU9dGhpcy5zY2FsZT0wO3RoaXMuY2FjaGVkRG9tYWluPVtudWxsLG51bGxdO3RoaXMubGFzdFNlZW5Eb21haW49W251bGwsbnVsbF07dGhpcy51cGRhdGVEb21haW49CmZ1bmN0aW9uKGspe2wubGFzdFNlZW5Eb21haW49ay5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO3ZhciBtPWsuc2NhbGVUcmFuc2Zvcm1hdGlvbihsLmNhY2hlZERvbWFpblsxXSktay5zY2FsZVRyYW5zZm9ybWF0aW9uKGwuY2FjaGVkRG9tYWluWzBdKSxwPWsuc2NhbGVUcmFuc2Zvcm1hdGlvbihsLmxhc3RTZWVuRG9tYWluWzFdKS1rLnNjYWxlVHJhbnNmb3JtYXRpb24obC5sYXN0U2VlbkRvbWFpblswXSk7bC5zY2FsZT1tL3B8fDE7bC50cmFuc2xhdGU9ay5zY2FsZVRyYW5zZm9ybWF0aW9uKGwuY2FjaGVkRG9tYWluWzBdKS1rLnNjYWxlVHJhbnNmb3JtYXRpb24obC5sYXN0U2VlbkRvbWFpblswXSkqbC5zY2FsZXx8MH19Zy5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLnNjYWxlPTE7dGhpcy50cmFuc2xhdGU9MDt0aGlzLmNhY2hlZERvbWFpbj10aGlzLmxhc3RTZWVuRG9tYWlufTtnLnByb3RvdHlwZS5zZXREb21haW49ZnVuY3Rpb24obCl7dGhpcy5jYWNoZWREb21haW49CmwuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKX07cmV0dXJuIGd9KCk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGcobCxrKXt2YXIgbT10aGlzO3RoaXMucmVuZGVyQ2FsbGJhY2s9bDt0aGlzLmFwcGx5VHJhbnNmb3JtQ2FsbGJhY2s9azt0aGlzLmRvbWFpblRyYW5zZm9ybVg9bmV3IGY7dGhpcy5kb21haW5UcmFuc2Zvcm1ZPW5ldyBmO3RoaXMucmVuZGVyRGVmZXJyZWQ9ZnVuY3Rpb24oKXttLmFwcGx5VHJhbnNmb3JtKCk7Y2xlYXJUaW1lb3V0KG0udGltZW91dFRva2VuKTttLnRpbWVvdXRUb2tlbj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bS5yZW5kZXJDYWxsYmFjaygpfSxnLkRFRkVSUkVEX1JFTkRFUklOR19ERUxBWSl9fWcucHJvdG90eXBlLnNldERvbWFpbnM9ZnVuY3Rpb24obCxrKXtsJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVguc2V0RG9tYWluKGwpO2smJnRoaXMuZG9tYWluVHJhbnNmb3JtWS5zZXREb21haW4oayk7dGhpcy5yZW5kZXJEZWZlcnJlZCgpfTtnLnByb3RvdHlwZS51cGRhdGVEb21haW5zPQpmdW5jdGlvbihsLGspe2wmJnRoaXMuZG9tYWluVHJhbnNmb3JtWC51cGRhdGVEb21haW4obCk7ayYmdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnVwZGF0ZURvbWFpbihrKTt0aGlzLnJlbmRlckRlZmVycmVkKCl9O2cucHJvdG90eXBlLnJlc2V0VHJhbnNmb3Jtcz1mdW5jdGlvbigpe3RoaXMuZG9tYWluVHJhbnNmb3JtWC5yZXNldCgpO3RoaXMuZG9tYWluVHJhbnNmb3JtWS5yZXNldCgpO3RoaXMuYXBwbHlUcmFuc2Zvcm0oKX07Zy5wcm90b3R5cGUuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24oKXt0aGlzLmFwcGx5VHJhbnNmb3JtQ2FsbGJhY2sodGhpcy5kb21haW5UcmFuc2Zvcm1YLnRyYW5zbGF0ZSx0aGlzLmRvbWFpblRyYW5zZm9ybVkudHJhbnNsYXRlLHRoaXMuZG9tYWluVHJhbnNmb3JtWC5zY2FsZSx0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2NhbGUpfTtyZXR1cm4gZ30oKTtjLkRFRkVSUkVEX1JFTkRFUklOR19ERUxBWT0yMDA7ZC5EZWZlcnJlZFJlbmRlcmVyPWN9LGZ1bmN0aW9uKGMsCmQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEMsRil7ZnVuY3Rpb24gRCgpe3RoaXMuY29uc3RydWN0b3I9Q31mb3IodmFyIEIgaW4gRilGLmhhc093blByb3BlcnR5KEIpJiYoQ1tCXT1GW0JdKTtDLnByb3RvdHlwZT1udWxsPT09Rj9PYmplY3QuY3JlYXRlKEYpOihELnByb3RvdHlwZT1GLnByb3RvdHlwZSxuZXcgRCl9LGw9ZigxKSxrPWYoNyksbT1mKDE0KSxwPWYoNikscT1mKDMzKSxyPWYoMyksdD1mKDExKSx2PWYoMCk7Yz1mKDEwKTt2YXIgQT1mKDE5KSx5PWYoMik7Zj1mKDE2KTt2YXIgeD17bGluZWFyOmwuY3VydmVMaW5lYXIsbGluZWFyQ2xvc2VkOmwuY3VydmVMaW5lYXJDbG9zZWQsc3RlcDpsLmN1cnZlU3RlcCxzdGVwQmVmb3JlOmwuY3VydmVTdGVwQmVmb3JlLHN0ZXBBZnRlcjpsLmN1cnZlU3RlcEFmdGVyLGJhc2lzOmwuY3VydmVCYXNpcyxiYXNpc09wZW46bC5jdXJ2ZUJhc2lzT3BlbixiYXNpc0Nsb3NlZDpsLmN1cnZlQmFzaXNDbG9zZWQsCmJ1bmRsZTpsLmN1cnZlQnVuZGxlLGNhcmRpbmFsOmwuY3VydmVDYXJkaW5hbCxjYXJkaW5hbE9wZW46bC5jdXJ2ZUNhcmRpbmFsT3BlbixjYXJkaW5hbENsb3NlZDpsLmN1cnZlQ2FyZGluYWxDbG9zZWQsbW9ub3RvbmU6bC5jdXJ2ZU1vbm90b25lWH07ZC5DdXJ2ZU5hbWU9Yy5tYWtlRW51bSgibGluZWFyIGxpbmVhckNsb3NlZCBzdGVwIHN0ZXBCZWZvcmUgc3RlcEFmdGVyIGJhc2lzIGJhc2lzT3BlbiBiYXNpc0Nsb3NlZCBidW5kbGUgY2FyZGluYWwgY2FyZGluYWxPcGVuIGNhcmRpbmFsQ2xvc2VkIG1vbm90b25lIi5zcGxpdCgiICIpKTtmPWZ1bmN0aW9uKEMpe2Z1bmN0aW9uIEYoKXt2YXIgRD1DLmNhbGwodGhpcyl8fHRoaXM7RC5fY3VydmU9ImxpbmVhciI7RC5fYXV0b3JhbmdlU21vb3RoPSExO0QuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkPSEwO0QuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZD0hMTtELl9kb3duc2FtcGxpbmdFbmFibGVkPSExO0QuYWRkQ2xhc3MoImxpbmUtcGxvdCIpOwp2YXIgQj1uZXcgay5FYXNpbmc7Qi5zdGVwRHVyYXRpb24oeS5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtCLmVhc2luZ01vZGUoImV4cEluT3V0Iik7Qi5tYXhUb3RhbER1cmF0aW9uKHkuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7RC5hbmltYXRvcihBLkFuaW1hdG9yLk1BSU4sQik7RC5hdHRyKCJzdHJva2UiLChuZXcgci5Db2xvcikucmFuZ2UoKVswXSk7RC5hdHRyKCJzdHJva2Utd2lkdGgiLCIycHgiKTtyZXR1cm4gRH1nKEYsQyk7Ri5wcm90b3R5cGUueD1mdW5jdGlvbihELEIsRyl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUueC5jYWxsKHRoaXMpO0MucHJvdG90eXBlLnguY2FsbCh0aGlzLEQsQixHKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLnk9ZnVuY3Rpb24oRCxCLEcpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtDLnByb3RvdHlwZS55LmNhbGwodGhpcyxELEIsCkcpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZT1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlLmNhbGwodGhpcyk7Qy5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMsRCk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5hdXRvcmFuZ2VTbW9vdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXV0b3JhbmdlU21vb3RofTtGLnByb3RvdHlwZS5fc2V0U2NhbGVTbmFwcGluZz1mdW5jdGlvbigpeyJ4Ij09PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiZ0aGlzLngoKSYmdGhpcy54KCkuc2NhbGUmJnRoaXMueCgpLnNjYWxlIGluc3RhbmNlb2YgdC5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy54KCkuc2NhbGUuc25hcHBpbmdEb21haW5FbmFibGVkKCF0aGlzLmF1dG9yYW5nZVNtb290aCgpKTsieSI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmCnRoaXMueSgpJiZ0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUgaW5zdGFuY2VvZiB0LlF1YW50aXRhdGl2ZVNjYWxlJiZ0aGlzLnkoKS5zY2FsZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQoIXRoaXMuYXV0b3JhbmdlU21vb3RoKCkpfTtGLnByb3RvdHlwZS5jdXJ2ZT1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9jdXJ2ZTt0aGlzLl9jdXJ2ZT1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG93bnNhbXBsaW5nRW5hYmxlZH07Ri5wcm90b3R5cGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ7dGhpcy5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5jb2xsYXBzZURlbnNlTGluZXNFbmFibGVkPQpmdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ7dGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3JldHVybiBuZXcgcC5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgcS5MaW5lU1ZHRHJhd2VyfSxmdW5jdGlvbihHKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEcscS5tYWtlTGluZUNhbnZhc0RyYXdTdGVwKGZ1bmN0aW9uKCl7cmV0dXJuIEIuX2QzTGluZUZhY3RvcnkoRCl9KSl9KX07Ri5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKEQpe3ZhciBCPUMucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsRCk7aWYoIXRoaXMuX2F1dG9yYW5nZVNtb290aHx8dGhpcy5hdXRvcmFuZ2VNb2RlKCkhPT0KRHx8IngiIT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJiJ5IiE9PXRoaXMuYXV0b3JhbmdlTW9kZSgpKXJldHVybiBCO0Q9dGhpcy5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cygpO3ZhciBHPSJ5Ij09PXRoaXMuYXV0b3JhbmdlTW9kZSgpP0QubGVmdC5jb25jYXQoRC5yaWdodCkubWFwKGZ1bmN0aW9uKEspe3JldHVybiBLLnl9KTpELnRvcC5jb25jYXQoRC5ib3R0b20pLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gSy54fSk7cmV0dXJuIEIubWFwKGZ1bmN0aW9uKEspe3JldHVybiBsLmV4dGVudChsLm1lcmdlKFtLLEddKSl9KX07Ri5wcm90b3R5cGUuX2dldEVkZ2VJbnRlcnNlY3Rpb25Qb2ludHM9ZnVuY3Rpb24oKXt2YXIgRD10aGlzO2lmKCEodGhpcy55KCkuc2NhbGUgaW5zdGFuY2VvZiB0LlF1YW50aXRhdGl2ZVNjYWxlJiZ0aGlzLngoKS5zY2FsZSBpbnN0YW5jZW9mIHQuUXVhbnRpdGF0aXZlU2NhbGUpKXJldHVybntsZWZ0OltdLHJpZ2h0OltdLHRvcDpbXSxib3R0b206W119Owp2YXIgQj10aGlzLnkoKS5zY2FsZSxHPXRoaXMueCgpLnNjYWxlLEs9e2xlZnQ6W10scmlnaHQ6W10sdG9wOltdLGJvdHRvbTpbXX0sTD1HLnNjYWxlKEcuZG9tYWluKClbMF0pLEo9Ry5zY2FsZShHLmRvbWFpbigpWzFdKSxQPUIuc2NhbGUoQi5kb21haW4oKVswXSksUz1CLnNjYWxlKEIuZG9tYWluKClbMV0pO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE4pe2Zvcih2YXIgVD1OLmRhdGEoKSxZLGFhLGhhLFgsY2EsZWEsa2EsYmE9MTtiYTxULmxlbmd0aDtiYSsrKVg9ZWF8fEcuc2NhbGUoRC54KCkuYWNjZXNzb3IoVFtiYS0xXSxiYS0xLE4pKSxjYT1rYXx8Qi5zY2FsZShELnkoKS5hY2Nlc3NvcihUW2JhLTFdLGJhLTEsTikpLGVhPUcuc2NhbGUoRC54KCkuYWNjZXNzb3IoVFtiYV0sYmEsTikpLGthPUIuc2NhbGUoRC55KCkuYWNjZXNzb3IoVFtiYV0sYmEsTikpLFg8TD09PUw8PWVhJiYoWT1MLVgsYWE9ZWEtWCxoYT1rYS1jYSxZPVkqaGEvYWEsSy5sZWZ0LnB1c2goe3g6TCwKeTpCLmludmVydChjYStZKX0pKSxYPEo9PT1KPD1lYSYmKFk9Si1YLGFhPWVhLVgsaGE9a2EtY2EsWT1ZKmhhL2FhLEsucmlnaHQucHVzaCh7eDpKLHk6Qi5pbnZlcnQoY2ErWSl9KSksY2E8Uz09PVM8PWthJiYoYWE9ZWEtWCxZPVMtY2EsaGE9a2EtY2EsWT1ZKmFhL2hhLEsudG9wLnB1c2goe3g6Ry5pbnZlcnQoWCtZKSx5OlN9KSksY2E8UD09PVA8PWthJiYoYWE9ZWEtWCxZPVAtY2EsaGE9a2EtY2EsWT1ZKmFhL2hhLEsuYm90dG9tLnB1c2goe3g6Ry5pbnZlcnQoWCtZKSx5OlB9KSl9KTtyZXR1cm4gS307Ri5wcm90b3R5cGUuX2dldFJlc2V0WUZ1bmN0aW9uPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy55KCkuc2NhbGUuZG9tYWluKCksQj1NYXRoLm1heChEWzBdLERbMV0pO0Q9TWF0aC5taW4oRFswXSxEWzFdKTtCPTA+QiYmQnx8MDxEJiZEfHwwO3ZhciBHPXRoaXMueSgpLnNjYWxlLnNjYWxlKEIpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBHfX07Ri5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPQpmdW5jdGlvbigpe3ZhciBEPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEI9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7Qi5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoeS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSk7RC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6QixhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihBLkFuaW1hdG9yLlJFU0VUKX0pfUQucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEEuQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gRH07Ri5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIEQ9Qy5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyk7T2JqZWN0LmtleXMoRCkuZm9yRWFjaChmdW5jdGlvbihCKXtpZigiZCIhPT0KQil7dmFyIEc9RFtCXTtEW0JdPWZ1bmN0aW9uKEssTCxKKXtyZXR1cm4gMDxLLmxlbmd0aD9HKEtbMF0sTCxKKTpudWxsfX19KTtyZXR1cm4gRH07Ri5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihEKXtEPXRoaXMuZW50aXR5TmVhcmVzdEJ5WFRoZW5ZKEQpO3JldHVybiBudWxsIT1EP1tEXTpbXX07Ri5wcm90b3R5cGUuZW50aXR5TmVhcmVzdEJ5WFRoZW5ZPWZ1bmN0aW9uKEQpe3ZhciBCPUluZmluaXR5LEc9SW5maW5pdHksSyxMPXRoaXMuYm91bmRzKCk7dGhpcy5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oSil7aWYodi5NYXRoLndpdGhpbihKLnBvc2l0aW9uLEwpKXt2YXIgUD1NYXRoLmFicyhELngtSi5wb3NpdGlvbi54KSxTPU1hdGguYWJzKEQueS1KLnBvc2l0aW9uLnkpO2lmKFA8Qnx8UD09PUImJlM8RylLPUosQj1QLEc9U319KTtyZXR1cm4gS307Ri5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTsKRC5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoeS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkseS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBEfTtGLnByb3RvdHlwZS5fY29uc3RydWN0TGluZVByb2plY3Rvcj1mdW5jdGlvbihELEIpe3ZhciBHPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKEssTCxKKXtyZXR1cm4gRy5fZDNMaW5lRmFjdG9yeShKLEQsQikoSyl9fTtGLnByb3RvdHlwZS5fZDNMaW5lRmFjdG9yeT1mdW5jdGlvbihELEIsRyl7ZnVuY3Rpb24gSyhMLEosUCl7dmFyIFM9QihMLEosUCk7TD1HKEwsSixQKTtyZXR1cm4gdi5NYXRoLmlzVmFsaWROdW1iZXIoUykmJnYuTWF0aC5pc1ZhbGlkTnVtYmVyKEwpfXZvaWQgMD09PUImJihCPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpKTt2b2lkIDA9PT1HJiYoRz15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIGwubGluZSgpLngoZnVuY3Rpb24oTCxKKXtyZXR1cm4gQihMLApKLEQpfSkueShmdW5jdGlvbihMLEope3JldHVybiBHKEwsSixEKX0pLmN1cnZlKHRoaXMuX2dldEN1cnZlRmFjdG9yeSgpKS5kZWZpbmVkKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEsoTCxKLEQpfSl9O0YucHJvdG90eXBlLl9nZXRDdXJ2ZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLmN1cnZlKCk7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgRD8oRD14W0RdLG51bGw9PUQ/eC5saW5lYXI6RCk6RH07Ri5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLEI9bmV3IHYuTWFwO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEcpe3ZhciBLPUcuZGF0YSgpO2lmKEQuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkfHxELl9kb3duc2FtcGxpbmdFbmFibGVkKXt2YXIgTD1LLm1hcChmdW5jdGlvbihKLFApe3JldHVybiBQfSk7RC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQmJihMPUQuX2ZpbHRlckNyb3BwZWRSZW5kZXJpbmcoRyxMKSk7RC5fZG93bnNhbXBsaW5nRW5hYmxlZCYmCihMPUQuX2ZpbHRlckRvd25zYW1wbGluZyhHLEwpKTtELl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQmJihMPUQuX2ZpbHRlckRlbnNlTGluZXMoRyxMKSk7Qi5zZXQoRyxbTC5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIEtbSl19KV0pfWVsc2UgQi5zZXQoRyxbS10pfSk7cmV0dXJuIEJ9O0YucHJvdG90eXBlLl9maWx0ZXJDcm9wcGVkUmVuZGVyaW5nPWZ1bmN0aW9uKEQsQil7ZnVuY3Rpb24gRyhoYSxYKXtyZXR1cm4gdi5NYXRoLmluUmFuZ2UoaGEsMCxLLndpZHRoKCkpJiZ2Lk1hdGguaW5SYW5nZShYLDAsSy5oZWlnaHQoKSl9Zm9yKHZhciBLPXRoaXMsTD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxKPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLFA9RC5kYXRhKCksUz1bXSxOPTA7TjxCLmxlbmd0aDtOKyspe3ZhciBUPUwoUFtCW05dXSxCW05dLEQpLFk9SihQW0JbTl1dLEJbTl0sRCk7VD1HKFQsWSk7aWYoIVQmJm51bGwhPUJbTi0xXSYmCm51bGwhPVBbQltOLTFdXSl7WT1MKFBbQltOLTFdXSxCW04tMV0sRCk7dmFyIGFhPUooUFtCW04tMV1dLEJbTi0xXSxEKTtUPVR8fEcoWSxhYSl9VHx8bnVsbD09QltOKzFdfHxudWxsPT1QW0JbTisxXV18fChZPUwoUFtCW04rMV1dLEJbTisxXSxEKSxhYT1KKFBbQltOKzFdXSxCW04rMV0sRCksVD1UfHxHKFksYWEpKTtUJiZTLnB1c2goQltOXSl9cmV0dXJuIFN9O0YucHJvdG90eXBlLl9maWx0ZXJEb3duc2FtcGxpbmc9ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBHKGthLGJhKXt2YXIgbGE9TChLW0Jba2FdXSxCW2thXSxEKSx3YT1KKEtbQltrYV1dLEJba2FdLEQpLENhPUwoS1tCW2thKzFdXSxCW2thKzFdLEQpO2thPUooS1tCW2thKzFdXSxCW2thKzFdLEQpO3JldHVybiBJbmZpbml0eT09PWJhP01hdGguZmxvb3IobGEpPT09TWF0aC5mbG9vcihDYSk6TWF0aC5mbG9vcihrYSk9PT1NYXRoLmZsb29yKHdhKyhDYS1sYSkqYmEpfWlmKDA9PT1CLmxlbmd0aClyZXR1cm5bXTtmb3IodmFyIEs9CkQuZGF0YSgpLEw9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxQPVtCWzBdXSxTPTA7UzxCLmxlbmd0aC0xOyl7dmFyIE49QltTXSxUPUwoS1tCW1NdXSxCW1NdLEQpLFk9SihLW0JbU11dLEJbU10sRCksYWE9TChLW0JbUysxXV0sQltTKzFdLEQpLGhhPUooS1tCW1MrMV1dLEJbUysxXSxEKTtoYT1NYXRoLmZsb29yKFQpPT09TWF0aC5mbG9vcihhYSk/SW5maW5pdHk6KGhhLVkpLyhhYS1UKTthYT1CW1NdO1k9SW5maW5pdHk9PT1oYT9ZOlQ7VD1hYTtmb3IodmFyIFg9WSxjYT0hMDtTPEIubGVuZ3RoLTEmJihjYXx8RyhTLGhhKSk7KXtTKys7Y2E9ITE7dmFyIGVhPUluZmluaXR5PT09aGE/SihLW0JbU11dLEJbU10sRCk6TChLW0JbU11dLEJbU10sRCk7ZWE+WCYmKFg9ZWEsVD1CW1NdKTtlYTxZJiYoWT1lYSxhYT1CW1NdKX1oYT1CW1NdO2FhIT09TiYmUC5wdXNoKGFhKTtUIT09YWEmJlQhPT1OJiZQLnB1c2goVCk7CmhhIT09TiYmaGEhPT1hYSYmaGEhPT1UJiZQLnB1c2goaGEpfXJldHVybiBQfTtGLnByb3RvdHlwZS5fZmlsdGVyRGVuc2VMaW5lcz1mdW5jdGlvbihELEIpe2lmKDA9PT1CLmxlbmd0aClyZXR1cm5bXTt2YXIgRz1ELmRhdGEoKSxLPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEw9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJuIHRoaXMuX2J1Y2tldEJ5WChELEIsZnVuY3Rpb24oSil7cmV0dXJuIEsoR1tKXSxKLEQpfSxmdW5jdGlvbihKKXtyZXR1cm4gTChHW0pdLEosRCl9KX07Ri5wcm90b3R5cGUuX2J1Y2tldEJ5WD1mdW5jdGlvbihELEIsRyxLKXt2YXIgTD1bXTtEPUQuZGF0YSgpO2Zvcih2YXIgSj1udWxsLFA9MDtQPD1CLmxlbmd0aDsrK1Ape3ZhciBTPUJbUF07aWYobnVsbCE9RFtTXSl7dmFyIE49TWF0aC5mbG9vcihHKFMpKSxUPUsoUyk7bnVsbD09Sj9KPW5ldyB2LkJ1Y2tldChTLE4sVCk6Si5pc0luQnVja2V0KE4pP0ouYWRkVG9CdWNrZXQoVCwKUyk6KEwucHVzaC5hcHBseShMLEouZ2V0VW5pcXVlSW5kaWNlcygpKSxKPW5ldyB2LkJ1Y2tldChTLE4sVCkpfX1udWxsIT1KJiZMLnB1c2guYXBwbHkoTCxKLmdldFVuaXF1ZUluZGljZXMoKSk7cmV0dXJuIEx9O3JldHVybiBGfShmLlhZUGxvdCk7ZC5MaW5lPWZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbD1mKDEpLGs9ZigyNiksbT1mKDApLHA9WzAsMV07Yz1mdW5jdGlvbihxKXtmdW5jdGlvbiByKCl7dmFyIHQ9cS5jYWxsKHRoaXMpfHx0aGlzO3QuX3JhbmdlPVswLDFdO3QuX2QzU2NhbGU9bC5zY2FsZUJhbmQoKTt0Ll9kM1NjYWxlLnJhbmdlKHApOwp0Ll9kM1RyYW5zZm9ybWF0aW9uU2NhbGU9bC5zY2FsZUxpbmVhcigpO3QuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4ocCk7dC5faW5uZXJQYWRkaW5nPXIuX2NvbnZlcnRUb1Bsb3R0YWJsZUlubmVyUGFkZGluZygpO3QuX291dGVyUGFkZGluZz1yLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmcoKTtyZXR1cm4gdH1nKHIscSk7ci5wcm90b3R5cGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9KG5ldyByKS5kb21haW4odGhpcy5kb21haW4oKSkucmFuZ2UodGhpcy5yYW5nZSgpKS5pbm5lclBhZGRpbmcodGhpcy5pbm5lclBhZGRpbmcoKSkub3V0ZXJQYWRkaW5nKHRoaXMub3V0ZXJQYWRkaW5nKCkpO3QuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbigpKTtyZXR1cm4gdH07ci5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIG0uQXJyYXkudW5pcSh0KX07CnIucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbS5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTtyLnByb3RvdHlwZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIHEucHJvdG90eXBlLmRvbWFpbi5jYWxsKHRoaXMsdCl9O3IucHJvdG90eXBlLmludmVydFJhbmdlPWZ1bmN0aW9uKCl7dmFyIHQsdj10aGlzO3ZvaWQgMD09PXQmJih0PXRoaXMucmFuZ2UoKSk7dmFyIEE9dGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSx5PXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih0WzBdKSx4PXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih0WzFdKTt0PXRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dmFyIEM9dC5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIHYuX2QzU2NhbGUoRikrQS8yfSk7eT1sLmJpc2VjdChDLHkpO3g9bC5iaXNlY3QoQyx4KTtyZXR1cm4gdC5zbGljZSh5LHgpfTtyLnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gcS5wcm90b3R5cGUucmFuZ2UuY2FsbCh0aGlzLAp0KX07ci5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDEvLjctMX07ci5fY29udmVydFRvUGxvdHRhYmxlT3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuLjUvLjd9O3IucHJvdG90eXBlLl9zZXRCYW5kcz1mdW5jdGlvbigpe3ZhciB0PTEtMS8oMSt0aGlzLmlubmVyUGFkZGluZygpKSx2PXRoaXMub3V0ZXJQYWRkaW5nKCkvKDErdGhpcy5pbm5lclBhZGRpbmcoKSk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nSW5uZXIodCk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nT3V0ZXIodil9O3IucHJvdG90eXBlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXNjYWxlQmFuZCh0aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpKX07ci5wcm90b3R5cGUuc3RlcFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkqKDErdGhpcy5pbm5lclBhZGRpbmcoKSkpfTtyLnByb3RvdHlwZS50aWNrcz0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07ci5wcm90b3R5cGUuaW5uZXJQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2lubmVyUGFkZGluZzt0aGlzLl9pbm5lclBhZGRpbmc9dDt0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUub3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX291dGVyUGFkZGluZzt0aGlzLl9vdXRlclBhZGRpbmc9dDt0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7dD10aGlzLl9kM1NjYWxlKHQpK3RoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkvMjtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHQpfTtyLnByb3RvdHlwZS56b29tPWZ1bmN0aW9uKHQsdil7dmFyIEE9dGhpczsKdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIEEuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQoay56b29tT3V0KHksdCx2KSl9KSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX07ci5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHQpe3ZhciB2PXRoaXM7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UoKS5tYXAoZnVuY3Rpb24oQSl7cmV0dXJuIHYuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQoQSt0KX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtyLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodCl9O3IucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQodCl9OwpyLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiBwfTtyLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCl9O3IucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odCk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX07ci5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07ci5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKHQpO3RoaXMuX3NldEJhbmRzKCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYW5nZX07CnIucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aGlzLl9yYW5nZT10O3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSh0KTt0aGlzLl9zZXRCYW5kcygpfTtyLnByb3RvdHlwZS5fcmVzY2FsZUJhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh0KS10aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUoMCkpfTtyZXR1cm4gcn0oZigxNykuU2NhbGUpO2QuQ2F0ZWdvcnk9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoeCl7dHJ5e3ZhciBDPXgubm9kZSgpLmdldEJCb3goKX1jYXRjaChGKXtDPXt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fXJldHVybiBDfWZ1bmN0aW9uIGwoeCl7aWYoIm51bWJlciI9PT10eXBlb2YgeClyZXR1cm57bWluOngsbWF4Onh9O2lmKHggaW5zdGFuY2VvZiBPYmplY3QmJiJtaW4iaW4geCYmIm1heCJpbiB4KXJldHVybiB4O3Rocm93IEVycm9yKCJpbnB1dCAnIit4KyInIGNhbid0IGJlIHBhcnNlZCBhcyBhbiBSYW5nZSIpOwp9ZnVuY3Rpb24gayh4LEMpe3g9eC5nZXRQcm9wZXJ0eVZhbHVlKEMpO3JldHVybiBwYXJzZUZsb2F0KHgpfHwwfWZ1bmN0aW9uIG0oeCl7aWYobnVsbD09eHx8Im5vbmUiPT09eClyZXR1cm4gbnVsbDt4PXgubWF0Y2goQSk7aWYobnVsbD09eHx8Mj54Lmxlbmd0aClyZXR1cm4gbnVsbDt4PXhbMV0uc3BsaXQoeSkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBwYXJzZUZsb2F0KEMpfSk7cmV0dXJuIDYhPXgubGVuZ3RoP251bGw6eH12YXIgcD1mKDEpLHE9TWF0aDtkLmNvbnRhaW5zPWZ1bmN0aW9uKHgsQyl7Zm9yKDtudWxsIT1DJiZDIT09eDspQz1DLnBhcmVudE5vZGU7cmV0dXJuIEM9PT14fTtkLmVsZW1lbnRCQm94PWc7ZC5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oeCl7cmV0dXJuIHggaW5zdGFuY2VvZiBTVkdFbGVtZW50P2cocC5zZWxlY3QoeCkpOnggaW5zdGFuY2VvZiBIVE1MRWxlbWVudD8oeD14LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHt4OngubGVmdCx5OngudG9wLHdpZHRoOngud2lkdGgsCmhlaWdodDp4LmhlaWdodH0pOnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fTtkLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTPTFFMy82MDtkLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsPWZ1bmN0aW9uKHgpe251bGwhPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh4KTpzZXRUaW1lb3V0KHgsZC5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EUyl9O2QuZWxlbWVudFdpZHRoPWZ1bmN0aW9uKHgpe3g9eCBpbnN0YW5jZW9mIHAuc2VsZWN0aW9uP3gubm9kZSgpOng7eD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh4KTtyZXR1cm4gayh4LCJ3aWR0aCIpK2soeCwicGFkZGluZy1sZWZ0Iikrayh4LCJwYWRkaW5nLXJpZ2h0Iikrayh4LCJib3JkZXItbGVmdC13aWR0aCIpK2soeCwiYm9yZGVyLXJpZ2h0LXdpZHRoIil9O2QuZWxlbWVudEhlaWdodD1mdW5jdGlvbih4KXt4PXggaW5zdGFuY2VvZiBwLnNlbGVjdGlvbj8KeC5ub2RlKCk6eDt4PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHgpO3JldHVybiBrKHgsImhlaWdodCIpK2soeCwicGFkZGluZy10b3AiKStrKHgsInBhZGRpbmctYm90dG9tIikrayh4LCJib3JkZXItdG9wLXdpZHRoIikrayh4LCJib3JkZXItYm90dG9tLXdpZHRoIil9O3ZhciByPS90cmFuc2xhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpKD86KD86KD86XHMrLD9ccyopfCg/OixccyopKSgoPzpbLStdP1swLTldKlwuP1swLTldKykpKT9ccypcKS8sdD0vcm90YXRlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKVxzKlwpLyx2PS9zY2FsZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLztkLmdldFRyYW5zbGF0ZVZhbHVlcz1mdW5jdGlvbih4KXt4PXIuZXhlYyh4LmF0dHIoInRyYW5zZm9ybSIpKTtpZihudWxsIT14KXt2YXIgQz0KeFsyXTtyZXR1cm5bK3hbMV0sKyh2b2lkIDA9PT1DPzA6QyldfXJldHVyblswLDBdfTtkLmdldFJvdGF0ZT1mdW5jdGlvbih4KXt4PXQuZXhlYyh4LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9eD8reFsxXTowfTtkLmdldFNjYWxlVmFsdWVzPWZ1bmN0aW9uKHgpe3ZhciBDPXYuZXhlYyh4LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9Qz8oeD1DWzFdLEM9Q1syXSxbK3gsbnVsbD09Qz8reDorQ10pOlswLDBdfTtkLmNsaWVudFJlY3RzT3ZlcmxhcD1mdW5jdGlvbih4LEMpe3JldHVybiBxLmZsb29yKHgucmlnaHQpPD1xLmNlaWwoQy5sZWZ0KXx8cS5jZWlsKHgubGVmdCk+PXEuZmxvb3IoQy5yaWdodCl8fHEuZmxvb3IoeC5ib3R0b20pPD1xLmNlaWwoQy50b3ApfHxxLmNlaWwoeC50b3ApPj1xLmZsb29yKEMuYm90dG9tKT8hMTohMH07ZC5leHBhbmRSZWN0PWZ1bmN0aW9uKHgsQyl7cmV0dXJue2xlZnQ6eC5sZWZ0LUMsdG9wOngudG9wLUMscmlnaHQ6eC5yaWdodCsKQyxib3R0b206eC5ib3R0b20rQyx3aWR0aDp4LndpZHRoKzIqQyxoZWlnaHQ6eC5oZWlnaHQrMipDfX07ZC5jbGllbnRSZWN0SW5zaWRlPWZ1bmN0aW9uKHgsQyl7cmV0dXJuIHEuZmxvb3IoQy5sZWZ0KTw9cS5jZWlsKHgubGVmdCkmJnEuZmxvb3IoQy50b3ApPD1xLmNlaWwoeC50b3ApJiZxLmZsb29yKHgucmlnaHQpPD1xLmNlaWwoQy5yaWdodCkmJnEuZmxvb3IoeC5ib3R0b20pPD1xLmNlaWwoQy5ib3R0b20pfTtkLmludGVyc2VjdHNCQm94PWZ1bmN0aW9uKHgsQyxGLEQpe3ZvaWQgMD09PUQmJihEPS41KTt4PWwoeCk7Qz1sKEMpO3JldHVybiBGLngrRi53aWR0aD49eC5taW4tRCYmRi54PD14Lm1heCtEJiZGLnkrRi5oZWlnaHQ+PUMubWluLUQmJkYueTw9Qy5tYXgrRH07ZC5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycz1mdW5jdGlvbih4KXtmb3IodmFyIEM9W107eCYmeCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OylDLnB1c2goeCkseD14LnBhcmVudEVsZW1lbnQ7cmV0dXJuIEN9OwpkLmdldEVsZW1lbnRUcmFuc2Zvcm09ZnVuY3Rpb24oeCl7eD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh4LG51bGwpO3g9eC5nZXRQcm9wZXJ0eVZhbHVlKCItd2Via2l0LXRyYW5zZm9ybSIpfHx4LmdldFByb3BlcnR5VmFsdWUoIi1tb3otdHJhbnNmb3JtIil8fHguZ2V0UHJvcGVydHlWYWx1ZSgiLW1zLXRyYW5zZm9ybSIpfHx4LmdldFByb3BlcnR5VmFsdWUoIi1vLXRyYW5zZm9ybSIpfHx4LmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpO3JldHVybiBtKHgpfTt2YXIgQT0vXm1hdHJpeFwoKFteKV0rKVwpJC8seT0vWywgXSsvfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyh0LHYpe3JldHVyblt0WzBdKnZbMF0rdFsyXSp2WzFdLHRbMV0qdlswXSt0WzNdKnZbMV0sdFswXSp2WzJdK3RbMl0qdlszXSx0WzFdKnZbMl0rdFszXSp2WzNdLHRbMF0qdls0XSt0WzJdKnZbNV0rdFs0XSx0WzFdKnZbNF0rdFszXSp2WzVdK3RbNV1dfWZ1bmN0aW9uIGwodCx2KXtyZXR1cm5bdFswXSwKdFsxXSx0WzJdLHRbM10sdFswXSp2WzBdK3RbMl0qdlsxXSt0WzRdLHRbMV0qdlswXSt0WzNdKnZbMV0rdFs1XV19ZnVuY3Rpb24gayh0KXt2YXIgdj10WzBdKnRbM10tdFsxXSp0WzJdO2lmKDA9PT12KXRocm93IEVycm9yKCJzaW5ndWxhciBtYXRyaXgiKTt2PTEvdjtyZXR1cm5bdip0WzNdLHYqLXRbMV0sdiotdFsyXSx2KnRbMF0sdiooLXRbM10qdFs0XSt0WzJdKnRbNV0pLHYqKHRbMV0qdFs0XSstdFswXSp0WzVdKV19dmFyIG09ZigxKSxwPWYoNTUpLHE9TWF0aCxyPVsxLDAsMCwxLDAsMF07ZC5pblJhbmdlPWZ1bmN0aW9uKHQsdixBKXtyZXR1cm4gcS5taW4odixBKTw9dCYmdDw9cS5tYXgodixBKX07ZC5jbGFtcD1mdW5jdGlvbih0LHYsQSl7cmV0dXJuIHEubWluKHEubWF4KHYsdCksQSl9O2QubWF4PWZ1bmN0aW9uKHQsdixBKXt2YXIgeT0iZnVuY3Rpb24iPT09dHlwZW9mIHY/djpudWxsO3Y9bnVsbD09eT92OkE7dD1udWxsPT15P20ubWF4KHQpOm0ubWF4KHQseSk7cmV0dXJuIHZvaWQgMCE9PQp0P3Q6dn07ZC5taW49ZnVuY3Rpb24odCx2LEEpe3ZhciB5PSJmdW5jdGlvbiI9PT10eXBlb2Ygdj92Om51bGw7dj1udWxsPT15P3Y6QTt0PW51bGw9PXk/bS5taW4odCk6bS5taW4odCx5KTtyZXR1cm4gdm9pZCAwIT09dD90OnZ9O2QuaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT10fTtkLmlzVmFsaWROdW1iZXI9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgdCYmMT50LXR9O2QucmFuZ2U9ZnVuY3Rpb24odCx2LEEpe3ZvaWQgMD09PUEmJihBPTEpO2lmKDA9PT1BKXRocm93IEVycm9yKCJzdGVwIGNhbm5vdCBiZSAwIik7dj1xLm1heChxLmNlaWwoKHYtdCkvQSksMCk7Zm9yKHZhciB5PVtdLHg9MDt4PHY7Kyt4KXlbeF09dCtBKng7cmV0dXJuIHl9O2QuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsdil7cmV0dXJuIHEucG93KHYueS10LnksMikrcS5wb3codi54LXQueCwyKX07ZC5kZWdyZWVzVG9SYWRpYW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0LzM2MCoKcS5QSSoyfTtkLndpdGhpbj1mdW5jdGlvbih0LHYpe3JldHVybiB2LnRvcExlZnQueDw9dC54JiZ2LmJvdHRvbVJpZ2h0Lng+PXQueCYmdi50b3BMZWZ0Lnk8PXQueSYmdi5ib3R0b21SaWdodC55Pj10Lnl9O2QuYm91bmRzSW50ZXJzZWN0cz1mdW5jdGlvbih0LHYsQSx5LHgsQyl7cmV0dXJuIHQ8PTAreCYmMDw9dCtBJiZ2PD0wK0MmJjA8PXYreX07ZC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3Q9cC5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycyh0KTtmb3IodmFyIHY9cixBPW51bGwseT0wO3k8dC5sZW5ndGg7eSsrKXt2YXIgeD10W3ldLEM9cC5nZXRFbGVtZW50VHJhbnNmb3JtKHgpO2lmKG51bGwhPUMpe3ZhciBGPXguY2xpZW50V2lkdGgvMixEPXguY2xpZW50SGVpZ2h0LzI7dj1sKHYsW0YsRF0pO3Y9Zyh2LGsoQykpO3Y9bCh2LFstRiwtRF0pfUM9eC5zY3JvbGxMZWZ0O0Y9eC5zY3JvbGxUb3A7aWYobnVsbD09PUF8fHg9PT1BKUMtPXgub2Zmc2V0TGVmdCt4LmNsaWVudExlZnQsCkYtPXgub2Zmc2V0VG9wK3guY2xpZW50VG9wLEE9eC5vZmZzZXRQYXJlbnQ7dj1sKHYsW0MsRl0pfXJldHVybiB2fTtkLm11bHRpcGx5TWF0cml4PWc7ZC5wcmVtdWx0aXBseVRyYW5zbGF0ZT1mdW5jdGlvbih0LHYpe3JldHVyblt2WzBdLHZbMV0sdlsyXSx2WzNdLHZbNF0rdFswXSx2WzVdK3RbMV1dfTtkLm11bHRpcGx5VHJhbnNsYXRlPWw7ZC5pbnZlcnRNYXRyaXg9aztkLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKHQsdil7cmV0dXJue3g6dFswXSp2LngrdFsyXSp2LnkrdFs0XSx5OnRbMV0qdi54K3RbM10qdi55K3RbNV19fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPW5ldyAoZigxMTQpLlNwbGl0U3RyYXRlZ3lMaW5lYXIpO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKHAscSl7dm9pZCAwPT09cCYmKHA9NSk7dm9pZCAwPT09cSYmKHE9Zyk7dGhpcy5tYXhOb2RlQ2hpbGRyZW49cDt0aGlzLnNwbGl0U3RyYXRlZ3k9cTt0aGlzLnJvb3Q9bmV3IGwoITApO3RoaXMuc2l6ZT0wfW0ucHJvdG90eXBlLmdldFJvb3Q9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdH07bS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnJvb3Q9bmV3IGwoITApO3RoaXMuc2l6ZT0wfTttLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24ocCxxKXtmb3IodmFyIHI9dGhpcy5yb290OyFyLmxlYWY7KXI9ci5zdWJ0cmVlKHApO3A9bC52YWx1ZU5vZGUocCxxKTtyLmluc2VydChwKTtmb3IodGhpcy5zaXplKz0xO3Iub3ZlcmZsb3codGhpcy5tYXhOb2RlQ2hpbGRyZW4pOylyPXIuc3BsaXQodGhpcy5zcGxpdFN0cmF0ZWd5KSxudWxsPT1yLnBhcmVudCYmKHRoaXMucm9vdD1yKX07bS5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKHEpe3JldHVybiBxLmNvbnRhaW5zKHApfSl9O20ucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihxKXtyZXR1cm4gay5pc0JvdW5kc092ZXJsYXBCb3VuZHMocSxwKX0pfTttLnByb3RvdHlwZS5pbnRlcnNlY3RYPQpmdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihxKXtyZXR1cm4gay5pc0JvdW5kc092ZXJsYXBYKHEscCl9KX07bS5wcm90b3R5cGUuaW50ZXJzZWN0WT1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihxKXtyZXR1cm4gay5pc0JvdW5kc092ZXJsYXBZKHEscCl9KX07bS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24ocCl7dmFyIHE9W107aWYobnVsbCE9dGhpcy5yb290LmJvdW5kcyYmIXAodGhpcy5yb290LmJvdW5kcykpcmV0dXJuIHE7Zm9yKHZhciByPVt0aGlzLnJvb3RdOzA8ci5sZW5ndGg7KWZvcih2YXIgdD1yLnNoaWZ0KCksdj0wO3Y8dC5lbnRyaWVzLmxlbmd0aDt2Kyspe3ZhciBBPXQuZW50cmllc1t2XTtwKEEuYm91bmRzKSYmKHQubGVhZj9xLnB1c2goQS52YWx1ZSk6ci5wdXNoKEEpKX1yZXR1cm4gcX07cmV0dXJuIG19KCk7ZC5SVHJlZT1jO3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShwKXt0aGlzLmxlYWY9cDt0aGlzLmJvdW5kcz0KbnVsbDt0aGlzLmVudHJpZXM9W107dGhpcy52YWx1ZT10aGlzLnBhcmVudD1udWxsfW0udmFsdWVOb2RlPWZ1bmN0aW9uKHAscSl7dmFyIHI9bmV3IG0oITApO3IuYm91bmRzPXA7ci52YWx1ZT1xO3JldHVybiByfTttLnByb3RvdHlwZS5vdmVyZmxvdz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aD5wfTttLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24ocCl7dGhpcy5lbnRyaWVzLnB1c2gocCk7cC5wYXJlbnQ9dGhpcztmb3IodmFyIHE9dGhpcztudWxsIT1xOylxLmJvdW5kcz1rLnVuaW9uQWxsKFtxLmJvdW5kcyxwLmJvdW5kc10pLHE9cS5wYXJlbnR9O20ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihwKXtwPXRoaXMuZW50cmllcy5pbmRleE9mKHApO2lmKDA8PXApZm9yKHRoaXMuZW50cmllcy5zcGxpY2UocCwxKSxwPXRoaXM7bnVsbCE9cDspcC5ib3VuZHM9ay51bmlvbkFsbChwLmVudHJpZXMubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBxLmJvdW5kc30pKSwKcD1wLnBhcmVudDtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuc3VidHJlZT1mdW5jdGlvbihwKXtmb3IodmFyIHE9bnVsbCxyPTA7cjx0aGlzLmVudHJpZXMubGVuZ3RoO3IrKyl7dmFyIHQ9dGhpcy5lbnRyaWVzW3JdLHY9dC51bmlvbkFyZWFEaWZmZXJlbmNlKHApO2lmKEluZmluaXR5PnZ8fEluZmluaXR5PT09diYmbnVsbCE9cSYmdC5lbnRyaWVzLmxlbmd0aDxxLmVudHJpZXMubGVuZ3RoKXE9dH1yZXR1cm4gcX07bS5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24ocCl7bnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTt2YXIgcT1bbmV3IG0odGhpcy5sZWFmKSxuZXcgbSh0aGlzLmxlYWYpXTtwLnNwbGl0KHRoaXMuZW50cmllcyxxKTtwPW51bGwhPXRoaXMucGFyZW50P3RoaXMucGFyZW50Om5ldyBtKCExKTtwLmluc2VydChxWzBdKTtwLmluc2VydChxWzFdKTtyZXR1cm4gcH07bS5wcm90b3R5cGUudW5pb25BcmVhRGlmZmVyZW5jZT1mdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5hYnMoay51bmlvbih0aGlzLmJvdW5kcywKcCkuYXJlYSgpLXRoaXMuYm91bmRzLmFyZWEoKSl9O20ucHJvdG90eXBlLm1heERlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVhZj8xOjErdGhpcy5lbnRyaWVzLm1hcChmdW5jdGlvbihwKXtyZXR1cm4gcC5tYXhEZXB0aCgpfSkucmVkdWNlKGZ1bmN0aW9uKHAscSl7cmV0dXJuIE1hdGgubWF4KHAscSl9KX07cmV0dXJuIG19KCk7ZC5SVHJlZU5vZGU9bDt2YXIgaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG0ocCxxLHIsdCl7dGhpcy54bD1wO3RoaXMueWw9cTt0aGlzLnhoPXI7dGhpcy55aD10O3RoaXMud2lkdGg9dGhpcy54aC10aGlzLnhsO3RoaXMuaGVpZ2h0PXRoaXMueWgtdGhpcy55bH1tLnh5d2g9ZnVuY3Rpb24ocCxxLHIsdCl7cmV0dXJuIG5ldyBtKHAscSxwK3IscSt0KX07bS5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBtKHAueCxwLnkscC54K3Aud2lkdGgscC55K3AuaGVpZ2h0KX07bS5ib3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIG0ucG9pbnRQYWlyKHAudG9wTGVmdCwKcC5ib3R0b21SaWdodCl9O20ucG9pbnRQYWlyPWZ1bmN0aW9uKHAscSl7cmV0dXJuIG5ldyBtKE1hdGgubWluKHAueCxxLngpLE1hdGgubWluKHAueSxxLnkpLE1hdGgubWF4KHAueCxxLngpLE1hdGgubWF4KHAueSxxLnkpKX07bS5wb2ludHM9ZnVuY3Rpb24ocCl7aWYoMj5wLmxlbmd0aCl0aHJvdyBFcnJvcigibmVlZCBhdCBsZWFzdCAyIHBvaW50cyB0byBjcmVhdGUgYm91bmRzIik7dmFyIHE9cC5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIueH0pO3A9cC5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIueX0pO3JldHVybiBuZXcgbShxLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiBNYXRoLm1pbihyLHQpfSkscC5yZWR1Y2UoZnVuY3Rpb24ocix0KXtyZXR1cm4gTWF0aC5taW4ocix0KX0pLHEucmVkdWNlKGZ1bmN0aW9uKHIsdCl7cmV0dXJuIE1hdGgubWF4KHIsdCl9KSxwLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiBNYXRoLm1heChyLHQpfSkpfTttLnVuaW9uPWZ1bmN0aW9uKHAsCnEpe3JldHVybiBuZXcgbShNYXRoLm1pbihwLnhsLHEueGwpLE1hdGgubWluKHAueWwscS55bCksTWF0aC5tYXgocC54aCxxLnhoKSxNYXRoLm1heChwLnloLHEueWgpKX07bS51bmlvbkFsbD1mdW5jdGlvbihwKXtwPXAuZmlsdGVyKGZ1bmN0aW9uKHEpe3JldHVybiBudWxsIT1xfSk7cmV0dXJuIDA9PT1wLmxlbmd0aD9udWxsOnAucmVkdWNlKGZ1bmN0aW9uKHEscil7cmV0dXJuIG0udW5pb24ocSxyKX0pfTttLmlzQm91bmRzT3ZlcmxhcEJvdW5kcz1mdW5jdGlvbihwLHEpe3JldHVybiBtLmlzQm91bmRzT3ZlcmxhcFgocCxxKSYmbS5pc0JvdW5kc092ZXJsYXBZKHAscSl9O20uaXNCb3VuZHNPdmVybGFwWD1mdW5jdGlvbihwLHEpe3JldHVybiEocC54aDxxLnhsKSYmIShwLnhsPnEueGgpfTttLmlzQm91bmRzT3ZlcmxhcFk9ZnVuY3Rpb24ocCxxKXtyZXR1cm4hKHAueWg8cS55bCkmJiEocC55bD5xLnloKX07bS5wcm90b3R5cGUuYXJlYT1mdW5jdGlvbigpe251bGw9PXRoaXMuYXJlYUNhY2hlZCYmCih0aGlzLmFyZWFDYWNoZWQ9KHRoaXMueGgtdGhpcy54bCkqKHRoaXMueWgtdGhpcy55bCkpO3JldHVybiB0aGlzLmFyZWFDYWNoZWR9O20ucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLnhsPD1wLngmJnRoaXMueGg+PXAueCYmdGhpcy55bDw9cC55JiZ0aGlzLnloPj1wLnl9O3JldHVybiBtfSgpO2QuUlRyZWVCb3VuZHM9a30sZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZigpeyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LlNldD90aGlzLl9lczZTZXQ9bmV3IHdpbmRvdy5TZXQ6dGhpcy5fdmFsdWVzPVtdO3RoaXMuc2l6ZT0wfWYucHJvdG90eXBlLmFkZD1mdW5jdGlvbihnKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIHRoaXMuX2VzNlNldC5hZGQoZyksdGhpcy5zaXplPXRoaXMuX2VzNlNldC5zaXplLHRoaXM7dGhpcy5oYXMoZyl8fCh0aGlzLl92YWx1ZXMucHVzaChnKSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCk7CnJldHVybiB0aGlzfTtmLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oZyl7aWYobnVsbCE9dGhpcy5fZXM2U2V0KXJldHVybiBnPXRoaXMuX2VzNlNldC5kZWxldGUoZyksdGhpcy5zaXplPXRoaXMuX2VzNlNldC5zaXplLGc7Zz10aGlzLl92YWx1ZXMuaW5kZXhPZihnKTtyZXR1cm4tMSE9PWc/KHRoaXMuX3ZhbHVlcy5zcGxpY2UoZywxKSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCwhMCk6ITF9O2YucHJvdG90eXBlLmhhcz1mdW5jdGlvbihnKXtyZXR1cm4gbnVsbCE9dGhpcy5fZXM2U2V0P3RoaXMuX2VzNlNldC5oYXMoZyk6LTEhPT10aGlzLl92YWx1ZXMuaW5kZXhPZihnKX07Zi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihnLGwpe3ZhciBrPXRoaXM7bnVsbCE9dGhpcy5fZXM2U2V0P3RoaXMuX2VzNlNldC5mb3JFYWNoKGZ1bmN0aW9uKG0scCl7cmV0dXJuIGcuY2FsbChsLG0scCxrKX0sbCk6dGhpcy5fdmFsdWVzLmZvckVhY2goZnVuY3Rpb24obSl7Zy5jYWxsKGwsCm0sbSxrKX0pfTtyZXR1cm4gZn0oKTtkLlNldD1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoMTMxKSk7ZyhmKDEzMCkpfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGssbSl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9a31mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYoa1txXT1tW3FdKTtrLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihwLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgcCl9LGw9ZigyMSk7Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBtKHAscSl7dmFyIHI9ay5jYWxsKHRoaXMscCxxKXx8dGhpcztyLmNhY2hlPW5ldyBsLkNhY2hlKGZ1bmN0aW9uKHQpe3JldHVybiByLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlKHQpfSk7cmV0dXJuIHJ9ZyhtLGspO20ucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlPQpmdW5jdGlvbihwKXtyZXR1cm4gay5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXIuY2FsbCh0aGlzLHApfTttLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlcj1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXQocCl9O20ucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5jYWNoZS5jbGVhcigpfTtyZXR1cm4gbX0oZig2MSkuQ2hhcmFjdGVyTWVhc3VyZXIpO2QuQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihtLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbSl9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3JldHVybiBsLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8CnRoaXN9ZyhrLGwpO2sucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKG0pe3JldHVybiBsLnByb3RvdHlwZS5fbWVhc3VyZUxpbmUuY2FsbCh0aGlzLG0pfTtrLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24obSl7dmFyIHA9dGhpczttPW0uc3BsaXQoIiIpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcC5fbWVhc3VyZUNoYXJhY3RlcihxKX0pO3JldHVybntoZWlnaHQ6bS5yZWR1Y2UoZnVuY3Rpb24ocSxyKXtyZXR1cm4gTWF0aC5tYXgocSxyLmhlaWdodCl9LDApLHdpZHRoOm0ucmVkdWNlKGZ1bmN0aW9uKHEscil7cmV0dXJuIHErci53aWR0aH0sMCl9fTtyZXR1cm4ga30oZig2MykuTWVhc3VyZXIpO2QuQ2hhcmFjdGVyTWVhc3VyZXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDM2KSk7ZyhmKDYwKSk7ZyhmKDEzMikpO2coZig2MSkpO2coZig2MykpfSwKZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG0pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPWt9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKGtbcV09bVtxXSk7ay5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToocC5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IHApfSxsPWYoMzYpO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbShwLHEpe3ZvaWQgMD09PXEmJihxPSExKTtwPWsuY2FsbCh0aGlzLHApfHx0aGlzO3AudXNlR3VhcmRzPXE7cmV0dXJuIHB9ZyhtLGspO20ucHJvdG90eXBlLl9hZGRHdWFyZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIGwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCtwK2wuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVH07bS5wcm90b3R5cGUuX21lYXN1cmVMaW5lPWZ1bmN0aW9uKHApe3ZhciBxO3ZvaWQgMD09PXEmJihxPSExKTtxPXRoaXMudXNlR3VhcmRzfHwKcXx8L15bXHQgXSQvLnRlc3QocCk7cD1rLnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcyxxP3RoaXMuX2FkZEd1YXJkcyhwKTpwKTtwLndpZHRoLT1xPzIqdGhpcy5nZXRHdWFyZFdpZHRoKCk6MDtyZXR1cm4gcH07bS5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihwKXt2YXIgcT10aGlzO3ZvaWQgMD09PXAmJihwPWwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7aWYoIiI9PT1wLnRyaW0oKSlyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07cD1wLnRyaW0oKS5zcGxpdCgiXG4iKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHEuX21lYXN1cmVMaW5lKHIpfSk7cmV0dXJue2hlaWdodDpwLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiByK3QuaGVpZ2h0fSwwKSx3aWR0aDpwLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiBNYXRoLm1heChyLHQud2lkdGgpfSwwKX19O20ucHJvdG90eXBlLmdldEd1YXJkV2lkdGg9ZnVuY3Rpb24oKXtudWxsPT10aGlzLmd1YXJkV2lkdGgmJgoodGhpcy5ndWFyZFdpZHRoPWsucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzKS53aWR0aCk7cmV0dXJuIHRoaXMuZ3VhcmRXaWR0aH07cmV0dXJuIG19KGwuQWJzdHJhY3RNZWFzdXJlcik7ZC5NZWFzdXJlcj1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoMTM4KSk7ZyhmKDY1KSl9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDIxKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMubWF4TGluZXMoSW5maW5pdHkpO3RoaXMudGV4dFRyaW1taW5nKCk7dGhpcy5hbGxvd0JyZWFraW5nV29yZHMoKTt0aGlzLl90b2tlbml6ZXI9bmV3IGcuVG9rZW5pemVyO3RoaXMuX2JyZWFraW5nQ2hhcmFjdGVyPSItIn1sLnByb3RvdHlwZS5tYXhMaW5lcz1mdW5jdGlvbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9tYXhMaW5lczt0aGlzLl9tYXhMaW5lcz1rO3JldHVybiB0aGlzfTsKbC5wcm90b3R5cGUudGV4dFRyaW1taW5nPWZ1bmN0aW9uKCl7dGhpcy5fdGV4dFRyaW1taW5nPSJlbGxpcHNpcyJ9O2wucHJvdG90eXBlLmFsbG93QnJlYWtpbmdXb3Jkcz1mdW5jdGlvbigpe3RoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz0hMH07bC5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihrLG0scCxxKXt2YXIgcj10aGlzO3ZvaWQgMD09PXEmJihxPUluZmluaXR5KTt2YXIgdD17bm9Ccm9rZVdvcmRzOjAsbm9MaW5lczowLG9yaWdpbmFsVGV4dDprLHRydW5jYXRlZFRleHQ6IiIsd3JhcHBlZFRleHQ6IiJ9O3A9e2F2YWlsYWJsZUxpbmVzOk1hdGgubWluKE1hdGguZmxvb3IocS9tLm1lYXN1cmUoKS5oZWlnaHQpLHRoaXMuX21heExpbmVzKSxhdmFpbGFibGVXaWR0aDpwLGNhbkZpdFRleHQ6ITAsY3VycmVudExpbmU6IiIsd3JhcHBpbmc6dH07dmFyIHY9ay5zcGxpdCgiXG4iKTtyZXR1cm4gdi5yZWR1Y2UoZnVuY3Rpb24oQSx5LHgpe3JldHVybiByLmJyZWFrTGluZVRvRml0V2lkdGgoQSwKeSx4IT09di5sZW5ndGgtMSxtKX0scCkud3JhcHBpbmd9O2wucHJvdG90eXBlLmJyZWFrTGluZVRvRml0V2lkdGg9ZnVuY3Rpb24oayxtLHAscSl7dmFyIHI9dGhpcztrLmNhbkZpdFRleHR8fCIiPT09ay53cmFwcGluZy50cnVuY2F0ZWRUZXh0fHwoay53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz0iXG4iKTtrPXRoaXMuX3Rva2VuaXplci50b2tlbml6ZShtKS5yZWR1Y2UoZnVuY3Rpb24odCx2KXtyZXR1cm4gci53cmFwTmV4dFRva2VuKHYsdCxxKX0sayk7bT1nLlN0cmluZ01ldGhvZHMudHJpbUVuZChrLmN1cnJlbnRMaW5lKTtrLndyYXBwaW5nLm5vTGluZXMrPSsoIiIhPT1tKTtrLndyYXBwaW5nLm5vTGluZXM9PT1rLmF2YWlsYWJsZUxpbmVzJiYibm9uZSIhPT10aGlzLl90ZXh0VHJpbW1pbmcmJnA/ay5jYW5GaXRUZXh0PSExOmsud3JhcHBpbmcud3JhcHBlZFRleHQrPW07ay5jdXJyZW50TGluZT0iXG4iO3JldHVybiBrfTtsLnByb3RvdHlwZS5jYW5GaXRUb2tlbj1mdW5jdGlvbihrLAptLHApe3ZhciBxPXRoaXMscj10aGlzLl9hbGxvd0JyZWFraW5nV29yZHM/ay5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKHQsdil7cmV0dXJuIHYhPT1rLmxlbmd0aC0xP3QrcS5fYnJlYWtpbmdDaGFyYWN0ZXI6dH0pOltrXTtyZXR1cm4gcC5tZWFzdXJlKGspLndpZHRoPD1tfHxyLmV2ZXJ5KGZ1bmN0aW9uKHQpe3JldHVybiBwLm1lYXN1cmUodCkud2lkdGg8PW19KX07bC5wcm90b3R5cGUuYWRkRWxsaXBzaXM9ZnVuY3Rpb24oayxtLHApe2lmKCJub25lIj09PXRoaXMuX3RleHRUcmltbWluZylyZXR1cm57cmVtYWluaW5nVG9rZW46IiIsd3JhcHBlZFRva2VuOmt9O3ZhciBxPWsuc3Vic3RyaW5nKDApLnRyaW0oKSxyPXAubWVhc3VyZShxKS53aWR0aCx0PXAubWVhc3VyZSgiLi4uIikud2lkdGgsdj0wPGsubGVuZ3RoJiYiXG4iPT09a1swXT8iXG4iOiIiO2lmKG08PXQpcmV0dXJue3JlbWFpbmluZ1Rva2VuOmssd3JhcHBlZFRva2VuOnYrIi4uLiIuc3Vic3RyKDAsTWF0aC5mbG9vcihtLwoodC8zKSkpfTtmb3IoO3IrdD5tOylxPWcuU3RyaW5nTWV0aG9kcy50cmltRW5kKHEuc3Vic3RyKDAscS5sZW5ndGgtMSkpLHI9cC5tZWFzdXJlKHEpLndpZHRoO3JldHVybntyZW1haW5pbmdUb2tlbjpnLlN0cmluZ01ldGhvZHMudHJpbUVuZChrLnN1YnN0cmluZyhxLmxlbmd0aCksIi0iKS50cmltKCksd3JhcHBlZFRva2VuOnYrcSsiLi4uIn19O2wucHJvdG90eXBlLndyYXBOZXh0VG9rZW49ZnVuY3Rpb24oayxtLHApe2lmKCFtLmNhbkZpdFRleHR8fG0uYXZhaWxhYmxlTGluZXM9PT1tLndyYXBwaW5nLm5vTGluZXN8fCF0aGlzLmNhbkZpdFRva2VuKGssbS5hdmFpbGFibGVXaWR0aCxwKSlyZXR1cm4gdGhpcy5maW5pc2hXcmFwcGluZyhrLG0scCk7Zm9yKDtrOyl7dmFyIHE9dGhpcy5icmVha1Rva2VuVG9GaXRJbldpZHRoKGssbS5jdXJyZW50TGluZSxtLmF2YWlsYWJsZVdpZHRoLHApO20uY3VycmVudExpbmU9cS5saW5lO2s9cS5yZW1haW5pbmdUb2tlbjtpZihudWxsIT1rKWlmKG0ud3JhcHBpbmcubm9Ccm9rZVdvcmRzKz0KK3EuYnJlYWtXb3JkLCsrbS53cmFwcGluZy5ub0xpbmVzLG0uYXZhaWxhYmxlTGluZXM9PT1tLndyYXBwaW5nLm5vTGluZXMpe3A9dGhpcy5hZGRFbGxpcHNpcyhtLmN1cnJlbnRMaW5lLG0uYXZhaWxhYmxlV2lkdGgscCk7bS53cmFwcGluZy53cmFwcGVkVGV4dCs9cC53cmFwcGVkVG9rZW47bS53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1wLnJlbWFpbmluZ1Rva2VuK2s7bS5jdXJyZW50TGluZT0iXG4iO2JyZWFrfWVsc2UgbS53cmFwcGluZy53cmFwcGVkVGV4dCs9Zy5TdHJpbmdNZXRob2RzLnRyaW1FbmQobS5jdXJyZW50TGluZSksbS5jdXJyZW50TGluZT0iXG4ifXJldHVybiBtfTtsLnByb3RvdHlwZS5maW5pc2hXcmFwcGluZz1mdW5jdGlvbihrLG0scCl7bS5jYW5GaXRUZXh0JiZtLmF2YWlsYWJsZUxpbmVzIT09bS53cmFwcGluZy5ub0xpbmVzJiZ0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZz8ocD10aGlzLmFkZEVsbGlwc2lzKG0uY3VycmVudExpbmUrCmssbS5hdmFpbGFibGVXaWR0aCxwKSxtLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1wLndyYXBwZWRUb2tlbixtLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPXAucmVtYWluaW5nVG9rZW4sbS53cmFwcGluZy5ub0Jyb2tlV29yZHMrPSsocC5yZW1haW5pbmdUb2tlbi5sZW5ndGg8ay5sZW5ndGgpLG0ud3JhcHBpbmcubm9MaW5lcys9KygwPHAud3JhcHBlZFRva2VuLmxlbmd0aCksbS5jdXJyZW50TGluZT0iIik6bS53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1rO20uY2FuRml0VGV4dD0hMTtyZXR1cm4gbX07bC5wcm90b3R5cGUuYnJlYWtUb2tlblRvRml0SW5XaWR0aD1mdW5jdGlvbihrLG0scCxxKXtpZih2b2lkIDA9PT1yKXZhciByPXRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyO2lmKHEubWVhc3VyZShtK2spLndpZHRoPD1wKXJldHVybnticmVha1dvcmQ6ITEsbGluZTptK2sscmVtYWluaW5nVG9rZW46bnVsbH07aWYoIiI9PT1rLnRyaW0oKSlyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6bSwKcmVtYWluaW5nVG9rZW46IiJ9O2lmKCF0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMpcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOm0scmVtYWluaW5nVG9rZW46a307Zm9yKHZhciB0PTA7dDxrLmxlbmd0aDspaWYocS5tZWFzdXJlKG0ray5zdWJzdHJpbmcoMCx0KzEpK3IpLndpZHRoPD1wKSsrdDtlbHNlIGJyZWFrO3A9IiI7MDx0JiYocD1yKTtyZXR1cm57YnJlYWtXb3JkOjA8dCxsaW5lOm0ray5zdWJzdHJpbmcoMCx0KStwLHJlbWFpbmluZ1Rva2VuOmsuc3Vic3RyaW5nKHQpfX07cmV0dXJuIGx9KCk7ZC5XcmFwcGVyPWN9LGZ1bmN0aW9uKGMsZCxmKXsoZnVuY3Rpb24oZyl7Zm9yKHZhciBsIGluIGcpZC5oYXNPd25Qcm9wZXJ0eShsKXx8KGRbbF09Z1tsXSl9KShmKDEzOSkpfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoNzIpKTtnKGYoNzMpKTtnKGYoMjgpKX0sZnVuY3Rpb24oYywKZCl7ZC52ZXJzaW9uPSIzLjcuMCJ9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKHgsQyl7cmV0dXJuIHguZWFjaChmdW5jdGlvbigpe3ZhciBGPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9eS5zZWxlY3QodGhpcyksQjtmb3IoQiBpbiBGKUQuYXR0cihCLEZbQl0pfSl9ZnVuY3Rpb24gbCh4LEMpe2Zvcih2YXIgRiBpbiBDKXguYXR0cihGLENbRl0pO3JldHVybiB4fWZ1bmN0aW9uIGsoeCxDLEYpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRD1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxCPXkuc2VsZWN0KHRoaXMpLEc7Zm9yKEcgaW4gRClCLnN0eWxlKEcsRFtHXSxGKX0pfWZ1bmN0aW9uIG0oeCxDLEYpe2Zvcih2YXIgRCBpbiBDKXguc3R5bGUoRCxDW0RdLEYpO3JldHVybiB4fWZ1bmN0aW9uIHAoeCxDKXtyZXR1cm4geC5lYWNoKGZ1bmN0aW9uKCl7dmFyIEY9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD15LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEYpRC5wcm9wZXJ0eShCLApGW0JdKX0pfWZ1bmN0aW9uIHEoeCxDKXtmb3IodmFyIEYgaW4gQyl4LnByb3BlcnR5KEYsQ1tGXSk7cmV0dXJuIHh9ZnVuY3Rpb24gcih4LEMpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRj1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXkuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oeCksQjtmb3IoQiBpbiBGKUQuYXR0cihCLEZbQl0pfSl9ZnVuY3Rpb24gdCh4LEMpe2Zvcih2YXIgRiBpbiBDKXguYXR0cihGLENbRl0pO3JldHVybiB4fWZ1bmN0aW9uIHYoeCxDLEYpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRD1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxCPXkuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oeCksRztmb3IoRyBpbiBEKUIuc3R5bGUoRyxEW0ddLEYpfSl9ZnVuY3Rpb24gQSh4LEMsRil7Zm9yKHZhciBEIGluIEMpeC5zdHlsZShELENbRF0sRik7cmV0dXJuIHh9dmFyIHk9Yz1mKDEpO3kuc2VsZWN0aW9uLnByb3RvdHlwZS5hdHRycz1mdW5jdGlvbih4KXtyZXR1cm4oImZ1bmN0aW9uIj09PQp0eXBlb2YgeD9nOmwpKHRoaXMseCl9O3kuc2VsZWN0aW9uLnByb3RvdHlwZS5zdHlsZXM9ZnVuY3Rpb24oeCl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2YgeD9rOm0pKHRoaXMseCwiIil9O3kuc2VsZWN0aW9uLnByb3RvdHlwZS5wcm9wZXJ0aWVzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHg/cDpxKSh0aGlzLHgpfTtjLnRyYW5zaXRpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHg/cjp0KSh0aGlzLHgpfTtjLnRyYW5zaXRpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih4KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB4P3Y6QSkodGhpcyx4LCIiKX19LGZ1bmN0aW9uKGMsZCxmKXtjPWYoMTE3KTt2YXIgZz1mKDEyKTtmPWYoMTApO3ZhciBsPXtsaW5lYXI6Yy5lYXNlTGluZWFyLHF1YWQ6Yy5lYXNlUXVhZCxxdWFkSW46Yy5lYXNlUXVhZEluLHF1YWRPdXQ6Yy5lYXNlUXVhZE91dCwKcXVhZEluT3V0OmMuZWFzZVF1YWRJbk91dCxjdWJpYzpjLmVhc2VDdWJpYyxjdWJpY0luOmMuZWFzZUN1YmljSW4sY3ViaWNPdXQ6Yy5lYXNlQ3ViaWNPdXQsY3ViaWNJbk91dDpjLmVhc2VDdWJpY0luT3V0LHBvbHk6Yy5lYXNlUG9seSxwb2x5SW46Yy5lYXNlUG9seUluLHBvbHlPdXQ6Yy5lYXNlUG9seU91dCxwb2x5SW5PdXQ6Yy5lYXNlUG9seUluT3V0LHNpbjpjLmVhc2VTaW4sc2luSW46Yy5lYXNlU2luSW4sc2luT3V0OmMuZWFzZVNpbk91dCxzaW5Jbk91dDpjLmVhc2VTaW5Jbk91dCxleHA6Yy5lYXNlRXhwLGV4cEluOmMuZWFzZUV4cEluLGV4cE91dDpjLmVhc2VFeHBPdXQsZXhwSW5PdXQ6Yy5lYXNlRXhwSW5PdXQsY2lyY2xlOmMuZWFzZUNpcmNsZSxjaXJjbGVJbjpjLmVhc2VDaXJjbGVJbixjaXJjbGVPdXQ6Yy5lYXNlQ2lyY2xlT3V0LGNpcmNsZUluT3V0OmMuZWFzZUNpcmNsZUluT3V0LGJvdW5jZTpjLmVhc2VCb3VuY2UsYm91bmNlSW46Yy5lYXNlQm91bmNlSW4sYm91bmNlT3V0OmMuZWFzZUJvdW5jZU91dCwKYm91bmNlSW5PdXQ6Yy5lYXNlQm91bmNlSW5PdXQsYmFjazpjLmVhc2VCYWNrLGJhY2tJbjpjLmVhc2VCYWNrSW4sYmFja091dDpjLmVhc2VCYWNrT3V0LGJhY2tJbk91dDpjLmVhc2VCYWNrSW5PdXQsZWxhc3RpYzpjLmVhc2VFbGFzdGljLGVsYXN0aWNJbjpjLmVhc2VFbGFzdGljSW4sZWxhc3RpY091dDpjLmVhc2VFbGFzdGljT3V0LGVsYXN0aWNJbk91dDpjLmVhc2VFbGFzdGljSW5PdXR9O2QuRWFzZU5hbWU9Zi5tYWtlRW51bSgibGluZWFyIHF1YWQgcXVhZEluIHF1YWRPdXQgcXVhZEluT3V0IGN1YmljIGN1YmljSW4gY3ViaWNPdXQgY3ViaWNJbk91dCBwb2x5IHBvbHlJbiBwb2x5T3V0IHBvbHlJbk91dCBzaW4gc2luSW4gc2luT3V0IHNpbkluT3V0IGV4cCBleHBJbiBleHBPdXQgZXhwSW5PdXQgY2lyY2xlIGNpcmNsZUluIGNpcmNsZU91dCBjaXJjbGVJbk91dCBib3VuY2UgYm91bmNlSW4gYm91bmNlT3V0IGJvdW5jZUluT3V0IGJhY2sgYmFja0luIGJhY2tPdXQgYmFja0luT3V0IGVsYXN0aWMgZWxhc3RpY0luIGVsYXN0aWNPdXQgZWxhc3RpY0luT3V0Ii5zcGxpdCgiICIpKTsKZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt0aGlzLl9zdGFydERlbGF5PWsuX0RFRkFVTFRfU1RBUlRfREVMQVlfTUlMTElTRUNPTkRTO3RoaXMuX3N0ZXBEdXJhdGlvbj1rLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTO3RoaXMuX3N0ZXBEZWxheT1rLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1rLl9ERUZBVUxUX01BWF9UT1RBTF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fZWFzaW5nTW9kZT1rLl9ERUZBVUxUX0VBU0lOR19NT0RFfWsucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbihtKXt2YXIgcD10aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KG0pO3JldHVybiB0aGlzLnN0YXJ0RGVsYXkoKStwKk1hdGgubWF4KG0tMSwwKSt0aGlzLnN0ZXBEdXJhdGlvbigpfTtrLnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKG0scCl7dmFyIHE9dGhpczttPWcuY29lcmNlRXh0ZXJuYWxEMyhtKTsKdmFyIHI9bS5zaXplKCksdD10aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KHIpO3JldHVybiBtLnRyYW5zaXRpb24oKS5lYXNlKHRoaXMuX2dldEVhc2VGYWN0b3J5KCkpLmR1cmF0aW9uKHRoaXMuc3RlcER1cmF0aW9uKCkpLmRlbGF5KGZ1bmN0aW9uKHYsQSl7cmV0dXJuIHEuc3RhcnREZWxheSgpK3QqQX0pLmF0dHJzKHApfTtrLnByb3RvdHlwZS5zdGFydERlbGF5PWZ1bmN0aW9uKG0pe2lmKG51bGw9PW0pcmV0dXJuIHRoaXMuX3N0YXJ0RGVsYXk7dGhpcy5fc3RhcnREZWxheT1tO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5zdGVwRHVyYXRpb249ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gTWF0aC5taW4odGhpcy5fc3RlcER1cmF0aW9uLHRoaXMuX21heFRvdGFsRHVyYXRpb24pO3RoaXMuX3N0ZXBEdXJhdGlvbj1tO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5zdGVwRGVsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RlcERlbGF5fTtrLnByb3RvdHlwZS5tYXhUb3RhbER1cmF0aW9uPQpmdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9tYXhUb3RhbER1cmF0aW9uO3RoaXMuX21heFRvdGFsRHVyYXRpb249bTtyZXR1cm4gdGhpc307ay5wcm90b3R5cGUuZWFzaW5nTW9kZT1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9lYXNpbmdNb2RlO3RoaXMuX2Vhc2luZ01vZGU9bTtyZXR1cm4gdGhpc307ay5wcm90b3R5cGUuX2dldEVhc2VGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIG09dGhpcy5lYXNpbmdNb2RlKCk7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgbT8obT1sW21dLG51bGw9PW0/bC5saW5lYXI6bSk6bX07ay5wcm90b3R5cGUuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXk9ZnVuY3Rpb24obSl7dmFyIHA9dGhpcy5tYXhUb3RhbER1cmF0aW9uKCktdGhpcy5zdGVwRHVyYXRpb24oKTtwPU1hdGgubWF4KHAsMCk7bT1wL01hdGgubWF4KG0tMSwxKTtyZXR1cm4gTWF0aC5taW4odGhpcy5zdGVwRGVsYXkoKSxtKX07cmV0dXJuIGt9KCk7Zi5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM9CjA7Zi5fREVGQVVMVF9TVEVQX0RVUkFUSU9OX01JTExJU0VDT05EUz0zMDA7Zi5fREVGQVVMVF9JVEVSQVRJVkVfREVMQVlfTUlMTElTRUNPTkRTPTE1O2YuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUz1JbmZpbml0eTtmLl9ERUZBVUxUX0VBU0lOR19NT0RFPSJleHBPdXQiO2QuRWFzaW5nPWZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDEyKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe31sLnByb3RvdHlwZS50b3RhbFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gMH07bC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihrLG0pe2s9Zy5jb2VyY2VFeHRlcm5hbEQzKGspO3JldHVybiBrLmF0dHJzKG0pfTtyZXR1cm4gbH0oKTtkLk51bGw9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihyLHQpe2Z1bmN0aW9uIHYoKXt0aGlzLmNvbnN0cnVjdG9yPXJ9Zm9yKHZhciBBIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShBKSYmCihyW0FdPXRbQV0pO3IucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KHYucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyB2KX0sbD1mKDEpLGs9Zig1KSxtPWYoNCkscD1mKDApLHE9ZigyMik7Yz1mdW5jdGlvbihyKXtmdW5jdGlvbiB0KHYsQSl7dm9pZCAwPT09QSYmKEE9ImJvdHRvbSIpO3Y9ci5jYWxsKHRoaXMsdixBKXx8dGhpczt2Ll90aWNrTGFiZWxBbmdsZT0wO3YuX3RpY2tMYWJlbFNoZWFyQW5nbGU9MDt2LmFkZENsYXNzKCJjYXRlZ29yeS1heGlzIik7cmV0dXJuIHZ9Zyh0LHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiX3dyYXBwZXIiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdj1uZXcgay5XcmFwcGVyO251bGwhPXRoaXMuX3RpY2tMYWJlbE1heExpbmVzJiZ2Lm1heExpbmVzKHRoaXMuX3RpY2tMYWJlbE1heExpbmVzKTtyZXR1cm4gdn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsCiJfd3JpdGVyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrLldyaXRlcih0aGlzLl9tZWFzdXJlcix0aGlzLl90eXBlc2V0dGVyQ29udGV4dCx0aGlzLl93cmFwcGVyKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTt0LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtyLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90eXBlc2V0dGVyQ29udGV4dD1uZXcgay5TdmdDb250ZXh0KHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyBrLkNhY2hlTWVhc3VyZXIodGhpcy5fdHlwZXNldHRlckNvbnRleHQpfTt0LnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlZHJhdygpfTt0LnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih2LEEpe3ZhciB5PXRoaXMuaXNIb3Jpem9udGFsKCk/MDp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCkseD10aGlzLmlzSG9yaXpvbnRhbCgpPwp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCk6MDtpZigwPT09dGhpcy5fc2NhbGUuZG9tYWluKCkubGVuZ3RoKXJldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfTtpZih0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKXt2YXIgQz10aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpO3RoaXMuaXNIb3Jpem9udGFsKCk/eCs9Qzp5Kz1DfXY9dGhpcy5fbWVhc3VyZVRpY2tMYWJlbHModixBKTtyZXR1cm57bWluV2lkdGg6di51c2VkV2lkdGgreSxtaW5IZWlnaHQ6di51c2VkSGVpZ2h0K3h9fTt0LnByb3RvdHlwZS5fY29yZVNpemU9ZnVuY3Rpb24oKXt2YXIgdj10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLEE9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKS5taW5IZWlnaHQ6dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0aGlzLndpZHRoKCksCnRoaXMuaGVpZ2h0KCkpLm1pbldpZHRoLHk9dGhpcy5tYXJnaW4oKSt0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpO3JldHVybiBNYXRoLm1pbihBLXksdil9O3QucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RG93bnNhbXBsZUluZm8oKS5kb21haW59O3QucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHYsQSl7cmV0dXJuIG0uQ29tcG9uZW50LnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMsdixBKX07dC5wcm90b3R5cGUuZ2V0RG93bnNhbXBsZUluZm89ZnVuY3Rpb24odil7dmFyIEE7dm9pZCAwPT09diYmKHY9dGhpcy5fc2NhbGUpO3ZvaWQgMD09PUEmJihBPXYuaW52ZXJ0UmFuZ2UoKSk7dmFyIHk9TWF0aC5jZWlsKHQuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYKigwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/MToxL01hdGguY29zKHRoaXMuX3RpY2tMYWJlbFNoZWFyQW5nbGUvMTgwKk1hdGguUEkpKS8Kdi5zdGVwV2lkdGgoKSk7cmV0dXJue2RvbWFpbjpBLmZpbHRlcihmdW5jdGlvbih4LEMpe3JldHVybiAwPT09QyV5fSksc3RlcFdpZHRoOnkqdi5zdGVwV2lkdGgoKX19O3QucHJvdG90eXBlLnRpY2tMYWJlbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbEFuZ2xlO3Rocm93IEVycm9yKCJBbmdsZSB1bmRlZmluZWQgbm90IHN1cHBvcnRlZDsgb25seSAwLCA5MCwgYW5kIC05MCBhcmUgdmFsaWQgdmFsdWVzIik7fTt0LnByb3RvdHlwZS50aWNrTGFiZWxTaGVhckFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbFNoZWFyQW5nbGV9O3QucHJvdG90eXBlLnRpY2tMYWJlbE1heFdpZHRoPWZ1bmN0aW9uKHYpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhXaWR0aDt0aGlzLl90aWNrTGFiZWxNYXhXaWR0aD12O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLnRpY2tMYWJlbE1heExpbmVzPQpmdW5jdGlvbih2KXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdGlja0xhYmVsTWF4TGluZXM7dGhpcy5fdGlja0xhYmVsTWF4TGluZXM9djt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5fdGlja1NwYWNlUmVxdWlyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCl9O3QucHJvdG90eXBlLl9kcmF3VGlja3M9ZnVuY3Rpb24odixBKXt2YXIgeT10aGlzO3N3aXRjaCh0aGlzLnRpY2tMYWJlbEFuZ2xlKCkpe2Nhc2UgMDp2YXIgeD17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTt2YXIgQz17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6ImJvdHRvbSIsYm90dG9tOiJ0b3AifTticmVhaztjYXNlIDkwOng9e2xlZnQ6ImNlbnRlciIscmlnaHQ6ImNlbnRlciIsdG9wOiJyaWdodCIsYm90dG9tOiJsZWZ0In07CkM9e2xlZnQ6InRvcCIscmlnaHQ6ImJvdHRvbSIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn07YnJlYWs7Y2FzZSAtOTA6eD17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6ImxlZnQiLGJvdHRvbToicmlnaHQifSxDPXtsZWZ0OiJib3R0b20iLHJpZ2h0OiJ0b3AiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9fUEuZWFjaChmdW5jdGlvbihGKXt2YXIgRD1sLnNlbGVjdCh0aGlzKSxCPXkuaXNIb3Jpem9udGFsKCk/djp5LndpZHRoKCkteS5fdGlja1NwYWNlUmVxdWlyZWQoKSxHPXkuaXNIb3Jpem9udGFsKCk/eS5oZWlnaHQoKS15Ll90aWNrU3BhY2VSZXF1aXJlZCgpOnYsSz17eEFsaWduOnhbeS5vcmllbnRhdGlvbigpXSx5QWxpZ246Q1t5Lm9yaWVudGF0aW9uKCldLHRleHRSb3RhdGlvbjp5LnRpY2tMYWJlbEFuZ2xlKCksdGV4dFNoZWFyOnkudGlja0xhYmVsU2hlYXJBbmdsZSgpfTtpZihudWxsIT15Ll90aWNrTGFiZWxNYXhXaWR0aCl7aWYoImxlZnQiPT09Cnkub3JpZW50YXRpb24oKSYmQj55Ll90aWNrTGFiZWxNYXhXaWR0aCl7dmFyIEw9Qi15Ll90aWNrTGFiZWxNYXhXaWR0aDtMPUQuYXR0cigidHJhbnNmb3JtIikrIiB0cmFuc2xhdGUoIitMKyIsIDApIjtELmF0dHIoInRyYW5zZm9ybSIsTCl9Qj1NYXRoLm1pbihCLHkuX3RpY2tMYWJlbE1heFdpZHRoKX15Ll93cml0ZXIud3JpdGUoeS5mb3JtYXR0ZXIoKShGKSxCLEcsSyxELm5vZGUoKSl9KX07dC5wcm90b3R5cGUuX21lYXN1cmVUaWNrTGFiZWxzPWZ1bmN0aW9uKHYsQSl7dmFyIHk9dGhpcyx4PXRoaXMuX3NjYWxlLmNsb25lV2l0aG91dFByb3ZpZGVycygpLnJhbmdlKFswLHRoaXMuaXNIb3Jpem9udGFsKCk/djpBXSksQz10aGlzLmdldERvd25zYW1wbGVJbmZvKHgpO3g9Qy5kb21haW47Qz1DLnN0ZXBXaWR0aDt2YXIgRj12LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk7dGhpcy5pc0hvcml6b250YWwoKSYmKEY9QywwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihGPUEtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksCkY9TWF0aC5tYXgoRiwwKSk7dmFyIEQ9Qzt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRD1BLXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCksMCE9PXRoaXMuX3RpY2tMYWJlbEFuZ2xlJiYoRD12LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkpLEQ9TWF0aC5tYXgoRCwwKSk7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihGPU1hdGgubWluKEYsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTtBPXgubWFwKGZ1bmN0aW9uKEIpe3JldHVybiB5Ll93cmFwcGVyLndyYXAoeS5mb3JtYXR0ZXIoKShCKSx5Ll9tZWFzdXJlcixGLEQpfSk7dj10aGlzLmlzSG9yaXpvbnRhbCgpJiYwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/bC5zdW06cC5NYXRoLm1heDt4PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT9wLk1hdGgubWF4Omwuc3VtO3Y9dihBLGZ1bmN0aW9uKEIpe3JldHVybiB5Ll9tZWFzdXJlci5tZWFzdXJlKEIud3JhcHBlZFRleHQpLndpZHRofSwwKTsKQT14KEEsZnVuY3Rpb24oQil7cmV0dXJuIHkuX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkuaGVpZ2h0fSwwKTswIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihBPVtBLHZdLHY9QVswXSxBPUFbMV0pO3JldHVybnt1c2VkV2lkdGg6dix1c2VkSGVpZ2h0OkF9fTt0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB2PXRoaXM7ci5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgQT10aGlzLl9zY2FsZSx5PXRoaXMuZ2V0RG93bnNhbXBsZUluZm8oQSkseD15LmRvbWFpbixDPXk9eS5zdGVwV2lkdGg7dGhpcy5pc0hvcml6b250YWwoKSYmbnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihDPU1hdGgubWluKEMsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTt4PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKHgpO3ZhciBGPXguZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTLAohMCkubWVyZ2UoeCk7eC5leGl0KCkucmVtb3ZlKCk7Ri5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKEQpe3ZhciBCPUEuc2NhbGUoRCktQy8yO0Q9di5pc0hvcml6b250YWwoKT9COjA7Qj12LmlzSG9yaXpvbnRhbCgpPzA6QjtyZXR1cm4idHJhbnNsYXRlKCIrRCsiLCIrQisiKSJ9KTtGLnRleHQoIiIpO3RoaXMuX2RyYXdUaWNrcyh5LEYpO3k9InJpZ2h0Ij09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjA7eD0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjA7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3krIiwiK3grIikiKTt0aGlzLl9zaG93QWxsVGlja01hcmtzKCk7dGhpcy5fc2hvd0FsbFRpY2tMYWJlbHMoKTt0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHYsQSx5KXtyLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx2LEEseSk7dGhpcy5pc0hvcml6b250YWwoKXx8dGhpcy5fc2NhbGUucmFuZ2UoWzAsdGhpcy5oZWlnaHQoKV0pO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtyLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdH0ocS5BeGlzKTtjLl9NSU5JTVVNX1dJRFRIX1BFUl9MQUJFTF9QWD0xNTtkLkNhdGVnb3J5PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocix0KXtmdW5jdGlvbiB2KCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfWZvcih2YXIgQSBpbiB0KXQuaGFzT3duUHJvcGVydHkoQSkmJihyW0FdPXRbQV0pO3IucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KHYucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyB2KX0sCmw9ZigxKSxrPWYoNSksbT1mKDgpLHA9ZigwKSxxPWYoMjIpO2M9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gdCh2LEEpe3Y9ci5jYWxsKHRoaXMsdixBKXx8dGhpczt2Ll90aWNrTGFiZWxQb3NpdGlvbmluZz0iY2VudGVyIjt2Ll91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj0hMTt2LmZvcm1hdHRlcihtLmdlbmVyYWwoKSk7cmV0dXJuIHZ9Zyh0LHIpO3QucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3IucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3ZhciB2PW5ldyBrLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSxxLkF4aXMuVElDS19MQUJFTF9DTEFTUyk7dGhpcy5fbWVhc3VyZXI9bmV3IGsuQ2FjaGVNZWFzdXJlcih2KTt0aGlzLl93cmFwcGVyPShuZXcgay5XcmFwcGVyKS5tYXhMaW5lcygxKX07dC5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3ZhciB2PXRoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uP3RoaXMuX2NvbXB1dGVBcHByb3hpbWF0ZVRleHRXaWR0aCgpOgp0aGlzLl9jb21wdXRlRXhhY3RUZXh0V2lkdGgoKTtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3Y6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdil9O3QucHJvdG90eXBlLl9jb21wdXRlRXhhY3RUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgdj10aGlzLEE9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLm1hcChmdW5jdGlvbih5KXt5PXYuZm9ybWF0dGVyKCkoeSk7cmV0dXJuIHYuX21lYXN1cmVyLm1lYXN1cmUoeSkud2lkdGh9KTtyZXR1cm4gcC5NYXRoLm1heChBLDApfTt0LnByb3RvdHlwZS5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcyxBPXRoaXMuX2dldFRpY2tWYWx1ZXMoKSx5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoIk0iKS53aWR0aDtBPUEubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB2LmZvcm1hdHRlcigpKHgpLmxlbmd0aCoKeX0pO3JldHVybiBwLk1hdGgubWF4KEEsMCl9O3QucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3Y6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdil9O3QucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5fc2NhbGUsQT12LmRvbWFpbigpLHk9QVswXTw9QVsxXT9BWzBdOkFbMV0seD1BWzBdPj1BWzFdP0FbMF06QVsxXTtyZXR1cm4gdi50aWNrcygpLmZpbHRlcihmdW5jdGlvbihDKXtyZXR1cm4gQz49eSYmQzw9eH0pfTt0LnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX2lzU2V0dXApe2lmKCF0aGlzLmlzSG9yaXpvbnRhbCgpKXt2YXIgdj0KdGhpcy5fY29tcHV0ZVdpZHRoKCk7aWYodj50aGlzLndpZHRoKCl8fHY8dGhpcy53aWR0aCgpLXRoaXMubWFyZ2luKCkpe3RoaXMucmVkcmF3KCk7cmV0dXJufX10aGlzLnJlbmRlcigpfX07dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdj10aGlzO3IucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dmFyIEE9e3g6MCx5OjAsZHg6IjBlbSIsZHk6IjAuM2VtIn0seT10aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx4PXRoaXMudGlja0xhYmVsUGFkZGluZygpLEM9Im1pZGRsZSIsRj0wLEQ9MCxCPTAsRz0wO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJsZWZ0IjpDPSJlbmQiO0Y9LXg7Rz14O2JyZWFrO2Nhc2UgImNlbnRlciI6Rz15K3g7YnJlYWs7Y2FzZSAicmlnaHQiOkM9InN0YXJ0IixHPUY9eH1lbHNlIHN3aXRjaCh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyl7Y2FzZSAidG9wIjpBLmR5PQoiLTAuM2VtIjtCPXg7RD0teDticmVhaztjYXNlICJjZW50ZXIiOkI9eSt4O2JyZWFrO2Nhc2UgImJvdHRvbSI6QS5keT0iMWVtIixEPUI9eH15PXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6QS54PXkueDE7QS5keT0iMC45NWVtIjtEPXkueTErRzticmVhaztjYXNlICJ0b3AiOkEueD15LngxO0EuZHk9Ii0uMjVlbSI7RD15LnkxLUc7YnJlYWs7Y2FzZSAibGVmdCI6Qz0iZW5kIjtGPXkueDEtQjtBLnk9eS55MTticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEY9eS54MStCLEEueT15LnkxfUI9dGhpcy5fZ2V0VGlja1ZhbHVlcygpO0I9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoQik7Qi5leGl0KCkucmVtb3ZlKCk7Qi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZShCKS5zdHlsZSgidGV4dC1hbmNob3IiLEMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpLmF0dHJzKEEpLnRleHQoZnVuY3Rpb24oSyl7cmV0dXJuIHYuZm9ybWF0dGVyKCkoSyl9KTt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrRisiLCAiK0QrIikiKTt0aGlzLl9zaG93QWxsVGlja01hcmtzKCk7dGhpcy5zaG93RW5kVGlja0xhYmVscygpfHx0aGlzLl9oaWRlRW5kVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVyZmxvd2luZ1RpY2tMYWJlbHMoKTt0aGlzLl9oaWRlT3ZlcmxhcHBpbmdUaWNrTGFiZWxzKCk7ImNlbnRlciIhPT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyYmdGhpcy5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbCgpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS50aWNrTGFiZWxQb3NpdGlvbj1mdW5jdGlvbih2KXtpZihudWxsPT12KXJldHVybiB0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZzsKdj12LnRvTG93ZXJDYXNlKCk7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYoImxlZnQiIT09diYmImNlbnRlciIhPT12JiYicmlnaHQiIT09dil0aHJvdyBFcnJvcih2KyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSBob3Jpem9udGFsIE51bWVyaWNBeGlzIik7fWVsc2UgaWYoInRvcCIhPT12JiYiY2VudGVyIiE9PXYmJiJib3R0b20iIT09dil0aHJvdyBFcnJvcih2KyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSB2ZXJ0aWNhbCBOdW1lcmljQXhpcyIpO3RoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nPXY7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb249ZnVuY3Rpb24oKXt0aGlzLl91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj0hMH07dC5wcm90b3R5cGUuX2hpZGVFbmRUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLApBPXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKTtpZigwIT09QS5zaXplKCkpe3ZhciB5PUEubm9kZXMoKVswXTtwLkRPTS5jbGllbnRSZWN0SW5zaWRlKHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdil8fGwuc2VsZWN0KHkpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7QT1BLm5vZGVzKClbQS5zaXplKCktMV07cC5ET00uY2xpZW50UmVjdEluc2lkZShBLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHYpfHxsLnNlbGVjdChBKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfX07dC5wcm90b3R5cGUuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHY9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciB4PWwuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuImluaGVyaXQiPT09Cnh8fCJ2aXNpYmxlIj09PXh9KSxBPXYubm9kZXMoKS5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KSx5PTE7IXRoaXMuX2hhc092ZXJsYXBXaXRoSW50ZXJ2YWwoeSxBKSYmeTxBLmxlbmd0aDspeSs9MTt2LmVhY2goZnVuY3Rpb24oeCxDKXt4PWwuc2VsZWN0KHRoaXMpOzAhPT1DJXkmJnguc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTt0LnByb3RvdHlwZS5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbD1mdW5jdGlvbih2LEEpe3ZhciB5PSJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6Myp0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtBPUEubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBwLkRPTS5leHBhbmRSZWN0KEMseSl9KTtmb3IodmFyIHg9MDt4PEEubGVuZ3RoLXY7eCs9dilpZihwLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoQVt4XSxBW3grdl0pKXJldHVybiExO3JldHVybiEwfTsKdC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7ci5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHR9KHEuQXhpcyk7ZC5OdW1lcmljPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihtW3JdPXBbcl0pO20ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX07Yz1mKDQyKTt2YXIgbD1mKDI1KSxrPWYoMCk7Zj1mdW5jdGlvbihtKXtmdW5jdGlvbiBwKHEpe2Z1bmN0aW9uIHIoKXt4JiYoeD0hMSx5Ll9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeSkpfWZ1bmN0aW9uIHQoQyxGKXt4JiYoeS5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGUoeS5faXNWZXJ0aWNhbCgpPwpGLng6Ri55KSx5Ll9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeSkpfWZ1bmN0aW9uIHYoQyl7QShDKSYmKHg9ITAseS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeSkpfWZ1bmN0aW9uIEEoQyl7cmV0dXJuIHkuX2lzVmVydGljYWwoKSYmeS5waXhlbFBvc2l0aW9uKCkteS5kZXRlY3Rpb25SYWRpdXMoKTw9Qy54JiZDLng8PXkucGl4ZWxQb3NpdGlvbigpK3kuZGV0ZWN0aW9uUmFkaXVzKCl8fCF5Ll9pc1ZlcnRpY2FsKCkmJnkucGl4ZWxQb3NpdGlvbigpLXkuZGV0ZWN0aW9uUmFkaXVzKCk8PUMueSYmQy55PD15LnBpeGVsUG9zaXRpb24oKSt5LmRldGVjdGlvblJhZGl1cygpfXZhciB5PW0uY2FsbCh0aGlzLHEpfHx0aGlzO3kuX2RldGVjdGlvblJhZGl1cz0zO3kuX2VuYWJsZWQ9ITA7eS5hZGRDbGFzcygiZHJhZy1saW5lLWxheWVyIik7eS5hZGRDbGFzcygiZW5hYmxlZCIpO3kuX2RyYWdJbnRlcmFjdGlvbj1uZXcgbC5EcmFnO3kuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh5KTsKdmFyIHg9ITE7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KHYpO3kuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcodCk7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChyKTt5Ll9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KHYpO3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHQpO3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKHIpO3kuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07eS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3kuX2RyYWdDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7eS5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtyZXR1cm4geX1nKHAsbSk7cC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7bS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fZGV0ZWN0aW9uRWRnZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCwKc3Ryb2tlOiJwaW5rIiwicG9pbnRlci1ldmVudHMiOiJ2aXNpYmxlU3Ryb2tlIn0pLmNsYXNzZWQoImRyYWctZWRnZSIsITApfTtwLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fZGV0ZWN0aW9uRWRnZS5hdHRycyh7eDE6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOjAseTE6dGhpcy5faXNWZXJ0aWNhbCgpPzA6dGhpcy5waXhlbFBvc2l0aW9uKCkseDI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOnRoaXMud2lkdGgoKSx5Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLnBpeGVsUG9zaXRpb24oKSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfTsKcC5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9lbmFibGVkOyh0aGlzLl9lbmFibGVkPXEpP3RoaXMuYWRkQ2xhc3MoImVuYWJsZWQiKTp0aGlzLnJlbW92ZUNsYXNzKCJlbmFibGVkIik7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHEpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQocSl9O3AucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChxKX07CnAucHJvdG90eXBlLm9mZkRyYWdFbmQ9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgcT10aGlzO20ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gcS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZShyKX0pO3RoaXMuX2RyYWdDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gcS5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocil9KTt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIHEuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHIpfSk7dGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9O3JldHVybiBwfShjLkd1aWRlTGluZUxheWVyKTtkLkRyYWdMaW5lTGF5ZXI9Zn0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoayxtLHApe3ZhciBxPQp7fTtpZih2b2lkIDAhPT1wKWZvcih2YXIgcj0wO3I8cC5sZW5ndGg7cisrKXFbcFtyXV09cFtyLTFdO3JldHVybiBmdW5jdGlvbih0KXt2YXIgdj1rLnNjYWxlKHQpO2lmKCFtKXJldHVybiB2O3ZhciBBO3Q9dm9pZCAwPT09cVt0XT92b2lkIDA6ay5zY2FsZShxW3RdKTt2b2lkIDAhPT10JiYoQT10Kyh2LXQpLzIpO3JldHVybiBBfX12YXIgbD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxtKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW1bcV0pO2sucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KHAucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBwKX07Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBtKHAscSl7dmFyIHI9ay5jYWxsKHRoaXMpfHx0aGlzO3IuYWRkQ2xhc3MoImdyaWRsaW5lcyIpO3IuX3hTY2FsZT1wO3IuX3lTY2FsZT1xO3IuX3JlbmRlckNhbGxiYWNrPQpmdW5jdGlvbigpe3JldHVybiByLnJlbmRlcigpfTtpZihyLl94U2NhbGUpci5feFNjYWxlLm9uVXBkYXRlKHIuX3JlbmRlckNhbGxiYWNrKTtpZihyLl95U2NhbGUpci5feVNjYWxlLm9uVXBkYXRlKHIuX3JlbmRlckNhbGxiYWNrKTtyZXR1cm4gcn1sKG0sayk7bS5wcm90b3R5cGUuYmV0d2Vlblg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlblh9O20ucHJvdG90eXBlLmJldHdlZW5ZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JldHdlZW5ZfTttLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX3hMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWdyaWRsaW5lcyIsITApO3RoaXMuX3lMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWdyaWRsaW5lcyIsITApfTttLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe2sucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fcmVkcmF3WExpbmVzKCk7dGhpcy5fcmVkcmF3WUxpbmVzKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocCxxLHIpe2sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAscSxyKTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTtudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9OwptLnByb3RvdHlwZS5fcmVkcmF3WExpbmVzPWZ1bmN0aW9uKCl7aWYodGhpcy5feFNjYWxlKXt2YXIgcD10aGlzLmJldHdlZW5YKCkscT10aGlzLl94U2NhbGUudGlja3MoKS5zbGljZShwPzE6MCk7cT10aGlzLl94TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShxKTtxLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UocSkuYXR0cigieDEiLGcodGhpcy5feFNjYWxlLHAsdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MSIsMCkuYXR0cigieDIiLGcodGhpcy5feFNjYWxlLHAsdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MiIsdGhpcy5oZWlnaHQoKSkuY2xhc3NlZCgiYmV0d2VlbmxpbmUiLHApLmNsYXNzZWQoInplcm9saW5lIixmdW5jdGlvbihyKXtyZXR1cm4gMD09PXJ9KTtxLmV4aXQoKS5yZW1vdmUoKX19O20ucHJvdG90eXBlLl9yZWRyYXdZTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl95U2NhbGUpe3ZhciBwPXRoaXMuYmV0d2VlblkoKSwKcT10aGlzLl95U2NhbGUudGlja3MoKS5zbGljZShwPzE6MCk7cT10aGlzLl95TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShxKTtxLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UocSkuYXR0cigieDEiLDApLmF0dHIoInkxIixnKHRoaXMuX3lTY2FsZSxwLHRoaXMuX3lTY2FsZS50aWNrcygpKSkuYXR0cigieDIiLHRoaXMud2lkdGgoKSkuYXR0cigieTIiLGcodGhpcy5feVNjYWxlLHAsdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIscCkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHIpe3JldHVybiAwPT09cn0pO3EuZXhpdCgpLnJlbW92ZSgpfX07cmV0dXJuIG19KGYoNCkuQ29tcG9uZW50KTtkLkdyaWRsaW5lcz1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEscil7ZnVuY3Rpb24gdCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIHYgaW4gcilyLmhhc093blByb3BlcnR5KHYpJiYKKHFbdl09clt2XSk7cS5wcm90b3R5cGU9bnVsbD09PXI/T2JqZWN0LmNyZWF0ZShyKToodC5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IHQpfSxsPWYoNSksaz1mKDIzKSxtPWYoOCkscD1mKDApO2M9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gcih0KXt2YXIgdj1xLmNhbGwodGhpcyl8fHRoaXM7di5fdGV4dFBhZGRpbmc9NTtpZihudWxsPT10KXRocm93IEVycm9yKCJJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZCByZXF1aXJlcyBhIGludGVycG9sYXRlZENvbG9yU2NhbGUiKTt2Ll9zY2FsZT10O3YuX3JlZHJhd0NhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHYucmVkcmF3KCl9O3YuX3NjYWxlLm9uVXBkYXRlKHYuX3JlZHJhd0NhbGxiYWNrKTt2Ll9mb3JtYXR0ZXI9bS5nZW5lcmFsKCk7di5fb3JpZW50YXRpb249Imhvcml6b250YWwiO3YuX2V4cGFuZHM9ITE7di5hZGRDbGFzcygibGVnZW5kIik7di5hZGRDbGFzcygiaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCIpO3JldHVybiB2fWcociwKcSk7ci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTtyLnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5fZm9ybWF0dGVyO3RoaXMuX2Zvcm1hdHRlcj10O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmV4cGFuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhwYW5kc307ci5fZW5zdXJlT3JpZW50YXRpb249ZnVuY3Rpb24odCl7dD10LnRvTG93ZXJDYXNlKCk7aWYoImhvcml6b250YWwiPT09dHx8ImxlZnQiPT09dHx8InJpZ2h0Ij09PXQpcmV0dXJuIHQ7dGhyb3cgRXJyb3IoJyInK3QrJyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEludGVycG9sYXRlZENvbG9yTGVnZW5kJyk7fTtyLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih0KXtpZihudWxsPT0KdClyZXR1cm4gdGhpcy5fb3JpZW50YXRpb247dGhpcy5fb3JpZW50YXRpb249ci5fZW5zdXJlT3JpZW50YXRpb24odCk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8dGhpcy5faXNWZXJ0aWNhbCgpfTtyLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8IXRoaXMuX2lzVmVydGljYWwoKX07ci5wcm90b3R5cGUuX2dlbmVyYXRlVGlja3M9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ci5fREVGQVVMVF9OVU1fU1dBVENIRVMpO3ZhciB2PXRoaXMuX3NjYWxlLmRvbWFpbigpO2lmKDE9PT10KXJldHVyblt2WzBdXTtmb3IodmFyIEE9KHZbMV0tdlswXSkvKHQtMSkseT1bXSx4PTA7eDx0O3grKyl5LnB1c2godlswXStBKngpO3JldHVybiB5fTtyLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fc3dhdGNoQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInN3YXRjaC1jb250YWluZXIiLCEwKTt0aGlzLl9zd2F0Y2hCb3VuZGluZ0JveD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2gtYm91bmRpbmctYm94IiwhMCk7dGhpcy5fbG93ZXJMYWJlbD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHIuTEVHRU5EX0xBQkVMX0NMQVNTLCEwKTt0aGlzLl91cHBlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoci5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3ZhciB0PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5jb250ZW50KCkubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5NZWFzdXJlcih0KTt0aGlzLl93cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy5fd3JpdGVyPW5ldyBsLldyaXRlcih0aGlzLl9tZWFzdXJlcix0LHRoaXMuX3dyYXBwZXIpfTtyLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT0KZnVuY3Rpb24oKXt2YXIgdD10aGlzLHY9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCxBPXRoaXMuX3NjYWxlLmRvbWFpbigpLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gdC5fbWVhc3VyZXIubWVhc3VyZSh0Ll9mb3JtYXR0ZXIoQykpLndpZHRofSkseT1yLl9ERUZBVUxUX05VTV9TV0FUQ0hFUztpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciB4PXAuTWF0aC5tYXgoQSwwKTtBPXYrdit0aGlzLl90ZXh0UGFkZGluZyt4K3RoaXMuX3RleHRQYWRkaW5nO3g9eSp2fWVsc2UgeD12K3YrdixBPXRoaXMuX3RleHRQYWRkaW5nK0FbMF0reSp2K0FbMV0rdGhpcy5fdGV4dFBhZGRpbmc7cmV0dXJue21pbldpZHRoOkEsbWluSGVpZ2h0Onh9fTtyLnByb3RvdHlwZS5faXNWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiJob3Jpem9udGFsIiE9PXRoaXMuX29yaWVudGF0aW9ufTtyLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTsKdmFyIHY9dGhpcy5fc2NhbGUuZG9tYWluKCksQT10aGlzLl9mb3JtYXR0ZXIodlswXSkseT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKEEpLndpZHRoLHg9dGhpcy5fZm9ybWF0dGVyKHZbMV0pO3Y9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh4KS53aWR0aDt2YXIgQz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEY9dGhpcy5fdGV4dFBhZGRpbmcsRD0wLEI9MCxHPTAsSz0wLEw9e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LEo9e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LFA9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH07aWYodGhpcy5faXNWZXJ0aWNhbCgpKXt2YXIgUz1NYXRoLmZsb29yKHRoaXMuaGVpZ2h0KCkpO3ZhciBOPU1hdGgubWF4KHksdik7dmFyIFQ9KHRoaXMud2lkdGgoKS1OLTIqdGhpcy5fdGV4dFBhZGRpbmcpLzI7dj1NYXRoLm1heCh0aGlzLndpZHRoKCktVC0yKkYtTiwwKTsKQz0xO3ZhciBZPWZ1bmN0aW9uKGhhLFgpe3JldHVybiB0LmhlaWdodCgpLShYKzEpfTtKLnlBbGlnbj0idG9wIjtCPTA7TC55QWxpZ249ImJvdHRvbSI7Sz0wO2lmKCJsZWZ0Ij09PXRoaXMuX29yaWVudGF0aW9uKXt2YXIgYWE9ZnVuY3Rpb24oKXtyZXR1cm4gRitOK0Z9O0oueEFsaWduPSJyaWdodCI7RD0tKFQrditGKTtMLnhBbGlnbj0icmlnaHQiO0c9LShUK3YrRil9ZWxzZSBhYT1mdW5jdGlvbigpe3JldHVybiBUfSxKLnhBbGlnbj0ibGVmdCIsRD1UK3YrRixMLnhBbGlnbj0ibGVmdCIsRz1UK3YrRjtQLndpZHRoPXY7UC5oZWlnaHQ9UypDfWVsc2UgVD1NYXRoLm1heChGLCh0aGlzLmhlaWdodCgpLUMpLzIpLFM9TWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLndpZHRoKCktNCpGLXktdiksMCksdj0xLEM9TWF0aC5tYXgodGhpcy5oZWlnaHQoKS0yKlQsMCksYWE9ZnVuY3Rpb24oaGEsWCl7cmV0dXJuIE1hdGguZmxvb3IoeSsyKkYpK1h9LFk9ZnVuY3Rpb24oKXtyZXR1cm4gVH0sCkoueEFsaWduPSJyaWdodCIsRD0tRixMLnhBbGlnbj0ibGVmdCIsRz1GLFAueT1ULFAud2lkdGg9Uyp2LFAuaGVpZ2h0PUM7UC54PWFhKG51bGwsMCk7dGhpcy5fdXBwZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoeCx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxKLHRoaXMuX3VwcGVyTGFiZWwubm9kZSgpKTt0aGlzLl91cHBlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QrIiwgIitCKyIpIik7dGhpcy5fbG93ZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoQSx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxMLHRoaXMuX2xvd2VyTGFiZWwubm9kZSgpKTt0aGlzLl9sb3dlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0crIiwgIitLKyIpIik7dGhpcy5fc3dhdGNoQm91bmRpbmdCb3guYXR0cnMoUCk7QT10aGlzLl9nZW5lcmF0ZVRpY2tzKFMpO0E9dGhpcy5fc3dhdGNoQ29udGFpbmVyLnNlbGVjdEFsbCgicmVjdC5zd2F0Y2giKS5kYXRhKEEpOwp4PUEuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2giLCEwKTtEPUEubWVyZ2UoeCk7QS5leGl0KCkucmVtb3ZlKCk7RC5hdHRycyh7ZmlsbDpmdW5jdGlvbihoYSl7cmV0dXJuIHQuX3NjYWxlLnNjYWxlKGhhKX0sd2lkdGg6dixoZWlnaHQ6Qyx4OmFhLHk6WSwic2hhcGUtcmVuZGVyaW5nIjoiY3Jpc3BFZGdlcyJ9KTtrLkFERF9USVRMRV9FTEVNRU5UUyYmeC5hcHBlbmQoInRpdGxlIikudGV4dChmdW5jdGlvbihoYSl7cmV0dXJuIHQuX2Zvcm1hdHRlcihoYSl9KTtyZXR1cm4gdGhpc307cmV0dXJuIHJ9KGYoNCkuQ29tcG9uZW50KTtjLl9ERUZBVUxUX05VTV9TV0FUQ0hFUz0xMTtjLkxFR0VORF9MQUJFTF9DTEFTUz0ibGVnZW5kLWxhYmVsIjtkLkludGVycG9sYXRlZENvbG9yTGVnZW5kPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxtKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJgooa1txXT1tW3FdKTtrLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihwLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgcCl9LGw9Zig1KTtjPWZ1bmN0aW9uKGspe2Z1bmN0aW9uIG0ocCxxKXt2b2lkIDA9PT1wJiYocD0iIik7dm9pZCAwPT09cSYmKHE9MCk7dmFyIHI9ay5jYWxsKHRoaXMpfHx0aGlzO3IuYWRkQ2xhc3MoImxhYmVsIik7ci50ZXh0KHApO3IuYW5nbGUocSk7ci54QWxpZ25tZW50KCJjZW50ZXIiKS55QWxpZ25tZW50KCJjZW50ZXIiKTtyLl9wYWRkaW5nPTA7cmV0dXJuIHJ9ZyhtLGspO20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7dmFyIHA9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0aGlzLl90ZXh0KSxxPSgwPT09dGhpcy5hbmdsZSgpP3Aud2lkdGg6cC5oZWlnaHQpKzIqdGhpcy5wYWRkaW5nKCk7cD0oMD09PXRoaXMuYW5nbGUoKT9wLmhlaWdodDpwLndpZHRoKSsyKnRoaXMucGFkZGluZygpO3JldHVybnttaW5XaWR0aDpxLAptaW5IZWlnaHQ6cH19O20ucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe2sucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3RleHRDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIik7dmFyIHA9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90ZXh0Q29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcihwKTt0aGlzLl93cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy5fd3JpdGVyPW5ldyBsLldyaXRlcih0aGlzLl9tZWFzdXJlcixwLHRoaXMuX3dyYXBwZXIpO3RoaXMudGV4dCh0aGlzLl90ZXh0KX07bS5wcm90b3R5cGUudGV4dD1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0aGlzLl90ZXh0O2lmKCJzdHJpbmciIT09dHlwZW9mIHApdGhyb3cgRXJyb3IoIkxhYmVsLnRleHQoKSBvbmx5IHRha2VzIHN0cmluZ3MgYXMgaW5wdXQiKTt0aGlzLl90ZXh0PXA7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuYW5nbGU9CmZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX2FuZ2xlO3AlPTM2MDsxODA8cD9wLT0zNjA6LTE4MD5wJiYocCs9MzYwKTtpZigtOTA9PT1wfHwwPT09cHx8OTA9PT1wKXRoaXMuX2FuZ2xlPXA7ZWxzZSB0aHJvdyBFcnJvcihwKyIgaXMgbm90IGEgdmFsaWQgYW5nbGUgZm9yIExhYmVsIik7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucGFkZGluZz1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0aGlzLl9wYWRkaW5nO3A9K3A7aWYoMD5wKXRocm93IEVycm9yKHArIiBpcyBub3QgYSB2YWxpZCBwYWRkaW5nIHZhbHVlLiBDYW5ub3QgYmUgbGVzcyB0aGFuIDAuIik7dGhpcy5fcGFkZGluZz1wO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9CmZ1bmN0aW9uKCl7ay5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl90ZXh0Q29udGFpbmVyLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBwPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCkscT1NYXRoLm1heChNYXRoLm1pbigodGhpcy5oZWlnaHQoKS1wLmhlaWdodCkvMix0aGlzLnBhZGRpbmcoKSksMCk7cD1NYXRoLm1heChNYXRoLm1pbigodGhpcy53aWR0aCgpLXAud2lkdGgpLzIsdGhpcy5wYWRkaW5nKCkpLDApO3RoaXMuX3RleHRDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrcCsiLCIrcSsiKSIpO3A9dGhpcy53aWR0aCgpLTIqcDtxPXRoaXMuaGVpZ2h0KCktMipxO3ZhciByPXt4QWxpZ246dGhpcy54QWxpZ25tZW50KCkseUFsaWduOnRoaXMueUFsaWdubWVudCgpLHRleHRSb3RhdGlvbjp0aGlzLmFuZ2xlKCl9O3RoaXMuX3dyaXRlci53cml0ZSh0aGlzLl90ZXh0LHAscSxyKTtyZXR1cm4gdGhpc307Cm0ucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe2sucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBtfShmKDQpLkNvbXBvbmVudCk7ZC5MYWJlbD1jO2Y9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbShwLHEpe3A9ay5jYWxsKHRoaXMscCxxKXx8dGhpcztwLmFkZENsYXNzKG0uVElUTEVfTEFCRUxfQ0xBU1MpO3JldHVybiBwfWcobSxrKTtyZXR1cm4gbX0oYyk7Zi5USVRMRV9MQUJFTF9DTEFTUz0idGl0bGUtbGFiZWwiO2QuVGl0bGVMYWJlbD1mO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbShwLHEpe3A9ay5jYWxsKHRoaXMscCxxKXx8dGhpcztwLmFkZENsYXNzKG0uQVhJU19MQUJFTF9DTEFTUyk7cmV0dXJuIHB9ZyhtLGspO3JldHVybiBtfShjKTtjLkFYSVNfTEFCRUxfQ0xBU1M9ImF4aXMtbGFiZWwiO2QuQXhpc0xhYmVsPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8CmZ1bmN0aW9uKEEseSl7ZnVuY3Rpb24geCgpe3RoaXMuY29uc3RydWN0b3I9QX1mb3IodmFyIEMgaW4geSl5Lmhhc093blByb3BlcnR5KEMpJiYoQVtDXT15W0NdKTtBLnByb3RvdHlwZT1udWxsPT09eT9PYmplY3QuY3JlYXRlKHkpOih4LnByb3RvdHlwZT15LnByb3RvdHlwZSxuZXcgeCl9LGw9ZigxKSxrPWYoNSksbT1mKDIzKSxwPWYoOCkscT1mKDMxKSxyPWYoMCk7Yz1mKDQpO3ZhciB0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQSh5LHgsQyl7dm9pZCAwPT09eSYmKHk9W10pO3ZvaWQgMD09PXgmJih4PTApO3ZvaWQgMD09PUMmJihDPUluZmluaXR5KTt0aGlzLmNvbHVtbnM9eTt0aGlzLmJvdHRvbVBhZGRpbmc9eDt0aGlzLm1heFdpZHRoPUN9QS5wcm90b3R5cGUuYWRkQ29sdW1uPWZ1bmN0aW9uKHkpe3ZhciB4PXkud2lkdGgsQz10aGlzLmdldFdpZHRoQXZhaWxhYmxlKCk7eS53aWR0aD1NYXRoLm1pbihDLHgpO3RoaXMuY29sdW1ucy5wdXNoKHkpfTtBLnByb3RvdHlwZS5nZXRCb3VuZHM9CmZ1bmN0aW9uKHkpe2Zvcih2YXIgeD10aGlzLmNvbHVtbnNbeV0sQz0wLEY9MDtGPHk7RisrKUMrPXRoaXMuY29sdW1uc1tGXS53aWR0aDtyZXR1cm57dG9wTGVmdDp7eDpDLHk6MH0sYm90dG9tUmlnaHQ6e3g6Qyt4LndpZHRoLHk6eC5oZWlnaHR9fX07QS5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHIuTWF0aC5tYXgodGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbih5KXtyZXR1cm4geS5oZWlnaHR9KSwwKSt0aGlzLmJvdHRvbVBhZGRpbmd9O0EucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMuY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24oeSx4KXtyZXR1cm4geSt4LndpZHRofSwwKSx0aGlzLm1heFdpZHRoKX07QS5wcm90b3R5cGUuZ2V0V2lkdGhBdmFpbGFibGU9ZnVuY3Rpb24oKXt2YXIgeT10aGlzLmdldFdpZHRoKCk7cmV0dXJuIE1hdGgubWF4KHRoaXMubWF4V2lkdGgteSwwKX07cmV0dXJuIEF9KCksdj1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoeSwKeCxDLEYpe3ZvaWQgMD09PXkmJih5PUluZmluaXR5KTt2b2lkIDA9PT14JiYoeD1JbmZpbml0eSk7dm9pZCAwPT09QyYmKEM9MCk7dm9pZCAwPT09RiYmKEY9W10pO3RoaXMubWF4V2lkdGg9eTt0aGlzLm1heEhlaWdodD14O3RoaXMucGFkZGluZz1DO3RoaXMucm93cz1GfUEucHJvdG90eXBlLmFkZFJvdz1mdW5jdGlvbih5KXt5Lm1heFdpZHRoPXRoaXMubWF4V2lkdGgtMip0aGlzLnBhZGRpbmc7dGhpcy5yb3dzLnB1c2goeSl9O0EucHJvdG90eXBlLmdldENvbHVtbkJvdW5kcz1mdW5jdGlvbih5LHgpe3ZhciBDPXRoaXMuZ2V0Um93Qm91bmRzKHkpO3k9dGhpcy5yb3dzW3ldLmdldEJvdW5kcyh4KTt5LnRvcExlZnQueCs9Qy50b3BMZWZ0Lng7eS5ib3R0b21SaWdodC54Kz1DLnRvcExlZnQueDt5LnRvcExlZnQueSs9Qy50b3BMZWZ0Lnk7eS5ib3R0b21SaWdodC55Kz1DLnRvcExlZnQueTtyZXR1cm4geX07QS5wcm90b3R5cGUuZ2V0Um93Qm91bmRzPWZ1bmN0aW9uKHkpe2Zvcih2YXIgeD0KdGhpcy5wYWRkaW5nLEM9dGhpcy5wYWRkaW5nLEY9MDtGPHk7RisrKUMrPXRoaXMucm93c1tGXS5nZXRIZWlnaHQoKTtyZXR1cm57dG9wTGVmdDp7eCx5OkN9LGJvdHRvbVJpZ2h0Ont4OngrdGhpcy5yb3dzW3ldLmdldFdpZHRoKCkseTpDK3RoaXMucm93c1t5XS5nZXRIZWlnaHQoKX19fTtBLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5yb3dzLnJlZHVjZShmdW5jdGlvbih5LHgpe3JldHVybiB5K3guZ2V0SGVpZ2h0KCl9LDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4SGVpZ2h0KX07QS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oci5NYXRoLm1heCh0aGlzLnJvd3MubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5LmdldFdpZHRoKCl9KSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heFdpZHRoKX07cmV0dXJuIEF9KCk7Yz1mdW5jdGlvbihBKXtmdW5jdGlvbiB5KHgpe3ZhciBDPUEuY2FsbCh0aGlzKXx8CnRoaXM7Qy5fcGFkZGluZz01O0MuX3Jvd0JvdHRvbVBhZGRpbmc9MztDLmFkZENsYXNzKCJsZWdlbmQiKTtDLm1heEVudHJpZXNQZXJSb3coMSk7aWYobnVsbD09eCl0aHJvdyBFcnJvcigiTGVnZW5kIHJlcXVpcmVzIGEgY29sb3JTY2FsZSIpO0MuX2NvbG9yU2NhbGU9eDtDLl9yZWRyYXdDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBDLnJlZHJhdygpfTtDLl9jb2xvclNjYWxlLm9uVXBkYXRlKEMuX3JlZHJhd0NhbGxiYWNrKTtDLl9mb3JtYXR0ZXI9cC5pZGVudGl0eSgpO0MubWF4TGluZXNQZXJFbnRyeSgxKTtDLnhBbGlnbm1lbnQoInJpZ2h0IikueUFsaWdubWVudCgidG9wIik7Qy5jb21wYXJhdG9yKGZ1bmN0aW9uKEYsRCl7dmFyIEI9Qy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLm1hcChmdW5jdGlvbihHKXtyZXR1cm4gQy5fZm9ybWF0dGVyKEcpfSk7cmV0dXJuIEIuaW5kZXhPZihGKS1CLmluZGV4T2YoRCl9KTtDLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gcS5jaXJjbGUoKX07CkMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiAxfTtyZXR1cm4gQ31nKHksQSk7eS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7QS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHg9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9ST1dfQ0xBU1MsITApO3guYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9FTlRSWV9DTEFTUywhMCkuYXBwZW5kKCJ0ZXh0Iik7eD1uZXcgay5TdmdDb250ZXh0KHgubm9kZSgpLG51bGwsbS5BRERfVElUTEVfRUxFTUVOVFMpO3RoaXMuX21lYXN1cmVyPW5ldyBrLkNhY2hlTWVhc3VyZXIoeCk7dGhpcy5fd3JhcHBlcj0obmV3IGsuV3JhcHBlcikubWF4TGluZXModGhpcy5tYXhMaW5lc1BlckVudHJ5KCkpO3RoaXMuX3dyaXRlcj1uZXcgay5Xcml0ZXIodGhpcy5fbWVhc3VyZXIseCx0aGlzLl93cmFwcGVyKX07eS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHgpe2lmKG51bGw9PQp4KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4RW50cmllc1BlclJvdz1mdW5jdGlvbih4KXtpZihudWxsPT14KXJldHVybiB0aGlzLl9tYXhFbnRyaWVzUGVyUm93O3RoaXMuX21heEVudHJpZXNQZXJSb3c9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5tYXhMaW5lc1BlckVudHJ5PWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX21heExpbmVzUGVyRW50cnk7dGhpcy5fbWF4TGluZXNQZXJFbnRyeT14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLm1heFdpZHRoPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX21heFdpZHRoO3RoaXMuX21heFdpZHRoPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuY29tcGFyYXRvcj1mdW5jdGlvbih4KXtudWxsIT14JiYodGhpcy5fY29tcGFyYXRvcj0KeCx0aGlzLnJlZHJhdygpKX07eS5wcm90b3R5cGUuY29sb3JTY2FsZT1mdW5jdGlvbih4KXtyZXR1cm4gbnVsbCE9eD8odGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMuX2NvbG9yU2NhbGU9eCx0aGlzLl9jb2xvclNjYWxlLm9uVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKSx0aGlzLnJlZHJhdygpLHRoaXMpOnRoaXMuX2NvbG9yU2NhbGV9O3kucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTt5LnByb3RvdHlwZS5fYnVpbGRMZWdlbmRUYWJsZT1mdW5jdGlvbih4LEMpe3ZhciBGPXRoaXMsRD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEI9bmV3IHYoeCxDLHRoaXMuX3BhZGRpbmcpO3g9dGhpcy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLnNvcnQoZnVuY3Rpb24oSywKTCl7cmV0dXJuIEYuX2NvbXBhcmF0b3IoRi5fZm9ybWF0dGVyKEspLEYuX2Zvcm1hdHRlcihMKSl9KTt2YXIgRz1uZXcgdDtCLmFkZFJvdyhHKTtHLmJvdHRvbVBhZGRpbmc9dGhpcy5fcm93Qm90dG9tUGFkZGluZzt4LmZvckVhY2goZnVuY3Rpb24oSyl7Ry5jb2x1bW5zLmxlbmd0aC8yPT09Ri5tYXhFbnRyaWVzUGVyUm93KCkmJihHPW5ldyB0LEcuYm90dG9tUGFkZGluZz1GLl9yb3dCb3R0b21QYWRkaW5nLEIuYWRkUm93KEcpKTt2YXIgTD1HLmdldFdpZHRoQXZhaWxhYmxlKCksSj1GLl9mb3JtYXR0ZXIoSyksUD1GLl9tZWFzdXJlci5tZWFzdXJlKEopLndpZHRoOzA+TC1ELVAmJjE8Ry5jb2x1bW5zLmxlbmd0aCYmKEc9bmV3IHQsRy5ib3R0b21QYWRkaW5nPUYuX3Jvd0JvdHRvbVBhZGRpbmcsQi5hZGRSb3coRykpO0cuYWRkQ29sdW1uKHt3aWR0aDpELGhlaWdodDpELGRhdGE6e25hbWU6Syx0eXBlOiJzeW1ib2wifX0pO0w9Ry5nZXRXaWR0aEF2YWlsYWJsZSgpO0w9TWF0aC5taW4oTCwKUCk7Ri5fd3JhcHBlci5tYXhMaW5lcyhGLm1heExpbmVzUGVyRW50cnkoKSk7Sj1GLl93cmFwcGVyLndyYXAoSixGLl9tZWFzdXJlcixMKS5ub0xpbmVzKkQ7Ry5hZGRDb2x1bW4oe3dpZHRoOkwsaGVpZ2h0OkosZGF0YTp7bmFtZTpLLHR5cGU6InRleHQifX0pfSk7cmV0dXJuIEJ9O3kucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHgsQyl7eD10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHIuTWF0aC5taW4oW3RoaXMubWF4V2lkdGgoKSx4XSx4KSxDKTtyZXR1cm57bWluSGVpZ2h0OnguZ2V0SGVpZ2h0KCksbWluV2lkdGg6eC5nZXRXaWR0aCgpfX07eS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih4KXt2YXIgQz10aGlzO2lmKCF0aGlzLl9pc1NldHVwKXJldHVybltdO3ZhciBGPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3JldHVybiBGLnJvd3MucmVkdWNlKGZ1bmN0aW9uKEQsQixHKXtpZigwIT09RC5sZW5ndGgpcmV0dXJuIEQ7CnZhciBLPUYuZ2V0Um93Qm91bmRzKEcpO3JldHVybiByLk1hdGgud2l0aGluKHgsSyk/Qi5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbihMLEosUCl7dmFyIFM9Ri5nZXRDb2x1bW5Cb3VuZHMoRyxQKTtpZihyLk1hdGgud2l0aGluKHgsUykpe0w9Qy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit5LkxFR0VORF9ST1dfQ0xBU1MpLm5vZGVzKClbR107UD1sLnNlbGVjdChMKS5zZWxlY3RBbGwoIi4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5ub2RlcygpW01hdGguZmxvb3IoUC8yKV07dmFyIE49bC5zZWxlY3QoUCkuc2VsZWN0KCIuIit5LkxFR0VORF9TWU1CT0xfQ0xBU1MpO1M9ci5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKGwuc2VsZWN0KEwpKTtOPXIuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyhOKTtyZXR1cm5be2JvdW5kczpyLkRPTS5lbGVtZW50QkJveChsLnNlbGVjdChMKSksZGF0dW06Si5kYXRhLm5hbWUscG9zaXRpb246e3g6U1swXStOWzBdLHk6U1sxXStOWzFdfSxzZWxlY3Rpb246bC5zZWxlY3QoUCksCmNvbXBvbmVudDpDfV19cmV0dXJuIEx9LEQpOkR9LFtdKX07eS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciB4PXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3ZhciBDPXRoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX1JPV19DTEFTUykuZGF0YSh4LnJvd3MpLEY9Qy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfUk9XX0NMQVNTLCEwKS5tZXJnZShDKTtDLmV4aXQoKS5yZW1vdmUoKTtGLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oQixHKXtCPXguZ2V0Um93Qm91bmRzKEcpO3JldHVybiJ0cmFuc2xhdGUoIitCLnRvcExlZnQueCsiLCAiK0IudG9wTGVmdC55KyIpIn0pO3ZhciBEPXRoaXM7Ri5lYWNoKGZ1bmN0aW9uKEIsRyl7Zm9yKHZhciBLPQpbXSxMPTA7TDxCLmNvbHVtbnMubGVuZ3RoO0wrPTIpSy5wdXNoKFtCLmNvbHVtbnNbTF0sQi5jb2x1bW5zW0wrMV1dKTtCPWwuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5kYXRhKEspO0s9Qi5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLm1lcmdlKEIpO0suYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsZnVuY3Rpb24oSil7Sj1KWzBdO3JldHVybiBELnN5bWJvbCgpKEouZGF0YS5uYW1lLEcpKC42KkouaGVpZ2h0KShudWxsKX0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSil7Sj1KWzBdO3JldHVybiJ0cmFuc2xhdGUoIisoeC5nZXRDb2x1bW5Cb3VuZHMoRyx4LnJvd3NbR10uY29sdW1ucy5pbmRleE9mKEopKS50b3BMZWZ0LngrSi53aWR0aC8yKSsiLCAiK0ouaGVpZ2h0LzIrIikifSkuYXR0cigiZmlsbCIsZnVuY3Rpb24oSil7cmV0dXJuIEQuX2NvbG9yU2NhbGUuc2NhbGUoSlswXS5kYXRhLm5hbWUpfSkuYXR0cigib3BhY2l0eSIsCmZ1bmN0aW9uKEope3JldHVybiBELnN5bWJvbE9wYWNpdHkoKShKWzBdLmRhdGEubmFtZSxHKX0pLmNsYXNzZWQoeS5MRUdFTkRfU1lNQk9MX0NMQVNTLCEwKTtLLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwhMCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihKKXtyZXR1cm4idHJhbnNsYXRlKCIreC5nZXRDb2x1bW5Cb3VuZHMoRyx4LnJvd3NbR10uY29sdW1ucy5pbmRleE9mKEpbMV0pKS50b3BMZWZ0LngrIiwgMCkifSkuZWFjaChmdW5jdGlvbihKKXt2YXIgUD1sLnNlbGVjdCh0aGlzKTtKPUpbMV07RC5fd3JpdGVyLndyaXRlKEQuX2Zvcm1hdHRlcihKLmRhdGEubmFtZSksSi53aWR0aCxELmhlaWdodCgpLHt4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIix0ZXh0Um90YXRpb246MH0sUC5ub2RlKCkpfSk7Qi5leGl0KCkucmVtb3ZlKCl9KTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvcjsKdGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yPXg7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sT3BhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3J9O3kucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHl9KGMuQ29tcG9uZW50KTtjLkxFR0VORF9ST1dfQ0xBU1M9ImxlZ2VuZC1yb3ciO2MuTEVHRU5EX0VOVFJZX0NMQVNTPSJsZWdlbmQtZW50cnkiO2MuTEVHRU5EX1NZTUJPTF9DTEFTUz0ibGVnZW5kLXN5bWJvbCI7ZC5MZWdlbmQ9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihtLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPQptfWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihtW3JdPXBbcl0pO20ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDIpLGs9ZigwKTtjPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAoKXtyZXR1cm4gbnVsbCE9PW0mJm0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfWcocCxtKTtwLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKHEpe3ZhciByLHQ9SW5maW5pdHk7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChmdW5jdGlvbih2KXt2PXYuZW50aXR5TmVhcmVzdChxKTtpZihudWxsIT12KXt2YXIgQT1rLk1hdGguZGlzdGFuY2VTcXVhcmVkKHYucG9zaXRpb24scSk7QTw9dCYmKHQ9QSxyPXYpfX0pO3JldHVybiByfTtwLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24ocSl7aWYobnVsbCE9cSYmIShxIGluc3RhbmNlb2YgbC5QbG90KSl0aHJvdyBFcnJvcigiUGxvdCBHcm91cCBvbmx5IGFjY2VwdHMgcGxvdHMiKTsKbS5wcm90b3R5cGUuYXBwZW5kLmNhbGwodGhpcyxxKTtyZXR1cm4gdGhpc307cmV0dXJuIHB9KGYoNDEpLkdyb3VwKTtkLlBsb3RHcm91cD1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobVtyXT1wW3JdKTttLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigxKSxrPWYoMCk7Yz1mdW5jdGlvbihtKXtmdW5jdGlvbiBwKHEpe3ZvaWQgMD09PXEmJihxPVtdKTt2YXIgcj1tLmNhbGwodGhpcyl8fHRoaXM7ci5fcm93UGFkZGluZz0wO3IuX2NvbHVtblBhZGRpbmc9MDtyLl9yb3dzPVtdO3IuX3Jvd1dlaWdodHM9W107ci5fY29sdW1uV2VpZ2h0cz1bXTtyLl9uUm93cz0wO3IuX25Db2xzPTA7ci5fY2FsY3VsYXRlZExheW91dD0KbnVsbDtyLmFkZENsYXNzKCJ0YWJsZSIpO3EuZm9yRWFjaChmdW5jdGlvbih0LHYpe3QuZm9yRWFjaChmdW5jdGlvbihBLHkpe251bGwhPUEmJnIuYWRkKEEsdix5KX0pfSk7cmV0dXJuIHJ9ZyhwLG0pO3AucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKHEpe2Zvcih2YXIgcj0wO3I8dGhpcy5fblJvd3M7cisrKWZvcih2YXIgdD0wO3Q8dGhpcy5fbkNvbHM7dCsrKW51bGwhPXRoaXMuX3Jvd3Nbcl1bdF0mJnEodGhpcy5fcm93c1tyXVt0XSl9O3AucHJvdG90eXBlLmhhcz1mdW5jdGlvbihxKXtmb3IodmFyIHI9MDtyPHRoaXMuX25Sb3dzO3IrKylmb3IodmFyIHQ9MDt0PHRoaXMuX25Db2xzO3QrKylpZih0aGlzLl9yb3dzW3JdW3RdPT09cSlyZXR1cm4hMDtyZXR1cm4hMX07cC5wcm90b3R5cGUuY29tcG9uZW50QXQ9ZnVuY3Rpb24ocSl7cmV0dXJuIDA+PXRoaXMuX25Sb3dzfHwwPnF8fHE+PXRoaXMuX25Db2xzP251bGw6dGhpcy5fcm93c1swXVtxXX07cC5wcm90b3R5cGUuYWRkPQpmdW5jdGlvbihxLHIsdCl7aWYobnVsbD09cSl0aHJvdyBFcnJvcigiQ2Fubm90IGFkZCBudWxsIHRvIGEgdGFibGUgY2VsbCIpO2lmKCF0aGlzLmhhcyhxKSl7aWYobnVsbCE9KHRoaXMuX3Jvd3Nbcl0mJnRoaXMuX3Jvd3Nbcl1bdF0pKXRocm93IEVycm9yKCJjZWxsIGlzIG9jY3VwaWVkIik7cS5kZXRhY2goKTt0aGlzLl9uUm93cz1NYXRoLm1heChyKzEsdGhpcy5fblJvd3MpO3RoaXMuX25Db2xzPU1hdGgubWF4KHQrMSx0aGlzLl9uQ29scyk7dGhpcy5fcGFkVGFibGVUb1NpemUodGhpcy5fblJvd3MsdGhpcy5fbkNvbHMpO3RoaXMuX3Jvd3Nbcl1bdF09cTt0aGlzLl9hZG9wdEFuZEFuY2hvcihxKTt0aGlzLnJlZHJhdygpfXJldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKHEpe2Zvcih2YXIgcj0wO3I8dGhpcy5fblJvd3M7cisrKWZvcih2YXIgdD0wO3Q8dGhpcy5fbkNvbHM7dCsrKWlmKHRoaXMuX3Jvd3Nbcl1bdF09PT1xKXt0aGlzLl9yb3dzW3JdW3RdPQpudWxsO3JldHVybn19O3AucHJvdG90eXBlLl9pdGVyYXRlTGF5b3V0PWZ1bmN0aW9uKHEscix0KXt2b2lkIDA9PT10JiYodD0hMSk7dmFyIHY9dGhpcy5fcm93cyxBPWwudHJhbnNwb3NlKHRoaXMuX3Jvd3MpO3EtPXRoaXMuX2NvbHVtblBhZGRpbmcqKHRoaXMuX25Db2xzLTEpO3ItPXRoaXMuX3Jvd1BhZGRpbmcqKHRoaXMuX25Sb3dzLTEpO3Y9cC5fY2FsY0NvbXBvbmVudFdlaWdodHModGhpcy5fcm93V2VpZ2h0cyx2LGZ1bmN0aW9uKE4pe3JldHVybiBudWxsPT1OfHxOLmZpeGVkSGVpZ2h0KCl9KTtBPXAuX2NhbGNDb21wb25lbnRXZWlnaHRzKHRoaXMuX2NvbHVtbldlaWdodHMsQSxmdW5jdGlvbihOKXtyZXR1cm4gbnVsbD09Tnx8Ti5maXhlZFdpZHRoKCl9KTt2YXIgeT1BLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gMD09PU4/LjU6Tn0pLHg9di5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIDA9PT1OPy41Ok59KTt5PXAuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZSh5LHEpO3ZhciBDPXAuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZSh4LApyKSxGPWsuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uQ29scyksRD1rLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fblJvd3MpO3g9MDtmb3IodmFyIEIsRyxLOzspe0Q9ay5BcnJheS5hZGQoRCxDKTt5PWsuQXJyYXkuYWRkKEYseSk7Qj10aGlzLl9kZXRlcm1pbmVHdWFyYW50ZWVzKHksRCx0KTtGPUIuZ3VhcmFudGVlZFdpZHRocztEPUIuZ3VhcmFudGVlZEhlaWdodHM7Rz1CLndhbnRzV2lkdGhBcnIuc29tZShmdW5jdGlvbihOKXtyZXR1cm4gTn0pO0s9Qi53YW50c0hlaWdodEFyci5zb21lKGZ1bmN0aW9uKE4pe3JldHVybiBOfSk7dmFyIEw9UCxKPVM7dmFyIFA9cS1sLnN1bShCLmd1YXJhbnRlZWRXaWR0aHMpO3ZhciBTPXItbC5zdW0oQi5ndWFyYW50ZWVkSGVpZ2h0cyk7eT12b2lkIDA7Rz8oeT1CLndhbnRzV2lkdGhBcnIubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBOPy4xOjB9KSx5PWsuQXJyYXkuYWRkKHksQSkpOnk9QTtDPXZvaWQgMDtLPyhDPUIud2FudHNIZWlnaHRBcnIubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBOPwouMTowfSksQz1rLkFycmF5LmFkZChDLHYpKTpDPXY7eT1wLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeSxQKTtDPXAuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShDLFMpO3grKztKPTA8UyYmUyE9PUo7aWYoISgwPFAmJlAhPT1MfHxKKSlicmVhaztpZig1PHgpYnJlYWt9UD1xLWwuc3VtKEIuZ3VhcmFudGVlZFdpZHRocyk7Uz1yLWwuc3VtKEIuZ3VhcmFudGVlZEhlaWdodHMpO3k9cC5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKEEsUCk7Qz1wLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UodixTKTtyZXR1cm57Y29sUHJvcG9ydGlvbmFsU3BhY2U6eSxyb3dQcm9wb3J0aW9uYWxTcGFjZTpDLGd1YXJhbnRlZWRXaWR0aHM6Qi5ndWFyYW50ZWVkV2lkdGhzLGd1YXJhbnRlZWRIZWlnaHRzOkIuZ3VhcmFudGVlZEhlaWdodHMsd2FudHNXaWR0aDpHLHdhbnRzSGVpZ2h0Okt9fTtwLnByb3RvdHlwZS5fZGV0ZXJtaW5lR3VhcmFudGVlcz1mdW5jdGlvbihxLHIsdCl7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciB2PQprLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fbkNvbHMpLEE9ay5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Sb3dzKSx5PWsuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoITEsdGhpcy5fbkNvbHMpLHg9ay5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSghMSx0aGlzLl9uUm93cyk7dGhpcy5fcm93cy5mb3JFYWNoKGZ1bmN0aW9uKEMsRil7Qy5mb3JFYWNoKGZ1bmN0aW9uKEQsQil7RD1udWxsIT1EP0QucmVxdWVzdGVkU3BhY2UocVtCXSxyW0ZdKTp7bWluV2lkdGg6MCxtaW5IZWlnaHQ6MH07dltCXT1NYXRoLm1heCh2W0JdLHQ/TWF0aC5taW4oRC5taW5XaWR0aCxxW0JdKTpELm1pbldpZHRoKTtBW0ZdPU1hdGgubWF4KEFbRl0sdD9NYXRoLm1pbihELm1pbkhlaWdodCxyW0ZdKTpELm1pbkhlaWdodCk7dmFyIEc9RC5taW5XaWR0aD5xW0JdO3lbQl09eVtCXXx8RztCPUQubWluSGVpZ2h0PnJbRl07eFtGXT14W0ZdfHxCfSl9KTtyZXR1cm57Z3VhcmFudGVlZFdpZHRoczp2LApndWFyYW50ZWVkSGVpZ2h0czpBLHdhbnRzV2lkdGhBcnI6eSx3YW50c0hlaWdodEFycjp4fX07cC5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24ocSxyKXt0aGlzLl9jYWxjdWxhdGVkTGF5b3V0PXRoaXMuX2l0ZXJhdGVMYXlvdXQocSxyKTtyZXR1cm57bWluV2lkdGg6bC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkV2lkdGhzKSxtaW5IZWlnaHQ6bC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkSGVpZ2h0cyl9fTtwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHEscix0KXt2YXIgdj10aGlzO20ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHEscix0KTtxPWwuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyk7cj1sLnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRIZWlnaHRzKTt0PXRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQ7aWYocT50aGlzLndpZHRoKCl8fApyPnRoaXMuaGVpZ2h0KCkpdD10aGlzLl9pdGVyYXRlTGF5b3V0KHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLCEwKTt2YXIgQT0wLHk9ay5BcnJheS5hZGQodC5yb3dQcm9wb3J0aW9uYWxTcGFjZSx0Lmd1YXJhbnRlZWRIZWlnaHRzKSx4PWsuQXJyYXkuYWRkKHQuY29sUHJvcG9ydGlvbmFsU3BhY2UsdC5ndWFyYW50ZWVkV2lkdGhzKTt0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24oQyxGKXt2YXIgRD0wO0MuZm9yRWFjaChmdW5jdGlvbihCLEcpe251bGwhPUImJkIuY29tcHV0ZUxheW91dCh7eDpELHk6QX0seFtHXSx5W0ZdKTtEKz14W0ddK3YuX2NvbHVtblBhZGRpbmd9KTtBKz15W0ZdK3YuX3Jvd1BhZGRpbmd9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucm93UGFkZGluZz1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9yb3dQYWRkaW5nO2lmKCFrLk1hdGguaXNWYWxpZE51bWJlcihxKXx8MD5xKXRocm93IEVycm9yKCJyb3dQYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7CnRoaXMuX3Jvd1BhZGRpbmc9cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5jb2x1bW5QYWRkaW5nPWZ1bmN0aW9uKHEpe2lmKG51bGwhPXEpe2lmKCFrLk1hdGguaXNWYWxpZE51bWJlcihxKXx8MD5xKXRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uUGFkZGluZz1xO3RoaXMucmVkcmF3KCl9fTtwLnByb3RvdHlwZS5yb3dXZWlnaHQ9ZnVuY3Rpb24ocSxyKXtpZihudWxsPT1yKXJldHVybiB0aGlzLl9yb3dXZWlnaHRzW3FdO2lmKCFrLk1hdGguaXNWYWxpZE51bWJlcihyKXx8MD5yKXRocm93IEVycm9yKCJyb3dXZWlnaHQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTt0aGlzLl9yb3dXZWlnaHRzW3FdPXI7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuY29sdW1uV2VpZ2h0PWZ1bmN0aW9uKHEscil7aWYobnVsbD09cilyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1txXTsKaWYoIWsuTWF0aC5pc1ZhbGlkTnVtYmVyKHIpfHwwPnIpdGhyb3cgRXJyb3IoImNvbHVtbldlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX2NvbHVtbldlaWdodHNbcV09cjt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHE9bC50cmFuc3Bvc2UodGhpcy5fcm93cyk7cmV0dXJuIHAuX2ZpeGVkU3BhY2UocSxmdW5jdGlvbihyKXtyZXR1cm4gbnVsbD09cnx8ci5maXhlZFdpZHRoKCl9KX07cC5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcC5fZml4ZWRTcGFjZSh0aGlzLl9yb3dzLGZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT1xfHxxLmZpeGVkSGVpZ2h0KCl9KX07cC5wcm90b3R5cGUuX3BhZFRhYmxlVG9TaXplPWZ1bmN0aW9uKHEscil7Zm9yKHZhciB0PTA7dDxxO3QrKyl7dm9pZCAwPT09dGhpcy5fcm93c1t0XSYmKHRoaXMuX3Jvd3NbdF09W10sCnRoaXMuX3Jvd1dlaWdodHNbdF09bnVsbCk7Zm9yKHZhciB2PTA7djxyO3YrKyl2b2lkIDA9PT10aGlzLl9yb3dzW3RdW3ZdJiYodGhpcy5fcm93c1t0XVt2XT1udWxsKX1mb3Iodj0wO3Y8cjt2Kyspdm9pZCAwPT09dGhpcy5fY29sdW1uV2VpZ2h0c1t2XSYmKHRoaXMuX2NvbHVtbldlaWdodHNbdl09bnVsbCl9O3AuX2NhbGNDb21wb25lbnRXZWlnaHRzPWZ1bmN0aW9uKHEscix0KXtyZXR1cm4gcS5tYXAoZnVuY3Rpb24odixBKXtyZXR1cm4gbnVsbCE9dj92OnJbQV0ubWFwKHQpLnJlZHVjZShmdW5jdGlvbih5LHgpe3JldHVybiB5JiZ4fSwhMCk/MDoxfSl9O3AuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZT1mdW5jdGlvbihxLHIpe3ZhciB0PWwuc3VtKHEpO3JldHVybiAwPT09dD9rLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAscS5sZW5ndGgpOnEubWFwKGZ1bmN0aW9uKHYpe3JldHVybiByKnYvdH0pfTtwLl9maXhlZFNwYWNlPWZ1bmN0aW9uKHEscil7ZnVuY3Rpb24gdCh2KXtyZXR1cm4gdi5yZWR1Y2UoZnVuY3Rpb24oQSwKeSl7cmV0dXJuIEEmJnl9LCEwKX1yZXR1cm4gdChxLm1hcChmdW5jdGlvbih2KXtyZXR1cm4gdCh2Lm1hcChyKSl9KSl9O3JldHVybiBwfShmKDI5KS5Db21wb25lbnRDb250YWluZXIpO2QuVGFibGU9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobS5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG0pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXt2YXIgbT1sLmNhbGwodGhpcyl8fHRoaXM7bS5hZGRDbGFzcygieC1kcmFnLWJveC1sYXllciIpO20uX2hhc0Nvcm5lcnM9ITE7cmV0dXJuIG19ZyhrLGwpO2sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24obSxwLHEpe2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLAptLHAscSk7dGhpcy5fc2V0Qm91bmRzKHRoaXMuYm91bmRzKCkpO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5fc2V0Qm91bmRzPWZ1bmN0aW9uKG0pe2wucHJvdG90eXBlLl9zZXRCb3VuZHMuY2FsbCh0aGlzLHt0b3BMZWZ0Ont4Om0udG9wTGVmdC54LHk6MH0sYm90dG9tUmlnaHQ6e3g6bS5ib3R0b21SaWdodC54LHk6dGhpcy5oZWlnaHQoKX19KX07ay5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24obSl7bSYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieC1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpfTtrLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gbC5wcm90b3R5cGUueVNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInlTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBYRHJhZ0JveExheWVyIik7fTtrLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGwucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTsKdGhyb3cgRXJyb3IoIlhEcmFnQm94TGF5ZXIgaGFzIG5vIHlFeHRlbnQiKTt9O3JldHVybiBrfShmKDMyKS5EcmFnQm94TGF5ZXIpO2QuWERyYWdCb3hMYXllcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihtLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbSl9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3ZhciBtPWwuY2FsbCh0aGlzKXx8dGhpczttLmFkZENsYXNzKCJ5LWRyYWctYm94LWxheWVyIik7bS5faGFzQ29ybmVycz0hMTtyZXR1cm4gbX1nKGssbCk7ay5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihtLHAscSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbSxwLApxKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2sucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24obSl7bC5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6MCx5Om0udG9wTGVmdC55fSxib3R0b21SaWdodDp7eDp0aGlzLndpZHRoKCkseTptLmJvdHRvbVJpZ2h0Lnl9fSl9O2sucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzPWZ1bmN0aW9uKG0pe20mJnRoaXMuZW5hYmxlZCgpP3RoaXMuYWRkQ2xhc3MoInktcmVzaXphYmxlIik6dGhpcy5yZW1vdmVDbGFzcygieS1yZXNpemFibGUiKX07ay5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKG0pe2lmKG51bGw9PW0pcmV0dXJuIGwucHJvdG90eXBlLnhTY2FsZS5jYWxsKHRoaXMpO3Rocm93IEVycm9yKCJ4U2NhbGVzIGNhbm5vdCBiZSBzZXQgb24gYW4gWURyYWdCb3hMYXllciIpO307ay5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBsLnByb3RvdHlwZS54RXh0ZW50LmNhbGwodGhpcyk7CnRocm93IEVycm9yKCJZRHJhZ0JveExheWVyIGhhcyBubyB4RXh0ZW50Iik7fTtyZXR1cm4ga30oZigzMikuRHJhZ0JveExheWVyKTtkLllEcmFnQm94TGF5ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobS5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG0pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXt2YXIgbT1sLmNhbGwodGhpcyl8fHRoaXM7bS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltrLl9LRVlET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHApe3JldHVybiBtLl9wcm9jZXNzS2V5ZG93bihwKX07bS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltrLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbihwKXtyZXR1cm4gbS5fcHJvY2Vzc0tleXVwKHApfTsKcmV0dXJuIG19ZyhrLGwpO2suZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbigpe3ZhciBtPWRvY3VtZW50W2suX0RJU1BBVENIRVJfS0VZXTtudWxsPT1tJiYobT1uZXcgayxkb2N1bWVudFtrLl9ESVNQQVRDSEVSX0tFWV09bSk7cmV0dXJuIG19O2sucHJvdG90eXBlLl9wcm9jZXNzS2V5ZG93bj1mdW5jdGlvbihtKXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoay5fS0VZRE9XTl9FVkVOVF9OQU1FLG0ua2V5Q29kZSxtKX07ay5wcm90b3R5cGUuX3Byb2Nlc3NLZXl1cD1mdW5jdGlvbihtKXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoay5fS0VZVVBfRVZFTlRfTkFNRSxtLmtleUNvZGUsbSl9O2sucHJvdG90eXBlLm9uS2V5RG93bj1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGsuX0tFWURPV05fRVZFTlRfTkFNRSxtKX07ay5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGsuX0tFWURPV05fRVZFTlRfTkFNRSwKbSl9O2sucHJvdG90eXBlLm9uS2V5VXA9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChrLl9LRVlVUF9FVkVOVF9OQU1FLG0pfTtrLnByb3RvdHlwZS5vZmZLZXlVcD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGsuX0tFWVVQX0VWRU5UX05BTUUsbSl9O3JldHVybiBrfShmKDI0KS5EaXNwYXRjaGVyKTtjLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9LZXkiO2MuX0tFWURPV05fRVZFTlRfTkFNRT0ia2V5ZG93biI7Yy5fS0VZVVBfRVZFTlRfTkFNRT0ia2V5dXAiO2QuS2V5PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxtKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW1bcV0pO2sucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KHAucHJvdG90eXBlPQptLnByb3RvdHlwZSxuZXcgcCl9LGw9ZigwKTtjPWZ1bmN0aW9uKGspe2Z1bmN0aW9uIG0ocCl7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxtLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfXZhciByPWsuY2FsbCh0aGlzKXx8dGhpcztyLl9sYXN0TW91c2VQb3NpdGlvbj17eDotMSx5Oi0xfTtyLl90cmFuc2xhdG9yPWwuZ2V0VHJhbnNsYXRvcihwKTtyLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW20uX01PVVNFT1ZFUl9FVkVOVF9OQU1FXT1xO3IuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbS5fTU9VU0VNT1ZFX0VWRU5UX05BTUVdPXE7ci5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvblttLl9NT1VTRU9VVF9FVkVOVF9OQU1FXT1xO3IuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbS5fTU9VU0VET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiByLl9tZWFzdXJlQW5kRGlzcGF0Y2gocCx0LG0uX01PVVNFRE9XTl9FVkVOVF9OQU1FKX07CnIuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbS5fTU9VU0VVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxtLl9NT1VTRVVQX0VWRU5UX05BTUUsInBhZ2UiKX07ci5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvblttLl9XSEVFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxtLl9XSEVFTF9FVkVOVF9OQU1FKX07ci5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvblttLl9EQkxDTElDS19FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxtLl9EQkxDTElDS19FVkVOVF9OQU1FKX07cmV0dXJuIHJ9ZyhtLGspO20uZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbihwKXt2YXIgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpLHI9cVttLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09ciYmKHI9bmV3IG0ocCkscVttLl9ESVNQQVRDSEVSX0tFWV09CnIpO3JldHVybiByfTttLnByb3RvdHlwZS5vbk1vdXNlTW92ZT1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KG0uX01PVVNFTU9WRV9FVkVOVF9OQU1FLHApfTttLnByb3RvdHlwZS5vZmZNb3VzZU1vdmU9ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChtLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSxwKX07bS5wcm90b3R5cGUub25Nb3VzZURvd249ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChtLl9NT1VTRURPV05fRVZFTlRfTkFNRSxwKX07bS5wcm90b3R5cGUub2ZmTW91c2VEb3duPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobS5fTU9VU0VET1dOX0VWRU5UX05BTUUscCl9O20ucHJvdG90eXBlLm9uTW91c2VVcD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KG0uX01PVVNFVVBfRVZFTlRfTkFNRSxwKX07bS5wcm90b3R5cGUub2ZmTW91c2VVcD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG0uX01PVVNFVVBfRVZFTlRfTkFNRSwKcCl9O20ucHJvdG90eXBlLm9uV2hlZWw9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChtLl9XSEVFTF9FVkVOVF9OQU1FLHApO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZXaGVlbD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG0uX1dIRUVMX0VWRU5UX05BTUUscCl9O20ucHJvdG90eXBlLm9uRGJsQ2xpY2s9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChtLl9EQkxDTElDS19FVkVOVF9OQU1FLHApfTttLnByb3RvdHlwZS5vZmZEYmxDbGljaz1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG0uX0RCTENMSUNLX0VWRU5UX05BTUUscCl9O20ucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24ocCxxLHIsdCl7dm9pZCAwPT09dCYmKHQ9ImVsZW1lbnQiKTtpZigicGFnZSIhPT10JiYiZWxlbWVudCIhPT10KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK3QrCiInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigicGFnZSI9PT10fHx0aGlzLmV2ZW50SW5zaWRlKHAscSkpdGhpcy5fbGFzdE1vdXNlUG9zaXRpb249dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24ocS5jbGllbnRYLHEuY2xpZW50WSksdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHIsdGhpcy5sYXN0TW91c2VQb3NpdGlvbigpLHEpfTttLnByb3RvdHlwZS5ldmVudEluc2lkZT1mdW5jdGlvbihwLHEpe3JldHVybiBsLlRyYW5zbGF0b3IuaXNFdmVudEluc2lkZShwLHEpfTttLnByb3RvdHlwZS5sYXN0TW91c2VQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXN0TW91c2VQb3NpdGlvbn07cmV0dXJuIG19KGYoMjQpLkRpc3BhdGNoZXIpO2MuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX01vdXNlIjtjLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIjtjLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIjsKYy5fTU9VU0VPVVRfRVZFTlRfTkFNRT0ibW91c2VvdXQiO2MuX01PVVNFRE9XTl9FVkVOVF9OQU1FPSJtb3VzZWRvd24iO2MuX01PVVNFVVBfRVZFTlRfTkFNRT0ibW91c2V1cCI7Yy5fV0hFRUxfRVZFTlRfTkFNRT0id2hlZWwiO2MuX0RCTENMSUNLX0VWRU5UX05BTUU9ImRibGNsaWNrIjtkLk1vdXNlPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxtKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW1bcV0pO2sucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KHAucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBwKX0sbD1mKDApO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbShwKXt2YXIgcT1rLmNhbGwodGhpcyl8fHRoaXM7cS5fdHJhbnNsYXRvcj1sLmdldFRyYW5zbGF0b3IocCk7cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvblttLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPQpmdW5jdGlvbihyKXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKHAscixtLl9UT1VDSFNUQVJUX0VWRU5UX05BTUUsInBhZ2UiKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvblttLl9UT1VDSE1PVkVfRVZFTlRfTkFNRV09ZnVuY3Rpb24ocil7cmV0dXJuIHEuX21lYXN1cmVBbmREaXNwYXRjaChwLHIsbS5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUsInBhZ2UiKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvblttLl9UT1VDSEVORF9FVkVOVF9OQU1FXT1mdW5jdGlvbihyKXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKHAscixtLl9UT1VDSEVORF9FVkVOVF9OQU1FLCJwYWdlIil9O3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbS5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRV09ZnVuY3Rpb24ocil7cmV0dXJuIHEuX21lYXN1cmVBbmREaXNwYXRjaChwLHIsbS5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gcX1nKG0sayk7bS5nZXREaXNwYXRjaGVyPQpmdW5jdGlvbihwKXt2YXIgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpLHI9cVttLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09ciYmKHI9bmV3IG0ocCkscVttLl9ESVNQQVRDSEVSX0tFWV09cik7cmV0dXJuIHJ9O20ucHJvdG90eXBlLm9uVG91Y2hTdGFydD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KG0uX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSxwKX07bS5wcm90b3R5cGUub2ZmVG91Y2hTdGFydD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG0uX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSxwKX07bS5wcm90b3R5cGUub25Ub3VjaE1vdmU9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChtLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSxwKX07bS5wcm90b3R5cGUub2ZmVG91Y2hNb3ZlPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobS5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUscCl9O20ucHJvdG90eXBlLm9uVG91Y2hFbmQ9CmZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobS5fVE9VQ0hFTkRfRVZFTlRfTkFNRSxwKX07bS5wcm90b3R5cGUub2ZmVG91Y2hFbmQ9ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChtLl9UT1VDSEVORF9FVkVOVF9OQU1FLHApfTttLnByb3RvdHlwZS5vblRvdWNoQ2FuY2VsPWZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobS5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSxwKX07bS5wcm90b3R5cGUub2ZmVG91Y2hDYW5jZWw9ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChtLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLHApfTttLnByb3RvdHlwZS5fbWVhc3VyZUFuZERpc3BhdGNoPWZ1bmN0aW9uKHAscSxyLHQpe3ZvaWQgMD09PXQmJih0PSJlbGVtZW50Iik7aWYoInBhZ2UiIT09dCYmImVsZW1lbnQiIT09dCl0aHJvdyBFcnJvcigiSW52YWxpZCBzY29wZSAnIit0KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTsKaWYoImVsZW1lbnQiIT09dHx8dGhpcy5ldmVudEluc2lkZShwLHEpKXtwPXEuY2hhbmdlZFRvdWNoZXM7dD17fTtmb3IodmFyIHY9W10sQT0wO0E8cC5sZW5ndGg7QSsrKXt2YXIgeT1wW0FdLHg9eS5pZGVudGlmaWVyO3k9dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24oeS5jbGllbnRYLHkuY2xpZW50WSk7bnVsbCE9eSYmKHRbeF09eSx2LnB1c2goeCkpfTA8di5sZW5ndGgmJnRoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChyLHYsdCxxKX19O20ucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKHAscSl7cmV0dXJuIGwuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKHAscSl9O3JldHVybiBtfShmKDI0KS5EaXNwYXRjaGVyKTtjLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9Ub3VjaCI7Yy5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FPSJ0b3VjaHN0YXJ0IjtjLl9UT1VDSE1PVkVfRVZFTlRfTkFNRT0idG91Y2htb3ZlIjtjLl9UT1VDSEVORF9FVkVOVF9OQU1FPQoidG91Y2hlbmQiO2MuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUU9InRvdWNoY2FuY2VsIjtkLlRvdWNoPWN9LGZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyxsLGspe3ZvaWQgMD09PWsmJihrPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTt0aGlzLnNjcmVlbldpZHRoPWc7dGhpcy5zY3JlZW5IZWlnaHQ9bDt0aGlzLmRldmljZVBpeGVsUmF0aW89azt0aGlzLnBpeGVsV2lkdGg9ZyprO3RoaXMucGl4ZWxIZWlnaHQ9bCprO3RoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3RoaXMuY3R4PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIik7Zi5zaXplUGl4ZWxzKHRoaXMuY3R4LGcsbCxrKX1mLnNpemVQaXhlbHM9ZnVuY3Rpb24oZyxsLGssbSl7dmFyIHA9Zy5jYW52YXM7cC53aWR0aD1sKm07cC5oZWlnaHQ9ayptO3Auc3R5bGUud2lkdGg9bCsicHgiO3Auc3R5bGUuaGVpZ2h0PWsrInB4IjtnLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsCjApO2cuc2NhbGUobSxtKX07Zi5wcm90b3R5cGUuYmxpdD1mdW5jdGlvbihnLGwsayl7dm9pZCAwPT09bCYmKGw9MCk7dm9pZCAwPT09ayYmKGs9MCk7Zy5kcmF3SW1hZ2UodGhpcy5jYW52YXMsbCxrLHRoaXMuc2NyZWVuV2lkdGgsdGhpcy5zY3JlZW5IZWlnaHQpfTtmLnByb3RvdHlwZS5ibGl0Q2VudGVyPWZ1bmN0aW9uKGcsbCxrKXt2b2lkIDA9PT1sJiYobD0wKTt2b2lkIDA9PT1rJiYoaz0wKTt0aGlzLmJsaXQoZyxNYXRoLmZsb29yKGwtdGhpcy5zY3JlZW5XaWR0aC8yKSxNYXRoLmZsb29yKGstdGhpcy5zY3JlZW5IZWlnaHQvMikpfTtmLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oZyxsLGspe3ZvaWQgMD09PWsmJihrPSExKTt2YXIgbT10aGlzLmRldmljZVBpeGVsUmF0aW87dGhpcy5zY3JlZW5XaWR0aD1nO3RoaXMuc2NyZWVuSGVpZ2h0PWw7dGhpcy5waXhlbFdpZHRoPWcqbTt0aGlzLnBpeGVsSGVpZ2h0PWwqbTtmLnNpemVQaXhlbHModGhpcy5jdHgsZyxsLG0pO2smJgp0aGlzLmN0eC50cmFuc2xhdGUoZy8yLGcvMik7cmV0dXJuIHRoaXN9O2YucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGcpe3ZhciBsPXRoaXMucGl4ZWxXaWR0aCxrPXRoaXMucGl4ZWxIZWlnaHQsbT10aGlzLmN0eDttLnNhdmUoKTttLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7bnVsbD09Zz9tLmNsZWFyUmVjdCgwLDAsbCxrKToobS5maWxsU3R5bGU9ZyxtLmZpbGxSZWN0KDAsMCxsLGspKTttLnJlc3RvcmUoKTtyZXR1cm4gdGhpc307Zi5wcm90b3R5cGUuZ2V0SW1hZ2VEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLDAsdGhpcy5waXhlbFdpZHRoLHRoaXMucGl4ZWxIZWlnaHQpfTtyZXR1cm4gZn0oKTtkLkNhbnZhc0J1ZmZlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYKKG1bcl09cFtyXSk7bS5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMTMpLGs9ZigwKTtjPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAoKXt2YXIgcT1udWxsIT09bSYmbS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cS5fY2xpY2tlZERvd249ITE7cS5fZG91YmxlQ2xpY2tpbmc9ITE7cS5fb25DbGlja0NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtxLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3EuX21vdXNlRG93bkNhbGxiYWNrPWZ1bmN0aW9uKHIpe3JldHVybiBxLl9oYW5kbGVDbGlja0Rvd24ocil9O3EuX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9oYW5kbGVDbGlja1VwKHIsdCl9O3EuX2RibENsaWNrQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5faGFuZGxlRGJsQ2xpY2socix0KX07cS5fdG91Y2hTdGFydENhbGxiYWNrPQpmdW5jdGlvbihyLHQpe3JldHVybiBxLl9oYW5kbGVDbGlja0Rvd24odFtyWzBdXSl9O3EuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24ocix0LHYpe3JldHVybiBxLl9oYW5kbGVDbGlja1VwKHRbclswXV0sdil9O3EuX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gcS5fY2xpY2tlZERvd249ITF9O3JldHVybiBxfWcocCxtKTtwLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHEpe20ucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLHEpO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1sLk1vdXNlLmdldERpc3BhdGNoZXIocSk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uRGJsQ2xpY2sodGhpcy5fZGJsQ2xpY2tDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPQpsLlRvdWNoLmdldERpc3BhdGNoZXIocSk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spfTtwLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXttLnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VVcCh0aGlzLl9tb3VzZVVwQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZEYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spOwp0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsfTtwLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tEb3duPWZ1bmN0aW9uKHEpe3E9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTt0aGlzLl9pc0luc2lkZUNvbXBvbmVudChxKSYmKHRoaXMuX2NsaWNrZWREb3duPSEwLHRoaXMuX2NsaWNrZWRQb2ludD1xKX07cC5wcm90b3R5cGUuX2hhbmRsZUNsaWNrVXA9ZnVuY3Rpb24ocSxyKXt2YXIgdD10aGlzLHY9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTt0aGlzLl9jbGlja2VkRG93biYmcC5fcG9pbnRzRXF1YWwodix0aGlzLl9jbGlja2VkUG9pbnQpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fZG91YmxlQ2xpY2tpbmd8fHQuX29uQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh2LApyKX0sMCk7dGhpcy5fY2xpY2tlZERvd249ITF9O3AucHJvdG90eXBlLl9oYW5kbGVEYmxDbGljaz1mdW5jdGlvbihxLHIpe3ZhciB0PXRoaXM7cT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHEpO3RoaXMuX2RvdWJsZUNsaWNraW5nPSEwO3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhxLHIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5fZG91YmxlQ2xpY2tpbmc9ITF9LDApfTtwLl9wb2ludHNFcXVhbD1mdW5jdGlvbihxLHIpe3JldHVybiBxLng9PT1yLngmJnEueT09PXIueX07cC5wcm90b3R5cGUub25DbGljaz1mdW5jdGlvbihxKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmFkZChxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmQ2xpY2s9ZnVuY3Rpb24ocSl7dGhpcy5fb25DbGlja0NhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uRG91YmxlQ2xpY2s9ZnVuY3Rpb24ocSl7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5hZGQocSl9OwpwLnByb3RvdHlwZS5vZmZEb3VibGVDbGljaz1mdW5jdGlvbihxKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShxKTtyZXR1cm4gdGhpc307cmV0dXJuIHB9KGYoMTUpLkludGVyYWN0aW9uKTtkLkNsaWNrPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihtW3JdPXBbcl0pO20ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEzKSxrPWYoMCk7Yz1mdW5jdGlvbihtKXtmdW5jdGlvbiBwKCl7dmFyIHE9bnVsbCE9PW0mJm0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3EuX2RyYWdnaW5nPSExO3EuX2NvbnN0cmFpbmVkVG9Db21wb25lbnQ9ITA7cS5fbW91c2VGaWx0ZXI9cC5fREVGQVVMVF9NT1VTRV9GSUxURVI7CnEuX2RyYWdTdGFydENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtxLl9kcmFnQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3EuX2RyYWdFbmRDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7cS5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5fc3RhcnREcmFnKHIsdCl9O3EuX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHIpe3JldHVybiBxLl9kb0RyYWcocil9O3EuX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9lbmREcmFnKHIsdCl9O3EuX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihyLHQsdil7cmV0dXJuIHEuX3N0YXJ0RHJhZyh0W3JbMF1dLHYpfTtxLl90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9kb0RyYWcodFtyWzBdXSl9O3EuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24ocix0LHYpe3JldHVybiBxLl9lbmREcmFnKHRbclswXV0sdil9O3JldHVybiBxfWcocCxtKTtwLnByb3RvdHlwZS5fYW5jaG9yPQpmdW5jdGlvbihxKXttLnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxxKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPWwuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKX07CnAucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe20ucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O3AucHJvdG90eXBlLl90cmFuc2xhdGVBbmRDb25zdHJhaW49CmZ1bmN0aW9uKHEpe3E9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTtyZXR1cm4gdGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD97eDprLk1hdGguY2xhbXAocS54LDAsdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby53aWR0aCgpKSx5OmsuTWF0aC5jbGFtcChxLnksMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpKX06cX07cC5wcm90b3R5cGUuX3N0YXJ0RHJhZz1mdW5jdGlvbihxLHIpe3IgaW5zdGFuY2VvZiBNb3VzZUV2ZW50JiYhdGhpcy5fbW91c2VGaWx0ZXIocil8fChxPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UocSksdGhpcy5faXNJbnNpZGVDb21wb25lbnQocSkmJihyLnByZXZlbnREZWZhdWx0KCksdGhpcy5fZHJhZ2dpbmc9ITAsdGhpcy5fZHJhZ09yaWdpbj1xLHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4pKSl9O3AucHJvdG90eXBlLl9kb0RyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ2dpbmcmJgp0aGlzLl9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbix0aGlzLl90cmFuc2xhdGVBbmRDb25zdHJhaW4ocSkpfTtwLnByb3RvdHlwZS5fZW5kRHJhZz1mdW5jdGlvbihxLHIpe3IgaW5zdGFuY2VvZiBNb3VzZUV2ZW50JiYwIT09ci5idXR0b258fCF0aGlzLl9kcmFnZ2luZ3x8KHRoaXMuX2RyYWdnaW5nPSExLHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihxKSkpfTtwLnByb3RvdHlwZS5jb25zdHJhaW5lZFRvQ29tcG9uZW50PWZ1bmN0aW9uKCl7dGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMX07cC5wcm90b3R5cGUubW91c2VGaWx0ZXI9ZnVuY3Rpb24ocSl7MCE9PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLl9tb3VzZUZpbHRlcj1xKX07cC5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChxKX07CnAucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShxKX07cmV0dXJuIHB9KGYoMTUpLkludGVyYWN0aW9uKTtjLl9ERUZBVUxUX01PVVNFX0ZJTFRFUj1mdW5jdGlvbihtKXtyZXR1cm4gMD09PW0uYnV0dG9ufTtkLkRyYWc9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LHYpe2Z1bmN0aW9uIEEoKXt0aGlzLmNvbnN0cnVjdG9yPQp0fWZvcih2YXIgeSBpbiB2KXYuaGFzT3duUHJvcGVydHkoeSkmJih0W3ldPXZbeV0pO3QucHJvdG90eXBlPW51bGw9PT12P09iamVjdC5jcmVhdGUodik6KEEucHJvdG90eXBlPXYucHJvdG90eXBlLG5ldyBBKX0sbD1mKDEpLGs9ZigxMyksbT1mKDMpLHA9ZigwKSxxPWYoMjUpO2M9ZigxNSk7dmFyIHI9ZigyNik7Zj1mdW5jdGlvbih0KXtmdW5jdGlvbiB2KEEseSl7dmFyIHg9dC5jYWxsKHRoaXMpfHx0aGlzO3guX3doZWVsRmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3guX3doZWVsQ2FsbGJhY2s9ZnVuY3Rpb24oQyxGKXtyZXR1cm4geC5faGFuZGxlV2hlZWxFdmVudChDLEYpfTt4Ll90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24oQyxGKXtyZXR1cm4geC5faGFuZGxlVG91Y2hTdGFydChDLEYpfTt4Ll90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbihDLEYpe3JldHVybiB4Ll9oYW5kbGVQaW5jaChDLEYpfTt4Ll90b3VjaEVuZENhbGxiYWNrPWZ1bmN0aW9uKEMpe3JldHVybiB4Ll9oYW5kbGVUb3VjaEVuZChDKX07CnguX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHguX2hhbmRsZVRvdWNoRW5kKEMpfTt4Ll9wYW5FbmRDYWxsYmFja3M9bmV3IHAuQ2FsbGJhY2tTZXQ7eC5fem9vbUVuZENhbGxiYWNrcz1uZXcgcC5DYWxsYmFja1NldDt4Ll9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzPW5ldyBwLkNhbGxiYWNrU2V0O3guX3hTY2FsZXM9bmV3IHAuU2V0O3guX3lTY2FsZXM9bmV3IHAuU2V0O3guX2RyYWdJbnRlcmFjdGlvbj1uZXcgcS5EcmFnO3guX3NldHVwRHJhZ0ludGVyYWN0aW9uKCk7eC5fdG91Y2hJZHM9bC5tYXAoKTt4Ll9taW5Eb21haW5FeHRlbnRzPW5ldyBwLk1hcDt4Ll9tYXhEb21haW5FeHRlbnRzPW5ldyBwLk1hcDt4Ll9taW5Eb21haW5WYWx1ZXM9bmV3IHAuTWFwO3guX21heERvbWFpblZhbHVlcz1uZXcgcC5NYXA7bnVsbCE9QSYmeC5hZGRYU2NhbGUoQSk7bnVsbCE9eSYmeC5hZGRZU2NhbGUoeSk7cmV0dXJuIHh9Zyh2LHQpO3YucHJvdG90eXBlLmRyYWdJbnRlcmFjdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9ufTt2LnByb3RvdHlwZS53aGVlbEZpbHRlcj1mdW5jdGlvbihBKXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX3doZWVsRmlsdGVyPUEpfTt2LnByb3RvdHlwZS5wYW49ZnVuY3Rpb24oQSl7dmFyIHk9dGhpczt0aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3gucGFuKHkuX2NvbnN0cmFpbmVkVHJhbnNsYXRpb24oeCxBLngpKX0pO3RoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5wYW4oeS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih4LEEueSkpfSk7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3YucHJvdG90eXBlLnpvb209ZnVuY3Rpb24oQSx5LHgpe3ZhciBDPXRoaXM7dm9pZCAwPT09eCYmKHg9ITApO2lmKG51bGwhPXkpe3ZhciBGPXkueDt2YXIgRD15Lnk7eCYmKHRoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQiwKQSxGKTtGPUIuY2VudGVyUG9pbnQ7QT1CLnpvb21BbW91bnR9KSx0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0I9Qy5fY29uc3RyYWluZWRab29tKEIsQSxEKTtEPUIuY2VudGVyUG9pbnQ7QT1CLnpvb21BbW91bnR9KSl9dGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgRz1CLnJhbmdlKCk7Qi56b29tKEEsbnVsbD09Rj8oR1sxXStHWzBdKS8yOkYpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgRz1CLnJhbmdlKCk7Qi56b29tKEEsbnVsbD09RD8oR1sxXStHWzBdKS8yOkQpfSk7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCk7cmV0dXJue3pvb21BbW91bnQ6QSxjZW50ZXJWYWx1ZTp7Y2VudGVyWDpGLGNlbnRlclk6RH19fTt2LnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKEEpe3QucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLEEpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyhBKTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPWsuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9ay5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spfTt2LnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmV2hlZWwodGhpcy5fd2hlZWxDYWxsYmFjayk7CnRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbDt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9O3YucHJvdG90eXBlLl9oYW5kbGVUb3VjaFN0YXJ0PWZ1bmN0aW9uKEEseSl7Zm9yKHZhciB4PTA7eDxBLmxlbmd0aCYmMj50aGlzLl90b3VjaElkcy5zaXplKCk7eCsrKXt2YXIgQz1BW3hdO3RoaXMuX3RvdWNoSWRzLnNldChDLnRvU3RyaW5nKCksdGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh5W0NdKSl9fTsKdi5wcm90b3R5cGUuX2hhbmRsZVBpbmNoPWZ1bmN0aW9uKEEseSl7dmFyIHg9dGhpcztpZighKDI+dGhpcy5fdG91Y2hJZHMuc2l6ZSgpKSl7dmFyIEM9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7aWYodGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzBdKSkmJnRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQ1sxXSkpKXt2YXIgRj12Ll9wb2ludERpc3RhbmNlKENbMF0sQ1sxXSk7aWYoMCE9PUYpe0EuZm9yRWFjaChmdW5jdGlvbihMKXt4Ll90b3VjaElkcy5oYXMoTC50b1N0cmluZygpKSYmeC5fdG91Y2hJZHMuc2V0KEwudG9TdHJpbmcoKSx4Ll90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHlbTF0pKX0pO0E9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7dmFyIEQ9di5fcG9pbnREaXN0YW5jZShBWzBdLEFbMV0pO2lmKDAhPT1EKXt2YXIgQj1GL0QsRz1BLm1hcChmdW5jdGlvbihMLApKKXtyZXR1cm57eDooTC54LUNbSl0ueCkvQix5OihMLnktQ1tKXS55KS9CfX0pO0Y9di5jZW50ZXJQb2ludChDWzBdLENbMV0pO0Y9dGhpcy56b29tKEIsRik7QT1GLmNlbnRlclZhbHVlO3ZhciBLPUYuem9vbUFtb3VudDtGPUEuY2VudGVyWDtBPUEuY2VudGVyWTtEPUMubWFwKGZ1bmN0aW9uKEwsSil7cmV0dXJue3g6R1tKXS54KksrTC54LHk6R1tKXS55KksrTC55fX0pO3RoaXMucGFuKHt4OkYtKERbMF0ueCtEWzFdLngpLzIseTpBLShEWzBdLnkrRFsxXS55KS8yfSl9fX19fTt2LmNlbnRlclBvaW50PWZ1bmN0aW9uKEEseSl7cmV0dXJue3g6KE1hdGgubWluKEEueCx5LngpK01hdGgubWF4KEEueCx5LngpKS8yLHk6KE1hdGgubWF4KEEueSx5LnkpK01hdGgubWluKEEueSx5LnkpKS8yfX07di5fcG9pbnREaXN0YW5jZT1mdW5jdGlvbihBLHkpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coTWF0aC5tYXgoQS54LHkueCktTWF0aC5taW4oQS54LHkueCksMikrTWF0aC5wb3coTWF0aC5tYXgoQS55LAp5LnkpLU1hdGgubWluKEEueSx5LnkpLDIpKX07di5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRW5kPWZ1bmN0aW9uKEEpe3ZhciB5PXRoaXM7QS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3kuX3RvdWNoSWRzLnJlbW92ZSh4LnRvU3RyaW5nKCkpfSk7MDx0aGlzLl90b3VjaElkcy5zaXplKCkmJnRoaXMuX3pvb21FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfTt2LnByb3RvdHlwZS5faGFuZGxlV2hlZWxFdmVudD1mdW5jdGlvbihBLHkpe3RoaXMuX3doZWVsRmlsdGVyKHkpJiYoQT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKEEpLHRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KEEpJiYoeS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuem9vbShNYXRoLnBvdygyLCgwIT09eS5kZWx0YVk/eS5kZWx0YVk6eS5kZWx0YVgpKih5LmRlbHRhTW9kZT92Ll9QSVhFTFNfUEVSX0xJTkU6MSkqLjAwMiksQSksdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCkpKX07di5wcm90b3R5cGUuX2NvbnN0cmFpbmVkWm9vbT0KZnVuY3Rpb24oQSx5LHgpe3JldHVybiByLmNvbnN0cmFpbmVkWm9vbShBLHkseCx0aGlzLm1pbkRvbWFpbkV4dGVudChBKSx0aGlzLm1heERvbWFpbkV4dGVudChBKSx0aGlzLm1pbkRvbWFpblZhbHVlKEEpLHRoaXMubWF4RG9tYWluVmFsdWUoQSkpfTt2LnByb3RvdHlwZS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihBLHkpe3JldHVybiByLmNvbnN0cmFpbmVkVHJhbnNsYXRpb24oQSx5LHRoaXMubWluRG9tYWluVmFsdWUoQSksdGhpcy5tYXhEb21haW5WYWx1ZShBKSl9O3YucHJvdG90eXBlLl9zZXR1cERyYWdJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3ZhciBBPXRoaXM7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmNvbnN0cmFpbmVkVG9Db21wb25lbnQoKTt2YXIgeTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoZnVuY3Rpb24oKXtyZXR1cm4geT1udWxsfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyhmdW5jdGlvbih4LEMpezI8PUEuX3RvdWNoSWRzLnNpemUoKXx8CihBLnBhbih7eDoobnVsbD09eT94Lng6eS54KS1DLngseToobnVsbD09eT94Lnk6eS55KS1DLnl9KSx5PUMpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChmdW5jdGlvbigpe3JldHVybiBBLl9wYW5FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfSl9O3YucHJvdG90eXBlLl9ub25MaW5lYXJTY2FsZVdpdGhFeHRlbnRzPWZ1bmN0aW9uKEEpe3JldHVybiBudWxsIT10aGlzLm1pbkRvbWFpbkV4dGVudChBKSYmbnVsbCE9dGhpcy5tYXhEb21haW5FeHRlbnQoQSkmJiEoQSBpbnN0YW5jZW9mIG0uTGluZWFyKSYmIShBIGluc3RhbmNlb2YgbS5UaW1lKX07di5wcm90b3R5cGUueFNjYWxlcz1mdW5jdGlvbigpe3ZhciBBPVtdO3RoaXMuX3hTY2FsZXMuZm9yRWFjaChmdW5jdGlvbih5KXtBLnB1c2goeSl9KTtyZXR1cm4gQX07di5wcm90b3R5cGUueVNjYWxlcz1mdW5jdGlvbigpe3ZhciBBPVtdO3RoaXMuX3lTY2FsZXMuZm9yRWFjaChmdW5jdGlvbih5KXtBLnB1c2goeSl9KTsKcmV0dXJuIEF9O3YucHJvdG90eXBlLmFkZFhTY2FsZT1mdW5jdGlvbihBKXt0aGlzLl94U2NhbGVzLmFkZChBKX07di5wcm90b3R5cGUucmVtb3ZlWFNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3hTY2FsZXMuZGVsZXRlKEEpO3RoaXMuX21pbkRvbWFpbkV4dGVudHMuZGVsZXRlKEEpO3RoaXMuX21heERvbWFpbkV4dGVudHMuZGVsZXRlKEEpO3RoaXMuX21pbkRvbWFpblZhbHVlcy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUuYWRkWVNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3lTY2FsZXMuYWRkKEEpfTt2LnByb3RvdHlwZS5yZW1vdmVZU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feVNjYWxlcy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpOwpyZXR1cm4gdGhpc307di5wcm90b3R5cGUubWluRG9tYWluRXh0ZW50PWZ1bmN0aW9uKEEpe3JldHVybiB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmdldChBKX07di5wcm90b3R5cGUubWF4RG9tYWluRXh0ZW50PWZ1bmN0aW9uKEEpe3JldHVybiB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmdldChBKX07di5wcm90b3R5cGUubWluRG9tYWluVmFsdWU9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9taW5Eb21haW5WYWx1ZXMuZ2V0KEEpO3RoaXMuX21pbkRvbWFpblZhbHVlcy5zZXQoQSx5KTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUubWF4RG9tYWluVmFsdWU9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9tYXhEb21haW5WYWx1ZXMuZ2V0KEEpO3RoaXMuX21heERvbWFpblZhbHVlcy5zZXQoQSx5KTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUuc2V0TWluTWF4RG9tYWluVmFsdWVzVG89ZnVuY3Rpb24oQSl7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTsKdGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZShBKTt2YXIgeT1BLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkseD15WzFdO3RoaXMubWluRG9tYWluVmFsdWUoQSx5WzBdKTt0aGlzLm1heERvbWFpblZhbHVlKEEseCk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLm9uUGFuRW5kPWZ1bmN0aW9uKEEpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5hZGQoQSl9O3YucHJvdG90eXBlLm9mZlBhbkVuZD1mdW5jdGlvbihBKXt0aGlzLl9wYW5FbmRDYWxsYmFja3MuZGVsZXRlKEEpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS5vblpvb21FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fem9vbUVuZENhbGxiYWNrcy5hZGQoQSl9O3YucHJvdG90eXBlLm9mZlpvb21FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fem9vbUVuZENhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLm9uUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbihBKXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmFkZChBKTsKcmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLm9mZlBhblpvb21VcGRhdGU9ZnVuY3Rpb24oQSl7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3JldHVybiB2fShjLkludGVyYWN0aW9uKTtmLl9QSVhFTFNfUEVSX0xJTkU9MTIwO2QuUGFuWm9vbT1mfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobVtyXT1wW3JdKTttLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigxMyksaz1mKDApO2M9ZnVuY3Rpb24obSl7ZnVuY3Rpb24gcCgpe3ZhciBxPW51bGwhPT1tJiZtLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztxLl9vdmVyQ29tcG9uZW50PSExO3EuX3BvaW50ZXJFbnRlckNhbGxiYWNrcz0KbmV3IGsuQ2FsbGJhY2tTZXQ7cS5fcG9pbnRlck1vdmVDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7cS5fcG9pbnRlckV4aXRDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7cS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5faGFuZGxlTW91c2VFdmVudChyLHQpfTtxLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24ocix0LHYpe3JldHVybiBxLl9oYW5kbGVUb3VjaEV2ZW50KHRbclswXV0sdil9O3JldHVybiBxfWcocCxtKTtwLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHEpe20ucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLHEpO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1sLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pOwp0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9O3AucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe20ucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O3AucHJvdG90eXBlLl9oYW5kbGVNb3VzZUV2ZW50PWZ1bmN0aW9uKHEscil7cj10aGlzLl9tb3VzZURpc3BhdGNoZXIuZXZlbnRJbnNpZGUodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyxyKTt0aGlzLl9oYW5kbGVQb2ludGVyRXZlbnQocSxyKX07cC5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRXZlbnQ9ZnVuY3Rpb24ocSxyKXtyPXRoaXMuX3RvdWNoRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLApyKTt0aGlzLl9oYW5kbGVQb2ludGVyRXZlbnQocSxyKX07cC5wcm90b3R5cGUuX2hhbmRsZVBvaW50ZXJFdmVudD1mdW5jdGlvbihxLHIpe3E9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTt2YXIgdD10aGlzLl9pc0luc2lkZUNvbXBvbmVudChxKTt0JiZyPyh0aGlzLl9vdmVyQ29tcG9uZW50fHx0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhxKSx0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHEpKTp0aGlzLl9vdmVyQ29tcG9uZW50JiZ0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHEpO3RoaXMuX292ZXJDb21wb25lbnQ9dCYmcn07cC5wcm90b3R5cGUub25Qb2ludGVyRW50ZXI9ZnVuY3Rpb24ocSl7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmFkZChxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmUG9pbnRlckVudGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5kZWxldGUocSk7CnJldHVybiB0aGlzfTtwLnByb3RvdHlwZS5vblBvaW50ZXJNb3ZlPWZ1bmN0aW9uKHEpe3RoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmUG9pbnRlck1vdmU9ZnVuY3Rpb24ocSl7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5vblBvaW50ZXJFeGl0PWZ1bmN0aW9uKHEpe3RoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmUG9pbnRlckV4aXQ9ZnVuY3Rpb24ocSl7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuZGVsZXRlKHEpO3JldHVybiB0aGlzfTtyZXR1cm4gcH0oZigxNSkuSW50ZXJhY3Rpb24pO2QuUG9pbnRlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigyMCk7ZC5tZW1UaHVuaz1mdW5jdGlvbigpe2Zvcih2YXIgbD1bXSxrPTA7azxhcmd1bWVudHMubGVuZ3RoO2srKylsW2tdPWFyZ3VtZW50c1trXTt2YXIgbT1sLnNsaWNlKDAsLTEpLHA9Zy5tZW1vaXplKGxbbC5sZW5ndGgtCjFdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcT10aGlzLHI9bS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXBwbHkocSl9KTtyZXR1cm4gcC5hcHBseSh2b2lkIDAscil9fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoNDkpO2QubWVtb2l6ZT1mdW5jdGlvbihsKXtmdW5jdGlvbiBrKCl7Zm9yKHZhciB0PVtdLHY9MDt2PGFyZ3VtZW50cy5sZW5ndGg7disrKXRbdl09YXJndW1lbnRzW3ZdO2lmKHEpcmV0dXJuIHA7dj1nLnNpZ25BcnJheSh0KTt2b2lkIDA9PT1tfHxtLmlzRGlmZmVyZW50KHYpPyhyJiZjb25zb2xlLmxvZygiY2FjaGUgbWlzcyEgY29tcHV0aW5nIiksbT12LHA9bC5hcHBseSh0aGlzLHQpKTpyJiZjb25zb2xlLmxvZygiY2FjaGUgaGl0ISIpO3JldHVybiBwfXZhciBtPXZvaWQgMCxwLHE9ITEscj0hMTtrLmRvTG9ja2VkPWZ1bmN0aW9uKHQpe2lmKHEpdGhyb3cgRXJyb3IoIkxvY2tpbmcgYW4gYWxyZWFkeSBsb2NrZWQgbWVtb2l6ZSBmdW5jdGlvbiEiKTtxPSEwOwp0PXQuYXBwbHkodGhpcyk7cT0hMTtyZXR1cm4gdH07ay5sb2dQZXJmb3JtYW5jZT1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMCk7cj10O3JldHVybiB0aGlzfTtyZXR1cm4ga319LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbD1mKDMpLGs9ZigwKSxtPWYoMjcpLHA9ZigyKTtjPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHIodCl7dm9pZCAwPT09dCYmKHQ9InZlcnRpY2FsIik7dD1xLmNhbGwodGhpcyx0KXx8dGhpczt0Ll9jbHVzdGVyT2Zmc2V0cz1uZXcgay5NYXA7cmV0dXJuIHR9ZyhyLHEpO3IucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj0KZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHkucmFuZ2VCYW5kKCl9dmFyIHY9dGhpcyxBPXEucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLHk9dGhpcy5fbWFrZUlubmVyU2NhbGUoKTtBLndpZHRoPXRoaXMuX2lzVmVydGljYWw/dDpBLndpZHRoO0EuaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/QS5oZWlnaHQ6dDt2YXIgeD1BLngsQz1BLnk7QS54PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRixELEIpe3JldHVybiB4KEYsRCxCKSt2Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9OmZ1bmN0aW9uKEYsRCxCKXtyZXR1cm4geChGLEQsQil9O0EueT10aGlzLl9pc1ZlcnRpY2FsP2Z1bmN0aW9uKEYsRCxCKXtyZXR1cm4gQyhGLEQsQil9OmZ1bmN0aW9uKEYsRCxCKXtyZXR1cm4gQyhGLEQsQikrdi5fY2x1c3Rlck9mZnNldHMuZ2V0KEIpfTtyZXR1cm4gQX07ci5wcm90b3R5cGUuX3VwZGF0ZUNsdXN0ZXJQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciB0PQp0aGlzLHY9dGhpcy5fbWFrZUlubmVyU2NhbGUoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihBLHkpe3JldHVybiB0Ll9jbHVzdGVyT2Zmc2V0cy5zZXQoQSx2LnNjYWxlKFN0cmluZyh5KSktdi5yYW5nZUJhbmQoKS8yKX0pfTtyLnByb3RvdHlwZS5fbWFrZUlubmVyU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbC5DYXRlZ29yeTt0LmRvbWFpbih0aGlzLmRhdGFzZXRzKCkubWFwKGZ1bmN0aW9uKEEseSl7cmV0dXJuIFN0cmluZyh5KX0pKTt2YXIgdj1wLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuYXR0cihtLkJhci5fQkFSX1RISUNLTkVTU19LRVkpKTt0LnJhbmdlKFswLHYobnVsbCwwLG51bGwpXSk7cmV0dXJuIHR9O3IucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uKCk7cmV0dXJuIHEucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyl9O3JldHVybiByfShtLkJhcik7ZC5DbHVzdGVyZWRCYXI9CmN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oQyxGKXtmdW5jdGlvbiBEKCl7dGhpcy5jb25zdHJ1Y3Rvcj1DfWZvcih2YXIgQiBpbiBGKUYuaGFzT3duUHJvcGVydHkoQikmJihDW0JdPUZbQl0pO0MucHJvdG90eXBlPW51bGw9PT1GP09iamVjdC5jcmVhdGUoRik6KEQucHJvdG90eXBlPUYucHJvdG90eXBlLG5ldyBEKX0sbD1mKDEpLGs9Zig1KSxtPWYoNykscD1mKDgpLHE9ZigzKSxyPWYoMCksdD1mKDQ0KSx2PWYoNDUpLEE9Zig2KSx5PWYoMzUpLHg9ZigyKTtjPWZ1bmN0aW9uKEMpe2Z1bmN0aW9uIEYoKXt2YXIgRD1DLmNhbGwodGhpcyl8fHRoaXM7RC5fc3RhcnRBbmdsZT0wO0QuX2VuZEFuZ2xlPTIqTWF0aC5QSTtELl9sYWJlbEZvcm1hdHRlcj1wLmlkZW50aXR5KCk7RC5fbGFiZWxzRW5hYmxlZD0hMTtELmlubmVyUmFkaXVzKDApO0Qub3V0ZXJSYWRpdXMoZnVuY3Rpb24oKXt2YXIgQj1ELl9waWVDZW50ZXIoKTtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoRC53aWR0aCgpLQpCLngsQi54KSxNYXRoLm1heChELmhlaWdodCgpLUIueSxCLnkpKX0pO0QuYWRkQ2xhc3MoInBpZS1wbG90Iik7RC5hdHRyKCJmaWxsIixmdW5jdGlvbihCLEcpe3JldHVybiBTdHJpbmcoRyl9LG5ldyBxLkNvbG9yKTtELl9zdHJva2VEcmF3ZXJzPW5ldyByLk1hcDtyZXR1cm4gRH1nKEYsQyk7Ri5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcztDLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9zdHJva2VEcmF3ZXJzLmZvckVhY2goZnVuY3Rpb24oQil7cmV0dXJuIEIuYXR0YWNoVG8oRC5fcmVuZGVyQXJlYSl9KX07Ri5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihELEIsRyl7Qy5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsRCxCLEcpO0Q9dGhpcy5fcGllQ2VudGVyKCk7dGhpcy5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitELngrIiwiK0QueSsiKSIpO0Q9TWF0aC5taW4oTWF0aC5tYXgodGhpcy53aWR0aCgpLQpELngsRC54KSxNYXRoLm1heCh0aGlzLmhlaWdodCgpLUQueSxELnkpKTtudWxsIT10aGlzLmlubmVyUmFkaXVzKCkuc2NhbGUmJnRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7bnVsbCE9dGhpcy5vdXRlclJhZGl1cygpLnNjYWxlJiZ0aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUucmFuZ2UoWzAsRF0pO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLmFkZERhdGFzZXQuY2FsbCh0aGlzLEQpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihEKXtpZigxPT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aClyZXR1cm4gci5XaW5kb3cud2FybigiT25seSBvbmUgZGF0YXNldCBpcyBzdXBwb3J0ZWQgaW4gUGllIHBsb3RzIiksdGhpczt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt2YXIgQj1uZXcgdi5BcmNPdXRsaW5lU1ZHRHJhd2VyO3RoaXMuX2lzU2V0dXAmJkIuYXR0YWNoVG8odGhpcy5fcmVuZGVyQXJlYSk7CnRoaXMuX3N0cm9rZURyYXdlcnMuc2V0KEQsQik7Qy5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLEQpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLnJlbW92ZURhdGFzZXQuY2FsbCh0aGlzLEQpfTtGLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLEQpO3RoaXMuX3N0cm9rZURyYXdlcnMuZ2V0KEQpLnJlbW92ZSgpfTtGLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbihEKXtDLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCk7dGhpcy5fc3RhcnRBbmdsZXM9W107dGhpcy5fZW5kQW5nbGVzPVtdO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTt2YXIgRz1DLnByb3RvdHlwZS5zZWxlY3Rpb25zLmNhbGwodGhpcywKRCkubm9kZXMoKTtELmZvckVhY2goZnVuY3Rpb24oSyl7Sz1CLl9zdHJva2VEcmF3ZXJzLmdldChLKTtudWxsIT1LJiZHLnB1c2guYXBwbHkoRyxLLmdldFZpc3VhbFByaW1pdGl2ZXMoKSl9KTtyZXR1cm4gbC5zZWxlY3RBbGwoRyl9O0YucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXtDLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKX07Ri5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgQS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdC5BcmNTVkdEcmF3ZXJ9LGZ1bmN0aW9uKCl7eS53YXJuKCJjYW52YXMgcmVuZGVyZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBQaWUgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTtGLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3ZvaWQgMD09PUQmJihEPXRoaXMuZGF0YXNldHMoKSk7CnJldHVybiBDLnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsRCkubWFwKGZ1bmN0aW9uKEcpe0cucG9zaXRpb24ueCs9Qi53aWR0aCgpLzI7Ry5wb3NpdGlvbi55Kz1CLmhlaWdodCgpLzI7dmFyIEs9bC5zZWxlY3QoQi5fc3Ryb2tlRHJhd2Vycy5nZXQoRy5kYXRhc2V0KS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4KEcuaW5kZXgpKTtHLnN0cm9rZVNlbGVjdGlvbj1LO3JldHVybiBHfSl9O0YucHJvdG90eXBlLnNlY3RvclZhbHVlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEYuX1NFQ1RPUl9WQUxVRV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShGLl9TRUNUT1JfVkFMVUVfS0VZLEQsdm9pZCAwKTt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5pbm5lclJhZGl1cz1mdW5jdGlvbihELEIpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEYuX0lOTkVSX1JBRElVU19LRVkpOwp0aGlzLl9iaW5kUHJvcGVydHkoRi5fSU5ORVJfUkFESVVTX0tFWSxELEIpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLm91dGVyUmFkaXVzPWZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRi5fT1VURVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEYuX09VVEVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5zdGFydEFuZ2xlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3N0YXJ0QW5nbGU7dGhpcy5fc3RhcnRBbmdsZT1EO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmVuZEFuZ2xlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2VuZEFuZ2xlO3RoaXMuX2VuZEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTsKcmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDt0aGlzLl9sYWJlbHNFbmFibGVkPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUubGFiZWxGb3JtYXR0ZXI9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fbGFiZWxGb3JtYXR0ZXI7dGhpcy5fbGFiZWxGb3JtYXR0ZXI9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXMud2lkdGgoKS8yLEc9dGhpcy5oZWlnaHQoKS8yO0Q9dGhpcy5fc2xpY2VJbmRleEZvclBvaW50KHt4OkQueC1CLHk6RC55LUd9KTtyZXR1cm4gbnVsbD09RD9bXTpbdGhpcy5lbnRpdGllcygpW0RdXX07Ri5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj1DLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksCkc9eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmlubmVyUmFkaXVzKCkpLEs9eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLm91dGVyUmFkaXVzKCkpO0IuZD1mdW5jdGlvbihMLEosUCl7cmV0dXJuIGwuYXJjKCkuaW5uZXJSYWRpdXMoRyhMLEosUCkpLm91dGVyUmFkaXVzKEsoTCxKLFApKS5zdGFydEFuZ2xlKEQuX3N0YXJ0QW5nbGVzW0pdKS5lbmRBbmdsZShELl9lbmRBbmdsZXNbSl0pKEwsSil9O3JldHVybiBCfTtGLnByb3RvdHlwZS5fdXBkYXRlUGllQW5nbGVzPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5zZWN0b3JWYWx1ZSgpJiYwIT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aCl7dmFyIEQ9eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpLEI9dGhpcy5kYXRhc2V0cygpWzBdLEc9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChCKTtHPWwucGllKCkuc29ydChudWxsKS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKS52YWx1ZShmdW5jdGlvbihLLApMKXtyZXR1cm4gRChLLEwsQil9KShHKTt0aGlzLl9zdGFydEFuZ2xlcz1HLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gSy5zdGFydEFuZ2xlfSk7dGhpcy5fZW5kQW5nbGVzPUcubWFwKGZ1bmN0aW9uKEspe3JldHVybiBLLmVuZEFuZ2xlfSl9fTtGLnByb3RvdHlwZS5fcGllQ2VudGVyPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy5fc3RhcnRBbmdsZTx0aGlzLl9lbmRBbmdsZT90aGlzLl9zdGFydEFuZ2xlOnRoaXMuX2VuZEFuZ2xlLEI9dGhpcy5fc3RhcnRBbmdsZTx0aGlzLl9lbmRBbmdsZT90aGlzLl9lbmRBbmdsZTp0aGlzLl9zdGFydEFuZ2xlLEc9TWF0aC5zaW4oRCk7RD1NYXRoLmNvcyhEKTt2YXIgSz1NYXRoLnNpbihCKTtCPU1hdGguY29zKEIpO3ZhciBMO2lmKDA8PUcmJjA8PUspaWYoMDw9RCYmMDw9Qil7dmFyIEo9RDt2YXIgUD1MPTA7dmFyIFM9S31lbHNlIDA+RCYmMD5CPyhKPTAsTD0tQixQPTAsUz1HKTowPD1EJiYwPkI/KEo9RCxMPS1CLFA9MCxTPUcpOjA+RCYmMDw9QiYmCihQPUw9Sj0xLFM9TWF0aC5tYXgoRyxLKSk7ZWxzZSAwPD1HJiYwPks/MDw9RCYmMDw9Qj8oSj1NYXRoLm1heChELEIpLFM9UD1MPTEpOjA+RCYmMD5CPyhKPTAsTD0xLFA9LUssUz1HKTowPD1EJiYwPkI/KEo9RCxMPTEsUD0tSyxTPTEpOjA+RCYmMDw9QiYmKEo9QixQPUw9MSxTPUcpOjA+RyYmMDw9Sz8wPD1EJiYwPD1CPyhKPTEsTD0wLFA9LUcsUz1LKTowPkQmJjA+Qj8oSj0xLEw9TWF0aC5tYXgoLUQsLUIpLFM9UD0xKTowPD1EJiYwPkI/KEo9MSxMPS1CLFA9LUcsUz0xKTowPkQmJjA8PUImJihKPTEsTD0tRCxQPTEsUz1LKTowPkcmJjA+SyYmKDA8PUQmJjA8PUI/KEo9QixMPTAsUD0tRyxTPTApOjA+RCYmMD5CPyhKPTAsTD0tRCxQPS1LLFM9MCk6MDw9RCYmMD5CPyhMPUo9MSxQPU1hdGgubWF4KEQsLUIpLFM9MSk6MD5EJiYwPD1CJiYoSj1CLEw9LUQsUD0xLFM9MCkpO3JldHVybnt4OjA9PVArUz8wOlAvKFArUykqdGhpcy53aWR0aCgpLHk6MD09SitMPzA6Si8oSitMKSp0aGlzLmhlaWdodCgpfX07CkYucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEQ9Qy5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKTtpZigwPT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aClyZXR1cm4gRDt2YXIgQj14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksRz10aGlzLmRhdGFzZXRzKClbMF0sSz1ELmdldChHKS5maWx0ZXIoZnVuY3Rpb24oTCxKKXtyZXR1cm4gRi5faXNWYWxpZERhdGEoQihMLEosRykpfSk7RC5zZXQoRyxLKTtyZXR1cm4gRH07Ri5faXNWYWxpZERhdGE9ZnVuY3Rpb24oRCl7cmV0dXJuIHIuTWF0aC5pc1ZhbGlkTnVtYmVyKEQpJiYwPD1EfTtGLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbihELEIsRyl7dmFyIEs9eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpO2lmKCFGLl9pc1ZhbGlkRGF0YShLKEQsQixHKSkpcmV0dXJue3g6TmFOLHk6TmFOfTt2YXIgTD14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuaW5uZXJSYWRpdXMoKSkoRCwKQixHKTtEPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKShELEIsRyk7TD0oTCtEKS8yO0Q9bC5waWUoKS5zb3J0KG51bGwpLnZhbHVlKGZ1bmN0aW9uKEosUCl7Sj1LKEosUCxHKTtyZXR1cm4gRi5faXNWYWxpZERhdGEoSik/SjowfSkuc3RhcnRBbmdsZSh0aGlzLl9zdGFydEFuZ2xlKS5lbmRBbmdsZSh0aGlzLl9lbmRBbmdsZSkoRy5kYXRhKCkpO0I9KERbQl0uc3RhcnRBbmdsZStEW0JdLmVuZEFuZ2xlKS8yO3JldHVybnt4OkwqTWF0aC5zaW4oQikseTotTCpNYXRoLmNvcyhCKX19O0YucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZyLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIEIuX2RyYXdMYWJlbHMoKX0sRCk7dmFyIEc9dGhpcy5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHMoKSwKSz10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oTCl7dmFyIEo9eC5QbG90LmFwcGx5RHJhd1N0ZXBzKEcsTCk7Qi5fc3Ryb2tlRHJhd2Vycy5nZXQoTCkuZHJhdyhLLmdldChMKSxKKX0pfTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgbS5OdWxsfV19O0YucHJvdG90eXBlLl9zbGljZUluZGV4Rm9yUG9pbnQ9ZnVuY3Rpb24oRCl7dmFyIEI9TWF0aC5zcXJ0KE1hdGgucG93KEQueCwyKStNYXRoLnBvdyhELnksMikpLEc9TWF0aC5hY29zKC1ELnkvQik7MD5ELngmJihHPTIqTWF0aC5QSS1HKTtmb3IoRD0wO0Q8dGhpcy5fc3RhcnRBbmdsZXMubGVuZ3RoO0QrKylpZih0aGlzLl9zdGFydEFuZ2xlc1tEXTxHJiZ0aGlzLl9lbmRBbmdsZXNbRF0+Ryl7dmFyIEs9RDticmVha31pZih2b2lkIDAhPT0KSyl7RD10aGlzLmRhdGFzZXRzKClbMF07dmFyIEw9RC5kYXRhKClbS107Rz10aGlzLmlubmVyUmFkaXVzKCkuYWNjZXNzb3IoTCxLLEQpO0Q9dGhpcy5vdXRlclJhZGl1cygpLmFjY2Vzc29yKEwsSyxEKTtpZihCPkcmJkI8RClyZXR1cm4gS31yZXR1cm4gbnVsbH07Ri5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLEI9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksRz10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxhYmVsLWFyZWEiLCEwKSxLPW5ldyBrLlN2Z0NvbnRleHQoRy5ub2RlKCkpLEw9bmV3IGsuQ2FjaGVNZWFzdXJlcihLKSxKPW5ldyBrLldyaXRlcihMLEspLFA9dGhpcy5kYXRhc2V0cygpWzBdO3RoaXMuX2dldERhdGFUb0RyYXcoKS5nZXQoUCkuZm9yRWFjaChmdW5jdGlvbihTLE4pe3ZhciBUPUQuc2VjdG9yVmFsdWUoKS5hY2Nlc3NvcihTLE4sUCk7aWYoci5NYXRoLmlzVmFsaWROdW1iZXIoVCkpe1Q9RC5fbGFiZWxGb3JtYXR0ZXIoVCwKUyxOLFApO3ZhciBZPUwubWVhc3VyZShUKSxhYT0oRC5fZW5kQW5nbGVzW05dK0QuX3N0YXJ0QW5nbGVzW05dKS8yLGhhPUQub3V0ZXJSYWRpdXMoKS5hY2Nlc3NvcihTLE4sUCk7RC5vdXRlclJhZGl1cygpLnNjYWxlJiYoaGE9RC5vdXRlclJhZGl1cygpLnNjYWxlLnNjYWxlKGhhKSk7dmFyIFg9RC5pbm5lclJhZGl1cygpLmFjY2Vzc29yKFMsTixQKTtELmlubmVyUmFkaXVzKCkuc2NhbGUmJihYPUQuaW5uZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShYKSk7WD0oaGErWCkvMjtoYT1NYXRoLnNpbihhYSkqWC1ZLndpZHRoLzI7WD0tTWF0aC5jb3MoYWEpKlgtWS5oZWlnaHQvMjt2YXIgY2E9W3t4OmhhLHk6WH0se3g6aGEseTpYK1kuaGVpZ2h0fSx7eDpoYStZLndpZHRoLHk6WH0se3g6aGErWS53aWR0aCx5OlgrWS5oZWlnaHR9XTsoYWE9Y2EuZXZlcnkoZnVuY3Rpb24oZWEpe3JldHVybiBNYXRoLmFicyhlYS54KTw9RC53aWR0aCgpLzImJk1hdGguYWJzKGVhLnkpPD1ELmhlaWdodCgpLwoyfSkpJiYoYWE9Y2EubWFwKGZ1bmN0aW9uKGVhKXtyZXR1cm4gRC5fc2xpY2VJbmRleEZvclBvaW50KGVhKX0pLmV2ZXJ5KGZ1bmN0aW9uKGVhKXtyZXR1cm4gZWE9PT1OfSkpO1M9Qi5maWxsKFMsTixQKTtTPTEuNipyLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsUyk8ci5Db2xvci5jb250cmFzdCgiYmxhY2siLFMpO2hhPUcuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIraGErIiwiK1grIikiKTtoYS5jbGFzc2VkKFM/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApO2hhLnN0eWxlKCJ2aXNpYmlsaXR5IixhYT8iaW5oZXJpdCI6ImhpZGRlbiIpO0oud3JpdGUoVCxZLndpZHRoLFkuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxoYS5ub2RlKCkpfX0pfTtyZXR1cm4gRn0oeC5QbG90KTtjLl9JTk5FUl9SQURJVVNfS0VZPSJpbm5lci1yYWRpdXMiO2MuX09VVEVSX1JBRElVU19LRVk9Im91dGVyLXJhZGl1cyI7Yy5fU0VDVE9SX1ZBTFVFX0tFWT0KInNlY3Rvci12YWx1ZSI7ZC5QaWU9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih5LHgpe2Z1bmN0aW9uIEMoKXt0aGlzLmNvbnN0cnVjdG9yPXl9Zm9yKHZhciBGIGluIHgpeC5oYXNPd25Qcm9wZXJ0eShGKSYmKHlbRl09eFtGXSk7eS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQy5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEMpfSxsPWYoMSksaz1mKDUpLG09Zig3KSxwPWYoMTQpLHE9Zig2KSxyPWYoMzQpLHQ9ZigzKSx2PWYoMCksQT1mKDIpO2M9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geCgpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLl9sYWJlbHNFbmFibGVkPSExO0MuX2xhYmVsPW51bGw7Qy5hbmltYXRvcigicmVjdGFuZ2xlcyIsbmV3IG0uTnVsbCk7Qy5hZGRDbGFzcygicmVjdGFuZ2xlLXBsb3QiKTtDLmF0dHIoImZpbGwiLChuZXcgdC5Db2xvcikucmFuZ2UoKVswXSk7cmV0dXJuIEN9Zyh4LAp5KTt4LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByLlJlY3RhbmdsZVNWR0RyYXdlcn0sZnVuY3Rpb24oQyl7cmV0dXJuIG5ldyBwLlJlY3RhbmdsZUNhbnZhc0RyYXdlcihDKX0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEY9eS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxCPUZbeC5fWDJfS0VZXSxHPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEs9Rlt4Ll9ZMl9LRVldLEw9dGhpcy54KCkuc2NhbGUsSj10aGlzLnkoKS5zY2FsZTtudWxsIT1CPyhGLndpZHRoPWZ1bmN0aW9uKFAsUyxOKXtyZXR1cm4gTWF0aC5hYnMoQihQLFMsTiktRChQLFMsTikpfSxGLng9ZnVuY3Rpb24oUCxTLE4pe3JldHVybiBNYXRoLm1pbihCKFAsClMsTiksRChQLFMsTikpfSk6KEYud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gQy5fcmVjdGFuZ2xlV2lkdGgoTCl9LEYueD1mdW5jdGlvbihQLFMsTil7cmV0dXJuIEQoUCxTLE4pLS41KkYud2lkdGgoUCxTLE4pfSk7bnVsbCE9Sz8oRi5oZWlnaHQ9ZnVuY3Rpb24oUCxTLE4pe3JldHVybiBNYXRoLmFicyhLKFAsUyxOKS1HKFAsUyxOKSl9LEYueT1mdW5jdGlvbihQLFMsTil7cmV0dXJuIE1hdGgubWF4KEsoUCxTLE4pLEcoUCxTLE4pKS1GLmhlaWdodChQLFMsTil9KTooRi5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gQy5fcmVjdGFuZ2xlV2lkdGgoSil9LEYueT1mdW5jdGlvbihQLFMsTil7cmV0dXJuIEcoUCxTLE4pLS41KkYuaGVpZ2h0KFAsUyxOKX0pO2RlbGV0ZSBGW3guX1gyX0tFWV07ZGVsZXRlIEZbeC5fWTJfS0VZXTtyZXR1cm4gRn07eC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksCmFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKCJyZWN0YW5nbGVzIil9XX07eC5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PWZ1bmN0aW9uKEMpe3JldHVybiJ4MiI9PT1DP3kucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsIngiKToieTIiPT09Qz95LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ5Iik6eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcyxDKX07eC5wcm90b3R5cGUueD1mdW5jdGlvbihDLEYsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUY/eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyxGLEQpO251bGwhPUYmJihEPShDPXRoaXMueDIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHguX1gyX0tFWSxELEYsQy5wb3N0U2NhbGUpKTtGIGluc3RhbmNlb2YgdC5DYXRlZ29yeSYmCkYuaW5uZXJQYWRkaW5nKDApLm91dGVyUGFkZGluZygwKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUueDI9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fWDJfS0VZKTt2YXIgRj10aGlzLngoKTt0aGlzLl9iaW5kUHJvcGVydHkoeC5fWDJfS0VZLEMsRiYmRi5zY2FsZSx2b2lkIDApO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLnk9ZnVuY3Rpb24oQyxGLEQpe2lmKG51bGw9PUMpcmV0dXJuIHkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1GP3kucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMpOnkucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMsRixEKTtudWxsIT1GJiYoRD0oQz10aGlzLnkyKCkpJiZDLmFjY2Vzc29yLG51bGwhPUQmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9ZMl9LRVksRCxGLEMucG9zdFNjYWxlKSk7RiBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnkmJkYuaW5uZXJQYWRkaW5nKDApLm91dGVyUGFkZGluZygwKTsKcmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLnkyPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1kyX0tFWSk7dmFyIEY9dGhpcy55KCk7dGhpcy5fYmluZFByb3BlcnR5KHguX1kyX0tFWSxDLEYmJkYuc2NhbGUsdm9pZCAwKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3JldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0dW0sRz1ELmluZGV4LEs9RC5kYXRhc2V0O0Q9Ri54KEIsRyxLKTt2YXIgTD1GLnkoQixHLEspLEo9Ri53aWR0aChCLEcsSyk7Qj1GLmhlaWdodChCLEcsSyk7cmV0dXJuIEQ8PUMueCYmQy54PD1EK0omJkw8PUMueSYmQy55PD1MK0J9KX07eC5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbihDKXtyZXR1cm4gdGhpcy5fZW50aXR5QkJveChDLmRhdHVtLApDLmluZGV4LEMuZGF0YXNldCx0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSl9O3gucHJvdG90eXBlLl9lbnRpdHlCQm94PWZ1bmN0aW9uKEMsRixELEIpe3JldHVybnt4OkIueChDLEYsRCkseTpCLnkoQyxGLEQpLHdpZHRoOkIud2lkdGgoQyxGLEQpLGhlaWdodDpCLmhlaWdodChDLEYsRCl9fTt4LnByb3RvdHlwZS5sYWJlbD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9sYWJlbDt0aGlzLl9sYWJlbD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDt0aGlzLl9sYWJlbHNFbmFibGVkPUM7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBDPXkucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtudWxsIT10aGlzLngyKCkmJgooQy54Mj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpO251bGwhPXRoaXMueTIoKSYmKEMueTI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpKTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oQyxGLEQpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEc9Qi54KEMsRixEKSxLPUIueShDLEYsRCksTD1CLndpZHRoKEMsRixEKTtDPUIuaGVpZ2h0KEMsRixEKTtyZXR1cm57eDpHK0wvMix5OksrQy8yfX07eC5wcm90b3R5cGUuX3JlY3RhbmdsZVdpZHRoPWZ1bmN0aW9uKEMpe2lmKEMgaW5zdGFuY2VvZiB0LkNhdGVnb3J5KXJldHVybiBDLnJhbmdlQmFuZCgpO3ZhciBGPUM9PT10aGlzLngoKS5zY2FsZT90aGlzLngoKS5hY2Nlc3Nvcjp0aGlzLnkoKS5hY2Nlc3NvcixEPWwuc2V0KHYuQXJyYXkuZmxhdHRlbih0aGlzLmRhdGFzZXRzKCkubWFwKGZ1bmN0aW9uKEspe3JldHVybiBLLmRhdGEoKS5tYXAoZnVuY3Rpb24oTCwKSil7cmV0dXJuIEYoTCxKLEspLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuK0t9KSxCPXYuTWF0aC5taW4oRCwwKTtEPXYuTWF0aC5tYXgoRCwwKTt2YXIgRz1DLnNjYWxlKEIpO3JldHVybihDLnNjYWxlKEQpLUcpL01hdGguYWJzKEQtQil9O3gucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEM9bmV3IHYuTWFwLEY9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oRCl7dmFyIEI9RC5kYXRhKCkubWFwKGZ1bmN0aW9uKEcsSyl7cmV0dXJuIHYuTWF0aC5pc1ZhbGlkTnVtYmVyKEYueChHLEssRCkpJiZ2Lk1hdGguaXNWYWxpZE51bWJlcihGLnkoRyxLLEQpKSYmdi5NYXRoLmlzVmFsaWROdW1iZXIoRi53aWR0aChHLEssRCkpJiZ2Lk1hdGguaXNWYWxpZE51bWJlcihGLmhlaWdodChHLEssRCkpP0c6bnVsbH0pO0Muc2V0KEQsQil9KTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD0KZnVuY3Rpb24oQyl7dmFyIEY9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdEFsbCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZudWxsIT10aGlzLmxhYmVsKCkmJnYuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gRi5fZHJhd0xhYmVscygpfSxDKX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEY9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQsQil7cmV0dXJuIEMuX2RyYXdMYWJlbChGLEQsQil9KX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbD1mdW5jdGlvbihDLEYsRCl7dmFyIEI9dGhpcyxHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEs9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKCJsYWJlbC1hcmVhIiwhMCksTD1uZXcgay5TdmdDb250ZXh0KEsubm9kZSgpKSxKPW5ldyBrLkNhY2hlTWVhc3VyZXIoTCksClA9bmV3IGsuV3JpdGVyKEosTCk7TD10aGlzLngoKS5zY2FsZS5yYW5nZSgpO3ZhciBTPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksTj1NYXRoLm1pbi5hcHBseShudWxsLEwpLFQ9TWF0aC5tYXguYXBwbHkobnVsbCxMKSxZPU1hdGgubWluLmFwcGx5KG51bGwsUyksYWE9TWF0aC5tYXguYXBwbHkobnVsbCxTKTtDLmdldChGKS5mb3JFYWNoKGZ1bmN0aW9uKGhhLFgpe2lmKG51bGwhPWhhKXt2YXIgY2E9IiIrQi5sYWJlbCgpKGhhLFgsRiksZWE9Si5tZWFzdXJlKGNhKSxrYT1HLngoaGEsWCxGKSxiYT1HLnkoaGEsWCxGKSxsYT1HLndpZHRoKGhhLFgsRiksd2E9Ry5oZWlnaHQoaGEsWCxGKTtlYS5oZWlnaHQ8PXdhJiZlYS53aWR0aDw9bGEmJih3YT0od2EtZWEuaGVpZ2h0KS8yLGthKz0obGEtZWEud2lkdGgpLzIsYmErPXdhLGxhPXttaW46a2EsbWF4OmthK2VhLndpZHRofSx3YT17bWluOmJhLG1heDpiYStlYS5oZWlnaHR9LGxhLm1pbjxOfHxsYS5tYXg+VHx8d2EubWluPFl8fHdhLm1heD4KYWF8fEIuX292ZXJsYXlMYWJlbChsYSx3YSxYLEQsQyl8fChoYT1HLmZpbGwoaGEsWCxGKSxoYT0xLjYqdi5Db2xvci5jb250cmFzdCgid2hpdGUiLGhhKTx2LkNvbG9yLmNvbnRyYXN0KCJibGFjayIsaGEpLGthPUsuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIra2ErIiwiK2JhKyIpIiksa2EuY2xhc3NlZChoYT8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCksUC53cml0ZShjYSxlYS53aWR0aCxlYS5oZWlnaHQse3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciJ9LGthLm5vZGUoKSkpKX19KX07eC5wcm90b3R5cGUuX292ZXJsYXlMYWJlbD1mdW5jdGlvbihDLEYsRCxCLEcpe2Zvcih2YXIgSz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxMPXRoaXMuZGF0YXNldHMoKSxKPUI7SjxMLmxlbmd0aDtKKyspZm9yKHZhciBQPUxbSl0sUz1HLmdldChQKSxOPUo9PT1CP0QrMTowO048Uy5sZW5ndGg7TisrKWlmKHYuRE9NLmludGVyc2VjdHNCQm94KEMsCkYsdGhpcy5fZW50aXR5QkJveChTW05dLE4sUCxLKSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiB4fShmKDE2KS5YWVBsb3QpO2MuX1gyX0tFWT0ieDIiO2MuX1kyX0tFWT0ieTIiO2QuUmVjdGFuZ2xlPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oeSx4KXtmdW5jdGlvbiBDKCl7dGhpcy5jb25zdHJ1Y3Rvcj15fWZvcih2YXIgRiBpbiB4KXguaGFzT3duUHJvcGVydHkoRikmJih5W0ZdPXhbRl0pO3kucHJvdG90eXBlPW51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEMucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBDKX0sbD1mKDMxKSxrPWYoNiksbT1mKDQ4KSxwPWYoNykscT1mKDE0KSxyPWYoMyksdD1mKDApLHY9ZigxOSksQT1mKDIpO2M9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geCgpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLmFkZENsYXNzKCJzY2F0dGVyLXBsb3QiKTt2YXIgRj1uZXcgcC5FYXNpbmc7Ri5zdGFydERlbGF5KDUpOwpGLnN0ZXBEdXJhdGlvbigyNTApO0YubWF4VG90YWxEdXJhdGlvbihBLlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0MuYW5pbWF0b3Iodi5BbmltYXRvci5NQUlOLEYpO0MuYXR0cigib3BhY2l0eSIsLjYpO0MuYXR0cigiZmlsbCIsKG5ldyByLkNvbG9yKS5yYW5nZSgpWzBdKTtDLnNpemUoNik7dmFyIEQ9bC5jaXJjbGUoKTtDLnN5bWJvbChmdW5jdGlvbigpe3JldHVybiBEfSk7cmV0dXJuIEN9Zyh4LHkpO3gucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzPWZ1bmN0aW9uKEMpe3ZhciBGPXRoaXM7cmV0dXJuIHkucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzLmNhbGwodGhpcyxDKS5tYXAoZnVuY3Rpb24oRCl7dmFyIEI9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnNpemUoKSkoRC5kYXR1bSxELmluZGV4LEQuZGF0YXNldCk7RC5kaWFtZXRlcj1CO3JldHVybiBEfSl9O3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oQyl7dmFyIEY9CnRoaXM7cmV0dXJuIG5ldyBrLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBtLlN5bWJvbFNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBxLkNhbnZhc0RyYXdlcihELG0ubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwKEMsZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnN5bWJvbCgpKX0sZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnNpemUoKSl9KSl9KX07eC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbihDLEYpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1NJWkVfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoeC5fU0laRV9LRVksQyxGKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5zeW1ib2w9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fU1lNQk9MX0tFWSk7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5zZXQoeC5fU1lNQk9MX0tFWSwKe2FjY2Vzc29yOkN9KTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKTtGLmQ9ZnVuY3Rpb24oQixHLEspe3JldHVybiBEKEIsRyxLKSgwKShudWxsKX07Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RixhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih2LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHYuQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBDPXkucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSwKRj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxEPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpO0MueD1GO0MueT1EO0MudHJhbnNmb3JtPWZ1bmN0aW9uKEIsRyxLKXtyZXR1cm4idHJhbnNsYXRlKCIrRihCLEcsSykrIiwiK0QoQixHLEspKyIpIn07Qy5kPXRoaXMuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcigpO3JldHVybiBDfTt4LnByb3RvdHlwZS5fY29uc3RydWN0U3ltYm9sR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIEM9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKSxGPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpO3JldHVybiBmdW5jdGlvbihELEIsRyl7cmV0dXJuIEMoRCxCLEcpKEYoRCxCLEcpKShudWxsKX19O3gucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJue3g6Qy5wb3NpdGlvbi54LUMuZGlhbWV0ZXIvMix5OkMucG9zaXRpb24ueS1DLmRpYW1ldGVyLzIsd2lkdGg6Qy5kaWFtZXRlciwKaGVpZ2h0OkMuZGlhbWV0ZXJ9fTt4LnByb3RvdHlwZS5fZW50aXR5VmlzaWJsZU9uUGxvdD1mdW5jdGlvbihDLEYpe3ZhciBEPXttaW46Ri50b3BMZWZ0LngsbWF4OkYuYm90dG9tUmlnaHQueH07Rj17bWluOkYudG9wTGVmdC55LG1heDpGLmJvdHRvbVJpZ2h0Lnl9O0M9dGhpcy5fZW50aXR5Qm91bmRzKEMpO3JldHVybiB0LkRPTS5pbnRlcnNlY3RzQkJveChELEYsQyl9O3gucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oQyl7dmFyIEY9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpO3JldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEcpe3ZhciBLPUcuZGF0dW0sTD1HLmluZGV4LEo9Ry5kYXRhc2V0O0c9RihLLEwsSik7dmFyIFA9RChLLEwsSik7Sz1CKEssTCxKKTtyZXR1cm4gRy1LLzI8PUMueCYmQy54PD1HK0svCjImJlAtSy8yPD1DLnkmJkMueTw9UCtLLzJ9KX07cmV0dXJuIHh9KGYoMTYpLlhZUGxvdCk7Yy5fU0laRV9LRVk9InNpemUiO2MuX1NZTUJPTF9LRVk9InN5bWJvbCI7ZC5TY2F0dGVyPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCx2KXtmdW5jdGlvbiBBKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgeSBpbiB2KXYuaGFzT3duUHJvcGVydHkoeSkmJih0W3ldPXZbeV0pO3QucHJvdG90eXBlPW51bGw9PT12P09iamVjdC5jcmVhdGUodik6KEEucHJvdG90eXBlPXYucHJvdG90eXBlLG5ldyBBKX0sbD1mKDcpLGs9Zig2KSxtPWYoNDcpLHA9ZigzKSxxPWYoMzUpLHI9ZigyKTtjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHYoKXt2YXIgQT10LmNhbGwodGhpcyl8fHRoaXM7QS5hZGRDbGFzcygic2VnbWVudC1wbG90Iik7QS5hdHRyKCJzdHJva2UiLChuZXcgcC5Db2xvcikucmFuZ2UoKVswXSk7QS5hdHRyKCJzdHJva2Utd2lkdGgiLAoiMnB4Iik7cmV0dXJuIEF9Zyh2LHQpO3YucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGsuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG0uU2VnbWVudFNWR0RyYXdlcn0sZnVuY3Rpb24oKXtxLndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFNlZ21lbnQgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTt2LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgbC5OdWxsfV19O3YucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbihBKXtyZXR1cm4ieDIiPT09QT90LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ4Iik6InkyIj09PUE/dC5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieSIpOnQucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsCkEpfTt2LnByb3RvdHlwZS54PWZ1bmN0aW9uKEEseSl7aWYobnVsbD09QSlyZXR1cm4gdC5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PXk/dC5wcm90b3R5cGUueC5jYWxsKHRoaXMsQSk6KHQucHJvdG90eXBlLnguY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLngyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh2Ll9YMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLngyPWZ1bmN0aW9uKEEpe2lmKG51bGw9PUEpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHYuX1gyX0tFWSk7dmFyIHk9dGhpcy54KCk7dGhpcy5fYmluZFByb3BlcnR5KHYuX1gyX0tFWSxBLHkmJnkuc2NhbGUpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLnk9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT1BKXJldHVybiB0LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09eT90LnByb3RvdHlwZS55LmNhbGwodGhpcyxBKToodC5wcm90b3R5cGUueS5jYWxsKHRoaXMsCkEseSksQT0oQT10aGlzLnkyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh2Ll9ZMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLnkyPWZ1bmN0aW9uKEEpe2lmKG51bGw9PUEpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHYuX1kyX0tFWSk7dmFyIHk9dGhpcy55KCk7dGhpcy5fYmluZFByb3BlcnR5KHYuX1kyX0tFWSxBLHkmJnkuc2NhbGUpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQT10LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7QS54MT1yLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTtBLngyPW51bGw9PXRoaXMueDIoKT9yLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTpyLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSk7QS55MT1yLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTsKQS55Mj1udWxsPT10aGlzLnkyKCk/ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpO3JldHVybiBBfTt2LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEEpe0E9dGhpcy5lbnRpdHlOZWFyZXN0KEEpO3JldHVybiBudWxsIT1BP1tBXTpbXX07di5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpe3ZhciB4PXttaW46QS50b3BMZWZ0LngsbWF4OkEuYm90dG9tUmlnaHQueH07QT17bWluOkEudG9wTGVmdC55LG1heDpBLmJvdHRvbVJpZ2h0Lnl9fWVsc2UgeD1BLEE9eTtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcoeCxBKX07di5wcm90b3R5cGUuX2VudGl0aWVzSW50ZXJzZWN0aW5nPWZ1bmN0aW9uKEEseSl7dmFyIHg9dGhpcyxDPVtdLEY9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oRCl7eC5fbGluZUludGVyc2VjdHNCb3goRCwKQSx5LEYpJiZDLnB1c2goRCl9KTtyZXR1cm4gQ307di5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzQm94PWZ1bmN0aW9uKEEseSx4LEMpe3ZhciBGPXRoaXMsRD1DLngxKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpLEI9Qy54MihBLmRhdHVtLEEuaW5kZXgsQS5kYXRhc2V0KSxHPUMueTEoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCk7QT1DLnkyKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpO2lmKHkubWluPD1EJiZEPD15Lm1heCYmeC5taW48PUcmJkc8PXgubWF4fHx5Lm1pbjw9QiYmQjw9eS5tYXgmJngubWluPD1BJiZBPD14Lm1heClyZXR1cm4hMDt2YXIgSz17eDpELHk6R30sTD17eDpCLHk6QX0sSj1be3g6eS5taW4seTp4Lm1pbn0se3g6eS5taW4seTp4Lm1heH0se3g6eS5tYXgseTp4Lm1heH0se3g6eS5tYXgseTp4Lm1pbn1dO3JldHVybiAwPEouZmlsdGVyKGZ1bmN0aW9uKFAsUyl7cmV0dXJuIDAhPT1TP0YuX2xpbmVJbnRlcnNlY3RzU2VnbWVudChLLEwsUCxKW1MtCjFdKSYmRi5fbGluZUludGVyc2VjdHNTZWdtZW50KFAsSltTLTFdLEssTCk6ITF9KS5sZW5ndGh9O3YucHJvdG90eXBlLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQ9ZnVuY3Rpb24oQSx5LHgsQyl7ZnVuY3Rpb24gRihELEIsRyl7cmV0dXJuKEIueC1ELngpKihHLnktQi55KS0oQi55LUQueSkqKEcueC1CLngpfXJldHVybiAwPkYoQSx5LHgpKkYoQSx5LEMpfTtyZXR1cm4gdn0oZigxNikuWFlQbG90KTtjLl9YMl9LRVk9IngyIjtjLl9ZMl9LRVk9InkyIjtkLlNlZ21lbnQ9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihyLHQpe2Z1bmN0aW9uIHYoKXt0aGlzLmNvbnN0cnVjdG9yPXJ9Zm9yKHZhciBBIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShBKSYmKHJbQV09dFtBXSk7ci5wcm90b3R5cGU9bnVsbD09PXQ/T2JqZWN0LmNyZWF0ZSh0KToodi5wcm90b3R5cGU9dC5wcm90b3R5cGUsbmV3IHYpfSxsPWYoMSksaz1mKDcpLG09ZigyMCkscD0KZigwKTtjPWYoNTApO3ZhciBxPWYoMik7Zj1mdW5jdGlvbihyKXtmdW5jdGlvbiB0KCl7dmFyIHY9ci5jYWxsKHRoaXMpfHx0aGlzO3YuX3N0YWNraW5nUmVzdWx0PW0ubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4gdi5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB2LngoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4gdi55KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHYuX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKEEseSx4LEMpe3JldHVybiBwLlN0YWNraW5nLnN0YWNrKEEseSx4LEMpfSk7di5fc3RhY2tlZEV4dGVudD1tLm1lbVRodW5rKHYuX3N0YWNraW5nUmVzdWx0LGZ1bmN0aW9uKCl7cmV0dXJuIHYueCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB2Ll9maWx0ZXJGb3JQcm9wZXJ0eSgieSIpfSxmdW5jdGlvbihBLHkseCl7cmV0dXJuIHAuU3RhY2tpbmcuc3RhY2tlZEV4dGVudChBLHkseCl9KTt2Ll9iYXNlbGluZVZhbHVlPTA7di5fc3RhY2tpbmdPcmRlcj0KImJvdHRvbXVwIjt2LmFkZENsYXNzKCJzdGFja2VkLWFyZWEtcGxvdCIpO3YuYXR0cigiZmlsbC1vcGFjaXR5IiwxKTt2Ll9iYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5bdi5fYmFzZWxpbmVWYWx1ZV19O3YuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoITEpO3JldHVybiB2fWcodCxyKTt0LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbih2KXtyZXR1cm4gbnVsbD09dj9yLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMpOnY/KHAuV2luZG93Lndhcm4oIldhcm5pbmc6IFN0YWNrZWQgQXJlYSBQbG90IGRvZXMgbm90IHN1cHBvcnQgY3JvcHBlZCByZW5kZXJpbmcuIiksdGhpcyk6ci5wcm90b3R5cGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQuY2FsbCh0aGlzLHYpfTt0LnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGsuTnVsbH07dC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7ci5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX2Jhc2VsaW5lPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKX07dC5wcm90b3R5cGUueD1mdW5jdGlvbih2LEEpe2lmKG51bGw9PXYpcmV0dXJuIHIucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT1BP3IucHJvdG90eXBlLnguY2FsbCh0aGlzLHYpOnIucHJvdG90eXBlLnguY2FsbCh0aGlzLHYsQSk7dGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLnk9ZnVuY3Rpb24odixBKXtpZihudWxsPT12KXJldHVybiByLnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09QT9yLnByb3RvdHlwZS55LmNhbGwodGhpcyx2KTpyLnByb3RvdHlwZS55LmNhbGwodGhpcyx2LEEpO3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5zdGFja2luZ09yZGVyPWZ1bmN0aW9uKHYpe2lmKG51bGw9PXYpcmV0dXJuIHRoaXMuX3N0YWNraW5nT3JkZXI7dGhpcy5fc3RhY2tpbmdPcmRlcj0Kdjt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiByLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkLmNhbGwodGhpcyl9O3QucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oKXt2YXIgdj10aGlzLnkoKS5zY2FsZS5zY2FsZSh0aGlzLl9iYXNlbGluZVZhbHVlKTt2PXt4MTowLHkxOnYseDI6dGhpcy53aWR0aCgpLHkyOnZ9O3RoaXMuX2dldEFuaW1hdG9yKCJiYXNlbGluZSIpLmFuaW1hdGUodGhpcy5fYmFzZWxpbmUsdil9O3QucHJvdG90eXBlLl91cGRhdGVZU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdj10aGlzLnkoKTt2PXYmJnYuc2NhbGU7bnVsbCE9diYmKHYuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpLHYuYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpKX07CnQucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtyLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih2KXtyZXR1cm4ieSI9PT12P1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnIucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsdil9O3QucHJvdG90eXBlLl9jaGVja1NhbWVEb21haW49ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIHY9dGhpcy5kYXRhc2V0cygpLEE9dGhpcy54KCkuYWNjZXNzb3IseT12Lm1hcChmdW5jdGlvbihDKXtyZXR1cm4gbC5zZXQoQy5kYXRhKCkubWFwKGZ1bmN0aW9uKEYsRCl7cmV0dXJuIEEoRixELEMpLnRvU3RyaW5nKCl9KSkudmFsdWVzKCl9KSx4PXQuX2RvbWFpbktleXModixBKTt5LnNvbWUoZnVuY3Rpb24oQyl7cmV0dXJuIEMubGVuZ3RoIT09CngubGVuZ3RofSkmJnAuV2luZG93Lndhcm4oInRoZSBkb21haW5zIGFjcm9zcyB0aGUgZGF0YXNldHMgYXJlIG5vdCB0aGUgc2FtZS4gUGxvdCBtYXkgcHJvZHVjZSB1bmludGVuZGVkIGJlaGF2aW9yLiIpfX07dC5fZG9tYWluS2V5cz1mdW5jdGlvbih2LEEpe3ZhciB5PWwuc2V0KCk7di5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oQyxGKXt5LmFkZChBKEMsRix4KSl9KX0pO3JldHVybiB5LnZhbHVlcygpfTt0LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdihELEIsRyl7cmV0dXJuIHAuU3RhY2tpbmcubm9ybWFsaXplS2V5KEMoRCxCLEcpKX12YXIgQT10aGlzLHk9ci5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLHg9dGhpcy55KCkuYWNjZXNzb3IsQz10aGlzLngoKS5hY2Nlc3NvcixGPXRoaXMuX3N0YWNraW5nUmVzdWx0KCk7eS5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IocS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksCmZ1bmN0aW9uKEQsQixHKXtyZXR1cm4gQS55KCkuc2NhbGUuc2NhbGUoK3goRCxCLEcpK0YuZ2V0KEcpLmdldCh2KEQsQixHKSkub2Zmc2V0KX0sZnVuY3Rpb24oRCxCLEcpe3JldHVybiBBLnkoKS5zY2FsZS5zY2FsZShGLmdldChHKS5nZXQodihELEIsRykpLm9mZnNldCl9KTtyZXR1cm4geX07dC5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odixBLHkpe3ZhciB4PXIucHJvdG90eXBlLl9waXhlbFBvaW50LmNhbGwodGhpcyx2LEEseSksQz10aGlzLngoKS5hY2Nlc3Nvcih2LEEseSk7dj10aGlzLnkoKS5hY2Nlc3Nvcih2LEEseSk7eT10aGlzLnkoKS5zY2FsZS5zY2FsZSgrdit0aGlzLl9zdGFja2luZ1Jlc3VsdCgpLmdldCh5KS5nZXQocC5TdGFja2luZy5ub3JtYWxpemVLZXkoQykpLm9mZnNldCk7cmV0dXJue3g6eC54LHl9fTtyZXR1cm4gdH0oYy5BcmVhKTtkLlN0YWNrZWRBcmVhPWZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCwKdil7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIHkgaW4gdil2Lmhhc093blByb3BlcnR5KHkpJiYodFt5XT12W3ldKTt0LnByb3RvdHlwZT1udWxsPT09dj9PYmplY3QuY3JlYXRlKHYpOihBLnByb3RvdHlwZT12LnByb3RvdHlwZSxuZXcgQSl9LGw9Zig1KSxrPWYoOCksbT1mKDIwKSxwPWYoMCkscT1mKDI3KSxyPWYoMik7Yz1mdW5jdGlvbih0KXtmdW5jdGlvbiB2KEEpe3ZvaWQgMD09PUEmJihBPSJ2ZXJ0aWNhbCIpO3ZhciB5PXQuY2FsbCh0aGlzLEEpfHx0aGlzO3kuX2V4dHJlbWFGb3JtYXR0ZXI9ay5pZGVudGl0eSgpO3kuX3N0YWNraW5nUmVzdWx0PW0ubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geS5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkubGVuZ3RoKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKHgsCkMsRixEKXtyZXR1cm4gcC5TdGFja2luZy5zdGFjayh4LEMsRixEKX0pO3kuX3N0YWNrZWRFeHRlbnQ9bS5tZW1UaHVuayh5Ll9zdGFja2luZ1Jlc3VsdCxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX2ZpbHRlckZvclByb3BlcnR5KHkuX2lzVmVydGljYWw/InkiOiJ4Iil9LGZ1bmN0aW9uKHgsQyxGKXtyZXR1cm4gcC5TdGFja2luZy5zdGFja2VkRXh0ZW50KHgsQyxGKX0pO3kuYWRkQ2xhc3MoInN0YWNrZWQtYmFyLXBsb3QiKTt5Ll9zdGFja2luZ09yZGVyPSJib3R0b211cCI7cmV0dXJuIHl9Zyh2LHQpO3YucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24oQSl7aWYobnVsbD09QSlyZXR1cm4gdGhpcy5fc3RhY2tpbmdPcmRlcjt0aGlzLl9zdGFja2luZ09yZGVyPUE7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLmV4dHJlbWFGb3JtYXR0ZXI9ZnVuY3Rpb24oQSl7aWYoMD09PQphcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9leHRyZW1hRm9ybWF0dGVyO3RoaXMuX2V4dHJlbWFGb3JtYXR0ZXI9QTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKHEuQmFyLl9MQUJFTF9BUkVBX0NMQVNTLCEwKTt2YXIgQT1uZXcgbC5TdmdDb250ZXh0KHRoaXMuX2xhYmVsQXJlYS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIoQSk7dGhpcy5fd3JpdGVyPW5ldyBsLldyaXRlcih0aGlzLl9tZWFzdXJlcixBKX07di5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKEwsSil7dmFyIFA9eC5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IoKSxTPXgud2lkdGgoKSxOPXguaGVpZ2h0KCk7TC5mb3JFYWNoKGZ1bmN0aW9uKFQpe2lmKFQuZXh0ZW50IT09CkMpe3ZhciBZPXguZXh0cmVtYUZvcm1hdHRlcigpKFQuZXh0ZW50KSxhYT14Ll9tZWFzdXJlci5tZWFzdXJlKFkpLGhhPVQuc3RhY2tlZERhdHVtLFg9aGEub3JpZ2luYWxEYXR1bSxjYT1oYS5vcmlnaW5hbEluZGV4O2hhPWhhLm9yaWdpbmFsRGF0YXNldDt4Ll9pc0RhdHVtT25TY3JlZW4oUCxTLE4sWCxjYSxoYSkmJihYPXIuUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC5hdHRyKHEuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKFgsY2EsaGEpLGNhPUQuc2NhbGUoVC5leHRlbnQpLFQ9eC5fZ2V0UG9zaXRpb25BdHRyKEYuc2NhbGUoVC5heGlzVmFsdWUpLFgpK1gvMixUPUooeC5faXNWZXJ0aWNhbD97eDpULHk6Y2F9Ont4OmNhLHk6VH0sYWEsWCksWT15KFkse3RvcExlZnQ6VCxib3R0b21SaWdodDp7eDpULngrYWEud2lkdGgseTpULnkrYWEuaGVpZ2h0fX0sWCksSy5wdXNoKFkpKX19KX1mdW5jdGlvbiB5KEwsSixQKXt2YXIgUz1KLnRvcExlZnQsTj1TLngsVD1TLnk7Uz1KLmJvdHRvbVJpZ2h0LngtCkoudG9wTGVmdC54O0o9Si5ib3R0b21SaWdodC55LUoudG9wTGVmdC55O1A9eC5faXNWZXJ0aWNhbD9TPlA6Sj5QO1B8fChOPXguX2xhYmVsQXJlYS5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitOKyIsICIrVCsiKSIpLE4uY2xhc3NlZCgic3RhY2tlZC1iYXItbGFiZWwiLCEwKSx4Ll93cml0ZXIud3JpdGUoTCxTLEose3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciJ9LE4ubm9kZSgpKSk7cmV0dXJuIFB9dmFyIHg9dGhpczt0LnByb3RvdHlwZS5fZHJhd0xhYmVscy5jYWxsKHRoaXMpO3RoaXMuX2xhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTt2YXIgQz0rdGhpcy5iYXNlbGluZVZhbHVlKCksRj10aGlzLnBvc2l0aW9uKCkuc2NhbGUsRD10aGlzLmxlbmd0aCgpLnNjYWxlLEI9cC5TdGFja2luZy5zdGFja2VkRXh0ZW50cyh0aGlzLl9zdGFja2luZ1Jlc3VsdCgpKSxHPUIubWluaW11bUV4dGVudHMsSz1bXTtBKEIubWF4aW11bUV4dGVudHMsCmZ1bmN0aW9uKEwsSil7dmFyIFA9eC5faXNWZXJ0aWNhbD9KLndpZHRoOkouaGVpZ2h0O0o9eC5faXNWZXJ0aWNhbD9KLmhlaWdodDpKLndpZHRoO3JldHVybnt4OnguX2lzVmVydGljYWw/TC54LVAvMjpMLngrdi5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVIseTp4Ll9pc1ZlcnRpY2FsP0wueS1KOkwueS1QLzJ9fSk7QShHLGZ1bmN0aW9uKEwsSil7dmFyIFA9eC5faXNWZXJ0aWNhbD9KLndpZHRoOkouaGVpZ2h0O0o9eC5faXNWZXJ0aWNhbD9KLmhlaWdodDpKLndpZHRoO3JldHVybnt4OnguX2lzVmVydGljYWw/TC54LVAvMjpMLngtSix5OnguX2lzVmVydGljYWw/TC55K3YuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSOkwueS1QLzJ9fSk7Sy5zb21lKGZ1bmN0aW9uKEwpe3JldHVybiBMfSkmJnRoaXMuX2xhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX07di5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQShTLApOLFQpe3JldHVybiAwPitMKFMsTixUKT9DKFMsTixUKTp4KFMsTixUKX1mdW5jdGlvbiB5KFMsTixUKXtyZXR1cm4gTWF0aC5hYnMoeChTLE4sVCktQyhTLE4sVCkpfWZ1bmN0aW9uIHgoUyxOLFQpe3JldHVybiBLLnNjYWxlKCtMKFMsTixUKStQLmdldChUKS5nZXQoRihTLE4sVCkpLm9mZnNldCl9ZnVuY3Rpb24gQyhTLE4sVCl7cmV0dXJuIEsuc2NhbGUoUC5nZXQoVCkuZ2V0KEYoUyxOLFQpKS5vZmZzZXQpfWZ1bmN0aW9uIEYoUyxOLFQpe3JldHVybiBwLlN0YWNraW5nLm5vcm1hbGl6ZUtleShKKFMsTixUKSl9dmFyIEQ9dGhpcyxCPXQucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLEc9dGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiLEs9dGhpcy5sZW5ndGgoKS5zY2FsZSxMPXRoaXMubGVuZ3RoKCkuYWNjZXNzb3IsSj10aGlzLnBvc2l0aW9uKCkuYWNjZXNzb3IsUD10aGlzLl9zdGFja2luZ1Jlc3VsdCgpO0JbdGhpcy5faXNWZXJ0aWNhbD8iaGVpZ2h0IjoKIndpZHRoIl09eTtCW0ddPWZ1bmN0aW9uKFMsTixUKXtyZXR1cm4gRC5faXNWZXJ0aWNhbD9BKFMsTixUKTpBKFMsTixUKS15KFMsTixUKX07cmV0dXJuIEJ9O3YucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihBKXtyZXR1cm4gQT09PSh0aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIpP1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnQucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsQSl9O3YucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB2fShxLkJhcik7Yy5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVI9NTtkLlN0YWNrZWRCYXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihtLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPQptfWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihtW3JdPXBbcl0pO20ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDApO2M9ZigyNyk7dmFyIGs9ZigyKTtmPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAoKXt2YXIgcT1tLmNhbGwodGhpcyl8fHRoaXM7cS5fY29ubmVjdG9yc0VuYWJsZWQ9ITE7cS5hZGRDbGFzcygid2F0ZXJmYWxsLXBsb3QiKTtyZXR1cm4gcX1nKHAsbSk7cC5wcm90b3R5cGUuY29ubmVjdG9yc0VuYWJsZWQ9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fY29ubmVjdG9yc0VuYWJsZWQ7dGhpcy5fY29ubmVjdG9yc0VuYWJsZWQ9cTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUudG90YWw9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQocC5fVE9UQUxfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkocC5fVE9UQUxfS0VZLApxLG51bGwpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKHEpe3ZhciByPXRoaXM7dGhpcy5fY29ubmVjdG9yQXJlYS5zZWxlY3RBbGwoImxpbmUiKS5yZW1vdmUoKTt0aGlzLl9jb25uZWN0b3JzRW5hYmxlZCYmbC5XaW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiByLl9kcmF3Q29ubmVjdG9ycygpfSxxKX07cC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihxKXtxPW0ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLHEpO3RoaXMuX2Nvbm5lY3RvckFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKHAuX0NPTk5FQ1RPUl9BUkVBX0NMQVNTLCEwKTtyZXR1cm4gcX07cC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKHEpe3JldHVybiJ5Ij09PXE/W3RoaXMuX2V4dGVudF06bS5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcywKcSl9O3AucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBxPXRoaXMscj1tLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSx0PXRoaXMueSgpLnNjYWxlLHY9ay5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnRvdGFsKCkpO251bGw9PXRoaXMuYXR0cigieSIpJiYoci55PWZ1bmN0aW9uKEEseSx4KXt2YXIgQz1xLnkoKS5hY2Nlc3NvcihBLHkseCk7aWYodihBLHkseCkpcmV0dXJuIE1hdGgubWluKHQuc2NhbGUoQyksdC5zY2FsZSgwKSk7QT1xLl9zdWJ0b3RhbHNbeV07aWYoMD09PXkpcmV0dXJuIDA+Qz90LnNjYWxlKEEtQyk6dC5zY2FsZShBKTt5PXEuX3N1YnRvdGFsc1t5LTFdO3JldHVybiBBPnk/dC5zY2FsZShBKTp0LnNjYWxlKHkpfSk7bnVsbD09dGhpcy5hdHRyKCJoZWlnaHQiKSYmKHIuaGVpZ2h0PWZ1bmN0aW9uKEEseSx4KXt2YXIgQz12KEEseSx4KTtBPXEueSgpLmFjY2Vzc29yKEEseSx4KTtpZihDKXJldHVybiBNYXRoLmFicyh0LnNjYWxlKEEpLQp0LnNjYWxlKDApKTtDPXEuX3N1YnRvdGFsc1t5XTtpZigwPT09eSlyZXR1cm4gTWF0aC5hYnModC5zY2FsZShDKS10LnNjYWxlKEMtQSkpO3k9cS5fc3VidG90YWxzW3ktMV07cmV0dXJuIE1hdGguYWJzKHQuc2NhbGUoQyktdC5zY2FsZSh5KSl9KTtyWyJjbGFzcyJdPWZ1bmN0aW9uKEEseSx4KXt2YXIgQz0iIjtudWxsIT1xLmF0dHIoImNsYXNzIikmJihDPXEuYXR0cigiY2xhc3MiKS5hY2Nlc3NvcihBLHkseCkrIiAiKTtpZih2KEEseSx4KSlyZXR1cm4gQytwLl9CQVJfVE9UQUxfQ0xBU1M7QT1xLnkoKS5hY2Nlc3NvcihBLHkseCk7cmV0dXJuIEMrKDA8QT9wLl9CQVJfR1JPV1RIX0NMQVNTOnAuX0JBUl9ERUNMSU5FX0NMQVNTKX07cmV0dXJuIHJ9O3AucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVTdWJ0b3RhbHMoKTttLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9jYWxjdWxhdGVTdWJ0b3RhbHNBbmRFeHRlbnQ9CmZ1bmN0aW9uKHEpe3ZhciByPXRoaXMsdD1OdW1iZXIuTUFYX1ZBTFVFLHY9TnVtYmVyLk1JTl9WQUxVRSxBPTAseT0hMTtxLmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKHgsQyl7dmFyIEY9ci55KCkuYWNjZXNzb3IoeCxDLHEpOyh4PXIudG90YWwoKS5hY2Nlc3Nvcih4LEMscSkpJiYwIT09Q3x8KEErPUYpO3IuX3N1YnRvdGFscy5wdXNoKEEpO0E8dCYmKHQ9QSk7QT52JiYodj1BKTt4JiYoRjx0JiYodD1GKSxGPnYmJih2PUYpKTtpZigheSYmeCl7Qz1GLUE7Zm9yKEY9MDtGPHIuX3N1YnRvdGFscy5sZW5ndGg7RisrKXIuX3N1YnRvdGFsc1tGXSs9Qzt5PSEwO0ErPUM7dCs9Qzt2Kz1DfX0pO3RoaXMuX2V4dGVudD1bdCx2XX07cC5wcm90b3R5cGUuX2RyYXdDb25uZWN0b3JzPWZ1bmN0aW9uKCl7Zm9yKHZhciBxPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLHI9dGhpcy5kYXRhc2V0cygpWzBdLHQ9MTt0PHIuZGF0YSgpLmxlbmd0aDt0Kyspe3ZhciB2PXQtMSxBPXIuZGF0YSgpW3RdLAp5PXIuZGF0YSgpW3ZdO3k9cS54KHksdixyKTt2YXIgeD1xLngoQSx0LHIpK3Eud2lkdGgoQSx0LHIpLEM9cS55KEEsdCxyKTtpZigwPHRoaXMuX3N1YnRvdGFsc1t0XSYmdGhpcy5fc3VidG90YWxzW3RdPnRoaXMuX3N1YnRvdGFsc1t2XXx8MD50aGlzLl9zdWJ0b3RhbHNbdF0mJnRoaXMuX3N1YnRvdGFsc1t0XT49dGhpcy5fc3VidG90YWxzW3ZdKUM9cS55KEEsdCxyKStxLmhlaWdodChBLHQscik7dGhpcy5fY29ubmVjdG9yQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHAuX0NPTk5FQ1RPUl9DTEFTUywhMCkuYXR0cigieDEiLHkpLmF0dHIoIngyIix4KS5hdHRyKCJ5MSIsQykuYXR0cigieTIiLEMpfX07cC5wcm90b3R5cGUuX3VwZGF0ZVN1YnRvdGFscz1mdW5jdGlvbigpe3ZhciBxPXRoaXMuZGF0YXNldHMoKTswPHEubGVuZ3RoJiYocT1xW3EubGVuZ3RoLTFdLHRoaXMuX3N1YnRvdGFscz1bXSx0aGlzLl9jYWxjdWxhdGVTdWJ0b3RhbHNBbmRFeHRlbnQocSkpfTtyZXR1cm4gcH0oYy5CYXIpOwpmLl9CQVJfREVDTElORV9DTEFTUz0id2F0ZXJmYWxsLWRlY2xpbmUiO2YuX0JBUl9HUk9XVEhfQ0xBU1M9IndhdGVyZmFsbC1ncm93dGgiO2YuX0JBUl9UT1RBTF9DTEFTUz0id2F0ZXJmYWxsLXRvdGFsIjtmLl9DT05ORUNUT1JfQ0xBU1M9ImNvbm5lY3RvciI7Zi5fQ09OTkVDVE9SX0FSRUFfQ0xBU1M9ImNvbm5lY3Rvci1hcmVhIjtmLl9UT1RBTF9LRVk9InRvdGFsIjtkLldhdGVyZmFsbD1mfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobVtyXT1wW3JdKTttLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigxKSxrPWYoMCk7Yz1mdW5jdGlvbihtKXtmdW5jdGlvbiBwKHEpe3ZhciByPW0uY2FsbCh0aGlzKXx8dGhpczsKc3dpdGNoKHEpe2Nhc2UgbnVsbDpjYXNlIHZvaWQgMDpudWxsPT1wLl9wbG90dGFibGVDb2xvckNhY2hlJiYocC5fcGxvdHRhYmxlQ29sb3JDYWNoZT1wLl9nZXRQbG90dGFibGVDb2xvcnMoKSk7cT1sLnNjYWxlT3JkaW5hbCgpLnJhbmdlKHAuX3Bsb3R0YWJsZUNvbG9yQ2FjaGUpO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MTAiOmNhc2UgImNhdGVnb3J5MTAiOmNhc2UgIjEwIjpxPWwuc2NhbGVPcmRpbmFsKGwuc2NoZW1lQ2F0ZWdvcnkxMCk7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMCI6Y2FzZSAiY2F0ZWdvcnkyMCI6Y2FzZSAiMjAiOnE9bC5zY2FsZU9yZGluYWwobC5zY2hlbWVDYXRlZ29yeTIwKTticmVhaztjYXNlICJDYXRlZ29yeTIwYiI6Y2FzZSAiY2F0ZWdvcnkyMGIiOmNhc2UgIjIwYiI6cT1sLnNjYWxlT3JkaW5hbChsLnNjaGVtZUNhdGVnb3J5MjBiKTticmVhaztjYXNlICJDYXRlZ29yeTIwYyI6Y2FzZSAiY2F0ZWdvcnkyMGMiOmNhc2UgIjIwYyI6cT1sLnNjYWxlT3JkaW5hbChsLnNjaGVtZUNhdGVnb3J5MjBjKTsKYnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgQ29sb3JTY2FsZSB0eXBlIik7fXIuX2QzU2NhbGU9cTtyZXR1cm4gcn1nKHAsbSk7cC5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24ocSl7cmV0dXJuIGsuQXJyYXkudW5pcShxKX07cC5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBrLkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSl9O3AuaW52YWxpZGF0ZUNvbG9yQ2FjaGU9ZnVuY3Rpb24oKXtwLl9wbG90dGFibGVDb2xvckNhY2hlPW51bGx9O3AuX2dldFBsb3R0YWJsZUNvbG9ycz1mdW5jdGlvbigpe2Zvcih2YXIgcT1bXSxyPWwuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJwbG90dGFibGUtY29sb3ItdGVzdGVyIiksdD1rLkNvbG9yLmNvbG9yVGVzdChyLCIiKSx2PTAsQT1rLkNvbG9yLmNvbG9yVGVzdChyLCJwbG90dGFibGUtY29sb3JzLTAiKTtudWxsIT1BJiZ2PHRoaXMuX01BWElNVU1fQ09MT1JTX0ZST01fQ1NTJiYKKEEhPT10fHxBIT09cVtxLmxlbmd0aC0xXSk7KXEucHVzaChBKSx2KyssQT1rLkNvbG9yLmNvbG9yVGVzdChyLCJwbG90dGFibGUtY29sb3JzLSIrdik7ci5yZW1vdmUoKTtyZXR1cm4gcX07cC5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24ocSl7dmFyIHI9dGhpcy5fZDNTY2FsZShxKTtxPXRoaXMuZG9tYWluKCkuaW5kZXhPZihxKTtxPU1hdGguZmxvb3IocS90aGlzLnJhbmdlKCkubGVuZ3RoKTtyZXR1cm4gay5Db2xvci5saWdodGVuQ29sb3IocixNYXRoLmxvZyhxKnAuX0xPT1BfTElHSFRFTl9GQUNUT1IrMSkpfTtwLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTtwLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9nZXRSYW5nZT0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtwLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24ocSl7dGhpcy5fZDNTY2FsZS5yYW5nZShxKX07cmV0dXJuIHB9KGYoMTcpLlNjYWxlKTtjLl9MT09QX0xJR0hURU5fRkFDVE9SPTEuNjtjLl9NQVhJTVVNX0NPTE9SU19GUk9NX0NTUz0yNTY7ZC5Db2xvcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobVtyXT1wW3JdKTttLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigxKSxrPWYoMCk7Yz1mdW5jdGlvbihtKXtmdW5jdGlvbiBwKHEpe3ZvaWQgMD09PXEmJihxPSJsaW5lYXIiKTt2YXIgcj1tLmNhbGwodGhpcyl8fHRoaXM7c3dpdGNoKHEpe2Nhc2UgImxpbmVhciI6ci5fY29sb3JTY2FsZT0KbC5zY2FsZUxpbmVhcigpO2JyZWFrO2Nhc2UgImxvZyI6ci5fY29sb3JTY2FsZT1sLnNjYWxlTG9nKCk7YnJlYWs7Y2FzZSAic3FydCI6ci5fY29sb3JTY2FsZT1sLnNjYWxlU3FydCgpO2JyZWFrO2Nhc2UgInBvdyI6ci5fY29sb3JTY2FsZT1sLnNjYWxlUG93KCl9aWYobnVsbD09ci5fY29sb3JTY2FsZSl0aHJvdyBFcnJvcigidW5rbm93biBRdWFudGl0YXRpdmVTY2FsZSBzY2FsZSB0eXBlICIrcSk7ci5yYW5nZShwLlJFRFMpO3JldHVybiByfWcocCxtKTtwLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbihxKXtxPWwuZXh0ZW50KHEpO3JldHVybiBudWxsPT1xWzBdfHxudWxsPT1xWzFdP1tdOnF9O3AucHJvdG90eXBlLl9kM0ludGVycG9sYXRlZFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGUucmFuZ2UoWzAsMV0pLmludGVycG9sYXRlKHRoaXMuX2ludGVycG9sYXRlQ29sb3JzKCkpfTtwLnByb3RvdHlwZS5faW50ZXJwb2xhdGVDb2xvcnM9CmZ1bmN0aW9uKCl7dmFyIHE9dGhpcy5fY29sb3JSYW5nZTtpZigyPnEubGVuZ3RoKXRocm93IEVycm9yKCJDb2xvciBzY2FsZSBhcnJheXMgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50cy4iKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24ocil7cj1NYXRoLm1heCgwLE1hdGgubWluKDEscikpO3IqPXEubGVuZ3RoLTE7dmFyIHQ9TWF0aC5mbG9vcihyKSx2PXItdDtyZXR1cm4gbC5pbnRlcnBvbGF0ZUxhYihxW3RdLHFbTWF0aC5jZWlsKHIpXSkodil9fX07cC5wcm90b3R5cGUuX3Jlc2V0U2NhbGU9ZnVuY3Rpb24oKXt0aGlzLl9kM1NjYWxlPXRoaXMuX2QzSW50ZXJwb2xhdGVkU2NhbGUoKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX07cC5wcm90b3R5cGUuYXV0b0RvbWFpbj1mdW5jdGlvbigpe3ZhciBxPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCk7MDxxLmxlbmd0aCYmdGhpcy5fc2V0RG9tYWluKFtrLk1hdGgubWluKHEsCjApLGsuTWF0aC5tYXgocSwwKV0pfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZShxKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKHEpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sb3JSYW5nZX07cC5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHEpe3RoaXMuX2NvbG9yUmFuZ2U9cTt0aGlzLl9yZXNldFNjYWxlKCl9O3JldHVybiBwfShmKDE3KS5TY2FsZSk7Yy5SRURTPSIjRkZGRkZGICNGRkY2RTEgI0ZFRjRDMCAjRkVEOTc2ICNGRUIyNEMgI0ZEOEQzQyAjRkM0RTJBICNFMzFBMUMgI0IxMDAyNiIuc3BsaXQoIiAiKTsKYy5CTFVFUz0iI0ZGRkZGRiAjQ0NGRkZGICNBNUZGRkQgIzg1RjdGQiAjNkVEM0VGICM1NUE3RTAgIzQxN0ZEMCAjMjU0NUQzICMwQjAyRTEiLnNwbGl0KCIgIik7Yy5QT1NORUc9IiMwQjAyRTEgIzI1NDVEMyAjNDE3RkQwICM1NUE3RTAgIzZFRDNFRiAjODVGN0ZCICNBNUZGRkQgI0NDRkZGRiAjRkZGRkZGICNGRkY2RTEgI0ZFRjRDMCAjRkVEOTc2ICNGRUIyNEMgI0ZEOEQzQyAjRkM0RTJBICNFMzFBMUMgI0IxMDAyNiIuc3BsaXQoIiAiKTtkLkludGVycG9sYXRlZENvbG9yPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxtKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW1bcV0pO2sucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KHAucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBwKX0sbD1mKDEpO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbSgpe3ZhciBwPQprLmNhbGwodGhpcyl8fHRoaXM7cC5fZDNTY2FsZT1sLnNjYWxlTGluZWFyKCk7cmV0dXJuIHB9ZyhtLGspO20ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuWzAsMV19O20ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihwKXtyZXR1cm4gcFswXT09PXBbMV0/W3BbMF0tMSxwWzFdKzFdOnB9O20ucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl9kM1NjYWxlKHApfTttLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLnNjYWxlKHApfTttLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLmludmVydChwKX07bS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX07bS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9O20ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHApe3RoaXMuZG9tYWluKHApfTttLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTttLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9O20ucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihwKXt0aGlzLl9kM1NjYWxlLnJhbmdlKHApfTttLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUuaW52ZXJ0KHApfTttLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS50aWNrcygpfTsKbS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24ocCxxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5jb3B5KCkuZG9tYWluKHApLm5pY2UocSkuZG9tYWluKCl9O3JldHVybiBtfShmKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7ZC5MaW5lYXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLHEpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciB0IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh0KSYmKHBbdF09cVt0XSk7cC5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKTooci5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHIpfSxsPWYoMSksaz1mKDApLG09ZigzKTtjPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIHEocil7dm9pZCAwPT09ciYmKHI9MTApO3ZhciB0PXAuY2FsbCh0aGlzKXx8dGhpczt0Ll9kM1NjYWxlPWwuc2NhbGVMaW5lYXIoKTt0Ll9iYXNlPXI7dC5fcGl2b3Q9dC5fYmFzZTt0Ll9zZXREb21haW4odC5fZGVmYXVsdEV4dGVudCgpKTsKaWYoMT49cil0aHJvdyBFcnJvcigiTW9kaWZpZWRMb2dTY2FsZTogVGhlIGJhc2UgbXVzdCBiZSBceDNlIDEiKTtyZXR1cm4gdH1nKHEscCk7cS5wcm90b3R5cGUuX2FkanVzdGVkTG9nPWZ1bmN0aW9uKHIpe3ZhciB0PTA+cj8tMToxO3IqPXQ7cjx0aGlzLl9waXZvdCYmKHIrPSh0aGlzLl9waXZvdC1yKS90aGlzLl9waXZvdCk7cj1NYXRoLmxvZyhyKS9NYXRoLmxvZyh0aGlzLl9iYXNlKTtyZXR1cm4gcip0fTtxLnByb3RvdHlwZS5faW52ZXJ0ZWRBZGp1c3RlZExvZz1mdW5jdGlvbihyKXt2YXIgdD0wPnI/LTE6MTtyPU1hdGgucG93KHRoaXMuX2Jhc2Uscip0KTtyPHRoaXMuX3Bpdm90JiYocj10aGlzLl9waXZvdCooci0xKS8odGhpcy5fcGl2b3QtMSkpO3JldHVybiByKnR9O3EucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHIpe3JldHVybiB0aGlzLl9kM1NjYWxlKHRoaXMuX2FkanVzdGVkTG9nKHIpKX07cS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKHIpe3JldHVybiB0aGlzLl9pbnZlcnRlZEFkanVzdGVkTG9nKHRoaXMuX2QzU2NhbGUuaW52ZXJ0KHIpKX07CnEucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuc2NhbGUocil9O3EucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuaW52ZXJ0KHIpfTtxLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApfTtxLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtxLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihyKXt0aGlzLmRvbWFpbihyKX07cS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWlufTtxLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHIpe3RoaXMuX3VudHJhbnNmb3JtZWREb21haW49cjtwLnByb3RvdHlwZS5fc2V0RG9tYWluLmNhbGwodGhpcywKW3RoaXMuX2FkanVzdGVkTG9nKHJbMF0pLHRoaXMuX2FkanVzdGVkTG9nKHJbMV0pXSl9O3EucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24ocil7aWYobnVsbD09cilyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihyKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKEYsRCxCKXtyZXR1cm5bRixELEJdLnNvcnQoZnVuY3Rpb24oRyxLKXtyZXR1cm4gRy1LfSlbMV19dmFyIHQ9ay5NYXRoLm1pbih0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApLHY9ay5NYXRoLm1heCh0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApLEE9cih0LHYsLXRoaXMuX3Bpdm90KSx5PXIodCx2LHRoaXMuX3Bpdm90KTtBPXRoaXMuX2xvZ1RpY2tzKC1BLC10KS5tYXAoZnVuY3Rpb24oRil7cmV0dXJuLUZ9KS5yZXZlcnNlKCk7eT10aGlzLl9sb2dUaWNrcyh5LHYpO3ZhciB4PU1hdGgubWF4KHQsCi10aGlzLl9waXZvdCksQz1NYXRoLm1pbih2LHRoaXMuX3Bpdm90KTt4PWwuc2NhbGVMaW5lYXIoKS5kb21haW4oW3gsQ10pLnRpY2tzKHRoaXMuX2hvd01hbnlUaWNrcyh4LEMpKTtBPUEuY29uY2F0KHgpLmNvbmNhdCh5KTsxPj1BLmxlbmd0aCYmKEE9bC5zY2FsZUxpbmVhcigpLmRvbWFpbihbdCx2XSkudGlja3MoKSk7cmV0dXJuIEF9O3EucHJvdG90eXBlLl9sb2dUaWNrcz1mdW5jdGlvbihyLHQpe3ZhciB2PXRoaXMsQT10aGlzLl9ob3dNYW55VGlja3Mocix0KTtpZigwPT09QSlyZXR1cm5bXTt2YXIgeT1NYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGgubG9nKHRoaXMuX2Jhc2UpKSx4PU1hdGguY2VpbChNYXRoLmxvZyh0KS9NYXRoLmxvZyh0aGlzLl9iYXNlKSk7QT1sLnJhbmdlKHgseSwtTWF0aC5jZWlsKCh4LXkpL0EpKTt5PWwucmFuZ2UodGhpcy5fYmFzZSwxLC0odGhpcy5fYmFzZS0xKSkubWFwKE1hdGguZmxvb3IpO3ZhciBDPWsuQXJyYXkudW5pcSh5KTtBPUEubWFwKGZ1bmN0aW9uKEYpe3JldHVybiBDLm1hcChmdW5jdGlvbihEKXtyZXR1cm4gTWF0aC5wb3codi5fYmFzZSwKRi0xKSpEfSl9KTtyZXR1cm4gay5BcnJheS5mbGF0dGVuKEEpLmZpbHRlcihmdW5jdGlvbihGKXtyZXR1cm4gcjw9RiYmRjw9dH0pLnNvcnQoZnVuY3Rpb24oRixEKXtyZXR1cm4gRi1EfSl9O3EucHJvdG90eXBlLl9ob3dNYW55VGlja3M9ZnVuY3Rpb24ocix0KXt2YXIgdj10aGlzLl9hZGp1c3RlZExvZyhrLk1hdGgubWluKHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkpLEE9dGhpcy5fYWRqdXN0ZWRMb2coay5NYXRoLm1heCh0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApKTtyZXR1cm4gTWF0aC5jZWlsKCh0aGlzLl9hZGp1c3RlZExvZyh0KS10aGlzLl9hZGp1c3RlZExvZyhyKSkvKEEtdikqbS5Nb2RpZmllZExvZy5fREVGQVVMVF9OVU1fVElDS1MpfTtxLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbihyKXtyZXR1cm4gcn07cS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bMCx0aGlzLl9iYXNlXX07cS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPQpmdW5jdGlvbihyKXtyZXR1cm4gclswXT09PXJbMV0/KHI9clswXSwwPHI/W3IvdGhpcy5fYmFzZSxyKnRoaXMuX2Jhc2VdOjA9PT1yP1stdGhpcy5fYmFzZSx0aGlzLl9iYXNlXTpbcip0aGlzLl9iYXNlLHIvdGhpcy5fYmFzZV0pOnJ9O3EucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9O3EucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihyKXt0aGlzLl9kM1NjYWxlLnJhbmdlKHIpfTtxLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS50aWNrcygpfTtyZXR1cm4gcX0oZigxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2QuTW9kaWZpZWRMb2c9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMCk7ZC5pbnRlcnZhbFRpY2tHZW5lcmF0b3I9ZnVuY3Rpb24obCl7aWYoMD49bCl0aHJvdyBFcnJvcigiaW50ZXJ2YWwgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24oayl7az0Kay5kb21haW4oKTt2YXIgbT1NYXRoLm1pbihrWzBdLGtbMV0pO2s9TWF0aC5tYXgoa1swXSxrWzFdKTt2YXIgcD1NYXRoLmNlaWwobS9sKSpsO209MD09PW0lbD9bXTpbbV07dmFyIHE9Zy5NYXRoLnJhbmdlKDAsTWF0aC5mbG9vcigoay1wKS9sKSsxKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHArcipsfSk7cmV0dXJuIG0uY29uY2F0KHEpLmNvbmNhdCgwPT09ayVsP1tdOltrXSl9fTtkLmludGVnZXJUaWNrR2VuZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3ZhciBrPWwuZGVmYXVsdFRpY2tzKCk7cmV0dXJuIGsuZmlsdGVyKGZ1bmN0aW9uKG0scCl7cmV0dXJuIDA9PT1tJTF8fDA9PT1wfHxwPT09ay5sZW5ndGgtMX0pfX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihtW3JdPXBbcl0pOwptLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigxKSxrPWYoMjgpO2M9ZnVuY3Rpb24obSl7ZnVuY3Rpb24gcCgpe3ZhciBxPW0uY2FsbCh0aGlzKXx8dGhpcztxLl9kM1NjYWxlPWwuc2NhbGVUaW1lKCk7cS5hdXRvRG9tYWluKCk7cmV0dXJuIHF9ZyhwLG0pO3AucHJvdG90eXBlLnRpY2tJbnRlcnZhbD1mdW5jdGlvbihxLHIpe3ZvaWQgMD09PXImJihyPTEpO3ZhciB0PWwuc2NhbGVUaW1lKCk7cC50aW1lSW50ZXJ2YWxUb0QzVGltZShxKS5ldmVyeShyKTt0LmRvbWFpbih0aGlzLmRvbWFpbigpKTt0LnJhbmdlKHRoaXMucmFuZ2UoKSk7cmV0dXJuIHQudGlja3MoKX07cC5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXtpZihxWzFdPHFbMF0pdGhyb3cgRXJyb3IoIlNjYWxlLlRpbWUgZG9tYWluIHZhbHVlcyBtdXN0IGJlIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIiKTtyZXR1cm4gbS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsCnEpfTtwLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVybltuZXcgRGF0ZSgiMTk3MC0wMS0wMSIpLG5ldyBEYXRlKCIxOTcwLTAxLTAyIildfTtwLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24ocSl7dmFyIHI9cVswXS5nZXRUaW1lKCksdD1xWzFdLmdldFRpbWUoKTtyZXR1cm4gcj09PXQ/KHE9bmV3IERhdGUocikscS5zZXREYXRlKHEuZ2V0RGF0ZSgpLTEpLHQ9bmV3IERhdGUodCksdC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzEpLFtxLHRdKTpxfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZShxKX07cC5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5zY2FsZShuZXcgRGF0ZShxKSl9O3AucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24ocSl7cmV0dXJuIHRoaXMuaW52ZXJ0KHEpLmdldFRpbWUoKX07cC5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9CmZ1bmN0aW9uKCl7dmFyIHE9dGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKTtyZXR1cm5bcVswXS52YWx1ZU9mKCkscVsxXS52YWx1ZU9mKCldfTtwLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3ZhciBxPXRoaXMuZG9tYWluKCk7cmV0dXJuW3FbMF0udmFsdWVPZigpLHFbMV0udmFsdWVPZigpXX07cC5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24ocSl7dGhpcy5kb21haW4oW25ldyBEYXRlKHFbMF0pLG5ldyBEYXRlKHFbMV0pXSl9O3AucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O3AucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07CnAucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihxKXt0aGlzLl9kM1NjYWxlLnJhbmdlKHEpfTtwLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24ocSl7cmV0dXJuIHRoaXMuX2QzU2NhbGUuaW52ZXJ0KHEpfTtwLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS50aWNrcygpfTtwLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5jb3B5KCkuZG9tYWluKHEpLm5pY2UoKS5kb21haW4oKX07cC50aW1lSW50ZXJ2YWxUb0QzVGltZT1mdW5jdGlvbihxKXtzd2l0Y2gocSl7Y2FzZSBrLlRpbWVJbnRlcnZhbC5zZWNvbmQ6cmV0dXJuIGwudGltZVNlY29uZDtjYXNlIGsuVGltZUludGVydmFsLm1pbnV0ZTpyZXR1cm4gbC50aW1lTWludXRlO2Nhc2Ugay5UaW1lSW50ZXJ2YWwuaG91cjpyZXR1cm4gbC50aW1lSG91cjtjYXNlIGsuVGltZUludGVydmFsLmRheTpyZXR1cm4gbC50aW1lRGF5OwpjYXNlIGsuVGltZUludGVydmFsLndlZWs6cmV0dXJuIGwudGltZVdlZWs7Y2FzZSBrLlRpbWVJbnRlcnZhbC5tb250aDpyZXR1cm4gbC50aW1lTW9udGg7Y2FzZSBrLlRpbWVJbnRlcnZhbC55ZWFyOnJldHVybiBsLnRpbWVZZWFyO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlRpbWVJbnRlcnZhbCBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3Q6ICIrcSk7fX07cmV0dXJuIHB9KGYoMTEpLlF1YW50aXRhdGl2ZVNjYWxlKTtkLlRpbWU9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMSksbD1BcnJheTtkLmFkZD1mdW5jdGlvbihrLG0pe2lmKGsubGVuZ3RoIT09bS5sZW5ndGgpdGhyb3cgRXJyb3IoImF0dGVtcHRlZCB0byBhZGQgYXJyYXlzIG9mIHVuZXF1YWwgbGVuZ3RoIik7cmV0dXJuIGsubWFwKGZ1bmN0aW9uKHAscSl7cmV0dXJuIGtbcV0rbVtxXX0pfTtkLnVuaXE9ZnVuY3Rpb24oayl7dmFyIG09Zy5zZXQoKSxwPVtdO2suZm9yRWFjaChmdW5jdGlvbihxKXttLmhhcyhTdHJpbmcocSkpfHwKKG0uYWRkKFN0cmluZyhxKSkscC5wdXNoKHEpKX0pO3JldHVybiBwfTtkLmZsYXR0ZW49ZnVuY3Rpb24oayl7cmV0dXJuIGwucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxrKX07ZC5jcmVhdGVGaWxsZWRBcnJheT1mdW5jdGlvbihrLG0pe2Zvcih2YXIgcD1bXSxxPTA7cTxtO3ErKylwW3FdPSJmdW5jdGlvbiI9PT10eXBlb2Ygaz9rKHEpOms7cmV0dXJuIHB9fSxmdW5jdGlvbihjLGQpe2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKGcsbCxrKXt0aGlzLm1heEluZGV4PXRoaXMubWluSW5kZXg9dGhpcy5leGl0SW5kZXg9dGhpcy5lbnRyeUluZGV4PWc7dGhpcy5idWNrZXRWYWx1ZT1sO3RoaXMubWF4VmFsdWU9dGhpcy5taW5WYWx1ZT1rfWYucHJvdG90eXBlLmlzSW5CdWNrZXQ9ZnVuY3Rpb24oZyl7cmV0dXJuIGc9PXRoaXMuYnVja2V0VmFsdWV9O2YucHJvdG90eXBlLmFkZFRvQnVja2V0PWZ1bmN0aW9uKGcsbCl7Zzx0aGlzLm1pblZhbHVlJiYodGhpcy5taW5WYWx1ZT1nLHRoaXMubWluSW5kZXg9CmwpO2c+dGhpcy5tYXhWYWx1ZSYmKHRoaXMubWF4VmFsdWU9Zyx0aGlzLm1heEluZGV4PWwpO3RoaXMuZXhpdEluZGV4PWx9O2YucHJvdG90eXBlLmdldFVuaXF1ZUluZGljZXM9ZnVuY3Rpb24oKXt2YXIgZz1bdGhpcy5lbnRyeUluZGV4LHRoaXMubWF4SW5kZXgsdGhpcy5taW5JbmRleCx0aGlzLmV4aXRJbmRleF07cmV0dXJuIGcuZmlsdGVyKGZ1bmN0aW9uKGwsayl7cmV0dXJuIDA9PWt8fGwhPWdbay0xXX0pfTtyZXR1cm4gZn0oKTtkLkJ1Y2tldD1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihtLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbSl9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3JldHVybiBudWxsIT09CmwmJmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfWcoayxsKTtrLnByb3RvdHlwZS5jYWxsQ2FsbGJhY2tzPWZ1bmN0aW9uKCl7Zm9yKHZhciBtPXRoaXMscD1bXSxxPTA7cTxhcmd1bWVudHMubGVuZ3RoO3ErKylwW3FdPWFyZ3VtZW50c1txXTt0aGlzLmZvckVhY2goZnVuY3Rpb24ocil7ci5hcHBseShtLHApfSk7cmV0dXJuIHRoaXN9O3JldHVybiBrfShmKDU4KS5TZXQpO2QuQ2FsbGJhY2tTZXQ9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobSl7ZnVuY3Rpb24gcCh0KXt0Lz0yNTU7cmV0dXJuLjAzOTI4Pj10P3QvMTIuOTI6ay5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX12YXIgcT1sLnJnYihtKTttPXAocS5yKTt2YXIgcj1wKHEuZyk7cT1wKHEuYik7cmV0dXJuLjIxMjYqbSsuNzE1MipyKy4wNzIyKnF9dmFyIGw9ZigxKSxrPU1hdGg7ZC5jb250cmFzdD1mdW5jdGlvbihtLHApe209ZyhtKSsuMDU7cD1nKHApKy4wNTtyZXR1cm4gbT5wP20vcDpwL219O2QubGlnaHRlbkNvbG9yPQpmdW5jdGlvbihtLHApe3JldHVybiBsLmNvbG9yKG0pLmJyaWdodGVyKHApLnJnYigpLnRvU3RyaW5nKCl9O2QuY29sb3JUZXN0PWZ1bmN0aW9uKG0scCl7bS5jbGFzc2VkKHAsITApO3ZhciBxPW0uc3R5bGUoImJhY2tncm91bmQtY29sb3IiKTtpZigidHJhbnNwYXJlbnQiPT09cSlyZXR1cm4gbnVsbDtxPS9cKCguKylcKS8uZXhlYyhxKTtpZighcSlyZXR1cm4gbnVsbDtxPXFbMV0uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24ocil7cj0rcjt2YXIgdD1yLnRvU3RyaW5nKDE2KTtyZXR1cm4gMTY+cj8iMCIrdDp0fSk7aWYoND09PXEubGVuZ3RoJiYiMDAiPT09cVszXSlyZXR1cm4gbnVsbDtxPSIjIitxLmpvaW4oIiIpO20uY2xhc3NlZChwLCExKTtyZXR1cm4gcX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDEpLGw9Zig1Nyk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt0aGlzLl9lbnRpdGllcz1bXTt0aGlzLl9ydHJlZT1uZXcgbC5SVHJlZTt0aGlzLl90cmVlPWcucXVhZHRyZWUoKS54KGZ1bmN0aW9uKG0pe3JldHVybiBNYXRoLmZsb29yKG0ucG9zaXRpb24ueCl9KS55KGZ1bmN0aW9uKG0pe3JldHVybiBNYXRoLmZsb29yKG0ucG9zaXRpb24ueSl9KX0Kay5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKG0scCxxKXsodj10aGlzLl9lbnRpdGllcykucHVzaC5hcHBseSh2LG0pO2lmKHZvaWQgMCE9PXEpZm9yKHE9bC5SVHJlZUJvdW5kcy5ib3VuZHMocSksdj0wO3Y8bS5sZW5ndGg7disrKXt2YXIgcj1tW3ZdLHQ9bC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMocChyKSk7bC5SVHJlZUJvdW5kcy5pc0JvdW5kc092ZXJsYXBCb3VuZHMocSx0KSYmKHRoaXMuX3RyZWUuYWRkKHIpLHRoaXMuX3J0cmVlLmluc2VydCh0LHIpKX1lbHNlIGZvcih0aGlzLl90cmVlLmFkZEFsbChtKSx2PTA7djxtLmxlbmd0aDt2Kyspcj1tW3ZdLHQ9bC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMocChyKSksdGhpcy5fcnRyZWUuaW5zZXJ0KHQscik7dmFyIHZ9O2sucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMuX3RyZWUuZmluZChtLngsbS55KX07ay5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0KGwuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0pKX07CmsucHJvdG90eXBlLmVudGl0aWVzSW5YQm91bmRzPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3RYKGwuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0pKX07ay5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHM9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdFkobC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMobSkpfTtrLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbnRpdGllc307cmV0dXJuIGt9KCk7ZC5FbnRpdHlTdG9yZT1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9Zig1Nik7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5NYXA/dGhpcy5fZXM2TWFwPW5ldyB3aW5kb3cuTWFwOnRoaXMuX2tleVZhbHVlUGFpcnM9W119bC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGssbSl7aWYoZy5pc05hTihrKSl0aHJvdyBFcnJvcigiTmFOIG1heSBub3QgYmUgdXNlZCBhcyBhIGtleSB0byB0aGUgTWFwIik7CmlmKG51bGwhPXRoaXMuX2VzNk1hcClyZXR1cm4gdGhpcy5fZXM2TWFwLnNldChrLG0pLHRoaXM7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1rKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLnZhbHVlPW0sdGhpczt0aGlzLl9rZXlWYWx1ZVBhaXJzLnB1c2goe2tleTprLHZhbHVlOm19KTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNk1hcClyZXR1cm4gdGhpcy5fZXM2TWFwLmdldChrKTtmb3IodmFyIG09MDttPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO20rKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW21dLmtleT09PWspcmV0dXJuIHRoaXMuX2tleVZhbHVlUGFpcnNbbV0udmFsdWV9O2wucHJvdG90eXBlLmhhcz1mdW5jdGlvbihrKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5oYXMoayk7CmZvcih2YXIgbT0wO208dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbV0ua2V5PT09aylyZXR1cm4hMDtyZXR1cm4hMX07bC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihrLG0pe3ZhciBwPXRoaXM7bnVsbCE9dGhpcy5fZXM2TWFwP3RoaXMuX2VzNk1hcC5mb3JFYWNoKGZ1bmN0aW9uKHEscil7cmV0dXJuIGsuY2FsbChtLHEscixwKX0sbSk6dGhpcy5fa2V5VmFsdWVQYWlycy5mb3JFYWNoKGZ1bmN0aW9uKHEpe2suY2FsbChtLHEudmFsdWUscS5rZXkscCl9KX07bC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNk1hcClyZXR1cm4gdGhpcy5fZXM2TWFwLmRlbGV0ZShrKTtmb3IodmFyIG09MDttPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO20rKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW21dLmtleT09PWspcmV0dXJuIHRoaXMuX2tleVZhbHVlUGFpcnMuc3BsaWNlKG0sMSksITA7cmV0dXJuITF9OwpyZXR1cm4gbH0oKTtkLk1hcD1jfSxmdW5jdGlvbihjLGQpe2QuYXNzaWduPWZ1bmN0aW9uKCl7Zm9yKHZhciBmPVtdLGc9MDtnPGFyZ3VtZW50cy5sZW5ndGg7ZysrKWZbZ109YXJndW1lbnRzW2ddO2c9e307Zm9yKHZhciBsPTA7bDxmLmxlbmd0aDtsKyspZm9yKHZhciBrPWZbbF0sbT0wLHA9T2JqZWN0LmtleXMoayk7bTxwLmxlbmd0aDttKyspe3ZhciBxPXBbbV07Z1txXT1rW3FdfXJldHVybiBnfX0sZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZigpe31mLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihnLGwpe2Zvcih2YXIgaz1NYXRoLmNlaWwoZy5sZW5ndGgvMiksbT0wO208azttKyspbFswXS5pbnNlcnQoZ1ttXSk7Zm9yKG09azttPGcubGVuZ3RoO20rKylsWzFdLmluc2VydChnW21dKX07cmV0dXJuIGZ9KCk7ZC5TcGxpdFN0cmF0ZWd5VHJpdmlhbD1jO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKCl7fWYucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKGcsbCl7Zz0KZy5zbGljZSgpO2Zvcih0aGlzLmNob29zZUZpcnN0U3BsaXQoZyxsKTswPGcubGVuZ3RoOyl0aGlzLmFkZE5leHQoZyxsKX07Zi5wcm90b3R5cGUuY2hvb3NlRmlyc3RTcGxpdD1mdW5jdGlvbihnLGwpe2Zvcih2YXIgaz0wLG09MCxwPWcubGVuZ3RoLTEscT1nLmxlbmd0aC0xLHI9MTtyPGcubGVuZ3RoLTE7cisrKXt2YXIgdD1nW3JdO3QuYm91bmRzLnhsPmdbcF0uYm91bmRzLnhsP3A9cjp0LmJvdW5kcy54aDxnW2tdLmJvdW5kcy54aCYmKGs9cik7dC5ib3VuZHMueWw+Z1txXS5ib3VuZHMueWw/cT1yOnQuYm91bmRzLnloPGdbbV0uYm91bmRzLnloJiYobT1yKX1tPU1hdGguYWJzKGdba10uYm91bmRzLnhoLWdbcF0uYm91bmRzLnhsKT5NYXRoLmFicyhnW21dLmJvdW5kcy55aC1nW3FdLmJvdW5kcy55bCk/W2sscF06W20scV07az1tWzBdO209bVsxXTtrPT09bSYmKGs9MCxtPWcubGVuZ3RoLTEpO2xbMF0uaW5zZXJ0KGcuc3BsaWNlKE1hdGgubWF4KGssbSksMSlbMF0pO2xbMV0uaW5zZXJ0KGcuc3BsaWNlKE1hdGgubWluKGssCm0pLDEpWzBdKX07Zi5wcm90b3R5cGUuYWRkTmV4dD1mdW5jdGlvbihnLGwpe2Zvcih2YXIgaz1udWxsLG09bnVsbCxwPW51bGwscT0wO3E8Zy5sZW5ndGg7cSsrKXt2YXIgcj1nW3FdLHQ9bFswXS51bmlvbkFyZWFEaWZmZXJlbmNlKHIuYm91bmRzKTtyPWxbMV0udW5pb25BcmVhRGlmZmVyZW5jZShyLmJvdW5kcyk7aWYodDxtfHxudWxsPT1rKWs9cSxtPXQscD1sWzBdO3I8bSYmKGs9cSxtPXIscD1sWzFdKX1wLmluc2VydChnLnNwbGljZShrLDEpWzBdKX07cmV0dXJuIGZ9KCk7ZC5TcGxpdFN0cmF0ZWd5TGluZWFyPWN9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKHApe3JldHVybiBTdHJpbmcocCl9dmFyIGw9ZigxKSxrPWYoMCk7Yz1mKDEwKTtkLklTdGFja2luZ09yZGVyPWMubWFrZUVudW0oWyJ0b3Bkb3duIiwiYm90dG9tdXAiXSk7dmFyIG09TWF0aDtkLnN0YWNrPWZ1bmN0aW9uKHAscSxyLHQpe3ZvaWQgMD09PXQmJih0PSJib3R0b211cCIpO3ZhciB2PWwubWFwKCksQT0KbC5tYXAoKSx5PW5ldyBrLk1hcDsidG9wZG93biI9PT10JiYocD1wLnNsaWNlKCkscC5yZXZlcnNlKCkpO3AuZm9yRWFjaChmdW5jdGlvbih4KXt2YXIgQz1uZXcgay5NYXA7eC5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbihGLEQpe3ZhciBCPWcocShGLEQseCkpLEc9K3IoRixELHgpLEs9MDw9Rz92OkE7aWYoSy5oYXMoQikpe3ZhciBMPUsuZ2V0KEIpO0suc2V0KEIsTCtHKX1lbHNlIEw9MCxLLnNldChCLEcpO0Muc2V0KEIse29mZnNldDpMLHZhbHVlOkcsYXhpc1ZhbHVlOnEoRixELHgpLG9yaWdpbmFsRGF0dW06RixvcmlnaW5hbERhdGFzZXQ6eCxvcmlnaW5hbEluZGV4OkR9KX0pO3kuc2V0KHgsQyl9KTtyZXR1cm4geX07ZC5zdGFja2VkRXh0ZW50cz1mdW5jdGlvbihwKXt2YXIgcT1uZXcgay5NYXAscj1uZXcgay5NYXA7cC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaChmdW5jdGlvbih2LEEpe3ZhciB5PWsuTWF0aC5tYXgoW3Yub2Zmc2V0K3YudmFsdWUsdi5vZmZzZXRdLAp2Lm9mZnNldCkseD1rLk1hdGgubWluKFt2Lm9mZnNldCt2LnZhbHVlLHYub2Zmc2V0XSx2Lm9mZnNldCksQz12LmF4aXNWYWx1ZTtxLmhhcyhBKT9xLmdldChBKS5leHRlbnQ8eSYmcS5zZXQoQSx7ZXh0ZW50OnksYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnZ9KTpxLnNldChBLHtleHRlbnQ6eSxheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06dn0pO3IuaGFzKEEpP3IuZ2V0KEEpLmV4dGVudD54JiZyLnNldChBLHtleHRlbnQ6eCxheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06dn0pOnIuc2V0KEEse2V4dGVudDp4LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp2fSl9KX0pO3JldHVybnttYXhpbXVtRXh0ZW50czpxLG1pbmltdW1FeHRlbnRzOnJ9fTtkLnN0YWNrZWRFeHRlbnQ9ZnVuY3Rpb24ocCxxLHIpe3ZhciB0PVtdO3AuZm9yRWFjaChmdW5jdGlvbihBLHkpe3kuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oeCxDKXtpZihudWxsPT1yfHxyKHgsQyx5KSl4PUEuZ2V0KGcocSh4LEMseSkpKSwKdC5wdXNoKHgudmFsdWUreC5vZmZzZXQpfSl9KTtwPWsuTWF0aC5tYXgodCwwKTt2YXIgdj1rLk1hdGgubWluKHQsMCk7cmV0dXJuW20ubWluKHYsMCksbS5tYXgoMCxwKV19O2Qubm9ybWFsaXplS2V5PWd9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDApO2QuZ2V0VHJhbnNsYXRvcj1mdW5jdGlvbihrKXtrPWsucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpO3ZhciBtPWsuX19QbG90dGFibGVfQ2xpZW50VHJhbnNsYXRvcjtudWxsPT1tJiYobT1uZXcgbChrKSxrLl9fUGxvdHRhYmxlX0NsaWVudFRyYW5zbGF0b3I9bSk7cmV0dXJuIG19O3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayhtKXt0aGlzLl9yb290RWxlbWVudD1tfWsucHJvdG90eXBlLmNvbXB1dGVQb3NpdGlvbj1mdW5jdGlvbihtLHApe209e3g6bSx5OnB9O3A9Zy5NYXRoLmdldEN1bXVsYXRpdmVUcmFuc2Zvcm0odGhpcy5fcm9vdEVsZW1lbnQpO3JldHVybiBudWxsPT1wP206Zy5NYXRoLmFwcGx5VHJhbnNmb3JtKHAsCm0pfTtrLmlzRXZlbnRJbnNpZGU9ZnVuY3Rpb24obSxwKXtyZXR1cm4gZy5ET00uY29udGFpbnMobS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkscC50YXJnZXQpfTtyZXR1cm4ga30oKTtkLlRyYW5zbGF0b3I9bH0sZnVuY3Rpb24oYyxkLGYpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZz1mKDEyNCk7Zi5kKGQsImVhc2VMaW5lYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIGcuYX0pO3ZhciBsPWYoMTI2KTtmLmQoZCwiZWFzZVF1YWQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO2YuZChkLCJlYXNlUXVhZEluIixmdW5jdGlvbigpe3JldHVybiBsLmJ9KTtmLmQoZCwiZWFzZVF1YWRPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuY30pO2YuZChkLCJlYXNlUXVhZEluT3V0IixmdW5jdGlvbigpe3JldHVybiBsLmF9KTt2YXIgaz1mKDEyMSk7Zi5kKGQsImVhc2VDdWJpYyIsZnVuY3Rpb24oKXtyZXR1cm4gay5hfSk7Zi5kKGQsImVhc2VDdWJpY0luIiwKZnVuY3Rpb24oKXtyZXR1cm4gay5ifSk7Zi5kKGQsImVhc2VDdWJpY091dCIsZnVuY3Rpb24oKXtyZXR1cm4gay5jfSk7Zi5kKGQsImVhc2VDdWJpY0luT3V0IixmdW5jdGlvbigpe3JldHVybiBrLmF9KTt2YXIgbT1mKDEyNSk7Zi5kKGQsImVhc2VQb2x5IixmdW5jdGlvbigpe3JldHVybiBtLmF9KTtmLmQoZCwiZWFzZVBvbHlJbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5ifSk7Zi5kKGQsImVhc2VQb2x5T3V0IixmdW5jdGlvbigpe3JldHVybiBtLmN9KTtmLmQoZCwiZWFzZVBvbHlJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbS5hfSk7dmFyIHA9ZigxMjcpO2YuZChkLCJlYXNlU2luIixmdW5jdGlvbigpe3JldHVybiBwLmF9KTtmLmQoZCwiZWFzZVNpbkluIixmdW5jdGlvbigpe3JldHVybiBwLmJ9KTtmLmQoZCwiZWFzZVNpbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5jfSk7Zi5kKGQsImVhc2VTaW5Jbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5hfSk7dmFyIHE9ZigxMjMpO2YuZChkLAoiZWFzZUV4cCIsZnVuY3Rpb24oKXtyZXR1cm4gcS5hfSk7Zi5kKGQsImVhc2VFeHBJbiIsZnVuY3Rpb24oKXtyZXR1cm4gcS5ifSk7Zi5kKGQsImVhc2VFeHBPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuY30pO2YuZChkLCJlYXNlRXhwSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYX0pO3ZhciByPWYoMTIwKTtmLmQoZCwiZWFzZUNpcmNsZSIsZnVuY3Rpb24oKXtyZXR1cm4gci5hfSk7Zi5kKGQsImVhc2VDaXJjbGVJbiIsZnVuY3Rpb24oKXtyZXR1cm4gci5ifSk7Zi5kKGQsImVhc2VDaXJjbGVPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHIuY30pO2YuZChkLCJlYXNlQ2lyY2xlSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHIuYX0pO3ZhciB0PWYoMTE5KTtmLmQoZCwiZWFzZUJvdW5jZSIsZnVuY3Rpb24oKXtyZXR1cm4gdC5hfSk7Zi5kKGQsImVhc2VCb3VuY2VJbiIsZnVuY3Rpb24oKXtyZXR1cm4gdC5ifSk7Zi5kKGQsImVhc2VCb3VuY2VPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHQuYX0pOwpmLmQoZCwiZWFzZUJvdW5jZUluT3V0IixmdW5jdGlvbigpe3JldHVybiB0LmN9KTt2YXIgdj1mKDExOCk7Zi5kKGQsImVhc2VCYWNrIixmdW5jdGlvbigpe3JldHVybiB2LmF9KTtmLmQoZCwiZWFzZUJhY2tJbiIsZnVuY3Rpb24oKXtyZXR1cm4gdi5ifSk7Zi5kKGQsImVhc2VCYWNrT3V0IixmdW5jdGlvbigpe3JldHVybiB2LmN9KTtmLmQoZCwiZWFzZUJhY2tJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdi5hfSk7dmFyIEE9ZigxMjIpO2YuZChkLCJlYXNlRWxhc3RpYyIsZnVuY3Rpb24oKXtyZXR1cm4gQS5hfSk7Zi5kKGQsImVhc2VFbGFzdGljSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYn0pO2YuZChkLCJlYXNlRWxhc3RpY091dCIsZnVuY3Rpb24oKXtyZXR1cm4gQS5hfSk7Zi5kKGQsImVhc2VFbGFzdGljSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuY30pfSxmdW5jdGlvbihjLGQsZil7Zi5kKGQsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGd9KTtmLmQoZCwiYyIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pOwpmLmQoZCwiYSIsZnVuY3Rpb24oKXtyZXR1cm4ga30pO3ZhciBnPWZ1bmN0aW9uIHEocCl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCp0KigocCsxKSp0LXApfXA9K3A7ci5vdmVyc2hvb3Q9cTtyZXR1cm4gcn0oMS43MDE1OCksbD1mdW5jdGlvbiByKHEpe2Z1bmN0aW9uIHQodil7cmV0dXJuLS12KnYqKChxKzEpKnYrcSkrMX1xPStxO3Qub3ZlcnNob290PXI7cmV0dXJuIHR9KDEuNzAxNTgpLGs9ZnVuY3Rpb24gdChyKXtmdW5jdGlvbiB2KEEpe3JldHVybigxPihBKj0yKT9BKkEqKChyKzEpKkEtcik6KEEtPTIpKkEqKChyKzEpKkErcikrMikvMn1yPStyO3Yub3ZlcnNob290PXQ7cmV0dXJuIHZ9KDEuNzAxNTgpfSxmdW5jdGlvbihjLGQpe2Z1bmN0aW9uIGYoeSl7cmV0dXJuKHk9K3kpPGc/QSp5Knk6eTxrP0EqKHktPWwpKnkrbTp5PHE/QSooeS09cCkqeStyOkEqKHktPXQpKnkrdn1kLmI9ZnVuY3Rpb24oeSl7cmV0dXJuIDEtZigxLXkpfTtkLmE9ZjtkLmM9ZnVuY3Rpb24oeSl7cmV0dXJuKDE+PQooeSo9Mik/MS1mKDEteSk6Zih5LTEpKzEpLzJ9O3ZhciBnPTQvMTEsbD02LzExLGs9OC8xMSxtPS43NSxwPTkvMTEscT0xMC8xMSxyPS45Mzc1LHQ9MjEvMjIsdj0uOTg0Mzc1LEE9MS9nL2d9LGZ1bmN0aW9uKGMsZCl7ZC5iPWZ1bmN0aW9uKGYpe3JldHVybiAxLU1hdGguc3FydCgxLWYqZil9O2QuYz1mdW5jdGlvbihmKXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tZipmKX07ZC5hPWZ1bmN0aW9uKGYpe3JldHVybigxPj0oZio9Mik/MS1NYXRoLnNxcnQoMS1mKmYpOk1hdGguc3FydCgxLShmLT0yKSpmKSsxKS8yfX0sZnVuY3Rpb24oYyxkKXtkLmI9ZnVuY3Rpb24oZil7cmV0dXJuIGYqZipmfTtkLmM9ZnVuY3Rpb24oZil7cmV0dXJuLS1mKmYqZisxfTtkLmE9ZnVuY3Rpb24oZil7cmV0dXJuKDE+PShmKj0yKT9mKmYqZjooZi09MikqZipmKzIpLzJ9fSxmdW5jdGlvbihjLGQsZil7Zi5kKGQsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTtmLmQoZCwiYSIsZnVuY3Rpb24oKXtyZXR1cm4ga30pOwpmLmQoZCwiYyIsZnVuY3Rpb24oKXtyZXR1cm4gbX0pO3ZhciBnPTIqTWF0aC5QSSxsPWZ1bmN0aW9uIHQocSxyKXtmdW5jdGlvbiB2KHkpe3JldHVybiBxKk1hdGgucG93KDIsMTAqLS15KSpNYXRoLnNpbigoQS15KS9yKX12YXIgQT1NYXRoLmFzaW4oMS8ocT1NYXRoLm1heCgxLHEpKSkqKHIvPWcpO3YuYW1wbGl0dWRlPWZ1bmN0aW9uKHkpe3JldHVybiB0KHkscipnKX07di5wZXJpb2Q9ZnVuY3Rpb24oeSl7cmV0dXJuIHQocSx5KX07cmV0dXJuIHZ9KDEsLjMpLGs9ZnVuY3Rpb24gdihyLHQpe2Z1bmN0aW9uIEEoeCl7cmV0dXJuIDEtcipNYXRoLnBvdygyLC0xMCooeD0reCkpKk1hdGguc2luKCh4K3kpL3QpfXZhciB5PU1hdGguYXNpbigxLyhyPU1hdGgubWF4KDEscikpKSoodC89Zyk7QS5hbXBsaXR1ZGU9ZnVuY3Rpb24oeCl7cmV0dXJuIHYoeCx0KmcpfTtBLnBlcmlvZD1mdW5jdGlvbih4KXtyZXR1cm4gdihyLHgpfTtyZXR1cm4gQX0oMSwuMyksbT1mdW5jdGlvbiBBKHQsdil7ZnVuY3Rpb24geShDKXtyZXR1cm4oMD4KKEM9MipDLTEpP3QqTWF0aC5wb3coMiwxMCpDKSpNYXRoLnNpbigoeC1DKS92KToyLXQqTWF0aC5wb3coMiwtMTAqQykqTWF0aC5zaW4oKHgrQykvdikpLzJ9dmFyIHg9TWF0aC5hc2luKDEvKHQ9TWF0aC5tYXgoMSx0KSkpKih2Lz1nKTt5LmFtcGxpdHVkZT1mdW5jdGlvbihDKXtyZXR1cm4gQShDLHYqZyl9O3kucGVyaW9kPWZ1bmN0aW9uKEMpe3JldHVybiBBKHQsQyl9O3JldHVybiB5fSgxLC4zKX0sZnVuY3Rpb24oYyxkKXtkLmI9ZnVuY3Rpb24oZil7cmV0dXJuIE1hdGgucG93KDIsMTAqZi0xMCl9O2QuYz1mdW5jdGlvbihmKXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCpmKX07ZC5hPWZ1bmN0aW9uKGYpe3JldHVybigxPj0oZio9Mik/TWF0aC5wb3coMiwxMCpmLTEwKToyLU1hdGgucG93KDIsMTAtMTAqZikpLzJ9fSxmdW5jdGlvbihjLGQpe2QuYT1mdW5jdGlvbihmKXtyZXR1cm4rZn19LGZ1bmN0aW9uKGMsZCxmKXtmLmQoZCwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pO2YuZChkLAoiYyIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO2YuZChkLCJhIixmdW5jdGlvbigpe3JldHVybiBrfSk7dmFyIGc9ZnVuY3Rpb24gcShwKXtmdW5jdGlvbiByKHQpe3JldHVybiBNYXRoLnBvdyh0LHApfXA9K3A7ci5leHBvbmVudD1xO3JldHVybiByfSgzKSxsPWZ1bmN0aW9uIHIocSl7ZnVuY3Rpb24gdCh2KXtyZXR1cm4gMS1NYXRoLnBvdygxLXYscSl9cT0rcTt0LmV4cG9uZW50PXI7cmV0dXJuIHR9KDMpLGs9ZnVuY3Rpb24gdChyKXtmdW5jdGlvbiB2KEEpe3JldHVybigxPj0oQSo9Mik/TWF0aC5wb3coQSxyKToyLU1hdGgucG93KDItQSxyKSkvMn1yPStyO3YuZXhwb25lbnQ9dDtyZXR1cm4gdn0oMyl9LGZ1bmN0aW9uKGMsZCl7ZC5iPWZ1bmN0aW9uKGYpe3JldHVybiBmKmZ9O2QuYz1mdW5jdGlvbihmKXtyZXR1cm4gZiooMi1mKX07ZC5hPWZ1bmN0aW9uKGYpe3JldHVybigxPj0oZio9Mik/ZipmOi0tZiooMi1mKSsxKS8yfX0sZnVuY3Rpb24oYyxkKXtkLmI9ZnVuY3Rpb24obCl7cmV0dXJuIDEtCk1hdGguY29zKGwqZyl9O2QuYz1mdW5jdGlvbihsKXtyZXR1cm4gTWF0aC5zaW4obCpnKX07ZC5hPWZ1bmN0aW9uKGwpe3JldHVybigxLU1hdGguY29zKGYqbCkpLzJ9O3ZhciBmPU1hdGguUEksZz1mLzJ9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGspe3JldHVybiEwPT09bChrKSYmIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoayl9dmFyIGw9ZigxMjkpO2MuZXhwb3J0cz1mdW5jdGlvbihrKXtpZighMT09PWcoaykpcmV0dXJuITE7az1rLmNvbnN0cnVjdG9yO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgaylyZXR1cm4hMTtrPWsucHJvdG90eXBlO3JldHVybiExPT09ZyhrKXx8ITE9PT1rLmhhc093blByb3BlcnR5KCJpc1Byb3RvdHlwZU9mIik/ITE6ITB9fSxmdW5jdGlvbihjKXtjLmV4cG9ydHM9ZnVuY3Rpb24oZCl7cmV0dXJuIG51bGwhPWQmJiJvYmplY3QiPT09dHlwZW9mIGQmJiExPT09QXJyYXkuaXNBcnJheShkKX19LGZ1bmN0aW9uKGMsCmQpe2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKGcsbCxrKXt2b2lkIDA9PT1sJiYobD0xMCk7dm9pZCAwPT09ayYmKGs9e30pO3ZhciBtPXRoaXM7dGhpcy5jdHg9Zzt0aGlzLmxpbmVIZWlnaHQ9bDt0aGlzLnN0eWxlPWs7dGhpcy5jcmVhdGVSdWxlcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihwKXttLmN0eC5mb250PW0uc3R5bGUuZm9udDtyZXR1cm57d2lkdGg6bS5jdHgubWVhc3VyZVRleHQocCkud2lkdGgsaGVpZ2h0Om0ubGluZUhlaWdodH19fTt0aGlzLmNyZWF0ZVBlbj1mdW5jdGlvbihwLHEscil7bnVsbD09ciYmKHI9bS5jdHgpO3Iuc2F2ZSgpO3IudHJhbnNsYXRlKHEudHJhbnNsYXRlWzBdLHEudHJhbnNsYXRlWzFdKTtyLnJvdGF0ZShxLnJvdGF0ZSpNYXRoLlBJLzE4MCk7cmV0dXJuIG0uY3JlYXRlQ2FudmFzUGVuKHIpfTt2b2lkIDA9PT10aGlzLnN0eWxlLmZpbGwmJih0aGlzLnN0eWxlLmZpbGw9IiM0NDQiKX1mLnByb3RvdHlwZS5jcmVhdGVDYW52YXNQZW49ZnVuY3Rpb24oZyl7dmFyIGw9CnRoaXM7cmV0dXJue2Rlc3Ryb3k6ZnVuY3Rpb24oKXtnLnJlc3RvcmUoKX0sd3JpdGU6ZnVuY3Rpb24oayxtLHAscSl7Zy50ZXh0QWxpZ249bTtudWxsIT1sLnN0eWxlLmZvbnQmJihnLmZvbnQ9bC5zdHlsZS5mb250KTtudWxsIT1sLnN0eWxlLmZpbGwmJihnLmZpbGxTdHlsZT1sLnN0eWxlLmZpbGwsZy5maWxsVGV4dChrLHAscSkpO251bGwhPWwuc3R5bGUuc3Ryb2tlJiYoZy5zdHJva2VTdHlsZT1sLnN0eWxlLmZpbGwsZy5zdHJva2VUZXh0KGsscCxxKSl9fX07cmV0dXJuIGZ9KCk7ZC5DYW52YXNDb250ZXh0PWN9LGZ1bmN0aW9uKGMsZCl7dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBnKCl7fWcuYXBwZW5kPWZ1bmN0aW9uKGwsayl7Zm9yKHZhciBtPVtdLHA9MjtwPGFyZ3VtZW50cy5sZW5ndGg7cCsrKW1bcC0yXT1hcmd1bWVudHNbcF07bT1nLmNyZWF0ZS5hcHBseShnLFtrXS5jb25jYXQobSkpO2wuYXBwZW5kQ2hpbGQobSk7cmV0dXJuIG19O2cuY3JlYXRlPWZ1bmN0aW9uKGwpe2Zvcih2YXIgaz0KW10sbT0xO208YXJndW1lbnRzLmxlbmd0aDttKyspa1ttLTFdPWFyZ3VtZW50c1ttXTttPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhnLlNWR19OUyxsKTtnLmFkZENsYXNzZXMuYXBwbHkoZyxbbV0uY29uY2F0KGspKTtyZXR1cm4gbX07Zy5hZGRDbGFzc2VzPWZ1bmN0aW9uKGwpe2Zvcih2YXIgaz1bXSxtPTE7bTxhcmd1bWVudHMubGVuZ3RoO20rKylrW20tMV09YXJndW1lbnRzW21dO2s9ay5maWx0ZXIoZnVuY3Rpb24ocCl7cmV0dXJuIG51bGwhPXB9KTtudWxsIT1sLmNsYXNzTGlzdD9rLmZvckVhY2goZnVuY3Rpb24ocCl7bC5jbGFzc0xpc3QuYWRkKHApfSk6bC5zZXRBdHRyaWJ1dGUoImNsYXNzIixrLmpvaW4oIiAiKSl9O2cuZ2V0RGltZW5zaW9ucz1mdW5jdGlvbihsKXtpZihsLmdldEJCb3gpdHJ5e3ZhciBrPWwuZ2V0QkJveCgpO3JldHVybnt3aWR0aDprLndpZHRoLGhlaWdodDprLmhlaWdodH19Y2F0Y2gobSl7fXJldHVybntoZWlnaHQ6MCx3aWR0aDowfX07cmV0dXJuIGd9KCk7CmYuU1ZHX05TPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7ZC5TdmdVdGlscz1mO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBnKGwsayxtKXt2b2lkIDA9PT1tJiYobT0hMSk7dmFyIHA9dGhpczt0aGlzLmVsZW1lbnQ9bDt0aGlzLmNsYXNzTmFtZT1rO3RoaXMuYWRkVGl0bGVFbGVtZW50PW07dGhpcy5jcmVhdGVSdWxlcj1mdW5jdGlvbigpe3ZhciBxPXAuZ2V0VGV4dEVsZW1lbnRzKHAuZWxlbWVudCkscj1xLnBhcmVudEVsZW1lbnQsdD1xLmNvbnRhaW5lckVsZW1lbnQsdj1xLnRleHRFbGVtZW50O3JldHVybiBmdW5jdGlvbihBKXtyLmFwcGVuZENoaWxkKHQpO3YudGV4dENvbnRlbnQ9QTtBPWYuZ2V0RGltZW5zaW9ucyh2KTtyLnJlbW92ZUNoaWxkKHQpO3JldHVybiBBfX07dGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24ocSxyLHQpe251bGw9PXQmJih0PXAuZWxlbWVudCk7dD1mLmFwcGVuZCh0LCJnIiwidGV4dC1jb250YWluZXIiLHAuY2xhc3NOYW1lKTtwLmFkZFRpdGxlRWxlbWVudCYmCihmLmFwcGVuZCh0LCJ0aXRsZSIpLnRleHRDb250ZW50PXEsdC5zZXRBdHRyaWJ1dGUoInRpdGxlIixxKSk7cT1mLmFwcGVuZCh0LCJnIiwidGV4dC1hcmVhIik7cS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3IudHJhbnNsYXRlWzBdKyIsIityLnRyYW5zbGF0ZVsxXSsiKSIrKCJyb3RhdGUoIityLnJvdGF0ZSsiKSIpKTtyZXR1cm4gcC5jcmVhdGVTdmdMaW5lUGVuKHEpfX1nLnByb3RvdHlwZS5zZXRBZGRUaXRsZUVsZW1lbnQ9ZnVuY3Rpb24obCl7dGhpcy5hZGRUaXRsZUVsZW1lbnQ9bH07Zy5wcm90b3R5cGUuY3JlYXRlU3ZnTGluZVBlbj1mdW5jdGlvbihsKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oayxtLHAscSl7dmFyIHI9Zi5hcHBlbmQobCwidGV4dCIsInRleHQtbGluZSIpO3IudGV4dENvbnRlbnQ9aztyLnNldEF0dHJpYnV0ZSgidGV4dC1hbmNob3IiLG0pO3Iuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitwKyIsIitxKyIpIik7CnIuc2V0QXR0cmlidXRlKCJ5IiwiLTAuMjVlbSIpfX19O2cucHJvdG90eXBlLmdldFRleHRFbGVtZW50cz1mdW5jdGlvbihsKXtpZigidGV4dCI9PT1sLnRhZ05hbWUpe3ZhciBrPWwucGFyZW50RWxlbWVudDtudWxsPT1rJiYoaz1sLnBhcmVudE5vZGUpO2sucmVtb3ZlQ2hpbGQobCk7cmV0dXJue2NvbnRhaW5lckVsZW1lbnQ6bCxwYXJlbnRFbGVtZW50OmssdGV4dEVsZW1lbnQ6bH19dmFyIG09bC5xdWVyeVNlbGVjdG9yKCJ0ZXh0Iik7aWYobnVsbCE9bSlyZXR1cm4gaz1sLnBhcmVudEVsZW1lbnQsbnVsbD09ayYmKGs9bC5wYXJlbnROb2RlKSxrLnJlbW92ZUNoaWxkKGwpLHtjb250YWluZXJFbGVtZW50OmwscGFyZW50RWxlbWVudDprLHRleHRFbGVtZW50Om19O2s9Zi5jcmVhdGUoInRleHQiLHRoaXMuY2xhc3NOYW1lKTtyZXR1cm57Y29udGFpbmVyRWxlbWVudDprLHBhcmVudEVsZW1lbnQ6bCx0ZXh0RWxlbWVudDprfX07cmV0dXJuIGd9KCk7ZC5TdmdDb250ZXh0PWN9LGZ1bmN0aW9uKGMsCmQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobVtyXT1wW3JdKTttLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigyMSksaz1mKDM2KTtjPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAocSl7dmFyIHI9bS5jYWxsKHRoaXMscSl8fHRoaXM7ci5kaW1DYWNoZT1uZXcgbC5DYWNoZShmdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZU5vdEZyb21DYWNoZSh0KX0pO3JldHVybiByfWcocCxtKTtwLnByb3RvdHlwZS5fbWVhc3VyZU5vdEZyb21DYWNoZT1mdW5jdGlvbihxKXtyZXR1cm4gbS5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMscSl9O3AucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24ocSl7dm9pZCAwPT09cSYmKHE9ay5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUKTsKcmV0dXJuIHRoaXMuZGltQ2FjaGUuZ2V0KHEpfTtwLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuZGltQ2FjaGUuY2xlYXIoKTttLnByb3RvdHlwZS5yZXNldC5jYWxsKHRoaXMpfTtyZXR1cm4gcH0oZig2MCkuQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlcik7ZC5DYWNoZU1lYXN1cmVyPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDU5KSxsPWYoNjIpLGs9Zig2NCksbT1mKDY2KTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChxKXt0aGlzLmNvbnRleHQ9cTt0aGlzLm1lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIodGhpcy5jb250ZXh0KTt0aGlzLndyYXBwZXI9bmV3IGsuV3JhcHBlcjt0aGlzLndyaXRlcj1uZXcgbS5Xcml0ZXIodGhpcy5tZWFzdXJlcix0aGlzLmNvbnRleHQsdGhpcy53cmFwcGVyKX1wLnN2Zz1mdW5jdGlvbihxLHIsdCl7cmV0dXJuIG5ldyBwKG5ldyBnLlN2Z0NvbnRleHQocSxyLHQpKX07cC5jYW52YXM9ZnVuY3Rpb24ocSxyLHQpe3JldHVybiBuZXcgcChuZXcgZy5DYW52YXNDb250ZXh0KHEsCnIsdCkpfTtwLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihxLHIsdCx2LEEpe3RoaXMud3JpdGVyLndyaXRlKHEscix0LHYsQSl9O3AucHJvdG90eXBlLmNsZWFyTWVhc3VyZXJDYWNoZT1mdW5jdGlvbigpe3RoaXMubWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHB9KCk7ZC5UeXBlc2V0dGVyPWN9LGZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyl7dGhpcy5jYWNoZT17fTt0aGlzLmNvbXB1dGU9Z31mLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZyl7dGhpcy5jYWNoZS5oYXNPd25Qcm9wZXJ0eShnKXx8KHRoaXMuY2FjaGVbZ109dGhpcy5jb21wdXRlKGcpKTtyZXR1cm4gdGhpcy5jYWNoZVtnXX07Zi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPXt9O3JldHVybiB0aGlzfTtyZXR1cm4gZn0oKTtkLkNhY2hlPWN9LGZ1bmN0aW9uKGMsZCl7ZC5NZXRob2RzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZigpe31mLmFycmF5RXE9ZnVuY3Rpb24oZyxsKXtpZihudWxsPT0KZ3x8bnVsbD09bClyZXR1cm4gZz09PWw7aWYoZy5sZW5ndGghPT1sLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGs9MDtrPGcubGVuZ3RoO2srKylpZihnW2tdIT09bFtrXSlyZXR1cm4hMTtyZXR1cm4hMH07Zi5vYmpFcT1mdW5jdGlvbihnLGwpe2lmKG51bGw9PWd8fG51bGw9PWwpcmV0dXJuIGc9PT1sO3ZhciBrPU9iamVjdC5rZXlzKGcpLnNvcnQoKSxtPU9iamVjdC5rZXlzKGwpLnNvcnQoKSxwPWsubWFwKGZ1bmN0aW9uKHIpe3JldHVybiBnW3JdfSkscT1tLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gbFtyXX0pO3JldHVybiBmLmFycmF5RXEoayxtKSYmZi5hcnJheUVxKHAscSl9O2Yuc3RyaWN0RXE9ZnVuY3Rpb24oZyxsKXtyZXR1cm4gZz09PWx9O2YuZGVmYXVsdHM9ZnVuY3Rpb24oZyl7Zm9yKHZhciBsPVtdLGs9MTtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWxbay0xXT1hcmd1bWVudHNba107aWYobnVsbD09Zyl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTsKdmFyIG09T2JqZWN0KGcpO2wuZm9yRWFjaChmdW5jdGlvbihwKXtpZihudWxsIT1wKWZvcih2YXIgcSBpbiBwKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLHEpJiYobVtxXT1wW3FdKX0pO3JldHVybiBtfTtyZXR1cm4gZn0oKX0sZnVuY3Rpb24oYyxkKXtkLlN0cmluZ01ldGhvZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKCl7fWYuY29tYmluZVdoaXRlc3BhY2U9ZnVuY3Rpb24oZyl7cmV0dXJuIGcucmVwbGFjZSgvWyBcdF0rL2csIiAiKX07Zi5pc05vdEVtcHR5U3RyaW5nPWZ1bmN0aW9uKGcpe3JldHVybiBnJiYiIiE9PWcudHJpbSgpfTtmLnRyaW1TdGFydD1mdW5jdGlvbihnLGwpe2lmKCFnKXJldHVybiBnO2c9Zy5zcGxpdCgiIik7dmFyIGs9bD9mdW5jdGlvbihtKXtyZXR1cm4gbS5zcGxpdChsKS5zb21lKGYuaXNOb3RFbXB0eVN0cmluZyl9OmYuaXNOb3RFbXB0eVN0cmluZztyZXR1cm4gZy5yZWR1Y2UoZnVuY3Rpb24obSxwKXtyZXR1cm4gayhtK3ApPwptK3A6bX0sIiIpfTtmLnRyaW1FbmQ9ZnVuY3Rpb24oZyxsKXtpZighZylyZXR1cm4gZztnPWcuc3BsaXQoIiIpO2cucmV2ZXJzZSgpO2c9Zi50cmltU3RhcnQoZy5qb2luKCIiKSxsKS5zcGxpdCgiIik7Zy5yZXZlcnNlKCk7cmV0dXJuIGcuam9pbigiIil9O3JldHVybiBmfSgpfSxmdW5jdGlvbihjLGQpe2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKCl7dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cD0vXFcvO3RoaXMuV2hpdGVzcGFjZVJlZ0V4cD0vXHMvfWYucHJvdG90eXBlLnRva2VuaXplPWZ1bmN0aW9uKGcpe3ZhciBsPXRoaXM7cmV0dXJuIGcuc3BsaXQoIiIpLnJlZHVjZShmdW5jdGlvbihrLG0pe3JldHVybiBrLnNsaWNlKDAsLTEpLmNvbmNhdChsLnNob3VsZENyZWF0ZU5ld1Rva2VuKGtbay5sZW5ndGgtMV0sbSkpfSxbIiJdKX07Zi5wcm90b3R5cGUuc2hvdWxkQ3JlYXRlTmV3VG9rZW49ZnVuY3Rpb24oZyxsKXtpZighZylyZXR1cm5bbF07dmFyIGs9Z1tnLmxlbmd0aC0xXTtyZXR1cm4gdGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QoaykmJgp0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChsKT9bZytsXTp0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChrKXx8dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QobCk/W2csbF06dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cC50ZXN0KGspfHx0aGlzLldvcmREaXZpZGVyUmVnRXhwLnRlc3QobCk/az09PWw/W2crbF06W2csbF06W2crbF19O3JldHVybiBmfSgpO2QuVG9rZW5pemVyPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxrKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgcCBpbiBrKWsuaGFzT3duUHJvcGVydHkocCkmJihsW3BdPWtbcF0pO2wucHJvdG90eXBlPW51bGw9PT1rP09iamVjdC5jcmVhdGUoayk6KG0ucHJvdG90eXBlPWsucHJvdG90eXBlLG5ldyBtKX07Yz1mdW5jdGlvbihsKXtmdW5jdGlvbiBrKCl7cmV0dXJuIGwuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfWcoayxsKTtrLnByb3RvdHlwZS53cmFwPQpmdW5jdGlvbihtLHAscSxyKXtmdW5jdGlvbiB0KEQpe3JldHVybiBsLnByb3RvdHlwZS53cmFwLmNhbGwodixtLHAsRCxyKX12YXIgdj10aGlzO3ZvaWQgMD09PXImJihyPUluZmluaXR5KTtpZigxPG0uc3BsaXQoIlxuIikubGVuZ3RoKXRocm93IEVycm9yKCJTaW5nbGVMaW5lV3JhcHBlciBpcyBkZXNpZ25lZCB0byB3b3JrIG9ubHkgb24gc2luZ2xlIGxpbmUiKTt2YXIgQT10KHEpO2lmKDI+QS5ub0xpbmVzKXJldHVybiBBO2Zvcih2YXIgeT0wLHg9MDt4PGsuTk9fV1JBUF9JVEVSQVRJT05TJiZxPnk7Kyt4KXt2YXIgQz0ocSt5KS8yLEY9dChDKTt0aGlzLmFyZVNhbWVSZXN1bHRzKEEsRik/KHE9QyxBPUYpOnk9Q31yZXR1cm4gQX07ay5wcm90b3R5cGUuYXJlU2FtZVJlc3VsdHM9ZnVuY3Rpb24obSxwKXtyZXR1cm4gbS5ub0xpbmVzPT09cC5ub0xpbmVzJiZtLnRydW5jYXRlZFRleHQ9PT1wLnRydW5jYXRlZFRleHR9O3JldHVybiBrfShmKDY1KS5XcmFwcGVyKTtjLk5PX1dSQVBfSVRFUkFUSU9OUz0KNTtkLlNpbmdsZUxpbmVXcmFwcGVyPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDIxKSxsPXt0ZXh0Um90YXRpb246MCx0ZXh0U2hlYXI6MCx4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIn07Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGsobSxwLHEpe3RoaXMuX21lYXN1cmVyPW07dGhpcy5fcGVuRmFjdG9yeT1wO3RoaXMuX3dyYXBwZXI9cX1rLnByb3RvdHlwZS5tZWFzdXJlcj1mdW5jdGlvbihtKXt0aGlzLl9tZWFzdXJlcj1tO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS53cmFwcGVyPWZ1bmN0aW9uKG0pe3RoaXMuX3dyYXBwZXI9bTtyZXR1cm4gdGhpc307ay5wcm90b3R5cGUucGVuRmFjdG9yeT1mdW5jdGlvbihtKXt0aGlzLl9wZW5GYWN0b3J5PW07cmV0dXJuIHRoaXN9O2sucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKG0scCxxLHIsdCl7dm9pZCAwPT09ciYmKHI9e30pO3I9Zy5NZXRob2RzLmRlZmF1bHRzKHt9LGwscik7aWYoLTE9PT1rLlN1cHBvcnRlZFJvdGF0aW9uLmluZGV4T2Yoci50ZXh0Um90YXRpb24pKXRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCByb3RhdGlvbiAtICIrCnIudGV4dFJvdGF0aW9uKyIuIFN1cHBvcnRlZCByb3RhdGlvbnMgYXJlICIray5TdXBwb3J0ZWRSb3RhdGlvbi5qb2luKCIsICIpKTtpZihudWxsIT1yLnRleHRTaGVhciYmLTgwPnIudGV4dFNoZWFyfHw4MDxyLnRleHRTaGVhcil0aHJvdyBFcnJvcigidW5zdXBwb3J0ZWQgc2hlYXIgYW5nbGUgLSAiK3IudGV4dFNoZWFyKyIuIE11c3QgYmUgYmV0d2VlbiAtODAgYW5kIDgwIik7dmFyIHY9NDU8TWF0aC5hYnMoTWF0aC5hYnMoci50ZXh0Um90YXRpb24pLTkwKSxBPXY/cDpxLHk9dj9xOnAseD1yLnRleHRTaGVhcixDPXgqTWF0aC5QSS8xODA7dj10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3ZhciBGPXYqTWF0aC50YW4oQyk7QT1BL01hdGguY29zKEMpLU1hdGguYWJzKEYpO3ZhciBEPXkqTWF0aC5jb3MoQyk7eT1nLlN0cmluZ01ldGhvZHMuY29tYmluZVdoaXRlc3BhY2UobSk7eT0odGhpcy5fd3JhcHBlcj90aGlzLl93cmFwcGVyLndyYXAoeSx0aGlzLl9tZWFzdXJlciwKQSxEKS53cmFwcGVkVGV4dDp5KS5zcGxpdCgiXG4iKTtDPWsuWE9mZnNldEZhY3RvcltyLnhBbGlnbl0qQSpNYXRoLnNpbihDKS1rLllPZmZzZXRGYWN0b3Jbci55QWxpZ25dKihELXkubGVuZ3RoKnYpO3g9ci50ZXh0Um90YXRpb24reDtzd2l0Y2goci50ZXh0Um90YXRpb24pe2Nhc2UgOTA6cD1bcCtDLDBdO2JyZWFrO2Nhc2UgLTkwOnA9Wy1DLHFdO2JyZWFrO2Nhc2UgMTgwOnA9W3AscStDXTticmVhaztkZWZhdWx0OnA9WzAsLUNdfW09dGhpcy5fcGVuRmFjdG9yeS5jcmVhdGVQZW4obSx7dHJhbnNsYXRlOnAscm90YXRlOnh9LHQpO3RoaXMud3JpdGVMaW5lcyh5LG0sQSx2LEYsci54QWxpZ24pO251bGwhPW0uZGVzdHJveSYmbS5kZXN0cm95KCl9O2sucHJvdG90eXBlLndyaXRlTGluZXM9ZnVuY3Rpb24obSxwLHEscix0LHYpe20uZm9yRWFjaChmdW5jdGlvbihBLHkpe3Aud3JpdGUoQSxrLkFuY2hvckNvbnZlcnRlclt2XSwoMDx0Pyh5KzEpKnQ6eSp0KStxKmsuWE9mZnNldEZhY3Rvclt2XSwKKHkrMSkqcil9KX07cmV0dXJuIGt9KCk7Yy5TdXBwb3J0ZWRSb3RhdGlvbj1bLTkwLDAsMTgwLDkwXTtjLkFuY2hvckNvbnZlcnRlcj17Y2VudGVyOiJtaWRkbGUiLGxlZnQ6InN0YXJ0IixyaWdodDoiZW5kIn07Yy5YT2Zmc2V0RmFjdG9yPXtjZW50ZXI6LjUsbGVmdDowLHJpZ2h0OjF9O2MuWU9mZnNldEZhY3Rvcj17Ym90dG9tOjEsY2VudGVyOi41LHRvcDowfTtkLldyaXRlcj1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1mKDY5KTtjPWYoNyk7ZC5BbmltYXRvcnM9YztjPWYoNjcpO2QuQXhlcz1jO2M9ZigzNyk7ZC5Db21wb25lbnRzPWM7Yz1mKDIzKTtkLkNvbmZpZ3M9YztjPWYoOCk7ZC5Gb3JtYXR0ZXJzPWM7Yz1mKDMwKTtkLlJlbmRlckNvbnRyb2xsZXI9YztjPWYoMzkpO2QuUmVuZGVyUG9saWNpZXM9YztjPWYoMzEpO2QuU3ltYm9sRmFjdG9yaWVzPWM7Yz1mKDEzKTtkLkRpc3BhdGNoZXJzPQpjO2M9ZigxNCk7ZC5EcmF3ZXJzPWM7Yz1mKDI1KTtkLkludGVyYWN0aW9ucz1jO2M9ZigxOSk7ZC5QbG90cz1jO2M9ZigzKTtkLlNjYWxlcz1jO2M9ZigwKTtkLlV0aWxzPWM7ZyhmKDIyKSk7Yz1mKDI4KTtkLlRpbWVJbnRlcnZhbD1jLlRpbWVJbnRlcnZhbDtnKGYoNCkpO2coZigyOSkpO2coZigzOCkpO2M9Zig2OCk7ZC52ZXJzaW9uPWMudmVyc2lvbjtnKGYoMjQpKTtnKGYoNikpO2coZigxNSkpO2coZig0MCkpO2coZigxNikpO2coZigyKSk7ZyhmKDExKSk7ZyhmKDE3KSl9XSl9KTsKPC9zY3JpcHQ+CjxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwbG90dGFibGUtc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi92ei1jaGFydC1oZWxwZXJzL3Bsb3R0YWJsZS1pbnRlcmFjdGlvbnMuanMKdmFyIGJtOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhwKXtjb25zdCBxPVtdO2Zvcig7cCYmcCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OylpZihxLnB1c2gocCkscC5hc3NpZ25lZFNsb3QpcD1wLmFzc2lnbmVkU2xvdDtlbHNlIGlmKHAucGFyZW50RWxlbWVudClwPXAucGFyZW50RWxlbWVudDtlbHNle2NvbnN0IHI9cC5wYXJlbnROb2RlO3A9ciBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/ci5ob3N0OnIhPT1wP3I6bnVsbH1yZXR1cm4gcX1mdW5jdGlvbiBkKHApe3ZhciBxPWMocCk7cD1mO2xldCByPW51bGw7Zm9yKGNvbnN0IHYgb2YgcSl7cT1QbG90dGFibGUuVXRpbHMuRE9NLmdldEVsZW1lbnRUcmFuc2Zvcm0odik7aWYobnVsbCE9cSl7dmFyIHQ9di5jbGllbnRXaWR0aC8yO2NvbnN0IEE9di5jbGllbnRIZWlnaHQvMjtwPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKHAsW3QsQV0pO3A9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlNYXRyaXgocCxQbG90dGFibGUuVXRpbHMuTWF0aC5pbnZlcnRNYXRyaXgocSkpOwpwPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKHAsWy10LC1BXSl9cT12LnNjcm9sbExlZnQ7dD12LnNjcm9sbFRvcDtpZihudWxsPT09cnx8dj09PXIpcS09di5vZmZzZXRMZWZ0K3YuY2xpZW50TGVmdCx0LT12Lm9mZnNldFRvcCt2LmNsaWVudFRvcCxyPXYub2Zmc2V0UGFyZW50O3A9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUocCxbcSx0XSl9cmV0dXJuIHB9Y29uc3QgZj1bMSwwLDAsMSwwLDBdO2NsYXNzIGcgZXh0ZW5kcyBQbG90dGFibGUuVXRpbHMuVHJhbnNsYXRvcntjb21wdXRlUG9zaXRpb24ocCxxKXtwPXt4OnAseTpxfTtxPWQodGhpcy5fcm9vdEVsZW1lbnQpO3JldHVybiBudWxsPT1xP3A6UGxvdHRhYmxlLlV0aWxzLk1hdGguYXBwbHlUcmFuc2Zvcm0ocSxwKX19Y2xhc3MgbCBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Nb3VzZXtjb25zdHJ1Y3RvcihwKXtzdXBlcihwKTt0aGlzLl9ldmVudFRhcmdldD1wLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTsKdGhpcy5fdHJhbnNsYXRvcj1uZXcgZyhwLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSl9c3RhdGljIGdldERpc3BhdGNoZXIocCl7Y29uc3QgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpO2xldCByPXFbbC5fRElTUEFUQ0hFUl9LRVldO3J8fChyPW5ldyBsKHApLHFbbC5fRElTUEFUQ0hFUl9LRVldPXIpO3JldHVybiByfX1jbGFzcyBrIGV4dGVuZHMgUGxvdHRhYmxlLkRpc3BhdGNoZXJzLlRvdWNoe2NvbnN0cnVjdG9yKHApe3N1cGVyKHApO3RoaXMuX2V2ZW50VGFyZ2V0PXAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpO3RoaXMuX3RyYW5zbGF0b3I9bmV3IGcocC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKHApe2NvbnN0IHE9cC5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcj1xW2suX0RJU1BBVENIRVJfS0VZXTtyfHwocj1uZXcgayhwKSxxW2suX0RJU1BBVENIRVJfS0VZXT1yKTtyZXR1cm4gcn19Y2xhc3MgbSBleHRlbmRzIFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuUG9pbnRlcntfYW5jaG9yKCl7dGhpcy5faXNBbmNob3JlZD0KITA7dGhpcy5fbW91c2VEaXNwYXRjaGVyPWwuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1rLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spfX1hLlBvaW50ZXJJbnRlcmFjdGlvbj1tfSkoYm18fChibT17fSkpOwo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L3Z6LWNoYXJ0LWhlbHBlcnMvdnotY2hhcnQtaGVscGVycy5qcwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYygpe2xldCBsPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtsLnRpY2tHZW5lcmF0b3IoKTtsZXQgaz1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhsLCJib3R0b20iKTtrLmZvcm1hdHRlcihhLnN0ZXBGb3JtYXR0ZXIpO3JldHVybntzY2FsZTpsLGF4aXM6ayxhY2Nlc3NvcjptPT5tLnN0ZXB9fWZ1bmN0aW9uIGQoKXtsZXQgbD1uZXcgUGxvdHRhYmxlLlNjYWxlcy5UaW1lO3JldHVybntzY2FsZTpsLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLlRpbWUobCwiYm90dG9tIiksYWNjZXNzb3I6az0+ay53YWxsX3RpbWV9fWZ1bmN0aW9uIGYoKXtsZXQgbD1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOmwsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhsLCJib3R0b20iKSxhY2Nlc3NvcjphLnJlbGF0aXZlQWNjZXNzb3J9fWEuU1lNQk9MU19MSVNUPVt7Y2hhcmFjdGVyOiJcdTI1ZmMiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnNxdWFyZX0sCntjaGFyYWN0ZXI6Ilx1MjVjNiIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuZGlhbW9uZH0se2NoYXJhY3RlcjoiXHUyNWIyIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZX0se2NoYXJhY3RlcjoiXHUyNjA1IixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5zdGFyfSx7Y2hhcmFjdGVyOiJcdTI3MWEiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLmNyb3NzfV07bGV0IGc7KGZ1bmN0aW9uKGwpe2wuU1RFUD0ic3RlcCI7bC5SRUxBVElWRT0icmVsYXRpdmUiO2wuV0FMTF9USU1FPSJ3YWxsX3RpbWUifSkoZz1hLlhUeXBlfHwoYS5YVHlwZT17fSkpO2EuWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT049NDthLlNURVBfRk9STUFUVEVSX1BSRUNJU0lPTj00O2EuWV9BWElTX0ZPUk1BVFRFUl9QUkVDSVNJT049MzthLlRPT0xUSVBfWV9QSVhFTF9PRkZTRVQ9MjA7YS5UT09MVElQX0NJUkNMRV9TSVpFPTQ7YS5OQU5fU1lNQk9MX1NJWkU9CjY7YS5tdWx0aXNjYWxlRm9ybWF0dGVyPWZ1bmN0aW9uKGwpe3JldHVybiBrPT57bGV0IG09TWF0aC5hYnMoayk7MUUtMTU+bSYmKG09MCk7cmV0dXJuKDFFNDw9bT9kMy5mb3JtYXQoIi4iK2wrIn5lIik6MDxtJiYuMDE+bT9kMy5mb3JtYXQoIi4iK2wrIn5lIik6ZDMuZm9ybWF0KCIuIitsKyJ+ZyIpKShrKX19O2EuY29tcHV0ZURvbWFpbj1mdW5jdGlvbihsLGspe2w9bC5maWx0ZXIocT0+aXNGaW5pdGUocSkpO2lmKDA9PT1sLmxlbmd0aClyZXR1cm5bLS4xLDEuMV07az8obD1fLnNvcnRCeShsKSxrPWQzLnF1YW50aWxlKGwsLjA1KSxsPWQzLnF1YW50aWxlKGwsLjk1KSk6KGs9ZDMubWluKGwpLGw9ZDMubWF4KGwpKTtsZXQgbSxwPWwtazttPTA9PT1wPzEuMSpNYXRoLmFicyhrKSsxLjE6LjIqcDtrPVswPD1rJiZrPHA/LS4xKmw6ay1tLGwrbV07cmV0dXJuIGs9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oaykubmljZSgpLmRvbWFpbigpfTthLmFjY2Vzc29yaXplPWZ1bmN0aW9uKGwpe3JldHVybiBrPT4Ka1tsXX07YS5zdGVwRm9ybWF0dGVyPWQzLmZvcm1hdChgLiR7YS5TVEVQX0ZPUk1BVFRFUl9QUkVDSVNJT059fnNgKTthLnN0ZXBYPWM7YS50aW1lRm9ybWF0dGVyPVBsb3R0YWJsZS5Gb3JtYXR0ZXJzLnRpbWUoIiVhICViICVlLCAlSDolTTolUyIpO2Eud2FsbFg9ZDthLnJlbGF0aXZlQWNjZXNzb3I9KGwsayxtKT0+e2lmKG51bGwhPWwucmVsYXRpdmUpcmV0dXJuIGwucmVsYXRpdmU7az1tLmRhdGEoKTtyZXR1cm4oK2wud2FsbF90aW1lLSgwPGsubGVuZ3RoPytrWzBdLndhbGxfdGltZTowKSkvMzZFNX07YS5yZWxhdGl2ZUZvcm1hdHRlcj1sPT57bGV0IGs9IiIsbT1NYXRoLmZsb29yKGwvMjQpO2wtPTI0Km07bSYmKGsrPW0rImQgIik7bGV0IHA9TWF0aC5mbG9vcihsKTtsPTYwKihsLXApO2lmKHB8fG0pays9cCsiaCAiO2xldCBxPU1hdGguZmxvb3IobCk7bD02MCoobC1xKTtpZihxfHxwfHxtKWsrPXErIm0gIjtyZXR1cm4gaytNYXRoLmZsb29yKGwpKyJzIn07YS5yZWxhdGl2ZVg9CmY7YS5nZXRYQ29tcG9uZW50cz1mdW5jdGlvbihsKXtzd2l0Y2gobCl7Y2FzZSBnLlNURVA6cmV0dXJuIGMoKTtjYXNlIGcuV0FMTF9USU1FOnJldHVybiBkKCk7Y2FzZSBnLlJFTEFUSVZFOnJldHVybiBmKCk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW52YWxpZCB4VHlwZTogIitsKTt9fX0pKGJtfHwoYm09e30pKTsKPC9zY3JpcHQ+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZ6LWNoYXJ0LXRvb2x0aXAiPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi92ei1jaGFydC1oZWxwZXJzL3Z6LWNoYXJ0LXRvb2x0aXAuanMKdmFyIGNtOwooZnVuY3Rpb24oYSl7bGV0IGM7KGZ1bmN0aW9uKGYpe2YuQVVUTz0iYXV0byI7Zi5CT1RUT009ImJvdHRvbSI7Zi5SSUdIVD0icmlnaHQifSkoYz1hLlRvb2x0aXBQb3NpdGlvbnx8KGEuVG9vbHRpcFBvc2l0aW9uPXt9KSk7Y29uc3QgZD17Ym94U2hhZG93OiIwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAuMykiLG9wYWNpdHk6MCxwb3NpdGlvbjoiZml4ZWQiLHdpbGxDaGFuZ2U6InRyYW5zZm9ybSIsekluZGV4OjV9O1BvbHltZXIoe2lzOiJ2ei1jaGFydC10b29sdGlwIixwcm9wZXJ0aWVzOntjb250ZW50Q29tcG9uZW50TmFtZTpTdHJpbmcscG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOmMuQVVUT30sbWluRGlzdEZyb21FZGdlOnt0eXBlOk51bWJlcix2YWx1ZToxNX19LHJlYWR5KCl7dGhpcy5fdHVubmVsPXRoaXMuX3JhZj10aGlzLl9zdHlsZUNhY2hlPW51bGx9LGF0dGFjaGVkKCl7dGhpcy5fdHVubmVsPXRoaXMuX2NyZWF0ZVR1bm5lbCgpO3RoaXMuX2hpZGVPbkJsdXI9KCk9Pgp7ZG9jdW1lbnQuaGlkZGVuJiZ0aGlzLmhpZGUoKX07d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfSxkZXRhY2hlZCgpe3RoaXMuaGlkZSgpO3RoaXMuX3JlbW92ZVR1bm5lbCh0aGlzLl90dW5uZWwpO3RoaXMuX3R1bm5lbD1udWxsO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9oaWRlT25CbHVyKX0sY29udGVudCgpe3JldHVybiB0aGlzLl90dW5uZWwuc2hhZG93Um9vdH0saGlkZSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpO3RoaXMuX3N0eWxlQ2FjaGU9bnVsbDt0aGlzLl90dW5uZWwuc3R5bGUub3BhY2l0eT0wfSx1cGRhdGVBbmRQb3NpdGlvbihmKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmKTt0aGlzLl9yYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fcmVwb3NpdGlvbkltcGwoZil9KX0sCl9yZXBvc2l0aW9uSW1wbChmKXtjb25zdCBnPXRoaXMuX3R1bm5lbDtmPWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Y29uc3QgbD1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGs9d2luZG93LmlubmVySGVpZ2h0LG09ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCxwPWYudG9wLHE9cCtmLmhlaWdodCxyPWwuaGVpZ2h0K2JtLlRPT0xUSVBfWV9QSVhFTF9PRkZTRVQ7bGV0IHQ9bnVsbCx2PU1hdGgubWF4KHRoaXMubWluRGlzdEZyb21FZGdlLGYubGVmdCksQT1udWxsLHk9cDt0aGlzLnBvc2l0aW9uPT1jLlJJR0hUP3Y9Zi5yaWdodDooeT1xK2JtLlRPT0xUSVBfWV9QSVhFTF9PRkZTRVQsbTx2K2wud2lkdGgrdGhpcy5taW5EaXN0RnJvbUVkZ2UmJih2PW51bGwsQT10aGlzLm1pbkRpc3RGcm9tRWRnZSkpO3RoaXMucG9zaXRpb249PWMuQVVUTyYmMDxmLnRvcC1yJiZrPGYudG9wK2YuaGVpZ2h0K3ImJih5PW51bGwsdD1rLXArYm0uVE9PTFRJUF9ZX1BJWEVMX09GRlNFVCk7Zj17b3BhY2l0eToxLApsZWZ0OnY/YCR7dn1weGA6bnVsbCxyaWdodDpBP2Ake0F9cHhgOm51bGwsdG9wOnk/YCR7eX1weGA6bnVsbCxib3R0b206dD9gJHt0fXB4YDpudWxsfTtfLmlzRXF1YWwodGhpcy5fc3R5bGVDYWNoZSxmKXx8KE9iamVjdC5hc3NpZ24oZy5zdHlsZSxmKSx0aGlzLl9zdHlsZUNhY2hlPWYpfSxfY3JlYXRlVHVubmVsKCl7aWYoIXRoaXMuY29udGVudENvbXBvbmVudE5hbWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJlcXVpcmUgYGNvbnRlbnRDb21wb25lbnROYW1lYCB0byBiZSBhIG5hbWUgb2YgYSBQb2x5bWVyIGNvbXBvbmVudCIpO2NvbnN0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLmNvbnRlbnRDb21wb25lbnROYW1lKTtPYmplY3QuYXNzaWduKGYuc3R5bGUsZCk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtyZXR1cm4gZn0sX3JlbW92ZVR1bm5lbChmKXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfX0pfSkoY218fChjbT17fSkpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdnotbGluZS1jaGFydC9kcmFnWm9vbUludGVyYWN0aW9uLmpzCnZhciBkbTsKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBQbG90dGFibGUuQ29tcG9uZW50cy5TZWxlY3Rpb25Cb3hMYXllcntjb25zdHJ1Y3RvcihkLGYsZyl7c3VwZXIoKTt0aGlzLmVhc2VGbj1kMy5lYXNlQ3ViaWNJbk91dDt0aGlzLl9hbmltYXRpb25UaW1lPTc1MDt0aGlzLnhTY2FsZShkKTt0aGlzLnlTY2FsZShmKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuRHJhZzt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uPW5ldyBQbG90dGFibGUuSW50ZXJhY3Rpb25zLkNsaWNrO3RoaXMuc2V0dXBDYWxsYmFja3MoKTt0aGlzLnVuem9vbU1ldGhvZD1nO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpfSk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpfSl9aW50ZXJhY3Rpb25TdGFydChkKXt0aGlzLm9uU3RhcnQ9CmR9aW50ZXJhY3Rpb25FbmQoZCl7dGhpcy5vbkVuZD1kfWRyYWdJbnRlcmFjdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259c2V0dXBDYWxsYmFja3MoKXtsZXQgZD0hMTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoZj0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmYsYm90dG9tUmlnaHQ6Zn0pO3RoaXMub25TdGFydCgpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZygoZixnKT0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmYsYm90dG9tUmlnaHQ6Z30pO3RoaXMuYm94VmlzaWJsZSghMCk7ZD0hMH0pO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdFbmQoKGYsZyk9Pnt0aGlzLmJveFZpc2libGUoITEpO3RoaXMuYm91bmRzKHt0b3BMZWZ0OmYsYm90dG9tUmlnaHQ6Z30pO2lmKGQpdGhpcy56b29tKCk7ZWxzZSB0aGlzLm9uRW5kKCk7ZD0hMX0pO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24ub25Eb3VibGVDbGljayh0aGlzLnVuem9vbS5iaW5kKHRoaXMpKX1hbmltYXRpb25UaW1lKGQpe2lmKG51bGw9PQpkKXJldHVybiB0aGlzLl9hbmltYXRpb25UaW1lO2lmKDA+ZCl0aHJvdyBFcnJvcigiYW5pbWF0aW9uVGltZSBjYW5ub3QgYmUgbmVnYXRpdmUiKTt0aGlzLl9hbmltYXRpb25UaW1lPWQ7cmV0dXJuIHRoaXN9ZWFzZShkKXtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGQpdGhyb3cgRXJyb3IoImVhc2UgZnVuY3Rpb24gbXVzdCBiZSBhIGZ1bmN0aW9uIik7MD09PWQoMCkmJjE9PT1kKDEpfHxQbG90dGFibGUuVXRpbHMuV2luZG93Lndhcm4oIkVhc2luZyBmdW5jdGlvbiBkb2VzIG5vdCBtYWludGFpbiBpbnZhcmlhbnQgZigwKVx4M2RceDNkMCBceDI2XHgyNiBmKDEpXHgzZFx4M2QxLiBCYWQgYmVoYXZpb3IgbWF5IHJlc3VsdC4iKTt0aGlzLmVhc2VGbj1kO3JldHVybiB0aGlzfXpvb20oKXtsZXQgZD10aGlzLnhFeHRlbnQoKVswXS52YWx1ZU9mKCksZj10aGlzLnhFeHRlbnQoKVsxXS52YWx1ZU9mKCksZz10aGlzLnlFeHRlbnQoKVsxXS52YWx1ZU9mKCksbD10aGlzLnlFeHRlbnQoKVswXS52YWx1ZU9mKCk7CmQhPT1mJiZnIT09bCYmdGhpcy5pbnRlcnBvbGF0ZVpvb20oZCxmLGcsbCl9dW56b29tKCl7dmFyIGQ9dGhpcy54U2NhbGUoKTtkLl9kb21haW5NaW49bnVsbDtkLl9kb21haW5NYXg9bnVsbDtkPWQuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlKCkuZG9tYWluKGQpO3RoaXMudW56b29tTWV0aG9kKCl9aXNab29taW5nKGQpe3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCFkKTt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmVuYWJsZWQoIWQpfWludGVycG9sYXRlWm9vbShkLGYsZyxsKXtsZXQgaz10aGlzLnhTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxtPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLHA9dGhpcy55U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCkscT10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKSxyPXRoaXMuZWFzZUZuLHQ9KHkseCxDKT0+ZDMuaW50ZXJwb2xhdGVOdW1iZXIoeSx4KShyKEMpKTt0aGlzLmlzWm9vbWluZyghMCk7CmxldCB2PURhdGUubm93KCksQT0oKT0+e3ZhciB5PURhdGUubm93KCktdjt5PTA9PT10aGlzLl9hbmltYXRpb25UaW1lPzE6TWF0aC5taW4oMSx5L3RoaXMuX2FuaW1hdGlvblRpbWUpO2xldCB4PXQoayxkLHkpLEM9dChtLGYseSksRj10KHAsZyx5KSxEPXQocSxsLHkpO3RoaXMueFNjYWxlKCkuZG9tYWluKFt4LENdKTt0aGlzLnlTY2FsZSgpLmRvbWFpbihbRixEXSk7MT55P1Bsb3R0YWJsZS5VdGlscy5ET00ucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoQSk6KHRoaXMub25FbmQoKSx0aGlzLmlzWm9vbWluZyghMSkpfTtBKCl9fWEuRHJhZ1pvb21MYXllcj1jfSkoZG18fChkbT17fSkpOwo8L3NjcmlwdD4KCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdnotbGluZS1jaGFydDIvcGFuWm9vbURyYWdMYXllci5qcwp2YXIgZW07CihmdW5jdGlvbihhKXtsZXQgYzsoZnVuY3Rpb24oZil7ZltmLk5PTkU9MF09Ik5PTkUiO2ZbZi5EUkFHX1pPT01JTkc9MV09IkRSQUdfWk9PTUlORyI7ZltmLlBBTk5JTkc9Ml09IlBBTk5JTkcifSkoY3x8KGM9e30pKTtjbGFzcyBkIGV4dGVuZHMgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXB7Y29uc3RydWN0b3IoZixnLGwpe3N1cGVyKCk7dGhpcy5zdGF0ZT1jLk5PTkU7dGhpcy5wYW5TdGFydENhbGxiYWNrPW5ldyBQbG90dGFibGUuVXRpbHMuQ2FsbGJhY2tTZXQ7dGhpcy5wYW5FbmRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuWm9vbT1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5QYW5ab29tKGYsZyk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKG09PmQuaXNQYW5LZXkobSkmJjA9PT1tLmJ1dHRvbik7dGhpcy5wYW5ab29tLndoZWVsRmlsdGVyKHRoaXMuY2FuU2Nyb2xsWm9vbSk7dGhpcy5kcmFnWm9vbUxheWVyPW5ldyBkbS5EcmFnWm9vbUxheWVyKGYsCmcsbCk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKG09PiFkLmlzUGFuS2V5KG0pJiYwPT09bS5idXR0b24pO3RoaXMuYXBwZW5kKHRoaXMuZHJhZ1pvb21MYXllcik7Y29uc3Qgaz10aGlzLm9uV2hlZWwuYmluZCh0aGlzKTt0aGlzLm9uQW5jaG9yKCgpPT57dGhpcy5fbW91c2VEaXNwYXRjaGVyPVBsb3R0YWJsZS5EaXNwYXRjaGVycy5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKGspO3RoaXMucGFuWm9vbS5hdHRhY2hUbyh0aGlzKX0pO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLnBhblpvb20uZGV0YWNoRnJvbSgpO3RoaXMuX21vdXNlRGlzcGF0Y2hlciYmKHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbChrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbCl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1jLk5PTkUmJgp0aGlzLnNldFN0YXRlKGMuUEFOTklORyl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnRW5kKCgpPT57dGhpcy5zdGF0ZT09Yy5QQU5OSU5HJiZ0aGlzLnNldFN0YXRlKGMuTk9ORSl9KTt0aGlzLmRyYWdab29tTGF5ZXIuZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1jLk5PTkUmJnRoaXMuc2V0U3RhdGUoYy5EUkFHX1pPT01JTkcpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWMuRFJBR19aT09NSU5HJiZ0aGlzLnNldFN0YXRlKGMuTk9ORSl9KX1vbldoZWVsKGYsZyl7aWYoIXRoaXMuY2FuU2Nyb2xsWm9vbShnKSYmKGY9dGhpcy5lbGVtZW50KCksZi5zZWxlY3QoIi5oZWxwIikuZW1wdHkoKSkpe3ZhciBsPWYuYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJoZWxwIiwhMCk7bC5hcHBlbmQoInNwYW4iKS50ZXh0KCJBbHQgKyBTY3JvbGwgdG8gWm9vbSIpOwpsLm9uKCJhbmltYXRpb25lbmQiLCgpPT52b2lkIGwucmVtb3ZlKCkpfX1zdGF0aWMgaXNQYW5LZXkoZil7cmV0dXJuISFmLmFsdEtleXx8ISFmLnNoaWZ0S2V5fWNhblNjcm9sbFpvb20oZil7cmV0dXJuIGYuYWx0S2V5fXNldFN0YXRlKGYpe2lmKHRoaXMuc3RhdGUhPWYpe3ZhciBnPXRoaXMuc3RhdGU7dGhpcy5zdGF0ZT1mO3RoaXMucm9vdCgpLnJlbW92ZUNsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoZykpO3RoaXMucm9vdCgpLmFkZENsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoZikpO2c9PWMuUEFOTklORyYmdGhpcy5wYW5FbmRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCk7Zj09Yy5QQU5OSU5HJiZ0aGlzLnBhblN0YXJ0Q2FsbGJhY2suY2FsbENhbGxiYWNrcygpfX1zdGF0ZUNsYXNzTmFtZShmKXtzd2l0Y2goZil7Y2FzZSBjLlBBTk5JTkc6cmV0dXJuInBhbm5pbmciO2Nhc2UgYy5EUkFHX1pPT01JTkc6cmV0dXJuImRyYWctem9vbWluZyI7ZGVmYXVsdDpyZXR1cm4iIn19b25QYW5TdGFydChmKXt0aGlzLnBhblN0YXJ0Q2FsbGJhY2suYWRkKGYpfW9uUGFuRW5kKGYpe3RoaXMucGFuRW5kQ2FsbGJhY2suYWRkKGYpfW9uU2Nyb2xsWm9vbShmKXt0aGlzLnBhblpvb20ub25ab29tRW5kKGYpfW9uRHJhZ1pvb21TdGFydChmKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25TdGFydChmKX1vbkRyYWdab29tRW5kKGYpe3RoaXMuZHJhZ1pvb21MYXllci5pbnRlcmFjdGlvbkVuZChmKX19CmEuUGFuWm9vbURyYWdMYXllcj1kfSkoZW18fChlbT17fSkpOwo8L3NjcmlwdD4KCjxkb20tbW9kdWxlIGlkPSJ2ei1wYW4tem9vbS1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuaGVscCB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IDFzOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMXM7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZhZGUtb3V0OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzAsIDMwLCAzMCwgMC42KTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CgogICAgICAuaGVscCA+IHNwYW4gewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgZmFkZS1vdXQgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQoKICAgICAgICAxMDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZ6LWxpbmUtY2hhcnQyIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8dnotY2hhcnQtdG9vbHRpcCBpZD0idG9vbHRpcCIgcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iIGNvbnRlbnQtY29tcG9uZW50LW5hbWU9InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCI+PC92ei1jaGFydC10b29sdGlwPgogICAgPHN0eWxlIGluY2x1ZGU9InBsb3R0YWJsZS1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2ei1wYW4tem9vbS1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgICAgZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CgogICAgICAjY2hhcnRkaXYgLm1haW4gewogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICA6aG9zdCgucGFua2V5KSAjY2hhcnRkaXYgOm5vdCguZHJhZy16b29taW5nKSAubWFpbiB7CiAgICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgICAgICAgY3Vyc29yOiBncmFiOwogICAgICB9CgogICAgICA6aG9zdCgubW91c2Vkb3duKSAjY2hhcnRkaXYgLnBhbm5pbmcgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsKICAgICAgICBjdXJzb3I6IGdyYWJiaW5nOwogICAgICB9CgogICAgICAjY2hhcnRkaXYgbGluZS5ndWlkZS1saW5lIHsKICAgICAgICBzdHJva2U6ICM5OTk7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxLjVweDsKICAgICAgfQogICAgICAjY2hhcnRkaXY6aG92ZXIgewogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgIC5naG9zdCB7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3Z6LWxpbmUtY2hhcnQyL3RmLXNjYWxlLmpzCihmdW5jdGlvbihhKXtjbGFzcyBjIGV4dGVuZHMgUGxvdHRhYmxlLlF1YW50aXRhdGl2ZVNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt0aGlzLl9pZ25vcmVPdXRsaWVyPSExfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oZCl7dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj1kfWlnbm9yZU91dGxpZXIoZCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZD8odGhpcy5faWdub3JlT3V0bGllcj1kLHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9X2dldEFsbEluY2x1ZGVkVmFsdWVzKCl7Y29uc3QgZD10aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluP3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4oKTpbXTtyZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyhkKX19YS5UZlNjYWxlPWN9KShlbXx8KGVtPXt9KSk7Cjwvc2NyaXB0PgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi92ei1saW5lLWNoYXJ0Mi9saW5lYXItc2NhbGUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5faWdub3JlT3V0bGllcj0hMTt0aGlzLnBhZFByb3BvcnRpb24oLjIpfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oZCl7dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj1kfV9uaWNlRG9tYWluKGQsZil7Y29uc3QgW2csbF09ZCxrPWwtZztkPTA9PT1rPzEuMSpNYXRoLmFicyhnKSsxLjE6ayp0aGlzLnBhZFByb3BvcnRpb24oKTtyZXR1cm4gc3VwZXIuX25pY2VEb21haW4oWzA8PWcmJmc8az8tLjEqbDpnLWQsbCtkXSxmKX1fZ2V0VW5ib3VuZGVkRXh0ZW50KGQpe2Q9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoZCk7bGV0IGY9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1kLmxlbmd0aCYmKGQ9W1Bsb3R0YWJsZS5VdGlscy5NYXRoLm1pbihkLGZbMF0pLFBsb3R0YWJsZS5VdGlscy5NYXRoLm1heChkLGZbMV0pXSxmPXRoaXMuX25pY2VEb21haW4oZCkpOwpyZXR1cm4gZn1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtjb25zdCBkPXRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4/dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbigpOltdO3JldHVybiB0aGlzLmV4dGVudE9mVmFsdWVzKGQpfWV4dGVudE9mVmFsdWVzKGQpe3ZhciBmPWQ9ZC5maWx0ZXIoZz0+UGxvdHRhYmxlLlV0aWxzLk1hdGguaXNWYWxpZE51bWJlcihnKSk7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2Y9ZC5zb3J0KChrLG0pPT5rLW0pO2NvbnN0IGc9ZDMucXVhbnRpbGUoZiwuMDUpLGw9ZDMucXVhbnRpbGUoZiwuOTUpO2Y9ZC5maWx0ZXIoaz0+az49ZyYmazw9bCl9ZD1kMy5leHRlbnQoZik7cmV0dXJuIG51bGw9PWRbMF18fG51bGw9PWRbMV0/W106ZH1pZ25vcmVPdXRsaWVyKGQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGQ/KHRoaXMuX2lnbm9yZU91dGxpZXI9ZCx0aGlzKTp0aGlzLl9pZ25vcmVPdXRsaWVyfX1hLkxpbmVhclNjYWxlPWN9KShlbXx8KGVtPXt9KSk7Cjwvc2NyaXB0PgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi92ei1saW5lLWNoYXJ0Mi9sb2ctc2NhbGUuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZyl7cmV0dXJuIE1hdGgubG9nMTAoZyl9ZnVuY3Rpb24gZChnKXtyZXR1cm4gTWF0aC5wb3coMTAsZyl9YS5NSU5fUE9TSVRJVkVfVkFMVUU9TWF0aC5wb3coMiwtMTA3NCk7Y2xhc3MgZiBleHRlbmRzIGEuVGZTY2FsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fZDNMb2dTY2FsZT1kMy5zY2FsZUxvZygpO3RoaXMucGFkUHJvcG9ydGlvbiguMil9c2NhbGUoZyl7cmV0dXJuIDA+PWc/TmFOOnRoaXMuX2QzTG9nU2NhbGUoZyl9aW52ZXJ0KGcpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmludmVydChnKX1zY2FsZVRyYW5zZm9ybWF0aW9uKGcpe3JldHVybiB0aGlzLnNjYWxlKGcpfWludmVydGVkVHJhbnNmb3JtYXRpb24oZyl7cmV0dXJuIHRoaXMuaW52ZXJ0KGcpfWdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9X2dldERvbWFpbigpe3JldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWlufV9zZXREb21haW4oZyl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj0KZztjb25zdCBbbCxrXT1nO3N1cGVyLl9zZXREb21haW4oW01hdGgubWF4KGEuTUlOX1BPU0lUSVZFX1ZBTFVFLGwpLGtdKX1fbmljZURvbWFpbihnKXtjb25zdCBbbCxrXT1nO2c9TWF0aC5tYXgoYyhhLk1JTl9QT1NJVElWRV9WQUxVRSksYyhsKSk7Y29uc3QgbT1jKGspO3ZhciBwPW0tZztwPXA/cCp0aGlzLnBhZFByb3BvcnRpb24oKToxO3JldHVybltkKE1hdGgubWF4KGMoYS5NSU5fUE9TSVRJVkVfVkFMVUUpLGctcCkpLGQobStwKV19X2dldFVuYm91bmRlZEV4dGVudChnKXtnPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGcpO2xldCBsPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09Zy5sZW5ndGgmJihnPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oZyxsWzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoZyxsWzFdKV0sbD10aGlzLl9uaWNlRG9tYWluKGcpKTtyZXR1cm4gbH1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtyZXR1cm4gc3VwZXIuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkubWFwKGc9PgowPGc/ZzphLk1JTl9QT1NJVElWRV9WQUxVRSl9X2RlZmF1bHRFeHRlbnQoKXtyZXR1cm5bMSwxMF19X2JhY2tpbmdTY2FsZURvbWFpbihnKXtpZihudWxsPT1nKXJldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzTG9nU2NhbGUuZG9tYWluKGcpO3JldHVybiB0aGlzfV9nZXRSYW5nZSgpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnJhbmdlKCl9X3NldFJhbmdlKGcpe3RoaXMuX2QzTG9nU2NhbGUucmFuZ2UoZyl9ZGVmYXVsdFRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX10aWNrcygpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnRpY2tzKCl9ZXh0ZW50T2ZWYWx1ZXMoZyl7bGV0IGw9Zz1nLmZpbHRlcihrPT5QbG90dGFibGUuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKGspJiYwPGspO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtnPWcubWFwKGMpLnNvcnQoKHAscSk9PnAtcSk7Y29uc3Qgaz1kMy5xdWFudGlsZShnLC4wNSksbT1kMy5xdWFudGlsZShnLAouOTUpO2w9Zy5maWx0ZXIocD0+cD49ayYmcDw9bSkubWFwKGQpfWc9ZDMuZXh0ZW50KGwpO3JldHVybiBudWxsPT1nWzBdfHxudWxsPT1nWzFdP1tdOmd9fWEuTG9nU2NhbGU9Zn0pKGVtfHwoZW09e30pKTsKPC9zY3JpcHQ+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQuanMKKGZ1bmN0aW9uKGEpe2xldCBjOyhmdW5jdGlvbihnKXtnW2cuVEVYVD0wXT0iVEVYVCI7Z1tnLkRPTT0xXT0iRE9NIn0pKGN8fChjPXt9KSk7bGV0IGQ7KGZ1bmN0aW9uKGcpe2cuTE9HPSJsb2ciO2cuTElORUFSPSJsaW5lYXIifSkoZHx8KGQ9e30pKTtjbGFzcyBme2NvbnN0cnVjdG9yKGcsbCxrLG0scCxxLHIsdCx2LEEseSl7dGhpcy5zZXJpZXNOYW1lcz1bXTt0aGlzLm5hbWUyZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPW07dGhpcy50b29sdGlwPXA7dGhpcy5kYXRhc2V0cz1bXTt0aGlzLl9pZ25vcmVZT3V0bGllcnM9ITE7dGhpcy5sYXN0UG9pbnRzRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy5uYW5EYXRhc2V0PW5ldyBQbG90dGFibGUuRGF0YXNldDt0aGlzLnlWYWx1ZUFjY2Vzc29yPWw7dGhpcy5zeW1ib2xGdW5jdGlvbj1BO3RoaXMub25EYXRhc2V0Q2hhbmdlZD10aGlzLl9vbkRhdGFzZXRDaGFuZ2VkLmJpbmQodGhpcyk7dGhpcy5fZGVmYXVsdFhSYW5nZT0KdDt0aGlzLl9kZWZhdWx0WVJhbmdlPXY7dGhpcy50b29sdGlwQ29sdW1ucz1xO3RoaXMuYnVpbGRDaGFydChnLGwsayxyLHkpfWJ1aWxkQ2hhcnQoZyxsLGssbSxwKXt0aGlzLmRlc3Ryb3koKTtnPWcoKTt0aGlzLnhBY2Nlc3Nvcj1nLmFjY2Vzc29yO3RoaXMueFNjYWxlPWcuc2NhbGU7dGhpcy54QXhpcz1nLmF4aXM7dGhpcy54QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZygzKTtwJiZ0aGlzLnhBeGlzLmZvcm1hdHRlcihwKTt0aGlzLnlTY2FsZT1mLmdldFlTY2FsZUZyb21UeXBlKGspO3RoaXMueVNjYWxlLnNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oKCk9PnRoaXMuZ2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCkpO3RoaXMueUF4aXM9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtwPWJtLm11bHRpc2NhbGVGb3JtYXR0ZXIoYm0uWV9BWElTX0ZPUk1BVFRFUl9QUkVDSVNJT04pO3RoaXMueUF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoNSkuZm9ybWF0dGVyKHApOwp0aGlzLnlBeGlzLnVzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uKCk7dGhpcy5maWxsQXJlYT1tO3A9bmV3IGEuUGFuWm9vbURyYWdMYXllcih0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSwoKT0+dGhpcy5yZXNldERvbWFpbigpKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbj10aGlzLmNyZWF0ZVRvb2x0aXBJbnRlcmFjdGlvbihwKTt0aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQ9bmV3IFBsb3R0YWJsZS5Db21wb25lbnQ7bT10aGlzLmJ1aWxkUGxvdCh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSxtKTt0aGlzLmdyaWRsaW5lcz1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JpZGxpbmVzKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTtnPW51bGw7ayE9PWQuTE9HJiYoZz1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3VpZGVMaW5lTGF5ZXIoImhvcml6b250YWwiKSxnLnNjYWxlKHRoaXMueVNjYWxlKS52YWx1ZSgwKSk7az1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3VpZGVMaW5lTGF5ZXIoInZlcnRpY2FsIik7Cmsuc2NhbGUodGhpcy54U2NhbGUpLnZhbHVlKDApO3RoaXMuY2VudGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsZyxrLG0sdGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LHBdKTt0aGlzLmNlbnRlci5hZGRDbGFzcygibWFpbiIpO3RoaXMub3V0ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbdGhpcy55QXhpcyx0aGlzLmNlbnRlcl0sW251bGwsdGhpcy54QXhpc11dKX1idWlsZFBsb3QoZyxsLGspe2smJih0aGlzLm1hcmdpbkFyZWFQbG90PW5ldyBQbG90dGFibGUuUGxvdHMuQXJlYSx0aGlzLm1hcmdpbkFyZWFQbG90LngodGhpcy54QWNjZXNzb3IsZyksdGhpcy5tYXJnaW5BcmVhUGxvdC55KGsuaGlnaGVyQWNjZXNzb3IsbCksdGhpcy5tYXJnaW5BcmVhUGxvdC55MChrLmxvd2VyQWNjZXNzb3IpLHRoaXMubWFyZ2luQXJlYVBsb3QuYXR0cigiZmlsbCIsKHIsdCx2KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHYubWV0YWRhdGEoKS5uYW1lKSksCnRoaXMubWFyZ2luQXJlYVBsb3QuYXR0cigiZmlsbC1vcGFjaXR5IiwuMyksdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJzdHJva2Utd2lkdGgiLDApKTt0aGlzLnNtb290aGVkQWNjZXNzb3I9cj0+ci5zbW9vdGhlZDtrPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtrLngodGhpcy54QWNjZXNzb3IsZyk7ay55KHRoaXMueVZhbHVlQWNjZXNzb3IsbCk7ay5hdHRyKCJzdHJva2UiLChyLHQsdik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh2Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMubGluZVBsb3Q9azt0aGlzLnNldHVwVG9vbHRpcHMoayk7bGV0IG09bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO20ueCh0aGlzLnhBY2Nlc3NvcixnKTttLnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLGwpO20uYXR0cigic3Ryb2tlIiwocix0LHYpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodi5tZXRhZGF0YSgpLm5hbWUpKTt0aGlzLnNtb290aExpbmVQbG90PW07aWYodGhpcy5zeW1ib2xGdW5jdGlvbil7dmFyIHA9Cm5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjtwLngodGhpcy54QWNjZXNzb3IsZyk7cC55KHRoaXMueVZhbHVlQWNjZXNzb3IsbCk7cC5hdHRyKCJmaWxsIiwocix0LHYpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodi5tZXRhZGF0YSgpLm5hbWUpKTtwLmF0dHIoIm9wYWNpdHkiLDEpO3Auc2l6ZSgyKmJtLlRPT0xUSVBfQ0lSQ0xFX1NJWkUpO3Auc3ltYm9sKChyLHQsdik9PnRoaXMuc3ltYm9sRnVuY3Rpb24odi5tZXRhZGF0YSgpLm5hbWUpKTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdD1wfXA9bmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO3AueCh0aGlzLnhBY2Nlc3NvcixnKTtwLnkodGhpcy55VmFsdWVBY2Nlc3NvcixsKTtwLmF0dHIoImZpbGwiLHI9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShyLm5hbWUpKTtwLmF0dHIoIm9wYWNpdHkiLDEpO3Auc2l6ZSgyKmJtLlRPT0xUSVBfQ0lSQ0xFX1NJWkUpO3AuZGF0YXNldHMoW3RoaXMubGFzdFBvaW50c0RhdGFzZXRdKTt0aGlzLnNjYXR0ZXJQbG90PQpwO2xldCBxPW5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjtxLngodGhpcy54QWNjZXNzb3IsZyk7cS55KHI9PnIuZGlzcGxheVksbCk7cS5hdHRyKCJmaWxsIixyPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoci5uYW1lKSk7cS5hdHRyKCJvcGFjaXR5IiwxKTtxLnNpemUoMipibS5OQU5fU1lNQk9MX1NJWkUpO3EuZGF0YXNldHMoW3RoaXMubmFuRGF0YXNldF0pO3Euc3ltYm9sKFBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMudHJpYW5nbGUpO3RoaXMubmFuRGlzcGxheT1xO2c9W3EscCxtLGtdO3RoaXMubWFyZ2luQXJlYVBsb3QmJmcucHVzaCh0aGlzLm1hcmdpbkFyZWFQbG90KTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmZy5wdXNoKHRoaXMubWFya2Vyc1NjYXR0ZXJQbG90KTtyZXR1cm4gbmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKGcpfV9vbkRhdGFzZXRDaGFuZ2VkKGcpe3RoaXMuc21vb3RoaW5nRW5hYmxlZCYmdGhpcy5yZXNtb290aERhdGFzZXQoZyk7dGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKX1pZ25vcmVZT3V0bGllcnMoZyl7ZyE9PQp0aGlzLl9pZ25vcmVZT3V0bGllcnMmJih0aGlzLl9pZ25vcmVZT3V0bGllcnM9Zyx0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpLHRoaXMueVNjYWxlLmlnbm9yZU91dGxpZXIoZyksdGhpcy5yZXNldFlEb21haW4oKSl9Z2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCl7Y29uc3QgZz10aGlzLmdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpO3JldHVybiBfLmZsYXR0ZW5EZWVwKHRoaXMuZGF0YXNldHMubWFwKGw9PmcubWFwKGs9PmwuZGF0YSgpLm1hcChtPT5rKG0sLTEsbCkpKSkpLmZpbHRlcihpc0Zpbml0ZSl9dXBkYXRlU3BlY2lhbERhdGFzZXRzKCl7Y29uc3QgZz10aGlzLmdldFlBeGlzQWNjZXNzb3IoKTt2YXIgbD10aGlzLmRhdGFzZXRzLm1hcChrPT57bGV0IG09bnVsbCxwPWsuZGF0YSgpLmZpbHRlcihxPT4haXNOYU4oZyhxLC0xLGspKSk7MDxwLmxlbmd0aCYmKG09cFtwLmxlbmd0aC0xXSxtLm5hbWU9ay5tZXRhZGF0YSgpLm5hbWUsbS5yZWxhdGl2ZT0KYm0ucmVsYXRpdmVBY2Nlc3NvcihtLC0xLGspKTtyZXR1cm4gbX0pLmZpbHRlcihrPT5udWxsIT1rKTt0aGlzLmxhc3RQb2ludHNEYXRhc2V0LmRhdGEobCk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMubWFwKHRoaXMuY3JlYXRlU2FtcGxlZERhdGFzZXRGb3JNYXJrZXJzKSk7bD1fLmZsYXR0ZW4odGhpcy5kYXRhc2V0cy5tYXAoaz0+e2xldCBtPW51bGwscD1rLmRhdGEoKSxxPTA7Zm9yKDtxPHAubGVuZ3RoJiZudWxsPT1tOylpc05hTihnKHBbcV0sLTEsaykpfHwobT1nKHBbcV0sLTEsaykpLHErKztudWxsPT1tJiYobT0wKTtsZXQgcj1bXTtmb3IocT0wO3E8cC5sZW5ndGg7cSsrKWlzTmFOKGcocFtxXSwtMSxrKSk/KHBbcV0ubmFtZT1rLm1ldGFkYXRhKCkubmFtZSxwW3FdLmRpc3BsYXlZPW0scFtxXS5yZWxhdGl2ZT1ibS5yZWxhdGl2ZUFjY2Vzc29yKHBbcV0sLTEsayksci5wdXNoKHBbcV0pKToKbT1nKHBbcV0sLTEsayk7cmV0dXJuIHJ9KSk7dGhpcy5uYW5EYXRhc2V0LmRhdGEobCl9cmVzZXREb21haW4oKXt0aGlzLnJlc2V0WERvbWFpbigpO3RoaXMucmVzZXRZRG9tYWluKCl9cmVzZXRYRG9tYWluKCl7aWYobnVsbCE9dGhpcy5fZGVmYXVsdFhSYW5nZSl2YXIgZz10aGlzLl9kZWZhdWx0WFJhbmdlO2Vsc2UgZz10aGlzLnhTY2FsZSxnLl9kb21haW5NaW49bnVsbCxnLl9kb21haW5NYXg9bnVsbCxnPWcuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlLmRvbWFpbihnKX1yZXNldFlEb21haW4oKXtudWxsIT10aGlzLl9kZWZhdWx0WVJhbmdlP3RoaXMueVNjYWxlLmRvbWFpbih0aGlzLl9kZWZhdWx0WVJhbmdlKToodGhpcy55U2NhbGUuYXV0b0RvbWFpbigpLHRoaXMueVNjYWxlLmRvbWFpbih0aGlzLnlTY2FsZS5kb21haW4oKSkpfWdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpe2NvbnN0IGc9W3RoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpXTt0aGlzLmZpbGxBcmVhJiZnLnB1c2godGhpcy5maWxsQXJlYS5sb3dlckFjY2Vzc29yLAp0aGlzLmZpbGxBcmVhLmhpZ2hlckFjY2Vzc29yKTtyZXR1cm4gZ31nZXRZQXhpc0FjY2Vzc29yKCl7cmV0dXJuIHRoaXMuc21vb3RoaW5nRW5hYmxlZD90aGlzLnNtb290aGVkQWNjZXNzb3I6dGhpcy55VmFsdWVBY2Nlc3Nvcn1jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24oZyl7Y29uc3QgbD1uZXcgYm0uUG9pbnRlckludGVyYWN0aW9uLGs9KCk9PntsLmVuYWJsZWQoITEpO3RoaXMuaGlkZVRvb2x0aXBzKCl9LG09KCk9PmwuZW5hYmxlZCghMCk7Zy5vblBhblN0YXJ0KGspO2cub25EcmFnWm9vbVN0YXJ0KGspO2cub25QYW5FbmQobSk7Zy5vbkRyYWdab29tRW5kKG0pO2cub25TY3JvbGxab29tKCgpPT50aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9uKSk7bC5vblBvaW50ZXJNb3ZlKHA9Pnt0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj1wO3RoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQocCl9KTtsLm9uUG9pbnRlckV4aXQoKCk9PnRoaXMuaGlkZVRvb2x0aXBzKCkpOwpyZXR1cm4gbH11cGRhdGVUb29sdGlwQ29udGVudChnKXt0aGlzLmxpbmVQbG90JiYod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZSksdGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntsZXQgbD17eDpnLngseTpnLnksZGF0dW06bnVsbCxkYXRhc2V0Om51bGx9LGs9dGhpcy5ncmlkbGluZXMuY29udGVudCgpLm5vZGUoKS5nZXRCQm94KCk7dmFyIG09dGhpcy5saW5lUGxvdC5kYXRhc2V0cygpLm1hcCh0PT50aGlzLmZpbmRDbG9zZXN0UG9pbnQobCx0KSkuZmlsdGVyKEJvb2xlYW4pO2xldCBwPVBsb3R0YWJsZS5VdGlscy5ET00uaW50ZXJzZWN0c0JCb3gscT1tLmZpbHRlcih0PT5wKHQueCx0Lnksayl8fGlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodC5kYXR1bSwwLHQuZGF0YXNldCkpKSxyPXEuZmlsdGVyKHQ9PiFpc05hTih0aGlzLnlWYWx1ZUFjY2Vzc29yKHQuZGF0dW0sCjAsdC5kYXRhc2V0KSkpOzAhPT1tLmxlbmd0aD8odGhpcy5zY2F0dGVyUGxvdC5hdHRyKCJkaXNwbGF5Iiwibm9uZSIpLG09dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLmRhdGEocix0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSxtLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKS5jbGFzc2VkKCJwb2ludCIsITApLG0uYXR0cigiciIsYm0uVE9PTFRJUF9DSVJDTEVfU0laRSkuYXR0cigiY3giLHQ9PnQueCkuYXR0cigiY3kiLHQ9PnQueSkuc3R5bGUoInN0cm9rZSIsIm5vbmUiKS5hdHRyKCJmaWxsIix0PT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpLG0uZXhpdCgpLnJlbW92ZSgpLHRoaXMuZHJhd1Rvb2x0aXBzKHEsbCx0aGlzLnRvb2x0aXBDb2x1bW5zKSk6dGhpcy5oaWRlVG9vbHRpcHMoKX0pKX1oaWRlVG9vbHRpcHMoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKTsKdGhpcy50b29sdGlwLmhpZGUoKTt0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJibG9jayIpO3RoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudC5jb250ZW50KCkuc2VsZWN0QWxsKCIucG9pbnQiKS5yZW1vdmUoKX1zZXR1cFRvb2x0aXBzKGcpe2cub25EZXRhY2goKCk9Pnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKCk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMSl9KTtnLm9uQW5jaG9yKCgpPT57dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uYXR0YWNoVG8oZyk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMCl9KX1kcmF3VG9vbHRpcHMoZyxsLGspe2lmKGcubGVuZ3RoKXt2YXIge2NvbG9yU2NhbGU6bX09dGhpcztrPVt7dGl0bGU6IiIsc3RhdGljOiExLGV2YWxUeXBlOmMuRE9NLGV2YWx1YXRlKHkpe2QzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInNwYW4iKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCk9Pm0uc2NhbGUoeS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpOwpyZXR1cm4iIn0sZW50ZXIoeSl7ZDMuc2VsZWN0KHRoaXMpLmFwcGVuZCgic3BhbiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIiwoKT0+bS5zY2FsZSh5LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSl9fSwuLi5rXTt2YXIgcD15PT5NYXRoLnBvdyh5LngtbC54LDIpK01hdGgucG93KHkueS1sLnksMikscT1fLm1pbihnLm1hcChwKSkscj10aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yOnRoaXMueVZhbHVlQWNjZXNzb3I7Zz0iYXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0QnkoZyx5PT5yKHkuZGF0dW0sLTEseS5kYXRhc2V0KSk6ImRlc2NlbmRpbmciPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShnLHk9PnIoeS5kYXR1bSwtMSx5LmRhdGFzZXQpKS5yZXZlcnNlKCk6Im5lYXJlc3QiPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShnLHApOmcuc2xpY2UoMCkucmV2ZXJzZSgpOwp2YXIgdD10aGlzLHY9ZDMuc2VsZWN0KHRoaXMudG9vbHRpcC5jb250ZW50KCkpLnNlbGVjdCgidGFibGUiKSxBPXYuc2VsZWN0KCJ0aGVhZCIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKGsseT0+eS50aXRsZSk7QS5lbnRlcigpLmFwcGVuZCgidGgiKS50ZXh0KHk9PnkudGl0bGUpLm5vZGVzKCk7QS5leGl0KCkucmVtb3ZlKCk7Zz12LnNlbGVjdCgidGJvZHkiKS5zZWxlY3RBbGwoInRyIikuZGF0YShnLHk9PnkuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpO2cuY2xhc3NlZCgiZGlzdGFudCIseT0+e3ZhciB4PXkuZGF0YXNldC5kYXRhKClbMF0sQz1fLmxhc3QoeS5kYXRhc2V0LmRhdGEoKSk7eD10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3Nvcih4LDAseS5kYXRhc2V0KSk7Qz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihDLDAseS5kYXRhc2V0KSk7eT10aGlzLnNtb290aGluZ0VuYWJsZWQ/eS5kYXR1bS5zbW9vdGhlZDp0aGlzLnlWYWx1ZUFjY2Vzc29yKHkuZGF0dW0sCjAseS5kYXRhc2V0KTtyZXR1cm4gbC54PHh8fGwueD5DfHxpc05hTih5KX0pLmNsYXNzZWQoImNsb3Nlc3QiLHk9PnAoeSk9PT1xKS5lYWNoKGZ1bmN0aW9uKHkpe3QuZHJhd1Rvb2x0aXBSb3codGhpcyxrLHkpfSkub3JkZXIoKTtnLmV4aXQoKS5yZW1vdmUoKTtnLmVudGVyKCkuYXBwZW5kKCJ0ciIpLmVhY2goZnVuY3Rpb24oeSl7dC5kcmF3VG9vbHRpcFJvdyh0aGlzLGsseSl9KS5ub2RlcygpO3RoaXMudG9vbHRpcC51cGRhdGVBbmRQb3NpdGlvbih0aGlzLnRhcmdldFNWRy5ub2RlKCkpfWVsc2UgdGhpcy50b29sdGlwLmhpZGUoKX1kcmF3VG9vbHRpcFJvdyhnLGwsayl7Y29uc3QgbT10aGlzO2c9ZDMuc2VsZWN0KGcpLnNlbGVjdEFsbCgidGQiKS5kYXRhKGwpO2cuZWFjaChmdW5jdGlvbihwKXtwLnN0YXRpY3x8bS5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKG0sdGhpcyxwLGspfSk7Zy5lbnRlcigpLmFwcGVuZCgidGQiKS5lYWNoKGZ1bmN0aW9uKHApe3AuZW50ZXImJnAuZW50ZXIuY2FsbCh0aGlzLAprKTttLmRyYXdUb29sdGlwQ29sdW1uLmNhbGwobSx0aGlzLHAsayl9KX1kcmF3VG9vbHRpcENvbHVtbihnLGwsayl7Y29uc3Qge3Ntb290aGluZ0VuYWJsZWQ6bX09dGhpcztsLmV2YWxUeXBlPT1jLkRPTT9sLmV2YWx1YXRlLmNhbGwoZyxrLHtzbW9vdGhpbmdFbmFibGVkOm19KTpkMy5zZWxlY3QoZykudGV4dChsLmV2YWx1YXRlLmNhbGwoZyxrLHtzbW9vdGhpbmdFbmFibGVkOm19KSl9ZmluZENsb3Nlc3RQb2ludChnLGwpe2NvbnN0IGs9bC5kYXRhKCkubWFwKChxLHIpPT50aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihxLHIsbCkpKTtsZXQgbT1fLnNvcnRlZEluZGV4KGssZy54KTtpZigwPT1rLmxlbmd0aClyZXR1cm4gbnVsbDttPT09ay5sZW5ndGg/LS1tOjAhPT1tJiYobT1NYXRoLmFicyhrW20tMV0tZy54KTxNYXRoLmFicyhrW21dLWcueCk/bS0xOm0pO2c9bC5kYXRhKClbbV07Y29uc3QgcD10aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yKGcsCm0sbCk6dGhpcy55VmFsdWVBY2Nlc3NvcihnLG0sbCk7cmV0dXJue3g6a1ttXSx5OnRoaXMueVNjYWxlLnNjYWxlKHApLGRhdHVtOmcsZGF0YXNldDpsfX1yZXNtb290aERhdGFzZXQoZyl7bGV0IGw9Zy5kYXRhKCk7Y29uc3Qgaz10aGlzLnNtb290aGluZ1dlaWdodDtsZXQgbT0wPGwubGVuZ3RoPzA6TmFOLHA9MDtjb25zdCBxPWwubWFwKCh0LHYpPT50aGlzLnlWYWx1ZUFjY2Vzc29yKHQsdixnKSkscj1xLmV2ZXJ5KHQ9PnQ9PXFbMF0pO2wuZm9yRWFjaCgodCx2KT0+e3Y9cVt2XTtyfHwhTnVtYmVyLmlzRmluaXRlKHYpP3Quc21vb3RoZWQ9djoobT1tKmsrKDEtaykqdixwKyssdj0xLDEhPT1rJiYodj0xLU1hdGgucG93KGsscCkpLHQuc21vb3RoZWQ9bS92KX0pfWdldERhdGFzZXQoZyl7dm9pZCAwPT09dGhpcy5uYW1lMmRhdGFzZXRzW2ddJiYodGhpcy5uYW1lMmRhdGFzZXRzW2ddPW5ldyBQbG90dGFibGUuRGF0YXNldChbXSx7bmFtZTpnLG1ldGE6bnVsbH0pKTtyZXR1cm4gdGhpcy5uYW1lMmRhdGFzZXRzW2ddfXN0YXRpYyBnZXRZU2NhbGVGcm9tVHlwZShnKXtpZihnPT09CmQuTE9HKXJldHVybiBuZXcgYS5Mb2dTY2FsZTtpZihnPT09ZC5MSU5FQVIpcmV0dXJuIG5ldyBhLkxpbmVhclNjYWxlO3Rocm93IEVycm9yKCJVbnJlY29nbml6ZWQgeVNjYWxlIHR5cGUgIitnKTt9c2V0VmlzaWJsZVNlcmllcyhnKXt0aGlzLnNlcmllc05hbWVzPWc9Zy5zb3J0KCk7Zy5yZXZlcnNlKCk7dGhpcy5kYXRhc2V0cy5mb3JFYWNoKGw9Pmwub2ZmVXBkYXRlKHRoaXMub25EYXRhc2V0Q2hhbmdlZCkpO3RoaXMuZGF0YXNldHM9Zy5tYXAobD0+dGhpcy5nZXREYXRhc2V0KGwpKTt0aGlzLmRhdGFzZXRzLmZvckVhY2gobD0+bC5vblVwZGF0ZSh0aGlzLm9uRGF0YXNldENoYW5nZWQpKTt0aGlzLmxpbmVQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMpO3RoaXMuc21vb3RoaW5nRW5hYmxlZCYmdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLm1hcmdpbkFyZWFQbG90JiZ0aGlzLm1hcmdpbkFyZWFQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMpOwp0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfWNyZWF0ZVNhbXBsZWREYXRhc2V0Rm9yTWFya2VycyhnKXtjb25zdCBsPWcuZGF0YSgpO2lmKDIwPj1sLmxlbmd0aClyZXR1cm4gZztjb25zdCBrPU1hdGguY2VpbChsLmxlbmd0aC8yMCksbT1BcnJheShNYXRoLmZsb29yKGwubGVuZ3RoL2spKTtmb3IobGV0IHA9MCxxPTA7cDxtLmxlbmd0aDtwKysscSs9ayltW3BdPWxbcV07cmV0dXJuIG5ldyBQbG90dGFibGUuRGF0YXNldChtLGcubWV0YWRhdGEoKSl9c2V0U2VyaWVzRGF0YShnLGwpe3RoaXMuZ2V0RGF0YXNldChnKS5kYXRhKGwpO3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpfXNldFNlcmllc01ldGFkYXRhKGcsbCl7bD1PYmplY3QuYXNzaWduKHt9LHRoaXMuZ2V0RGF0YXNldChnKS5tZXRhZGF0YSgpLHttZXRhOmx9KTt0aGlzLmdldERhdGFzZXQoZykubWV0YWRhdGEobCl9c21vb3RoaW5nVXBkYXRlKGcpe3RoaXMuc21vb3RoaW5nV2VpZ2h0PQpnO3RoaXMuZGF0YXNldHMuZm9yRWFjaChsPT50aGlzLnJlc21vb3RoRGF0YXNldChsKSk7dGhpcy5zbW9vdGhpbmdFbmFibGVkfHwodGhpcy5saW5lUGxvdC5hZGRDbGFzcygiZ2hvc3QiKSx0aGlzLnNjYXR0ZXJQbG90LnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aGluZ0VuYWJsZWQ9ITAsdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LnkodGhpcy5nZXRZQXhpc0FjY2Vzc29yKCksdGhpcy55U2NhbGUpO3RoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCl9c21vb3RoaW5nRGlzYWJsZSgpe3RoaXMuc21vb3RoaW5nRW5hYmxlZCYmKHRoaXMubGluZVBsb3QucmVtb3ZlQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMueVZhbHVlQWNjZXNzb3IsdGhpcy55U2NhbGUpLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHMoW10pLAp0aGlzLnNtb290aGluZ0VuYWJsZWQ9ITEsdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LnkodGhpcy5nZXRZQXhpc0FjY2Vzc29yKCksdGhpcy55U2NhbGUpfXNldFRvb2x0aXBTb3J0aW5nTWV0aG9kKGcpe3RoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q9Z31yZW5kZXJUbyhnKXt0aGlzLnRhcmdldFNWRz1nO3RoaXMub3V0ZXIucmVuZGVyVG8oZyk7bnVsbCE9dGhpcy5fZGVmYXVsdFhSYW5nZSYmdGhpcy5yZXNldFhEb21haW4oKTtudWxsIT10aGlzLl9kZWZhdWx0WVJhbmdlJiZ0aGlzLnJlc2V0WURvbWFpbigpO3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpfXJlZHJhdygpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpO3RoaXMuX3JlZHJhd1JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpOwp0aGlzLm91dGVyLnJlZHJhdygpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKTt0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0KCl9KX1tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpe2lmKHRoaXMuX2xhc3REcmF3QkJveCl7Y29uc3Qge3dpZHRoOmd9PXRoaXMuX2xhc3REcmF3QkJveCx7d2lkdGg6bH09dGhpcy50YXJnZXRTVkcubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOzA9PWcmJmc8bCYmdGhpcy5vdXRlci5pbnZhbGlkYXRlQ2FjaGUoKX10aGlzLl9sYXN0RHJhd0JCb3g9dGhpcy50YXJnZXRTVkcubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWRlc3Ryb3koKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTsKd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2ludmFsaWRhdGVMYXlvdXRSYWYpO3RoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpfW9uQW5jaG9yKGcpe2lmKHRoaXMub3V0ZXIpdGhpcy5vdXRlci5vbkFuY2hvcihnKX19YS5MaW5lQ2hhcnQ9Zn0pKGVtfHwoZW09e30pKTsKPC9zY3JpcHQ+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmpzCihmdW5jdGlvbihhKXtjb25zdCBjPWJtLm11bHRpc2NhbGVGb3JtYXR0ZXIoYm0uWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLGQ9Zj0+aXNOYU4oZik/Ik5hTiI6YyhmKTthLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TPVt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmY9PmYuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiU21vb3RoZWQiLGV2YWx1YXRlKGYsZyl7KHtzbW9vdGhpbmdFbmFibGVkOmd9PWcpO3JldHVybiBkKGc/Zi5kYXR1bS5zbW9vdGhlZDpmLmRhdHVtLnNjYWxhcil9fSx7dGl0bGU6IlZhbHVlIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0uc2NhbGFyKX0se3RpdGxlOiJTdGVwIixldmFsdWF0ZTpmPT5ibS5zdGVwRm9ybWF0dGVyKGYuZGF0dW0uc3RlcCl9LHt0aXRsZToiVGltZSIsZXZhbHVhdGU6Zj0+Ym0udGltZUZvcm1hdHRlcihmLmRhdHVtLndhbGxfdGltZSl9LHt0aXRsZToiUmVsYXRpdmUiLGV2YWx1YXRlOmY9PmJtLnJlbGF0aXZlRm9ybWF0dGVyKGJtLnJlbGF0aXZlQWNjZXNzb3IoZi5kYXR1bSwKLTEsZi5kYXRhc2V0KSl9XTtQb2x5bWVyKHtpczoidnotbGluZS1jaGFydDIiLHByb3BlcnRpZXM6e2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZShkMy5zY2hlbWVDYXRlZ29yeTEwKX19LHN5bWJvbEZ1bmN0aW9uOk9iamVjdCxzbW9vdGhpbmdFbmFibGVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxzbW9vdGhpbmdXZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOi42fSx4VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6e3R5cGU6T2JqZWN0LHZhbHVlOiIifSx4QXhpc0Zvcm1hdHRlcjpPYmplY3QseVZhbHVlQWNjZXNzb3I6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5mPT5mLnNjYWxhcn0sdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PmEuREVGQVVMVF9UT09MVElQX0NPTFVNTlN9LGZpbGxBcmVhOk9iamVjdCwKZGVmYXVsdFhSYW5nZTpBcnJheSxkZWZhdWx0WVJhbmdlOkFycmF5LHlTY2FsZVR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJsaW5lYXIifSxpZ25vcmVZT3V0bGllcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sdG9vbHRpcFNvcnRpbmdNZXRob2Q6e3R5cGU6U3RyaW5nLHZhbHVlOiJkZWZhdWx0In0sdG9vbHRpcFBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpjbS5Ub29sdGlwUG9zaXRpb24uQk9UVE9NfSxfY2hhcnQ6T2JqZWN0LF92aXNpYmxlU2VyaWVzQ2FjaGU6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfc2VyaWVzRGF0YUNhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3Nlcmllc01ldGFkYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX21ha2VDaGFydCh4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kLCB4VHlwZSwgeVZhbHVlQWNjZXNzb3IsIHlTY2FsZVR5cGUsIHRvb2x0aXBDb2x1bW5zLCBjb2xvclNjYWxlLCBpc0F0dGFjaGVkKSIsCiJfcmVsb2FkRnJvbUNhY2hlKF9jaGFydCwgX3Zpc2libGVTZXJpZXNDYWNoZSkiLCJfc21vb3RoaW5nQ2hhbmdlZChzbW9vdGhpbmdFbmFibGVkLCBzbW9vdGhpbmdXZWlnaHQsIF9jaGFydCkiLCJfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkKHRvb2x0aXBTb3J0aW5nTWV0aG9kLCBfY2hhcnQpIiwiX291dGxpZXJzQ2hhbmdlZChpZ25vcmVZT3V0bGllcnMsIF9jaGFydCkiXSxyZWFkeSgpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5jaGFydGRpdiwhMCl9LGF0dGFjaGVkKCl7Y29uc3QgZj17Y2FwdHVyZTohMCxwYXNzaXZlOiEwfTt0aGlzLl9saXN0ZW4odGhpcywibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93bi5iaW5kKHRoaXMpLGYpO3RoaXMuX2xpc3Rlbih0aGlzLCJtb3VzZXVwIix0aGlzLl9vbk1vdXNlVXAuYmluZCh0aGlzKSxmKTt0aGlzLl9saXN0ZW4od2luZG93LCJrZXlkb3duIix0aGlzLl9vbktleURvd24uYmluZCh0aGlzKSxmKTt0aGlzLl9saXN0ZW4od2luZG93LAoia2V5dXAiLHRoaXMuX29uS2V5VXAuYmluZCh0aGlzKSxmKX0sZGV0YWNoZWQoKXt0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCk7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LmRlc3Ryb3koKTt0aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaCgoe25vZGU6ZixldmVudE5hbWU6ZyxmdW5jOmwsb3B0aW9uOmt9KT0+e2YucmVtb3ZlRXZlbnRMaXN0ZW5lcihnLGwsayl9KSx0aGlzLl9saXN0ZW5lcnMuY2xlYXIoKSl9LF9saXN0ZW4oZixnLGwsaz17fSl7dGhpcy5fbGlzdGVuZXJzfHwodGhpcy5fbGlzdGVuZXJzPW5ldyBTZXQpO3RoaXMuX2xpc3RlbmVycy5hZGQoe25vZGU6ZixldmVudE5hbWU6ZyxmdW5jOmwsb3B0aW9uOmt9KTtmLmFkZEV2ZW50TGlzdGVuZXIoZyxsLGspfSxfb25LZXlEb3duKGYpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsYS5QYW5ab29tRHJhZ0xheWVyLmlzUGFuS2V5KGYpKX0sX29uS2V5VXAoZil7dGhpcy50b2dnbGVDbGFzcygicGFua2V5IiwKYS5QYW5ab29tRHJhZ0xheWVyLmlzUGFuS2V5KGYpKX0sX29uTW91c2VEb3duKCl7dGhpcy50b2dnbGVDbGFzcygibW91c2Vkb3duIiwhMCl9LF9vbk1vdXNlVXAoKXt0aGlzLnRvZ2dsZUNsYXNzKCJtb3VzZWRvd24iLCExKX0sc2V0VmlzaWJsZVNlcmllczpmdW5jdGlvbihmKXtfLmlzRXF1YWwodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLGYpfHwodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPWYpfSxzZXRTZXJpZXNEYXRhOmZ1bmN0aW9uKGYsZyl7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW2ZdPWc7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZixnKX0sc2V0U2VyaWVzTWV0YWRhdGEoZixnKXt0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2ZdPWc7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc01ldGFkYXRhKGYsZyl9LHJlc2V0RG9tYWluOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnJlc2V0RG9tYWluKCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYKdGhpcy5fY2hhcnQucmVkcmF3KCl9LF9tYWtlQ2hhcnQ6ZnVuY3Rpb24oZixnLGwsayxtLHApe2d8fGY/ZyYmKGY9KCk9PmJtLmdldFhDb21wb25lbnRzKGcpKTpmPWJtLnN0ZXBYO251bGwhPT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCksdGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPW51bGwpO3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD10aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPW51bGw7aWYoZiYmdGhpcy55VmFsdWVBY2Nlc3NvciYmdGhpcy50b29sdGlwQ29sdW1ucyl7dmFyIHE9bmV3IGEuTGluZUNoYXJ0KGYsdGhpcy55VmFsdWVBY2Nlc3NvcixrLHAsdGhpcy4kLnRvb2x0aXAsdGhpcy50b29sdGlwQ29sdW1ucyx0aGlzLmZpbGxBcmVhLHRoaXMuZGVmYXVsdFhSYW5nZSx0aGlzLmRlZmF1bHRZUmFuZ2UsCnRoaXMuc3ltYm9sRnVuY3Rpb24sdGhpcy54QXhpc0Zvcm1hdHRlcikscj1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0ZGl2KTtxLnJlbmRlclRvKHIpO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dGhpcy5fY2hhcnQ9cTt0aGlzLl9jaGFydC5vbkFuY2hvcigoKT0+dGhpcy5maXJlKCJjaGFydC1hdHRhY2hlZCIpKX19LDM1MCl9LF9yZWxvYWRGcm9tQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5mb3JFYWNoKGY9Pnt0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGYsdGhpcy5fc2VyaWVzRGF0YUNhY2hlW2ZdfHxbXSl9KSx0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZmlsdGVyKGY9PnRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbZl0pLmZvckVhY2goZj0+e3RoaXMuX2NoYXJ0LnNldFNlcmllc01ldGFkYXRhKGYsdGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZVtmXSl9KSx0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSkpfSwKX3Ntb290aGluZ0NoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmKHRoaXMuc21vb3RoaW5nRW5hYmxlZD90aGlzLl9jaGFydC5zbW9vdGhpbmdVcGRhdGUodGhpcy5zbW9vdGhpbmdXZWlnaHQpOnRoaXMuX2NoYXJ0LnNtb290aGluZ0Rpc2FibGUoKSl9LF9vdXRsaWVyc0NoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuaWdub3JlWU91dGxpZXJzKHRoaXMuaWdub3JlWU91dGxpZXJzKX0sX3Rvb2x0aXBTb3J0aW5nTWV0aG9kQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRUb29sdGlwU29ydGluZ01ldGhvZCh0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kKX0sZ2V0RXhwb3J0ZXIoKXtyZXR1cm4gbmV3IGEuTGluZUNoYXJ0RXhwb3J0ZXIodGhpcy4kLmNoYXJ0ZGl2KX19KX0pKGVtfHwoZW09e30pKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2ei1saW5lLWNoYXJ0LXRvb2x0aXAiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICA8dGFibGU+CiAgICAgICAgPHRoZWFkPjwvdGhlYWQ+CiAgICAgICAgPHRib2R5PjwvdGJvZHk+CiAgICAgIDwvdGFibGU+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuY29udGVudCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICB0YWJsZSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjRlbTsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgfQoKICAgICAgdGhlYWQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgdGJvZHkgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMjFweDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICB0ZCB7CiAgICAgICAgcGFkZGluZzogMCA1cHg7CiAgICAgIH0KCiAgICAgIC5zd2F0Y2ggewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgIH0KCiAgICAgIC5jbG9zZXN0IC5zd2F0Y2ggewogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDJweCAjZmZmOwogICAgICB9CgogICAgICB0aCB7CiAgICAgICAgcGFkZGluZzogMCA1cHg7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgLmRpc3RhbnQgdGQ6bm90KC5zd2F0Y2gpIHsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgIH0KCiAgICAgIC5naG9zdCB7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCJ9KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciI+CiAgICAgIDx2ei1saW5lLWNoYXJ0MiBpZD0iY2hhcnQiIGNvbG9yLXNjYWxlPSJbW2NvbG9yU2NhbGVdXSIgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIgZGVmYXVsdC15LXJhbmdlPSJbW2RlZmF1bHRZUmFuZ2VdXSIgZmlsbC1hcmVhPSJbW2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBvbi1jaGFydC1hdHRhY2hlZD0iX29uQ2hhcnRBdHRhY2hlZCIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzdHlsZT0iW1tfY29tcHV0ZUxpbmVDaGFydFN0eWxlKGRhdGFMb2FkaW5nKV1dIiBzeW1ib2wtZnVuY3Rpb249Iltbc3ltYm9sRnVuY3Rpb25dXSIgdG9vbHRpcC1jb2x1bW5zPSJbW3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1t4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW3lWYWx1ZUFjY2Vzc29yXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQtZXhwb3J0ZXIuanMKKGZ1bmN0aW9uKGEpe2xldCBjOyhmdW5jdGlvbihnKXtnLkdST1VQPSJHIjtnLkRJVj0iRElWIjtnLlNWRz0iU1ZHIjtnLlRFWFQ9IlRFWFQifSkoY3x8KGM9e30pKTtjbGFzcyBke2NvbnN0cnVjdG9yKGcpe3RoaXMudW5pcXVlSWQ9MDt0aGlzLnJvb3Q9Z31leHBvcnRBc1N0cmluZygpe2NvbnN0IGc9dGhpcy5jb252ZXJ0KHRoaXMucm9vdCk7aWYoIWcpcmV0dXJuIiI7Y29uc3QgbD10aGlzLmNyZWF0ZVJvb3RTdmcoKTtsLmFwcGVuZENoaWxkKGcpO3JldHVybiBsLm91dGVySFRNTH1jcmVhdGVVbmlxdWVJZCgpe3JldHVybmAkeyJjbGlwIn1fJHt0aGlzLnVuaXF1ZUlkKyt9YH1nZXRTaXplKCl7cmV0dXJuIHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jcmVhdGVSb290U3ZnKCl7Y29uc3QgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdmciKSxsPXRoaXMuZ2V0U2l6ZSgpO2cuc2V0QXR0cmlidXRlTlMoInN2ZyIsInZpZXdCb3giLGAwIDAgJHtsLndpZHRofSAke2wuaGVpZ2h0fWApOwpnLnNldEF0dHJpYnV0ZSgieG1sbnMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIpO3JldHVybiBnfWNvbnZlcnQoZyl7bGV0IGw9bnVsbDt2YXIgaz1nLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7aWYoZy5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREV8fGshPWMuRElWJiZrIT1jLlNWRylsPWcuY2xvbmVOb2RlKCk7ZWxzZXtsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYy5HUk9VUCk7dmFyIG09d2luZG93LmdldENvbXB1dGVkU3R5bGUoZykscD1wYXJzZUludChtLmxlZnQsMTApLHE9cGFyc2VJbnQobS50b3AsMTApO2lmKHB8fHEpaz10aGlzLmNyZWF0ZVVuaXF1ZUlkKCksbC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke3B9LCAke3F9KWApLGwuc2V0QXR0cmlidXRlKCJjbGlwLXBhdGgiLGB1cmwoIyR7a30pYCkscT1wYXJzZUludChtLmhlaWdodCwxMCkscD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJyZWN0IikscC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKU3RyaW5nKHBhcnNlSW50KG0ud2lkdGgsMTApKSkscC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKHEpKSxtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygic3ZnIiwiY2xpcFBhdGgiKSxtLmlkPWssbS5hcHBlbmRDaGlsZChwKSxsLmFwcGVuZENoaWxkKG0pfUFycmF5LmZyb20oZy5jaGlsZE5vZGVzKS5tYXAocj0+dGhpcy5jb252ZXJ0KHIpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChyPT5sLmFwcGVuZENoaWxkKHIpKTtyZXR1cm4gbC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT1jLkdST1VQJiYhbC5oYXNDaGlsZE5vZGVzKCl8fHRoaXMuc2hvdWxkT21pdE5vZGUoZyk/bnVsbDp0aGlzLnN0cmlwQ2xhc3ModGhpcy50cmFuc2ZlclN0eWxlKGcsbCkpfXN0cmlwQ2xhc3MoZyl7Zy5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJmcucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpO3JldHVybiBnfXRyYW5zZmVyU3R5bGUoZyxsKXtpZihsLm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gbDsKY29uc3Qgaz1sLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7Zz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShnKTtrPT1jLlRFWFQmJk9iamVjdC5hc3NpZ24obC5zdHlsZSx7Zm9udEZhbWlseTpnLmZvbnRGYW1pbHksZm9udFNpemU6Zy5mb250U2l6ZSxmb250V2VpZ2h0OmcuZm9udFdlaWdodH0pO2shPWMuR1JPVVAmJihsLnNldEF0dHJpYnV0ZSgiZmlsbCIsZy5maWxsKSxsLnNldEF0dHJpYnV0ZSgic3Ryb2tlIixnLnN0cm9rZSksbC5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsZy5zdHJva2VXaWR0aCkpOyIxIiE9Zy5vcGFjaXR5JiZsLnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsZy5vcGFjaXR5KTtyZXR1cm4gbH1zaG91bGRPbWl0Tm9kZSgpe3JldHVybiExfX1hLlBsb3R0YWJsZUV4cG9ydGVyPWQ7Y2xhc3MgZiBleHRlbmRzIGR7c2hvdWxkT21pdE5vZGUoZyl7cmV0dXJuIGcubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFP2cuY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2F0dGVyLXBsb3QiKToKITF9fWEuTGluZUNoYXJ0RXhwb3J0ZXI9Zn0pKGVtfHwoZW09e30pKTsKPC9zY3JpcHQ+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci5odG1sLmpzCihmdW5jdGlvbigpe2NvbnN0IGE9W10sYz1mdW5jdGlvbigpe3JldHVybiBfLnRocm90dGxlKGZ1bmN0aW9uIGYoKXtpZigwIT1hLmxlbmd0aCl7dmFyIGc9YS5zaGlmdCgpO2cuYWN0aXZlJiYoZy5yZWRyYXcoKSxnLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMSk7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKDApO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZil9fSwxMDApfSgpO1BvbHltZXIoe2lzOiJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIixwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2ZpeEJhZFN0YXRlV2hlbkFjdGl2ZSJ9LGRhdGFTZXJpZXM6QXJyYXkscmVxdWVzdE1hbmFnZXI6T2JqZWN0LGxvZ1NjYWxlQWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9sb2dTY2FsZUNoYW5nZWQifSx4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOk9iamVjdCx4VHlwZTpTdHJpbmcseVZhbHVlQWNjZXNzb3I6T2JqZWN0LGZpbGxBcmVhOk9iamVjdCwKc21vb3RoaW5nRW5hYmxlZDpCb29sZWFuLHNtb290aGluZ1dlaWdodDpOdW1iZXIsdG9vbHRpcENvbHVtbnM6QXJyYXksdG9vbHRpcFNvcnRpbmdNZXRob2Q6U3RyaW5nLHRvb2x0aXBQb3NpdGlvbjpTdHJpbmcsaWdub3JlWU91dGxpZXJzOkJvb2xlYW4sZGVmYXVsdFhSYW5nZTpBcnJheSxkZWZhdWx0WVJhbmdlOkFycmF5LHN5bWJvbEZ1bmN0aW9uOk9iamVjdCxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2FsZTpabC5ydW5zQ29sb3JTY2FsZX0pfSxfcmVzZXREb21haW5Pbk5leHRMb2FkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGJlaGF2aW9yczpbV2wuRGF0YUxvYWRlckJlaGF2aW9yXSxvYnNlcnZlcnM6WyJfZGF0YVNlcmllc0NoYW5nZWQoZGF0YVNlcmllcy4qKSIsIl9sb2FkS2V5Q2hhbmdlZChsb2FkS2V5KSJdLG9uTG9hZEZpbmlzaCgpezA8CnRoaXMuZGF0YVRvTG9hZC5sZW5ndGgmJnRoaXMuX3Jlc2V0RG9tYWluT25OZXh0TG9hZCYmKHRoaXMuX3Jlc2V0RG9tYWluT25OZXh0TG9hZD0hMSx0aGlzLiQuY2hhcnQucmVzZXREb21haW4oKSk7dGhpcy5yZWRyYXcoKX0sZGV0YWNoZWQoKXtjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpfSxleHBvcnRBc1N2Z1N0cmluZygpe3JldHVybiB0aGlzLiQuY2hhcnQuZ2V0RXhwb3J0ZXIoKS5leHBvcnRBc1N0cmluZygpfSxyZXNldERvbWFpbigpe3RoaXMuJC5jaGFydC5yZXNldERvbWFpbigpfSxzZXRTZXJpZXNEYXRhKGQsZil7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoZCxmKX0sc2V0U2VyaWVzTWV0YWRhdGEoZCxmKXt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEoZCxmKX0scmVkcmF3KCl7Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuYWN0aXZlPwp0aGlzLiQuY2hhcnQucmVkcmF3KCk6dGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITB9KX0sX2xvYWRLZXlDaGFuZ2VkKCl7dGhpcy5yZXNldCgpO3RoaXMuX3Jlc2V0RG9tYWluT25OZXh0TG9hZD0hMH0sX2RhdGFTZXJpZXNDaGFuZ2VkKCl7dGhpcy4kLmNoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5kYXRhU2VyaWVzKX0sX2xvZ1NjYWxlQ2hhbmdlZChkKXt0aGlzLiQuY2hhcnQueVNjYWxlVHlwZT1kPyJsb2ciOiJsaW5lYXIiO3RoaXMucmVkcmF3KCl9LF9jb21wdXRlTGluZUNoYXJ0U3R5bGUoZCl7cmV0dXJuIGQ/Im9wYWNpdHk6IDAuMzsiOiIifSxfZml4QmFkU3RhdGVXaGVuQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlJiYoYS5wdXNoKHRoaXMpLGMoKSl9LF9vbkNoYXJ0QXR0YWNoZWQoKXt0aGlzLmFjdGl2ZXx8KHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSEwKX19KX0pKCk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNjcm9sbGFibGUiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCguaXMtc2Nyb2xsZWQ6bm90KDpmaXJzdC1jaGlsZCkpOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kaXZpZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhbi1zY3JvbGw6bm90KC5zY3JvbGxlZC10by1ib3R0b20pOm5vdCg6bGFzdC1jaGlsZCkpOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICAuc2Nyb2xsYWJsZSB7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwoKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtc2Nyb2xsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlOwogICAgICB9CgogICAgICAuZml0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNjcm9sbGFibGUiIGNsYXNzPSJzY3JvbGxhYmxlIiBvbi1zY3JvbGw9InVwZGF0ZVNjcm9sbFN0YXRlIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZS9wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSIscHJvcGVydGllczp7ZGlhbG9nRWxlbWVudDp7dHlwZTpPYmplY3R9fSxnZXQgc2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuJC5zY3JvbGxhYmxlfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpO3RoaXMuY2xhc3NMaXN0LmFkZCgibm8tcGFkZGluZyIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpO3JlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlLmJpbmQodGhpcykpfSx1cGRhdGVTY3JvbGxTdGF0ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ2xhc3MoImlzLXNjcm9sbGVkIiwwPHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCk7dGhpcy50b2dnbGVDbGFzcygiY2FuLXNjcm9sbCIsdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0PHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCk7dGhpcy50b2dnbGVDbGFzcygic2Nyb2xsZWQtdG8tYm90dG9tIiwKdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wK3RoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodD49dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsSGVpZ2h0KX0sX2Vuc3VyZVRhcmdldDpmdW5jdGlvbigpeyh0aGlzLmRpYWxvZ0VsZW1lbnQ9dGhpcy5kaWFsb2dFbGVtZW50fHx0aGlzLnBhcmVudEVsZW1lbnQpJiZ0aGlzLmRpYWxvZ0VsZW1lbnQuYmVoYXZpb3JzJiYwPD10aGlzLmRpYWxvZ0VsZW1lbnQuYmVoYXZpb3JzLmluZGV4T2YoUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbCk/KHRoaXMuZGlhbG9nRWxlbWVudC5zaXppbmdUYXJnZXQ9dGhpcy5zY3JvbGxUYXJnZXQsdGhpcy5zY3JvbGxUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgiZml0IikpOnRoaXMuZGlhbG9nRWxlbWVudCYmdGhpcy5zY3JvbGxUYXJnZXQuY2xhc3NMaXN0LmFkZCgiZml0Iil9fSk7Cjwvc2NyaXB0PgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tYXJrZG93bi12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYXJrZG93biIgaW5uZXItaC10LW0tbD0iW1todG1sXV0iPjwvZGl2PgogICAgPHN0eWxlPgogICAgICAvKgogICAgICAgKiBSZWR1Y2UgdG9wbW9zdCBhbmQgYm90dG9tbW9zdCBtYXJnaW5zIGZyb20gMTZweCB0byAwLjNlbSAocmVuZGVycwogICAgICAgKiBhdCBhYm91dCA0LjhweCkgdG8ga2VlcCB0aGUgbGF5b3V0IGNvbXBhY3QuIFRoaXMgaW1wcm92ZXMgdGhlCiAgICAgICAqIGFwcGVhcmFuY2Ugd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBsaW5lIG9mIHRleHQ7IHN0YW5kYXJkIE1hcmtkb3duCiAgICAgICAqIHJlbmRlcmVycyB3aWxsIHN0aWxsIGluY2x1ZGUgYSBgPHA+YCBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBCeSB0YXJnZXRpbmcgb25seSB0aGUgdG9wLWxldmVsLCBleHRyZW1hbCBlbGVtZW50cywgd2UgcHJlc2VydmUgYW55CiAgICAgICAqIGFjdHVhbCBwYXJhZ3JhcGggYnJlYWtzIGFuZCBvbmx5IGNoYW5nZSB0aGUgcGFkZGluZyBhZ2FpbnN0IHRoZQogICAgICAgKiBjb21wb25lbnQgZWRnZXMuCiAgICAgICAqLwogICAgICAjbWFya2Rvd24gPiBwOmZpcnN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tdG9wOiAwLjNlbTsKICAgICAgfQogICAgICAjbWFya2Rvd24gPiBwOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDAuM2VtOwogICAgICB9CgogICAgICAvKiBQbGVhc2FudCBzdHlsZXMgZm9yIE1hcmtkb3duIHRhYmxlcy4gKi8KICAgICAgI21hcmtkb3duIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdGgsCiAgICAgICNtYXJrZG93biB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogNnB4IDEzcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RmZTJlNTsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdHIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjNmNiZDE7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtbWFya2Rvd24tdmlldy90Zi1tYXJrZG93bi12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLW1hcmtkb3duLXZpZXciLHByb3BlcnRpZXM6e2h0bWw6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sYXR0YWNoZWQoKXt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLm1hcmtkb3duLCEwKX0pfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICBmaWdjYXB0aW9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLyoqIEhvcml6b250YWwgbGluZSBvZiBsYWJlbHMuICovCiAgICAgIC5oZWFkaW5nLXJvdyB7CiAgICAgICAgbWFyZ2luLXRvcDogLTRweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAvKiogUGllY2Ugb2YgdGV4dCBpbiB0aGUgZmlndXJlIGNhcHRpb24uICovCiAgICAgIC5oZWFkaW5nLWxhYmVsIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC8qKiBNYWtlcyBsYWJlbCBzaG93IG9uIHRoZSByaWdodC4gKi8KICAgICAgLmhlYWRpbmctcmlnaHQgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtY2FyZC1oZWFkaW5nL3V0aWwuanMKdmFyIGZtOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGQpe2lmKCFkKXJldHVybiBudWxsO2xldCBmPWQubWF0Y2goL14jKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pJC8pO2lmKCFmKXJldHVybiBudWxsO2lmKDQ9PWQubGVuZ3RoKWZvcihkPTE7Mz49ZDtkKyspZltkXSs9ZltkXTtyZXR1cm5bcGFyc2VJbnQoZlsxXSwxNikscGFyc2VJbnQoZlsyXSwxNikscGFyc2VJbnQoZlszXSwxNildfWEuZm9ybWF0RGF0ZT1mdW5jdGlvbihkKXtyZXR1cm4gZD9kLnRvU3RyaW5nKCkucmVwbGFjZSgvR01ULVxkKyBcKChbXildKylcKS8sIiQxIik6IiJ9O2EucGlja1RleHRDb2xvcj1mdW5jdGlvbihkKXtyZXR1cm4oZD1jKGQpKT8xMjU8TWF0aC5yb3VuZCgoMjk5KmRbMF0rNTg3KmRbMV0rMTE0KmRbMl0pLzFFMyk/ImluaGVyaXQiOiIjZWVlIjoiaW5oZXJpdCJ9fSkoZm18fChmbT17fSkpOwo8L3NjcmlwdD4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNhcmQtaGVhZGluZyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGZpZ2NhcHRpb24gY2xhc3M9ImNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbmFtZUxhYmVsXV0iPgogICAgICAgICAgICA8ZGl2IGl0ZW1wcm9wPSJuYW1lIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBuYW1lIj4KICAgICAgICAgICAgICBbW19uYW1lTGFiZWxdXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbcnVuXV0iPgogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgIDxzcGFuIGl0ZW1wcm9wPSJydW4iIGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQgcnVuIiBzdHlsZT0iYmFja2dyb3VuZDogW1tfcnVuQmFja2dyb3VuZF1dOyBjb2xvcjogW1tfcnVuQ29sb3JdXSI+W1tydW5dXTwvc3Bhbj4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvIiBvbi10YXA9Il90b2dnbGVEZXNjcmlwdGlvbkRpYWxvZyIgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iZGVzY3JpcHRpb25EaWFsb2ciIG5vLW92ZXJsYXAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1jYXJkLWhlYWRpbmcvdGYtY2FyZC1oZWFkaW5nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWNhcmQtaGVhZGluZyIscHJvcGVydGllczp7ZGlzcGxheU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHRhZzp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0scnVuOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxkZXNjcmlwdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sY29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9ydW5CYWNrZ3JvdW5kOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5CYWNrZ3JvdW5kKGNvbG9yKSIscmVhZE9ubHk6ITB9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IoY29sb3IpIixyZWFkT25seTohMH0sX25hbWVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlTmFtZUxhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn0sX3RhZ0xhYmVsOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUYWdMYWJlbChkaXNwbGF5TmFtZSwgdGFnKSJ9fSxfY29tcHV0ZVJ1bkJhY2tncm91bmQoYSl7cmV0dXJuIGF8fAoibm9uZSJ9LF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIGZtLnBpY2tUZXh0Q29sb3IoYSl9LF9jb21wdXRlTmFtZUxhYmVsKGEsYyl7cmV0dXJuIGF8fGN8fCIifSxfY29tcHV0ZVRhZ0xhYmVsKGEsYyl7cmV0dXJuIGMmJmMhPT1hP2M6IiJ9LF90b2dnbGVEZXNjcmlwdGlvbkRpYWxvZyhhKXt0aGlzLiQuZGVzY3JpcHRpb25EaWFsb2cucG9zaXRpb25UYXJnZXQ9YS50YXJnZXQ7dGhpcy4kLmRlc2NyaXB0aW9uRGlhbG9nLnRvZ2dsZSgpfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZG93bmxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJydW4gdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3J1bn19Ij4KICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tydW5zXV0iPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgIDxhIGRvd25sb2FkPSJbW19jc3ZOYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfY3N2VXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkNTVjwvYT48YSBkb3dubG9hZD0iW1tfanNvbk5hbWUodGFnLCBfcnVuKV1dIiBocmVmPSJbW19qc29uVXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkpTT048L2E+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgICBhIHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAwIDAuMmVtOwogICAgICB9CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kb3dubG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRvd25sb2FkZXIiLHByb3BlcnRpZXM6e19ydW46U3RyaW5nLHJ1bnM6QXJyYXksdGFnOlN0cmluZyx1cmxGbjpGdW5jdGlvbn0sX2NzdlVybChhLGMsZCl7cmV0dXJuIFBrLmFkZFBhcmFtcyhkKGEsYykse2Zvcm1hdDoiY3N2In0pfSxfanNvblVybChhLGMsZCl7cmV0dXJuIGQoYSxjKX0sX2Nzdk5hbWUoYSxjKXtyZXR1cm5gcnVuLSR7Y30tdGFnLSR7YX0uY3N2YH0sX2pzb25OYW1lKGEsYyl7cmV0dXJuYHJ1bi0ke2N9LXRhZy0ke2F9Lmpzb25gfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtc2NhbGFyLWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2dldENvbG9yU2NhbGUoY29sb3JTY2FsZSldXSIgZGF0YS1zZXJpZXM9IltbX2dldERhdGFTZXJpZXMoZGF0YVRvTG9hZC4qKV1dIiBkYXRhLXRvLWxvYWQ9IltbZGF0YVRvTG9hZF1dIiBnZXQtZGF0YS1sb2FkLW5hbWU9IltbX2dldERhdGFMb2FkTmFtZV1dIiBnZXQtZGF0YS1sb2FkLXVybD0iW1tnZXREYXRhTG9hZFVybF1dIiByZXF1ZXN0LWRhdGE9IltbcmVxdWVzdERhdGFdXSIgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfbG9hZERhdGFDYWxsYmFja11dIiBsb2FkLWtleT0iW1t0YWddXSIgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIHNtb290aGluZy1lbmFibGVkPSJbW3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIgdGFnLW1ldGFkYXRhPSJbW3RhZ01ldGFkYXRhXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfdG9vbHRpcENvbHVtbnNdXSIgdG9vbHRpcC1wb3NpdGlvbj0iYXV0byIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSI+CiAgICAgIDwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iYnV0dG9ucyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBpY29uPSJsaW5lLXdlaWdodCIgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiIHRpdGxlPSJUb2dnbGUgeS1heGlzIGxvZyBzY2FsZSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxwYXBlci1tZW51LWJ1dHRvbiBvbi1wYXBlci1kcm9wZG93bi1vcGVuPSJfdXBkYXRlRG93bmxvYWRMaW5rIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZHJvcGRvd24tdHJpZ2dlciIgc2xvdD0iZHJvcGRvd24tdHJpZ2dlciIgaWNvbj0iZmlsZS1kb3dubG9hZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPGEgaWQ9InN2Z0xpbmsiIGRvd25sb2FkPSJbW3RhZ11dLnN2ZyI+CiAgICAgICAgICAgICAgICBEb3dubG9hZCBDdXJyZW50IENoYXJ0IGFzIFNWRwogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDx0Zi1kb3dubG9hZGVyIHJ1bnM9IltbX3J1bnNGcm9tRGF0YShkYXRhVG9Mb2FkKV1dIiB0YWc9IltbdGFnXV0iIHVybC1mbj0iW1tfZG93bmxvYWRVcmxGbl1dIj48L3RmLWRvd25sb2FkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIG1hcmdpbjogNXB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgfQoKICAgICAgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KCiAgICAgICNidXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIGEgewogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBhcGVyLW1lbnUtYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CiAgICAgIHBhcGVyLWl0ZW0gYSB7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zY2FsYXItY2FyZCIscHJvcGVydGllczp7dGFnOlN0cmluZyxkYXRhVG9Mb2FkOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6Qm9vbGVhbixpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25MaW5rczpCb29sZWFuLHNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2xvYWREYXRhQ2FsbGJhY2s6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGEsYyxkKT0+e2Q9ZC5tYXAoZz0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmdbMF0pLHN0ZXA6Z1sxXSxzY2FsYXI6Z1syXX0pKTtjb25zdCBmPXRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYyk7YS5zZXRTZXJpZXNNZXRhZGF0YShmLGMpO2Euc2V0U2VyaWVzRGF0YShmLApkKX19LHJlYWRPbmx5OiEwfSxnZXREYXRhTG9hZFVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybih7dGFnOmEscnVuOmMsZXhwZXJpbWVudDpkfSk9PlBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3NjYWxhcnMiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzphLHJ1bjpjLGV4cGVyaW1lbnQ6ZHx8IiJ9KSl9fSxfZG93bmxvYWRVcmxGbjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihhLGMpPT50aGlzLmdldERhdGFMb2FkVXJsKHt0YWc6YSxydW46YyxleHBlcmltZW50OlBrLmdldEV4cGVyaW1lbnRJZCgpfSl9fSxyZXF1ZXN0RGF0YTpGdW5jdGlvbixfZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYSl9fSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LApfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPWVtLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TLnNsaWNlKCksYz1hLmZpbmRJbmRleChkPT4iTmFtZSI9PWQudGl0bGUpO2Euc3BsaWNlKGMsMSx7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmQ9PntkPWQuZGF0YXNldC5tZXRhZGF0YSgpLm1ldGE7cmV0dXJuIHRoaXMuX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGQpfX0pO3JldHVybiBhfX19LHJlbG9hZCgpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLAohdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBhPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTthJiZhLnJlc2V0RG9tYWluKCl9LF91cGRhdGVEb3dubG9hZExpbmsoKXtjb25zdCBhPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5leHBvcnRBc1N2Z1N0cmluZygpO3RoaXMuJCQoIiNzdmdMaW5rIikuaHJlZj1gZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwke2J0b2EoYSl9YH0sX3J1bnNGcm9tRGF0YShhKXtyZXR1cm4gYS5tYXAoYz0+Yy5ydW4pfSxfZ2V0RGF0YVNlcmllcygpe3JldHVybiB0aGlzLmRhdGFUb0xvYWQubWFwKGE9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYSkpfSxfZ2V0U2VyaWVzTmFtZUZyb21EYXR1bSh7cnVuOmEsZXhwZXJpbWVudDpjPXtuYW1lOiJfZGVmYXVsdCJ9fSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFtjLm5hbWUsYV0pfSxfZ2V0U2VyaWVzRGlzcGxheU5hbWVGcm9tRGF0dW0oYSl7cmV0dXJuIGEucnVufSwKX2dldENvbG9yU2NhbGUoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29sb3JTY2FsZT90aGlzLmNvbG9yU2NhbGU6e3NjYWxlOmE9PntbLGFdPUpTT04ucGFyc2UoYSk7cmV0dXJuIFpsLnJ1bnNDb2xvclNjYWxlKGEpfX19fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLXJhbmdlLWJlaGF2aW9yL2lyb24tcmFuZ2UtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25SYW5nZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnt2YWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxtaW46e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxtYXg6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMCxub3RpZnk6ITB9LHN0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjEsbm90aWZ5OiEwfSxyYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMCxub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfdXBkYXRlKHZhbHVlLCBtaW4sIG1heCwgc3RlcCkiXSxfY2FsY1JhdGlvOmZ1bmN0aW9uKGEpe3JldHVybih0aGlzLl9jbGFtcFZhbHVlKGEpLXRoaXMubWluKS8odGhpcy5tYXgtdGhpcy5taW4pfSxfY2xhbXBWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5taW4odGhpcy5tYXgsTWF0aC5tYXgodGhpcy5taW4sdGhpcy5fY2FsY1N0ZXAoYSkpKX0sX2NhbGNTdGVwOmZ1bmN0aW9uKGEpe2E9cGFyc2VGbG9hdChhKTsKaWYoIXRoaXMuc3RlcClyZXR1cm4gYTthPU1hdGgucm91bmQoKGEtdGhpcy5taW4pL3RoaXMuc3RlcCk7cmV0dXJuIDE+dGhpcy5zdGVwP2EvKDEvdGhpcy5zdGVwKSt0aGlzLm1pbjphKnRoaXMuc3RlcCt0aGlzLm1pbn0sX3ZhbGlkYXRlVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUpO3RoaXMudmFsdWU9dGhpcy5vbGRWYWx1ZT1pc05hTihhKT90aGlzLm9sZFZhbHVlOmE7cmV0dXJuIHRoaXMudmFsdWUhPT1hfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fdmFsaWRhdGVWYWx1ZSgpO3RoaXMuX3NldFJhdGlvKDEwMCp0aGlzLl9jYWxjUmF0aW8odGhpcy52YWx1ZSkpfX07Cjwvc2NyaXB0PgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXByb2dyZXNzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC8qIHRoZSBzdHJpcGUgZm9yIHRoZSBpbmRldGVybWluYXRlIGFuaW1hdGlvbiovCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQsIDRweCk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcywKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgIDpob3N0KC50cmFuc2l0aW5nKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtOwoKICAgICAgICAvKiBEdXJhdGlvbiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb24sIDAuMDhzKTsKCiAgICAgICAgLyogVGltaW5nIGZ1bmN0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24sIGVhc2UpOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CgogICAgICAgIC8qIERlbGF5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheSwgMHMpOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzLAogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpOwogICAgICB9CgogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTEwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcHJpbWFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTUwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktMzAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2Rpc2FibGVkXSkpICNwcmltYXJ5UHJvZ3Jlc3MuaW5kZXRlcm1pbmF0ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1iYXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CgogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICAgIDc1JSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC4yOCwuNjIsLjM3LC45MSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgfQogICAgICAgIDMwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InByb2dyZXNzQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ic2Vjb25kYXJ5UHJvZ3Jlc3MiIGhpZGRlbiQ9IltbX2hpZGVTZWNvbmRhcnlQcm9ncmVzcyhzZWNvbmRhcnlSYXRpbyldXSI+PC9kaXY+CiAgICAgIDxkaXYgaWQ9InByaW1hcnlQcm9ncmVzcyI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItcHJvZ3Jlc3MvcGFwZXItcHJvZ3Jlc3MuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItcHJvZ3Jlc3MiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmFuZ2VCZWhhdmlvcl0scHJvcGVydGllczp7c2Vjb25kYXJ5UHJvZ3Jlc3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNlY29uZGFyeVJhdGlvOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwfSxpbmRldGVybWluYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il90b2dnbGVJbmRldGVybWluYXRlIn0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQifX0sb2JzZXJ2ZXJzOlsiX3Byb2dyZXNzQ2hhbmdlZChzZWNvbmRhcnlQcm9ncmVzcywgdmFsdWUsIG1pbiwgbWF4LCBpbmRldGVybWluYXRlKSJdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJwcm9ncmVzc2JhciJ9LF90b2dnbGVJbmRldGVybWluYXRlOmZ1bmN0aW9uKGEpe3RoaXMudG9nZ2xlQ2xhc3MoImluZGV0ZXJtaW5hdGUiLAphLHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MpfSxfdHJhbnNmb3JtUHJvZ3Jlc3M6ZnVuY3Rpb24oYSxjKXthLnN0eWxlLnRyYW5zZm9ybT1hLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ic2NhbGVYKCIrYy8xMDArIikifSxfbWFpblJhdGlvQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl90cmFuc2Zvcm1Qcm9ncmVzcyh0aGlzLiQucHJpbWFyeVByb2dyZXNzLGEpfSxfcHJvZ3Jlc3NDaGFuZ2VkOmZ1bmN0aW9uKGEsYyxkLGYsZyl7YT10aGlzLl9jbGFtcFZhbHVlKGEpO2M9dGhpcy5fY2xhbXBWYWx1ZShjKTt2YXIgbD0xMDAqdGhpcy5fY2FsY1JhdGlvKGEpLGs9MTAwKnRoaXMuX2NhbGNSYXRpbyhjKTt0aGlzLl9zZXRTZWNvbmRhcnlSYXRpbyhsKTt0aGlzLl90cmFuc2Zvcm1Qcm9ncmVzcyh0aGlzLiQuc2Vjb25kYXJ5UHJvZ3Jlc3MsbCk7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnByaW1hcnlQcm9ncmVzcyxrKTt0aGlzLnNlY29uZGFyeVByb2dyZXNzPWE7Zz90aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS12YWx1ZW5vdyIpOgp0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW5vdyIsYyk7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtaW4iLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWF4IixmKX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsYT8idHJ1ZSI6ImZhbHNlIil9LF9oaWRlU2Vjb25kYXJ5UHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1hfX0pOwo8L3NjcmlwdD4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItc2xpZGVyIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTMwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQtYWN0aXZlLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0OiB2YXIoLS1wYXBlci1zbGlkZXItaGVpZ2h0LCAycHgpOwogICAgICB9CgogICAgICAvKiBmb2N1cyBzaG93cyB0aGUgcmlwcGxlICovCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhvdWdoIDpob3N0LWNvbnRleHQgaXMgbm90IHVuaXZlcnNhbGx5IHN1cHBvcnRlZCwgc29tZSBwYWdlcwogICAgICAgKiBzdGlsbCByZWx5IG9uIHBhcGVyLXNsaWRlciBiZWluZyBmbGlwcGVkIHdoZW4gZGlyPSJydGwiIGlzIHNldCBvbiBib2R5LiBGb3IgZnVsbAogICAgICAgKiBjb21wYXRhYmlsaXR5LCBkaXI9InJ0bCIgbXVzdCBiZSBleHBsaWNpdGx5IHNldCBvbiBwYXBlci1zbGlkZXIuCiAgICAgICAqLwogICAgICA6ZGlyKHJ0bCkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgcnVsZSBhYm92ZSBiZWNhdXNlIDpob3N0LWNvbnRleHQgbWF5CiAgICAgICAqIG5vdCBiZSByZWNvZ25pemVkLgogICAgICAgKi8KICAgICAgOmhvc3QoW2Rpcj0icnRsIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBOZWVkZWQgdG8gb3ZlcnJpZGUgdGhlIDpob3N0LWNvbnRleHQgcnVsZSAod2hlcmUgc3VwcG9ydGVkKQogICAgICAgKiB0byBzdXBwb3J0IExUUiBzbGlkZXJzIGluIFJUTCBwYWdlcy4KICAgICAgICovCiAgICAgIDpob3N0KFtkaXI9Imx0ciJdKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpOwogICAgICB9CgogICAgICAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgICBtYXJnaW4tbGVmdDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IGNhbGMoMTVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXI6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IDA7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXIuZWRpdGFibGUgewogICAgICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgfQoKICAgICAgLmJhci1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnJpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgbGVmdDogY2FsYyg1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnJpbmcuZXhwYW5kLmRyYWdnaW5nID4gLmJhci1jb250YWluZXIgewogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIC5yaW5nLmV4cGFuZDpub3QoLnBpbikgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgbGVmdDogY2FsYyg4cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICB9CgogICAgICAjc2xpZGVyQmFyIHsKICAgICAgICBwYWRkaW5nOiAxNXB4IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWJhci1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItY29udGFpbmVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICB9CgogICAgICAuc2xpZGVyLW1hcmtlcnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGNhbGMoMTRweCArIHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsMnB4KS8yKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogLTFweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICB9CgogICAgICAuc2xpZGVyLW1hcmtlciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KICAgICAgLnNsaWRlci1tYXJrZXJzOjphZnRlciwKICAgICAgLnNsaWRlci1tYXJrZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tbGVmdDogLTFweDsKICAgICAgICB3aWR0aDogMnB4OwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3IsICMwMDApOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2IgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgICBtYXJnaW4tbGVmdDogY2FsYygtMTVweCAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgd2lkdGg6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICAgIGhlaWdodDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgIH0KCiAgICAgIC50cmFuc2l0aW5nID4gLnNsaWRlci1rbm9iIHsKICAgICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMDhzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYjpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLmRyYWdnaW5nIHsKICAgICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgICB9CgogICAgICAuc25hcHMgPiAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMDhzIGVhc2U7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMDhzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgbWFyZ2luOiAxMHB4OwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwoKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIGJhY2tncm91bmQtY29sb3IsIGJvcmRlcjsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGJhY2tncm91bmQtY29sb3IsIGJvcmRlcjsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgfQoKICAgICAgLmV4cGFuZDpub3QoLnBpbikgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS41KTsKICAgICAgfQoKICAgICAgLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgIH0KCiAgICAgIC5waW4gPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xM3B4OwogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCUgNTAlIDUwJSAwOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSwKICAgICAgLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gLjE4cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIC4xOHMgZWFzZTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjE4cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIC4xOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnBpbi5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMSkgdHJhbnNsYXRlKDE3cHgsIC0xN3B4KTsKICAgICAgfQoKICAgICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6IGF0dHIodmFsdWUpOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTZweDsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZm9udC1jb2xvciwgI2ZmZik7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICB9CgogICAgICAucGluLmV4cGFuZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlKDAsIC0xN3B4KTsKICAgICAgfQoKICAgICAgLyogcGFwZXItaW5wdXQgKi8KICAgICAgLnNsaWRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDUwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgICB9OwogICAgICAgIEBhcHBseSAtLXBhcGVyLXNsaWRlci1pbnB1dDsKICAgICAgfQoKICAgICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KICAgICAgI3NsaWRlckNvbnRhaW5lci5kaXNhYmxlZCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5kaXNhYmxlZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWtub2ItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWtub2ItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAuNzUsIDAuNzUsIDEpOwogICAgICB9CgogICAgICAuZGlzYWJsZWQucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJzbGlkZXJDb250YWluZXIiIGNsYXNzJD0iW1tfZ2V0Q2xhc3NOYW1lcyhkaXNhYmxlZCwgcGluLCBzbmFwcywgaW1tZWRpYXRlVmFsdWUsIG1pbiwgZXhwYW5kLCBkcmFnZ2luZywgdHJhbnNpdGluZywgZWRpdGFibGUpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJiYXItY29udGFpbmVyIj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGlkPSJzbGlkZXJCYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSIgc3RlcD0iW1tzdGVwXV0iIHZhbHVlPSJbW2ltbWVkaWF0ZVZhbHVlXV0iIHNlY29uZGFyeS1wcm9ncmVzcz0iW1tzZWNvbmRhcnlQcm9ncmVzc11dIiBvbi1kb3duPSJfYmFyZG93biIgb24tdXA9Il9yZXNldEtub2IiIG9uLXRyYWNrPSJfYmFydHJhY2siIG9uLXRhcD0iX2JhcmNsaWNrIj4KICAgICAgICA8L3BhcGVyLXByb2dyZXNzPgogICAgICA8L2Rpdj4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzbmFwc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbWFya2VycyI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21hcmtlcnNdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXIiPjwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgIDxkaXYgaWQ9InNsaWRlcktub2IiIGNsYXNzPSJzbGlkZXIta25vYiIgb24tZG93bj0iX2tub2Jkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9vblRyYWNrIiBvbi10cmFuc2l0aW9uZW5kPSJfa25vYlRyYW5zaXRpb25FbmQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWtub2ItaW5uZXIiIHZhbHVlJD0iW1tpbW1lZGlhdGVWYWx1ZV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZWRpdGFibGVdXSI+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0iaW5wdXQiIHR5cGU9Im51bWJlciIgc3RlcD0iW1tzdGVwXV0iIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBjbGFzcz0ic2xpZGVyLWlucHV0IiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgb24tY2hhbmdlPSJfY2hhbmdlVmFsdWUiIG9uLWtleWRvd249Il9pbnB1dEtleURvd24iIG5vLWxhYmVsLWZsb2F0PgogICAgICA8L3BhcGVyLWlucHV0PgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItc2xpZGVyL3BhcGVyLXNsaWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zbGlkZXIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25SYW5nZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzbmFwczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0scGluOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxzZWNvbmRhcnlQcm9ncmVzczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWNvbmRhcnlQcm9ncmVzc0NoYW5nZWQifSxlZGl0YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbW1lZGlhdGVWYWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMCxub3RpZnk6ITB9LG1heE1hcmtlcnM6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxleHBhbmQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sCmlnbm9yZUJhclRvdWNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRyYWdnaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFuc2l0aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9LG1hcmtlcnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlS25vYih2YWx1ZSwgbWluLCBtYXgsIHNuYXBzLCBzdGVwKSIsIl92YWx1ZUNoYW5nZWQodmFsdWUpIiwiX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZChpbW1lZGlhdGVWYWx1ZSkiLCJfdXBkYXRlTWFya2VycyhtYXhNYXJrZXJzLCBtaW4sIG1heCwgc25hcHMpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InNsaWRlciIsdGFiaW5kZXg6MH0sa2V5QmluZGluZ3M6e2xlZnQ6Il9sZWZ0S2V5IixyaWdodDoiX3JpZ2h0S2V5IiwiZG93biBwYWdlZG93biBob21lIjoiX2RlY3JlbWVudEtleSIsInVwIHBhZ2V1cCBlbmQiOiJfaW5jcmVtZW50S2V5In0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmVCYXJUb3VjaCYmUG9seW1lci5HZXN0dXJlcy5zZXRUb3VjaEFjdGlvbih0aGlzLiQuc2xpZGVyQmFyLCJhdXRvIil9LGluY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlK3RoaXMuc3RlcCl9LGRlY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlLXRoaXMuc3RlcCl9LF91cGRhdGVLbm9iOmZ1bmN0aW9uKGEsYyxkKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1pbiIsYyk7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtYXgiLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbm93IixhKTt0aGlzLl9wb3NpdGlvbktub2IoMTAwKnRoaXMuX2NhbGNSYXRpbyhhKSl9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoInZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9pbW1lZGlhdGVWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRyYWdnaW5nPwp0aGlzLmZpcmUoImltbWVkaWF0ZS12YWx1ZS1jaGFuZ2UiLHtjb21wb3NlZDohMH0pOnRoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZX0sX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnNlY29uZGFyeVByb2dyZXNzKX0sX2V4cGFuZEtub2I6ZnVuY3Rpb24oKXt0aGlzLl9zZXRFeHBhbmQoITApfSxfcmVzZXRLbm9iOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoImV4cGFuZEtub2IiKTt0aGlzLl9zZXRFeHBhbmQoITEpfSxfcG9zaXRpb25Lbm9iOmZ1bmN0aW9uKGEpe3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24oYSkpKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMuaW1tZWRpYXRlVmFsdWUpKTt0aGlzLiQuc2xpZGVyS25vYi5zdHlsZS5sZWZ0PXRoaXMucmF0aW8rIiUiO3RoaXMuZHJhZ2dpbmcmJgoodGhpcy5fa25vYnN0YXJ0eD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwLHRoaXMudHJhbnNsYXRlM2QoMCwwLDAsdGhpcy4kLnNsaWRlcktub2IpKX0sX2NhbGNLbm9iUG9zaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuKHRoaXMubWF4LXRoaXMubWluKSphLzEwMCt0aGlzLm1pbn0sX29uVHJhY2s6ZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKTtzd2l0Y2goYS5kZXRhaWwuc3RhdGUpe2Nhc2UgInN0YXJ0Ijp0aGlzLl90cmFja1N0YXJ0KGEpO2JyZWFrO2Nhc2UgInRyYWNrIjp0aGlzLl90cmFja1goYSk7YnJlYWs7Y2FzZSAiZW5kIjp0aGlzLl90cmFja0VuZCgpfX0sX3RyYWNrU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXRUcmFuc2l0aW5nKCExKTt0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7dGhpcy5fa25vYnN0YXJ0eD10aGlzLl9zdGFydHg9dGhpcy5feD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwO3RoaXMuX21pbng9LXRoaXMuX3N0YXJ0eDt0aGlzLl9tYXh4PQp0aGlzLl93LXRoaXMuX3N0YXJ0eDt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpO3RoaXMuX3NldERyYWdnaW5nKCEwKX0sX3RyYWNrWDpmdW5jdGlvbihhKXt0aGlzLmRyYWdnaW5nfHx0aGlzLl90cmFja1N0YXJ0KGEpO3RoaXMuX3g9dGhpcy5fc3RhcnR4K01hdGgubWluKHRoaXMuX21heHgsTWF0aC5tYXgodGhpcy5fbWlueCxhLmRldGFpbC5keCoodGhpcy5faXNSVEw/LTE6MSkpKTt0aGlzLl9zZXRJbW1lZGlhdGVWYWx1ZSh0aGlzLl9jYWxjU3RlcCh0aGlzLl9jYWxjS25vYlBvc2l0aW9uKHRoaXMuX3gvdGhpcy5fdyoxMDApKSk7dGhpcy50cmFuc2xhdGUzZCh0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkqdGhpcy5fdy10aGlzLl9rbm9ic3RhcnR4KyJweCIsMCwwLHRoaXMuJC5zbGlkZXJLbm9iKX0sX3RyYWNrRW5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLnNsaWRlcktub2Iuc3R5bGU7dGhpcy4kLnNsaWRlcktub2IuY2xhc3NMaXN0LnJlbW92ZSgiZHJhZ2dpbmciKTsKdGhpcy5fc2V0RHJhZ2dpbmcoITEpO3RoaXMuX3Jlc2V0S25vYigpO3RoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZTthLnRyYW5zZm9ybT1hLndlYmtpdFRyYW5zZm9ybT0iIjt0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9rbm9iZG93bjpmdW5jdGlvbihhKXt0aGlzLl9leHBhbmRLbm9iKCk7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuZm9jdXMoKX0sX2JhcnRyYWNrOmZ1bmN0aW9uKGEpe3RoaXMuX2FsbG93QmFyRXZlbnQoYSkmJnRoaXMuX29uVHJhY2soYSl9LF9iYXJjbGljazpmdW5jdGlvbihhKXt0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7dmFyIGM9dGhpcy4kLnNsaWRlckJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjPShhLmRldGFpbC54LWMubGVmdCkvdGhpcy5fdyoxMDA7dGhpcy5faXNSVEwmJihjPTEwMC1jKTt2YXIgZD10aGlzLnJhdGlvO3RoaXMuX3NldFRyYW5zaXRpbmcoITApO3RoaXMuX3Bvc2l0aW9uS25vYihjKTsKZD09PXRoaXMucmF0aW8mJnRoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9KTthLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFyZG93bjpmdW5jdGlvbihhKXt0aGlzLl9hbGxvd0JhckV2ZW50KGEpJiYodGhpcy5kZWJvdW5jZSgiZXhwYW5kS25vYiIsdGhpcy5fZXhwYW5kS25vYiw2MCksdGhpcy5fYmFyY2xpY2soYSkpfSxfa25vYlRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PT10aGlzLiQuc2xpZGVyS25vYiYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSl9LF91cGRhdGVNYXJrZXJzOmZ1bmN0aW9uKGEsYyxkLGYpe2Z8fHRoaXMuX3NldE1hcmtlcnMoW10pO2M9TWF0aC5yb3VuZCgoZC1jKS90aGlzLnN0ZXApO2M+YSYmKGM9YSk7aWYoMD5jfHwhaXNGaW5pdGUoYykpYz0wO3RoaXMuX3NldE1hcmtlcnMoQXJyYXkoYykpfSxfbWVyZ2VDbGFzc2VzOmZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3Qua2V5cyhhKS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGFbY119KS5qb2luKCIgIil9LApfZ2V0Q2xhc3NOYW1lczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tZXJnZUNsYXNzZXMoe2Rpc2FibGVkOnRoaXMuZGlzYWJsZWQscGluOnRoaXMucGluLHNuYXBzOnRoaXMuc25hcHMscmluZzp0aGlzLmltbWVkaWF0ZVZhbHVlPD10aGlzLm1pbixleHBhbmQ6dGhpcy5leHBhbmQsZHJhZ2dpbmc6dGhpcy5kcmFnZ2luZyx0cmFuc2l0aW5nOnRoaXMudHJhbnNpdGluZyxlZGl0YWJsZTp0aGlzLmVkaXRhYmxlfSl9LF9hbGxvd0JhckV2ZW50OmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmlnbm9yZUJhclRvdWNofHxhLmRldGFpbC5zb3VyY2VFdmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnR9LGdldCBfaXNSVEwoKXt2b2lkIDA9PT10aGlzLl9faXNSVEwmJih0aGlzLl9faXNSVEw9InJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3JldHVybiB0aGlzLl9faXNSVEx9LF9sZWZ0S2V5OmZ1bmN0aW9uKGEpe3RoaXMuX2lzUlRMP3RoaXMuX2luY3JlbWVudEtleShhKToKdGhpcy5fZGVjcmVtZW50S2V5KGEpfSxfcmlnaHRLZXk6ZnVuY3Rpb24oYSl7dGhpcy5faXNSVEw/dGhpcy5fZGVjcmVtZW50S2V5KGEpOnRoaXMuX2luY3JlbWVudEtleShhKX0sX2luY3JlbWVudEtleTpmdW5jdGlvbihhKXt0aGlzLmRpc2FibGVkfHwoImVuZCI9PT1hLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1heDp0aGlzLmluY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYS5wcmV2ZW50RGVmYXVsdCgpKX0sX2RlY3JlbWVudEtleTpmdW5jdGlvbihhKXt0aGlzLmRpc2FibGVkfHwoImhvbWUiPT09YS5kZXRhaWwua2V5P3RoaXMudmFsdWU9dGhpcy5taW46dGhpcy5kZWNyZW1lbnQoKSx0aGlzLmZpcmUoImNoYW5nZSIpLGEucHJldmVudERlZmF1bHQoKSl9LF9jaGFuZ2VWYWx1ZTpmdW5jdGlvbihhKXt0aGlzLnZhbHVlPWEudGFyZ2V0LnZhbHVlO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2lucHV0S2V5RG93bjpmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSwKX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3RoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQuc2xpZGVyS25vYjtyZXR1cm4gUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbC5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyl9LF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihhKXthJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuc3R5bGUuZGlzcGxheT1hPyIiOiJub25lIix0aGlzLl9yaXBwbGUuaG9sZERvd249YSl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNtb290aGluZy1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPGgzIGNsYXNzPSJ0aXRsZSI+U21vb3RoaW5nPC9oMz4KICAgIDxkaXYgY2xhc3M9InNtb290aGluZy1ibG9jayI+CiAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InNsaWRlciIgaW1tZWRpYXRlLXZhbHVlPSJ7e19pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcn19IiBtYXg9IltbbWF4XV0iIG1pbj0iW1ttaW5dXSIgcGluIHN0ZXA9Iltbc3RlcF1dIiB0eXBlPSJudW1iZXIiIHZhbHVlPSJ7e3dlaWdodH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgbGFiZWw9IndlaWdodCIgbm8tbGFiZWwtZmxvYXQgdmFsdWU9Int7X2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dH19IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnNtb290aGluZy1ibG9jayB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgZmxleC1ncm93OiAyOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLXNjYWxhci1kYXNoYm9hcmQvdGYtc21vb3RoaW5nLWlucHV0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNtb290aGluZy1pbnB1dCIscHJvcGVydGllczp7c3RlcDpOdW1iZXIsbWF4Ok51bWJlcixtaW46TnVtYmVyLHdlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6LjYsbm90aWZ5OiEwfSxfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXI6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCxvYnNlcnZlcjoiX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyQ2hhbmdlZCJ9LF9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ6e3R5cGU6U3RyaW5nLG5vdGlmeTohMCxvYnNlcnZlcjoiX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dENoYW5nZWQifX0sX3VwZGF0ZVdlaWdodDpfLmRlYm91bmNlKGZ1bmN0aW9uKGEpe3RoaXMud2VpZ2h0PWF9LDI1MCksX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD10aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlci50b1N0cmluZygpOwp0aGlzLl91cGRhdGVXZWlnaHQuY2FsbCh0aGlzLHRoaXMuX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyKX0sX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dENoYW5nZWQ6ZnVuY3Rpb24oKXswPit0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ/dGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PSIwIjoxPCt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQmJih0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9IjEiKTt2YXIgYT0rdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0O2lzTmFOKGEpfHx0aGlzLl91cGRhdGVXZWlnaHQuY2FsbCh0aGlzLGEpfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtc2NhbGFyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggaWQ9InNob3ctZG93bmxvYWQtbGlua3MiIGNoZWNrZWQ9Int7X3Nob3dEb3dubG9hZExpbmtzfX0iPlNob3cgZGF0YSBkb3dubG9hZCBsaW5rczwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBpZD0iaWdub3JlLXktb3V0bGllciIgY2hlY2tlZD0ie3tfaWdub3JlWU91dGxpZXJzfX0iPklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBpZD0idG9vbHRpcC1zb3J0aW5nIj4KICAgICAgICAgICAgPGRpdj5Ub29sdGlwIHNvcnRpbmcgbWV0aG9kOjwvZGl2PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e190b29sdGlwU29ydGluZ01ldGhvZH19Ij4KICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9IjAiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVmYXVsdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5hc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5uZWFyZXN0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1zbW9vdGhpbmctaW5wdXQgd2VpZ2h0PSJ7e19zbW9vdGhpbmdXZWlnaHR9fSIgc3RlcD0iMC4wMDEiIG1pbj0iMCIgbWF4PSIwLjk5OSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gc2NhbGFyIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHNjYWxhciBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1zY2FsYXItY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIGRhdGEtdG8tbG9hZD0iW1tpdGVtLnNlcmllc11dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tfaWdub3JlWU91dGxpZXJzXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19nZXRNdWx0aUV4cGVyaW1lbnRzKGRhdGFTZWxlY3Rpb24pXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoY2F0ZWdvcnksIF9ydW5Ub1RhZ0luZm8sIGl0ZW0pXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW190b29sdGlwU29ydGluZ01ldGhvZF1dIiB4LXR5cGU9IltbX3hUeXBlXV0iPjwvdGYtc2NhbGFyLWNhcmQ+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmcgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNjYWxhci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zaG93RG93bmxvYWRMaW5rczp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpWbC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSxfc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6VmwuZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxvYnNlcnZlcjoiX3Ntb290aGluZ1dlaWdodE9ic2VydmVyIn0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKF9zbW9vdGhpbmdXZWlnaHQpIn0sX2lnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOlZsLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX2lnbm9yZVlPdXRsaWVycyIsCntkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9pZ25vcmVZT3V0bGllcnNPYnNlcnZlciJ9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6Ym0uWFR5cGUuU1RFUH0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLlJlcXVlc3RNYW5hZ2VyKDUwKX19LGJlaGF2aW9yczpbV2wuQXJyYXlVcGRhdGVIZWxwZXJdLG9ic2VydmVyczpbIl91cGRhdGVDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIl0sX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXI6VmwuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLAp7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlcjpWbC5nZXROdW1iZXJPYnNlcnZlcigiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLF9pZ25vcmVZT3V0bGllcnNPYnNlcnZlcjpWbC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKGEpe3JldHVybiAwPGF9LF9nZXRDYXRlZ29yeUtleShhKXtyZXR1cm4gYS5tZXRhZGF0YS50eXBlPT1Ray5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFM/IiI6YS5uYW1lfSxfc2hvdWxkT3BlbihhKXtyZXR1cm4gMj49YX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkQ2hhcnRzKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGE9UGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLAoiL3RhZ3MiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe2V4cGVyaW1lbnQ6UGsuZ2V0RXhwZXJpbWVudElkKCl9KSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57aWYoIV8uaXNFcXVhbChjLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBkPV8ubWFwVmFsdWVzKGMsZj0+T2JqZWN0LmtleXMoZikpO2Q9UGsuZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYT0+e2EucmVsb2FkKCl9KX0sX3VwZGF0ZUNhdGVnb3JpZXMoYSxjLGQpe2E9Xy5tYXBWYWx1ZXMoYSxnPT5PYmplY3Qua2V5cyhnKSk7Yz1Ray5jYXRlZ29yaXplVGFncyhhLGMsZCk7CmNvbnN0IGY9UGsuZ2V0RXhwZXJpbWVudElkKCk7Yy5mb3JFYWNoKGc9PntnLml0ZW1zPWcuaXRlbXMubWFwKGw9Pih7dGFnOmwudGFnLHNlcmllczpsLnJ1bnMubWFwKGs9Pih7cnVuOmssdGFnOmwudGFnLGV4cGVyaW1lbnQ6Zn0pKX0pKX0pO3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfY2F0ZWdvcmllcyIsYyx0aGlzLl9nZXRDYXRlZ29yeUtleSl9LF90YWdNZXRhZGF0YShhLGMsZCl7Y29uc3QgZj1kLnRhZyxnPXt9O2Quc2VyaWVzLmZvckVhY2goKHtydW46bX0pPT57Z1ttXT1jW21dW2ZdfSk7ZD1mLnJlcGxhY2UoL1wvc2NhbGFyX3N1bW1hcnkkLywiIik7bGV0IHtkZXNjcmlwdGlvbjpsLGRpc3BsYXlOYW1lOmt9PWFtLmFnZ3JlZ2F0ZVRhZ0luZm8oZyxkKTthLm1ldGFkYXRhLnR5cGU9PVFrLkNhdGVnb3J5VHlwZS5QUkVGSVhfR1JPVVAmJmsuc3RhcnRzV2l0aChhLm5hbWUrIi8iKSYmKGs9ay5zbGljZShhLm5hbWUubGVuZ3RoKzEpKTtyZXR1cm57ZGVzY3JpcHRpb246bCxkaXNwbGF5TmFtZTprfX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweCAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtdG9wOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZm9udC1zaXplOiAxOXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1oZWxwZXJzLmpzCnZhciBnbTsKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZixnLGwsayxtKXt0aGlzLnJ1bj1mO3RoaXMudGFnPWc7dGhpcy5uYW1lPWw7dGhpcy5zY2FsYXJEYXRhPWs7dGhpcy5zeW1ib2w9bX1nZXROYW1lKCl7cmV0dXJuIHRoaXMubmFtZX1zZXREYXRhKGYpe3RoaXMuc2NhbGFyRGF0YT1mfWdldERhdGEoKXtyZXR1cm4gdGhpcy5zY2FsYXJEYXRhfWdldFJ1bigpe3JldHVybiB0aGlzLnJ1bn1nZXRUYWcoKXtyZXR1cm4gdGhpcy50YWd9Z2V0U3ltYm9sKCl7cmV0dXJuIHRoaXMuc3ltYm9sfX1hLkRhdGFTZXJpZXM9YzthLmdlbmVyYXRlRGF0YVNlcmllc05hbWU9ZnVuY3Rpb24oZixnKXtyZXR1cm5gJHtnfSAoJHtmfSlgfTtjbGFzcyBke2NvbnN0cnVjdG9yKGYpe3RoaXMucnVuQmFzZWRDb2xvclNjYWxlPWZ9c2NhbGUoZil7cmV0dXJuIHRoaXMucnVuQmFzZWRDb2xvclNjYWxlLnNjYWxlKHRoaXMucGFyc2VSdW5OYW1lKGYpKX1wYXJzZVJ1bk5hbWUoZil7cmV0dXJuKGY9Zi5tYXRjaCgvXCgoLiopXCkkLykpPwpmWzFdOiIifX1hLkRhdGFTZXJpZXNDb2xvclNjYWxlPWR9KShnbXx8KGdtPXt9KSk7Cjwvc2NyaXB0PgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyBkaXNwbGF5LW5hbWU9IltbX3RpdGxlRGlzcGxheVN0cmluZ11dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgaWQ9ImxvYWRlciIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIiBkYXRhLXNlcmllcz0iW1tfc2VyaWVzTmFtZXNdXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbX2RhdGFVcmxdXSIgZmlsbC1hcmVhPSJbW19maWxsQXJlYV1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIgbG9hZC1rZXk9IltbX3RhZ0ZpbHRlcl1dIiBkYXRhLXRvLWxvYWQ9IltbcnVuc11dIiBsb2ctc2NhbGUtYWN0aXZlPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24obWFyZ2luQ2hhcnRTZXJpZXMpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzeW1ib2wtZnVuY3Rpb249IltbX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCldXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InNlcmllcyB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkfX0iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9ImRhdGFTZXJpZXNOYW1lIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2RhdGFTZXJpZXNOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5DU1Y8L2E+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+SlNPTjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19taXNzaW5nVGFncy5sZW5ndGhdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbGxhcHNpYmxlLWxpc3QtdGl0bGUiPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJbW19nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQpXV0iIG9uLWNsaWNrPSJfdG9nZ2xlTWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW4iIGNsYXNzPSJ0b2dnbGUtY29sbGFwc2libGUtYnV0dG9uIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsYXBzaWJsZS10aXRsZS10ZXh0Ij4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPiBNaXNzaW5nIFRhZ3MKICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWRdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19taXNzaW5nVGFnc11dIiBhcz0ibWlzc2luZ0VudHJ5Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWlzc2luZy10YWdzLWZvci1ydW4tY29udGFpbmVyIj4KICAgICAgICAgICAgICBSdW4gIltbbWlzc2luZ0VudHJ5LnJ1bl1dIiBsYWNrcyBkYXRhIGZvciB0YWdzCiAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1ttaXNzaW5nRW50cnkudGFnc11dIiBhcz0idGFnIj4KICAgICAgICAgICAgICAgICAgPGxpPltbdGFnXV08L2xpPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvdGVtcGxhdGU+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW190YWdGaWx0ZXJJbnZhbGlkXV0iPgogICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+CiAgICAgICAgVGhpcyByZWd1bGFyIGV4cHJlc2lvbiBpcyBpbnZhbGlkOjxicj4KICAgICAgICA8c3BhbiBjbGFzcz0iaW52YWxpZC1yZWdleCI+W1tfdGFnRmlsdGVyXV08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N0ZXBzTWlzbWF0Y2hdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICBUaGUgc3RlcHMgZm9yIHZhbHVlLCBsb3dlciwgYW5kIHVwcGVyIHRhZ3MgZG8gbm90IG1hdGNoOgogICAgICAgIDx1bD4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC52YWx1ZV1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLnZhbHVlU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QubG93ZXJdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC5sb3dlclN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0LnVwcGVyXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gudXBwZXJTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJbW19nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oX21hdGNoZXNMaXN0T3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZU1hdGNoZXNPcGVuIiBjbGFzcz0idG9nZ2xlLW1hdGNoZXMtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxhcHNpYmxlLXRpdGxlLXRleHQiPgogICAgICAgICAgTWF0Y2hlcyAoW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0pCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJzZXJpZXNOYW1lIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRjaC1saXN0LWVudHJ5IiBzdHlsZT0iY29sb3I6IFtbX2RldGVybWluZUNvbG9yKF9jb2xvclNjYWxlLCBzZXJpZXNOYW1lKV1dOyI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmVycm9yLWNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6ICNmMDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIG1hcmdpbjogMTBweCAwIDAgMDsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CgogICAgICAuZXJyb3ItaWNvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBtYXJnaW46IDAgYXV0byA1cHggYXV0bzsKICAgICAgfQoKICAgICAgLmludmFsaWQtcmVnZXggewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuZXJyb3ItY29udGVudCB1bCB7CiAgICAgICAgbWFyZ2luOiAxcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTlweDsKICAgICAgfQoKICAgICAgLnRhZy1uYW1lIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLWxpc3QtdGl0bGUgewogICAgICAgIG1hcmdpbjogMTBweCAwIDVweCAwOwogICAgICB9CgogICAgICAuY29sbGFwc2libGUtdGl0bGUtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgI21hdGNoZXMtbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLm1hdGNoLWxpc3QtZW50cnkgewogICAgICAgIG1hcmdpbjogMCAwIDVweCAwOwogICAgICB9CgogICAgICAubWF0Y2gtZW50cnktc3ltYm9sIHsKICAgICAgICBmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAubWlzc2luZy10YWdzLWZvci1ydW4tY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDhweCAwIDAgMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSx0aXRsZTpTdHJpbmcsbWFyZ2luQ2hhcnRTZXJpZXM6QXJyYXksaWdub3JlWU91dGxpZXJzOkJvb2xlYW4scmVxdWVzdE1hbmFnZXI6T2JqZWN0LHNob3dEb3dubG9hZExpbmtzOkJvb2xlYW4sdGFnTWV0YWRhdGE6T2JqZWN0LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6bmV3IGdtLkRhdGFTZXJpZXNDb2xvclNjYWxlKHtzY2FsZTpabC5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIobWFyZ2luQ2hhcnRTZXJpZXMpIn0sX3RhZ0ZpbHRlckludmFsaWQ6Qm9vbGVhbixfbmFtZVRvRGF0YVNlcmllczp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfc2VyaWVzTmFtZXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNlcmllc05hbWVzKF9uYW1lVG9EYXRhU2VyaWVzLCBydW5zKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2xvZ1NjYWxlQWN0aXZlOkJvb2xlYW4sX2RhdGFVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYT0+e2NvbnN0IGM9dGhpcy5fdGFnRmlsdGVyO3JldHVybiBQay5hZGRQYXJhbXMoUGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKSx7dGFnOmMscnVuOmF9KX19fSxfcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfbWF0Y2hlc0xpc3RPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3RpdGxlRGlzcGxheVN0cmluZzp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKHRpdGxlKSJ9LApfZmlsbEFyZWE6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOntsb3dlckFjY2Vzc29yOmE9PmEubG93ZXIsaGlnaGVyQWNjZXNzb3I6YT0+YS51cHBlcn19LF90b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGE9Ym0ubXVsdGlzY2FsZUZvcm1hdHRlcihibS5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTiksYz1kPT5pc05hTihkKT8iTmFOIjphKGQpO3JldHVyblt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmQ9PmQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiVmFsdWUiLGV2YWx1YXRlOmQ9PmMoZC5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6Ikxvd2VyIE1hcmdpbiIsZXZhbHVhdGU6ZD0+YyhkLmRhdHVtLmxvd2VyKX0se3RpdGxlOiJVcHBlciBNYXJnaW4iLGV2YWx1YXRlOmQ9PmMoZC5kYXR1bS51cHBlcil9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6ZD0+Ym0uc3RlcEZvcm1hdHRlcihkLmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLApldmFsdWF0ZTpkPT5ibS50aW1lRm9ybWF0dGVyKGQuZGF0dW0ud2FsbF90aW1lKX0se3RpdGxlOiJSZWxhdGl2ZSIsZXZhbHVhdGU6ZD0+Ym0ucmVsYXRpdmVGb3JtYXR0ZXIoYm0ucmVsYXRpdmVBY2Nlc3NvcihkLmRhdHVtLC0xLGQuZGF0YXNldCkpfV19fSxfbWlzc2luZ1RhZ3M6e3R5cGU6QXJyYXksdmFsdWU6W119LF9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zdGVwc01pc21hdGNoOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZUNoYXJ0KF9uYW1lVG9EYXRhU2VyaWVzKSIsIl9yZWZyZXNoRGF0YVNlcmllcyhfdGFnRmlsdGVyKSJdLHJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJC5sb2FkZXIucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsCiF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGE9dGhpcy4kLmxvYWRlcjthJiZhLnJlc2V0RG9tYWluKCl9LF9jc3ZVcmwoYSxjKXtpZighYylyZXR1cm4iIjthPXRoaXMuX2Rvd25sb2FkRGF0YVVybChhLGMpO3JldHVybiBQay5hZGRQYXJhbXMoYSx7Zm9ybWF0OiJjc3YifSl9LF9qc29uVXJsKGEsYyl7aWYoIWMpcmV0dXJuIiI7YT10aGlzLl9kb3dubG9hZERhdGFVcmwoYSxjKTtyZXR1cm4gUGsuYWRkUGFyYW1zKGEse2Zvcm1hdDoianNvbiJ9KX0sX2Rvd25sb2FkRGF0YVVybChhLGMpe2E9YVtjXTthPXt0YWc6YS5nZXRUYWcoKSxydW46YS5nZXRSdW4oKX07cmV0dXJuIFBrLmFkZFBhcmFtcyhQay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGEpfSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbihhKXtyZXR1cm4oYyxkLGYpPT57aWYoZi5yZWdleF92YWxpZCl7dmFyIGc9Xy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKSwKbD1bXTtfLmZvckVhY2goYSxrPT57dmFyIG09ITEscD1mLnRhZ190b19ldmVudHNbay52YWx1ZV07Y29uc3QgcT1mLnRhZ190b19ldmVudHNbay5sb3dlcl0scj1mLnRhZ190b19ldmVudHNbay51cHBlcl07Xy5pc1VuZGVmaW5lZChwKSYmKGwucHVzaChrLnZhbHVlKSxtPSEwKTtfLmlzVW5kZWZpbmVkKHEpJiYobC5wdXNoKGsubG93ZXIpLG09ITApO18uaXNVbmRlZmluZWQocikmJihsLnB1c2goay51cHBlciksbT0hMCk7aWYoIW0pe3ZhciB0PXk9PnlbMV07aWYobT10aGlzLl9maW5kU3RlcE1pc21hdGNoKGsscC5tYXAodCkscS5tYXAodCksci5tYXAodCkpKXRoaXMuc2V0KCJfc3RlcHNNaXNtYXRjaCIsbSk7ZWxzZXt2YXIgdj15PT55WzJdO209cC5tYXAoKHkseCk9Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMyp5WzBdKSxzdGVwOnQoeSksc2NhbGFyOnYoeSksbG93ZXI6dihxW3hdKSx1cHBlcjp2KHJbeF0pfSkpO3A9Z20uZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZShkLGsudmFsdWUpOwp2YXIgQT1nW3BdO0E/QS5zZXREYXRhKG0pOihrPXRoaXMuX2NyZWF0ZU5ld0RhdGFTZXJpZXMoZCxrLnZhbHVlLHAsbSksZ1twXT1rKX19fSk7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIixnKTtjPV8uZmluZEluZGV4KHRoaXMuX21pc3NpbmdUYWdzLGs9PmsucnVuPT09ZCk7aWYobC5sZW5ndGgmJjMhPWwubGVuZ3RoKXtjb25zdCBrPXtydW46ZCx0YWdzOmx9OzA8PWM/dGhpcy5zcGxpY2UoIl9taXNzaW5nVGFncyIsYywxLGspOnRoaXMucHVzaCgiX21pc3NpbmdUYWdzIixrKX1lbHNlIDA8PWMmJnRoaXMuc3BsaWNlKCJfbWlzc2luZ1RhZ3MiLGMsMSl9ZWxzZSB0aGlzLnNldCgiX3RhZ0ZpbHRlckludmFsaWQiLCEwKX19LF9maW5kU3RlcE1pc21hdGNoKGEsYyxkLGYpe3JldHVybiBfLmlzRXF1YWwoZCxjKSYmXy5pc0VxdWFsKGYsYyk/bnVsbDp7c2VyaWVzT2JqZWN0OmEsdmFsdWVTdGVwczpjLGxvd2VyU3RlcHM6ZCx1cHBlclN0ZXBzOmZ9fSxfY3JlYXRlTmV3RGF0YVNlcmllcyhhLApjLGQsZil7dGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYV18PTA7Yz1uZXcgZ20uRGF0YVNlcmllcyhhLGMsZCxmLGJtLlNZTUJPTFNfTElTVFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFthXV0pO3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2FdPSh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFthXSsxKSVibS5TWU1CT0xTX0xJU1QubGVuZ3RoO3JldHVybiBjfSxfdXBkYXRlQ2hhcnQoYSl7Xy5mb3JPd24oYSxjPT57dGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKGMuZ2V0TmFtZSgpLGMuZ2V0RGF0YSgpKX0pfSxfY29tcHV0ZVNlcmllc05hbWVzKCl7Y29uc3QgYT1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoWyxjXSk9PmEuaGFzKGMucnVuKSkubWFwKChbY10pPT5jKX0sX2RldGVybWluZUNvbG9yKGEsYyl7cmV0dXJuIGEuc2NhbGUoYyl9LApfcmVmcmVzaERhdGFTZXJpZXMoKXt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLHt9KX0sX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCl7cmV0dXJuIGE9PnRoaXMuX25hbWVUb0RhdGFTZXJpZXNbYV0uZ2V0U3ltYm9sKCkubWV0aG9kKCl9LF9kZXRlcm1pbmVTeW1ib2woYSxjKXtyZXR1cm4gYVtjXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9LF9jb21wdXRlVGFnRmlsdGVyKGEpe3JldHVybiBfLmZsYXR0ZW4oYS5tYXAoYz0+W2MudmFsdWUsYy5sb3dlcixjLnVwcGVyXSkpLm1hcChjPT4iKCIrdGhpcy5fZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKGMpKyIpIikuam9pbigifCIpfSxfZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKGEpe3JldHVybiBhLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCRceDI2Iil9LF9nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwKIXRoaXMuX21hdGNoZXNMaXN0T3BlbmVkKX0sX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcoYSl7cmV0dXJuIGF8fCJ1bnRpdGxlZCJ9LF9zZXBhcmF0ZVdpdGhDb21tYXMoYSl7cmV0dXJuIGEuam9pbigiLCAiKX0sX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuKCl7dGhpcy5zZXQoIl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkIiwhdGhpcy5fbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyBkaXNwbGF5LW5hbWU9IltbX3RpdGxlRGlzcGxheVN0cmluZ11dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgaWQ9ImxvYWRlciIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIiBkYXRhLXNlcmllcz0iW1tfc2VyaWVzTmFtZXNdXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbX2RhdGFVcmxdXSIgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iIGxvYWQta2V5PSJbW190YWdGaWx0ZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIHNtb290aGluZy1lbmFibGVkPSJbW3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIgc3ltYm9sLWZ1bmN0aW9uPSJbW19jcmVhdGVTeW1ib2xGdW5jdGlvbigpXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSI+CiAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0iZGF0YVNlcmllc05hbWUiPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uY3N2IiBocmVmPSJbW19jc3ZVcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkNTVjwvYT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5qc29uIiBocmVmPSJbW19qc29uVXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5KU09OPC9hPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtYXRjaGVzLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdC10aXRsZSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlTWF0Y2hlc0ljb24oX21hdGNoZXNMaXN0T3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZU1hdGNoZXNPcGVuIiBjbGFzcz0idG9nZ2xlLW1hdGNoZXMtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoZXMtdGV4dCI+CiAgICAgICAgICBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkKICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX21hdGNoZXNMaXN0T3BlbmVkXV0iPgogICAgICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9InNlcmllc05hbWUiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiIHN0eWxlPSJjb2xvcjogW1tfZGV0ZXJtaW5lQ29sb3IoX2NvbG9yU2NhbGUsIHNlcmllc05hbWUpXV07Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaC1lbnRyeS1zeW1ib2wiPgogICAgICAgICAgICAgICAgICBbW19kZXRlcm1pbmVTeW1ib2woX25hbWVUb0RhdGFTZXJpZXMsIHNlcmllc05hbWUpXV0KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIFtbc2VyaWVzTmFtZV1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjbWF0Y2hlcy1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgI21hdGNoZXMtbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLm1hdGNoLWxpc3QtZW50cnkgewogICAgICAgIG1hcmdpbjogMCAwIDVweCAwOwogICAgICB9CgogICAgICAubWF0Y2gtZW50cnktc3ltYm9sIHsKICAgICAgICBmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAubWF0Y2hlcy10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH0sdGl0bGU6U3RyaW5nLHRhZ1JlZ2V4ZXM6QXJyYXksaWdub3JlWU91dGxpZXJzOkJvb2xlYW4scmVxdWVzdE1hbmFnZXI6T2JqZWN0LHNob3dEb3dubG9hZExpbmtzOkJvb2xlYW4sc21vb3RoaW5nRW5hYmxlZDpCb29sZWFuLHNtb290aGluZ1dlaWdodDpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6bmV3IGdtLkRhdGFTZXJpZXNDb2xvclNjYWxlKHtzY2FsZTpabC5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIodGFnUmVnZXhlcykifSxfbmFtZVRvRGF0YVNlcmllczp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfc2VyaWVzTmFtZXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNlcmllc05hbWVzKF9uYW1lVG9EYXRhU2VyaWVzLCBydW5zKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2xvZ1NjYWxlQWN0aXZlOkJvb2xlYW4sX2RhdGFVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYT0+e2NvbnN0IGM9dGhpcy5fdGFnRmlsdGVyO3JldHVybiBQay5hZGRQYXJhbXMoUGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKSx7dGFnOmMscnVuOmF9KX19fSxfcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfbWF0Y2hlc0xpc3RPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3RpdGxlRGlzcGxheVN0cmluZzp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKHRpdGxlKSJ9fSwKb2JzZXJ2ZXJzOlsiX3VwZGF0ZUNoYXJ0KF9uYW1lVG9EYXRhU2VyaWVzKSIsIl9yZWZyZXNoRGF0YVNlcmllcyhfdGFnRmlsdGVyKSJdLHJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJC5sb2FkZXIucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX0sX3Jlc2V0RG9tYWluKCl7Y29uc3QgYT10aGlzLiQubG9hZGVyO2EmJmEucmVzZXREb21haW4oKX0sX2NzdlVybChhLGMpe2lmKCFjKXJldHVybiIiO2E9dGhpcy5fZG93bmxvYWREYXRhVXJsKGEsYyk7cmV0dXJuIFBrLmFkZFBhcmFtcyhhLHtmb3JtYXQ6ImNzdiJ9KX0sX2pzb25VcmwoYSxjKXtpZighYylyZXR1cm4iIjthPXRoaXMuX2Rvd25sb2FkRGF0YVVybChhLGMpO3JldHVybiBQay5hZGRQYXJhbXMoYSwKe2Zvcm1hdDoianNvbiJ9KX0sX2Rvd25sb2FkRGF0YVVybChhLGMpe2E9YVtjXTthPXt0YWc6YS5nZXRUYWcoKSxydW46YS5nZXRSdW4oKX07cmV0dXJuIFBrLmFkZFBhcmFtcyhQay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGEpfSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihhLGMsZCk9PntpZihkLnJlZ2V4X3ZhbGlkKXtjb25zdCBmPV8uY2xvbmUodGhpcy5fbmFtZVRvRGF0YVNlcmllcyk7Xy5mb3JPd24oZC50YWdfdG9fZXZlbnRzLChnLGwpPT57Y29uc3Qgaz1nLm1hcChwPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqcFswXSksc3RlcDpwWzFdLHNjYWxhcjpwWzJdfSkpO2c9Z20uZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZShjLGwpO2NvbnN0IG09ZltnXTttP20uc2V0RGF0YShrKTooXy5pc1VuZGVmaW5lZCh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXSkmJih0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXT0KMCksbD1uZXcgZ20uRGF0YVNlcmllcyhjLGwsZyxrLGJtLlNZTUJPTFNfTElTVFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXV0pLGZbZ109bCx0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXT0odGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbY10rMSklYm0uU1lNQk9MU19MSVNULmxlbmd0aCl9KTt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLGYpfX19LF91cGRhdGVDaGFydChhKXtPYmplY3QuZW50cmllcyhhKS5mb3JFYWNoKChbYyxkXSk9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEoYyxkLmdldERhdGEoKSl9KX0sX2NvbXB1dGVTZWxlY3RlZFJ1bnNTZXQoYSl7Y29uc3QgYz17fTtfLmZvckVhY2goYSxkPT57Y1tkXT0xfSk7cmV0dXJuIGN9LF9jb21wdXRlU2VyaWVzTmFtZXMoKXtjb25zdCBhPW5ldyBTZXQodGhpcy5ydW5zKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fbmFtZVRvRGF0YVNlcmllcykuZmlsdGVyKChbLApjXSk9PmEuaGFzKGMucnVuKSkubWFwKChbY10pPT5jKX0sX2RldGVybWluZUNvbG9yKGEsYyl7cmV0dXJuIGEuc2NhbGUoYyl9LF9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfSxfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKXtyZXR1cm4gYT0+dGhpcy5fbmFtZVRvRGF0YVNlcmllc1thXS5nZXRTeW1ib2woKS5tZXRob2QoKX0sX2RldGVybWluZVN5bWJvbChhLGMpe3JldHVybiBhW2NdLmdldFN5bWJvbCgpLmNoYXJhY3Rlcn0sX2NvbXB1dGVUYWdGaWx0ZXIoYSl7cmV0dXJuIDE9PT1hLmxlbmd0aD9hWzBdOmEubWFwKGM9PiIoIitjKyIpIikuam9pbigifCIpfSxfZ2V0VG9nZ2xlTWF0Y2hlc0ljb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwhdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfSxfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyhhKXtyZXR1cm4gYXx8CiJ1bnRpdGxlZCJ9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZy1sYWJlbCI+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNhdGVnb3JpZXMtY29udGFpbmVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5UaGUgY3VzdG9tIHNjYWxhcnMgZGFzaGJvYXJkIGlzIGluYWN0aXZlLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW4ndCBsYWlkIG91dCB0aGUgZGFzaGJvYXJkLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gbGF5IG91dCB0aGUgZGFzaGJvYXJkLCBwYXNzIGEgPGNvZGU+TGF5b3V0PC9jb2RlPiBwcm90b2J1ZmZlcgogICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5zZXRfbGF5b3V0PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLAogICAgICAgICAgICAKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkIGltcG9ydCBzdW1tYXJ5CmZyb20gdGVuc29yYm9hcmQucGx1Z2lucy5jdXN0b21fc2NhbGFyIGltcG9ydCBsYXlvdXRfcGIyCi4uLgojIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgdG8gYmUgcGVyZm9ybWVkIGF0IGV2ZXJ5IHN0ZXAsIHNvIHRoZSBhY3Rpb24gaXMgbm90CiMgdGFrZW4gY2FyZSBvZiBieSBhbiBvcCBpbiB0aGUgZ3JhcGguIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsYXlvdXQgb25jZS4KIyBXZSBvbmx5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbGF5b3V0IG9uY2UgKGluc3RlYWQgb2YgcGVyIHN0ZXApLgpsYXlvdXRfc3VtbWFyeSA9IHN1bW1hcnlfbGliLmN1c3RvbV9zY2FsYXJfcGIobGF5b3V0X3BiMi5MYXlvdXQoCiAgY2F0ZWdvcnk9WwogICAgbGF5b3V0X3BiMi5DYXRlZ29yeSgKICAgICAgdGl0bGU9J2xvc3NlcycsCiAgICAgIGNoYXJ0PVsKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J2xvc3NlcycsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ2xvc3MuKiddLAogICAgICAgICAgICAgICkpLAogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nYmF6JywKICAgICAgICAgICAgICBtYXJnaW49bGF5b3V0X3BiMi5NYXJnaW5DaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICBzZXJpZXM9WwogICAgICAgICAgICAgICAgICBsYXlvdXRfcGIyLk1hcmdpbkNoYXJ0Q29udGVudC5TZXJpZXMoCiAgICAgICAgICAgICAgICAgICAgdmFsdWU9J2xvc3MvYmF6L3NjYWxhcl9zdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICBsb3dlcj0nYmF6X2xvd2VyL2Jhei9zY2FsYXJfc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgdXBwZXI9J2Jhel91cHBlci9iYXovc2NhbGFyX3N1bW1hcnknKSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgKSksCiAgICAgIF0pLAogICAgbGF5b3V0X3BiMi5DYXRlZ29yeSgKICAgICAgdGl0bGU9J3RyaWcgZnVuY3Rpb25zJywKICAgICAgY2hhcnQ9WwogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nd2F2ZSB0cmlnIGZ1bmN0aW9ucycsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ3RyaWdGdW5jdGlvbnMvY29zaW5lJywgcid0cmlnRnVuY3Rpb25zL3NpbmUnXSwKICAgICAgICAgICAgICApKSwKICAgICAgICAgICMgVGhlIHJhbmdlIG9mIHRhbmdlbnQgaXMgZGlmZmVyZW50LiBMZXQncyBnaXZlIGl0IGl0cyBvd24gY2hhcnQuCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSd0YW4nLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcid0cmlnRnVuY3Rpb25zL3RhbmdlbnQnXSwKICAgICAgICAgICAgICApKSwKICAgICAgXSwKICAgICAgIyBUaGlzIGNhdGVnb3J5IHdlIGNhcmUgbGVzcyBhYm91dC4gTGV0J3MgbWFrZSBpdCBpbml0aWFsbHkgY2xvc2VkLgogICAgICBjbG9zZWQ9VHJ1ZSksCiAgXSkpCndyaXRlci5hZGRfc3VtbWFyeShsYXlvdXRfc3VtbWFyeSkKPC9wcmU+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgYXM9ImNoYXJ0IiBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBkaXNhYmxlLXBhZ2luYXRpb24gaW5pdGlhbC1vcGVuZWQ9IltbY2F0ZWdvcnkubWV0YWRhdGEub3BlbmVkXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tdWx0aWxpbmVdXSI+CiAgICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIGFjdGl2ZT0iW1thY3RpdmVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBydW5zPSJbW19zZWxlY3RlZFJ1bnNdXSIgdGl0bGU9IltbY2hhcnQudGl0bGVdXSIgeC10eXBlPSJbW194VHlwZV1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW19zbW9vdGhpbmdXZWlnaHRdXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tfaWdub3JlWU91dGxpZXJzXV0iIHNob3ctZG93bmxvYWQtbGlua3M9IltbX3Nob3dEb3dubG9hZExpbmtzXV0iIHRhZy1yZWdleGVzPSJbW2NoYXJ0Lm11bHRpbGluZS50YWddXSI+PC90Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJ0Lm1hcmdpbl1dIj4KICAgICAgICAgICAgICAgICAgICA8dGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tfaWdub3JlWU91dGxpZXJzXV0iIHNob3ctZG93bmxvYWQtbGlua3M9IltbX3Nob3dEb3dubG9hZExpbmtzXV0iIG1hcmdpbi1jaGFydC1zZXJpZXM9IltbY2hhcnQubWFyZ2luLnNlcmllc11dIj48L3RmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjdG9vbHRpcC1zb3J0aW5nIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgIC5saW5lLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUGsuUmVxdWVzdE1hbmFnZXIoNTApfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLkNhbmNlbGxlcn0sX3NlbGVjdGVkUnVuczpBcnJheSxfc2hvd0Rvd25sb2FkTGlua3M6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6VmwuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyIn0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKF9zbW9vdGhpbmdXZWlnaHQpIn0sX3Ntb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOlZsLmdldE51bWJlckluaXRpYWxpemVyKCJfc21vb3RoaW5nV2VpZ2h0IiwKe2RlZmF1bHRWYWx1ZTouNn0pLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSxfaWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6VmwuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXIifSxfeFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX2xheW91dDpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX2xheW91dCkifSxfb3BlbmVkQ2F0ZWdvcmllczp7dHlwZTpPYmplY3R9LF9hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7Y29uc3QgYT1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpLGM9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9Pgp7ZC5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsIWQudmFsdWUuY3VzdG9tX3NjYWxhcnMpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmV0cmlldmVMYXlvdXRBbmREYXRhKCkpfSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGMpfSxfcmVsb2FkQ2hhcnRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQsIHRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIikuZm9yRWFjaChhPT57YS5yZWxvYWQoKX0pfSxfcmV0cmlldmVMYXlvdXRBbmREYXRhKCl7Y29uc3QgYT1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvbGF5b3V0IiksYz10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwodGhpcy5zZXQoIl9sYXlvdXQiLGQudmFsdWUpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmVsb2FkQ2hhcnRzKCkpfSk7CnRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjKX0sX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXI6VmwuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksX3Ntb290aGluZ1dlaWdodE9ic2VydmVyOlZsLmdldE51bWJlck9ic2VydmVyKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyOlZsLmdldEJvb2xlYW5PYnNlcnZlcigiX2lnbm9yZVlPdXRsaWVycyIse2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoYSl7cmV0dXJuIDA8YX0sX21ha2VDYXRlZ29yaWVzKGEpe2lmKCFhLmNhdGVnb3J5KXJldHVybltdO2xldCBjPSExO3RoaXMuX29wZW5lZENhdGVnb3JpZXN8fChjPSEwLHRoaXMuX29wZW5lZENhdGVnb3JpZXM9e30pO3JldHVybiBhLmNhdGVnb3J5Lm1hcChkPT4Ke2MmJiFkLmNsb3NlZCYmKHRoaXMuX29wZW5lZENhdGVnb3JpZXNbZC50aXRsZV09ITApO3JldHVybntuYW1lOmQudGl0bGUsaXRlbXM6ZC5jaGFydCxtZXRhZGF0YTp7b3BlbmVkOiEhdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tkLnRpdGxlXX19fSl9LF9jYXRlZ29yeU9wZW5lZFRvZ2dsZWQoYSl7YT1hLnRhcmdldDthLm9wZW5lZD90aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2EuY2F0ZWdvcnkubmFtZV09ITA6ZGVsZXRlIHRoaXMuX29wZW5lZENhdGVnb3JpZXNbYS5jYXRlZ29yeS5uYW1lXX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaW1hZ2UtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlc11dIj4KICAgICAgICA8ZGl2PnNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPltbX3RvTG9jYWxlU3RyaW5nKF9zdGVwVmFsdWUpXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCBkYXRldGltZSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudFdhbGxUaW1lXV0iPgogICAgICAgICAgICAgIFtbX2N1cnJlbnRXYWxsVGltZV1dCiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIHJpZ2h0Ij4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shX2lzSW1hZ2VMb2FkaW5nXV0iPgogICAgICAgICAgICA8L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU3RlcHNdXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KCiAgICAKICAgIDxhIGlkPSJtYWluLWltYWdlLWNvbnRhaW5lciIgcm9sZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSJUb2dnbGUgYWN0dWFsIHNpemUiIGFyaWEtZXhwYW5kZWQkPSJbW19nZXRBcmlhRXhwYW5kZWQoYWN0dWFsU2l6ZSldXSIgb24tdGFwPSJfaGFuZGxlVGFwIj48L2E+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIC8qKiBNYWtlIGJ1dHRvbiBhIGRpdi4gKi8KICAgICAgYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAvKiogRmlyZWZveDogR2V0IHJpZCBvZiBkb3R0ZWQgbGluZSBpbnNpZGUgYnV0dG9uLiAqLwogICAgICBidXR0b246Oi1tb3otZm9jdXMtaW5uZXIgewogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAvKiogRmlyZWZveDogU2ltdWxhdGUgQ2hyb21lJ3Mgb3V0ZXIgZ2xvdyBvbiBidXR0b24gd2hlbiBmb2N1c2VkLiAqLwogICAgICBidXR0b246LW1vei1mb2N1c3JpbmcgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggMnB4IEhpZ2hsaWdodDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAzNTBweDsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMCAxNXB4IDQwcHggMDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAvKiogV2hlbiBhY3R1YWwgc2l6ZSBzaG93biBpcyBvbiwgdXNlIHRoZSBhY3R1YWwgaW1hZ2Ugd2lkdGguICovCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogbm9uZTsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLXNwaW5uZXItbGl0ZSB7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTsKICAgICAgICAtLXBhcGVyLXNwaW5uZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjc3RlcHMgewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xNXB4OwogICAgICAgIC8qCiAgICAgICAgICogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZQogICAgICAgICAqIHBhcGVyLXNsaWRlciwgc3VidHJhY3RpbmcgMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMKICAgICAgICAgKiB3aXRoIHRoZSBpbWFnZSAodGhlIGxhc3Qgc2xpZGVyIG1hcmtlciB0YWtlcyB1cCAxcHgpLCBhbmQKICAgICAgICAgKiBhZGRpbmcgMnB4IHRvIGFjY291bnQgZm9yIGEgYm9yZGVyIG9mIDFweCBvbiBib3RoIHNpZGVzIG9mCiAgICAgICAgICogdGhlIGltYWdlLiAzMCAtIDEgKyAyLgogICAgICAgICAqLwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgKyAzMXB4KTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KCiAgICAgICNtYWluLWltYWdlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogMTAyNHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgaW1nIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiAtbW96LWNyaXNwLWVkZ2VzOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaW1hZ2UtZGFzaGJvYXJkL3RmLWltYWdlLWxvYWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1pbWFnZS1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxzYW1wbGU6TnVtYmVyLG9mU2FtcGxlczpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IocnVuKSJ9LGFjdHVhbFNpemU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGJyaWdodG5lc3NBZGp1c3RtZW50Ont0eXBlOk51bWJlcix2YWx1ZTouNX0sY29udHJhc3RQZXJjZW50YWdlOnt0eXBlOk51bWJlcix2YWx1ZTowfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21ldGFkYXRhQ2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLkNhbmNlbGxlcn0sX2ltYWdlQ2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLkNhbmNlbGxlcn0sX3N0ZXBzOnt0eXBlOkFycmF5LHZhbHVlOltdLG5vdGlmeTohMH0sX3N0ZXBJbmRleDp7dHlwZTpOdW1iZXIsCm5vdGlmeTohMH0sX2N1cnJlbnRTdGVwOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50U3RlcChfc3RlcHMsIF9zdGVwSW5kZXgpIn0sX2hhc0F0TGVhc3RPbmVTdGVwOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKSJ9LF9oYXNNdWx0aXBsZVN0ZXBzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpIn0sX3N0ZXBWYWx1ZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlU3RlcFZhbHVlKF9jdXJyZW50U3RlcCkifSxfY3VycmVudFdhbGxUaW1lOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50V2FsbFRpbWUoX2N1cnJlbnRTdGVwKSJ9LF9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChfc3RlcHMpIn0sX3NhbXBsZVRleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVNhbXBsZVRleHQoc2FtcGxlKSJ9LApfaGFzTXVsdGlwbGVTYW1wbGVzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGVTYW1wbGVzKG9mU2FtcGxlcykifSxfaXNJbWFnZUxvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiLCJfdXBkYXRlSW1hZ2VVcmwoX2N1cnJlbnRTdGVwLCBicmlnaHRuZXNzQWRqdXN0bWVudCwgY29udHJhc3RQZXJjZW50YWdlKSJdLF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIFpsLnJ1bnNDb2xvclNjYWxlKGEpfSxfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKGEpe3JldHVybiEhYSYmMDxhLmxlbmd0aH0sX2NvbXB1dGVIYXNNdWx0aXBsZVN0ZXBzKGEpe3JldHVybiEhYSYmMTxhLmxlbmd0aH0sX2NvbXB1dGVDdXJyZW50U3RlcChhLGMpe3JldHVybiBhW2NdfHxudWxsfSxfY29tcHV0ZVN0ZXBWYWx1ZShhKXtyZXR1cm4gYT9hLnN0ZXA6MH0sX2NvbXB1dGVDdXJyZW50V2FsbFRpbWUoYSl7cmV0dXJuIGE/CmZtLmZvcm1hdERhdGUoYS53YWxsX3RpbWUpOiIifSxfY29tcHV0ZU1heFN0ZXBJbmRleChhKXtyZXR1cm4gYS5sZW5ndGgtMX0sX2NvbXB1dGVTYW1wbGVUZXh0KGEpe3JldHVybmAke2ErMX1gfSxfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhhKXtyZXR1cm4gMTxhfSxfZ2V0QXJpYUV4cGFuZGVkKCl7cmV0dXJuIHRoaXMuYWN0dWFsU2l6ZT8idHJ1ZSI6ImZhbHNlIn0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsQWxsKCk7dmFyIGE9UGsuYWRkUGFyYW1zKFBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvaW1hZ2VzIikse3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW4sc2FtcGxlOnRoaXMuc2FtcGxlfSksYz10aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxsYWJsZShkPT57ZC5jYW5jZWxsZWR8fChkPWQudmFsdWUubWFwKHRoaXMuX2NyZWF0ZVN0ZXBEYXR1bS5iaW5kKHRoaXMpKSwKdGhpcy5zZXQoIl9zdGVwcyIsZCksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLGQubGVuZ3RoLTEpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGMpfX0sX2NyZWF0ZVN0ZXBEYXR1bShhKXtsZXQgYz1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL2luZGl2aWR1YWxJbWFnZSIpO2M9UGsuYWRkUGFyYW1zKGMse3RzOmEud2FsbF90aW1lfSk7Yys9Ilx4MjYiK2EucXVlcnk7cmV0dXJue3dpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0LHdhbGxfdGltZTpuZXcgRGF0ZSgxRTMqYS53YWxsX3RpbWUpLHN0ZXA6YS5zdGVwLHVybDpjfX0sX3VwZGF0ZUltYWdlVXJsKGEsYyxkKXtpZihhKXt2YXIgZj1uZXcgSW1hZ2U7dGhpcy5faW1hZ2VDYW5jZWxsZXIuY2FuY2VsQWxsKCk7Zi5vbmxvYWQ9Zi5vbmVycm9yPXRoaXMuX2ltYWdlQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKGc9PntnLmNhbmNlbGxlZHx8KGc9dGhpcy4kJCgiI21haW4taW1hZ2UtY29udGFpbmVyIiksCmcuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKGcpLmFwcGVuZENoaWxkKGYpLHRoaXMuc2V0KCJfaXNJbWFnZUxvYWRpbmciLCExKSl9KS5iaW5kKHRoaXMpO2Yuc3R5bGUuZmlsdGVyPWBjb250cmFzdCgke2R9JSkgYDtmLnN0eWxlLmZpbHRlcis9YGJyaWdodG5lc3MoJHtjfSlgO3RoaXMuc2V0KCJfaXNJbWFnZUxvYWRpbmciLCEwKTtmLnNyYz1hLnVybH19LF9oYW5kbGVUYXAoKXt0aGlzLnNldCgiYWN0dWFsU2l6ZSIsIXRoaXMuYWN0dWFsU2l6ZSl9LF90b0xvY2FsZVN0cmluZyhhKXtyZXR1cm4gYS50b0xvY2FsZVN0cmluZygpfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaW1hZ2UtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19hY3R1YWxTaXplfX0iPlNob3cgYWN0dWFsIGltYWdlIHNpemU8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkJyaWdodG5lc3MgYWRqdXN0bWVudDwvaDM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIiPgogICAgICAgICAgICA8cGFwZXItc2xpZGVyIG1pbj0iMCIgbWF4PSIyIiBzbmFwcyBwaW4gc3RlcD0iMC4wMSIgdmFsdWU9Int7X2JyaWdodG5lc3NBZGp1c3RtZW50fX0iIGltbWVkaWF0ZS12YWx1ZT0ie3tfYnJpZ2h0bmVzc0FkanVzdG1lbnR9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9IngtYnV0dG9uIiBvbi10YXA9Il9yZXNldEJyaWdodG5lc3MiIGRpc2FibGVkPSJbW19icmlnaHRuZXNzSXNEZWZhdWx0XV0iPlJlc2V0PC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+Q29udHJhc3QgYWRqdXN0bWVudDwvaDM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIiPgogICAgICAgICAgICA8cGFwZXItc2xpZGVyIG1pbj0iMCIgbWF4PSI1MDAiIHNuYXBzIHBpbiBzdGVwPSIxIiB2YWx1ZT0ie3tfY29udHJhc3RQZXJjZW50YWdlfX0iIGltbWVkaWF0ZS12YWx1ZT0ie3tfY29udHJhc3RQZXJjZW50YWdlfX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgb24tdGFwPSJfcmVzZXRDb250cmFzdCIgZGlzYWJsZWQ9IltbX2NvbnRyYXN0SXNEZWZhdWx0XV0iPlJlc2V0PC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3IgaWQ9InJ1bnMtc2VsZWN0b3IiIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij48L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gaW1hZ2UgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgaW1hZ2UgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtaW1hZ2UtbG9hZGVyIGFjdGl2ZT0iW1thY3RpdmVdXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBhY3R1YWwtc2l6ZT0iW1tfYWN0dWFsU2l6ZV1dIiBicmlnaHRuZXNzLWFkanVzdG1lbnQ9IltbX2JyaWdodG5lc3NBZGp1c3RtZW50XV0iIGNvbnRyYXN0LXBlcmNlbnRhZ2U9IltbX2NvbnRyYXN0UGVyY2VudGFnZV1dIj48L3RmLWltYWdlLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1zbGlkZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdW5zZXQ7CiAgICAgIH0KICAgICAgLngtYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICB9CiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaW1hZ2UtZGFzaGJvYXJkL3RmLWltYWdlLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1pbWFnZS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF9hY3R1YWxTaXplOkJvb2xlYW4sX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6MSxyZWFkT25seTohMH0sX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMCxyZWFkT25seTohMH0sX2JyaWdodG5lc3NBZGp1c3RtZW50Ont0eXBlOk51bWJlcix2YWx1ZToxfSxfY29udHJhc3RQZXJjZW50YWdlOnt0eXBlOk51bWJlcix2YWx1ZToxMDB9LF90YWdGaWx0ZXI6U3RyaW5nLF9icmlnaHRuZXNzSXNEZWZhdWx0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQnJpZ2h0bmVzc0lzRGVmYXVsdChfYnJpZ2h0bmVzc0FkanVzdG1lbnQpIn0sX2NvbnRyYXN0SXNEZWZhdWx0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQ29udHJhc3RJc0RlZmF1bHQoX2NvbnRyYXN0UGVyY2VudGFnZSkifSwKX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUGsuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRJbWFnZXMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYT1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9PntpZighXy5pc0VxdWFsKGMsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGQ9Xy5tYXBWYWx1ZXMoYyxmPT5PYmplY3Qua2V5cyhmKSk7ZD1Qay5nZXRUYWdzKGQpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwKMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEltYWdlcygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1pbWFnZS1sb2FkZXIiKS5mb3JFYWNoKGE9PnthLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGEpe3JldHVybiAyPj1hfSxfcmVzZXRCcmlnaHRuZXNzKCl7dGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQ9dGhpcy5fZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50fSxfcmVzZXRDb250cmFzdCgpe3RoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSxfY29tcHV0ZUJyaWdodG5lc3NJc0RlZmF1bHQoYSl7cmV0dXJuIGE9PT10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LF9jb21wdXRlQ29udHJhc3RJc0RlZmF1bHQoYSl7cmV0dXJuIGE9PT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSwKX21ha2VDYXRlZ29yaWVzKGEsYyxkKXtmdW5jdGlvbiBmKGwpe2NvbnN0IGs9YVtsLnJ1bl1bbC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UoaykubWFwKG09Pk9iamVjdC5hc3NpZ24oe30sbCx7c2FtcGxlOm0sb2ZTYW1wbGVzOmt9KSl9Y29uc3QgZz1fLm1hcFZhbHVlcyhhLGw9Pk9iamVjdC5rZXlzKGwpKTtyZXR1cm4gUWsuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhnLGMsZCkubWFwKGw9Pk9iamVjdC5hc3NpZ24oe30sbCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLGwuaXRlbXMubWFwKGYpKX0pKX0sX3RhZ01ldGFkYXRhKGEsYyxkKXtyZXR1cm4gYVtjXVtkXX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtYXVkaW8tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc2FtcGxlOiBbW19zYW1wbGVUZXh0XV0gb2YgW1t0b3RhbFNhbXBsZXNdXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHN0ZXAgPHN0cm9uZz5bW19jdXJyZW50RGF0dW0uc3RlcF1dPC9zdHJvbmc+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0Ij4KICAgICAgICAgICAgICBbW19jdXJyZW50RGF0dW0ud2FsbF90aW1lXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU3RlcHNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0ic3RlcHMiIGltbWVkaWF0ZS12YWx1ZT0ie3tfc3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIG1heC1tYXJrZXJzPSJbW19tYXhTdGVwSW5kZXhdXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7X3N0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcF1dIj4KICAgICAgPGF1ZGlvIGNvbnRyb2xzIHNyYyQ9IltbX2N1cnJlbnREYXR1bS51cmxdXSIgdHlwZSQ9IltbX2N1cnJlbnREYXR1bS5jb250ZW50VHlwZV1dIj48L2F1ZGlvPgogICAgICA8dGYtbWFya2Rvd24tdmlldyBodG1sPSJbW19jdXJyZW50RGF0dW0ubGFiZWxdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgPC90ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9Im1haW4tYXVkaW8tY29udGFpbmVyIj48L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAzNTBweDsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcjogIzQyNDI0MjsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQoKICAgICAgI3N0ZXBzIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBhZGRpbmc6IDAgNXB4OyAvKiBzbyB0aGUgc2xpZGVyIGtub2IgZG9lc24ndCBidXR0IG91dCAqLwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtYXVkaW8tZGFzaGJvYXJkL3RmLWF1ZGlvLWxvYWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1hdWRpby1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxzYW1wbGU6TnVtYmVyLHRvdGFsU2FtcGxlczpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IocnVuKSJ9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfbWV0YWRhdGFDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUGsuQ2FuY2VsbGVyfSxfc3RlcHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfc3RlcEluZGV4Ok51bWJlcixfaGFzQXRMZWFzdE9uZVN0ZXA6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChfc3RlcHMpIn0sX2hhc011bHRpcGxlU3RlcHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVN0ZXBzKF9zdGVwcykifSxfY3VycmVudERhdHVtOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50RGF0dW0oX3N0ZXBzLCBfc3RlcEluZGV4KSJ9LApfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgoX3N0ZXBzKSJ9LF9zYW1wbGVUZXh0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTYW1wbGVUZXh0KHNhbXBsZSkifSxfaGFzTXVsdGlwbGVTYW1wbGVzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGVTYW1wbGVzKHRvdGFsU2FtcGxlcykifX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnKSJdLF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIFpsLnJ1bnNDb2xvclNjYWxlKGEpfSxfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKGEpe3JldHVybiEhYSYmMDxhLmxlbmd0aH0sX2NvbXB1dGVIYXNNdWx0aXBsZVN0ZXBzKGEpe3JldHVybiEhYSYmMTxhLmxlbmd0aH0sX2NvbXB1dGVNYXhTdGVwSW5kZXgoYSl7cmV0dXJuIGEubGVuZ3RoLTF9LF9jb21wdXRlQ3VycmVudERhdHVtKGEsYyl7cmV0dXJuIGFbY119LF9jb21wdXRlU2FtcGxlVGV4dChhKXtyZXR1cm5gJHthKwoxfWB9LF9jb21wdXRlSGFzTXVsdGlwbGVTYW1wbGVzKGEpe3JldHVybiAxPGF9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7aWYodGhpcy5fYXR0YWNoZWQpe3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBhPVBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJhdWRpbyIsIi9hdWRpbyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOnRoaXMudGFnLHJ1bjp0aGlzLnJ1bixzYW1wbGU6dGhpcy5zYW1wbGV9KSksYz10aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxsYWJsZShkPT57ZC5jYW5jZWxsZWR8fChkPWQudmFsdWUubWFwKHRoaXMuX2NyZWF0ZVN0ZXBEYXR1bS5iaW5kKHRoaXMpKSx0aGlzLnNldCgiX3N0ZXBzIixkKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsZC5sZW5ndGgtMSkpfSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYyl9fSxfY3JlYXRlU3RlcERhdHVtKGEpe3ZhciBjPQpuZXcgVVJMU2VhcmNoUGFyYW1zKGEucXVlcnkpO2MuYXBwZW5kKCJ0cyIsYS53YWxsX3RpbWUpO2M9UGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL2luZGl2aWR1YWxBdWRpbyIsYyk7cmV0dXJue3dhbGxfdGltZTpmbS5mb3JtYXREYXRlKG5ldyBEYXRlKDFFMyphLndhbGxfdGltZSkpLHN0ZXA6YS5zdGVwLGxhYmVsOmEubGFiZWwsY29udGVudFR5cGU6YS5jb250ZW50VHlwZSx1cmw6Y319fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1hdWRpby1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3IgaWQ9InJ1bnMtc2VsZWN0b3IiIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij48L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gYXVkaW8gZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgYXVkaW8gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtYXVkaW8tbG9hZGVyIGFjdGl2ZT0iW1thY3RpdmVdXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIgdG90YWwtc2FtcGxlcz0iW1tpdGVtLnRvdGFsU2FtcGxlc11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWF1ZGlvLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWF1ZGlvLWRhc2hib2FyZC90Zi1hdWRpby1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtYXVkaW8tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyKSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBQay5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEF1ZGlvKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGE9UGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9PntpZighXy5pc0VxdWFsKGMsCnRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBkPV8ubWFwVmFsdWVzKGMsZj0+T2JqZWN0LmtleXMoZikpO2Q9UGsuZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyl9fSl9LF9yZWxvYWRBdWRpbygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1hdWRpby1sb2FkZXIiKS5mb3JFYWNoKGE9PnthLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGEpe3JldHVybiAyPj1hfSxfbWFrZUNhdGVnb3JpZXMoYSxjLGQpe2Z1bmN0aW9uIGYobCl7Y29uc3Qgaz1hW2wucnVuXVtsLnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShrKS5tYXAobT0+T2JqZWN0LmFzc2lnbih7fSxsLHtzYW1wbGU6bSx0b3RhbFNhbXBsZXM6a30pKX1jb25zdCBnPV8ubWFwVmFsdWVzKGEsbD0+T2JqZWN0LmtleXMobCkpO3JldHVybiBRay5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGcsYyxkKS5tYXAobD0+T2JqZWN0LmFzc2lnbih7fSwKbCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLGwuaXRlbXMubWFwKGYpKX0pKX0sX3RhZ01ldGFkYXRhKGEsYyxkKXtyZXR1cm4gYVtjXVtkXX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWF1dG9ncm93LXRleHRhcmVhIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZDsKICAgICAgICBwYWRkaW5nOiAycHg7CiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiB0ZXh0YXJlYTsKICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5taXJyb3ItdGV4dCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhOwogICAgICB9CgogICAgICAuZml0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgICB0ZXh0YXJlYSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIC8qIHNlZSBjb21tZW50cyBpbiB0ZW1wbGF0ZSAqLwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LXNpemU6IGluaGVyaXQ7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgdGV4dC1hbGlnbjogaW5oZXJpdDsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWEtcGxhY2Vob2xkZXI7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICAKICAgIAogICAgPGRpdiBpZD0ibWlycm9yIiBjbGFzcz0ibWlycm9yLXRleHQiIGFyaWEtaGlkZGVuPSJ0cnVlIj4mbmJzcDs8L2Rpdj4KCiAgICAKICAgIDxkaXYgY2xhc3M9InRleHRhcmVhLWNvbnRhaW5lciBmaXQiPgogICAgICA8dGV4dGFyZWEgaWQ9InRleHRhcmVhIiBuYW1lJD0iW1tuYW1lXV0iIGFyaWEtbGFiZWwkPSJbW2xhYmVsXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgcmVxdWlyZWQkPSJbW3JlcXVpcmVkXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiByb3dzJD0iW1tyb3dzXV0iIG1pbmxlbmd0aCQ9IltbbWlubGVuZ3RoXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iPjwvdGV4dGFyZWE+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS9pcm9uLWF1dG9ncm93LXRleHRhcmVhLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25Db250cm9sU3RhdGVdLHByb3BlcnRpZXM6e3ZhbHVlOntvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCIsdHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxiaW5kVmFsdWU6e29ic2VydmVyOiJfYmluZFZhbHVlQ2hhbmdlZCIsdHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxyb3dzOnt0eXBlOk51bWJlcix2YWx1ZToxLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sbWF4Um93czp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoiX3VwZGF0ZUNhY2hlZCJ9LGF1dG9jb21wbGV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9mb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnB1dG1vZGU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmd9LHJlYWRvbmx5Ont0eXBlOlN0cmluZ30scmVxdWlyZWQ6e3R5cGU6Qm9vbGVhbn0sCm1pbmxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1heGxlbmd0aDp7dHlwZTpOdW1iZXJ9LGxhYmVsOnt0eXBlOlN0cmluZ319LGxpc3RlbmVyczp7aW5wdXQ6Il9vbklucHV0In0sZ2V0IHRleHRhcmVhKCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYX0sZ2V0IHNlbGVjdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydH0sZ2V0IHNlbGVjdGlvbkVuZCgpe3JldHVybiB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uRW5kfSxzZXQgc2VsZWN0aW9uU3RhcnQoYSl7dGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PWF9LHNldCBzZWxlY3Rpb25FbmQoYSl7dGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZD1hfSxhdHRhY2hlZDpmdW5jdGlvbigpe25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86W29hXWR8aG9uZSkvKSYmKHRoaXMuJC50ZXh0YXJlYS5zdHlsZS5tYXJnaW5MZWZ0PSItM3B4Iil9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLnRleHRhcmVhLnZhbGlkaXR5LnZhbGlkOwphJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLnZhbHVlP2E9ITE6dGhpcy5oYXNWYWxpZGF0b3IoKSYmKGE9UG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvci52YWxpZGF0ZS5jYWxsKHRoaXMsdGhpcy52YWx1ZSkpKTt0aGlzLmludmFsaWQ9IWE7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGF9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMudmFsdWU9YX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnRleHRhcmVhO2MmJihjLnZhbHVlIT09YSYmKGMudmFsdWU9YXx8MD09PWE/YToiIiksdGhpcy5iaW5kVmFsdWU9YSx0aGlzLiQubWlycm9yLmlubmVySFRNTD10aGlzLl92YWx1ZUZvck1pcnJvcigpLHRoaXMuZmlyZSgiYmluZC12YWx1ZS1jaGFuZ2VkIix7dmFsdWU6dGhpcy5iaW5kVmFsdWV9KSl9LF9vbklucHV0OmZ1bmN0aW9uKGEpe3ZhciBjPVBvbHltZXIuZG9tKGEpLnBhdGg7dGhpcy52YWx1ZT1jP2NbMF0udmFsdWU6CmEudGFyZ2V0LnZhbHVlfSxfY29uc3RyYWluOmZ1bmN0aW9uKGEpe2E9YXx8WyIiXTtmb3IoYT0wPHRoaXMubWF4Um93cyYmYS5sZW5ndGg+dGhpcy5tYXhSb3dzP2Euc2xpY2UoMCx0aGlzLm1heFJvd3MpOmEuc2xpY2UoMCk7MDx0aGlzLnJvd3MmJmEubGVuZ3RoPHRoaXMucm93czspYS5wdXNoKCIiKTtyZXR1cm4gYS5qb2luKCJceDNjYnIvXHgzZSIpKyJceDI2IzE2MDsifSxfdmFsdWVGb3JNaXJyb3I6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRleHRhcmVhO2lmKGEpcmV0dXJuIHRoaXMudG9rZW5zPWEmJmEudmFsdWU/YS52YWx1ZS5yZXBsYWNlKC8mL2dtLCJceDI2YW1wOyIpLnJlcGxhY2UoLyIvZ20sIlx4MjZxdW90OyIpLnJlcGxhY2UoLycvZ20sIlx4MjYjMzk7IikucmVwbGFjZSgvPC9nbSwiXHgyNmx0OyIpLnJlcGxhY2UoLz4vZ20sIlx4MjZndDsiKS5zcGxpdCgiXG4iKTpbIiJdLHRoaXMuX2NvbnN0cmFpbih0aGlzLnRva2Vucyl9LF91cGRhdGVDYWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLiQubWlycm9yLmlubmVySFRNTD0KdGhpcy5fY29uc3RyYWluKHRoaXMudG9rZW5zKX19KTsKPC9zY3JpcHQ+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10ZXh0YXJlYSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBsYWJlbCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHBhcGVyLWlucHV0LWNvbnRhaW5lciBuby1sYWJlbC1mbG9hdCQ9Iltbbm9MYWJlbEZsb2F0XV0iIGFsd2F5cy1mbG9hdC1sYWJlbD0iW1tfY29tcHV0ZUFsd2F5c0Zsb2F0TGFiZWwoYWx3YXlzRmxvYXRMYWJlbCxwbGFjZWhvbGRlcildXSIgYXV0by12YWxpZGF0ZSQ9IltbYXV0b1ZhbGlkYXRlXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiBpbnZhbGlkPSJbW2ludmFsaWRdXSI+CgogICAgICA8bGFiZWwgaGlkZGVuJD0iW1shbGFiZWxdXSIgYXJpYS1oaWRkZW49InRydWUiIGZvciQ9IltbX2lucHV0SWRdXSIgc2xvdD0ibGFiZWwiPltbbGFiZWxdXTwvbGFiZWw+CgogICAgICA8aXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSBjbGFzcz0icGFwZXItaW5wdXQtaW5wdXQiIHNsb3Q9ImlucHV0IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBiaW5kLXZhbHVlPSJ7e3ZhbHVlfX0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3IkPSJbW3ZhbGlkYXRvcl1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbmFtZSQ9IltbbmFtZV1dIiBwbGFjZWhvbGRlciQ9IltbcGxhY2Vob2xkZXJdXSIgcmVhZG9ubHkkPSJbW3JlYWRvbmx5XV0iIHJlcXVpcmVkJD0iW1tyZXF1aXJlZF1dIiBtaW5sZW5ndGgkPSJbW21pbmxlbmd0aF1dIiBtYXhsZW5ndGgkPSJbW21heGxlbmd0aF1dIiBhdXRvY2FwaXRhbGl6ZSQ9IltbYXV0b2NhcGl0YWxpemVdXSIgcm93cyQ9Iltbcm93c11dIiBtYXgtcm93cyQ9IltbbWF4Um93c11dIiBvbi1jaGFuZ2U9Il9vbkNoYW5nZSI+PC9pcm9uLWF1dG9ncm93LXRleHRhcmVhPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Vycm9yTWVzc2FnZV1dIj4KICAgICAgICA8cGFwZXItaW5wdXQtZXJyb3IgYXJpYS1saXZlPSJhc3NlcnRpdmUiIHNsb3Q9ImFkZC1vbiI+W1tlcnJvck1lc3NhZ2VdXTwvcGFwZXItaW5wdXQtZXJyb3I+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhckNvdW50ZXJdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWNoYXItY291bnRlciBzbG90PSJhZGQtb24iPjwvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyPgogICAgICA8L3RlbXBsYXRlPgoKICAgIDwvcGFwZXItaW5wdXQtY29udGFpbmVyPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9wYXBlci1pbnB1dC9wYXBlci10ZXh0YXJlYS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10ZXh0YXJlYSIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvcixQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfYXJpYUxhYmVsbGVkQnk6e29ic2VydmVyOiJfYXJpYUxhYmVsbGVkQnlDaGFuZ2VkIix0eXBlOlN0cmluZ30sX2FyaWFEZXNjcmliZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkIix0eXBlOlN0cmluZ30sdmFsdWU6e3R5cGU6U3RyaW5nfSxyb3dzOnt0eXBlOk51bWJlcix2YWx1ZToxfSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowfX0sZ2V0IHNlbGVjdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydH0sc2V0IHNlbGVjdGlvblN0YXJ0KGEpe3RoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydD1hfSxnZXQgc2VsZWN0aW9uRW5kKCl7cmV0dXJuIHRoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25FbmR9LApzZXQgc2VsZWN0aW9uRW5kKGEpe3RoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25FbmQ9YX0sX2FyaWFMYWJlbGxlZEJ5Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9mb2N1c2FibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixhKX0sX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiLGEpfSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQudGV4dGFyZWF9fSk7Cjwvc2NyaXB0PgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2FzdCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvYXN0LWJhY2tncm91bmQtY29sb3IsICMzMjMyMzIpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1jb2xvciwgI2YxZjFmMSk7CiAgICAgICAgbWluLWhlaWdodDogNDhweDsKICAgICAgICBtaW4td2lkdGg6IDI4OHB4OwogICAgICAgIHBhZGRpbmc6IDE2cHggMjRweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yNik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIG1hcmdpbjogMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzLCBvcGFjaXR5IDAuM3M7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMHB4KTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdCguY2Fwc3VsZSkgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDI0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KC5maXQtYm90dG9tKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICA6aG9zdCgucGFwZXItdG9hc3Qtb3BlbikgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMHB4KTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3BhbiBpZD0ibGFiZWwiPnt7dGV4dH19PC9zcGFuPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9wYXBlci10b2FzdC9wYXBlci10b2FzdC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBhPW51bGw7UG9seW1lcih7aXM6InBhcGVyLXRvYXN0IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcl0scHJvcGVydGllczp7Zml0SW50bzp7dHlwZTpPYmplY3QsdmFsdWU6d2luZG93LG9ic2VydmVyOiJfb25GaXRJbnRvQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToiYm90dG9tIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjNFM30sdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX19vblRyYW5zaXRpb25FbmQifSxnZXQgdmlzaWJsZSgpe1BvbHltZXIuQmFzZS5fd2FybigiYHZpc2libGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgb3BlbmVkYCBpbnN0ZWFkIik7CnJldHVybiB0aGlzLm9wZW5lZH0sZ2V0IF9jYW5BdXRvQ2xvc2UoKXtyZXR1cm4gMDx0aGlzLmR1cmF0aW9uJiZJbmZpbml0eSE9PXRoaXMuZHVyYXRpb259LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdXRvQ2xvc2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0sc2hvdzpmdW5jdGlvbihjKXsic3RyaW5nIj09dHlwZW9mIGMmJihjPXt0ZXh0OmN9KTtmb3IodmFyIGQgaW4gYykwPT09ZC5pbmRleE9mKCJfIik/UG9seW1lci5CYXNlLl93YXJuKCdUaGUgcHJvcGVydHkgIicrZCsnIiBpcyBwcml2YXRlIGFuZCB3YXMgbm90IHNldC4nKTpkIGluIHRoaXM/dGhpc1tkXT1jW2RdOlBvbHltZXIuQmFzZS5fd2FybignVGhlIHByb3BlcnR5ICInK2QrJyIgaXMgbm90IHZhbGlkLicpO3RoaXMub3BlbigpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpfSxfX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihjKXtjJiZjLnRhcmdldD09PQp0aGlzJiYib3BhY2l0eSI9PT1jLnByb3BlcnR5TmFtZSYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYXV0b0Nsb3NlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9hdXRvQ2xvc2UpLHRoaXMuX2F1dG9DbG9zZT1udWxsKTt0aGlzLm9wZW5lZD8oYSYmYSE9PXRoaXMmJmEuY2xvc2UoKSxhPXRoaXMsdGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDp0aGlzLnRleHR9KSx0aGlzLl9jYW5BdXRvQ2xvc2UmJih0aGlzLl9hdXRvQ2xvc2U9dGhpcy5hc3luYyh0aGlzLmNsb3NlLHRoaXMuZHVyYXRpb24pKSk6YT09PXRoaXMmJihhPW51bGwpO1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJwYXBlci10b2FzdC1vcGVuIil9LApfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QucmVtb3ZlKCJwYXBlci10b2FzdC1vcGVuIil9LF9vbkZpdEludG9DaGFuZ2VkOmZ1bmN0aW9uKGMpe3RoaXMucG9zaXRpb25UYXJnZXQ9Y319KX0pKCk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRvZ2dsZS1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTpub25lOwogICAgICB9CgogICAgICAudG9nZ2xlLWJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMC40OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYmFyLWNvbG9yLCAjMDAwMDAwKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTNweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIGxpbmVhciAuMDhzLCBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS01MCkpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b247CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uLmRyYWdnaW5nIHsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdOm5vdChbZGlzYWJsZWRdKSkgLnRvZ2dsZS1iYXIgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1iYXI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC50b2dnbGUtYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwogICAgICAgIG9wYWNpdHk6IDAuMTI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTZweCwgMCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTZweCwgMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmRiZGJkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5rIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAtMTRweDsKICAgICAgICBsZWZ0OiAtMTRweDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBib3R0b206IGF1dG87CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtaW5rOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtaW5rIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtaW5rOwogICAgICB9CgogICAgICAudG9nZ2xlLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMzZweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgLyogVGhlIHRvZ2dsZSBidXR0b24gaGFzIGFuIGFic29sdXRlIHBvc2l0aW9uIG9mIC0zcHg7IFRoZSBleHRyYSAxcHgKICAgICAgICAvKiBhY2NvdW50cyBmb3IgdGhlIHRvZ2dsZSBidXR0b24gc2hhZG93IGJveC4gKi8KICAgICAgICBtYXJnaW46IDRweCAxcHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGFiZWwgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIC8qIGludmFsaWQgc3RhdGUgKi8KICAgICAgOmhvc3QoW2ludmFsaWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1pbnZhbGlkLWJhci1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2ludmFsaWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1pbnZhbGlkLWJ1dHRvbi1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2ludmFsaWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1pbmstY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0idG9nZ2xlLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InRvZ2dsZUJhciIgY2xhc3M9InRvZ2dsZS1iYXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCdXR0b24iIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1sYWJlbCI+PHNsb3Q+PC9zbG90PjwvZGl2PgoKICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItdG9nZ2xlLWJ1dHRvbi9wYXBlci10b2dnbGUtYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRvZ2dsZS1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJidXR0b24iLCJhcmlhLXByZXNzZWQiOiJmYWxzZSIsdGFiaW5kZXg6MH0scHJvcGVydGllczp7fSxsaXN0ZW5lcnM6e3RyYWNrOiJfb250cmFjayJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsZnVuY3Rpb24oKXtQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMsInBhbi15Iil9KX0sX29udHJhY2s6ZnVuY3Rpb24oYSl7YT1hLmRldGFpbDsic3RhcnQiPT09YS5zdGF0ZT90aGlzLl90cmFja1N0YXJ0KGEpOiJ0cmFjayI9PT1hLnN0YXRlP3RoaXMuX3RyYWNrTW92ZShhKToiZW5kIj09PWEuc3RhdGUmJnRoaXMuX3RyYWNrRW5kKGEpfSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3dpZHRoPXRoaXMuJC50b2dnbGVCYXIub2Zmc2V0V2lkdGgvCjI7dGhpcy5fdHJhY2tDaGVja2VkPXRoaXMuY2hlY2tlZDt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIil9LF90cmFja01vdmU6ZnVuY3Rpb24oYSl7YT1hLmR4O3RoaXMuX3g9TWF0aC5taW4odGhpcy5fd2lkdGgsTWF0aC5tYXgoMCx0aGlzLl90cmFja0NoZWNrZWQ/dGhpcy5fd2lkdGgrYTphKSk7dGhpcy50cmFuc2xhdGUzZCh0aGlzLl94KyJweCIsMCwwLHRoaXMuJC50b2dnbGVCdXR0b24pO3RoaXMuX3VzZXJBY3RpdmF0ZSh0aGlzLl94PnRoaXMuX3dpZHRoLzIpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIik7dGhpcy50cmFuc2Zvcm0oIiIsdGhpcy4kLnRvZ2dsZUJ1dHRvbil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnRvZ2dsZUJ1dHRvbjt2YXIgYT1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpOwphLmlkPSJpbmsiO2Euc2V0QXR0cmlidXRlKCJyZWNlbnRlcnMiLCIiKTthLmNsYXNzTGlzdC5hZGQoImNpcmNsZSIsInRvZ2dsZS1pbmsiKTtyZXR1cm4gYX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtY29tbW9uL2Fubm90YXRpb24uanMKdmFyIHRmOwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gZyhyKXtyZXR1cm4oYy5yZW5kZXIuQW5ub3RhdGlvblR5cGVbcl18fCIiKS50b0xvd2VyQ2FzZSgpfHxudWxsfWZ1bmN0aW9uIGwocix0KXt0LmFubm90YXRpb25UeXBlPT09Yy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWT9kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQociwidXNlIikuYXR0cigiY2xhc3MiLCJzdW1tYXJ5IikuYXR0cigieGxpbms6aHJlZiIsIiNzdW1tYXJ5LWljb24iKS5hdHRyKCJjdXJzb3IiLCJwb2ludGVyIik6KHI9ZC5ub2RlLmJ1aWxkU2hhcGUocix0LGQuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKSxkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQociwidGl0bGUiKS50ZXh0KHQubm9kZS5uYW1lKSl9ZnVuY3Rpb24gayhyLHQpe2xldCB2PXQubm9kZS5uYW1lLnNwbGl0KCIvIik7cmV0dXJuIG0ocix2W3YubGVuZ3RoLTFdLHQsbnVsbCl9ZnVuY3Rpb24gbShyLHQsCnYsQSl7bGV0IHk9ZC5DbGFzcy5Bbm5vdGF0aW9uLkxBQkVMO0EmJih5Kz0iICIrQSk7cj1yLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIix5KS5hdHRyKCJkeSIsIi4zNWVtIikuYXR0cigidGV4dC1hbmNob3IiLHYuaXNJbj8iZW5kIjoic3RhcnQiKS50ZXh0KHQpO3JldHVybiBhLmdyYXBoLnNjZW5lLm5vZGUuZW5mb3JjZUxhYmVsV2lkdGgociwtMSl9ZnVuY3Rpb24gcChyLHQsdixBKXtyLm9uKCJtb3VzZW92ZXIiLHk9PntBLmZpcmUoImFubm90YXRpb24taGlnaGxpZ2h0Iix7bmFtZTp5Lm5vZGUubmFtZSxob3N0TmFtZTp0Lm5vZGUubmFtZX0pfSkub24oIm1vdXNlb3V0Iix5PT57QS5maXJlKCJhbm5vdGF0aW9uLXVuaGlnaGxpZ2h0Iix7bmFtZTp5Lm5vZGUubmFtZSxob3N0TmFtZTp0Lm5vZGUubmFtZX0pfSkub24oImNsaWNrIix5PT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7QS5maXJlKCJhbm5vdGF0aW9uLXNlbGVjdCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dC5ub2RlLm5hbWV9KX0pOwppZih2LmFubm90YXRpb25UeXBlIT09Yy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWSYmdi5hbm5vdGF0aW9uVHlwZSE9PWMucmVuZGVyLkFubm90YXRpb25UeXBlLkNPTlNUQU5UKXIub24oImNvbnRleHRtZW51IixkLmNvbnRleHRtZW51LmdldE1lbnUoQSxkLm5vZGUuZ2V0Q29udGV4dE1lbnUodi5ub2RlLEEpKSl9ZnVuY3Rpb24gcShyLHQsdixBKXtsZXQgeT1jLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKHQpO3YucmVuZGVyTm9kZUluZm8mJnYuYW5ub3RhdGlvblR5cGUhPT1jLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5FTExJUFNJUyYmZC5ub2RlLnN0eWxpemUocix2LnJlbmRlck5vZGVJbmZvLEEsZC5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpO3YuYW5ub3RhdGlvblR5cGU9PT1jLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZJiYodi53aWR0aCs9MTApO3Iuc2VsZWN0KCJ0ZXh0LiIrZC5DbGFzcy5Bbm5vdGF0aW9uLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIsCnkrdi5keCsodi5pc0luPy0xOjEpKih2LndpZHRoLzIrdi5sYWJlbE9mZnNldCkpLmF0dHIoInkiLHQueSt2LmR5KTtyLnNlbGVjdCgidXNlLnN1bW1hcnkiKS50cmFuc2l0aW9uKCkuYXR0cigieCIseSt2LmR4LTMpLmF0dHIoInkiLHQueSt2LmR5LTYpO2QucG9zaXRpb25FbGxpcHNlKHIuc2VsZWN0KCIuIitkLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIGVsbGlwc2UiKSx5K3YuZHgsdC55K3YuZHksdi53aWR0aCx2LmhlaWdodCk7ZC5wb3NpdGlvblJlY3Qoci5zZWxlY3QoIi4iK2QuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgcmVjdCIpLHkrdi5keCx0Lnkrdi5keSx2LndpZHRoLHYuaGVpZ2h0KTtkLnBvc2l0aW9uUmVjdChyLnNlbGVjdCgiLiIrZC5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiB1c2UiKSx5K3YuZHgsdC55K3YuZHksdi53aWR0aCx2LmhlaWdodCk7ci5zZWxlY3QoInBhdGguIitkLkNsYXNzLkFubm90YXRpb24uRURHRSkudHJhbnNpdGlvbigpLmF0dHIoImQiLHg9Pgp7eD14LnBvaW50cy5tYXAoQz0+KHt4OkMuZHgreSx5OkMuZHkrdC55fSkpO3JldHVybiBkLmVkZ2UuaW50ZXJwb2xhdGUoeCl9KX1mLmJ1aWxkR3JvdXA9ZnVuY3Rpb24ocix0LHYsQSl7cj1yLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKHQubGlzdCx5PT55Lm5vZGUubmFtZSk7ci5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImRhdGEtbmFtZSIseT0+eS5ub2RlLm5hbWUpLmVhY2goZnVuY3Rpb24oeSl7bGV0IHg9ZDMuc2VsZWN0KHRoaXMpO0EuYWRkQW5ub3RhdGlvbkdyb3VwKHksdix4KTtsZXQgQz1kLkNsYXNzLkFubm90YXRpb24uRURHRSxGPXkucmVuZGVyTWV0YWVkZ2VJbmZvJiZ5LnJlbmRlck1ldGFlZGdlSW5mby5tZXRhZWRnZTtGJiYhRi5udW1SZWd1bGFyRWRnZXMmJihDKz0iICIrZC5DbGFzcy5Bbm5vdGF0aW9uLkNPTlRST0xfRURHRSk7RiYmRi5udW1SZWZFZGdlcyYmKEMrPSIgIitkLkNsYXNzLkVkZ2UuUkVGX0xJTkUpOwpkLmVkZ2UuYXBwZW5kRWRnZSh4LHksQSxDKTt5LmFubm90YXRpb25UeXBlIT09Yy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVM/KGsoeCx5KSxsKHgseSkpOm0oeCx5Lm5vZGUubmFtZSx5LGQuQ2xhc3MuQW5ub3RhdGlvbi5FTExJUFNJUyl9KS5tZXJnZShyKS5hdHRyKCJjbGFzcyIseT0+ZC5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKyIgIitnKHkuYW5ub3RhdGlvblR5cGUpKyIgIitkLm5vZGUubm9kZUNsYXNzKHkpKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB4PWQzLnNlbGVjdCh0aGlzKTtxKHgsdix5LEEpO3kuYW5ub3RhdGlvblR5cGUhPT1jLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5FTExJUFNJUyYmcCh4LHYseSxBKX0pO3IuZXhpdCgpLmVhY2goZnVuY3Rpb24oeSl7bGV0IHg9ZDMuc2VsZWN0KHRoaXMpO0EucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKHksdix4KX0pLnJlbW92ZSgpO3JldHVybiByfX0pKGQuYW5ub3RhdGlvbnx8KGQuYW5ub3RhdGlvbj17fSkpfSkoYy5zY2VuZXx8CihjLnNjZW5lPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWdyYXBoLWNvbW1vbi9jb2xvcnMuanMKKGZ1bmN0aW9uKGEpe2EuQ09MT1JTPVt7bmFtZToiR29vZ2xlIEJsdWUiLGNvbG9yOiIjNDE4NGYzIixhY3RpdmU6IiMzYTUzYzUiLGRpc2FibGVkOiIjY2FkOGZjIn0se25hbWU6Ikdvb2dsZSBSZWQiLGNvbG9yOiIjZGI0NDM3IixhY3RpdmU6IiM4ZjJhMGMiLGRpc2FibGVkOiIjZThjNmMxIn0se25hbWU6Ikdvb2dsZSBZZWxsb3ciLGNvbG9yOiIjZjRiNDAwIixhY3RpdmU6IiNkYjkyMDAiLGRpc2FibGVkOiIjZjdlOGIwIn0se25hbWU6Ikdvb2dsZSBHcmVlbiIsY29sb3I6IiMwZjlkNTgiLGFjdGl2ZToiIzQ4ODA0NiIsZGlzYWJsZWQ6IiNjMmUxY2MifSx7bmFtZToiUHVycGxlIixjb2xvcjoiI2FhNDZiYiIsYWN0aXZlOiIjNWMxMzk4IixkaXNhYmxlZDoiI2Q3YmNlNiJ9LHtuYW1lOiJUZWFsIixjb2xvcjoiIzAwYWJjMCIsYWN0aXZlOiIjNDc4MjhlIixkaXNhYmxlZDoiI2MyZWFmMiJ9LHtuYW1lOiJEZWVwIE9yYW5nZSIsY29sb3I6IiNmZjZmNDIiLGFjdGl2ZToiI2NhNGEwNiIsCmRpc2FibGVkOiIjZjJjYmJhIn0se25hbWU6IkxpbWUiLGNvbG9yOiIjOWQ5YzIzIixhY3RpdmU6IiM3Zjc3MWQiLGRpc2FibGVkOiIjZjFmNGMyIn0se25hbWU6IkluZGlnbyIsY29sb3I6IiM1YjZhYmYiLGFjdGl2ZToiIzNlNDdhOSIsZGlzYWJsZWQ6IiNjNWM4ZTgifSx7bmFtZToiUGluayIsY29sb3I6IiNlZjYxOTEiLGFjdGl2ZToiI2NhMWM2MCIsZGlzYWJsZWQ6IiNlOWI5Y2UifSx7bmFtZToiRGVlcCBUZWFsIixjb2xvcjoiIzAwNzg2YSIsYWN0aXZlOiIjMmI0ZjQzIixkaXNhYmxlZDoiI2JlZGVkYSJ9LHtuYW1lOiJEZWVwIFBpbmsiLGNvbG9yOiIjYzExNzVhIixhY3RpdmU6IiM3NTA4NGYiLGRpc2FibGVkOiIjZGU4Y2FlIn0se25hbWU6IkdyYXkiLGNvbG9yOiIjOUU5RTlFIixhY3RpdmU6IiM0MjQyNDIiLGRpc2FibGVkOiJGNUY1RjUifV0ucmVkdWNlKChjLGQpPT57Y1tkLm5hbWVdPWQ7cmV0dXJuIGN9LHt9KTthLk9QX0dST1VQX0NPTE9SUz1be2NvbG9yOiJHb29nbGUgUmVkIiwKZ3JvdXBzOiJnZW5fbGVnYWN5X29wcyBsZWdhY3lfb3BzIGxlZ2FjeV9mbG9nc19pbnB1dCBsZWdhY3lfaW1hZ2VfaW5wdXQgbGVnYWN5X2lucHV0X2V4YW1wbGVfaW5wdXQgbGVnYWN5X3NlcXVlbmNlX2lucHV0IGxlZ2FjeV9zZXRpX2lucHV0X2lucHV0Ii5zcGxpdCgiICIpfSx7Y29sb3I6IkRlZXAgT3JhbmdlIixncm91cHM6WyJjb25zdGFudF9vcHMiXX0se2NvbG9yOiJJbmRpZ28iLGdyb3VwczpbInN0YXRlX29wcyJdfSx7Y29sb3I6IlB1cnBsZSIsZ3JvdXBzOlsibm5fb3BzIiwibm4iXX0se2NvbG9yOiJHb29nbGUgR3JlZW4iLGdyb3VwczpbIm1hdGhfb3BzIl19LHtjb2xvcjoiTGltZSIsZ3JvdXBzOlsiYXJyYXlfb3BzIl19LHtjb2xvcjoiVGVhbCIsZ3JvdXBzOlsiY29udHJvbF9mbG93X29wcyIsImRhdGFfZmxvd19vcHMiXX0se2NvbG9yOiJQaW5rIixncm91cHM6WyJzdW1tYXJ5X29wcyJdfSx7Y29sb3I6IkRlZXAgUGluayIsZ3JvdXBzOlsiaW9fb3BzIl19XS5yZWR1Y2UoKGMsCmQpPT57ZC5ncm91cHMuZm9yRWFjaChmdW5jdGlvbihmKXtjW2ZdPWQuY29sb3J9KTtyZXR1cm4gY30se30pfSkodGZ8fCh0Zj17fSkpOwo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWdyYXBoLWNvbW1vbi9jb21tb24uanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZC5PUF9HUkFQSD0ib3BfZ3JhcGgiO2QuQ09OQ0VQVFVBTF9HUkFQSD0iY29uY2VwdHVhbF9ncmFwaCI7ZC5QUk9GSUxFPSJwcm9maWxlIn0pKGMuU2VsZWN0aW9uVHlwZXx8KGMuU2VsZWN0aW9uVHlwZT17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1jb21tb24vY29udGV4dG1lbnUuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGcobCl7bGV0IGs9MCxtPTA7Zm9yKDtsJiYwPD1sLm9mZnNldExlZnQmJjA8PWwub2Zmc2V0VG9wOylrKz1sLm9mZnNldExlZnQtbC5zY3JvbGxMZWZ0LG0rPWwub2Zmc2V0VG9wLWwuc2Nyb2xsVG9wLGw9bC5vZmZzZXRQYXJlbnQ7cmV0dXJue2xlZnQ6ayx0b3A6bX19Zi5nZXRNZW51PWZ1bmN0aW9uKGwsayl7Y29uc3QgbT1sLmdldENvbnRleHRNZW51KCkscD1kMy5zZWxlY3QobC5nZXRDb250ZXh0TWVudSgpKTtyZXR1cm4gZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KHkpe3kmJnkuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMobSl8fChwLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0LHtjYXB0dXJlOiEwfSkpfWxldCB2PWQzLmV2ZW50O2NvbnN0IEE9ZyhsKTtwLnN0eWxlKCJkaXNwbGF5IiwiYmxvY2siKS5zdHlsZSgibGVmdCIsCnYuY2xpZW50WC1BLmxlZnQrMSsicHgiKS5zdHlsZSgidG9wIix2LmNsaWVudFktQS50b3ArMSsicHgiKTt2LnByZXZlbnREZWZhdWx0KCk7di5zdG9wUHJvcGFnYXRpb24oKTtkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdCx7Y2FwdHVyZTohMH0pO3AuaHRtbCgiIik7cC5hcHBlbmQoInVsIikuc2VsZWN0QWxsKCJsaSIpLmRhdGEoaykuZW50ZXIoKS5hcHBlbmQoImxpIikub24oImNsaWNrIix5PT57eS5hY3Rpb24odGhpcyxxLHIpO3QoKX0pLmh0bWwoZnVuY3Rpb24oeSl7cmV0dXJuIHkudGl0bGUocSl9KX19fSkoZC5jb250ZXh0bWVudXx8KGQuY29udGV4dG1lbnU9e30pKX0pKGMuc2NlbmV8fChjLnNjZW5lPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWdyYXBoLWNvbW1vbi9lZGdlLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBnKHkpe3JldHVybiB5LnYrYy5FREdFX0tFWV9ERUxJTSt5Lnd9ZnVuY3Rpb24gbCh5LHgpe3g9eC5nZXROb2RlQnlOYW1lKHkudik7aWYobnVsbD09eC5vdXRwdXRTaGFwZXN8fF8uaXNFbXB0eSh4Lm91dHB1dFNoYXBlcykpcmV0dXJuIG51bGw7eT14Lm91dHB1dFNoYXBlc1t5Lm91dHB1dFRlbnNvcktleV07cmV0dXJuIG51bGw9PXk/bnVsbDowPT09eS5sZW5ndGg/InNjYWxhciI6eS5tYXAoQz0+LTE9PT1DPyI/IjpDKS5qb2luKCJcdTAwZDciKX1mdW5jdGlvbiBrKHkseCl7cmV0dXJuIHguZWRnZUxhYmVsRnVuY3Rpb24/eC5lZGdlTGFiZWxGdW5jdGlvbih5LHgpOjE8eS5iYXNlRWRnZUxpc3QubGVuZ3RoP3kuYmFzZUVkZ2VMaXN0Lmxlbmd0aCsiIHRlbnNvcnMiOmwoeS5iYXNlRWRnZUxpc3RbMF0seCl9ZnVuY3Rpb24gbSh5LHgsQyl7Y29uc3QgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoYS5ncmFwaC5zY2VuZS5TVkdfTkFNRVNQQUNFLAoicGF0aCIpO2ZvcihsZXQgRD0xO0Q8eS5sZW5ndGg7RCsrKWlmKEYuc2V0QXR0cmlidXRlKCJkIixDKHkuc2xpY2UoMCxEKSkpLEYuZ2V0VG90YWxMZW5ndGgoKT54KXJldHVybiBELTE7cmV0dXJuIHkubGVuZ3RoLTF9ZnVuY3Rpb24gcCh5LHgsQyl7dmFyIEY9ZDMubGluZSgpLngoSz0+Sy54KS55KEs9PksueSksRD1kMy5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsInBhdGgiKSkuYXR0cigiZCIsRih5KSksQj0reC5hdHRyKCJtYXJrZXJXaWR0aCIpLEc9eC5hdHRyKCJ2aWV3Qm94Iikuc3BsaXQoIiAiKS5tYXAoTnVtYmVyKTtHPUdbMl0tR1swXTt4PSt4LmF0dHIoInJlZlgiKTtEPUQubm9kZSgpO2lmKEMpcmV0dXJuIEIqPTEteC9HLEM9RC5nZXRQb2ludEF0TGVuZ3RoKEIpLEY9bSh5LEIsRikseVtGLTFdPXt4OkMueCx5OkMueX0seS5zbGljZShGLTEpO0M9MS14L0c7Qj1ELmdldFRvdGFsTGVuZ3RoKCktQipDO0M9CkQuZ2V0UG9pbnRBdExlbmd0aChCKTtGPW0oeSxCLEYpO3lbRl09e3g6Qy54LHk6Qy55fTtyZXR1cm4geS5zbGljZSgwLEYrMSl9ZnVuY3Rpb24gcSh5LHgsQyxGKXtGPUZ8fGQuQ2xhc3MuRWRnZS5MSU5FO3gubGFiZWwmJngubGFiZWwuc3RydWN0dXJhbCYmKEYrPSIgIitkLkNsYXNzLkVkZ2UuU1RSVUNUVVJBTCk7eC5sYWJlbCYmeC5sYWJlbC5tZXRhZWRnZSYmeC5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcyYmKEYrPSIgIitkLkNsYXNzLkVkZ2UuUkVGRVJFTkNFX0VER0UpO0MuaGFuZGxlRWRnZVNlbGVjdGVkJiYoRis9IiAiK2QuQ2xhc3MuRWRnZS5TRUxFQ1RBQkxFKTtsZXQgRD0icGF0aF8iK2coeCk7aWYoQy5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoRnVuY3Rpb24pdmFyIEI9Qy5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoRnVuY3Rpb24oeCxGKTtlbHNlIEI9MSxudWxsIT14LmxhYmVsJiZudWxsIT14LmxhYmVsLm1ldGFlZGdlJiYoQj14LmxhYmVsLm1ldGFlZGdlLnRvdGFsU2l6ZSksCkI9Qy5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoU2l6ZWRCYXNlZFNjYWxlKEIpO0Y9eS5hcHBlbmQoInBhdGgiKS5hdHRyKCJpZCIsRCkuYXR0cigiY2xhc3MiLEYpLnN0eWxlKCJzdHJva2Utd2lkdGgiLEIrInB4Iik7eC5sYWJlbCYmeC5sYWJlbC5tZXRhZWRnZSYmKHgubGFiZWwubWV0YWVkZ2UubnVtUmVmRWRnZXM/KEI9YHJlZmVyZW5jZS1hcnJvd2hlYWQtJHtBKEIpfWAsRi5zdHlsZSgibWFya2VyLXN0YXJ0IixgdXJsKCMke0J9KWApLHgubGFiZWwuc3RhcnRNYXJrZXJJZD1CKTooQj1gZGF0YWZsb3ctYXJyb3doZWFkLSR7QShCKX1gLEYuc3R5bGUoIm1hcmtlci1lbmQiLGB1cmwoIyR7Qn0pYCkseC5sYWJlbC5lbmRNYXJrZXJJZD1CKSk7bnVsbCE9eC5sYWJlbCYmbnVsbCE9eC5sYWJlbC5tZXRhZWRnZSYmKHg9ayh4LmxhYmVsLm1ldGFlZGdlLEMucmVuZGVySGllcmFyY2h5KSxudWxsIT14JiZ5LmFwcGVuZCgidGV4dCIpLmFwcGVuZCgidGV4dFBhdGgiKS5hdHRyKCJ4bGluazpocmVmIiwKIiMiK0QpLmF0dHIoInN0YXJ0T2Zmc2V0IiwiNTAlIikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJkb21pbmFudC1iYXNlbGluZSIsImNlbnRyYWwiKS50ZXh0KHgpKX1mdW5jdGlvbiByKHkseCxDLEYsRCl7Rj1DLmxhYmVsO2xldCBCPUYuYWRqb2luaW5nTWV0YWVkZ2UsRz1GLnBvaW50czsoe3NoYWRvd1Jvb3Q6eX09eSk7Qy5sYWJlbC5zdGFydE1hcmtlcklkJiYoRz1wKEcsZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5zdGFydE1hcmtlcklkKSksITApKTtDLmxhYmVsLmVuZE1hcmtlcklkJiYoRz1wKEcsZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5lbmRNYXJrZXJJZCkpLCExKSk7aWYoIUIpcmV0dXJuIGQzLmludGVycG9sYXRlKEQsZi5pbnRlcnBvbGF0ZShHKSk7bGV0IEs9Qi5lZGdlR3JvdXAubm9kZSgpLmZpcnN0Q2hpbGQsTD1GLm1ldGFlZGdlLmluYm91bmQ7cmV0dXJuIGZ1bmN0aW9uKCl7bGV0IEo9Sy5nZXRQb2ludEF0TGVuZ3RoKEw/CksuZ2V0VG90YWxMZW5ndGgoKTowKS5tYXRyaXhUcmFuc2Zvcm0oSy5nZXRDVE0oKSkubWF0cml4VHJhbnNmb3JtKHguZ2V0Q1RNKCkuaW52ZXJzZSgpKSxQPUw/MDpHLmxlbmd0aC0xO0dbUF0ueD1KLng7R1tQXS55PUoueTtyZXR1cm4gZi5pbnRlcnBvbGF0ZShHKX19ZnVuY3Rpb24gdCh5LHgpe2QzLnNlbGVjdCh4KS5zZWxlY3QoInBhdGguIitkLkNsYXNzLkVkZ2UuTElORSkudHJhbnNpdGlvbigpLmF0dHJUd2VlbigiZCIsZnVuY3Rpb24oQyxGLEQpe3JldHVybiByKHksdGhpcyxDLEYsRCl9KX1mdW5jdGlvbiB2KHkseCl7eS5jbGFzc2VkKCJmYWRlZCIseC5sYWJlbC5pc0ZhZGVkT3V0KTt4PXgubGFiZWwubWV0YWVkZ2U7eS5zZWxlY3QoInBhdGguIitkLkNsYXNzLkVkZ2UuTElORSkuY2xhc3NlZCgiY29udHJvbC1kZXAiLHgmJiF4Lm51bVJlZ3VsYXJFZGdlcyl9Zi5NSU5fRURHRV9XSURUSD0uNzU7Zi5NQVhfRURHRV9XSURUSD0xMjtmLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRT0KZDMuc2NhbGVQb3coKS5leHBvbmVudCguMykuZG9tYWluKFsxLDVFNl0pLnJhbmdlKFtmLk1JTl9FREdFX1dJRFRILGYuTUFYX0VER0VfV0lEVEhdKS5jbGFtcCghMCk7bGV0IEE9ZDMuc2NhbGVRdWFudGl6ZSgpLmRvbWFpbihbZi5NSU5fRURHRV9XSURUSCxmLk1BWF9FREdFX1dJRFRIXSkucmFuZ2UoWyJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwieGxhcmdlIl0pO2YuZ2V0RWRnZUtleT1nO2YuYnVpbGRHcm91cD1mdW5jdGlvbih5LHgsQyl7bGV0IEY9W107Rj1fLnJlZHVjZSh4LmVkZ2VzKCksKEQsQik9PntsZXQgRz14LmVkZ2UoQik7RC5wdXNoKHt2OkIudix3OkIudyxsYWJlbDpHfSk7cmV0dXJuIER9LEYpO3k9ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKHksImciLGQuQ2xhc3MuRWRnZS5DT05UQUlORVIpLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKEYsZyk7eS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixkLkNsYXNzLkVkZ2UuR1JPVVApLmF0dHIoImRhdGEtZWRnZSIsCmcpLmVhY2goZnVuY3Rpb24oRCl7bGV0IEI9ZDMuc2VsZWN0KHRoaXMpO0QubGFiZWwuZWRnZUdyb3VwPUI7Qy5fZWRnZUdyb3VwSW5kZXhbZyhEKV09QjtpZihDLmhhbmRsZUVkZ2VTZWxlY3RlZClCLm9uKCJjbGljayIsRz0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO0MuZmlyZSgiZWRnZS1zZWxlY3QiLHtlZGdlRGF0YTpHLGVkZ2VHcm91cDpCfSl9KTtxKEIsRCxDKX0pLm1lcmdlKHkpLmVhY2goZnVuY3Rpb24oKXt0KEMsdGhpcyl9KS5lYWNoKGZ1bmN0aW9uKEQpe3YoZDMuc2VsZWN0KHRoaXMpLEQsQyl9KTt5LmV4aXQoKS5lYWNoKEQ9PntkZWxldGUgQy5fZWRnZUdyb3VwSW5kZXhbZyhEKV19KS5yZW1vdmUoKTtyZXR1cm4geX07Zi5nZXRMYWJlbEZvckJhc2VFZGdlPWw7Zi5nZXRMYWJlbEZvckVkZ2U9aztmLmFwcGVuZEVkZ2U9cTtmLmludGVycG9sYXRlPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKS54KHk9PnkueCkueSh5PT55LnkpfSkoZC5lZGdlfHwoZC5lZGdlPQp7fSkpfSkoYy5zY2VuZXx8KGMuc2NlbmU9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtY29tbW9uL2V4dGVybnMuanMKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1jb21tb24vZ3JhcGguanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXtmdW5jdGlvbiBkKEosUCxTLE4sVCl7cmV0dXJuKFM/UysiLyI6IiIpKyhKKygidW5kZWZpbmVkIiE9PXR5cGVvZiBOJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBUPyJbIitOKyItIitUKyJdIjoiIyIpK1ApfWZ1bmN0aW9uIGYoSil7aWYoIUopcmV0dXJuIG51bGw7Zm9yKGxldCBQPTA7UDxKLmxlbmd0aDtQKyspe2xldCB7a2V5OlMsdmFsdWU6Tn09SltQXTtpZigiX291dHB1dF9zaGFwZXMiPT09Uyl7aWYoIU4ubGlzdC5zaGFwZSlicmVhaztsZXQgVD1OLmxpc3Quc2hhcGUubWFwKFk9PlkudW5rbm93bl9yYW5rP251bGw6bnVsbD09WS5kaW18fDE9PT1ZLmRpbS5sZW5ndGgmJm51bGw9PVkuZGltWzBdLnNpemU/W106WS5kaW0ubWFwKGFhPT5hYS5zaXplKSk7Si5zcGxpY2UoUCwxKTtyZXR1cm4gVH19cmV0dXJuIG51bGx9ZnVuY3Rpb24gZyhKKXtpZighSilyZXR1cm4gbnVsbDtmb3IobGV0IFA9MDtQPEoubGVuZ3RoO1ArKylpZigiX1hsYUNsdXN0ZXIiPT09CkpbUF0ua2V5KXJldHVybiBKW1BdLnZhbHVlLnN8fG51bGw7cmV0dXJuIG51bGx9ZnVuY3Rpb24gbChKKXtsZXQgUD1bXTtfLmVhY2goSixTPT57bGV0IE49Il4iPT09U1swXTtOJiYoUz1TLnN1YnN0cmluZygxKSk7bGV0IFQ9UyxZPSIwIixhYT1TLm1hdGNoKC8oLiopOihcdys6XGQrKSQvKTtpZihhYSlUPWFhWzFdLFk9YWFbMl07ZWxzZSBpZihhYT1TLm1hdGNoKC8oLiopOihcZCspJC8pKVQ9YWFbMV0sWT1hYVsyXTswIT09UC5sZW5ndGgmJlQ9PT1QW1AubGVuZ3RoLTFdLm5hbWV8fFAucHVzaCh7bmFtZTpULG91dHB1dFRlbnNvcktleTpZLGlzQ29udHJvbERlcGVuZGVuY3k6Tn0pfSk7cmV0dXJuIFB9ZnVuY3Rpb24gayhKLFAsUyxOLFQsWSl7UCE9PVMubmFtZSYmSi5lZGdlcy5wdXNoKHt2OlAsdzpTLm5hbWUsb3V0cHV0VGVuc29yS2V5Ok4ub3V0cHV0VGVuc29yS2V5LGlzQ29udHJvbERlcGVuZGVuY3k6Ti5pc0NvbnRyb2xEZXBlbmRlbmN5LGlzUmVmZXJlbmNlRWRnZTohMD09PQpULnJlZkVkZ2VzW1Mub3ArIiAiK1ldfSl9ZnVuY3Rpb24gbShKLFAsUyl7Uz1TfHx7fTtsZXQgTj1uZXcgZ3JhcGhsaWIuR3JhcGgoUyk7Ti5zZXRHcmFwaCh7bmFtZTpKLHJhbmtkaXI6Uy5yYW5rZGlyfHwiQlQiLHR5cGU6UH0pO3JldHVybiBOfWZ1bmN0aW9uIHAoSil7cmV0dXJuIGZ1bmN0aW9uKFApe2ZvcihsZXQgUz0wO1M8Si5sZW5ndGg7UysrKXtsZXQgTj1uZXcgUmVnRXhwKEpbU10pO2lmKCJzdHJpbmciPT09dHlwZW9mIFAub3AmJlAub3AubWF0Y2goTikpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHEoSil7bGV0IFA9Si5zcGxpdChjLk5BTUVTUEFDRV9ERUxJTSk7cmV0dXJuIEorYy5OQU1FU1BBQ0VfREVMSU0rIigiK1BbUC5sZW5ndGgtMV0rIikifWZ1bmN0aW9uIHIoSixQKXtsZXQgUz17fSxOPXt9O0ouc29ydCgpO2ZvcihsZXQgVD0wO1Q8Si5sZW5ndGgtMTsrK1Qpe2xldCBZPUpbVF07Xy5lYWNoKHYoWSkuc2xpY2UoMCwtMSksYWE9PntOW2FhXT0hMH0pO2ZvcihsZXQgYWE9ClQrMTthYTxKLmxlbmd0aDsrK2FhKXtsZXQgaGE9SlthYV07aWYoXy5zdGFydHNXaXRoKGhhLFkpKXtpZihoYS5sZW5ndGg+WS5sZW5ndGgmJmhhLmNoYXJBdChZLmxlbmd0aCk9PT1jLk5BTUVTUEFDRV9ERUxJTSl7U1tZXT1xKFkpO2JyZWFrfX1lbHNlIGJyZWFrfX1fLmVhY2goUCxUPT57VCBpbiBOJiYoU1tUXT1xKFQpKX0pO3JldHVybiBTfWZ1bmN0aW9uIHQoSil7bGV0IFA9Si5ub2RlcygpLm1hcChmdW5jdGlvbihTKXtyZXR1cm4gSi5uZWlnaGJvcnMoUykubGVuZ3RofSk7UC5zb3J0KCk7cmV0dXJuIFB9ZnVuY3Rpb24gdihKLFApe2xldCBTPVtdLE49Si5pbmRleE9mKGMuTkFNRVNQQUNFX0RFTElNKTtmb3IoOzA8PU47KVMucHVzaChKLnN1YnN0cmluZygwLE4pKSxOPUouaW5kZXhPZihjLk5BTUVTUEFDRV9ERUxJTSxOKzEpO1AmJihQPVBbSl0pJiZTLnB1c2goUCk7Uy5wdXNoKEopO3JldHVybiBTfWMuTkFNRVNQQUNFX0RFTElNPSIvIjtjLlJPT1RfTkFNRT0iX19yb290X18iOwpjLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVg9Il9fZnVuY3Rpb25fbGlicmFyeV9fIjtjLkxBUkdFX0FUVFJTX0tFWT0iX3Rvb19sYXJnZV9hdHRycyI7Yy5MSU1JVF9BVFRSX1NJWkU9MTAyNDtjLkVER0VfS0VZX0RFTElNPSItLSI7bGV0IEE7KGZ1bmN0aW9uKEope0pbSi5GVUxMPTBdPSJGVUxMIjtKW0ouRU1CRURERUQ9MV09IkVNQkVEREVEIjtKW0ouTUVUQT0yXT0iTUVUQSI7SltKLlNFUklFUz0zXT0iU0VSSUVTIjtKW0ouQ09SRT00XT0iQ09SRSI7SltKLlNIQURPVz01XT0iU0hBRE9XIjtKW0ouQlJJREdFPTZdPSJCUklER0UiO0pbSi5FREdFPTddPSJFREdFIn0pKEE9Yy5HcmFwaFR5cGV8fChjLkdyYXBoVHlwZT17fSkpO2xldCB5OyhmdW5jdGlvbihKKXtKW0ouTUVUQT0wXT0iTUVUQSI7SltKLk9QPTFdPSJPUCI7SltKLlNFUklFUz0yXT0iU0VSSUVTIjtKW0ouQlJJREdFPTNdPSJCUklER0UiO0pbSi5FTExJUFNJUz00XT0iRUxMSVBTSVMifSkoeT1jLk5vZGVUeXBlfHwKKGMuTm9kZVR5cGU9e30pKTtsZXQgeDsoZnVuY3Rpb24oSil7SltKLklOQ0xVREU9MF09IklOQ0xVREUiO0pbSi5FWENMVURFPTFdPSJFWENMVURFIjtKW0ouVU5TUEVDSUZJRUQ9Ml09IlVOU1BFQ0lGSUVEIn0pKHg9Yy5JbmNsdXNpb25UeXBlfHwoYy5JbmNsdXNpb25UeXBlPXt9KSk7KGZ1bmN0aW9uKEope0pbSi5HUk9VUD0wXT0iR1JPVVAiO0pbSi5VTkdST1VQPTFdPSJVTkdST1VQIn0pKGMuU2VyaWVzR3JvdXBpbmdUeXBlfHwoYy5TZXJpZXNHcm91cGluZ1R5cGU9e30pKTtjbGFzcyBDe2NvbnN0cnVjdG9yKCl7dGhpcy5ub2Rlcz17fTt0aGlzLmVkZ2VzPVtdfX1jLlNsaW1HcmFwaD1DO2NsYXNzIEZ7Y29uc3RydWN0b3IoSil7dGhpcy50eXBlPXkuRUxMSVBTSVM7dGhpcy5pc0dyb3VwTm9kZT0hMTt0aGlzLmNhcmRpbmFsaXR5PTE7dGhpcy5zdGF0cz10aGlzLnBhcmVudE5vZGU9bnVsbDt0aGlzLnNldE51bU1vcmVOb2RlcyhKKTt0aGlzLmluY2x1ZGU9eC5VTlNQRUNJRklFRH1zZXROdW1Nb3JlTm9kZXMoSil7dGhpcy5udW1Nb3JlTm9kZXM9Cko7dGhpcy5uYW1lPSIuLi4gIitKKyIgbW9yZSJ9fWMuRWxsaXBzaXNOb2RlSW1wbD1GO2NsYXNzIER7Y29uc3RydWN0b3IoSil7dGhpcy5vcD1KLm9wO3RoaXMubmFtZT1KLm5hbWU7dGhpcy5kZXZpY2U9Si5kZXZpY2U7dGhpcy5hdHRyPUouYXR0cjt0aGlzLmlucHV0cz1sKEouaW5wdXQpO3RoaXMub3V0cHV0U2hhcGVzPWYoSi5hdHRyKTt0aGlzLnhsYUNsdXN0ZXI9ZyhKLmF0dHIpO3RoaXMuY29tcGF0aWJsZT0hMTt0aGlzLnR5cGU9eS5PUDt0aGlzLmlzR3JvdXBOb2RlPSExO3RoaXMuY2FyZGluYWxpdHk9MTt0aGlzLmluRW1iZWRkaW5ncz1bXTt0aGlzLm91dEVtYmVkZGluZ3M9W107dGhpcy5wYXJlbnROb2RlPW51bGw7dGhpcy5pbmNsdWRlPXguVU5TUEVDSUZJRUQ7dGhpcy5vd25pbmdTZXJpZXM9bnVsbH19Yy5PcE5vZGVJbXBsPUQ7Yy5jcmVhdGVNZXRhbm9kZT1mdW5jdGlvbihKLFA9e30pe3JldHVybiBuZXcgRyhKLFApfTtjLmpvaW5TdGF0c0luZm9XaXRoR3JhcGg9ZnVuY3Rpb24oSiwKUCxTKXtfLmVhY2goSi5ub2RlcyxOPT57Ti5zdGF0cz1udWxsfSk7Xy5lYWNoKFAuZGV2X3N0YXRzLE49PntTJiYhU1tOLmRldmljZV18fF8uZWFjaChOLm5vZGVfc3RhdHMsVD0+e2xldCBZPVQubm9kZV9uYW1lIGluIEoubm9kZXM/VC5ub2RlX25hbWU6cShULm5vZGVfbmFtZSk7aWYoWSBpbiBKLm5vZGVzKXt2YXIgYWE9MDtULm1lbW9yeSYmXy5lYWNoKFQubWVtb3J5LFg9PntYLnRvdGFsX2J5dGVzJiYoMDxYLnRvdGFsX2J5dGVzP2FhKz1OdW1iZXIoWC50b3RhbF9ieXRlcyk6Y29uc29sZS5sb2coImlnbm9yaW5nIG5lZ2F0aXZlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciAiK1kpKX0pO3ZhciBoYT1udWxsO1Qub3V0cHV0JiYoaGE9Xy5tYXAoVC5vdXRwdXQsWD0+Xy5tYXAoWC50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltLGNhPT5OdW1iZXIoY2Euc2l6ZSkpKSk7Si5ub2Rlc1tZXS5kZXZpY2U9Ti5kZXZpY2U7bnVsbD09Si5ub2Rlc1tZXS5zdGF0cyYmKEoubm9kZXNbWV0uc3RhdHM9Cm5ldyBCKGhhKSk7Si5ub2Rlc1tZXS5zdGF0cy5hZGRCeXRlc0FsbG9jYXRpb24oYWEpO1QuYWxsX2VuZF9yZWxfbWljcm9zJiYoMDxULmFsbF9lbmRfcmVsX21pY3Jvcz9KLm5vZGVzW1ldLnN0YXRzLmFkZEV4ZWN1dGlvblRpbWUoVC5hbGxfc3RhcnRfbWljcm9zLFQuYWxsX3N0YXJ0X21pY3JvcytULmFsbF9lbmRfcmVsX21pY3Jvcyk6Y29uc29sZS5sb2coImlnbm9yaW5nIG5lZ2F0aXZlIHJ1bnRpbWUgZm9yICIrWSkpfX0pfSl9O2NsYXNzIEJ7Y29uc3RydWN0b3IoSil7dGhpcy50b3RhbEJ5dGVzPTA7dGhpcy5vdXRwdXRTaXplPUp9YWRkRXhlY3V0aW9uVGltZShKLFApe3RoaXMuc3RhcnRUaW1lPW51bGwhPXRoaXMuc3RhcnRUaW1lP01hdGgubWluKHRoaXMuc3RhcnRUaW1lLEopOko7dGhpcy5lbmRUaW1lPW51bGwhPXRoaXMuZW5kVGltZT9NYXRoLm1heCh0aGlzLmVuZFRpbWUsUCk6UH1hZGRCeXRlc0FsbG9jYXRpb24oSil7dGhpcy50b3RhbEJ5dGVzPW51bGwhPXRoaXMudG90YWxCeXRlcz8KTWF0aC5tYXgodGhpcy50b3RhbEJ5dGVzLEopOkp9Y29tYmluZShKKXtudWxsIT1KLnRvdGFsQnl0ZXMmJih0aGlzLnRvdGFsQnl0ZXMrPUoudG90YWxCeXRlcyk7bnVsbCE9Si5nZXRUb3RhbE1pY3JvcygpJiZ0aGlzLmFkZEV4ZWN1dGlvblRpbWUoSi5zdGFydFRpbWUsSi5lbmRUaW1lKX1nZXRUb3RhbE1pY3Jvcygpe3JldHVybiBudWxsPT10aGlzLnN0YXJ0VGltZXx8bnVsbD09dGhpcy5lbmRUaW1lP251bGw6dGhpcy5lbmRUaW1lLXRoaXMuc3RhcnRUaW1lfX1jLk5vZGVTdGF0cz1CO2NsYXNzIEd7Y29uc3RydWN0b3IoSixQPXt9KXt0aGlzLm5hbWU9Sjt0aGlzLnR5cGU9eS5NRVRBO3RoaXMuZGVwdGg9MTt0aGlzLmlzR3JvdXBOb2RlPSEwO3RoaXMuY2FyZGluYWxpdHk9MDt0aGlzLm1ldGFncmFwaD1tKEosQS5NRVRBLFApO3RoaXMuYnJpZGdlZ3JhcGg9bnVsbDt0aGlzLm9wSGlzdG9ncmFtPXt9O3RoaXMuZGV2aWNlSGlzdG9ncmFtPXt9O3RoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT0Ke307dGhpcy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtPXtjb21wYXRpYmxlOjAsaW5jb21wYXRpYmxlOjB9O3RoaXMucGFyZW50Tm9kZT10aGlzLnRlbXBsYXRlSWQ9bnVsbDt0aGlzLmhhc05vbkNvbnRyb2xFZGdlcz0hMTt0aGlzLmluY2x1ZGU9eC5VTlNQRUNJRklFRDt0aGlzLmFzc29jaWF0ZWRGdW5jdGlvbj0iIn1nZXRGaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMubWV0YWdyYXBoLm5vZGUodGhpcy5tZXRhZ3JhcGgubm9kZXMoKVswXSl9Z2V0Um9vdE9wKCl7bGV0IEo9dGhpcy5uYW1lLnNwbGl0KCIvIik7cmV0dXJuIHRoaXMubWV0YWdyYXBoLm5vZGUodGhpcy5uYW1lKyIvKCIrSltKLmxlbmd0aC0xXSsiKSIpfWxlYXZlcygpe2xldCBKPVtdLFA9W3RoaXNdLFM7Zm9yKDtQLmxlbmd0aDspe2xldCBOPVAuc2hpZnQoKTtOLmlzR3JvdXBOb2RlPyhTPU4ubWV0YWdyYXBoLF8uZWFjaChTLm5vZGVzKCksVD0+UC5wdXNoKFMubm9kZShUKSkpKTpKLnB1c2goTi5uYW1lKX1yZXR1cm4gSn19CmMuTWV0YW5vZGVJbXBsPUc7Yy5jcmVhdGVNZXRhZWRnZT1mdW5jdGlvbihKLFApe3JldHVybiBuZXcgSyhKLFApfTtjbGFzcyBLe2NvbnN0cnVjdG9yKEosUCl7dGhpcy52PUo7dGhpcy53PVA7dGhpcy5iYXNlRWRnZUxpc3Q9W107dGhpcy5pbmJvdW5kPW51bGw7dGhpcy50b3RhbFNpemU9dGhpcy5udW1SZWZFZGdlcz10aGlzLm51bUNvbnRyb2xFZGdlcz10aGlzLm51bVJlZ3VsYXJFZGdlcz0wfWFkZEJhc2VFZGdlKEosUCl7dGhpcy5iYXNlRWRnZUxpc3QucHVzaChKKTtKLmlzQ29udHJvbERlcGVuZGVuY3k/dGhpcy5udW1Db250cm9sRWRnZXMrPTE6dGhpcy5udW1SZWd1bGFyRWRnZXMrPTE7Si5pc1JlZmVyZW5jZUVkZ2UmJih0aGlzLm51bVJlZkVkZ2VzKz0xKTt0aGlzLnRvdGFsU2l6ZSs9Sy5jb21wdXRlU2l6ZU9mRWRnZShKLFApO1AubWF4TWV0YUVkZ2VTaXplPU1hdGgubWF4KFAubWF4TWV0YUVkZ2VTaXplLHRoaXMudG90YWxTaXplKX1zdGF0aWMgY29tcHV0ZVNpemVPZkVkZ2UoSiwKUCl7bGV0IFM9UC5ub2RlKEoudik7aWYoIVMub3V0cHV0U2hhcGVzKXJldHVybiAxO1AuaGFzU2hhcGVJbmZvPSEwO0o9T2JqZWN0LmtleXMoUy5vdXRwdXRTaGFwZXMpLm1hcChOPT5TLm91dHB1dFNoYXBlc1tOXSkubWFwKE49Pm51bGw9PU4/MTpOLnJlZHVjZSgoVCxZKT0+ey0xPT09WSYmKFk9MSk7cmV0dXJuIFQqWX0sMSkpO3JldHVybiBfLnN1bShKKX19Yy5NZXRhZWRnZUltcGw9SztjLmNyZWF0ZVNlcmllc05vZGU9ZnVuY3Rpb24oSixQLFMsTixULFkpe3JldHVybiBuZXcgTChKLFAsUyxOLFQsWSl9O2MuZ2V0U2VyaWVzTm9kZU5hbWU9ZDtjbGFzcyBMe2NvbnN0cnVjdG9yKEosUCxTLE4sVCxZKXt0aGlzLm5hbWU9VHx8ZChKLFAsUyk7dGhpcy50eXBlPXkuU0VSSUVTO3RoaXMuaGFzTG9vcD0hMTt0aGlzLnByZWZpeD1KO3RoaXMuc3VmZml4PVA7dGhpcy5jbHVzdGVySWQ9Tjt0aGlzLmlkcz1bXTt0aGlzLnBhcmVudD1TO3RoaXMuaXNHcm91cE5vZGU9ITA7dGhpcy5jYXJkaW5hbGl0eT0KMDt0aGlzLm1ldGFncmFwaD1tKFQsQS5TRVJJRVMsWSk7dGhpcy5wYXJlbnROb2RlPXRoaXMuYnJpZGdlZ3JhcGg9bnVsbDt0aGlzLmRldmljZUhpc3RvZ3JhbT17fTt0aGlzLnhsYUNsdXN0ZXJIaXN0b2dyYW09e307dGhpcy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtPXtjb21wYXRpYmxlOjAsaW5jb21wYXRpYmxlOjB9O3RoaXMuaGFzTm9uQ29udHJvbEVkZ2VzPSExO3RoaXMuaW5jbHVkZT14LlVOU1BFQ0lGSUVEfX1jLkRlZmF1bHRCdWlsZFBhcmFtcz17ZW5hYmxlRW1iZWRkaW5nOiEwLGluRW1iZWRkaW5nVHlwZXM6WyJDb25zdCJdLG91dEVtYmVkZGluZ1R5cGVzOlsiXlthLXpBLVpdK1N1bW1hcnkkIl0scmVmRWRnZXM6eyJBc3NpZ24gMCI6ITAsIkFzc2lnbkFkZCAwIjohMCwiQXNzaWduU3ViIDAiOiEwLCJhc3NpZ24gMCI6ITAsImFzc2lnbl9hZGQgMCI6ITAsImFzc2lnbl9zdWIgMCI6ITAsImNvdW50X3VwX3RvIDAiOiEwLCJTY2F0dGVyQWRkIDAiOiEwLCJTY2F0dGVyU3ViIDAiOiEwLAoiU2NhdHRlclVwZGF0ZSAwIjohMCwic2NhdHRlcl9hZGQgMCI6ITAsInNjYXR0ZXJfc3ViIDAiOiEwLCJzY2F0dGVyX3VwZGF0ZSAwIjohMH19O2MuYnVpbGQ9ZnVuY3Rpb24oSixQLFMpe2xldCBOPXt9LFQ9e30sWT17fSxhYT1wKFAuaW5FbWJlZGRpbmdUeXBlcyksaGE9cChQLm91dEVtYmVkZGluZ1R5cGVzKSxYPVtdLGNhPUoubm9kZSxlYT1BcnJheShjYS5sZW5ndGgpO3JldHVybiBhLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJOb3JtYWxpemluZyBuYW1lcyIsMzAsKCk9PntsZXQga2E9QXJyYXkoY2EubGVuZ3RoKSxiYT0wO2NvbnN0IGxhPUNhPT57bGV0IHhhPW5ldyBEKENhKTtpZihhYSh4YSkpcmV0dXJuIFgucHVzaCh4YS5uYW1lKSxOW3hhLm5hbWVdPXhhO2lmKGhhKHhhKSlyZXR1cm4gWC5wdXNoKHhhLm5hbWUpLFRbeGEubmFtZV09eGEsXy5lYWNoKHhhLmlucHV0cyx6YT0+e3phPXphLm5hbWU7WVt6YV09WVt6YV18fFtdO1lbemFdLnB1c2goeGEpfSkseGE7a2FbYmFdPQp4YTtlYVtiYV09eGEubmFtZTtiYSsrO3JldHVybiB4YX07Xy5lYWNoKGNhLGxhKTtjb25zdCB3YT1DYT0+e2NvbnN0IHhhPWMuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCtDYS5zaWduYXR1cmUubmFtZTtsYSh7bmFtZTp4YSxpbnB1dDpbXSxkZXZpY2U6IiIsb3A6IiIsYXR0cjpbXX0pO2lmKENhLnNpZ25hdHVyZS5pbnB1dF9hcmcpe2xldCBFYT0wO3ZhciB6YT1HYT0+e2xhKHtuYW1lOnhhK2MuTkFNRVNQQUNFX0RFTElNK0dhLm5hbWUsaW5wdXQ6W10sZGV2aWNlOiIiLG9wOiJpbnB1dF9hcmciLGF0dHI6W3trZXk6IlQiLHZhbHVlOnt0eXBlOkdhLnR5cGV9fV19KS5mdW5jdGlvbklucHV0SW5kZXg9RWE7RWErK307Q2Euc2lnbmF0dXJlLmlucHV0X2FyZy5uYW1lP3phKENhLnNpZ25hdHVyZS5pbnB1dF9hcmcpOl8uZWFjaChDYS5zaWduYXR1cmUuaW5wdXRfYXJnLHphKX1sZXQgRmE9MDtjb25zdCBTYT17fTtDYS5zaWduYXR1cmUub3V0cHV0X2FyZyYmKHphPUVhPT57U2FbeGErCmMuTkFNRVNQQUNFX0RFTElNK0VhLm5hbWVdPUZhO0ZhKyt9LENhLnNpZ25hdHVyZS5vdXRwdXRfYXJnLm5hbWU/emEoQ2Euc2lnbmF0dXJlLm91dHB1dF9hcmcpOl8uZWFjaChDYS5zaWduYXR1cmUub3V0cHV0X2FyZyx6YSkpO18uZWFjaChDYS5ub2RlX2RlZixFYT0+e0VhLm5hbWU9eGErIi8iK0VhLm5hbWU7InN0cmluZyI9PT10eXBlb2YgRWEuaW5wdXQmJihFYS5pbnB1dD1bRWEuaW5wdXRdKTtjb25zdCBHYT1sYShFYSk7Xy5pc051bWJlcihTYVtFYS5uYW1lXSkmJihHYS5mdW5jdGlvbk91dHB1dEluZGV4PVNhW0VhLm5hbWVdKTtfLmVhY2goR2EuaW5wdXRzLGRiPT57ZGIubmFtZT14YStjLk5BTUVTUEFDRV9ERUxJTStkYi5uYW1lfSl9KX07Si5saWJyYXJ5JiZKLmxpYnJhcnkuZnVuY3Rpb24mJl8uZWFjaChKLmxpYnJhcnkuZnVuY3Rpb24sd2EpO2thLnNwbGljZShiYSk7ZWEuc3BsaWNlKGJhKTtyZXR1cm4ga2F9LFMpLnRoZW4oa2E9PmEuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkJ1aWxkaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSIsCjcwLCgpPT57bGV0IGJhPXIoZWEsWCksbGE9bmV3IEM7Xy5lYWNoKGthLHdhPT57bGV0IENhPWJhW3dhLm5hbWVdfHx3YS5uYW1lO2xhLm5vZGVzW0NhXT13YTt3YS5uYW1lIGluIFkmJih3YS5vdXRFbWJlZGRpbmdzPVlbd2EubmFtZV0sXy5lYWNoKHdhLm91dEVtYmVkZGluZ3MseGE9Pnt4YS5uYW1lPWJhW3hhLm5hbWVdfHx4YS5uYW1lfSkpO3dhLm5hbWU9Q2F9KTtfLmVhY2goa2Esd2E9PntfLmVhY2god2EuaW5wdXRzLChDYSx4YSk9PntsZXQgemE9Q2EubmFtZTtpZih6YSBpbiBOKXtDYT1OW3phXTt3YS5pbkVtYmVkZGluZ3MucHVzaChDYSk7Zm9yKHZhciBGYSBvZiBDYS5pbnB1dHMpayhsYSxiYVtGYS5uYW1lXXx8RmEubmFtZSx3YSxGYSxQLHhhKX1lbHNlIGlmKHphIGluIFQpe0ZhPVRbemFdO2ZvcihsZXQgU2Egb2YgRmEuaW5wdXRzKWsobGEsYmFbU2EubmFtZV18fFNhLm5hbWUsd2EsQ2EsUCx4YSl9ZWxzZSBrKGxhLGJhW3phXXx8emEsd2EsQ2EsUCx4YSl9KX0pO18uZWFjaChOLAp3YT0+e3dhLm5hbWU9YmFbd2EubmFtZV18fHdhLm5hbWV9KTtyZXR1cm4gbGF9LFMpKX07Yy5jcmVhdGVHcmFwaD1tO2MuZ2V0U3RyaWN0TmFtZT1xO2MuaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlPWZ1bmN0aW9uKEosUCl7Sj10KEopO1A9dChQKTtmb3IobGV0IFM9MDtTPEoubGVuZ3RoO1MrKylpZihKW1NdIT09UFtTXSlyZXR1cm4hMTtyZXR1cm4hMH07Yy5nZXRIaWVyYXJjaGljYWxQYXRoPXY7Yy5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZz1mdW5jdGlvbihKKXtyZXR1cm4gSj09PWEuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFPyJBZGQgdG8gbWFpbiBncmFwaCI6IlJlbW92ZSBmcm9tIG1haW4gZ3JhcGgifTtjLmdldEdyb3VwU2VyaWVzTm9kZUJ1dHRvblN0cmluZz1mdW5jdGlvbihKKXtyZXR1cm4gSj09PWEuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQPyJVbmdyb3VwIHRoaXMgc2VyaWVzIG9mIG5vZGVzIjoiR3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMifTsKYy50b2dnbGVOb2RlU2VyaWVzR3JvdXA9ZnVuY3Rpb24oSixQKXtKW1BdPVAgaW4gSiYmSltQXSE9PWEuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQP2EuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQOmEuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVB9fSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1jb21tb24vaGllcmFyY2h5LmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYodixBLHkseCl7QT15P3YuaW5FZGdlcyhBLm5hbWUpOnYub3V0RWRnZXMoQS5uYW1lKTtfLmVhY2goQSxDPT57Qz12LmVkZ2UoQyk7KEMubnVtUmVndWxhckVkZ2VzP3gucmVndWxhcjp4LmNvbnRyb2wpLnB1c2goQyl9KX1mdW5jdGlvbiBnKHYsQSl7Y29uc3QgeT17fTtfLmVhY2goQS5ub2Rlcyx4PT57bGV0IEM9Yy5nZXRIaWVyYXJjaGljYWxQYXRoKHgubmFtZSksRj12LnJvb3Q7Ri5kZXB0aD1NYXRoLm1heChDLmxlbmd0aCxGLmRlcHRoKTt5W3gub3BdfHwoeVt4Lm9wXT1bXSk7eVt4Lm9wXS5wdXNoKHgpO2ZvcihsZXQgQj0wO0I8Qy5sZW5ndGg7QisrKXtGLmRlcHRoPU1hdGgubWF4KEYuZGVwdGgsQy5sZW5ndGgtQik7Ri5jYXJkaW5hbGl0eSs9eC5jYXJkaW5hbGl0eTtGLm9wSGlzdG9ncmFtW3gub3BdPShGLm9wSGlzdG9ncmFtW3gub3BdfHwwKSsxO251bGwhPXguZGV2aWNlJiYoRi5kZXZpY2VIaXN0b2dyYW1beC5kZXZpY2VdPQooRi5kZXZpY2VIaXN0b2dyYW1beC5kZXZpY2VdfHwwKSsxKTtudWxsIT14LnhsYUNsdXN0ZXImJihGLnhsYUNsdXN0ZXJIaXN0b2dyYW1beC54bGFDbHVzdGVyXT0oRi54bGFDbHVzdGVySGlzdG9ncmFtW3gueGxhQ2x1c3Rlcl18fDApKzEpO3guY29tcGF0aWJsZT9GLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMTtfLmVhY2goeC5pbkVtYmVkZGluZ3MsSz0+e0suY29tcGF0aWJsZT9GLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8CjApKzF9KTtfLmVhY2goeC5vdXRFbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtpZihCPT09Qy5sZW5ndGgtMSlicmVhazt2YXIgRD1DW0JdO2xldCBHPXYubm9kZShEKTtHfHwoRz1jLmNyZWF0ZU1ldGFub2RlKEQsdi5ncmFwaE9wdGlvbnMpLEcucGFyZW50Tm9kZT1GLHYuc2V0Tm9kZShELEcpLEYubWV0YWdyYXBoLnNldE5vZGUoRCxHKSwwPT09RC5pbmRleE9mKGEuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCkmJkYubmFtZT09PWEuZ3JhcGguUk9PVF9OQU1FJiYoRD1ELnN1YnN0cmluZyhhLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSx5W0RdfHwKKHlbRF09W10pLHYubGlicmFyeUZ1bmN0aW9uc1tEXT17bm9kZTpHLHVzYWdlczp5W0RdfSxHLmFzc29jaWF0ZWRGdW5jdGlvbj1EKSk7Rj1HfXYuc2V0Tm9kZSh4Lm5hbWUseCk7eC5wYXJlbnROb2RlPUY7Ri5tZXRhZ3JhcGguc2V0Tm9kZSh4Lm5hbWUseCk7Xy5lYWNoKHguaW5FbWJlZGRpbmdzLGZ1bmN0aW9uKEIpe3Yuc2V0Tm9kZShCLm5hbWUsQik7Qi5wYXJlbnROb2RlPXh9KTtfLmVhY2goeC5vdXRFbWJlZGRpbmdzLGZ1bmN0aW9uKEIpe3Yuc2V0Tm9kZShCLm5hbWUsQik7Qi5wYXJlbnROb2RlPXh9KX0pfWZ1bmN0aW9uIGwodixBKXtsZXQgeT12LmdldE5vZGVNYXAoKSx4PVtdLEM9W10sRj0oRCxCKT0+e2xldCBHPTA7Zm9yKDtEOylCW0crK109RC5uYW1lLEQ9RC5wYXJlbnROb2RlO3JldHVybiBHLTF9O18uZWFjaChBLmVkZ2VzLEQ9Pnt2YXIgQj1GKEEubm9kZXNbRC52XSx4KSxHPUYoQS5ub2Rlc1tELnddLEMpO2lmKC0xIT09QiYmLTEhPT1HKXtmb3IoO3hbQl09PT1DW0ddOylpZihCLS0sCkctLSwwPkJ8fDA+Ryl0aHJvdyBFcnJvcigiTm8gZGlmZmVyZW5jZSBmb3VuZCBiZXR3ZWVuIGFuY2VzdG9yIHBhdGhzLiIpO3ZhciBLPXlbeFtCKzFdXTtCPXhbQl07Rz1DW0ddO3ZhciBMPUsubWV0YWdyYXBoLmVkZ2UoQixHKTtMfHwoTD1jLmNyZWF0ZU1ldGFlZGdlKEIsRyksSy5tZXRhZ3JhcGguc2V0RWRnZShCLEcsTCkpO0suaGFzTm9uQ29udHJvbEVkZ2VzfHxELmlzQ29udHJvbERlcGVuZGVuY3l8fChLLmhhc05vbkNvbnRyb2xFZGdlcz0hMCk7TC5hZGRCYXNlRWRnZShELHYpfX0pfWZ1bmN0aW9uIGsodixBLHkseCxDLEYpe2xldCBEPXYubWV0YWdyYXBoO18uZWFjaChELm5vZGVzKCksQj0+e0I9RC5ub2RlKEIpO0IudHlwZT09PWEuZ3JhcGguTm9kZVR5cGUuTUVUQSYmayhCLEEseSx4LEMsRil9KTt2PW0oRCk7dj0oRj9xOnApKHYsRCxBLmdyYXBoT3B0aW9ucyk7Xy5lYWNoKHYsZnVuY3Rpb24oQixHKXtsZXQgSz1CLm1ldGFncmFwaC5ub2RlcygpO18uZWFjaChLLEw9Pgp7TD1ELm5vZGUoTCk7TC5vd25pbmdTZXJpZXN8fChMLm93bmluZ1Nlcmllcz1HKX0pO0subGVuZ3RoPHgmJiEoQi5uYW1lIGluIEMpJiYoQ1tCLm5hbWVdPWEuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApO0IubmFtZSBpbiBDJiZDW0IubmFtZV09PT1hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQfHwoQS5zZXROb2RlKEcsQiksRC5zZXROb2RlKEcsQiksXy5lYWNoKEssTD0+e2xldCBKPUQubm9kZShMKTtCLm1ldGFncmFwaC5zZXROb2RlKEwsSik7Qi5wYXJlbnROb2RlPUoucGFyZW50Tm9kZTtCLmNhcmRpbmFsaXR5Kys7bnVsbCE9Si5kZXZpY2UmJihCLmRldmljZUhpc3RvZ3JhbVtKLmRldmljZV09KEIuZGV2aWNlSGlzdG9ncmFtW0ouZGV2aWNlXXx8MCkrMSk7bnVsbCE9Si54bGFDbHVzdGVyJiYoQi54bGFDbHVzdGVySGlzdG9ncmFtW0oueGxhQ2x1c3Rlcl09KEIueGxhQ2x1c3Rlckhpc3RvZ3JhbVtKLnhsYUNsdXN0ZXJdfHwwKSsxKTtKLmNvbXBhdGlibGU/CkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxO18uZWFjaChKLmluRW1iZWRkaW5ncyxQPT57UC5jb21wYXRpYmxlP0IuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7Xy5lYWNoKEoub3V0RW1iZWRkaW5ncyxQPT57UC5jb21wYXRpYmxlP0IuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPQooQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO0oucGFyZW50Tm9kZT1CO3lbTF09RztELnJlbW92ZU5vZGUoTCl9KSl9KX1mdW5jdGlvbiBtKHYpe3JldHVybiBfLnJlZHVjZSh2Lm5vZGVzKCksKEEseSk9Pnt5PXYubm9kZSh5KTtpZih5LnR5cGU9PT1jLk5vZGVUeXBlLk1FVEEpcmV0dXJuIEE7bGV0IHg9eS5vcDt4JiYoQVt4XT1BW3hdfHxbXSxBW3hdLnB1c2goeS5uYW1lKSk7cmV0dXJuIEF9LHt9KX1mdW5jdGlvbiBwKHYsQSx5KXtsZXQgeD17fTtfLmVhY2godixmdW5jdGlvbihDLEYpe2lmKCEoMT49Qy5sZW5ndGgpKXt2YXIgRD17fTtfLmVhY2goQyxmdW5jdGlvbihCKXt2YXIgRz0iKiI9PT1CLmNoYXJBdChCLmxlbmd0aC0xKSxLPUIuc3BsaXQoIi8iKSxMPUtbSy5sZW5ndGgtMV07Sz1LLnNsaWNlKDAsSy5sZW5ndGgtMSkuam9pbigiLyIpO3ZhciBKPUwubWF0Y2goL14oXEQqKV8oXGQrKSQvKTtsZXQgUD0iIjtKPyhMPUpbMV0sSj1KWzJdKToKKEw9Rz9MLnN1YnN0cigwLEwubGVuZ3RoLTEpOkwsSj0wLFA9Rz8iKiI6IiIpO0c9Yy5nZXRTZXJpZXNOb2RlTmFtZShMLFAsSyk7RFtHXT1EW0ddfHxbXTtCPWMuY3JlYXRlU2VyaWVzTm9kZShMLFAsSywrSixCLHkpO0RbR10ucHVzaChCKX0pO18uZWFjaChELGZ1bmN0aW9uKEIpe2lmKCEoMj5CLmxlbmd0aCkpe0Iuc29ydChmdW5jdGlvbihLLEwpe3JldHVybitLLmNsdXN0ZXJJZC0rTC5jbHVzdGVySWR9KTt2YXIgRz1bQlswXV07Zm9yKGxldCBLPTE7SzxCLmxlbmd0aDtLKyspe2xldCBMPUJbS107TC5jbHVzdGVySWQ9PT1HW0cubGVuZ3RoLTFdLmNsdXN0ZXJJZCsxP0cucHVzaChMKToocihHLHgsK0YsQSx5KSxHPVtMXSl9cihHLHgsK0YsQSx5KX19KX19KTtyZXR1cm4geH1mdW5jdGlvbiBxKHYsQSx5KXtsZXQgeD17fTtfLmVhY2godixmdW5jdGlvbihDLEYpe2lmKCEoMT49Qy5sZW5ndGgpKXt2YXIgRD17fSxCPXt9O18uZWFjaChDLGZ1bmN0aW9uKEspe2xldCBMPSIqIj09PQpLLmNoYXJBdChLLmxlbmd0aC0xKTt2YXIgSj1LLnNwbGl0KCIvIik7bGV0IFA9SltKLmxlbmd0aC0xXTtKPUouc2xpY2UoMCxKLmxlbmd0aC0xKS5qb2luKCIvIik7Y29uc3QgUz0vKFxkKykvZzt2YXIgTjtsZXQgVCxZLGFhLGhhPTA7Zm9yKDtOPVMuZXhlYyhQKTspKytoYSxUPVAuc2xpY2UoMCxOLmluZGV4KSxZPU5bMF0sTj1QLnNsaWNlKE4uaW5kZXgrTlswXS5sZW5ndGgpLGFhPWMuZ2V0U2VyaWVzTm9kZU5hbWUoVCxOLEopLERbYWFdPURbYWFdLERbYWFdfHwoRFthYV09Yy5jcmVhdGVTZXJpZXNOb2RlKFQsTixKLCtZLEsseSkpLERbYWFdLmlkcy5wdXNoKFkpLEJbS109QltLXXx8W10sQltLXS5wdXNoKFthYSxZXSk7MT5oYSYmKFQ9TD9QLnN1YnN0cigwLFAubGVuZ3RoLTEpOlAsWT0wLE49TD8iKiI6IiIsYWE9Yy5nZXRTZXJpZXNOb2RlTmFtZShULE4sSiksRFthYV09RFthYV0sRFthYV18fChEW2FhXT1jLmNyZWF0ZVNlcmllc05vZGUoVCxOLEosK1ksSyx5KSksRFthYV0uaWRzLnB1c2goWSksCkJbS109QltLXXx8W10sQltLXS5wdXNoKFthYSxZXSkpfSk7dmFyIEc9e307Xy5lYWNoKEIsZnVuY3Rpb24oSyxMKXtLLnNvcnQoZnVuY3Rpb24oUyxOKXtyZXR1cm4gRFtOWzBdXS5pZHMubGVuZ3RoLURbU1swXV0uaWRzLmxlbmd0aH0pO3ZhciBKPUtbMF1bMF07Sz1LWzBdWzFdO0dbSl09R1tKXXx8W107Y29uc3QgUD1MLnNwbGl0KCIvIik7TD1jLmNyZWF0ZVNlcmllc05vZGUoRFtKXS5wcmVmaXgsRFtKXS5zdWZmaXgsUC5zbGljZSgwLFAubGVuZ3RoLTEpLmpvaW4oIi8iKSwrSyxMLHkpO0dbSl0ucHVzaChMKX0pO18uZWFjaChHLGZ1bmN0aW9uKEspe2lmKCEoMj5LLmxlbmd0aCkpe0suc29ydChmdW5jdGlvbihKLFApe3JldHVybitKLmNsdXN0ZXJJZC0rUC5jbHVzdGVySWR9KTt2YXIgTD1bS1swXV07Zm9yKGxldCBKPTE7SjxLLmxlbmd0aDtKKyspe2xldCBQPUtbSl07UC5jbHVzdGVySWQ9PT1MW0wubGVuZ3RoLTFdLmNsdXN0ZXJJZCsxP0wucHVzaChQKToocihMLHgsK0YsQSwKeSksTD1bUF0pfXIoTCx4LCtGLEEseSl9fSl9fSk7cmV0dXJuIHh9ZnVuY3Rpb24gcih2LEEseSx4LEMpe2lmKDE8di5sZW5ndGgpe2xldCBGPWMuZ2V0U2VyaWVzTm9kZU5hbWUodlswXS5wcmVmaXgsdlswXS5zdWZmaXgsdlswXS5wYXJlbnQsdlswXS5jbHVzdGVySWQsdlt2Lmxlbmd0aC0xXS5jbHVzdGVySWQpLEQ9Yy5jcmVhdGVTZXJpZXNOb2RlKHZbMF0ucHJlZml4LHZbMF0uc3VmZml4LHZbMF0ucGFyZW50LHksRixDKTtfLmVhY2godixmdW5jdGlvbihCKXtELmlkcy5wdXNoKEIuY2x1c3RlcklkKTtELm1ldGFncmFwaC5zZXROb2RlKEIubmFtZSx4Lm5vZGUoQi5uYW1lKSl9KTtBW0ZdPUR9fWNsYXNzIHR7Y29uc3RydWN0b3Iodil7dGhpcy5oYXNTaGFwZUluZm89ITE7dGhpcy5tYXhNZXRhRWRnZVNpemU9MTt0aGlzLmdyYXBoT3B0aW9ucz12fHx7fTt0aGlzLmdyYXBoT3B0aW9ucy5jb21wb3VuZD0hMDt0aGlzLnJvb3Q9Yy5jcmVhdGVNZXRhbm9kZShjLlJPT1RfTkFNRSx0aGlzLmdyYXBoT3B0aW9ucyk7CnRoaXMubGlicmFyeUZ1bmN0aW9ucz17fTt0aGlzLnhsYUNsdXN0ZXJzPXRoaXMuZGV2aWNlcz10aGlzLnRlbXBsYXRlcz1udWxsO3RoaXMuaW5kZXg9e307dGhpcy5pbmRleFtjLlJPT1RfTkFNRV09dGhpcy5yb290O3RoaXMub3JkZXJpbmdzPXt9fWdldE5vZGVNYXAoKXtyZXR1cm4gdGhpcy5pbmRleH1ub2RlKHYpe3JldHVybiB0aGlzLmluZGV4W3ZdfXNldE5vZGUodixBKXt0aGlzLmluZGV4W3ZdPUF9Z2V0QnJpZGdlZ3JhcGgodil7dmFyIEE9dGhpcy5pbmRleFt2XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSBpbiBoaWVyYXJjaHk6ICIrdik7aWYoISgibWV0YWdyYXBoImluIEEpKXJldHVybiBudWxsO2lmKEEuYnJpZGdlZ3JhcGgpcmV0dXJuIEEuYnJpZGdlZ3JhcGg7bGV0IHk9QS5icmlkZ2VncmFwaD1jLmNyZWF0ZUdyYXBoKCJCUklER0VHUkFQSCIsYy5HcmFwaFR5cGUuQlJJREdFLHRoaXMuZ3JhcGhPcHRpb25zKTtpZighKEEucGFyZW50Tm9kZSYmCiJtZXRhZ3JhcGgiaW4gQS5wYXJlbnROb2RlKSlyZXR1cm4geTt2YXIgeD1BLnBhcmVudE5vZGU7QT14Lm1ldGFncmFwaDt4PXRoaXMuZ2V0QnJpZGdlZ3JhcGgoeC5uYW1lKTtfLmVhY2goW0EseF0sQz0+e0MuZWRnZXMoKS5maWx0ZXIoRj0+Ri52PT09dnx8Ri53PT09dikuZm9yRWFjaChGPT57bGV0IEQ9Ri53PT09dixCPUMuZWRnZShGKTtfLmVhY2goQi5iYXNlRWRnZUxpc3QsRz0+e2xldCBbSyxMXT1EP1tHLncsRi52XTpbRy52LEYud107dmFyIEo9dGhpcy5nZXRDaGlsZE5hbWUodixLKTtKPXt2OkQ/TDpKLHc6RD9KOkx9O2xldCBQPXkuZWRnZShKKTtQfHwoUD1jLmNyZWF0ZU1ldGFlZGdlKEoudixKLncpLFAuaW5ib3VuZD1ELHkuc2V0RWRnZShKLnYsSi53LFApKTtQLmFkZEJhc2VFZGdlKEcsdGhpcyl9KX0pfSk7cmV0dXJuIHl9Z2V0Q2hpbGROYW1lKHYsQSl7bGV0IHk9dGhpcy5pbmRleFtBXTtmb3IoO3k7KXtpZih5LnBhcmVudE5vZGUmJnkucGFyZW50Tm9kZS5uYW1lPT09CnYpcmV0dXJuIHkubmFtZTt5PXkucGFyZW50Tm9kZX10aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgaW1tZWRpYXRlIGNoaWxkIGZvciBkZXNjZW5kYW50OiAiK0EpO31nZXRQcmVkZWNlc3NvcnModil7bGV0IEE9dGhpcy5pbmRleFt2XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdik7bGV0IHk9dGhpcy5nZXRPbmVXYXlFZGdlcyhBLCEwKTtBLmlzR3JvdXBOb2RlfHxfLmVhY2goQS5pbkVtYmVkZGluZ3MseD0+e18uZWFjaChBLmlucHV0cyxDPT57aWYoQy5uYW1lPT09eC5uYW1lKXtsZXQgRj1uZXcgYy5NZXRhZWRnZUltcGwoeC5uYW1lLHYpO0YuYWRkQmFzZUVkZ2Uoe2lzQ29udHJvbERlcGVuZGVuY3k6Qy5pc0NvbnRyb2xEZXBlbmRlbmN5LG91dHB1dFRlbnNvcktleTpDLm91dHB1dFRlbnNvcktleSxpc1JlZmVyZW5jZUVkZ2U6ITEsdjp4Lm5hbWUsdzp2fSx0aGlzKTt5LnJlZ3VsYXIucHVzaChGKX19KX0pO3JldHVybiB5fWdldFN1Y2Nlc3NvcnModil7bGV0IEE9CnRoaXMuaW5kZXhbdl07aWYoIUEpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAiK3YpO2xldCB5PXRoaXMuZ2V0T25lV2F5RWRnZXMoQSwhMSk7QS5pc0dyb3VwTm9kZXx8Xy5lYWNoKEEub3V0RW1iZWRkaW5ncyx4PT57Xy5lYWNoKHguaW5wdXRzLEM9PntpZihDLm5hbWU9PT12KXtsZXQgRj1uZXcgYy5NZXRhZWRnZUltcGwodix4Lm5hbWUpO0YuYWRkQmFzZUVkZ2Uoe2lzQ29udHJvbERlcGVuZGVuY3k6Qy5pc0NvbnRyb2xEZXBlbmRlbmN5LG91dHB1dFRlbnNvcktleTpDLm91dHB1dFRlbnNvcktleSxpc1JlZmVyZW5jZUVkZ2U6ITEsdix3OngubmFtZX0sdGhpcyk7eS5yZWd1bGFyLnB1c2goRil9fSl9KTtyZXR1cm4geX1nZXRPbmVXYXlFZGdlcyh2LEEpe2xldCB5PXtjb250cm9sOltdLHJlZ3VsYXI6W119O2lmKCF2LnBhcmVudE5vZGV8fCF2LnBhcmVudE5vZGUuaXNHcm91cE5vZGUpcmV0dXJuIHk7dmFyIHg9di5wYXJlbnROb2RlO2xldCBDPQp4Lm1ldGFncmFwaDt4PXRoaXMuZ2V0QnJpZGdlZ3JhcGgoeC5uYW1lKTtmKEMsdixBLHkpO2YoeCx2LEEseSk7cmV0dXJuIHl9Z2V0VG9wb2xvZ2ljYWxPcmRlcmluZyh2KXt2YXIgQT10aGlzLmluZGV4W3ZdO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit2KTtpZighQS5pc0dyb3VwTm9kZSlyZXR1cm4gbnVsbDtpZih2IGluIHRoaXMub3JkZXJpbmdzKXJldHVybiB0aGlzLm9yZGVyaW5nc1t2XTtsZXQgeT17fSx4PXt9LEM9QS5tZXRhZ3JhcGg7Xy5lYWNoKEMuZWRnZXMoKSxEPT57Qy5lZGdlKEQpLm51bVJlZ3VsYXJFZGdlcyYmKEQudiBpbiB5fHwoeVtELnZdPVtdKSx5W0Qudl0ucHVzaChELncpLHhbRC53XT0hMCl9KTtsZXQgRj1fLmRpZmZlcmVuY2UoXy5rZXlzKHkpLF8ua2V5cyh4KSk7dj10aGlzLm9yZGVyaW5nc1t2XT17fTtmb3IoQT0wO0YubGVuZ3RoOyl7bGV0IEQ9Ri5zaGlmdCgpO3ZbRF09QSsrO18uZWFjaCh5W0RdLEI9PgpGLnB1c2goQikpO2RlbGV0ZSB5W0RdfXJldHVybiB2fWdldFRlbXBsYXRlSW5kZXgoKXtsZXQgdj1kMy5rZXlzKHRoaXMudGVtcGxhdGVzKSxBPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih2KS5yYW5nZShkMy5yYW5nZSgwLHYubGVuZ3RoKSk7cmV0dXJuIHk9PkEoeSl9fWQuRGVmYXVsdEhpZXJhcmNoeVBhcmFtcz17dmVyaWZ5VGVtcGxhdGU6ITAsc2VyaWVzTm9kZU1pblNpemU6NSxzZXJpZXNNYXA6e30scmFua0RpcmVjdGlvbjoiQlQiLHVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnM6ITF9O2QuYnVpbGQ9ZnVuY3Rpb24odixBLHkpe2xldCB4PW5ldyB0KHtyYW5rZGlyOkEucmFua0RpcmVjdGlvbn0pLEM9e307cmV0dXJuIGEuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkFkZGluZyBub2RlcyIsMjAsKCk9PntsZXQgRj17fSxEPXt9O18uZWFjaCh2Lm5vZGVzLEI9PntCLmRldmljZSYmKEZbQi5kZXZpY2VdPSEwKTtCLnhsYUNsdXN0ZXImJihEW0IueGxhQ2x1c3Rlcl09ITApfSk7CnguZGV2aWNlcz1fLmtleXMoRik7eC54bGFDbHVzdGVycz1fLmtleXMoRCk7Zyh4LHYpfSx5KS50aGVuKCgpPT5hLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJEZXRlY3Qgc2VyaWVzIiwyMCwoKT0+ezA8QS5zZXJpZXNOb2RlTWluU2l6ZSYmayh4LnJvb3QseCxDLEEuc2VyaWVzTm9kZU1pblNpemUsQS5zZXJpZXNNYXAsQS51c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zKX0seSkpLnRoZW4oKCk9PmEuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkFkZGluZyBlZGdlcyIsMzAsKCk9PntsKHgsdixDKX0seSkpLnRoZW4oKCk9PmEuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkZpbmRpbmcgc2ltaWxhciBzdWJncmFwaHMiLDMwLCgpPT57eC50ZW1wbGF0ZXM9Yy50ZW1wbGF0ZS5kZXRlY3QoeCxBLnZlcmlmeVRlbXBsYXRlKX0seSkpLnRoZW4oKCk9PngpfTtkLmpvaW5BbmRBZ2dyZWdhdGVTdGF0cz1mdW5jdGlvbih2KXtsZXQgQT17fSx5PXt9O18uZWFjaCh2LnJvb3QubGVhdmVzKCksCng9Pnt4PXYubm9kZSh4KTtudWxsIT14LmRldmljZSYmKEFbeC5kZXZpY2VdPSEwKTtudWxsIT14LnhsYUNsdXN0ZXImJih5W3gueGxhQ2x1c3Rlcl09ITApfSk7di5kZXZpY2VzPV8ua2V5cyhBKTt2LnhsYUNsdXN0ZXJzPV8ua2V5cyh5KTtfLmVhY2godi5nZXROb2RlTWFwKCkseD0+e3guaXNHcm91cE5vZGUmJih4LnN0YXRzPW5ldyBjLk5vZGVTdGF0cyhudWxsKSx4LmRldmljZUhpc3RvZ3JhbT17fSl9KTtfLmVhY2godi5yb290LmxlYXZlcygpLHg9PntsZXQgQz14PXYubm9kZSh4KTtmb3IoO251bGwhPUMucGFyZW50Tm9kZTspe2lmKG51bGwhPXguZGV2aWNlKXt2YXIgRj1DLnBhcmVudE5vZGUuZGV2aWNlSGlzdG9ncmFtO0ZbeC5kZXZpY2VdPShGW3guZGV2aWNlXXx8MCkrMX1udWxsIT14LnhsYUNsdXN0ZXImJihGPUMucGFyZW50Tm9kZS54bGFDbHVzdGVySGlzdG9ncmFtLEZbeC54bGFDbHVzdGVyXT0oRlt4LnhsYUNsdXN0ZXJdfHwwKSsxKTtudWxsIT14LnN0YXRzJiZDLnBhcmVudE5vZGUuc3RhdHMuY29tYmluZSh4LnN0YXRzKTsKQz1DLnBhcmVudE5vZGV9fSl9O2QuZ2V0SW5jb21wYXRpYmxlT3BzPWZ1bmN0aW9uKHYsQSl7bGV0IHk9W10seD17fTtfLmVhY2godi5yb290LmxlYXZlcygpLEM9PntDPXYubm9kZShDKTtpZihDLnR5cGU9PWMuTm9kZVR5cGUuT1Ape2lmKCFDLmNvbXBhdGlibGUpaWYoQy5vd25pbmdTZXJpZXMpaWYoQSYmQS5zZXJpZXNNYXBbQy5vd25pbmdTZXJpZXNdPT09YS5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCl5LnB1c2goQyk7ZWxzZXtpZigheFtDLm93bmluZ1Nlcmllc10pe2xldCBGPXYubm9kZShDLm93bmluZ1Nlcmllcyk7RiYmKHhbQy5vd25pbmdTZXJpZXNdPUYseS5wdXNoKEYpKX19ZWxzZSB5LnB1c2goQyk7Xy5lYWNoKEMuaW5FbWJlZGRpbmdzLEY9PntGLmNvbXBhdGlibGV8fHkucHVzaChGKX0pO18uZWFjaChDLm91dEVtYmVkZGluZ3MsRj0+e0YuY29tcGF0aWJsZXx8eS5wdXNoKEYpfSl9fSk7cmV0dXJuIHl9fSkoYy5oaWVyYXJjaHl8fChjLmhpZXJhcmNoeT0Ke30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtY29tbW9uL2xheW91dC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKHgpe3gubm9kZS5pc0dyb3VwTm9kZSYmbCh4KTt4Lm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQT9tKHgpOngubm9kZS50eXBlPT09Yy5Ob2RlVHlwZS5TRVJJRVMmJnAoeCl9ZnVuY3Rpb24gZyh4KXt4LmluYm94V2lkdGg9MDx4LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/ZC5QQVJBTVMuYW5ub3RhdGlvbnMuaW5ib3hXaWR0aDowO3gub3V0Ym94V2lkdGg9MDx4Lm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoP2QuUEFSQU1TLmFubm90YXRpb25zLm91dGJveFdpZHRoOjA7eC5jb3JlQm94LndpZHRoPXgud2lkdGg7eC5jb3JlQm94LmhlaWdodD14LmhlaWdodDt4LndpZHRoPU1hdGgubWF4KHguY29yZUJveC53aWR0aCt4LmluYm94V2lkdGgreC5vdXRib3hXaWR0aCwzKnguZGlzcGxheU5hbWUubGVuZ3RoKX1mdW5jdGlvbiBsKHgpe2xldCBDPXguY29yZUdyYXBoLm5vZGVzKCkubWFwKEY9Pgp4LmNvcmVHcmFwaC5ub2RlKEYpKS5jb25jYXQoeC5pc29sYXRlZEluRXh0cmFjdCx4Lmlzb2xhdGVkT3V0RXh0cmFjdCx4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0KTtfLmVhY2goQyxGPT57c3dpdGNoKEYubm9kZS50eXBlKXtjYXNlIGMuTm9kZVR5cGUuT1A6Xy5leHRlbmQoRixkLlBBUkFNUy5ub2RlU2l6ZS5vcCk7YnJlYWs7Y2FzZSBjLk5vZGVUeXBlLkJSSURHRTpfLmV4dGVuZChGLGQuUEFSQU1TLm5vZGVTaXplLmJyaWRnZSk7YnJlYWs7Y2FzZSBjLk5vZGVUeXBlLk1FVEE6Ri5leHBhbmRlZD9mKEYpOihfLmV4dGVuZChGLGQuUEFSQU1TLm5vZGVTaXplLm1ldGEpLEYuaGVpZ2h0PWQuUEFSQU1TLm5vZGVTaXplLm1ldGEuaGVpZ2h0KEYubm9kZS5jYXJkaW5hbGl0eSkpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5TRVJJRVM6Ri5leHBhbmRlZD8oXy5leHRlbmQoRixkLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMuZXhwYW5kZWQpLGYoRikpOl8uZXh0ZW5kKEYsRi5ub2RlLmhhc05vbkNvbnRyb2xFZGdlcz8KZC5QQVJBTVMubm9kZVNpemUuc2VyaWVzLnZlcnRpY2FsOmQuUEFSQU1TLm5vZGVTaXplLnNlcmllcy5ob3Jpem9udGFsKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK0Yubm9kZS50eXBlKTt9Ri5leHBhbmRlZHx8ZyhGKTtxKEYpfSl9ZnVuY3Rpb24gayh4LEMpe18uZXh0ZW5kKHguZ3JhcGgoKSx7bm9kZXNlcDpDLm5vZGVTZXAscmFua3NlcDpDLnJhbmtTZXAsZWRnZXNlcDpDLmVkZ2VTZXB9KTtsZXQgRj1bXSxEPVtdO18uZWFjaCh4Lm5vZGVzKCksSj0+e3gubm9kZShKKS5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLkJSSURHRT9GLnB1c2goSik6RC5wdXNoKEopfSk7aWYoIUQubGVuZ3RoKXJldHVybnt3aWR0aDowLGhlaWdodDowfTtkYWdyZS5sYXlvdXQoeCk7bGV0IEI9SW5maW5pdHksRz1JbmZpbml0eSxLPS1JbmZpbml0eSxMPS1JbmZpbml0eTtfLmVhY2goRCxKPT57Sj14Lm5vZGUoSik7dmFyIFA9LjUqSi53aWR0aCxTPUoueC0KUDtQPUoueCtQO0I9UzxCP1M6QjtLPVA+Sz9QOks7UD0uNSpKLmhlaWdodDtTPUoueS1QO0o9Si55K1A7Rz1TPEc/UzpHO0w9Sj5MP0o6TH0pO18uZWFjaCh4LmVkZ2VzKCksSj0+e0o9eC5lZGdlKEopO2lmKCFKLnN0cnVjdHVyYWwpe3ZhciBQPXgubm9kZShKLm1ldGFlZGdlLnYpLFM9eC5ub2RlKEoubWV0YWVkZ2Uudyk7aWYoMz09PUoucG9pbnRzLmxlbmd0aCYmQShKLnBvaW50cykpe2lmKG51bGwhPVApe3ZhciBOPVAuZXhwYW5kZWQ/UC54OnQoUCk7Si5wb2ludHNbMF0ueD1OfW51bGwhPVMmJihOPVMuZXhwYW5kZWQ/Uy54OnQoUyksSi5wb2ludHNbMl0ueD1OKTtKLnBvaW50cz1bSi5wb2ludHNbMF0sSi5wb2ludHNbMV1dfU49Si5wb2ludHNbSi5wb2ludHMubGVuZ3RoLTJdO251bGwhPVMmJihKLnBvaW50c1tKLnBvaW50cy5sZW5ndGgtMV09eShOLFMpKTtTPUoucG9pbnRzWzFdO251bGwhPVAmJihKLnBvaW50c1swXT15KFMsUCkpO18uZWFjaChKLnBvaW50cyxUPT57Qj1ULng8CkI/VC54OkI7Sz1ULng+Sz9ULng6SztHPVQueTxHP1QueTpHO0w9VC55Pkw/VC55Okx9KX19KTtfLmVhY2goeC5ub2RlcygpLEo9PntKPXgubm9kZShKKTtKLngtPUI7Si55LT1HfSk7Xy5lYWNoKHguZWRnZXMoKSxKPT57Xy5lYWNoKHguZWRnZShKKS5wb2ludHMsUD0+e1AueC09QjtQLnktPUd9KX0pO3JldHVybnt3aWR0aDpLLUIsaGVpZ2h0OkwtR319ZnVuY3Rpb24gbSh4KXtsZXQgQz1kLlBBUkFNUy5zdWJzY2VuZS5tZXRhO18uZXh0ZW5kKHgsQyk7Xy5leHRlbmQoeC5jb3JlQm94LGsoeC5jb3JlR3JhcGgsZC5QQVJBTVMuZ3JhcGgubWV0YSkpO3ZhciBGPXguaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoP18ubWF4KHguaXNvbGF0ZWRJbkV4dHJhY3QsQj0+Qi53aWR0aCkud2lkdGg6bnVsbDt4LmluRXh0cmFjdEJveC53aWR0aD1udWxsIT1GP0Y6MDt4LmluRXh0cmFjdEJveC5oZWlnaHQ9Xy5yZWR1Y2UoeC5pc29sYXRlZEluRXh0cmFjdCwoQixHLEspPT57Sz0wPEs/Qy5leHRyYWN0WU9mZnNldDoKMDtHLng9MDtHLnk9QitLK0cuaGVpZ2h0LzI7cmV0dXJuIEIrSytHLmhlaWdodH0sMCk7Rj14Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg/Xy5tYXgoeC5pc29sYXRlZE91dEV4dHJhY3QsQj0+Qi53aWR0aCkud2lkdGg6bnVsbDt4Lm91dEV4dHJhY3RCb3gud2lkdGg9bnVsbCE9Rj9GOjA7eC5vdXRFeHRyYWN0Qm94LmhlaWdodD1fLnJlZHVjZSh4Lmlzb2xhdGVkT3V0RXh0cmFjdCwoQixHLEspPT57Sz0wPEs/Qy5leHRyYWN0WU9mZnNldDowO0cueD0wO0cueT1CK0srRy5oZWlnaHQvMjtyZXR1cm4gQitLK0cuaGVpZ2h0fSwwKTtGPXgubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoP18ubWF4KHgubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QsQj0+Qi53aWR0aCkud2lkdGg6bnVsbDt4LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGg9bnVsbCE9Rj9GOjA7eC5saWJyYXJ5RnVuY3Rpb25zQm94LmhlaWdodD1fLnJlZHVjZSh4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LChCLEcsCkspPT57Sz0wPEs/Qy5leHRyYWN0WU9mZnNldDowO0cueD0wO0cueT1CK0srRy5oZWlnaHQvMjtyZXR1cm4gQitLK0cuaGVpZ2h0fSwwKTtGPTA7MDx4Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCYmRisrOzA8eC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoJiZGKys7MDx4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aCYmRisrOzA8eC5jb3JlR3JhcGgubm9kZUNvdW50KCkmJkYrKztsZXQgRD1kLlBBUkFNUy5zdWJzY2VuZS5tZXRhLmV4dHJhY3RYT2Zmc2V0O0Y9MT49Rj8wOkYqRDt4LmNvcmVCb3gud2lkdGgrPU1hdGgubWF4KGQuTUlOX0FVWF9XSURUSCx4LmluRXh0cmFjdEJveC53aWR0aCt4Lm91dEV4dHJhY3RCb3gud2lkdGgpK0YreC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoK0Y7eC5jb3JlQm94LmhlaWdodD1DLmxhYmVsSGVpZ2h0K01hdGgubWF4KHguaW5FeHRyYWN0Qm94LmhlaWdodCx4LmNvcmVCb3guaGVpZ2h0LHgubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQsCngub3V0RXh0cmFjdEJveC5oZWlnaHQpO3gud2lkdGg9eC5jb3JlQm94LndpZHRoK0MucGFkZGluZ0xlZnQrQy5wYWRkaW5nUmlnaHQ7eC5oZWlnaHQ9eC5wYWRkaW5nVG9wK3guY29yZUJveC5oZWlnaHQreC5wYWRkaW5nQm90dG9tfWZ1bmN0aW9uIHAoeCl7bGV0IEM9eC5jb3JlR3JhcGgsRj1kLlBBUkFNUy5zdWJzY2VuZS5zZXJpZXM7Xy5leHRlbmQoeCxGKTtfLmV4dGVuZCh4LmNvcmVCb3gsayh4LmNvcmVHcmFwaCxkLlBBUkFNUy5ncmFwaC5zZXJpZXMpKTtfLmVhY2goQy5ub2RlcygpLEQ9PntDLm5vZGUoRCkuZXhjbHVkZWQ9ITF9KTt4LndpZHRoPXguY29yZUJveC53aWR0aCtGLnBhZGRpbmdMZWZ0K0YucGFkZGluZ1JpZ2h0O3guaGVpZ2h0PXguY29yZUJveC5oZWlnaHQrRi5wYWRkaW5nVG9wK0YucGFkZGluZ0JvdHRvbX1mdW5jdGlvbiBxKHgpe2lmKCF4LmV4cGFuZGVkKXt2YXIgQz14LmluQW5ub3RhdGlvbnMubGlzdCxGPXgub3V0QW5ub3RhdGlvbnMubGlzdDtfLmVhY2goQywKUD0+cihQKSk7Xy5lYWNoKEYsUD0+cihQKSk7dmFyIEQ9ZC5QQVJBTVMuYW5ub3RhdGlvbnMsQj1fLnJlZHVjZShDLChQLFMsTik9PntOPTA8Tj9ELnlPZmZzZXQ6MDtTLmR4PS0oeC5jb3JlQm94LndpZHRoK1Mud2lkdGgpLzItRC54T2Zmc2V0O1MuZHk9UCtOK1MuaGVpZ2h0LzI7cmV0dXJuIFArTitTLmhlaWdodH0sMCk7Xy5lYWNoKEMsUD0+e1AuZHktPUIvMjtQLmxhYmVsT2Zmc2V0PUQubGFiZWxPZmZzZXR9KTt2YXIgRz1fLnJlZHVjZShGLChQLFMsTik9PntOPTA8Tj9ELnlPZmZzZXQ6MDtTLmR4PSh4LmNvcmVCb3gud2lkdGgrUy53aWR0aCkvMitELnhPZmZzZXQ7Uy5keT1QK04rUy5oZWlnaHQvMjtyZXR1cm4gUCtOK1MuaGVpZ2h0fSwwKTtfLmVhY2goRixQPT57UC5keS09Ry8yO1AubGFiZWxPZmZzZXQ9RC5sYWJlbE9mZnNldH0pO3ZhciBLPU1hdGgubWluKHguaGVpZ2h0LzIteC5yYWRpdXMsQi8yKTtLPTA+Sz8wOks7dmFyIEw9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsCkMubGVuZ3RoLTFdKS5yYW5nZShbLUssS10pO18uZWFjaChDLChQLFMpPT57UC5wb2ludHM9W3tkeDpQLmR4K1Aud2lkdGgvMixkeTpQLmR5fSx7ZHg6LXguY29yZUJveC53aWR0aC8yLGR5OjE8Qy5sZW5ndGg/TChTKTowfV19KTtLPU1hdGgubWluKHguaGVpZ2h0LzIteC5yYWRpdXMsRy8yKTtLPTA+Sz8wOks7dmFyIEo9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsRi5sZW5ndGgtMV0pLnJhbmdlKFstSyxLXSk7Xy5lYWNoKEYsKFAsUyk9PntQLnBvaW50cz1be2R4OnguY29yZUJveC53aWR0aC8yLGR5OjE8Ri5sZW5ndGg/SihTKTowfSx7ZHg6UC5keC1QLndpZHRoLzIsZHk6UC5keX1dfSk7eC5oZWlnaHQ9TWF0aC5tYXgoeC5oZWlnaHQsQixHKX19ZnVuY3Rpb24gcih4KXtzd2l0Y2goeC5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBjLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5DT05TVEFOVDpfLmV4dGVuZCh4LGQuUEFSQU1TLmNvbnN0YW50LnNpemUpO2JyZWFrO2Nhc2UgYy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU0hPUlRDVVQ6aWYoeC5ub2RlLnR5cGU9PT0KYy5Ob2RlVHlwZS5PUClfLmV4dGVuZCh4LGQuUEFSQU1TLnNob3J0Y3V0U2l6ZS5vcCk7ZWxzZSBpZih4Lm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQSlfLmV4dGVuZCh4LGQuUEFSQU1TLnNob3J0Y3V0U2l6ZS5tZXRhKTtlbHNlIGlmKHgubm9kZS50eXBlPT09Yy5Ob2RlVHlwZS5TRVJJRVMpXy5leHRlbmQoeCxkLlBBUkFNUy5zaG9ydGN1dFNpemUuc2VyaWVzKTtlbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIG5vZGUgdHlwZTogIit4Lm5vZGUudHlwZSk7YnJlYWs7Y2FzZSBjLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZOl8uZXh0ZW5kKHgsZC5QQVJBTVMuY29uc3RhbnQuc2l6ZSl9fWZ1bmN0aW9uIHQoeCl7cmV0dXJuIHguZXhwYW5kZWQ/eC54OngueC14LndpZHRoLzIrKHguaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD94LmluYm94V2lkdGg6MCkreC5jb3JlQm94LndpZHRoLzJ9ZnVuY3Rpb24gdih4LEMpe3JldHVybiAxODAqTWF0aC5hdGFuKChDLnkteC55KS8oQy54LQp4LngpKS9NYXRoLlBJfWZ1bmN0aW9uIEEoeCl7bGV0IEM9dih4WzBdLHhbMV0pO2ZvcihsZXQgRj0xO0Y8eC5sZW5ndGgtMTtGKyspe2xldCBEPXYoeFtGXSx4W0YrMV0pO2lmKDE8TWF0aC5hYnMoRC1DKSlyZXR1cm4hMTtDPUR9cmV0dXJuITB9ZnVuY3Rpb24geSh4LEMpe2xldCBGPUMuZXhwYW5kZWQ/Qy54OnQoQyksRD1DLnk7dmFyIEI9eC54LUY7eD14LnktRDtsZXQgRz1DLmV4cGFuZGVkP0Mud2lkdGg6Qy5jb3JlQm94LndpZHRoLEs9Qy5leHBhbmRlZD9DLmhlaWdodDpDLmNvcmVCb3guaGVpZ2h0O01hdGguYWJzKHgpKkcvMj5NYXRoLmFicyhCKSpLLzI/KDA+eCYmKEs9LUspLEM9MD09PXg/MDpLLzIqQi94LEI9Sy8yKTooMD5CJiYoRz0tRyksQz1HLzIsQj0wPT09Qj8wOkcvMip4L0IpO3JldHVybnt4OkYrQyx5OkQrQn19ZC5QQVJBTVM9e2FuaW1hdGlvbjp7ZHVyYXRpb246MjUwfSxncmFwaDp7bWV0YTp7bm9kZVNlcDo1LHJhbmtTZXA6MjUsZWRnZVNlcDo1fSxzZXJpZXM6e25vZGVTZXA6NSwKcmFua1NlcDoyNSxlZGdlU2VwOjV9LHBhZGRpbmc6e3BhZGRpbmdUb3A6NDAscGFkZGluZ0xlZnQ6MjB9fSxzdWJzY2VuZTp7bWV0YTp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoyMCxleHRyYWN0WE9mZnNldDoxNSxleHRyYWN0WU9mZnNldDoyMH0sc2VyaWVzOntwYWRkaW5nVG9wOjEwLHBhZGRpbmdCb3R0b206MTAscGFkZGluZ0xlZnQ6MTAscGFkZGluZ1JpZ2h0OjEwLGxhYmVsSGVpZ2h0OjEwfX0sbm9kZVNpemU6e21ldGE6e3JhZGl1czo1LHdpZHRoOjYwLG1heExhYmVsV2lkdGg6NTIsaGVpZ2h0OmQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFsxLDIwMF0pLnJhbmdlKFsxNSw2MF0pLmNsYW1wKCEwKSxleHBhbmRCdXR0b25SYWRpdXM6M30sb3A6e3dpZHRoOjE1LGhlaWdodDo2LHJhZGl1czozLGxhYmVsT2Zmc2V0Oi04LG1heExhYmVsV2lkdGg6MzB9LHNlcmllczp7ZXhwYW5kZWQ6e3JhZGl1czoxMCwKbGFiZWxPZmZzZXQ6MH0sdmVydGljYWw6e3dpZHRoOjE2LGhlaWdodDoxMyxsYWJlbE9mZnNldDotMTN9LGhvcml6b250YWw6e3dpZHRoOjI0LGhlaWdodDo4LHJhZGl1czoxMCxsYWJlbE9mZnNldDotMTB9fSxicmlkZ2U6e3dpZHRoOjIwLGhlaWdodDoyMCxyYWRpdXM6MixsYWJlbE9mZnNldDowfX0sc2hvcnRjdXRTaXplOntvcDp7d2lkdGg6MTAsaGVpZ2h0OjR9LG1ldGE6e3dpZHRoOjEyLGhlaWdodDo0LHJhZGl1czoxfSxzZXJpZXM6e3dpZHRoOjE0LGhlaWdodDo0fX0sYW5ub3RhdGlvbnM6e2luYm94V2lkdGg6NTAsb3V0Ym94V2lkdGg6NTAseE9mZnNldDoxMCx5T2Zmc2V0OjMsbGFiZWxPZmZzZXQ6MixtYXhMYWJlbFdpZHRoOjEyMH0sY29uc3RhbnQ6e3NpemU6e3dpZHRoOjQsaGVpZ2h0OjR9fSxzZXJpZXM6e21heFN0YWNrQ291bnQ6MyxwYXJhbGxlbFN0YWNrT2Zmc2V0UmF0aW86LjIsdG93ZXJTdGFja09mZnNldFJhdGlvOi41fSxtaW5pbWFwOntzaXplOjE1MH19O2QuTUlOX0FVWF9XSURUSD0KMTQwO2QubGF5b3V0U2NlbmU9ZjtkLmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGU9dH0pKGMubGF5b3V0fHwoYy5sYXlvdXQ9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtY29tbW9uL2xvYWRlci5qcwp2YXIgaG09dGhpcyYmdGhpcy5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKGEsYyxkLGYpe3JldHVybiBuZXcgKGR8fChkPVByb21pc2UpKShmdW5jdGlvbihnLGwpe2Z1bmN0aW9uIGsocSl7dHJ5e3AoZi5uZXh0KHEpKX1jYXRjaChyKXtsKHIpfX1mdW5jdGlvbiBtKHEpe3RyeXtwKGZbInRocm93Il0ocSkpfWNhdGNoKHIpe2wocil9fWZ1bmN0aW9uIHAocSl7cS5kb25lP2cocS52YWx1ZSk6KG5ldyBkKGZ1bmN0aW9uKHIpe3IocS52YWx1ZSl9KSkudGhlbihrLG0pfXAoKGY9Zi5hcHBseShhLGN8fFtdKSkubmV4dCgpKX0pfTsKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZC5mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoPWZ1bmN0aW9uKGYsZyxsLGs9bmV3IGMub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyLG09Yy5oaWVyYXJjaHkuRGVmYXVsdEhpZXJhcmNoeVBhcmFtcyl7Y29uc3QgcD1jLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoZiwyMCwiR3JhcGgiKSxxPWMudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcihmLDUwLCJOYW1lc3BhY2UgaGllcmFyY2h5Iik7cmV0dXJuIGMucGFyc2VyLmZldGNoQW5kUGFyc2VHcmFwaERhdGEoZyxsLGMudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcihmLDMwLCJEYXRhIikpLnRoZW4oZnVuY3Rpb24ocil7aWYoIXIubm9kZSl0aHJvdyBFcnJvcigiVGhlIGdyYXBoIGlzIGVtcHR5LiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBUZW5zb3JGbG93IGNvdWxkIG5vdCB0cmFjZSBhbnkgZ3JhcGguIFBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTk2MSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKTsKcmV0dXJuIGMuYnVpbGQocixjLkRlZmF1bHRCdWlsZFBhcmFtcyxwKX0sKCk9Pnt0aHJvdyBFcnJvcigiTWFsZm9ybWVkIEdyYXBoRGVmLiBUaGlzIGNhbiBzb21ldGltZXMgYmUgY2F1c2VkIGJ5IGEgYmFkIG5ldHdvcmsgY29ubmVjdGlvbiBvciBkaWZmaWN1bHR5IHJlY29uY2lsaW5nIG11bHRpcGxlIEdyYXBoRGVmczsgZm9yIHRoZSBsYXR0ZXIgY2FzZSwgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2lzc3Vlcy8xOTI5LiIpO30pLnRoZW4ocj0+aG0odGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2Mub3AuY2hlY2tPcHNGb3JDb21wYXRpYmlsaXR5KHIsayk7Y29uc3QgdD15aWVsZCBjLmhpZXJhcmNoeS5idWlsZChyLG0scSk7cmV0dXJue2dyYXBoOnIsZ3JhcGhIaWVyYXJjaHk6dH19KSkuY2F0Y2gocj0+e2YucmVwb3J0RXJyb3IoYEdyYXBoIHZpc3VhbGl6YXRpb24gZmFpbGVkLlxuXG4ke3J9YCxyKTt0aHJvdyByOwp9KX19KShjLmxvYWRlcnx8KGMubG9hZGVyPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWdyYXBoLWNvbW1vbi9ub2RlLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBnKGNhLGVhLGthKXtpZihlYS5ub2RlLmlzR3JvdXBOb2RlKXtpZihlYS5leHBhbmRlZClyZXR1cm4gZC5idWlsZEdyb3VwKGNhLGVhLGthLGQuQ2xhc3MuU3Vic2NlbmUuR1JPVVApO2Quc2VsZWN0Q2hpbGQoY2EsImciLGQuQ2xhc3MuU3Vic2NlbmUuR1JPVVApLnJlbW92ZSgpfXJldHVybiBudWxsfWZ1bmN0aW9uIGwoY2EsZWEpe2xldCBrYT1lYS54LWVhLndpZHRoLzIrZWEucGFkZGluZ0xlZnQ7ZWE9ZWEueS1lYS5oZWlnaHQvMitlYS5wYWRkaW5nVG9wO2NhPWQuc2VsZWN0Q2hpbGQoY2EsImciLGQuQ2xhc3MuU3Vic2NlbmUuR1JPVVApO2QudHJhbnNsYXRlKGNhLGthLGVhKX1mdW5jdGlvbiBrKGNhLGVhLGthKXtjYT1kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoY2EsImciLGQuQ2xhc3MuTm9kZS5CVVRUT05fQ09OVEFJTkVSKTtkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoY2EsImNpcmNsZSIsCmQuQ2xhc3MuTm9kZS5CVVRUT05fQ0lSQ0xFKTtkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoY2EsInBhdGgiLGQuQ2xhc3MuTm9kZS5FWFBBTkRfQlVUVE9OKS5hdHRyKCJkIiwiTTAsLTIuMiBWMi4yIE0tMi4yLDAgSDIuMiIpO2Quc2VsZWN0T3JDcmVhdGVDaGlsZChjYSwicGF0aCIsZC5DbGFzcy5Ob2RlLkNPTExBUFNFX0JVVFRPTikuYXR0cigiZCIsIk0tMi4yLDAgSDIuMiIpO2NhLm9uKCJjbGljayIsYmE9PntkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtrYS5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLHtuYW1lOmJhLm5vZGUubmFtZX0pfSk7ZC5wb3NpdGlvbkJ1dHRvbihjYSxlYSl9ZnVuY3Rpb24gbShjYSxlYSxrYSxiYSl7aWYoYmEpY2EuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIik7ZWxzZXt2YXIgbGE9ZC5jb250ZXh0bWVudS5nZXRNZW51KGthLHAoZWEubm9kZSxrYSkpO2NhLm9uKCJkYmxjbGljayIsd2E9PntrYS5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLAp7bmFtZTp3YS5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW92ZXIiLHdhPT57a2EuaXNOb2RlRXhwYW5kZWQod2EpfHxrYS5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6d2Eubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdXQiLHdhPT57a2EuaXNOb2RlRXhwYW5kZWQod2EpfHxrYS5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTp3YS5ub2RlLm5hbWV9KX0pLm9uKCJjbGljayIsd2E9PntkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtrYS5maXJlKCJub2RlLXNlbGVjdCIse25hbWU6d2Eubm9kZS5uYW1lfSl9KS5vbigiY29udGV4dG1lbnUiLCh3YSxDYSk9PntrYS5maXJlKCJub2RlLXNlbGVjdCIse25hbWU6d2Eubm9kZS5uYW1lfSk7bGEuY2FsbCh3YSxDYSl9KX19ZnVuY3Rpb24gcChjYSxlYSl7bGV0IGthPVt7dGl0bGU6KCk9PmMuZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoY2EuaW5jbHVkZSksYWN0aW9uOigpPT57ZWEuZmlyZSgibm9kZS10b2dnbGUtZXh0cmFjdCIsCntuYW1lOmNhLm5hbWV9KX19XTtlYS5ub2RlQ29udGV4dE1lbnVJdGVtcyYmKGthPWthLmNvbmNhdChlYS5ub2RlQ29udGV4dE1lbnVJdGVtcykpO3EoY2EpJiZrYS5wdXNoKHt0aXRsZTooKT0+dihjYSksYWN0aW9uOigpPT57ZWEuZmlyZSgibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiLHtuYW1lOnIoY2EpfSl9fSk7cmV0dXJuIGthfWZ1bmN0aW9uIHEoY2Epe3JldHVybiBudWxsIT09cihjYSl9ZnVuY3Rpb24gcihjYSl7cmV0dXJuIGNhP2NhLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz9jYS5uYW1lOmNhLnR5cGU9PT1jLk5vZGVUeXBlLk9QP2NhLm93bmluZ1NlcmllczpudWxsOm51bGx9ZnVuY3Rpb24gdChjYSl7bGV0IGVhPW51bGw7aWYoIWNhKXJldHVybiBudWxsO2NhLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz9lYT1jYTpjYS5wYXJlbnROb2RlJiZjYS5wYXJlbnROb2RlLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUyYmKGVhPWNhLnBhcmVudE5vZGUpO3JldHVybiBlYX1mdW5jdGlvbiB2KGNhKXtyZXR1cm4gYS5ncmFwaC5nZXRHcm91cFNlcmllc05vZGVCdXR0b25TdHJpbmcobnVsbCE9PQp0KGNhKT9hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUDphLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQKX1mdW5jdGlvbiBBKGNhLGVhLGthKXt2YXIgYmE9ZWEuZGlzcGxheU5hbWU7bGV0IGxhPWVhLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQSYmIWVhLmV4cGFuZGVkO2NhPWQuc2VsZWN0T3JDcmVhdGVDaGlsZChjYSwidGV4dCIsZC5DbGFzcy5Ob2RlLkxBQkVMKTtsZXQgd2E9Y2Eubm9kZSgpO3dhLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQod2EpO2NhLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpO2xhJiYoYmEubGVuZ3RoPmthLm1heE1ldGFub2RlTGFiZWxMZW5ndGgmJihiYT1iYS5zdWJzdHIoMCxrYS5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoLTIpKyIuLi4iKSxrYT14KGthKSxjYS5hdHRyKCJmb250LXNpemUiLGthKGJhLmxlbmd0aCkrInB4IikpO2JhPWNhLnRleHQoYmEpO3koYmEsZWEubm9kZS50eXBlLGVhKTsKcmV0dXJuIGNhfWZ1bmN0aW9uIHkoY2EsZWEsa2Epe2xldCBiYT1jYS5ub2RlKCk7dmFyIGxhPWJhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO2xldCB3YT1iYS50ZXh0Q29udGVudCxDYT1udWxsO3N3aXRjaChlYSl7Y2FzZSBjLk5vZGVUeXBlLk1FVEE6a2EmJiFrYS5leHBhbmRlZCYmKENhPWMubGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS5tZXRhLm1heExhYmVsV2lkdGgpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5PUDpDYT1jLmxheW91dC5QQVJBTVMubm9kZVNpemUub3AubWF4TGFiZWxXaWR0aDticmVhaztjYXNlIC0xOkNhPWMubGF5b3V0LlBBUkFNUy5hbm5vdGF0aW9ucy5tYXhMYWJlbFdpZHRofWlmKCEobnVsbD09PUNhfHxsYTw9Q2EpKXtmb3IobGE9MTtiYS5nZXRTdWJTdHJpbmdMZW5ndGgoMCxsYSk8Q2E7KWxhKys7ZWE9YmEudGV4dENvbnRlbnQuc3Vic3RyKDAsbGEpO2RvIGVhPWVhLnN1YnN0cigwLGVhLmxlbmd0aC0xKSxiYS50ZXh0Q29udGVudD1lYSsiLi4uIixsYT1iYS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKTsKd2hpbGUobGE+Q2EmJjA8ZWEubGVuZ3RoKTtyZXR1cm4gY2EuYXBwZW5kKCJ0aXRsZSIpLnRleHQod2EpfX1mdW5jdGlvbiB4KGNhKXtoYXx8KGhhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFtjYS5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250LGNhLm1heE1ldGFub2RlTGFiZWxMZW5ndGhdKS5yYW5nZShbY2EubWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplLGNhLm1pbk1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZV0pLmNsYW1wKCEwKSk7cmV0dXJuIGhhfWZ1bmN0aW9uIEMoY2EsZWEsa2EsYmEpe2Quc2VsZWN0Q2hpbGQoY2EsInRleHQiLGQuQ2xhc3MuTm9kZS5MQUJFTCkudHJhbnNpdGlvbigpLmF0dHIoIngiLGVhKS5hdHRyKCJ5IixrYStiYSl9ZnVuY3Rpb24gRihjYSxlYSxrYSl7Y2E9ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGNhLCJnIixrYSk7c3dpdGNoKGVhLm5vZGUudHlwZSl7Y2FzZSBjLk5vZGVUeXBlLk9QOmVhPWVhLm5vZGU7aWYoXy5pc051bWJlcihlYS5mdW5jdGlvbklucHV0SW5kZXgpfHwKXy5pc051bWJlcihlYS5mdW5jdGlvbk91dHB1dEluZGV4KSl7ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGNhLCJwb2x5Z29uIixkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTticmVha31kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoY2EsImVsbGlwc2UiLGQuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5TRVJJRVM6a2E9ImFubm90YXRpb24iO2VhLmNvcmVHcmFwaCYmKGthPWVhLm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKTtsZXQgYmE9W2QuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVRdO2VhLmlzRmFkZWRPdXQmJmJhLnB1c2goImZhZGVkLWVsbGlwc2UiKTtkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoY2EsInVzZSIsYmEpLmF0dHIoInhsaW5rOmhyZWYiLCIjb3Atc2VyaWVzLSIra2ErIi1zdGFtcCIpO2Quc2VsZWN0T3JDcmVhdGVDaGlsZChjYSwicmVjdCIsZC5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLAplYS5yYWRpdXMpLmF0dHIoInJ5IixlYS5yYWRpdXMpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5CUklER0U6ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGNhLCJyZWN0IixkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsZWEucmFkaXVzKS5hdHRyKCJyeSIsZWEucmFkaXVzKTticmVhaztjYXNlIGMuTm9kZVR5cGUuTUVUQTpkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoY2EsInJlY3QiLGQuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixlYS5yYWRpdXMpLmF0dHIoInJ5IixlYS5yYWRpdXMpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrZWEubm9kZS50eXBlKTt9cmV0dXJuIGNhfWZ1bmN0aW9uIEQoY2Epe3N3aXRjaChjYS5ub2RlLnR5cGUpe2Nhc2UgYy5Ob2RlVHlwZS5PUDpyZXR1cm4gZC5DbGFzcy5PUE5PREU7Y2FzZSBjLk5vZGVUeXBlLk1FVEE6cmV0dXJuIGQuQ2xhc3MuTUVUQU5PREU7Y2FzZSBjLk5vZGVUeXBlLlNFUklFUzpyZXR1cm4gZC5DbGFzcy5TRVJJRVNOT0RFOwpjYXNlIGMuTm9kZVR5cGUuQlJJREdFOnJldHVybiBkLkNsYXNzLkJSSURHRU5PREU7Y2FzZSBjLk5vZGVUeXBlLkVMTElQU0lTOnJldHVybiBkLkNsYXNzLkVMTElQU0lTTk9ERX10aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitjYS5ub2RlLnR5cGUpO31mdW5jdGlvbiBCKGNhLGVhKXt2YXIga2E9ZC5zZWxlY3RDaGlsZChjYSwiZyIsZC5DbGFzcy5Ob2RlLlNIQVBFKTtsZXQgYmE9Yy5sYXlvdXQuY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZShlYSk7c3dpdGNoKGVhLm5vZGUudHlwZSl7Y2FzZSBjLk5vZGVUeXBlLk9QOntjb25zdCBsYT1lYS5ub2RlO18uaXNOdW1iZXIobGEuZnVuY3Rpb25JbnB1dEluZGV4KXx8Xy5pc051bWJlcihsYS5mdW5jdGlvbk91dHB1dEluZGV4KT8oa2E9ZC5zZWxlY3RDaGlsZChrYSwicG9seWdvbiIpLGQucG9zaXRpb25UcmlhbmdsZShrYSxlYS54LGVhLnksZWEuY29yZUJveC53aWR0aCxlYS5jb3JlQm94LmhlaWdodCkpOihrYT0KZC5zZWxlY3RDaGlsZChrYSwiZWxsaXBzZSIpLGQucG9zaXRpb25FbGxpcHNlKGthLGJhLGVhLnksZWEuY29yZUJveC53aWR0aCxlYS5jb3JlQm94LmhlaWdodCkpO0MoY2EsYmEsZWEueSxlYS5sYWJlbE9mZnNldCk7YnJlYWt9Y2FzZSBjLk5vZGVUeXBlLk1FVEE6a2E9a2Euc2VsZWN0QWxsKCJyZWN0Iik7ZWEuZXhwYW5kZWQ/KGQucG9zaXRpb25SZWN0KGthLGVhLngsZWEueSxlYS53aWR0aCxlYS5oZWlnaHQpLGwoY2EsZWEpLEMoY2EsYmEsZWEueSwtZWEuaGVpZ2h0LzIrZWEubGFiZWxIZWlnaHQvMikpOihkLnBvc2l0aW9uUmVjdChrYSxiYSxlYS55LGVhLmNvcmVCb3gud2lkdGgsZWEuY29yZUJveC5oZWlnaHQpLEMoY2EsYmEsZWEueSwwKSk7YnJlYWs7Y2FzZSBjLk5vZGVUeXBlLlNFUklFUzprYT1kLnNlbGVjdENoaWxkKGthLCJ1c2UiKTtlYS5leHBhbmRlZD8oZC5wb3NpdGlvblJlY3Qoa2EsZWEueCxlYS55LGVhLndpZHRoLGVhLmhlaWdodCksbChjYSxlYSksQyhjYSxiYSwKZWEueSwtZWEuaGVpZ2h0LzIrZWEubGFiZWxIZWlnaHQvMikpOihkLnBvc2l0aW9uUmVjdChrYSxiYSxlYS55LGVhLmNvcmVCb3gud2lkdGgsZWEuY29yZUJveC5oZWlnaHQpLEMoY2EsYmEsZWEueSxlYS5sYWJlbE9mZnNldCkpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5CUklER0U6Y2E9ZC5zZWxlY3RDaGlsZChrYSwicmVjdCIpO2QucG9zaXRpb25SZWN0KGNhLGVhLngsZWEueSxlYS53aWR0aCxlYS5oZWlnaHQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrZWEubm9kZS50eXBlKTt9fWZ1bmN0aW9uIEcoY2EsZWEsa2Epe2xldCBiYT1hLmdyYXBoLnV0aWwuZXNjYXBlUXVlcnlTZWxlY3RvcihjYSk7aWYoIWthKXJldHVybmB1cmwoIyR7YmF9KWA7a2E9ZDMuc2VsZWN0KGthKTtsZXQgbGE9a2Euc2VsZWN0KCJkZWZzI19ncmFwaC1ncmFkaWVudHMiKTtsYS5lbXB0eSgpJiYobGE9a2EuYXBwZW5kKCJkZWZzIikuYXR0cigiaWQiLCJfZ3JhcGgtZ3JhZGllbnRzIikpOwpsZXQgd2E9bGEuc2VsZWN0KCJsaW5lYXJHcmFkaWVudCMiK2JhKTtpZih3YS5lbXB0eSgpKXt3YT1sYS5hcHBlbmQoImxpbmVhckdyYWRpZW50IikuYXR0cigiaWQiLGNhKTt3YS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtsZXQgQ2E9MDtfLmVhY2goZWEseGE9PntsZXQgemE9eGEuY29sb3I7d2EuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixDYSkuYXR0cigic3RvcC1jb2xvciIsemEpO3dhLmFwcGVuZCgic3RvcCIpLmF0dHIoIm9mZnNldCIsQ2EreGEucHJvcG9ydGlvbikuYXR0cigic3RvcC1jb2xvciIsemEpO0NhKz14YS5wcm9wb3J0aW9ufSl9fWZ1bmN0aW9uIEsoY2EsZWEsa2EsYmEsbGEpe2xldCB3YT1jLnJlbmRlci5NZXRhbm9kZUNvbG9ycztzd2l0Y2goZWEpe2Nhc2UgWC5TVFJVQ1RVUkU6cmV0dXJuIGthLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQT8oZWE9a2Eubm9kZS50ZW1wbGF0ZUlkLG51bGw9PT1lYT93YS5VTktOT1dOOndhLlNUUlVDVFVSRV9QQUxFVFRFKGNhKGVhKSwKYmEpKTprYS5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz9iYT93YS5FWFBBTkRFRF9DT0xPUjoid2hpdGUiOmthLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuQlJJREdFP2thLnN0cnVjdHVyYWw/IiNmMGUiOmthLm5vZGUuaW5ib3VuZD8iIzBlZiI6IiNmZTAiOl8uaXNOdW1iZXIoa2Eubm9kZS5mdW5jdGlvbklucHV0SW5kZXgpPyIjNzk1NTQ4IjpfLmlzTnVtYmVyKGthLm5vZGUuZnVuY3Rpb25PdXRwdXRJbmRleCk/IiMwMDk2ODgiOiJ3aGl0ZSI7Y2FzZSBYLkRFVklDRTpyZXR1cm4gbnVsbD09a2EuZGV2aWNlQ29sb3JzP3dhLlVOS05PV046YmE/d2EuRVhQQU5ERURfQ09MT1I6RygiZGV2aWNlLSIra2Eubm9kZS5uYW1lLGthLmRldmljZUNvbG9ycyxsYSk7Y2FzZSBYLlhMQV9DTFVTVEVSOnJldHVybiBudWxsPT1rYS54bGFDbHVzdGVyQ29sb3JzP3dhLlVOS05PV046YmE/d2EuRVhQQU5ERURfQ09MT1I6RygieGxhLSIra2Eubm9kZS5uYW1lLGthLnhsYUNsdXN0ZXJDb2xvcnMsCmxhKTtjYXNlIFguQ09NUFVURV9USU1FOnJldHVybiBiYT93YS5FWFBBTkRFRF9DT0xPUjprYS5jb21wdXRlVGltZUNvbG9yfHx3YS5VTktOT1dOO2Nhc2UgWC5NRU1PUlk6cmV0dXJuIGJhP3dhLkVYUEFOREVEX0NPTE9SOmthLm1lbW9yeUNvbG9yfHx3YS5VTktOT1dOO2Nhc2UgWC5PUF9DT01QQVRJQklMSVRZOnJldHVybiBudWxsPT1rYS5jb21wYXRpYmlsaXR5Q29sb3JzP3dhLlVOS05PV046YmE/d2EuRVhQQU5ERURfQ09MT1I6Rygib3AtY29tcGF0LSIra2Eubm9kZS5uYW1lLGthLmNvbXBhdGliaWxpdHlDb2xvcnMsbGEpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVua25vd24gY2FzZSB0byBjb2xvciBub2RlcyBieSIpO319ZnVuY3Rpb24gTChjYSxlYSxrYSxiYSl7YmE9YmF8fGQuQ2xhc3MuTm9kZS5TSEFQRTtsZXQgbGE9a2EuaXNOb2RlU2VsZWN0ZWQoZWEubm9kZS5uYW1lKSx3YT1lYS5pc0luRXh0cmFjdHx8ZWEuaXNPdXRFeHRyYWN0fHxlYS5pc0xpYnJhcnlGdW5jdGlvbiwKQ2E9ZWEuZXhwYW5kZWQmJmJhIT09ZC5DbGFzcy5Bbm5vdGF0aW9uLk5PREUseGE9ZWEuaXNGYWRlZE91dDtjYS5jbGFzc2VkKCJoaWdobGlnaHRlZCIsa2EuaXNOb2RlSGlnaGxpZ2h0ZWQoZWEubm9kZS5uYW1lKSk7Y2EuY2xhc3NlZCgic2VsZWN0ZWQiLGxhKTtjYS5jbGFzc2VkKCJleHRyYWN0Iix3YSk7Y2EuY2xhc3NlZCgiZXhwYW5kZWQiLENhKTtjYS5jbGFzc2VkKCJmYWRlZCIseGEpO2NhPWNhLnNlbGVjdCgiLiIrYmErIiAuIitkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTtlYT1LKGthLnRlbXBsYXRlSW5kZXgsWFtrYS5jb2xvckJ5LnRvVXBwZXJDYXNlKCldLGVhLENhLGthLmdldEdyYXBoU3ZnUm9vdCgpKTtjYS5zdHlsZSgiZmlsbCIsZWEpO2NhLnN0eWxlKCJzdHJva2UiLGxhP251bGw6SihlYSkpfWZ1bmN0aW9uIEooY2Epe3JldHVybiJ1cmwiPT09Y2Euc3Vic3RyaW5nKDAsMyk/Yy5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuR1JBRElFTlRfT1VUTElORTpkMy5yZ2IoY2EpLmRhcmtlcigpLnRvU3RyaW5nKCl9CmZ1bmN0aW9uIFAoY2EsZWEpe2xldCBrYT1bXTtjYT1lYS5nZXROb2RlQnlOYW1lKGNhKTtpZihjYSBpbnN0YW5jZW9mIGEuZ3JhcGguT3BOb2RlSW1wbClyZXR1cm5bY2FdLmNvbmNhdChjYS5pbkVtYmVkZGluZ3MpO2NhPWNhLm1ldGFncmFwaC5ub2RlcygpO18uZWFjaChjYSxmdW5jdGlvbihiYSl7a2E9a2EuY29uY2F0KFAoYmEsZWEpKX0pO3JldHVybiBrYX1mdW5jdGlvbiBTKGNhLGVhLGthLGJhKXtpZihiYVtrYS5uYW1lXSlyZXR1cm4gYmE7YmFba2EubmFtZV09ITA7dmFyIGxhPWthLmlucHV0cztsZXQgd2E9YWEoZWEsa2EpO2QzLnNlbGVjdChjYSkuc2VsZWN0KGAubm9kZVtkYXRhLW5hbWU9IiR7d2EubmFtZX0iXWApLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIsITApO2xldCBDYT17fTtfLmVhY2gobGEsZnVuY3Rpb24oRmEpe0ZhPWVhLmdldE5vZGVCeU5hbWUoRmEubmFtZSk7aWYodm9pZCAwIT09RmEpe0ZhIGluc3RhbmNlb2YgYy5NZXRhbm9kZUltcGwmJihGYT1hLmdyYXBoLmdldFN0cmljdE5hbWUoRmEubmFtZSksCkZhPWVhLmdldE5vZGVCeU5hbWUoRmEpKTt2YXIgU2E9YWEoZWEsRmEpLEVhPUNhW1NhLm5hbWVdO0VhP0VhLm9wTm9kZXMucHVzaChGYSk6Q2FbU2EubmFtZV09e3Zpc2libGVQYXJlbnQ6U2Esb3BOb2RlczpbRmFdfX19KTtsZXQgeGE9e30semE9W3dhXTt4YVt3YS5uYW1lXT17dHJhY2VkOiExLGluZGV4OjAsY29ubmVjdGlvbkVuZHBvaW50czpbXX07a2E9d2E7Zm9yKGxhPTE7a2EubmFtZSE9PWEuZ3JhcGguUk9PVF9OQU1FO2xhKyspa2E9a2EucGFyZW50Tm9kZSx4YVtrYS5uYW1lXT17dHJhY2VkOiExLGluZGV4OmxhLGNvbm5lY3Rpb25FbmRwb2ludHM6W119LHphW2xhXT1rYTtfLmZvck93bihDYSxmdW5jdGlvbihGYSl7bGV0IFNhPUZhLnZpc2libGVQYXJlbnQ7Xy5lYWNoKEZhLm9wTm9kZXMsZnVuY3Rpb24oRWEpe2JhPVMoY2EsZWEsRWEsYmEpfSk7U2EubmFtZSE9PXdhLm5hbWUmJk4oY2EsU2EseGEsemEpfSk7cmV0dXJuIGJhfWZ1bmN0aW9uIE4oY2EsZWEsa2EsYmEpe3ZhciBsYT0KZWEsd2E9ZWE7Zm9yKGVhPVtdOyFrYVtsYS5uYW1lXTspd2EubmFtZSE9PWxhLm5hbWUmJmVhLnB1c2goW3dhLGxhXSksd2E9bGEsbGE9bGEucGFyZW50Tm9kZTtrYT1rYVtsYS5uYW1lXS5pbmRleDtsZXQgQ2E9YmFbTWF0aC5tYXgoa2EtMSwwKV0ubmFtZTt3YT1sYT13YS5uYW1lO2NvbnN0IHhhPWQzLnNlbGVjdChjYSk7eGEuc2VsZWN0QWxsKGBbZGF0YS1lZGdlPSIke3dhfS0tJHtDYX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCk7Xy5lYWNoKGVhLGZ1bmN0aW9uKHphKXt4YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7emFbMF0ubmFtZX0tLSR7Q2F9YCtgfn4ke3phWzFdLm5hbWV9fn5PVVQiXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9KTtmb3IoY2E9MTtjYTxrYTtjYSsrKXhhLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtsYX1+fiR7YmFbY2FdLm5hbWV9YCtgfn5JTi0tJHtiYVtjYS0xXS5uYW1lfSJdYCkuY2xhc3NlZCgiaW5wdXQtZWRnZS1oaWdobGlnaHQiLAohMCl9ZnVuY3Rpb24gVChjYSxlYSl7bGV0IGthPXt9O18uZWFjaChlYSxmdW5jdGlvbihiYSl7YmE9Y2EuZ2V0Tm9kZUJ5TmFtZShiYSk7YmE9YWEoY2EsYmEpO2thW2JhLm5hbWVdPWJhfSk7cmV0dXJuIGthfWZ1bmN0aW9uIFkoY2EsZWEpe18uZm9yT3duKGVhLGZ1bmN0aW9uKGthKXtmb3IoO2thLm5hbWUhPT1hLmdyYXBoLlJPT1RfTkFNRTspe2NvbnN0IGJhPWQzLnNlbGVjdChjYSkuc2VsZWN0KGAubm9kZVtkYXRhLW5hbWU9IiR7a2EubmFtZX0iXWApOyFiYS5ub2RlcygpLmxlbmd0aHx8YmEuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0Iil8fGJhLmNsYXNzZWQoInNlbGVjdGVkIil8fGJhLmNsYXNzZWQoIm9wIil8fGJhLmNsYXNzZWQoImlucHV0LXBhcmVudCIsITApO2thPWthLnBhcmVudE5vZGV9fSl9ZnVuY3Rpb24gYWEoY2EsZWEpe2xldCBrYT0hMSxiYT1lYTtmb3IoOyFrYTspaWYoZWE9YmEsYmE9ZWEucGFyZW50Tm9kZSx2b2lkIDA9PT1iYSlrYT0hMDtlbHNle2xldCBsYT0KY2EuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiYS5uYW1lKTtsYSYmKGxhLmV4cGFuZGVkfHxiYSBpbnN0YW5jZW9mIGMuT3BOb2RlSW1wbCkmJihrYT0hMCl9cmV0dXJuIGVhfWYuYnVpbGRHcm91cD1mdW5jdGlvbihjYSxlYSxrYSl7Y2E9ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGNhLCJnIixkLkNsYXNzLk5vZGUuQ09OVEFJTkVSKS5zZWxlY3RBbGwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfSkuZGF0YShlYSxiYT0+YmEubm9kZS5uYW1lKyI6IitiYS5ub2RlLnR5cGUpO2NhLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIixiYT0+YmEubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKGJhKXtsZXQgbGE9ZDMuc2VsZWN0KHRoaXMpO2thLmFkZE5vZGVHcm91cChiYS5ub2RlLm5hbWUsbGEpfSkubWVyZ2UoY2EpLmF0dHIoImNsYXNzIixiYT0+ZC5DbGFzcy5Ob2RlLkdST1VQKyIgIitEKGJhKSkuZWFjaChmdW5jdGlvbihiYSl7bGV0IGxhPWQzLnNlbGVjdCh0aGlzKTsKdmFyIHdhPWQuc2VsZWN0T3JDcmVhdGVDaGlsZChsYSwiZyIsZC5DbGFzcy5Bbm5vdGF0aW9uLklOQk9YKTtkLmFubm90YXRpb24uYnVpbGRHcm91cCh3YSxiYS5pbkFubm90YXRpb25zLGJhLGthKTt3YT1kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQobGEsImciLGQuQ2xhc3MuQW5ub3RhdGlvbi5PVVRCT1gpO2QuYW5ub3RhdGlvbi5idWlsZEdyb3VwKHdhLGJhLm91dEFubm90YXRpb25zLGJhLGthKTt3YT1GKGxhLGJhLGQuQ2xhc3MuTm9kZS5TSEFQRSk7YmEubm9kZS5pc0dyb3VwTm9kZSYmayh3YSxiYSxrYSk7bSh3YSxiYSxrYSk7ZyhsYSxiYSxrYSk7d2E9QShsYSxiYSxrYSk7bSh3YSxiYSxrYSxiYS5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEEpO0wobGEsYmEsa2EpO0IobGEsYmEpfSk7Y2EuZXhpdCgpLmVhY2goZnVuY3Rpb24oYmEpe2thLnJlbW92ZU5vZGVHcm91cChiYS5ub2RlLm5hbWUpO2xldCBsYT1kMy5zZWxlY3QodGhpcyk7MDxiYS5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoJiYKbGEuc2VsZWN0KCIuIitkLkNsYXNzLkFubm90YXRpb24uSU5CT1gpLnNlbGVjdEFsbCgiLiIrZC5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKHdhPT57a2EucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKHdhLGJhKX0pOzA8YmEub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGgmJmxhLnNlbGVjdCgiLiIrZC5DbGFzcy5Bbm5vdGF0aW9uLk9VVEJPWCkuc2VsZWN0QWxsKCIuIitkLkNsYXNzLkFubm90YXRpb24uR1JPVVApLmVhY2god2E9PntrYS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAod2EsYmEpfSl9KS5yZW1vdmUoKTtyZXR1cm4gY2F9O2YuZ2V0Q29udGV4dE1lbnU9cDtmLmNhbkJlSW5TZXJpZXM9cTtmLmdldFNlcmllc05hbWU9cjtmLmdldEdyb3VwU2V0dGluZ0xhYmVsPXY7Zi5lbmZvcmNlTGFiZWxXaWR0aD15O2xldCBoYT1udWxsO2YuYnVpbGRTaGFwZT1GO2Yubm9kZUNsYXNzPUQ7bGV0IFg7KGZ1bmN0aW9uKGNhKXtjYVtjYS5TVFJVQ1RVUkU9MF09IlNUUlVDVFVSRSI7Y2FbY2EuREVWSUNFPQoxXT0iREVWSUNFIjtjYVtjYS5YTEFfQ0xVU1RFUj0yXT0iWExBX0NMVVNURVIiO2NhW2NhLkNPTVBVVEVfVElNRT0zXT0iQ09NUFVURV9USU1FIjtjYVtjYS5NRU1PUlk9NF09Ik1FTU9SWSI7Y2FbY2EuT1BfQ09NUEFUSUJJTElUWT01XT0iT1BfQ09NUEFUSUJJTElUWSJ9KShYPWYuQ29sb3JCeXx8KGYuQ29sb3JCeT17fSkpO2YucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucz1mdW5jdGlvbihjYSl7ZDMuc2VsZWN0KGNhKS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfTtmLmdldEZpbGxGb3JOb2RlPUs7Zi5zdHlsaXplPUw7Zi5nZXRTdHJva2VGb3JGaWxsPUo7Zi51cGRhdGVJbnB1dFRyYWNlPWZ1bmN0aW9uKGNhLGVhLGthLGJhKXtjb25zdCBsYT1kMy5zZWxlY3QoY2EpO2xhLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIsITEpO2xhLnNlbGVjdEFsbCgiLm5vbi1pbnB1dCIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsCiExKTtsYS5zZWxlY3RBbGwoIi5pbnB1dC1wYXJlbnQiKS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCExKTtsYS5zZWxlY3RBbGwoIi5pbnB1dC1jaGlsZCIpLmNsYXNzZWQoImlucHV0LWNoaWxkIiwhMSk7bGEuc2VsZWN0QWxsKCIuaW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITEpO2xhLnNlbGVjdEFsbCgiLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIpLmNsYXNzZWQoIm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIsITEpO2xhLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIsITEpO2lmKGVhJiZiYSYma2Epe2thPVAoa2EsZWEpO3ZhciB3YT17fTtfLmVhY2goa2EsZnVuY3Rpb24oQ2Epe3dhPVMoY2EsZWEsQ2Esd2EpfSk7a2E9T2JqZWN0LmtleXMod2EpO2thPVQoZWEsa2EpO1koY2Esa2EpO2xhLnNlbGVjdEFsbCgiZy5ub2RlOm5vdCguc2VsZWN0ZWQpOm5vdCguaW5wdXQtaGlnaGxpZ2h0KTpub3QoLmlucHV0LXBhcmVudCk6bm90KC5pbnB1dC1jaGlsZHJlbikiKS5jbGFzc2VkKCJub24taW5wdXQiLAohMCkuZWFjaChmdW5jdGlvbihDYSl7bGEuc2VsZWN0QWxsKGBbZGF0YS1uYW1lPSIke0NhLm5vZGUubmFtZX0iXWApLmNsYXNzZWQoIm5vbi1pbnB1dCIsITApfSk7bGEuc2VsZWN0QWxsKCJnLmVkZ2U6bm90KC5pbnB1dC1lZGdlLWhpZ2hsaWdodCkiKS5jbGFzc2VkKCJub24taW5wdXQtZWRnZS1oaWdobGlnaHQiLCEwKX19O2YuZ2V0VmlzaWJsZVBhcmVudD1hYX0pKGQubm9kZXx8KGQubm9kZT17fSkpfSkoYy5zY2VuZXx8KGMuc2NlbmU9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtY29tbW9uL29wLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2NsYXNzIGZ7aXNOb3RUcHVPcChnKXtyZXR1cm4tMSE9Zy50b0xvd2VyQ2FzZSgpLnNlYXJjaCgiY3B1OiIpfHwtMSE9Zy50b0xvd2VyQ2FzZSgpLnNlYXJjaCgiZ3B1OiIpPyEwOi0xPT1nLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJ0cHUiKX1vcFZhbGlkKGcpe3JldHVybiAwPT1nLm5hbWUuc2VhcmNoKGMuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCl8fCFnLm9wfHxnLmRldmljZSYmdGhpcy5pc05vdFRwdU9wKGcuZGV2aWNlKXx8Zy5kZXZpY2UmJi0xIT1nLmRldmljZS5zZWFyY2goIlRQVV9TWVNURU0iKT8hMDpfLmluY2x1ZGVzKGYuV0hJVEVMSVNULGcub3ApfX1mLldISVRFTElTVD0iQWJzIEFjb3MgQWNvc2ggQWRkIEFkZE4gQWRqdXN0Q29udHJhc3R2MiBBZGp1c3RIdWUgQWRqdXN0U2F0dXJhdGlvbiBBbGwgQW5nbGUgQW55IEFwcHJveGltYXRlRXF1YWwgQXJnTWF4IEFyZ01pbiBBc2luIEFzaW5oIEFzc2VydCBBc3NpZ25BZGRWYXJpYWJsZU9wIEFzc2lnblN1YlZhcmlhYmxlT3AgQXNzaWduVmFyaWFibGVPcCBBdGFuIEF0YW4yIEF0YW5oIEF2Z1Bvb2wgQXZnUG9vbDNEIEF2Z1Bvb2wzREdyYWQgQXZnUG9vbEdyYWQgQmF0Y2hNYXRNdWwgQmF0Y2hUb1NwYWNlIEJhdGNoVG9TcGFjZU5EIEJpYXNBZGQgQmlhc0FkZEdyYWQgQmlhc0FkZFYxIEJpdGNhc3QgQml0d2lzZUFuZCBCaXR3aXNlT3IgQml0d2lzZVhvciBCcm9hZGNhc3RBcmdzIEJyb2FkY2FzdEdyYWRpZW50QXJncyBCdWNrZXRpemUgQ2FzdCBDZWlsIENoZWNrTnVtZXJpY3MgQ2hvbGVza3kgQ2xpcEJ5VmFsdWUgQ29tcGxleCBDb21wbGV4QWJzIENvbmNhdCBDb25jYXRPZmZzZXQgQ29uY2F0VjIgQ29uaiBDb25qdWdhdGVUcmFuc3Bvc2UgQ29uc3QgQ29udHJvbFRyaWdnZXIgQ29udjJEIENvbnYyREJhY2twcm9wRmlsdGVyIENvbnYyREJhY2twcm9wSW5wdXQgQ29udjNEIENvbnYzREJhY2twcm9wRmlsdGVyVjIgQ29udjNEQmFja3Byb3BJbnB1dFYyIENvcyBDb3NoIENyb3NzIENyb3NzUmVwbGljYVN1bSBDdW1wcm9kIEN1bXN1bSBEZXB0aFRvU3BhY2UgRGVwdGh3aXNlQ29udjJkTmF0aXZlIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgRGlhZyBEaWFnUGFydCBEaWdhbW1hIERpdiBEeW5hbWljU3RpdGNoIEVsdSBFbHVHcmFkIEVtcHR5IEVxdWFsIEVyZiBFcmZjIEV4cCBFeHBhbmREaW1zIEV4cG0xIEV4dHJhY3RJbWFnZVBhdGNoZXMgRkZUIEZGVDJEIEZGVDNEIEZha2VRdWFudFdpdGhNaW5NYXhBcmdzIEZha2VRdWFudFdpdGhNaW5NYXhBcmdzR3JhZGllbnQgRmFrZVF1YW50V2l0aE1pbk1heFZhcnMgRmFrZVF1YW50V2l0aE1pbk1heFZhcnNHcmFkaWVudCBGaWxsIEZsb29yIEZsb29yRGl2IEZsb29yTW9kIEZ1c2VkQmF0Y2hOb3JtIEZ1c2VkQmF0Y2hOb3JtR3JhZCBGdXNlZEJhdGNoTm9ybUdyYWRWMiBGdXNlZEJhdGNoTm9ybVYyIEdhdGhlciBHYXRoZXJOZCBHYXRoZXJWMiBHZXRJdGVtIEdyZWF0ZXIgR3JlYXRlckVxdWFsIEhTVlRvUkdCIElGRlQgSUZGVDJEIElGRlQzRCBJUkZGVCBJUkZGVDJEIElSRkZUM0QgSWRlbnRpdHkgSWRlbnRpdHlOIElmIEltYWcgSW5mZWVkRGVxdWV1ZSBJbmZlZWREZXF1ZXVlVHVwbGUgSW5wbGFjZUFkZCBJbnBsYWNlVXBkYXRlIEludiBJbnZlcnQgSW52ZXJ0UGVybXV0YXRpb24gSXNGaW5pdGUgSXNJbmYgSXNOYW4gTDJMb3NzIExSTiBMUk5HcmFkIExlZnRTaGlmdCBMZXNzIExlc3NFcXVhbCBMZ2FtbWEgTGluU3BhY2UgTGlzdERpZmYgTG9nIExvZzFwIExvZ1NvZnRtYXggTG9naWNhbEFuZCBMb2dpY2FsTm90IExvZ2ljYWxPciBNYXRNdWwgTWF0cml4QmFuZFBhcnQgTWF0cml4RGlhZyBNYXRyaXhEaWFnUGFydCBNYXRyaXhTZXREaWFnIE1hdHJpeFRyaWFuZ3VsYXJTb2x2ZSBNYXggTWF4UG9vbCBNYXhQb29sM0QgTWF4UG9vbDNER3JhZCBNYXhQb29sM0RHcmFkR3JhZCBNYXhQb29sR3JhZCBNYXhQb29sR3JhZEdyYWQgTWF4UG9vbEdyYWRHcmFkVjIgTWF4UG9vbEdyYWRWMiBNYXhQb29sVjIgTWF4aW11bSBNZWFuIE1pbiBNaW5pbXVtIE1pcnJvclBhZCBNb2QgTXVsIE11bHRpbm9taWFsIE5lZyBOb09wIE5vbk1heFN1cHByZXNzaW9uVjQgTm90RXF1YWwgT25lSG90IE9uZXNMaWtlIE91dGZlZWRFbnF1ZXVlIE91dGZlZWRFbnF1ZXVlVHVwbGUgUGFjayBQYWQgUGFkVjIgUGFyYWxsZWxEeW5hbWljU3RpdGNoIFBsYWNlaG9sZGVyV2l0aERlZmF1bHQgUG93IFByZXZlbnRHcmFkaWVudCBQcm9kIFFyIFF1YW50aXplQW5kRGVxdWFudGl6ZVYyIFF1YW50aXplQW5kRGVxdWFudGl6ZVYzIFJGRlQgUkZGVDJEIFJGRlQzRCBSR0JUb0hTViBSYW5kb21TaHVmZmxlIFJhbmRvbVN0YW5kYXJkTm9ybWFsIFJhbmRvbVVuaWZvcm0gUmFuZG9tVW5pZm9ybUludCBSYW5nZSBSYW5rIFJlYWRWYXJpYWJsZU9wIFJlYWwgUmVhbERpdiBSZWNpcHJvY2FsIFJlY2lwcm9jYWxHcmFkIFJlY3ZUUFVFbWJlZGRpbmdBY3RpdmF0aW9ucyBSZWx1IFJlbHU2IFJlbHU2R3JhZCBSZWx1R3JhZCBSZXNoYXBlIFJlc2l6ZUJpbGluZWFyIFJlc2l6ZUJpbGluZWFyR3JhZCBSZXNvdXJjZUFwcGx5QWRhTWF4IFJlc291cmNlQXBwbHlBZGFkZWx0YSBSZXNvdXJjZUFwcGx5QWRhZ3JhZCBSZXNvdXJjZUFwcGx5QWRhZ3JhZERBIFJlc291cmNlQXBwbHlBZGFtIFJlc291cmNlQXBwbHlBZGRTaWduIFJlc291cmNlQXBwbHlDZW50ZXJlZFJNU1Byb3AgUmVzb3VyY2VBcHBseUZ0cmwgUmVzb3VyY2VBcHBseUZ0cmxWMiBSZXNvdXJjZUFwcGx5R3JhZGllbnREZXNjZW50IFJlc291cmNlQXBwbHlNb21lbnR1bSBSZXNvdXJjZUFwcGx5UG93ZXJTaWduIFJlc291cmNlQXBwbHlQcm94aW1hbEFkYWdyYWQgUmVzb3VyY2VBcHBseVByb3hpbWFsR3JhZGllbnREZXNjZW50IFJlc291cmNlQXBwbHlSTVNQcm9wIFJlc291cmNlR2F0aGVyIFJlc291cmNlU2NhdHRlckFkZCBSZXNvdXJjZVNjYXR0ZXJEaXYgUmVzb3VyY2VTY2F0dGVyTWF4IFJlc291cmNlU2NhdHRlck1pbiBSZXNvdXJjZVNjYXR0ZXJNdWwgUmVzb3VyY2VTY2F0dGVyTmRBZGQgUmVzb3VyY2VTY2F0dGVyTmRVcGRhdGUgUmVzb3VyY2VTY2F0dGVyU3ViIFJlc291cmNlU2NhdHRlclVwZGF0ZSBSZXNvdXJjZVN0cmlkZWRTbGljZUFzc2lnbiBSZXZlcnNlIFJldmVyc2VTZXF1ZW5jZSBSZXZlcnNlVjIgUmlnaHRTaGlmdCBSaW50IFJvdW5kIFJzcXJ0IFJzcXJ0R3JhZCBTY2F0dGVyTmQgU2VsZWN0IFNlbHUgU2VsdUdyYWQgU2VuZFRQVUVtYmVkZGluZ0dyYWRpZW50cyBTaGFwZSBTaGFwZU4gU2lnbW9pZCBTaWdtb2lkR3JhZCBTaWduIFNpbiBTaW5oIFNpemUgU2xpY2UgU25hcHNob3QgU29mdG1heCBTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyBTb2Z0cGx1cyBTb2Z0cGx1c0dyYWQgU29mdHNpZ24gU29mdHNpZ25HcmFkIFNwYWNlVG9CYXRjaCBTcGFjZVRvQmF0Y2hORCBTcGFjZVRvRGVwdGggU3BhcnNlTWF0TXVsIFNwYXJzZVNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzIFNwYXJzZVRvRGVuc2UgU3BsaXQgU3BsaXRWIFNxcnQgU3FydEdyYWQgU3F1YXJlIFNxdWFyZWREaWZmZXJlbmNlIFNxdWVlemUgU3RhY2tDbG9zZVYyIFN0YWNrUG9wVjIgU3RhY2tQdXNoVjIgU3RhY2tWMiBTdGF0ZWxlc3NJZiBTdGF0ZWxlc3NSYW5kb21Ob3JtYWwgU3RhdGVsZXNzUmFuZG9tVW5pZm9ybSBTdGF0ZWxlc3NUcnVuY2F0ZWROb3JtYWwgU3RhdGVsZXNzV2hpbGUgU3RvcEdyYWRpZW50IFN0cmlkZWRTbGljZSBTdHJpZGVkU2xpY2VHcmFkIFN1YiBTdW0gU3ltYm9saWNHcmFkaWVudCBUUFVFbWJlZGRpbmdBY3RpdmF0aW9ucyBUYW4gVGFuaCBUYW5oR3JhZCBUZW5zb3JBcnJheUNsb3NlVjMgVGVuc29yQXJyYXlDb25jYXRWMyBUZW5zb3JBcnJheUdhdGhlclYzIFRlbnNvckFycmF5R3JhZFYzIFRlbnNvckFycmF5UmVhZFYzIFRlbnNvckFycmF5U2NhdHRlclYzIFRlbnNvckFycmF5U2l6ZVYzIFRlbnNvckFycmF5U3BsaXRWMyBUZW5zb3JBcnJheVYzIFRlbnNvckFycmF5V3JpdGVWMyBUaWxlIFRvcEtWMiBUcmFuc3Bvc2UgVHJ1bmNhdGVEaXYgVHJ1bmNhdGVNb2QgVHJ1bmNhdGVkTm9ybWFsIFVucGFjayBVbnNvcnRlZFNlZ21lbnRNYXggVW5zb3J0ZWRTZWdtZW50TWluIFVuc29ydGVkU2VnbWVudFByb2QgVW5zb3J0ZWRTZWdtZW50U3VtIFZhcklzSW5pdGlhbGl6ZWRPcCBWYXJpYWJsZVNoYXBlIFdoaWxlIFhsYUR5bmFtaWNVcGRhdGVTbGljZSBYbGFIb3N0Q29tcHV0ZSBYbGFJZiBYbGFSZWN2IFhsYVJlZHVjZVdpbmRvdyBYbGFTZW5kIFhsYVNvcnQgWGxhV2hpbGUgWmVyb3NMaWtlIEVudGVyIEV4aXQgTG9vcENvbmQgTWVyZ2UgTmV4dEl0ZXJhdGlvbiBTd2l0Y2ggX0FyZyBfUGFyYWxsZWxDb25jYXRVcGRhdGUgX1JldHZhbCBfVFBVQ29tcGlsZSBfVFBVRXhlY3V0ZSBUUFVDb21waWxhdGlvblJlc3VsdCBUUFVSZXBsaWNhdGVkSW5wdXQgVFBVUmVwbGljYXRlZE91dHB1dCBUUFVSZXBsaWNhdGVNZXRhZGF0YSBNZXJnZVYyQ2hlY2twb2ludHMgUmVzdG9yZVYyIFNhdmVWMiBBYm9ydCBBc3NlcnQgQXNzaWduIFBsYWNlaG9sZGVyIFBsYWNlaG9sZGVyVjIgU2hhcmRlZEZpbGVuYW1lIFN0cmluZ0pvaW4gVmFyaWFibGUgVmFyaWFibGVWMiBWYXJIYW5kbGVPcCBBdWRpb1N1bW1hcnkgQXVkaW9TdW1tYXJ5VjIgRGVidWdOdW1lcmljU3VtbWFyeSBIaXN0b2dyYW1TdW1tYXJ5IEltYWdlU3VtbWFyeSBNZXJnZVN1bW1hcnkgU2NhbGFyU3VtbWFyeSBTdGF0c0FnZ3JlZ2F0b3JTdW1tYXJ5Ii5zcGxpdCgiICIpOwpkLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcj1mO2QuY2hlY2tPcHNGb3JDb21wYXRpYmlsaXR5PWZ1bmN0aW9uKGcsbCl7aWYobnVsbD09PWwpdGhyb3cgRXJyb3IoIkNvbXBhdGliaWxpdHkgcHJvdmlkZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrbCk7Xy5lYWNoKGcubm9kZXMsaz0+e2suY29tcGF0aWJsZT1sLm9wVmFsaWQoayk7Xy5lYWNoKGsuaW5FbWJlZGRpbmdzLG09PnttLmNvbXBhdGlibGU9bC5vcFZhbGlkKG0pfSk7Xy5lYWNoKGsub3V0RW1iZWRkaW5ncyxtPT57bS5jb21wYXRpYmxlPWwub3BWYWxpZChtKX0pfSl9fSkoYy5vcHx8KGMub3A9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtY29tbW9uL3BhcnNlci5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKHQpe2lmKCJ0cnVlIj09PXQpcmV0dXJuITA7aWYoImZhbHNlIj09PXQpcmV0dXJuITE7aWYoJyInPT09dFswXSlyZXR1cm4gdC5zdWJzdHJpbmcoMSx0Lmxlbmd0aC0xKTtsZXQgdj1wYXJzZUZsb2F0KHQpO3JldHVybiBpc05hTih2KT90OnZ9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gbmV3IFByb21pc2UoKHYsQSk9PntmZXRjaCh0KS50aGVuKHk9Pnt5Lm9rP3kuYXJyYXlCdWZmZXIoKS50aGVuKHYsQSk6eS50ZXh0KCkudGhlbihBLEEpfSl9KX1mdW5jdGlvbiBsKHQsdixBPTFFNix5PSJcbiIpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih4LEMpe2Z1bmN0aW9uIEYoRCxCLEcpe3ZhciBLPUc+PXQuYnl0ZUxlbmd0aDtCPUIuc3BsaXQoeSk7QlswXT1EK0JbMF07Y29uc3QgTD1LPyIiOkIucG9wKCk7Zm9yKGxldCBKIG9mIEIpdHJ5e3YoSil9Y2F0Y2goUCl7QyhQKTtyZXR1cm59Sz94KCEwKToKKEQ9bmV3IEJsb2IoW3Quc2xpY2UoRyxHK0EpXSksSz1uZXcgRmlsZVJlYWRlcixLLm9ubG9hZD1mdW5jdGlvbihKKXtGKEwsSi50YXJnZXQucmVzdWx0LEcrQSl9LEsucmVhZEFzVGV4dChEKSl9RigiIiwiIiwwKX0pfWZ1bmN0aW9uIGsodCl7cmV0dXJuIHAodCxxKX1mdW5jdGlvbiBtKHQpe3JldHVybiBwKHQscikudGhlbih2PT52LnN0ZXBfc3RhdHMpfWZ1bmN0aW9uIHAodCx2KXtmdW5jdGlvbiBBKEIpe2xldCBHPUIuaW5kZXhPZigiOiIpLEs9Qi5zdWJzdHJpbmcoMCxHKS50cmltKCk7Qj1mKEIuc3Vic3RyaW5nKEcrMikudHJpbSgpKTtyZXR1cm57bmFtZTpLLHZhbHVlOkJ9fWZ1bmN0aW9uIHkoQixHLEssTCl7bGV0IEo9QltHXTtudWxsPT1KP0JbR109TC5qb2luKCIuIilpbiB2P1tLXTpLOkFycmF5LmlzQXJyYXkoSik/Si5wdXNoKEspOkJbR109W0osS119bGV0IHg9e30sQz1bXSxGPVtdLEQ9eDtyZXR1cm4gbCh0LGZ1bmN0aW9uKEIpe2lmKEIpc3dpdGNoKEI9Qi50cmltKCksCkJbQi5sZW5ndGgtMV0pe2Nhc2UgInsiOkI9Qi5zdWJzdHJpbmcoMCxCLmxlbmd0aC0yKS50cmltKCk7bGV0IEc9e307Qy5wdXNoKEQpO0YucHVzaChCKTt5KEQsQixHLEYpO0Q9RzticmVhaztjYXNlICJ9IjpEPUMucG9wKCk7Ri5wb3AoKTticmVhaztkZWZhdWx0OkI9QShCKSx5KEQsQi5uYW1lLEIudmFsdWUsRi5jb25jYXQoQi5uYW1lKSl9fSkudGhlbihmdW5jdGlvbigpe3JldHVybiB4fSl9ZC5mZXRjaFBiVHh0PWc7ZC5mZXRjaEFuZFBhcnNlTWV0YWRhdGE9ZnVuY3Rpb24odCx2KXtyZXR1cm4gYS5ncmFwaC51dGlsLnJ1blRhc2soIlJlYWRpbmcgbWV0YWRhdGEgcGJ0eHQiLDQwLCgpPT5udWxsPT10P1Byb21pc2UucmVzb2x2ZShudWxsKTpnKHQpLHYpLnRoZW4oQT0+YS5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgbWV0YWRhdGEucGJ0eHQiLDYwLCgpPT5udWxsIT1BP20oQSk6UHJvbWlzZS5yZXNvbHZlKG51bGwpLHYpKX07ZC5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhPQpmdW5jdGlvbih0LHYsQSl7cmV0dXJuIGEuZ3JhcGgudXRpbC5ydW5Bc3luY1Byb21pc2VUYXNrKCJSZWFkaW5nIGdyYXBoIHBidHh0Iiw0MCwoKT0+dj9uZXcgUHJvbWlzZShmdW5jdGlvbih5LHgpe2xldCBDPW5ldyBGaWxlUmVhZGVyO0Mub25sb2FkPSgpPT55KEMucmVzdWx0KTtDLm9uZXJyb3I9KCk9PngoQy5lcnJvcik7Qy5yZWFkQXNBcnJheUJ1ZmZlcih2KX0pOmcodCksQSkudGhlbih5PT5hLmdyYXBoLnV0aWwucnVuQXN5bmNQcm9taXNlVGFzaygiUGFyc2luZyBncmFwaC5wYnR4dCIsNjAsKCk9PmsoeSksQSkpfTtkLnN0cmVhbVBhcnNlPWw7Y29uc3QgcT17ImxpYnJhcnkuZnVuY3Rpb24iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5pbnB1dCI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mIjohMCwKImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5pIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QucyI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwLAoibGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUuaW5wdXRfYXJnIjohMCwibGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUub3V0cHV0X2FyZyI6ITAsImxpYnJhcnkudmVyc2lvbnMiOiEwLG5vZGU6ITAsIm5vZGUuaW5wdXQiOiEwLCJub2RlLmF0dHIiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5iIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5pIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QucyI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwfSwKcj17InN0ZXBfc3RhdHMuZGV2X3N0YXRzIjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cyI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMub3V0cHV0IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5tZW1vcnkiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dC50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltIjohMH07ZC5wYXJzZUdyYXBoUGJUeHQ9aztkLnBhcnNlU3RhdHNQYlR4dD1tfSkoYy5wYXJzZXJ8fChjLnBhcnNlcj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1jb21tb24vcHJvdG8uanMKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1jb21tb24vcmVuZGVyLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoTixULFksYWEsaGEpe1Q9bmV3IEcoVCxZLGFhLGhhLCEwKTtOLmluQW5ub3RhdGlvbnMucHVzaChUKX1mdW5jdGlvbiBnKE4sVCxZLGFhLGhhKXtUPW5ldyBHKFQsWSxhYSxoYSwhMSk7Ti5vdXRBbm5vdGF0aW9ucy5wdXNoKFQpfWZ1bmN0aW9uIGwoTixUKXtfLmVhY2goTi5ub2RlcygpLFk9PntZPU4ubm9kZShZKTtZLmV4cGFuZGVkPTE8VDtpZigwPFQpc3dpdGNoKFkubm9kZS50eXBlKXtjYXNlIGMuTm9kZVR5cGUuTUVUQTpjYXNlIGMuTm9kZVR5cGUuU0VSSUVTOmsoWSxULTEpfX0pfWZ1bmN0aW9uIGsoTixUKXtOLmNvcmVHcmFwaCYmbChOLmNvcmVHcmFwaCxUKX1mdW5jdGlvbiBtKE4sVCxZKXtsZXQgYWE9Ti5ub2RlKFQpLGhhPU4ubm9kZShZKSxYPU4uZWRnZShULFkpO2lmKGFhLm5vZGUuaW5jbHVkZSE9PWMuSW5jbHVzaW9uVHlwZS5JTkNMVURFJiZoYS5ub2RlLmluY2x1ZGUhPT1jLkluY2x1c2lvblR5cGUuSU5DTFVERXx8CmFhLm5vZGUuaW5jbHVkZT09PWMuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxoYS5ub2RlLmluY2x1ZGU9PT1jLkluY2x1c2lvblR5cGUuRVhDTFVERSlnKGFhLGhhLm5vZGUsaGEsWCxLLlNIT1JUQ1VUKSxmKGhhLGFhLm5vZGUsYWEsWCxLLlNIT1JUQ1VUKSxOLnJlbW92ZUVkZ2UoVCxZKX1mdW5jdGlvbiBwKE4sVCxZKXtsZXQgYWE9Ti5jb3JlR3JhcGgsaGE9YWEubm9kZShUKTtoYS5pc091dEV4dHJhY3Q9ITA7Xy5lYWNoKGFhLnByZWRlY2Vzc29ycyhUKSxYPT57bShhYSxYLFQpfSk7KEYuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxZKSYmXy5lYWNoKGFhLnN1Y2Nlc3NvcnMoVCksWD0+e20oYWEsVCxYKX0pOzA9PT1hYS5uZWlnaGJvcnMoVCkubGVuZ3RoJiYoaGEubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLE4uaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goaGEpLGFhLnJlbW92ZU5vZGUoVCkpfWZ1bmN0aW9uIHEoTixULFkpe2xldCBhYT1OLmNvcmVHcmFwaCwKaGE9YWEubm9kZShUKTtoYS5pc0luRXh0cmFjdD0hMDtfLmVhY2goYWEuc3VjY2Vzc29ycyhUKSxYPT57bShhYSxULFgpfSk7KEYuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxZKSYmXy5lYWNoKGFhLnByZWRlY2Vzc29ycyhUKSxYPT57bShhYSxYLFQpfSk7MD09PWFhLm5laWdoYm9ycyhUKS5sZW5ndGgmJihoYS5ub2RlLmluY2x1ZGU9Yy5JbmNsdXNpb25UeXBlLkVYQ0xVREUsTi5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGhhKSxhYS5yZW1vdmVOb2RlKFQpKX1mdW5jdGlvbiByKE4sVCl7aWYoTi50eXBlPT09Yy5Ob2RlVHlwZS5PUClmb3IodmFyIFk9MDtZPFQubGVuZ3RoO1krKyl7aWYoTi5vcD09PVRbWV0pcmV0dXJuITB9ZWxzZSBpZihOLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEEmJihOPU4uZ2V0Um9vdE9wKCkpKWZvcihZPTA7WTxULmxlbmd0aDtZKyspaWYoTi5vcD09PVRbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdChOKXtsZXQgVD1OLmNvcmVHcmFwaDtfLmVhY2goVC5ub2RlcygpLApZPT57VC5ub2RlKFkpLm5vZGUuaW5jbHVkZSE9PWMuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxZLnN0YXJ0c1dpdGgoYS5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8KE4uY29yZUdyYXBoLm91dEVkZ2VzKFkpLmxlbmd0aD5OLmNvcmVHcmFwaC5pbkVkZ2VzKFkpLmxlbmd0aD9wKE4sWSwhMCk6cShOLFksITApKX0pfWZ1bmN0aW9uIHYoTil7bGV0IFQ9Ti5jb3JlR3JhcGg7Xy5lYWNoKFQubm9kZXMoKSxZPT57bGV0IGFhPVQubm9kZShZKTthYS5ub2RlLmluY2x1ZGU9PT1jLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQmJnIoYWEubm9kZSxGLm91dEV4dHJhY3RUeXBlcykmJnAoTixZKX0pfWZ1bmN0aW9uIEEoTil7bGV0IFQ9Ti5jb3JlR3JhcGg7Xy5lYWNoKFQubm9kZXMoKSxZPT57bGV0IGFhPVQubm9kZShZKTthYS5ub2RlLmluY2x1ZGU9PT1jLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQmJnIoYWEubm9kZSxGLmluRXh0cmFjdFR5cGVzKSYmcShOLFkpfSl9CmZ1bmN0aW9uIHkoTil7bGV0IFQ9Ti5jb3JlR3JhcGgsWT17fSxhYT17fSxoYT0wO18uZWFjaChULm5vZGVzKCksbGE9PntpZihULm5vZGUobGEpLm5vZGUuaW5jbHVkZT09PWMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCl7dmFyIHdhPV8ucmVkdWNlKFQucHJlZGVjZXNzb3JzKGxhKSwoeGEsemEpPT57emE9VC5lZGdlKHphLGxhKS5tZXRhZWRnZTtyZXR1cm4geGErKHphLm51bVJlZ3VsYXJFZGdlcz8xOjApfSwwKTswPT09d2EmJjA8VC5wcmVkZWNlc3NvcnMobGEpLmxlbmd0aCYmKHdhPVQucHJlZGVjZXNzb3JzKGxhKS5sZW5ndGgpO3ZhciBDYT1fLnJlZHVjZShULnN1Y2Nlc3NvcnMobGEpLCh4YSx6YSk9Pnt6YT1ULmVkZ2UobGEsemEpLm1ldGFlZGdlO3JldHVybiB4YSsoemEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1DYSYmMDxULnN1Y2Nlc3NvcnMobGEpLmxlbmd0aCYmKENhPVQuc3VjY2Vzc29ycyhsYSkubGVuZ3RoKTtZW2xhXT13YTthYVtsYV09Q2E7aGErK319KTsKaWYoIShoYTxGLm1pbk5vZGVDb3VudEZvckV4dHJhY3Rpb24pKXt2YXIgWD1GLm1pbkRlZ3JlZUZvckV4dHJhY3Rpb24tMSxjYT1NYXRoLnJvdW5kKC43NSpoYSksZWE9TWF0aC5yb3VuZCguMjUqaGEpLGthPU9iamVjdC5rZXlzKFkpLnNvcnQoKGxhLHdhKT0+WVtsYV0tWVt3YV0pLGJhPVlba2FbY2FdXTtiYT1iYStiYS1ZW2thW2VhXV07YmE9TWF0aC5tYXgoYmEsWCk7Zm9yKGxldCBsYT1oYS0xO1lba2FbbGFdXT5iYTtsYS0tKXEoTixrYVtsYV0pO2thPU9iamVjdC5rZXlzKGFhKS5zb3J0KChsYSx3YSk9PmFhW2xhXS1hYVt3YV0pO2NhPWFhW2thW2NhXV07ZWE9Y2ErNCooY2EtYWFba2FbZWFdXSk7ZWE9TWF0aC5tYXgoZWEsWCk7Zm9yKFg9aGEtMTthYVtrYVtYXV0+ZWE7WC0tKShjYT1ULm5vZGUoa2FbWF0pKSYmIWNhLmlzSW5FeHRyYWN0JiZwKE4sa2FbWF0pfX1mdW5jdGlvbiB4KE4pe2xldCBUPU4uY29yZUdyYXBoLFk9e307Xy5lYWNoKFQuZWRnZXMoKSxhYT0+e1QuZWRnZShhYSkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwKKChZW2FhLnZdPVlbYWEudl18fFtdKS5wdXNoKGFhKSwoWVthYS53XT1ZW2FhLnddfHxbXSkucHVzaChhYSkpfSk7Xy5lYWNoKFksYWE9PnthYS5sZW5ndGg+Ri5tYXhDb250cm9sRGVncmVlJiZfLmVhY2goYWEsaGE9Pm0oVCxoYS52LGhhLncpKX0pfWZ1bmN0aW9uIEMoTil7dChOKTtGLm91dEV4dHJhY3RUeXBlcyYmdihOKTtGLmluRXh0cmFjdFR5cGVzJiZBKE4pO3koTik7Ri5tYXhDb250cm9sRGVncmVlJiZ4KE4pO2xldCBUPU4uY29yZUdyYXBoO18uZWFjaChULm5vZGVzKCksWT0+e2xldCBhYT1ULm5vZGUoWSk7dmFyIGhhPVQubmVpZ2hib3JzKFkpLmxlbmd0aDtpZihhYS5ub2RlLmluY2x1ZGU9PT1jLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQmJjA9PT1oYSl7aGE9MDxhYS5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aDtsZXQgWD0wPGFhLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7YWEuaXNJbkV4dHJhY3Q/KE4uaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChhYSksYWEubm9kZS5pbmNsdWRlPQpjLkluY2x1c2lvblR5cGUuRVhDTFVERSxULnJlbW92ZU5vZGUoWSkpOmFhLmlzT3V0RXh0cmFjdD8oTi5pc29sYXRlZE91dEV4dHJhY3QucHVzaChhYSksYWEubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLFQucmVtb3ZlTm9kZShZKSk6Ri5leHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZSYmKGhhJiYhWD8oYWEuaXNJbkV4dHJhY3Q9ITAsTi5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGFhKSxhYS5ub2RlLmluY2x1ZGU9Yy5JbmNsdXNpb25UeXBlLkVYQ0xVREUsVC5yZW1vdmVOb2RlKFkpKTpYJiYhaGEmJihhYS5pc091dEV4dHJhY3Q9ITAsTi5pc29sYXRlZE91dEV4dHJhY3QucHVzaChhYSksYWEubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLFQucmVtb3ZlTm9kZShZKSkpfX0pfWQuT3BOb2RlQ29sb3JzPXtERUZBVUxUX0ZJTEw6IiNmZmZmZmYiLERFRkFVTFRfU1RST0tFOiIjYjJiMmIyIixDT01QQVRJQkxFOiIjMGY5ZDU4IiwKSU5DT01QQVRJQkxFOiIjZGI0NDM3In07ZC5NZXRhbm9kZUNvbG9ycz17REVGQVVMVF9GSUxMOiIjZDlkOWQ5IixERUZBVUxUX1NUUk9LRToiI2E2YTZhNiIsU0FUVVJBVElPTjouNixMSUdIVE5FU1M6Ljg1LEVYUEFOREVEX0NPTE9SOiIjZjBmMGYwIixIVUVTOlsyMjAsMTAwLDE4MCw0MCwyMCwzNDAsMjYwLDMwMCwxNDAsNjBdLFNUUlVDVFVSRV9QQUxFVFRFKE4sVCl7dmFyIFk9ZC5NZXRhbm9kZUNvbG9ycy5IVUVTO049WVtOJVkubGVuZ3RoXTtZPU1hdGguc2luKE4qTWF0aC5QSS8zNjApO3JldHVybiBkMy5oc2woTiwuMDEqKFQ/MzA6OTAtNjAqWSksLjAxKihUPzk1OjgwKSkudG9TdHJpbmcoKX0sREVWSUNFX1BBTEVUVEUoTil7cmV0dXJuIGQuTWV0YW5vZGVDb2xvcnMuU1RSVUNUVVJFX1BBTEVUVEUoTil9LFhMQV9DTFVTVEVSX1BBTEVUVEUoTil7cmV0dXJuIGQuTWV0YW5vZGVDb2xvcnMuU1RSVUNUVVJFX1BBTEVUVEUoTil9LFVOS05PV046IiNlZWUiLEdSQURJRU5UX09VVExJTkU6IiM4ODgifTsKZC5TZXJpZXNOb2RlQ29sb3JzPXtERUZBVUxUX0ZJTEw6IndoaXRlIixERUZBVUxUX1NUUk9LRToiI2IyYjJiMiJ9O2NvbnN0IEY9e2VuYWJsZUV4dHJhY3Rpb246ITAsbWluTm9kZUNvdW50Rm9yRXh0cmFjdGlvbjoxNSxtaW5EZWdyZWVGb3JFeHRyYWN0aW9uOjUsbWF4Q29udHJvbERlZ3JlZTo0LG1heEJyaWRnZVBhdGhEZWdyZWU6NCxvdXRFeHRyYWN0VHlwZXM6WyJOb09wIl0saW5FeHRyYWN0VHlwZXM6W10sZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlOiEwLGV4dHJhY3RJc29sYXRlZE5vZGVzV2l0aEFubm90YXRpb25zT25PbmVTaWRlOiEwLGVuYWJsZUJyaWRnZWdyYXBoOiEwLG1pbk1heENvbG9yczpbIiNmZmY1ZjAiLCIjZmI2YTRhIl0sbWF4QW5ub3RhdGlvbnM6NX0sRD1uZXcgUmVnRXhwKCJeKD86IithLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgrIik/KFxcdyspX1thLXowLTldezh9KD86X1xcZCspPyQiKTtjbGFzcyBCe2NvbnN0cnVjdG9yKE4sClQpe3RoaXMuaGllcmFyY2h5PU47dGhpcy5kaXNwbGF5aW5nU3RhdHM9VDt0aGlzLmluZGV4PXt9O3RoaXMucmVuZGVyZWRPcE5hbWVzPVtdO3RoaXMuY29tcHV0ZVNjYWxlcygpO3RoaXMuaGFzU3ViaGllcmFyY2h5PXt9O3RoaXMucm9vdD1uZXcgUyhOLnJvb3QsTi5ncmFwaE9wdGlvbnMpO3RoaXMuaW5kZXhbTi5yb290Lm5hbWVdPXRoaXMucm9vdDt0aGlzLnJlbmRlcmVkT3BOYW1lcy5wdXNoKE4ucm9vdC5uYW1lKTt0aGlzLmJ1aWxkU3ViaGllcmFyY2h5KE4ucm9vdC5uYW1lKTt0aGlzLnJvb3QuZXhwYW5kZWQ9ITA7dGhpcy50cmFjZUlucHV0cz0hMX1jb21wdXRlU2NhbGVzKCl7dGhpcy5kZXZpY2VDb2xvck1hcD1kMy5zY2FsZU9yZGluYWwoKS5kb21haW4odGhpcy5oaWVyYXJjaHkuZGV2aWNlcykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkuZGV2aWNlcy5sZW5ndGgpLGQuTWV0YW5vZGVDb2xvcnMuREVWSUNFX1BBTEVUVEUpKTt0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcD0KZDMuc2NhbGVPcmRpbmFsKCkuZG9tYWluKHRoaXMuaGllcmFyY2h5LnhsYUNsdXN0ZXJzKS5yYW5nZShfLm1hcChkMy5yYW5nZSh0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycy5sZW5ndGgpLGQuTWV0YW5vZGVDb2xvcnMuWExBX0NMVVNURVJfUEFMRVRURSkpO2xldCBOPXRoaXMuaGllcmFyY2h5LnJvb3QubWV0YWdyYXBoO3ZhciBUPWQzLm1heChOLm5vZGVzKCksWT0+e1k9Ti5ub2RlKFkpO2lmKG51bGwhPVkuc3RhdHMpcmV0dXJuIFkuc3RhdHMudG90YWxCeXRlc30pO3RoaXMubWVtb3J5VXNhZ2VTY2FsZT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCxUXSkucmFuZ2UoRi5taW5NYXhDb2xvcnMpO1Q9ZDMubWF4KE4ubm9kZXMoKSxZPT57WT1OLm5vZGUoWSk7aWYobnVsbCE9WS5zdGF0cylyZXR1cm4gWS5zdGF0cy5nZXRUb3RhbE1pY3JvcygpfSk7dGhpcy5jb21wdXRlVGltZVNjYWxlPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLFRdKS5yYW5nZShGLm1pbk1heENvbG9ycyk7CnRoaXMuZWRnZVdpZHRoU2l6ZWRCYXNlZFNjYWxlPXRoaXMuaGllcmFyY2h5Lmhhc1NoYXBlSW5mbz9jLnNjZW5lLmVkZ2UuRURHRV9XSURUSF9TSVpFX0JBU0VEX1NDQUxFOmQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFsxLHRoaXMuaGllcmFyY2h5Lm1heE1ldGFFZGdlU2l6ZV0pLnJhbmdlKFtjLnNjZW5lLmVkZ2UuTUlOX0VER0VfV0lEVEgsYy5zY2VuZS5lZGdlLk1BWF9FREdFX1dJRFRIXSl9Z2V0UmVuZGVyTm9kZUJ5TmFtZShOKXtyZXR1cm4gdGhpcy5pbmRleFtOXX1nZXROb2RlQnlOYW1lKE4pe3JldHVybiB0aGlzLmhpZXJhcmNoeS5ub2RlKE4pfWNvbG9ySGlzdG9ncmFtKE4sVCl7aWYoMDxPYmplY3Qua2V5cyhOKS5sZW5ndGgpe2NvbnN0IFk9Xy5zdW0oT2JqZWN0LmtleXMoTikubWFwKGFhPT5OW2FhXSkpO3JldHVybiBPYmplY3Qua2V5cyhOKS5tYXAoYWE9Pih7Y29sb3I6VChhYSkscHJvcG9ydGlvbjpOW2FhXS9ZfSkpfWNvbnNvbGUuaW5mbygibm8gcGFpcnMgZm91bmQhIik7CnJldHVybiBudWxsfWdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShOKXtpZighTilyZXR1cm4gbnVsbDtpZihOIGluIHRoaXMuaW5kZXgpcmV0dXJuIHRoaXMuaW5kZXhbTl07dmFyIFQ9dGhpcy5oaWVyYXJjaHkubm9kZShOKTtpZighVClyZXR1cm4gbnVsbDtsZXQgWT1ULmlzR3JvdXBOb2RlP25ldyBTKFQsdGhpcy5oaWVyYXJjaHkuZ3JhcGhPcHRpb25zKTpuZXcgSihUKTt0aGlzLmluZGV4W05dPVk7dGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaChOKTtULnN0YXRzJiYoWS5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoVC5zdGF0cy50b3RhbEJ5dGVzKSxZLmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKFQuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpO1kuaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIWEuZ3JhcGgudXRpbC5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhULnN0YXRzKTt2YXIgYWE9bnVsbCxoYT1udWxsLFg9bnVsbDsKaWYoVC5pc0dyb3VwTm9kZSl7YWE9VC5kZXZpY2VIaXN0b2dyYW07aGE9VC54bGFDbHVzdGVySGlzdG9ncmFtO3ZhciBjYT1ULmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtUPVQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7aWYoMCE9Y2F8fDAhPVQpWD1jYS8oY2ErVCl9ZWxzZShjYT1ZLm5vZGUuZGV2aWNlKSYmKGFhPXtbY2FdOjF9KSwoY2E9WS5ub2RlLnhsYUNsdXN0ZXIpJiYoaGE9e1tjYV06MX0pLFkubm9kZS50eXBlPT09Yy5Ob2RlVHlwZS5PUCYmKFg9WS5ub2RlLmNvbXBhdGlibGU/MTowKTthYSYmKFkuZGV2aWNlQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0oYWEsdGhpcy5kZXZpY2VDb2xvck1hcCkpO2hhJiYoWS54bGFDbHVzdGVyQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0oaGEsdGhpcy54bGFDbHVzdGVyQ29sb3JNYXApKTtudWxsIT1YJiYoWS5jb21wYXRpYmlsaXR5Q29sb3JzPVt7Y29sb3I6YS5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEUsCnByb3BvcnRpb246WH0se2NvbG9yOmEuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5JTkNPTVBBVElCTEUscHJvcG9ydGlvbjoxLVh9XSk7cmV0dXJuIHRoaXMuaW5kZXhbTl19Z2V0TmVhcmVzdFZpc2libGVBbmNlc3RvcihOKXt2YXIgVD1jLmdldEhpZXJhcmNoaWNhbFBhdGgoTik7bGV0IFk9MCxhYT1udWxsO2Zvcig7WTxULmxlbmd0aCYmKE49VFtZXSxhYT10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTiksYWEuZXhwYW5kZWQpO1krKyk7cmV0dXJuIFk9PVQubGVuZ3RoLTImJihUPVRbWSsxXSxhYS5pbkFubm90YXRpb25zLm5vZGVOYW1lc1tUXXx8YWEub3V0QW5ub3RhdGlvbnMubm9kZU5hbWVzW1RdKT9UOk59c2V0RGVwdGgoTil7ayh0aGlzLnJvb3QsK04pfWlzTm9kZUF1eGlsaWFyeShOKXtsZXQgVD10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTi5ub2RlLnBhcmVudE5vZGUubmFtZSksWT1fLmZpbmQoVC5pc29sYXRlZEluRXh0cmFjdCxhYT0+YWEubm9kZS5uYW1lPT09Ti5ub2RlLm5hbWUpOwppZihZKXJldHVybiEwO1k9Xy5maW5kKFQuaXNvbGF0ZWRPdXRFeHRyYWN0LGFhPT5hYS5ub2RlLm5hbWU9PT1OLm5vZGUubmFtZSk7cmV0dXJuISFZfWdldE5hbWVzT2ZSZW5kZXJlZE9wcygpe3JldHVybiB0aGlzLnJlbmRlcmVkT3BOYW1lc31jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKE4sVCxZLGFhKXt2YXIgaGE9WS5uYW1lLnJlcGxhY2UoVCxhYSk7bGV0IFg9Ti5tZXRhZ3JhcGgubm9kZShoYSk7aWYoWClyZXR1cm4gWDtYPW5ldyBjLk9wTm9kZUltcGwoe25hbWU6aGEsaW5wdXQ6W10sZGV2aWNlOlkuZGV2aWNlLG9wOlkub3AsYXR0cjpfLmNsb25lRGVlcChZLmF0dHIpfSk7WC5jYXJkaW5hbGl0eT1ZLmNhcmRpbmFsaXR5O1guaW5jbHVkZT1ZLmluY2x1ZGU7WC5vdXRwdXRTaGFwZXM9Xy5jbG9uZURlZXAoWS5vdXRwdXRTaGFwZXMpO1gueGxhQ2x1c3Rlcj1ZLnhsYUNsdXN0ZXI7WC5mdW5jdGlvbklucHV0SW5kZXg9WS5mdW5jdGlvbklucHV0SW5kZXg7WC5mdW5jdGlvbk91dHB1dEluZGV4PQpZLmZ1bmN0aW9uT3V0cHV0SW5kZXg7WC5pbnB1dHM9WS5pbnB1dHMubWFwKGNhPT57Y29uc3QgZWE9Xy5jbG9uZShjYSk7ZWEubmFtZT1jYS5uYW1lLnJlcGxhY2UoVCxhYSk7cmV0dXJuIGVhfSk7WC5wYXJlbnROb2RlPU47Ti5tZXRhZ3JhcGguc2V0Tm9kZShYLm5hbWUsWCk7dGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShYLm5hbWUsWCk7aGE9Y2E9PnRoaXMuY2xvbmVBbmRBZGRGdW5jdGlvbk9wTm9kZShOLFQsY2EsYWEpO1guaW5FbWJlZGRpbmdzPVkuaW5FbWJlZGRpbmdzLm1hcChoYSk7WC5vdXRFbWJlZGRpbmdzPVkub3V0RW1iZWRkaW5ncy5tYXAoaGEpO3JldHVybiBYfWNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUoTixULFksYWEsaGEpe2NvbnN0IFg9e307Tj10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTixULFksYWEsaGEsWCk7Xy5pc0VtcHR5KFgpfHx0aGlzLnBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKFQsWCk7cmV0dXJuIE59Y2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihOLApULFksYWEsaGEsWCl7Y29uc3QgY2E9YS5ncmFwaC5jcmVhdGVNZXRhbm9kZShZLm5hbWUucmVwbGFjZShhYSxoYSkpO2NhLmRlcHRoPVkuZGVwdGg7Y2EuY2FyZGluYWxpdHk9WS5jYXJkaW5hbGl0eTtjYS50ZW1wbGF0ZUlkPVkudGVtcGxhdGVJZDtjYS5vcEhpc3RvZ3JhbT1fLmNsb25lKFkub3BIaXN0b2dyYW0pO2NhLmRldmljZUhpc3RvZ3JhbT1fLmNsb25lKFkuZGV2aWNlSGlzdG9ncmFtKTtjYS54bGFDbHVzdGVySGlzdG9ncmFtPV8uY2xvbmUoWS54bGFDbHVzdGVySGlzdG9ncmFtKTtjYS5oYXNOb25Db250cm9sRWRnZXM9WS5oYXNOb25Db250cm9sRWRnZXM7Y2EuaW5jbHVkZT1ZLmluY2x1ZGU7Y2Eubm9kZUF0dHJpYnV0ZXM9Xy5jbG9uZShZLm5vZGVBdHRyaWJ1dGVzKTtjYS5hc3NvY2lhdGVkRnVuY3Rpb249WS5hc3NvY2lhdGVkRnVuY3Rpb247Xy5lYWNoKFkubWV0YWdyYXBoLm5vZGVzKCksZWE9PntlYT1ZLm1ldGFncmFwaC5ub2RlKGVhKTtzd2l0Y2goZWEudHlwZSl7Y2FzZSBjLk5vZGVUeXBlLk1FVEE6ZWE9CnRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihOLFQsZWEsYWEsaGEsWCk7ZWEucGFyZW50Tm9kZT1jYTtjYS5tZXRhZ3JhcGguc2V0Tm9kZShlYS5uYW1lLGVhKTt0aGlzLmhpZXJhcmNoeS5zZXROb2RlKGVhLm5hbWUsZWEpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5PUDplYT10aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoY2EsYWEsZWEsaGEpO18uaXNOdW1iZXIoZWEuZnVuY3Rpb25JbnB1dEluZGV4KSYmdGhpcy5wYXRjaEVkZ2VzSW50b0Z1bmN0aW9uSW5wdXRzKFQsZWEpO18uaXNOdW1iZXIoZWEuZnVuY3Rpb25PdXRwdXRJbmRleCkmJihYW2VhLmZ1bmN0aW9uT3V0cHV0SW5kZXhdPWVhKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybihlYS5uYW1lKyIgaXMgb2RkbHkgbmVpdGhlciBhIG1ldGFub2RlIG5vciBhbiBvcG5vZGUuIil9fSk7dGhpcy5jbG9uZUxpYnJhcnlNZXRhbm9kZUVkZ2VzKFksY2EsYWEsaGEpO3JldHVybiBjYX1jbG9uZUxpYnJhcnlNZXRhbm9kZUVkZ2VzKE4sClQsWSxhYSl7Xy5lYWNoKE4ubWV0YWdyYXBoLmVkZ2VzKCksaGE9PntoYT1OLm1ldGFncmFwaC5lZGdlKGhhKTtjb25zdCBYPWhhLnYucmVwbGFjZShZLGFhKSxjYT1oYS53LnJlcGxhY2UoWSxhYSksZWE9bmV3IGMuTWV0YWVkZ2VJbXBsKFgsY2EpO2VhLmluYm91bmQ9aGEuaW5ib3VuZDtlYS5udW1SZWd1bGFyRWRnZXM9aGEubnVtUmVndWxhckVkZ2VzO2VhLm51bUNvbnRyb2xFZGdlcz1oYS5udW1Db250cm9sRWRnZXM7ZWEubnVtUmVmRWRnZXM9aGEubnVtUmVmRWRnZXM7ZWEudG90YWxTaXplPWhhLnRvdGFsU2l6ZTtoYS5iYXNlRWRnZUxpc3QmJihlYS5iYXNlRWRnZUxpc3Q9aGEuYmFzZUVkZ2VMaXN0Lm1hcChrYT0+e2NvbnN0IGJhPV8uY2xvbmUoa2EpO2JhLnY9a2Eudi5yZXBsYWNlKFksYWEpO2JhLnc9a2Eudy5yZXBsYWNlKFksYWEpO3JldHVybiBiYX0pKTtULm1ldGFncmFwaC5ub2RlKGNhKT9ULm1ldGFncmFwaC5zZXRFZGdlKFgsY2EsZWEpOlQubWV0YWdyYXBoLnNldEVkZ2UoY2EsClgsZWEpfSl9cGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhOLFQpe2xldCBZPU1hdGgubWluKFQuZnVuY3Rpb25JbnB1dEluZGV4LE4uaW5wdXRzLmxlbmd0aC0xKTtmb3IodmFyIGFhPV8uY2xvbmUoTi5pbnB1dHNbWV0pO2FhLmlzQ29udHJvbERlcGVuZGVuY3k7KVkrKyxhYT1OLmlucHV0c1tZXTtULmlucHV0cy5wdXNoKGFhKTthYT10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnMoTi5uYW1lKTtsZXQgaGEsWD0wO18uZWFjaChhYS5yZWd1bGFyLGNhPT57WCs9Y2EubnVtUmVndWxhckVkZ2VzO2lmKFg+WSlyZXR1cm4gaGE9Y2EsITF9KTtfLmVhY2goaGEuYmFzZUVkZ2VMaXN0LGNhPT57Y2Eudz09PU4ubmFtZSYmKGNhLnc9VC5uYW1lKTtjYS52PT09Ti5uYW1lJiYoY2Eudj1ULm5hbWUpfSl9cGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoTixUKXtjb25zdCBZPXRoaXMuaGllcmFyY2h5LmdldFN1Y2Nlc3NvcnMoTi5uYW1lKTtfLmVhY2goWS5yZWd1bGFyLGFhPT4Ke18uZWFjaChhYS5iYXNlRWRnZUxpc3QsaGE9Pntjb25zdCBYPXRoaXMuaGllcmFyY2h5Lm5vZGUoaGEudyk7Xy5lYWNoKFguaW5wdXRzLGNhPT57Y2EubmFtZT09PU4ubmFtZSYmKGNhLm5hbWU9VFtjYS5vdXRwdXRUZW5zb3JLZXldLm5hbWUsY2Eub3V0cHV0VGVuc29yS2V5PWhhLm91dHB1dFRlbnNvcktleSl9KX0pO18uZWFjaChhYS5iYXNlRWRnZUxpc3QsaGE9PntoYS52PVRbaGEub3V0cHV0VGVuc29yS2V5XS5uYW1lO2hhLm91dHB1dFRlbnNvcktleT0iMCJ9KX0pfWJ1aWxkU3ViaGllcmFyY2h5KE4pe2lmKCEoTiBpbiB0aGlzLmhhc1N1YmhpZXJhcmNoeSkpe3RoaXMuaGFzU3ViaGllcmFyY2h5W05dPSEwO3ZhciBUPXRoaXMuaW5kZXhbTl07aWYoVC5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEF8fFQubm9kZS50eXBlPT09Yy5Ob2RlVHlwZS5TRVJJRVMpe3ZhciBZPVQubm9kZS5tZXRhZ3JhcGgsYWE9VC5jb3JlR3JhcGgsaGE9W10sWD1bXTtfLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fAooXy5lYWNoKFkubm9kZXMoKSx6YT0+e2NvbnN0IEZhPVkubm9kZSh6YSksU2E9dGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9uc1tGYS5vcF07U2EmJjAhPT16YS5pbmRleE9mKGEuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCkmJih6YT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUoWSxGYSxTYS5ub2RlLFNhLm5vZGUubmFtZSxGYS5uYW1lKSxoYS5wdXNoKEZhKSxYLnB1c2goemEpKX0pLF8uZWFjaChYLCh6YSxGYSk9PntGYT1oYVtGYV07emEucGFyZW50Tm9kZT1GYS5wYXJlbnROb2RlO1kuc2V0Tm9kZShGYS5uYW1lLHphKTt0aGlzLmhpZXJhcmNoeS5zZXROb2RlKEZhLm5hbWUsemEpfSkpO18uZWFjaChZLm5vZGVzKCksemE9PntsZXQgRmE9dGhpcy5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoemEpLFNhPUZhLm5vZGU7YWEuc2V0Tm9kZSh6YSxGYSk7U2EuaXNHcm91cE5vZGV8fChfLmVhY2goU2EuaW5FbWJlZGRpbmdzLEVhPT57bGV0IEdhPQpuZXcgUChudWxsKSxkYj1uZXcgSihFYSk7ZihGYSxFYSxkYixHYSxLLkNPTlNUQU5UKTt0aGlzLmluZGV4W0VhLm5hbWVdPWRifSksXy5lYWNoKFNhLm91dEVtYmVkZGluZ3MsRWE9PntsZXQgR2E9bmV3IFAobnVsbCksZGI9bmV3IEooRWEpO2coRmEsRWEsZGIsR2EsSy5TVU1NQVJZKTt0aGlzLmluZGV4W0VhLm5hbWVdPWRifSkpfSk7Xy5lYWNoKFkuZWRnZXMoKSx6YT0+e3ZhciBGYT1ZLmVkZ2UoemEpO0ZhPW5ldyBQKEZhKTtGYS5pc0ZhZGVkT3V0PXRoaXMuaW5kZXhbemEudl0uaXNGYWRlZE91dHx8dGhpcy5pbmRleFt6YS53XS5pc0ZhZGVkT3V0O2FhLnNldEVkZ2UoemEudix6YS53LEZhKX0pO0YuZW5hYmxlRXh0cmFjdGlvbiYmVC5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEEmJkMoVCk7Xy5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpfHx0aGlzLmJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnMoWSk7Tj09PWEuZ3JhcGguUk9PVF9OQU1FJiYKXy5mb3JPd24odGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyx6YT0+e3phPXphLm5vZGU7Y29uc3QgRmE9dGhpcy5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoemEubmFtZSk7VC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5wdXNoKEZhKTtGYS5ub2RlLmluY2x1ZGU9Yy5JbmNsdXNpb25UeXBlLkVYQ0xVREU7YWEucmVtb3ZlTm9kZSh6YS5uYW1lKX0pO3ZhciBjYT1ULm5vZGUucGFyZW50Tm9kZTtpZihjYSl7dmFyIGVhPXRoaXMuaW5kZXhbY2EubmFtZV0sa2E9KHphLC4uLkZhKT0+RmEuY29uY2F0KFt6YT8iSU4iOiJPVVQiXSkuam9pbigifn4iKSxiYT10aGlzLmhpZXJhcmNoeS5nZXRCcmlkZ2VncmFwaChOKSxsYT17fSx3YT17fSxDYT17fTtfLmVhY2goYmEuZWRnZXMoKSx6YT0+e2xldCBGYT0hIVkubm9kZSh6YS53KSxTYT1GYT96YS52OnphLnc7YmEuZWRnZSh6YSkubnVtUmVndWxhckVkZ2VzP0ZhP3dhW1NhXT0od2FbU2FdfHwwKSsxOmxhW1NhXT0obGFbU2FdfHwKMCkrMTpDYVtTYV09KENhW1NhXXx8MCkrMX0pO3ZhciB4YT10aGlzLmhpZXJhcmNoeS5nZXROb2RlTWFwKCk7Xy5lYWNoKGJhLmVkZ2VzKCksemE9Pnt2YXIgRmE9YmEuZWRnZSh6YSk7bGV0IFNhPSEhWS5ub2RlKHphLncpLFtFYSxHYV09U2E/W3phLncsemEudl06W3phLnYsemEud107dmFyIGRiPXRoaXMuaW5kZXhbRWFdLHhiPXRoaXMuaW5kZXhbR2FdLENiPXhiP3hiLm5vZGU6eGFbR2FdLHliPSFGYS5udW1SZWd1bGFyRWRnZXMmJkNhW0dhXT5GLm1heENvbnRyb2xEZWdyZWUsWyx0Yl09U2E/W1QuaW5Bbm5vdGF0aW9ucyxkYi5pbkFubm90YXRpb25zXTpbVC5vdXRBbm5vdGF0aW9ucyxkYi5vdXRBbm5vdGF0aW9uc107bGV0IENjPShTYT93YTpsYSlbR2FdPkYubWF4QnJpZGdlUGF0aERlZ3JlZTt6YT1udWxsO3ZhciBaYj0hMTtGLmVuYWJsZUJyaWRnZWdyYXBoJiYhQ2MmJiF5YiYmZGIuaXNJbkNvcmUoKSYmKFpiPWhkPT5lYS5jb3JlR3JhcGguZWRnZShTYT97djpoZCx3Ok59Ogp7djpOLHc6aGR9KSwoemE9WmIoR2EpKXx8KHphPVpiKGthKFNhLEdhLGNhLm5hbWUpKSksWmI9ISF6YSk7ZGI9ITE7aWYoemEmJiFGYS5udW1SZWd1bGFyRWRnZXMpe2RiPXphO2Zvcih5Yj1lYS5ub2RlO2RiLmFkam9pbmluZ01ldGFlZGdlOylkYj1kYi5hZGpvaW5pbmdNZXRhZWRnZSx5Yj15Yi5wYXJlbnROb2RlO3liPXRoaXMuaGllcmFyY2h5LmdldFRvcG9sb2dpY2FsT3JkZXJpbmcoeWIubmFtZSk7ZGI9ZGIubWV0YWVkZ2U7ZGI9eWJbZGIudl0+eWJbZGIud119WmImJiFkYj8oQ2I9a2EoU2EsTikseGI9a2EoU2EsR2EsTiksdGI9YWEubm9kZSh4YiksdGJ8fChaYj1hYS5ub2RlKENiKSxaYnx8KFpiPW5ldyBKKHtuYW1lOkNiLHR5cGU6Yy5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MCxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOlNhLG5vZGVBdHRyaWJ1dGVzOnt9fSksCnRoaXMuaW5kZXhbQ2JdPVpiLGFhLnNldE5vZGUoQ2IsWmIpKSx0Yj1uZXcgSih7bmFtZTp4Yix0eXBlOmMuTm9kZVR5cGUuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjEscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpjLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDpTYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbeGJdPXRiLGFhLnNldE5vZGUoeGIsdGIpLGFhLnNldFBhcmVudCh4YixDYiksWmIubm9kZS5jYXJkaW5hbGl0eSsrKSxGYT1uZXcgUChGYSksRmEuYWRqb2luaW5nTWV0YWVkZ2U9emEsU2E/YWEuc2V0RWRnZSh4YixFYSxGYSk6YWEuc2V0RWRnZShFYSx4YixGYSkpOnRiLnB1c2gobmV3IEcoQ2IseGIsbmV3IFAoRmEpLEsuU0hPUlRDVVQsU2EpKX0pO18uZWFjaChbITAsITFdLHphPT57bGV0IEZhPWthKHphLE4pLFNhPWFhLm5vZGUoRmEpO1NhJiZfLmVhY2goYWEubm9kZXMoKSxFYT0+e2lmKGFhLm5vZGUoRWEpLm5vZGUudHlwZSE9PQpjLk5vZGVUeXBlLkJSSURHRSYmKHphPyFhYS5wcmVkZWNlc3NvcnMoRWEpLmxlbmd0aDohYWEuc3VjY2Vzc29ycyhFYSkubGVuZ3RoKSl7dmFyIEdhPWthKHphLE4sIlNUUlVDVFVSQUxfVEFSR0VUIiksZGI9YWEubm9kZShHYSk7ZGJ8fChkYj1uZXcgSih7bmFtZTpHYSx0eXBlOmMuTm9kZVR5cGUuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjEscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpjLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDp6YSxub2RlQXR0cmlidXRlczp7fX0pLGRiLnN0cnVjdHVyYWw9ITAsdGhpcy5pbmRleFtHYV09ZGIsYWEuc2V0Tm9kZShHYSxkYiksU2Eubm9kZS5jYXJkaW5hbGl0eSsrLGFhLnNldFBhcmVudChHYSxGYSkpO2RiPW5ldyBQKG51bGwpO2RiLnN0cnVjdHVyYWw9ITA7ZGIud2VpZ2h0LS07emE/YWEuc2V0RWRnZShHYSxFYSxkYik6YWEuc2V0RWRnZShFYSxHYSxkYil9fSl9KX19fX1idWlsZFN1YmhpZXJhcmNoaWVzRm9yTmVlZGVkRnVuY3Rpb25zKE4pe18uZWFjaChOLmVkZ2VzKCksClQ9PntUPU4uZWRnZShUKTtUPW5ldyBQKFQpO18uZm9yRWFjaChULm1ldGFlZGdlLmJhc2VFZGdlTGlzdCxZPT57dmFyIGFhPVkudi5zcGxpdChhLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSk7Zm9yKHZhciBoYT1hYS5sZW5ndGg7MDw9aGE7aGEtLSl7WT1hYS5zbGljZSgwLGhhKTtjb25zdCBYPXRoaXMuaGllcmFyY2h5Lm5vZGUoWS5qb2luKGEuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSk7aWYoWCl7aWYoWC50eXBlPT09Yy5Ob2RlVHlwZS5PUCYmdGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9uc1tYLm9wXSlmb3IoYWE9MTthYTxZLmxlbmd0aDthYSsrKShoYT1ZLnNsaWNlKDAsYWEpLmpvaW4oYS5ncmFwaC5OQU1FU1BBQ0VfREVMSU0pKSYmdGhpcy5idWlsZFN1YmhpZXJhcmNoeShoYSk7YnJlYWt9fX0pfSl9fWQuUmVuZGVyR3JhcGhJbmZvPUI7Y2xhc3MgR3tjb25zdHJ1Y3RvcihOLFQsWSxhYSxoYSl7dGhpcy5ub2RlPU47dGhpcy5yZW5kZXJOb2RlSW5mbz1UO3RoaXMucmVuZGVyTWV0YWVkZ2VJbmZvPQpZO3RoaXMuYW5ub3RhdGlvblR5cGU9YWE7dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmR5PXRoaXMuZHg9MDtZJiZZLm1ldGFlZGdlJiYodGhpcy52PVkubWV0YWVkZ2Uudix0aGlzLnc9WS5tZXRhZWRnZS53KTt0aGlzLmlzSW49aGE7dGhpcy5wb2ludHM9W119fWQuQW5ub3RhdGlvbj1HO2xldCBLOyhmdW5jdGlvbihOKXtOW04uU0hPUlRDVVQ9MF09IlNIT1JUQ1VUIjtOW04uQ09OU1RBTlQ9MV09IkNPTlNUQU5UIjtOW04uU1VNTUFSWT0yXT0iU1VNTUFSWSI7TltOLkVMTElQU0lTPTNdPSJFTExJUFNJUyJ9KShLPWQuQW5ub3RhdGlvblR5cGV8fChkLkFubm90YXRpb25UeXBlPXt9KSk7Y2xhc3MgTHtjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdD1bXTt0aGlzLm5vZGVOYW1lcz17fX1wdXNoKE4pe2lmKCEoTi5ub2RlLm5hbWUgaW4gdGhpcy5ub2RlTmFtZXMpKWlmKHRoaXMubm9kZU5hbWVzW04ubm9kZS5uYW1lXT0hMCx0aGlzLmxpc3QubGVuZ3RoPEYubWF4QW5ub3RhdGlvbnMpdGhpcy5saXN0LnB1c2goTik7CmVsc2V7dmFyIFQ9dGhpcy5saXN0W3RoaXMubGlzdC5sZW5ndGgtMV07VC5hbm5vdGF0aW9uVHlwZT09PUsuRUxMSVBTSVM/KE49VC5ub2RlLE4uc2V0TnVtTW9yZU5vZGVzKCsrTi5udW1Nb3JlTm9kZXMpKTooVD1uZXcgYS5ncmFwaC5FbGxpcHNpc05vZGVJbXBsKDEpLHRoaXMubGlzdC5wdXNoKG5ldyBHKFQsbmV3IEooVCksbnVsbCxLLkVMTElQU0lTLE4uaXNJbikpKX19fWQuQW5ub3RhdGlvbkxpc3Q9TDtjbGFzcyBKe2NvbnN0cnVjdG9yKE4pe3RoaXMubm9kZT1OO3RoaXMuZXhwYW5kZWQ9ITE7dGhpcy5pbkFubm90YXRpb25zPW5ldyBMO3RoaXMub3V0QW5ub3RhdGlvbnM9bmV3IEw7dGhpcy5vdXRib3hXaWR0aD10aGlzLmluYm94V2lkdGg9dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLnk9dGhpcy54PTA7dGhpcy5zdHJ1Y3R1cmFsPXRoaXMuZXhjbHVkZWQ9ITE7dGhpcy5wYWRkaW5nQm90dG9tPXRoaXMucGFkZGluZ1JpZ2h0PXRoaXMucGFkZGluZ0xlZnQ9dGhpcy5wYWRkaW5nVG9wPQp0aGlzLmxhYmVsSGVpZ2h0PXRoaXMucmFkaXVzPXRoaXMubGFiZWxPZmZzZXQ9MDt0aGlzLmlzT3V0RXh0cmFjdD10aGlzLmlzSW5FeHRyYWN0PSExO3RoaXMuY29yZUJveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5pc0ZhZGVkT3V0PSExO3RoaXMuZGlzcGxheU5hbWU9Ti5uYW1lLnN1YnN0cmluZyhOLm5hbWUubGFzdEluZGV4T2YoYS5ncmFwaC5OQU1FU1BBQ0VfREVMSU0pKzEpO04udHlwZT09PWMuTm9kZVR5cGUuTUVUQSYmTi5hc3NvY2lhdGVkRnVuY3Rpb24mJigoTj10aGlzLmRpc3BsYXlOYW1lLm1hdGNoKEQpKT90aGlzLmRpc3BsYXlOYW1lPU5bMV06Xy5zdGFydHNXaXRoKHRoaXMuZGlzcGxheU5hbWUsYS5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHRoaXMuZGlzcGxheU5hbWU9dGhpcy5kaXNwbGF5TmFtZS5zdWJzdHJpbmcoYS5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYLmxlbmd0aCkpKX1pc0luQ29yZSgpe3JldHVybiF0aGlzLmlzSW5FeHRyYWN0JiYKIXRoaXMuaXNPdXRFeHRyYWN0JiYhdGhpcy5pc0xpYnJhcnlGdW5jdGlvbn19ZC5SZW5kZXJOb2RlSW5mbz1KO2NsYXNzIFB7Y29uc3RydWN0b3IoTil7dGhpcy5tZXRhZWRnZT1OO3RoaXMuYWRqb2luaW5nTWV0YWVkZ2U9bnVsbDt0aGlzLnN0cnVjdHVyYWw9ITE7dGhpcy53ZWlnaHQ9MTt0aGlzLmlzRmFkZWRPdXQ9ITF9fWQuUmVuZGVyTWV0YWVkZ2VJbmZvPVA7Y2xhc3MgUyBleHRlbmRzIEp7Y29uc3RydWN0b3IoTixUKXtzdXBlcihOKTtOPU4ubWV0YWdyYXBoLmdyYXBoKCk7VC5jb21wb3VuZD0hMDt0aGlzLmNvcmVHcmFwaD1jLmNyZWF0ZUdyYXBoKE4ubmFtZSxjLkdyYXBoVHlwZS5DT1JFLFQpO3RoaXMuaW5FeHRyYWN0Qm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLm91dEV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMubGlicmFyeUZ1bmN0aW9uc0JveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5pc29sYXRlZEluRXh0cmFjdD1bXTt0aGlzLmlzb2xhdGVkT3V0RXh0cmFjdD0KW107dGhpcy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdD1bXX19ZC5SZW5kZXJHcm91cE5vZGVJbmZvPVM7ZC5tYWtlSW5FeHRyYWN0PXE7ZC5tYXBJbmRleFRvSHVlPWZ1bmN0aW9uKE4pe3JldHVybiAxKzU3OS4yNTYxNjc5NzI1Kk4lMzU4fTtkLmV4cGFuZFVudGlsTm9kZUlzU2hvd249ZnVuY3Rpb24oTixUKXt2YXIgWT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2NlbmUiKTtUPVQuc3BsaXQoIi8iKTt2YXIgYWE9VFtULmxlbmd0aC0xXS5tYXRjaCgvKC4qKTpcdysvKTsyPT09YWEubGVuZ3RoJiYoVFtULmxlbmd0aC0xXT1hYVsxXSk7YWE9VFswXTtsZXQgaGE9Ti5nZXRSZW5kZXJOb2RlQnlOYW1lKGFhKTtmb3IobGV0IFg9MTtYPFQubGVuZ3RoJiZoYS5ub2RlLnR5cGUhPT1hLmdyYXBoLk5vZGVUeXBlLk9QO1grKylOLmJ1aWxkU3ViaGllcmFyY2h5KGFhKSxoYS5leHBhbmRlZD0hMCxZLnNldE5vZGVFeHBhbmRlZChoYSksYWErPSIvIitUW1hdLGhhPU4uZ2V0UmVuZGVyTm9kZUJ5TmFtZShhYSk7CnJldHVybiBoYS5ub2RlLm5hbWV9fSkoYy5yZW5kZXJ8fChjLnJlbmRlcj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1jb21tb24vc2NlbmUuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihyLHQsdixBKXt2YXIgeT1nKHIsdCx2KTtpZigheS5lbXB0eSgpKXJldHVybiB5O3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdCk7aWYodiBpbnN0YW5jZW9mIEFycmF5KWZvcih5PTA7eTx2Lmxlbmd0aDt5KyspdC5jbGFzc0xpc3QuYWRkKHZbeV0pO2Vsc2UgdC5jbGFzc0xpc3QuYWRkKHYpO0E/ci5ub2RlKCkuaW5zZXJ0QmVmb3JlKHQsQSk6ci5ub2RlKCkuYXBwZW5kQ2hpbGQodCk7cmV0dXJuIGQzLnNlbGVjdCh0KS5kYXR1bShyLmRhdHVtKCkpfWZ1bmN0aW9uIGcocix0LHYpe3I9ci5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IEE9MDtBPHIubGVuZ3RoO0ErKyl7bGV0IHk9cltBXTtpZih5LnRhZ05hbWU9PT10KWlmKHYgaW5zdGFuY2VvZiBBcnJheSl7bGV0IHg9ITA7Zm9yKGxldCBDPTA7Qzx2Lmxlbmd0aDtDKyspeD14JiZ5LmNsYXNzTGlzdC5jb250YWlucyh2W0NdKTsKaWYoeClyZXR1cm4gZDMuc2VsZWN0KHkpfWVsc2UgaWYoIXZ8fHkuY2xhc3NMaXN0LmNvbnRhaW5zKHYpKXJldHVybiBkMy5zZWxlY3QoeSl9cmV0dXJuIGQzLnNlbGVjdChudWxsKX1mdW5jdGlvbiBsKHIsdCl7bGV0IHY9dC5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz8wOmMubGF5b3V0LlBBUkFNUy5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O2soZyhyLCJnIixkLkNsYXNzLlNjZW5lLkNPUkUpLDAsdik7dmFyIEE9MDx0Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCx5PTA8dC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoO2xldCB4PTA8dC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgsQz1jLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxGPTA7QSYmKEYrPXQub3V0RXh0cmFjdEJveC53aWR0aCk7eSYmKEYrPXQub3V0RXh0cmFjdEJveC53aWR0aCk7QSYmKEE9dC5jb3JlQm94LndpZHRoLEE9RjxjLmxheW91dC5NSU5fQVVYX1dJRFRIPwpBLWMubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdC5pbkV4dHJhY3RCb3gud2lkdGgvMjpBLXQuaW5FeHRyYWN0Qm94LndpZHRoLzItdC5vdXRFeHRyYWN0Qm94LndpZHRoLSh5P0M6MCksQT1BLXQubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0oeD9DOjApLGsoZyhyLCJnIixkLkNsYXNzLlNjZW5lLklORVhUUkFDVCksQSx2KSk7eSYmKHk9dC5jb3JlQm94LndpZHRoLHk9RjxjLmxheW91dC5NSU5fQVVYX1dJRFRIP3ktYy5sYXlvdXQuTUlOX0FVWF9XSURUSCt0Lm91dEV4dHJhY3RCb3gud2lkdGgvMjp5LXQub3V0RXh0cmFjdEJveC53aWR0aC8yLHk9eS10LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHg/QzowKSxrKGcociwiZyIsZC5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKSx5LHYpKTt4JiYodD10LmNvcmVCb3gud2lkdGgtdC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLzIsayhnKHIsImciLGQuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksdCx2KSl9ZnVuY3Rpb24gayhyLAp0LHYpe251bGwhPXIuYXR0cigidHJhbnNmb3JtIikmJihyPXIudHJhbnNpdGlvbigicG9zaXRpb24iKSk7ci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0KyIsIit2KyIpIil9ZnVuY3Rpb24gbShyLHQpe3JldHVybiB0P3IudG9GaXhlZCgwKToxPD1NYXRoLmFicyhyKT9yLnRvRml4ZWQoMSk6ci50b0V4cG9uZW50aWFsKDEpfWZ1bmN0aW9uIHAocix0LHYsQSl7bGV0IHk9IkRldmljZTogIityLmRldmljZV9uYW1lKyJcbiI7eSs9ImR0eXBlOiAiK3IuZHR5cGUrIlxuIjtsZXQgeD0iKHNjYWxhcikiOzA8ci5zaGFwZS5sZW5ndGgmJih4PSIoIityLnNoYXBlLmpvaW4oIiwiKSsiKSIpO3k9eSsoIlxuc2hhcGU6ICIreCsiXG5cbiIpKygiIyhlbGVtZW50cyk6ICIrdCsiXG4iKTtyPVtdO2Zvcih0PTA7dDx2Lmxlbmd0aDt0KyspMDx2W3RdJiZyLnB1c2goIiMoIitkLmhlYWx0aFBpbGxFbnRyaWVzW3RdLmxhYmVsKyIpOiAiK3ZbdF0pO3krPXIuam9pbigiLCAiKSsiXG5cbiI7CkEubWF4Pj1BLm1pbiYmKHkrPSJtaW46ICIrQS5taW4rIiwgbWF4OiAiK0EubWF4KyJcbiIseSs9Im1lYW46ICIrQS5tZWFuKyIsIHN0ZGRldjogIitBLnN0ZGRldik7cmV0dXJuIHl9ZnVuY3Rpb24gcShyLHQsdixBLHk9NjAseD0xMCxDPTAsRil7ZDMuc2VsZWN0KHIucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKTtpZih0KXt2YXIgRD10LnZhbHVlLEI9RC5zbGljZSgyLDgpLEc9QlswXSxLPUJbMV0sTD1CWzVdLEo9RFsxXSxQPXttaW46RFs4XSxtYXg6RFs5XSxtZWFuOkRbMTBdLHN0ZGRldjpNYXRoLnNxcnQoRFsxMV0pfTtudWxsPT15JiYoeT02MCk7bnVsbD09eCYmKHg9MTApO251bGw9PUMmJihDPTApO251bGwhPXYmJnYubm9kZS50eXBlPT09YS5ncmFwaC5Ob2RlVHlwZS5PUCYmKHkvPTIseC89Mik7RD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJnIik7RC5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpOwp2YXIgUz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJkZWZzIik7RC5hcHBlbmRDaGlsZChTKTt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJsaW5lYXJHcmFkaWVudCIpO0E9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIrQTtOLnNldEF0dHJpYnV0ZSgiaWQiLEEpO3ZhciBUPTAsWT0iMCUiO2ZvcihsZXQgaGE9MDtoYTxCLmxlbmd0aDtoYSsrKWlmKEJbaGFdKXtUKz1CW2hhXTt2YXIgYWE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQuU1ZHX05BTUVTUEFDRSwic3RvcCIpO2FhLnNldEF0dHJpYnV0ZSgib2Zmc2V0IixZKTthYS5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGQuaGVhbHRoUGlsbEVudHJpZXNbaGFdLmJhY2tncm91bmRfY29sb3IpO04uYXBwZW5kQ2hpbGQoYWEpO1k9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQuU1ZHX05BTUVTUEFDRSwic3RvcCIpO2FhPTEwMCpUL0orIiUiO1kuc2V0QXR0cmlidXRlKCJvZmZzZXQiLAphYSk7WS5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGQuaGVhbHRoUGlsbEVudHJpZXNbaGFdLmJhY2tncm91bmRfY29sb3IpO04uYXBwZW5kQ2hpbGQoWSk7WT1hYX1TLmFwcGVuZENoaWxkKE4pO1M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQuU1ZHX05BTUVTUEFDRSwicmVjdCIpO1Muc2V0QXR0cmlidXRlKCJmaWxsIiwidXJsKCMiK0ErIikiKTtTLnNldEF0dHJpYnV0ZSgid2lkdGgiLFN0cmluZyh5KSk7Uy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKHgpKTtTLnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMpKTtELmFwcGVuZENoaWxkKFMpO1M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQuU1ZHX05BTUVTUEFDRSwidGl0bGUiKTtTLnRleHRDb250ZW50PXAodCxKLEIsUCk7RC5hcHBlbmRDaGlsZChTKTt0PSExO2lmKG51bGwhPXYmJihTPXYueC15LzIseD12LnkteC12LmhlaWdodC8yLTIsMD52LmxhYmVsT2Zmc2V0JiYoeCs9di5sYWJlbE9mZnNldCksRC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsCiJ0cmFuc2xhdGUoIitTKyIsICIreCsiKSIpLChCWzJdfHxCWzNdfHxCWzRdKSYmKHY9di5ub2RlLmF0dHIpJiZ2Lmxlbmd0aCkpZm9yKEI9MDtCPHYubGVuZ3RoO0IrKylpZigiVCI9PT12W0JdLmtleSl7dD0odj12W0JdLnZhbHVlLnR5cGUpJiYvXkRUXyhCT09MfElOVHxVSU5UKS8udGVzdCh2KTticmVha312PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkLlNWR19OQU1FU1BBQ0UsInRleHQiKTtpZihOdW1iZXIuaXNGaW5pdGUoUC5taW4pJiZOdW1iZXIuaXNGaW5pdGUoUC5tYXgpKXtpZihCPW0oUC5taW4sdCksUD1tKFAubWF4LHQpLHYudGV4dENvbnRlbnQ9MTxKP0IrIiB+ICIrUDpCLDA8R3x8MDxLfHwwPEwpdi50ZXh0Q29udGVudCs9IiAoIixKPVtdLDA8RyYmSi5wdXNoKGBOYU5cdTAwZDcke0d9YCksMDxLJiZKLnB1c2goYC1cdTIyMWVcdTAwZDcke0t9YCksMDxMJiZKLnB1c2goYCtcdTIyMWVcdTAwZDcke0x9YCksdi50ZXh0Q29udGVudCs9Si5qb2luKCI7ICIpKyIpIn1lbHNlIHYudGV4dENvbnRlbnQ9CiIoTm8gZmluaXRlIGVsZW1lbnRzKSI7di5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbC1zdGF0cyIpO251bGw9PUYmJihGPXkvMik7di5zZXRBdHRyaWJ1dGUoIngiLFN0cmluZyhGKSk7di5zZXRBdHRyaWJ1dGUoInkiLFN0cmluZyhDLTIpKTtELmFwcGVuZENoaWxkKHYpO1BvbHltZXIuZG9tKHIucGFyZW50Tm9kZSkuYXBwZW5kQ2hpbGQoRCl9fWQuU1ZHX05BTUVTUEFDRT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2QuQ2xhc3M9e05vZGU6e0NPTlRBSU5FUjoibm9kZXMiLEdST1VQOiJub2RlIixTSEFQRToibm9kZXNoYXBlIixDT0xPUl9UQVJHRVQ6Im5vZGVjb2xvcnRhcmdldCIsTEFCRUw6Im5vZGVsYWJlbCIsQlVUVE9OX0NPTlRBSU5FUjoiYnV0dG9uY29udGFpbmVyIixCVVRUT05fQ0lSQ0xFOiJidXR0b25jaXJjbGUiLEVYUEFORF9CVVRUT046ImV4cGFuZGJ1dHRvbiIsQ09MTEFQU0VfQlVUVE9OOiJjb2xsYXBzZWJ1dHRvbiJ9LEVkZ2U6e0NPTlRBSU5FUjoiZWRnZXMiLApHUk9VUDoiZWRnZSIsTElORToiZWRnZWxpbmUiLFJFRkVSRU5DRV9FREdFOiJyZWZlcmVuY2VlZGdlIixSRUZfTElORToicmVmbGluZSIsU0VMRUNUQUJMRToic2VsZWN0YWJsZWVkZ2UiLFNFTEVDVEVEOiJzZWxlY3RlZGVkZ2UiLFNUUlVDVFVSQUw6InN0cnVjdHVyYWwifSxBbm5vdGF0aW9uOntPVVRCT1g6Im91dC1hbm5vdGF0aW9ucyIsSU5CT1g6ImluLWFubm90YXRpb25zIixHUk9VUDoiYW5ub3RhdGlvbiIsTk9ERToiYW5ub3RhdGlvbi1ub2RlIixFREdFOiJhbm5vdGF0aW9uLWVkZ2UiLENPTlRST0xfRURHRToiYW5ub3RhdGlvbi1jb250cm9sLWVkZ2UiLExBQkVMOiJhbm5vdGF0aW9uLWxhYmVsIixFTExJUFNJUzoiYW5ub3RhdGlvbi1lbGxpcHNpcyJ9LFNjZW5lOntHUk9VUDoic2NlbmUiLENPUkU6ImNvcmUiLEZVTkNUSU9OX0xJQlJBUlk6ImZ1bmN0aW9uLWxpYnJhcnkiLElORVhUUkFDVDoiaW4tZXh0cmFjdCIsT1VURVhUUkFDVDoib3V0LWV4dHJhY3QifSxTdWJzY2VuZTp7R1JPVVA6InN1YnNjZW5lIn0sCk9QTk9ERToib3AiLE1FVEFOT0RFOiJtZXRhIixTRVJJRVNOT0RFOiJzZXJpZXMiLEJSSURHRU5PREU6ImJyaWRnZSIsRUxMSVBTSVNOT0RFOiJlbGxpcHNpcyJ9O2QuaGVhbHRoUGlsbEVudHJpZXM9W3tiYWNrZ3JvdW5kX2NvbG9yOiIjQ0MyRjJDIixsYWJlbDoiTmFOIn0se2JhY2tncm91bmRfY29sb3I6IiNGRjhEMDAiLGxhYmVsOiItXHUyMjFlIn0se2JhY2tncm91bmRfY29sb3I6IiNFQUVBRUEiLGxhYmVsOiItIn0se2JhY2tncm91bmRfY29sb3I6IiNBNUE1QTUiLGxhYmVsOiIwIn0se2JhY2tncm91bmRfY29sb3I6IiMyNjI2MjYiLGxhYmVsOiIrIn0se2JhY2tncm91bmRfY29sb3I6IiMwMDNFRDQiLGxhYmVsOiIrXHUyMjFlIn1dO2QuZml0PWZ1bmN0aW9uKHIsdCx2LEEpe3ZhciB5PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bGV0IHg9bnVsbDt0cnl7aWYoeD10LmdldEJCb3goKSwwPT09eC53aWR0aClyZXR1cm59Y2F0Y2goQyl7cmV0dXJufXQ9Yy5sYXlvdXQuUEFSQU1TLmdyYXBoOwp5PWQzLnpvb21JZGVudGl0eS5zY2FsZSguOSpNYXRoLm1pbih5LndpZHRoL3gud2lkdGgseS5oZWlnaHQveC5oZWlnaHQsMikpLnRyYW5zbGF0ZSh0LnBhZGRpbmcucGFkZGluZ0xlZnQsdC5wYWRkaW5nLnBhZGRpbmdUb3ApO2QzLnNlbGVjdChyKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5jYWxsKHYudHJhbnNmb3JtLHkpLm9uKCJlbmQuZml0dGVkIiwoKT0+e3Yub24oImVuZC5maXR0ZWQiLG51bGwpO0EoKX0pfTtkLnBhblRvTm9kZT1mdW5jdGlvbihyLHQsdixBKXt2PWQzLnNlbGVjdCh0KS5zZWxlY3QoYFtkYXRhLW5hbWU9IiR7cn0iXWApLm5vZGUoKTtpZighdilyZXR1cm4gY29uc29sZS53YXJuKGBwYW5Ub05vZGUoKSBmYWlsZWQgZm9yIG5vZGUgbmFtZSAiJHtyfSJgKSwhMTt2YXIgeT12LmdldEJCb3goKSx4PXYuZ2V0U2NyZWVuQ1RNKCk7cj10LmNyZWF0ZVNWR1BvaW50KCk7dj10LmNyZWF0ZVNWR1BvaW50KCk7ci54PXkueDtyLnk9eS55O3YueD15LngreS53aWR0aDsKdi55PXkueSt5LmhlaWdodDtyPXIubWF0cml4VHJhbnNmb3JtKHgpO3Y9di5tYXRyaXhUcmFuc2Zvcm0oeCk7eD0oRixELEIsRyk9PiEoRj5CJiZEPEcpO3k9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBDPXkudG9wK3kuaGVpZ2h0LTE1MDtyZXR1cm4geChyLngsdi54LHkubGVmdCx5LmxlZnQreS53aWR0aC0zMjApfHx4KHIueSx2LnkseS50b3AsQyk/KHg9eS5sZWZ0K3kud2lkdGgvMi0oci54K3YueCkvMixyPXkudG9wK3kuaGVpZ2h0LzItKHIueSt2LnkpLzIsdj1kMy56b29tVHJhbnNmb3JtKHQpLGQzLnNlbGVjdCh0KS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5jYWxsKEEudHJhbnNsYXRlQnkseC92Lmssci92LmspLCEwKTohMX07ZC5zZWxlY3RPckNyZWF0ZUNoaWxkPWY7ZC5zZWxlY3RDaGlsZD1nO2QuYnVpbGRHcm91cD1mdW5jdGlvbihyLHQsdixBKXtBPUF8fGQuQ2xhc3MuU2NlbmUuR1JPVVA7bGV0IHk9ZyhyLCJnIixBKS5lbXB0eSgpO3I9ZihyLCJnIiwKQSk7QT1mKHIsImciLGQuQ2xhc3MuU2NlbmUuQ09SRSk7bGV0IHg9Xy5yZWR1Y2UodC5jb3JlR3JhcGgubm9kZXMoKSwoQyxGKT0+e0Y9dC5jb3JlR3JhcGgubm9kZShGKTtGLmV4Y2x1ZGVkfHxDLnB1c2goRik7cmV0dXJuIEN9LFtdKTt0Lm5vZGUudHlwZT09PWMuTm9kZVR5cGUuU0VSSUVTJiZ4LnJldmVyc2UoKTtkLmVkZ2UuYnVpbGRHcm91cChBLHQuY29yZUdyYXBoLHYpO2Qubm9kZS5idWlsZEdyb3VwKEEseCx2KTswPHQuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoPyhBPWYociwiZyIsZC5DbGFzcy5TY2VuZS5JTkVYVFJBQ1QpLGQubm9kZS5idWlsZEdyb3VwKEEsdC5pc29sYXRlZEluRXh0cmFjdCx2KSk6ZyhyLCJnIixkLkNsYXNzLlNjZW5lLklORVhUUkFDVCkucmVtb3ZlKCk7MDx0Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg/KEE9ZihyLCJnIixkLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLGQubm9kZS5idWlsZEdyb3VwKEEsdC5pc29sYXRlZE91dEV4dHJhY3QsdikpOgpnKHIsImciLGQuQ2xhc3MuU2NlbmUuT1VURVhUUkFDVCkucmVtb3ZlKCk7MDx0LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD8oQT1mKHIsImciLGQuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksZC5ub2RlLmJ1aWxkR3JvdXAoQSx0LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LHYpKTpnKHIsImciLGQuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkucmVtb3ZlKCk7bChyLHQpO3kmJnIuYXR0cigib3BhY2l0eSIsMCkudHJhbnNpdGlvbigpLmF0dHIoIm9wYWNpdHkiLDEpO3JldHVybiByfTtkLmFkZEdyYXBoQ2xpY2tMaXN0ZW5lcj1mdW5jdGlvbihyLHQpe2QzLnNlbGVjdChyKS5vbigiY2xpY2siLCgpPT57dC5maXJlKCJncmFwaC1zZWxlY3QiKX0pfTtkLnRyYW5zbGF0ZT1rO2QucG9zaXRpb25SZWN0PWZ1bmN0aW9uKHIsdCx2LEEseSl7ci50cmFuc2l0aW9uKCkuYXR0cigieCIsdC1BLzIpLmF0dHIoInkiLHYteS8yKS5hdHRyKCJ3aWR0aCIsQSkuYXR0cigiaGVpZ2h0IiwKeSl9O2QucG9zaXRpb25UcmlhbmdsZT1mdW5jdGlvbihyLHQsdixBLHkpe3kvPTI7QS89Mjt0PVtbdCx2LXldLFt0K0Esdit5XSxbdC1BLHYreV1dO3IudHJhbnNpdGlvbigpLmF0dHIoInBvaW50cyIsdC5tYXAoeD0+eC5qb2luKCIsIikpLmpvaW4oIiAiKSl9O2QucG9zaXRpb25CdXR0b249ZnVuY3Rpb24ocix0KXtsZXQgdj1jLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKHQpKyh0LmV4cGFuZGVkP3Qud2lkdGg6dC5jb3JlQm94LndpZHRoKS8yLTYsQT10LnktKHQuZXhwYW5kZWQ/dC5oZWlnaHQ6dC5jb3JlQm94LmhlaWdodCkvMis2O3Qubm9kZS50eXBlIT09Yy5Ob2RlVHlwZS5TRVJJRVN8fHQuZXhwYW5kZWR8fCh2Kz0xMCxBLT0yKTt0PSJ0cmFuc2xhdGUoIit2KyIsIitBKyIpIjtyLnNlbGVjdEFsbCgicGF0aCIpLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLHQpO3Iuc2VsZWN0KCJjaXJjbGUiKS50cmFuc2l0aW9uKCkuYXR0cih7Y3g6dixjeTpBLApyOmMubGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS5tZXRhLmV4cGFuZEJ1dHRvblJhZGl1c30pfTtkLnBvc2l0aW9uRWxsaXBzZT1mdW5jdGlvbihyLHQsdixBLHkpe3IudHJhbnNpdGlvbigpLmF0dHIoImN4Iix0KS5hdHRyKCJjeSIsdikuYXR0cigicngiLEEvMikuYXR0cigicnkiLHkvMil9O2QuaHVtYW5pemVIZWFsdGhQaWxsU3RhdD1tO2QuYWRkSGVhbHRoUGlsbD1xO2QuYWRkSGVhbHRoUGlsbHM9ZnVuY3Rpb24ocix0LHYpe2lmKHQpe3ZhciBBPTE7ZDMuc2VsZWN0KHIpLnNlbGVjdEFsbCgiZy5ub2Rlc2hhcGUiKS5lYWNoKGZ1bmN0aW9uKHkpe2NvbnN0IHg9dFt5Lm5vZGUubmFtZV07cSh0aGlzLHg/eFt2XTpudWxsLHksQSsrKX0pfX19KShjLnNjZW5lfHwoYy5zY2VuZT17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1jb21tb24vdGVtcGxhdGUuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihxKXtsZXQgcj1fLm1hcCh7ZGVwdGg6cS5kZXB0aCwifFZ8IjpxLm1ldGFncmFwaC5ub2RlcygpLmxlbmd0aCwifEV8IjpxLm1ldGFncmFwaC5lZGdlcygpLmxlbmd0aH0sZnVuY3Rpb24odCx2KXtyZXR1cm4gdisiXHgzZCIrdH0pLmpvaW4oIiAiKTtxPV8ubWFwKHEub3BIaXN0b2dyYW0sZnVuY3Rpb24odCx2KXtyZXR1cm4gdisiXHgzZCIrdH0pLmpvaW4oIiwiKTtyZXR1cm4gcisiIFtvcHNdICIrcX1mdW5jdGlvbiBnKHEpe2NvbnN0IHI9cS5nZXROb2RlTWFwKCk7bGV0IHQ9T2JqZWN0LmtleXMocikucmVkdWNlKCh2LEEpPT57Y29uc3QgeT1yW0FdO2lmKHkudHlwZSE9PWMuTm9kZVR5cGUuTUVUQSlyZXR1cm4gdjtBPUEuc3BsaXQoIi8iKS5sZW5ndGgtMTtsZXQgeD1mKHkpLEM9dlt4XXx8e25vZGVzOltdLGxldmVsOkF9O3ZbeF09QztDLm5vZGVzLnB1c2goeSk7Qy5sZXZlbD5BJiYoQy5sZXZlbD0KQSk7cmV0dXJuIHZ9LHt9KTtyZXR1cm4gT2JqZWN0LmtleXModCkubWFwKHY9Plt2LHRbdl1dKS5maWx0ZXIoKFssdl0pPT57KHtub2Rlczp2fT12KTtpZigxPHYubGVuZ3RoKXJldHVybiEwO3Y9dlswXTtyZXR1cm4gdi50eXBlPT09Yy5Ob2RlVHlwZS5NRVRBJiZ2LmFzc29jaWF0ZWRGdW5jdGlvbn0pLnNvcnQoKFssdl0pPT52Lm5vZGVzWzBdLmRlcHRoKX1mdW5jdGlvbiBsKHEscil7cmV0dXJuIF8ucmVkdWNlKHEsZnVuY3Rpb24odCx2KXtsZXQgQT12WzBdLHk9W107dlsxXS5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHgpe2ZvcihsZXQgQz0wO0M8eS5sZW5ndGg7QysrKWlmKCFyfHxtKHlbQ10ubWV0YW5vZGUubWV0YWdyYXBoLHgubWV0YWdyYXBoKSl7eC50ZW1wbGF0ZUlkPXlbQ10ubWV0YW5vZGUudGVtcGxhdGVJZDt5W0NdLm1lbWJlcnMucHVzaCh4Lm5hbWUpO3JldHVybn14LnRlbXBsYXRlSWQ9QSsiWyIreS5sZW5ndGgrIl0iO3kucHVzaCh7bWV0YW5vZGU6eCxtZW1iZXJzOlt4Lm5hbWVdfSl9KTsKeS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3RbeC5tZXRhbm9kZS50ZW1wbGF0ZUlkXT17bGV2ZWw6dlsxXS5sZXZlbCxub2Rlczp4Lm1lbWJlcnN9fSk7cmV0dXJuIHR9LHt9KX1mdW5jdGlvbiBrKHEscix0KXtyZXR1cm4gXy5zb3J0QnkocSxbdj0+ci5ub2RlKHYpLm9wLHY9PnIubm9kZSh2KS50ZW1wbGF0ZUlkLHY9PnIubmVpZ2hib3JzKHYpLmxlbmd0aCx2PT5yLnByZWRlY2Vzc29ycyh2KS5sZW5ndGgsdj0+ci5zdWNjZXNzb3JzKHYpLmxlbmd0aCx2PT52LnN1YnN0cih0Lmxlbmd0aCldKX1mdW5jdGlvbiBtKHEscil7ZnVuY3Rpb24gdChHLEspe2xldCBMPUcuc3Vic3RyKHYubGVuZ3RoKSxKPUsuc3Vic3RyKEEubGVuZ3RoKTtpZih5W0xdXnhbSl0pcmV0dXJuIGNvbnNvbGUud2FybigiZGlmZmVyZW50IHZpc2l0IHBhdHRlcm4iLCJbIit2KyJdIixMLCJbIitBKyJdIixKKSwhMDt5W0xdfHwoeVtMXT14W0pdPSEwLEMucHVzaCh7bjE6RyxuMjpLfSkpO3JldHVybiExfWlmKCFhLmdyYXBoLmhhc1NpbWlsYXJEZWdyZWVTZXF1ZW5jZShxLApyKSlyZXR1cm4hMTtsZXQgdj1xLmdyYXBoKCkubmFtZSxBPXIuZ3JhcGgoKS5uYW1lLHk9e30seD17fSxDPVtdO3ZhciBGPXEuc291cmNlcygpLEQ9ci5zb3VyY2VzKCk7aWYoRi5sZW5ndGghPT1ELmxlbmd0aClyZXR1cm4gY29uc29sZS5sb2coImRpZmZlcmVudCBzb3VyY2UgbGVuZ3RoIiksITE7Rj1rKEYscSx2KTtEPWsoRCxyLEEpO2Zvcih2YXIgQj0wO0I8Ri5sZW5ndGg7QisrKWlmKHQoRltCXSxEW0JdKSlyZXR1cm4hMTtmb3IoOzA8Qy5sZW5ndGg7KXtEPUMucG9wKCk7aWYoIXAocS5ub2RlKEQubjEpLHIubm9kZShELm4yKSkpcmV0dXJuITE7Rj1xLnN1Y2Nlc3NvcnMoRC5uMSk7RD1yLnN1Y2Nlc3NvcnMoRC5uMik7aWYoRi5sZW5ndGghPT1ELmxlbmd0aClyZXR1cm4gY29uc29sZS5sb2coIiMgb2Ygc3VjY2Vzc29ycyBtaXNtYXRjaCIsRixEKSwhMTtGPWsoRixxLHYpO0Q9ayhELHIsQSk7Zm9yKEI9MDtCPEYubGVuZ3RoO0IrKylpZih0KEZbQl0sRFtCXSkpcmV0dXJuITF9cmV0dXJuITB9CmZ1bmN0aW9uIHAocSxyKXtpZihxLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEEpcmV0dXJuIHEudGVtcGxhdGVJZCYmci50ZW1wbGF0ZUlkJiZxLnRlbXBsYXRlSWQ9PT1yLnRlbXBsYXRlSWQ7aWYocS50eXBlPT09Yy5Ob2RlVHlwZS5PUCYmci50eXBlPT09Yy5Ob2RlVHlwZS5PUClyZXR1cm4gcS5vcD09PXIub3A7aWYocS50eXBlPT09Yy5Ob2RlVHlwZS5TRVJJRVMmJnIudHlwZT09PWMuTm9kZVR5cGUuU0VSSUVTKXtsZXQgdD1xLm1ldGFncmFwaC5ub2RlQ291bnQoKTtyZXR1cm4gdD09PXIubWV0YWdyYXBoLm5vZGVDb3VudCgpJiYoMD09PXR8fHEubWV0YWdyYXBoLm5vZGUocS5tZXRhZ3JhcGgubm9kZXMoKVswXSkub3A9PT1yLm1ldGFncmFwaC5ub2RlKHIubWV0YWdyYXBoLm5vZGVzKClbMF0pLm9wKX1yZXR1cm4hMX1kLmRldGVjdD1mdW5jdGlvbihxLHIpe3E9ZyhxKTtsZXQgdD1sKHEscik7cmV0dXJuIE9iamVjdC5rZXlzKHQpLnNvcnQodj0+dFt2XS5sZXZlbCkucmVkdWNlKCh2LApBKT0+e3ZbQV09dFtBXTtyZXR1cm4gdn0se30pfX0pKGMudGVtcGxhdGV8fChjLnRlbXBsYXRlPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWdyYXBoLWNvbW1vbi91dGlsLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2QudGltZT1mdW5jdGlvbihmLGcpe2xldCBsPURhdGUubm93KCk7Zz1nKCk7Y29uc29sZS5sb2coZiwiOiIsRGF0ZS5ub3coKS1sLCJtcyIpO3JldHVybiBnfTtkLmdldFRyYWNrZXI9ZnVuY3Rpb24oZil7cmV0dXJue3NldE1lc3NhZ2U6ZnVuY3Rpb24oZyl7Zi5zZXQoInByb2dyZXNzIix7dmFsdWU6Zi5wcm9ncmVzcy52YWx1ZSxtc2c6Z30pfSx1cGRhdGVQcm9ncmVzczpmdW5jdGlvbihnKXtmLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTpmLnByb2dyZXNzLnZhbHVlK2csbXNnOmYucHJvZ3Jlc3MubXNnfSl9LHJlcG9ydEVycm9yOmZ1bmN0aW9uKGcsbCl7Y29uc29sZS5lcnJvcihsLnN0YWNrKTtmLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTpmLnByb2dyZXNzLnZhbHVlLG1zZzpnLGVycm9yOiEwfSl9fX07ZC5nZXRTdWJ0YXNrVHJhY2tlcj1mdW5jdGlvbihmLGcsbCl7cmV0dXJue3NldE1lc3NhZ2U6ZnVuY3Rpb24oayl7Zi5zZXRNZXNzYWdlKGwrCiI6ICIrayl9LHVwZGF0ZVByb2dyZXNzOmZ1bmN0aW9uKGspe2YudXBkYXRlUHJvZ3Jlc3MoaypnLzEwMCl9LHJlcG9ydEVycm9yOmZ1bmN0aW9uKGssbSl7Zi5yZXBvcnRFcnJvcihsKyI6ICIrayxtKX19fTtkLnJ1blRhc2s9ZnVuY3Rpb24oZixnLGwsayl7ay5zZXRNZXNzYWdlKGYpO3RyeXtsZXQgbT1hLmdyYXBoLnV0aWwudGltZShmLGwpO2sudXBkYXRlUHJvZ3Jlc3MoZyk7cmV0dXJuIG19Y2F0Y2gobSl7ay5yZXBvcnRFcnJvcigiRmFpbGVkICIrZixtKX19O2QucnVuQXN5bmNUYXNrPWZ1bmN0aW9uKGYsZyxsLGspe3JldHVybiBuZXcgUHJvbWlzZShtPT57ay5zZXRNZXNzYWdlKGYpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7bGV0IHA9YS5ncmFwaC51dGlsLnRpbWUoZixsKTtrLnVwZGF0ZVByb2dyZXNzKGcpO20ocCl9Y2F0Y2gocCl7ay5yZXBvcnRFcnJvcigiRmFpbGVkICIrZixwKX19LDIwKX0pfTtkLnJ1bkFzeW5jUHJvbWlzZVRhc2s9ZnVuY3Rpb24oZixnLGwsayl7cmV0dXJuIG5ldyBQcm9taXNlKChtLApwKT0+e2Z1bmN0aW9uIHEocil7ay5yZXBvcnRFcnJvcigiRmFpbGVkICIrZixyKTtwKHIpfWsuc2V0TWVzc2FnZShmKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2xldCByPURhdGUubm93KCk7bCgpLnRoZW4oZnVuY3Rpb24odCl7Y29uc29sZS5sb2coZiwiOiIsRGF0ZS5ub3coKS1yLCJtcyIpO2sudXBkYXRlUHJvZ3Jlc3MoZyk7bSh0KX0pLmNhdGNoKHEpfWNhdGNoKHIpe3Eocil9fSwyMCl9KX07ZC5lc2NhcGVRdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGYpe3JldHVybiBmLnJlcGxhY2UoLyhbOi5cW1xdLC9cXFwoXCldKS9nLCJcXCQxIil9O2QuTUVNT1JZX1VOSVRTPVt7c3ltYm9sOiJCIn0se3N5bWJvbDoiS0IiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6Ik1CIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJHQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiVEIiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlBCIixudW1Vbml0czoxMDI0fV07ZC5USU1FX1VOSVRTPVt7c3ltYm9sOiJcdTAwYjVzIn0sCntzeW1ib2w6Im1zIixudW1Vbml0czoxRTN9LHtzeW1ib2w6InMiLG51bVVuaXRzOjFFM30se3N5bWJvbDoibWluIixudW1Vbml0czo2MH0se3N5bWJvbDoiaHIiLG51bVVuaXRzOjYwfSx7c3ltYm9sOiJkYXlzIixudW1Vbml0czoyNH1dO2QuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlPWZ1bmN0aW9uKGYsZyxsPTApe3JldHVybiBsKzE8Zy5sZW5ndGgmJmY+PWdbbCsxXS5udW1Vbml0cz9hLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKGYvZ1tsKzFdLm51bVVuaXRzLGcsbCsxKTpOdW1iZXIoZi50b1ByZWNpc2lvbigzKSkrIiAiK2dbbF0uc3ltYm9sfTtkLmhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzPWZ1bmN0aW9uKGYpe3JldHVybiBmJiYoMDxmLnRvdGFsQnl0ZXN8fDA8Zi5nZXRUb3RhbE1pY3JvcygpfHxmLm91dHB1dFNpemUpPyEwOiExfTtkLnJlbW92ZUNvbW1vblByZWZpeD1mdW5jdGlvbihmKXtpZigyPmYubGVuZ3RoKXJldHVybiBmO2xldCBnPQowLGw9MCxrPV8ubWluKF8ubWFwKGYsbT0+bS5sZW5ndGgpKTtmb3IoOzspe2crKztsZXQgbT1fLm1hcChmLHA9PnAuc3Vic3RyaW5nKDAsZykpO2lmKG0uZXZlcnkoKHAscSk9PjA9PT1xPyEwOnA9PT1tW3EtMV0pKXtpZihnPj1rKXJldHVybiBmO2w9Z31lbHNlIGJyZWFrfXJldHVybiBfLm1hcChmLG09Pm0uc3Vic3RyaW5nKGwpKX07ZC5jb21wdXRlSHVtYW5GcmllbmRseVRpbWU9ZnVuY3Rpb24oZil7Zj0rbmV3IERhdGUtK25ldyBEYXRlKGYvMUUzKTtyZXR1cm4gM0U0PmY/Imp1c3Qgbm93Ijo2RTQ+Zj9NYXRoLmZsb29yKGYvMUUzKSsiIHNlY29uZHMgYWdvIjoxMkU0PmY/ImEgbWludXRlIGFnbyI6MzZFNT5mP01hdGguZmxvb3IoZi82RTQpKyIgbWludXRlcyBhZ28iOjE9PU1hdGguZmxvb3IoZi8zNkU1KT8iYW4gaG91ciBhZ28iOjg2NEU1PmY/TWF0aC5mbG9vcihmLzM2RTUpKyIgaG91cnMgYWdvIjoxNzI4RTU+Zj8ieWVzdGVyZGF5IjpNYXRoLmZsb29yKGYvODY0RTUpKyIgZGF5cyBhZ28ifX0pKGMudXRpbHx8CihjLnV0aWw9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0PgoKCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtY29tbW9uL21pbmltYXAuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXtjbGFzcyBke2NvbnN0cnVjdG9yKGYsZyxsLGssbSxwKXt0aGlzLnN2Zz1mO3RoaXMubGFiZWxQYWRkaW5nPXA7dGhpcy56b29tRz1nO3RoaXMubWFpblpvb209bDt0aGlzLm1heFdhbmRIPW07Zj1kMy5zZWxlY3Qoay5zaGFkb3dSb290KTtsZXQgcT1mLnNlbGVjdCgic3ZnIikscj1xLnNlbGVjdCgicmVjdCIpO3RoaXMudmlld3BvaW50Q29vcmQ9e3g6MCx5OjB9O2c9ZDMuZHJhZygpLnN1YmplY3QoT2JqZWN0KS5vbigiZHJhZyIsKCk9Pnt0aGlzLnZpZXdwb2ludENvb3JkLng9ZDMuZXZlbnQueDt0aGlzLnZpZXdwb2ludENvb3JkLnk9ZDMuZXZlbnQueTt0aGlzLnVwZGF0ZVZpZXdwb2ludCgpfSk7ci5kYXR1bSh0aGlzLnZpZXdwb2ludENvb3JkKS5jYWxsKGcpO3Eub24oImNsaWNrIiwoKT0+e2lmKCFkMy5ldmVudC5kZWZhdWx0UHJldmVudGVkKXt2YXIgdD1OdW1iZXIoci5hdHRyKCJ3aWR0aCIpKSx2PU51bWJlcihyLmF0dHIoImhlaWdodCIpKSwKQT1kMy5tb3VzZShxLm5vZGUoKSk7dGhpcy52aWV3cG9pbnRDb29yZC54PUFbMF0tdC8yO3RoaXMudmlld3BvaW50Q29vcmQueT1BWzFdLXYvMjt0aGlzLnVwZGF0ZVZpZXdwb2ludCgpfX0pO3RoaXMudmlld3BvaW50PXIubm9kZSgpO3RoaXMubWluaW1hcFN2Zz1xLm5vZGUoKTt0aGlzLm1pbmltYXA9azt0aGlzLmNhbnZhcz1mLnNlbGVjdCgiY2FudmFzLmZpcnN0Iikubm9kZSgpO3RoaXMuY2FudmFzQnVmZmVyPWYuc2VsZWN0KCJjYW52YXMuc2Vjb25kIikubm9kZSgpO3RoaXMuZG93bmxvYWRDYW52YXM9Zi5zZWxlY3QoImNhbnZhcy5kb3dubG9hZCIpLm5vZGUoKTtkMy5zZWxlY3QodGhpcy5kb3dubG9hZENhbnZhcykuc3R5bGUoImRpc3BsYXkiLCJub25lIik7dGhpcy51cGRhdGUoKX11cGRhdGVWaWV3cG9pbnQoKXtkMy5zZWxlY3QodGhpcy52aWV3cG9pbnQpLmF0dHIoIngiLHRoaXMudmlld3BvaW50Q29vcmQueCkuYXR0cigieSIsdGhpcy52aWV3cG9pbnRDb29yZC55KTtsZXQgZj0KLXRoaXMudmlld3BvaW50Q29vcmQueCp0aGlzLnNjYWxlTWFpbi90aGlzLnNjYWxlTWluaW1hcCxnPS10aGlzLnZpZXdwb2ludENvb3JkLnkqdGhpcy5zY2FsZU1haW4vdGhpcy5zY2FsZU1pbmltYXA7ZDMuc2VsZWN0KHRoaXMuc3ZnKS5jYWxsKHRoaXMubWFpblpvb20udHJhbnNmb3JtLGQzLnpvb21JZGVudGl0eS50cmFuc2xhdGUoZixnKS5zY2FsZSh0aGlzLnNjYWxlTWFpbikpfXVwZGF0ZSgpe2xldCBmPW51bGw7dHJ5e2lmKGY9dGhpcy56b29tRy5nZXRCQm94KCksMD09PWYud2lkdGgpcmV0dXJufWNhdGNoKHQpe3JldHVybn12YXIgZz1kMy5zZWxlY3QoIiNncmFwaGRvd25sb2FkIik7dGhpcy5kb3dubG9hZD1nLm5vZGUoKTtnLm9uKCJjbGljayIsKCk9PntVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuZG93bmxvYWQuaHJlZik7dmFyIHQ9dGhpcy5kb3dubG9hZENhbnZhcy50b0RhdGFVUkwoImltYWdlL3BuZyIpO2NvbnN0IHY9dC5zbGljZSgwLHQuaW5kZXhPZigiLCIpKTtpZih2LmVuZHNXaXRoKCI7YmFzZTY0Iikpe3ZhciBBPQphdG9iKHQuc2xpY2UodC5pbmRleE9mKCIsIikrMSkpO3Q9KG5ldyBVaW50OEFycmF5KEEubGVuZ3RoKSkubWFwKCh5LHgpPT5BLmNoYXJDb2RlQXQoeCkpO3RoaXMuZG93bmxvYWQuaHJlZj1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0XSx7dHlwZToiaW1hZ2UvcG5nIn0pKX1lbHNlIGNvbnNvbGUud2Fybihgbm9uLWJhc2U2NCBkYXRhIFVSTCAoJHt2fSk7IGNhbm5vdCB1c2UgYmxvYiBkb3dubG9hZGApLHRoaXMuZG93bmxvYWQuaHJlZj10fSk7Zz1kMy5zZWxlY3QodGhpcy5zdmcpO3ZhciBsPSIiLGs9dGhpcy5zdmc7az0oay5nZXRSb290Tm9kZT9rLmdldFJvb3ROb2RlKCk6dGhpcy5zdmcucGFyZW50Tm9kZSkuc3R5bGVTaGVldHM7Zm9yKHZhciBtPTA7bTxrLmxlbmd0aDttKyspdHJ5e3ZhciBwPWtbbV0uY3NzUnVsZXN8fGtbbV0ucnVsZXM7aWYobnVsbCE9cClmb3IobGV0IHQ9MDt0PHAubGVuZ3RoO3QrKylsKz1wW3RdLmNzc1RleHQucmVwbGFjZSgvID90Zi1bXHctXSsgPy9nLAoiIikrIlxuIn1jYXRjaCh0KXtpZigiU2VjdXJpdHlFcnJvciIhPT10Lm5hbWUpdGhyb3cgdDt9cD1nLmFwcGVuZCgic3R5bGUiKTtwLnRleHQobCk7bD1kMy5zZWxlY3QodGhpcy56b29tRyk7az1sLmF0dHIoInRyYW5zZm9ybSIpO2wuYXR0cigidHJhbnNmb3JtIixudWxsKTtmLmhlaWdodCs9Zi55O2Yud2lkdGgrPWYueDtmLmhlaWdodCs9Mip0aGlzLmxhYmVsUGFkZGluZztmLndpZHRoKz0yKnRoaXMubGFiZWxQYWRkaW5nO2cuYXR0cigid2lkdGgiLGYud2lkdGgpLmF0dHIoImhlaWdodCIsZi5oZWlnaHQpO3RoaXMuc2NhbGVNaW5pbWFwPXRoaXMubWF4V2FuZEgvTWF0aC5tYXgoZi53aWR0aCxmLmhlaWdodCk7dGhpcy5taW5pbWFwU2l6ZT17d2lkdGg6Zi53aWR0aCp0aGlzLnNjYWxlTWluaW1hcCxoZWlnaHQ6Zi5oZWlnaHQqdGhpcy5zY2FsZU1pbmltYXB9O2QzLnNlbGVjdCh0aGlzLm1pbmltYXBTdmcpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSk7ZDMuc2VsZWN0KHRoaXMuY2FudmFzQnVmZmVyKS5hdHRyKHRoaXMubWluaW1hcFNpemUpOwptPWQzLnNlbGVjdCh0aGlzLmRvd25sb2FkQ2FudmFzKTttLnN0eWxlKCJ3aWR0aCIsZi53aWR0aCk7bS5zdHlsZSgiaGVpZ2h0IixmLmhlaWdodCk7bS5hdHRyKCJ3aWR0aCIsMypmLndpZHRoKTttLmF0dHIoImhlaWdodCIsMypmLmhlaWdodCk7bnVsbCE9dGhpcy50cmFuc2xhdGUmJm51bGwhPXRoaXMuem9vbSYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnpvb20oKSk7bGV0IHE9KG5ldyBYTUxTZXJpYWxpemVyKS5zZXJpYWxpemVUb1N0cmluZyh0aGlzLnN2Zyk7cC5yZW1vdmUoKTtnLmF0dHIoIndpZHRoIixudWxsKS5hdHRyKCJoZWlnaHQiLG51bGwpO2wuYXR0cigidHJhbnNmb3JtIixrKTtsZXQgcj1uZXcgSW1hZ2U7ci5vbmxvYWQ9KCk9Pnt2YXIgdD10aGlzLmNhbnZhc0J1ZmZlci5nZXRDb250ZXh0KCIyZCIpO3QuY2xlYXJSZWN0KDAsMCx0aGlzLmNhbnZhc0J1ZmZlci53aWR0aCx0aGlzLmNhbnZhc0J1ZmZlci5oZWlnaHQpO3QuZHJhd0ltYWdlKHIsMCwwLHRoaXMubWluaW1hcFNpemUud2lkdGgsCnRoaXMubWluaW1hcFNpemUuaGVpZ2h0KTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntkMy5zZWxlY3QodGhpcy5jYW52YXNCdWZmZXIpLnN0eWxlKCJkaXNwbGF5IixudWxsKTtkMy5zZWxlY3QodGhpcy5jYW52YXMpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpO1t0aGlzLmNhbnZhcyx0aGlzLmNhbnZhc0J1ZmZlcl09W3RoaXMuY2FudmFzQnVmZmVyLHRoaXMuY2FudmFzXX0pO3Q9dGhpcy5kb3dubG9hZENhbnZhcy5nZXRDb250ZXh0KCIyZCIpO3QuY2xlYXJSZWN0KDAsMCx0aGlzLmRvd25sb2FkQ2FudmFzLndpZHRoLHRoaXMuZG93bmxvYWRDYW52YXMuaGVpZ2h0KTt0LmRyYXdJbWFnZShyLDAsMCx0aGlzLmRvd25sb2FkQ2FudmFzLndpZHRoLHRoaXMuZG93bmxvYWRDYW52YXMuaGVpZ2h0KX07ci5vbmVycm9yPSgpPT57ci5zcmM9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbcV0se3R5cGU6ImltYWdlL3N2Zyt4bWw7Y2hhcnNldFx4M2R1dGYtOCJ9KSl9O3Iuc3JjPQoiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXRceDNkdXRmLTgsIitlbmNvZGVVUklDb21wb25lbnQocSl9em9vbShmKXtpZihudWxsIT10aGlzLnNjYWxlTWluaW1hcCl7ZiYmKHRoaXMudHJhbnNsYXRlPVtmLngsZi55XSx0aGlzLnNjYWxlTWFpbj1mLmspO3ZhciBnPXRoaXMuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGw9ZDMuc2VsZWN0KHRoaXMudmlld3BvaW50KTt0aGlzLnZpZXdwb2ludENvb3JkLng9LXRoaXMudHJhbnNsYXRlWzBdKnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO3RoaXMudmlld3BvaW50Q29vcmQueT0tdGhpcy50cmFuc2xhdGVbMV0qdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47Zj1nLndpZHRoKnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO2c9Zy5oZWlnaHQqdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47bC5hdHRyKCJ4Iix0aGlzLnZpZXdwb2ludENvb3JkLngpLmF0dHIoInkiLHRoaXMudmlld3BvaW50Q29vcmQueSkuYXR0cigid2lkdGgiLApmKS5hdHRyKCJoZWlnaHQiLGcpO2w9dGhpcy5taW5pbWFwU2l6ZS53aWR0aDt2YXIgaz10aGlzLm1pbmltYXBTaXplLmhlaWdodCxtPXRoaXMudmlld3BvaW50Q29vcmQueCxwPXRoaXMudmlld3BvaW50Q29vcmQueTsuOD4oTWF0aC5taW4oTWF0aC5tYXgoMCxtK2YpLGwpLU1hdGgubWluKE1hdGgubWF4KDAsbSksbCkpKihNYXRoLm1pbihNYXRoLm1heCgwLHArZyksayktTWF0aC5taW4oTWF0aC5tYXgoMCxwKSxrKSkvKGwqayk/dGhpcy5taW5pbWFwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOnRoaXMubWluaW1hcC5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKX19fWMuTWluaW1hcD1kfSkoYS5zY2VuZXx8KGEuc2NlbmU9e30pKX0pKHRmfHwodGY9e30pKTsKPC9zY3JpcHQ+Cgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtbWluaW1hcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGxpbmVhcjsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoLmhpZGRlbikgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIGNhbnZhcyB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKICAgICAgfQoKICAgICAgcmVjdCB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjMTExMTExOwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWx0ZXI6IHVybCgjbWluaW1hcERyb3BTaGFkb3cpOwogICAgICAgIGN1cnNvcjogbW92ZTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c3ZnPgogICAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJtaW5pbWFwRHJvcFNoYWRvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE1MCUiIGhlaWdodD0iMTUwJSI+CiAgICAgICAgICA8ZmVvZmZzZXQgcmVzdWx0PSJvZmZPdXQiIGluPSJTb3VyY2VHcmFwaGljIiBkeD0iMSIgZHk9IjEiPjwvZmVvZmZzZXQ+CiAgICAgICAgICA8ZmVjb2xvcm1hdHJpeCByZXN1bHQ9Im1hdHJpeE91dCIgaW49Im9mZk91dCIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAuMSAwIDAgMCAwIDAgMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuNSAwIj48L2ZlY29sb3JtYXRyaXg+CiAgICAgICAgICA8ZmVnYXVzc2lhbmJsdXIgcmVzdWx0PSJibHVyT3V0IiBpbj0ibWF0cml4T3V0IiBzdGRkZXZpYXRpb249IjIiPjwvZmVnYXVzc2lhbmJsdXI+CiAgICAgICAgICA8ZmVibGVuZCBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJibHVyT3V0IiBtb2RlPSJub3JtYWwiPjwvZmVibGVuZD4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICA8cmVjdD48L3JlY3Q+CiAgICA8L3N2Zz4KICAgIDxjYW52YXMgY2xhc3M9ImZpcnN0Ij48L2NhbnZhcz4KICAgIAogICAgPGNhbnZhcyBjbGFzcz0ic2Vjb25kIj48L2NhbnZhcz4KICAgIDxjYW52YXMgY2xhc3M9ImRvd25sb2FkIj48L2NhbnZhcz4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC90Zi1ncmFwaC1taW5pbWFwLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLW1pbmltYXAiLGluaXQ6ZnVuY3Rpb24oYSxjLGQsZixnKXtyZXR1cm4gbmV3IHRmLnNjZW5lLk1pbmltYXAoYSxjLGQsdGhpcyxmLGcpfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtc2NlbmUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3N2ZyB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjaGlkZGVuIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBhbmQgYW5ub3RhdGlvbi1ub2RlIGZvciBNZXRhbm9kZSAtLS0gKi8KCiAgICAgIC5tZXRhID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5tZXRhID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiBoc2woMCwgMCUsIDcwJSk7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxOwogICAgICB9CiAgICAgIC5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5tZXRhLnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAzOwogICAgICB9CiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLmFubm90YXRpb24ubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogNDsKICAgICAgfQoKICAgICAgLmZhZGVkLAogICAgICAuZmFkZWQgcmVjdCwKICAgICAgLmZhZGVkIGVsbGlwc2UsCiAgICAgIC5mYWRlZCBwYXRoLAogICAgICAuZmFkZWQgdXNlLAogICAgICAjcmVjdEhhdGNoIGxpbmUsCiAgICAgICNlbGxpcHNlSGF0Y2ggbGluZSB7CiAgICAgICAgY29sb3I6ICNlMGQ0YjMgIWltcG9ydGFudDsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICNlMGQ0YjMgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMXB4ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCByZWN0IHsKICAgICAgICBmaWxsOiB1cmwoI3JlY3RIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIGVsbGlwc2UsCiAgICAgIC5mYWRlZCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLyogUnVsZXMgdXNlZCBmb3IgaW5wdXQtdHJhY2luZy4gKi8KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiByZWN0LAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IGVsbGlwc2UsCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gdXNlIHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICNmZjk4MDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLyogIC0gRmFkZWQgbm9uLWlucHV0IHN0eWxpbmcgKi8KICAgICAgLm5vbi1pbnB1dCA+ICogPiByZWN0LAoubm9uLWlucHV0ID4gKiA+IGVsbGlwc2UsCi5ub24taW5wdXQgPiAqID4gdXNlLAovKiBGb3IgQ29uc3Qgbm9kZXMuICovCi5ub24taW5wdXQgPiAqID4gLmNvbnN0YW50Om5vdChbY2xhc3MqPSJpbnB1dC1oaWdobGlnaHQiXSkgPgogIC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlLAovKiBGb3Igc3R5bGluZyBvZiBhbm5vdGF0aW9uIG5vZGVzIG9mIG5vbi1pbnB1dCBub2Rlcy4gKi8KLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNlMGQ0YjMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2Utd2lkdGg6IGluaGVyaXQ7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogaW5oZXJpdDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCBwYXRoIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgPiAubm9kZXNoYXBlID4gcmVjdCwKLm5vbi1pbnB1dCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0LAovKiBGb3Igc3R5bGluZyBvZiBhbm5vdGF0aW9uIG5vZGVzIG9mIG5vbi1pbnB1dCBub2Rlcy4gKi8KLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBmaWxsOiB1cmwoI3JlY3RIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCBlbGxpcHNlLAogICAgICAubm9uLWlucHV0IHVzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgPiB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgbWFya2VyLWVuZDogdXJsKCNhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCk7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAvKiBJbnB1dCBlZGdlcy4gKi8KICAgICAgLmlucHV0LWVkZ2UtaGlnaGxpZ2h0ID4gdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsKICAgICAgfQogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gLmluLWFubm90YXRpb25zID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0LXNlbGVjdGVkCiAgICAgICAgPiAuaW4tYW5ub3RhdGlvbnMKICAgICAgICA+IC5hbm5vdGF0aW9uCiAgICAgICAgPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBzdHJva2U6ICM5OTkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLyogTm9uLWlucHV0IGVkZ2VzLiAqLwogICAgICAubm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0LAoubm9uLWlucHV0ID4gZyA+IC5hbm5vdGF0aW9uID4gcGF0aCwKLyogQW5ub3RhdGlvbiBzdHlsZXMgKGxhYmVsIGFuZCBlZGdlcyByZXNwZWN0aXZlbHkpLiAqLwoubm9uLWlucHV0ID4gZyA+Ci5hbm5vdGF0aW9uOm5vdCguaW5wdXQtaGlnaGxpZ2h0KTpub3QoLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCkgPgouYW5ub3RhdGlvbi1sYWJlbAovKi5hbm5vdGF0aW9uLWVkZ2UqLwogewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE9wIE5vZGUgLS0tICovCgogICAgICAub3AgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIHN0cm9rZTogI2NjYzsKICAgICAgfQoKICAgICAgLm9wLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5vcC5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAvKiAtLS0gU2VyaWVzIE5vZGUgLS0tICovCgogICAgICAvKiBCeSBkZWZhdWx0LCBkb24ndCBzaG93IHRoZSBzZXJpZXMgYmFja2dyb3VuZCA8cmVjdD4uICovCiAgICAgIC5zZXJpZXMgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiA1LCA1OwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLyogT25jZSBleHBhbmRlZCwgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+IGFuZCBoaWRlIHRoZSA8dXNlPi4gKi8KICAgICAgLnNlcmllcy5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBmaWxsLW9wYWNpdHk6IDAuMTU7CiAgICAgICAgc3Ryb2tlOiBoc2woMCwgMCUsIDcwJSk7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KICAgICAgLnNlcmllcy5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqCiAqIFRPRE86IFNpbXBsaWZ5IHRoaXMgYnkgYXBwbHlpbmcgYSBzdGFibGUgY2xhc3MgbmFtZSB0byBhbGwgPGc+CiAqIGVsZW1lbnRzIHRoYXQgY3VycmVudGx5IGhhdmUgZWl0aGVyIHRoZSBub2Rlc2hhcGUgb3IgYW5ub3RhdGlvbi1ub2RlIGNsYXNzZXMuCiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHVzZSwKICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICAgIHN0cm9rZTogI2NjYzsKICAgICAgfQogICAgICAuc2VyaWVzLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IHVzZSwKICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQogICAgICAuc2VyaWVzLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHVzZSwKICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLnNlcmllcy5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIEJyaWRnZSBOb2RlIC0tLSAqLwogICAgICAuYnJpZGdlID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogI2YwZjsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogLS0tIFN0cnVjdHVyYWwgRWxlbWVudHMgLS0tICovCiAgICAgIC5lZGdlID4gcGF0aC5lZGdlbGluZS5zdHJ1Y3R1cmFsIHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFJlZmVyZW5jZSBFZGdlICovCiAgICAgIC5lZGdlID4gcGF0aC5lZGdlbGluZS5yZWZlcmVuY2VlZGdlIHsKICAgICAgICBzdHJva2U6ICNmZmI3NGQ7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlcyAtLS0gKi8KCiAgICAgIC8qIEhpZGUgdGhlIHJlY3QgZm9yIGEgc2VyaWVzJyBhbm5vdGF0aW9uLiAqLwogICAgICAuc2VyaWVzID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBOb2RlIGxhYmVsIC0tLSAqLwoKICAgICAgLm5vZGUgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZpbGw6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5tZXRhLmV4cGFuZGVkID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICB9CgogICAgICAuc2VyaWVzID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogOHB4OwogICAgICB9CgogICAgICAub3AgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiA2cHg7CiAgICAgIH0KCiAgICAgIC5icmlkZ2UgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLm5vZGUubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBjdXJzb3I6IG5vcm1hbDsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IHRleHQuYW5ub3RhdGlvbi1sYWJlbCB7CiAgICAgICAgZmlsbDogIzUwYTNmNzsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24ubWV0YS5zZWxlY3RlZCA+IHRleHQuYW5ub3RhdGlvbi1sYWJlbCB7CiAgICAgICAgZmlsbDogIzQyODVmNDsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb24gLS0tICovCgogICAgICAvKiBvbmx5IGFwcGxpZWQgZm9yIGFubm90YXRpb25zIHRoYXQgYXJlIG5vdCBzdW1tYXJ5IG9yIGNvbnN0YW50LgooLnN1bW1hcnksIC5jb25zdGFudCBnZXRzIG92ZXJyaWRkZW4gYmVsb3cpICovCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEsIDE7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLnN1bW1hcnkgPiAuYW5ub3RhdGlvbi1ub2RlID4gKiwKICAgICAgLmFubm90YXRpb24uY29uc3RhbnQgPiAuYW5ub3RhdGlvbi1ub2RlID4gKiB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxOwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2U6ICNhYWE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAwLjU7CiAgICAgICAgbWFya2VyLWVuZDogdXJsKCNhbm5vdGF0aW9uLWFycm93aGVhZCk7CiAgICAgIH0KCiAgICAgIC5mYWRlZCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UucmVmbGluZSB7CiAgICAgICAgbWFya2VyLXN0YXJ0OiB1cmwoI3JlZi1hbm5vdGF0aW9uLWFycm93aGVhZCk7CiAgICAgIH0KCiAgICAgIC5mYWRlZCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UucmVmbGluZSB7CiAgICAgICAgbWFya2VyLXN0YXJ0OiB1cmwoI3JlZi1hbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCk7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tY29udHJvbC1lZGdlIHsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCB7CiAgICAgICAgZmlsbDogI2UwZDRiMzsKICAgICAgfQoKICAgICAgI3JlZi1hbm5vdGF0aW9uLWFycm93aGVhZCB7CiAgICAgICAgZmlsbDogI2FhYTsKICAgICAgfQoKICAgICAgI3JlZi1hbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCB7CiAgICAgICAgZmlsbDogI2UwZDRiMzsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwuYW5ub3RhdGlvbi1lbGxpcHNpcyB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAvKiBIaWRlIGFubm90YXRpb25zIG9uIGV4cGFuZGVkIG1ldGEgbm9kZXMgc2luY2UgdGhleSdyZSByZWR1bmRhbnQuICovCiAgICAgIC5leHBhbmRlZCA+IC5pbi1hbm5vdGF0aW9ucywKICAgICAgLmV4cGFuZGVkID4gLm91dC1hbm5vdGF0aW9ucyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IENvbnN0YW50IC0tLSAqLwoKICAgICAgLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICM4NDg0ODQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgfQoKICAgICAgLmNvbnN0YW50LmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIHN0cm9rZS13aWR0aDogMS41OwogICAgICB9CgogICAgICAvKiAtLS0gQW5ub3RhdGlvbjogU3VtbWFyeSAtLS0gKi8KCiAgICAgIC5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjZGI0NDM3OwogICAgICAgIHN0cm9rZTogI2RiNDQzNzsKICAgICAgfQoKICAgICAgLnN1bW1hcnkuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogI2E1MjcxNDsKICAgICAgICBzdHJva2U6ICNhNTI3MTQ7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIHN0cm9rZS13aWR0aDogMS41OwogICAgICB9CgogICAgICAvKiAtLS0gRWRnZSAtLS0gKi8KCiAgICAgIC5lZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2U6ICNiYmI7CiAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogMC43NTsKICAgICAgfQoKICAgICAgLmVkZ2UgLnNlbGVjdGFibGVlZGdlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5zZWxlY3RlZGVkZ2UgPiBwYXRoLmVkZ2VsaW5lIHsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgc3Ryb2tlOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZS5zZWxlY3RlZGVkZ2UgdGV4dCB7CiAgICAgICAgZmlsbDogIzAwMDsKICAgICAgfQoKICAgICAgLyogTGFiZWxzIHNob3dpbmcgdGVuc29yIHNoYXBlcyBvbiBlZGdlcyAqLwogICAgICAuZWRnZSA+IHRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMy41cHg7CiAgICAgICAgZmlsbDogIzY2NjsKICAgICAgfQoKICAgICAgLmRhdGFmbG93LWFycm93aGVhZCB7CiAgICAgICAgZmlsbDogI2JiYjsKICAgICAgfQoKICAgICAgLnJlZmVyZW5jZS1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNmZmI3NGQ7CiAgICAgIH0KCiAgICAgIC5zZWxlY3RlZC1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNmMDA7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5jb250cm9sLWRlcCB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMiwgMjsKICAgICAgfQoKICAgICAgLyogLS0tIEdyb3VwIG5vZGUgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbiAtLS0gKi8KCiAgICAgIC8qIEhpZGVzIGV4cGFuZC9jb2xsYXBzZSBidXR0b25zIHdoZW4gYSBub2RlIGlzbid0IGV4cGFuZGVkIG9yIGhpZ2hsaWdodGVkLiBVc2luZwogICBpbmNyZWRpYmx5IHNtYWxsIG9wYWNpdHkgc28gdGhhdCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSA8Zz4gcGFyZW50IHN0aWxsIHRha2VzCiAgIHRoaXMgY29udGFpbmVyIGludG8gYWNjb3VudCBldmVuIHdoZW4gaXQgaXNuJ3QgdmlzaWJsZSAqLwogICAgICAubm9kZTpub3QoLmhpZ2hsaWdodGVkKTpub3QoLmV4cGFuZGVkKSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBvcGFjaXR5OiAwLjAxOwogICAgICB9CiAgICAgIC5ub2RlLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlIHsKICAgICAgICBmaWxsOiAjZTc4MTFkOwogICAgICB9CiAgICAgIC5idXR0b25jaXJjbGU6aG92ZXIgewogICAgICAgIGZpbGw6ICNiOTY3MTc7CiAgICAgIH0KICAgICAgLmV4cGFuZGJ1dHRvbiwKICAgICAgLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBzdHJva2U6IHdoaXRlOwogICAgICB9CiAgICAgIC8qIERvIG5vdCBsZXQgdGhlIHBhdGggZWxlbWVudHMgaW4gdGhlIGJ1dHRvbiB0YWtlIHBvaW50ZXIgZm9jdXMgKi8KICAgICAgLm5vZGUgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24sCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuY29sbGFwc2VidXR0b24gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICAgIC8qIE9ubHkgc2hvdyB0aGUgZXhwYW5kIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBjb2xsYXBzZWQgYW5kIG9ubHkgc2hvdyB0aGUKICAgY29sbGFwc2UgYnV0dG9uIHdoZW4gYSBub2RlIGlzIGV4cGFuZGVkLiAqLwogICAgICAubm9kZS5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmV4cGFuZGJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubm9kZTpub3QoLmV4cGFuZGVkKSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtc3RhdHMgewogICAgICAgIGZvbnQtc2l6ZTogNHB4OwogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbCByZWN0IHsKICAgICAgICBmaWx0ZXI6IHVybCgjaGVhbHRoLXBpbGwtc2hhZG93KTsKICAgICAgICByeDogMzsKICAgICAgICByeTogMzsKICAgICAgfQoKICAgICAgLnRpdGxlQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdG9wOiAyMHB4OwogICAgICB9CgogICAgICAudGl0bGUsCiAgICAgIC5hdXhUaXRsZSwKICAgICAgLmZ1bmN0aW9uTGlicmFyeVRpdGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtaW5pbWFwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDIwcHg7CiAgICAgICAgYm90dG9tOiAyMHB4OwogICAgICB9CgogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CgogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgICBwYWRkaW5nOiA0cHggMTZweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzOTEzZTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJ0aXRsZUNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InRpdGxlIiBjbGFzcz0idGl0bGUiPk1haW4gR3JhcGg8L2Rpdj4KICAgICAgPGRpdiBpZD0iYXV4VGl0bGUiIGNsYXNzPSJhdXhUaXRsZSI+QXV4aWxpYXJ5IE5vZGVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIiBjbGFzcz0iZnVuY3Rpb25MaWJyYXJ5VGl0bGUiPgogICAgICAgIEZ1bmN0aW9ucwogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN2ZyBpZD0ic3ZnIj4KICAgICAgPGRlZnM+CiAgICAgICAgCiAgICAgICAgPHBhdGggaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXNtYWxsIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLW1lZGl1bSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTMiIG1hcmtlcmhlaWdodD0iMTMiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLWxhcmdlIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxNiIgbWFya2VyaGVpZ2h0PSIxNiIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBjbGFzcz0icmVmZXJlbmNlLWFycm93aGVhZCIgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQteGxhcmdlIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIyMCIgbWFya2VyaGVpZ2h0PSIyMCIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIC8+CiAgICAgICAgPC9tYXJrZXI+CgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBjbGFzcz0iZGF0YWZsb3ctYXJyb3doZWFkIiBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIC8+CiAgICAgICAgPC9tYXJrZXI+CgogICAgICAgIAogICAgICAgIDxtYXJrZXIgaWQ9ImFubm90YXRpb24tYXJyb3doZWFkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSI1IiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDUsMi41IEwgMCw1IEwgMCwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgaWQ9ImFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSI1IiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDUsMi41IEwgMCw1IEwgMCwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgaWQ9InJlZi1hbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMCIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSA1LDAgTCAwLDIuNSBMIDUsNSBMIDUsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgCiAgICAgICAgPGVsbGlwc2UgaWQ9Im9wLW5vZGUtc3RhbXAiIHJ4PSI3LjUiIHJ5PSIzIiBzdHJva2U9ImluaGVyaXQiIGZpbGw9ImluaGVyaXQiIC8+CiAgICAgICAgCiAgICAgICAgPGVsbGlwc2UgaWQ9Im9wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIgcng9IjUiIHJ5PSIyIiBzdHJva2U9ImluaGVyaXQiIGZpbGw9ImluaGVyaXQiIC8+CiAgICAgICAgCiAgICAgICAgPGcgaWQ9Im9wLXNlcmllcy12ZXJ0aWNhbC1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI5IiAvPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iNiIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjMiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtaG9yaXpvbnRhbC1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxNiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjEyIiB5PSI0IiAvPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iNCIgLz4KICAgICAgICA8L2c+CiAgICAgICAgCiAgICAgICAgPGcgaWQ9Im9wLXNlcmllcy1hbm5vdGF0aW9uLXN0YW1wIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIgeD0iOSIgeT0iMiIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIgeD0iNyIgeT0iMiIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIgeD0iNSIgeT0iMiIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPHN2ZyBpZD0ic3VtbWFyeS1pY29uIiBmaWxsPSIjODQ4NDg0IiBoZWlnaHQ9IjEyIiB2aWV3Ym94PSIwIDAgMjQgMjQiIHdpZHRoPSIxMiI+CiAgICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICAgIDwvc3ZnPgoKICAgICAgICAKICAgICAgICA8cGF0dGVybiBpZD0icmVjdEhhdGNoIiBwYXR0ZXJudHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgcGF0dGVybnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSIgLz4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPHBhdHRlcm4gaWQ9ImVsbGlwc2VIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgoKICAgICAgICAKICAgICAgICA8ZmlsdGVyIGlkPSJoZWFsdGgtcGlsbC1zaGFkb3ciIHg9Ii00MCUiIHk9Ii00MCUiIHdpZHRoPSIxODAlIiBoZWlnaHQ9IjE4MCUiPgogICAgICAgICAgPGZlZ2F1c3NpYW5ibHVyIGluPSJTb3VyY2VBbHBoYSIgc3RkRGV2aWF0aW9uPSIwLjgiIC8+CiAgICAgICAgICA8ZmVvZmZzZXQgZHg9IjAiIGR5PSIwIiByZXN1bHQ9Im9mZnNldGJsdXIiIC8+CiAgICAgICAgICA8ZmVmbG9vZCBmbG9vZC1jb2xvcj0iIzAwMDAwMCIgLz4KICAgICAgICAgIDxmZWNvbXBvc2l0ZSBpbjI9Im9mZnNldGJsdXIiIG9wZXJhdG9yPSJpbiIgLz4KICAgICAgICAgIDxmZW1lcmdlPgogICAgICAgICAgICA8ZmVtZXJnZW5vZGUgLz4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICAgICAgPC9mZW1lcmdlPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIAogICAgICA8cmVjdCBmaWxsPSJ3aGl0ZSIgd2lkdGg9IjEwMDAwIiBoZWlnaHQ9IjEwMDAwIj48L3JlY3Q+CiAgICAgIDxnIGlkPSJyb290Ij48L2c+CiAgICA8L3N2Zz4KICAgIDx0Zi1ncmFwaC1taW5pbWFwIGlkPSJtaW5pbWFwIj48L3RmLWdyYXBoLW1pbmltYXA+CiAgICA8ZGl2IGlkPSJjb250ZXh0TWVudSIgY2xhc3M9ImNvbnRleHQtbWVudSI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgvdGYtZ3JhcGgtc2NlbmUuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtc2NlbmUiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsbmFtZTpTdHJpbmcsY29sb3JCeTpTdHJpbmcsdHJhY2VJbnB1dHM6Qm9vbGVhbixfaGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U6Qm9vbGVhbixfaXNBdHRhY2hlZDpCb29sZWFuLF96b29tOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCJ9LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9zZWxlY3RlZE5vZGVDaGFuZ2VkIn0saGFuZGxlRWRnZVNlbGVjdGVkOk9iamVjdCxfem9vbWVkOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9vblpvb21DaGFuZ2VkIix2YWx1ZTohMX0sX3pvb21TdGFydENvb3Jkczp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3pvb21UcmFuc2Zvcm06e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9tYXhab29tRGlzdGFuY2VGb3JDbGljazp7dHlwZTpOdW1iZXIsCnZhbHVlOjIwfSx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9uLG1pbmltYXA6T2JqZWN0LF9ub2RlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9hbm5vdGF0aW9uR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9lZGdlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LG1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6OX0sbWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo2fSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250Ont0eXBlOk51bWJlcix2YWx1ZToxMX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MTh9LHByb2dyZXNzOk9iamVjdCxub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCwKaGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXJ9LG9ic2VydmVyczpbIl9jb2xvckJ5Q2hhbmdlZChjb2xvckJ5KSIsIl9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkKHJlbmRlckhpZXJhcmNoeSkiLCJfYW5pbWF0ZUFuZEZpdChfaXNBdHRhY2hlZCwgcmVuZGVySGllcmFyY2h5KSIsIl91cGRhdGVIZWFsdGhQaWxscyhub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4KSIsIl91cGRhdGVJbnB1dFRyYWNlKHRyYWNlSW5wdXRzLCBzZWxlY3RlZE5vZGUpIl0sZ2V0Tm9kZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShhKX0saXNOb2RlRXhwYW5kZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZXhwYW5kZWR9LHNldE5vZGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2J1aWxkKHRoaXMucmVuZGVySGllcmFyY2h5KTt0aGlzLl91cGRhdGVMYWJlbHMoIXRoaXMuX3pvb21lZCl9LHBhblRvTm9kZShhKXt0Zi5ncmFwaC5zY2VuZS5wYW5Ub05vZGUoYSwKdGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tKSYmKHRoaXMuX3pvb21lZD0hMCl9LGdldEdyYXBoU3ZnUm9vdCgpe3JldHVybiB0aGlzLiQuc3ZnfSxnZXRDb250ZXh0TWVudSgpe3JldHVybiB0aGlzLiQuY29udGV4dE1lbnV9LF9yZXNldFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fbm9kZUdyb3VwSW5kZXg9e307dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXg9e307dGhpcy5fZWRnZUdyb3VwSW5kZXg9e307dGhpcy5fdXBkYXRlTGFiZWxzKCExKTtkMy5zZWxlY3QodGhpcy4kLnN2Zykuc2VsZWN0KCIjcm9vdCIpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3RmLmdyYXBoLnNjZW5lLm5vZGUucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuc3ZnKX0sX2J1aWxkOmZ1bmN0aW9uKGEpe3RoaXMudGVtcGxhdGVJbmRleD1hLmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAobGF5b3V0KToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGgubGF5b3V0LmxheW91dFNjZW5lKGEucm9vdCwKdGhpcyl9LmJpbmQodGhpcykpO3RmLmdyYXBoLnV0aWwudGltZSgidGYtZ3JhcGgtc2NlbmUgKGJ1aWxkIHNjZW5lKToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUuYnVpbGRHcm91cChkMy5zZWxlY3QodGhpcy4kLnJvb3QpLGEucm9vdCx0aGlzKTt0Zi5ncmFwaC5zY2VuZS5hZGRHcmFwaENsaWNrTGlzdGVuZXIodGhpcy4kLnN2Zyx0aGlzKTt0aGlzLl91cGRhdGVJbnB1dFRyYWNlKCl9LmJpbmQodGhpcykpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFsdGhQaWxscyh0aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsdGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4KTt0aGlzLm1pbmltYXAudXBkYXRlKCl9LmJpbmQodGhpcyksdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3pvb209ZDMuem9vbSgpLm9uKCJlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVN0YXJ0Q29vcmRzJiYoTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMuX3pvb21TdGFydENvb3Jkcy54LQp0aGlzLl96b29tVHJhbnNmb3JtLngsMikrTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLnktdGhpcy5fem9vbVRyYW5zZm9ybS55LDIpKTx0aGlzLl9tYXhab29tRGlzdGFuY2VGb3JDbGljaz90aGlzLl9maXJlRW5hYmxlQ2xpY2soKTpzZXRUaW1lb3V0KHRoaXMuX2ZpcmVFbmFibGVDbGljay5iaW5kKHRoaXMpLDUwKSk7dGhpcy5fem9vbVN0YXJ0Q29vcmRzPW51bGx9LmJpbmQodGhpcykpLm9uKCJ6b29tIixmdW5jdGlvbigpe3RoaXMuX3pvb21UcmFuc2Zvcm09ZDMuZXZlbnQudHJhbnNmb3JtO3RoaXMuX3pvb21TdGFydENvb3Jkc3x8KHRoaXMuX3pvb21TdGFydENvb3Jkcz10aGlzLl96b29tVHJhbnNmb3JtLHRoaXMuZmlyZSgiZGlzYWJsZS1jbGljayIpKTt0aGlzLl96b29tZWQ9ITA7ZDMuc2VsZWN0KHRoaXMuJC5yb290KS5hdHRyKCJ0cmFuc2Zvcm0iLGQzLmV2ZW50LnRyYW5zZm9ybSk7dGhpcy5taW5pbWFwLnpvb20oZDMuZXZlbnQudHJhbnNmb3JtKX0uYmluZCh0aGlzKSk7CmQzLnNlbGVjdCh0aGlzLiQuc3ZnKS5jYWxsKHRoaXMuX3pvb20pLm9uKCJkYmxjbGljay56b29tIixudWxsKTtkMy5zZWxlY3Qod2luZG93KS5vbigicmVzaXplIixmdW5jdGlvbigpe3RoaXMubWluaW1hcC56b29tKCl9LmJpbmQodGhpcykpO3RoaXMubWluaW1hcD10aGlzLiQubWluaW1hcC5pbml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLm1pbmltYXAuc2l6ZSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLnN1YnNjZW5lLm1ldGEubGFiZWxIZWlnaHQpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITEpfSxfcmVuZGVySGllcmFyY2h5Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZT0hMTt0aGlzLl9yZXNldFN0YXRlKCk7dGhpcy5fYnVpbGQoYSl9LF9hbmltYXRlQW5kRml0OmZ1bmN0aW9uKGEpeyF0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZSYmCmEmJnNldFRpbWVvdXQodGhpcy5maXQuYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LF91cGRhdGVMYWJlbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy4kJCgiLnRpdGxlIiksZD1jLnN0eWxlLGY9dGhpcy4kJCgiLmF1eFRpdGxlIiksZz1mLnN0eWxlLGw9dGhpcy4kJCgiLmZ1bmN0aW9uTGlicmFyeVRpdGxlIikuc3R5bGU7Y29uc3Qgaz1kMy5zZWxlY3QodGhpcy4kLnN2Zyk7dmFyIG09ay5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuQ09SRSkubm9kZSgpO2lmKGEmJm0mJnRoaXMucHJvZ3Jlc3MmJjEwMD09PXRoaXMucHJvZ3Jlc3MudmFsdWUpe2E9ay5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5ub2RlKCl8fGsuc2VsZWN0KCIuIisKdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKS5ub2RlKCk7dmFyIHA9bS5nZXRDVE0oKS5lO209YT9hLmdldENUTSgpLmU6bnVsbDtkLmRpc3BsYXk9ImlubGluZSI7ZC5sZWZ0PXArInB4IjtudWxsIT09bSYmbSE9PXA/KGcuZGlzcGxheT0iaW5saW5lIixtPU1hdGgubWF4KHArYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxtKSxnLmxlZnQ9bSsicHgiKTpnLmRpc3BsYXk9Im5vbmUiO2M9KGM9ay5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkubm9kZSgpKT9jLmdldENUTSgpLmU6bnVsbDtudWxsIT09YyYmYyE9PW0/KGwuZGlzcGxheT0iaW5saW5lIixjPU1hdGgubWF4KG0rZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxjKSxsLmxlZnQ9YysicHgiKToKbC5kaXNwbGF5PSJub25lIn1lbHNlIGQuZGlzcGxheT0ibm9uZSIsZy5kaXNwbGF5PSJub25lIixsLmRpc3BsYXk9Im5vbmUifSxfY29sb3JCeUNoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT10aGlzLnJlbmRlckhpZXJhcmNoeSYmKF8uZWFjaCh0aGlzLl9ub2RlR3JvdXBJbmRleCwoYSxjKT0+e3RoaXMuX3VwZGF0ZU5vZGVTdGF0ZShjKX0pLHRoaXMubWluaW1hcC51cGRhdGUoKSl9LGZpdDpmdW5jdGlvbigpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSEwO3RmLmdyYXBoLnNjZW5lLmZpdCh0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20sZnVuY3Rpb24oKXt0aGlzLl96b29tZWQ9ITF9LmJpbmQodGhpcykpfSxpc05vZGVTZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PXRoaXMuc2VsZWN0ZWROb2RlfSxpc05vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PXRoaXMuaGlnaGxpZ2h0ZWROb2RlfSxhZGRBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYSwKYyxkKXthPWEubm9kZS5uYW1lO3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2FdPXRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2FdfHx7fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFthXVtjLm5vZGUubmFtZV09ZH0sZ2V0QW5ub3RhdGlvbkdyb3Vwc0luZGV4OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFthXX0scmVtb3ZlQW5ub3RhdGlvbkdyb3VwOmZ1bmN0aW9uKGEsYyl7ZGVsZXRlIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2Eubm9kZS5uYW1lXVtjLm5vZGUubmFtZV19LGFkZE5vZGVHcm91cDpmdW5jdGlvbihhLGMpe3RoaXMuX25vZGVHcm91cEluZGV4W2FdPWN9LGdldE5vZGVHcm91cDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fbm9kZUdyb3VwSW5kZXhbYV19LHJlbW92ZU5vZGVHcm91cDpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5fbm9kZUdyb3VwSW5kZXhbYV19LGFkZEVkZ2VHcm91cDpmdW5jdGlvbihhLGMpe3RoaXMuX2VkZ2VHcm91cEluZGV4W2FdPQpjfSxnZXRFZGdlR3JvdXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2VkZ2VHcm91cEluZGV4W2FdfSxfdXBkYXRlSGVhbHRoUGlsbHM6ZnVuY3Rpb24oYSxjKXt0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxscyh0aGlzLiQuc3ZnLGEsYyl9LF91cGRhdGVOb2RlU3RhdGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXROb2RlKGEpLGQ9dGhpcy5nZXROb2RlR3JvdXAoYSk7ZCYmdGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGQsYyx0aGlzKTtjLm5vZGUudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEmJmMubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24mJiFjLmlzTGlicmFyeUZ1bmN0aW9uJiYoZD1kMy5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSsnIGdbZGF0YS1uYW1lXHgzZCInKyh0Zi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKwpjLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uKSsnIl0nKSx0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZCxjLHRoaXMpKTtfLmVhY2godGhpcy5nZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXgoYSksZj0+e3RmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShmLGMsdGhpcyx0Zi5ncmFwaC5zY2VuZS5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpfSl9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7aWYoYSE9PWMmJihjJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYyksYSkpe3RoaXMubWluaW1hcC51cGRhdGUoKTtjPXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5ub2RlKGEpO2Zvcih2YXIgZD1bXTtudWxsIT1jLnBhcmVudE5vZGUmJmMucGFyZW50Tm9kZS5uYW1lIT10Zi5ncmFwaC5ST09UX05BTUU7KWM9Yy5wYXJlbnROb2RlLGQucHVzaChjLm5hbWUpO3ZhciBmO18uZm9yRWFjaFJpZ2h0KGQsZz0+e3RoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGcpOwpnPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoZyk7Zy5ub2RlLmlzR3JvdXBOb2RlJiYhZy5leHBhbmRlZCYmKGcuZXhwYW5kZWQ9ITAsZnx8KGY9ZykpfSk7ZiYmKHRoaXMuc2V0Tm9kZUV4cGFuZGVkKGYpLHRoaXMuX3pvb21lZD0hMCk7YSYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGEpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLnBhblRvTm9kZShhKX0sdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfX0sX2hpZ2hsaWdodGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYSxjKXthIT09YyYmKGEmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShhKSxjJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYykpfSxfb25ab29tQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0sX2ZpcmVFbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZW5hYmxlLWNsaWNrIil9LF91cGRhdGVJbnB1dFRyYWNlOmZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUubm9kZS51cGRhdGVJbnB1dFRyYWNlKHRoaXMuZ2V0R3JhcGhTdmdSb290KCksCnRoaXMucmVuZGVySGllcmFyY2h5LHRoaXMuc2VsZWN0ZWROb2RlLHRoaXMudHJhY2VJbnB1dHMpfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgfQoKICAgICAgLnZlcnRpY2FsIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICAuYXV0byB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJ2ZXJ0aWNhbCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3RpdGxlXV0iPgogICAgICAgICAgPGgyPltbdGl0bGVdXTwvaDI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGYtZ3JhcGgtc2NlbmUgaWQ9InNjZW5lIiBjbGFzcz0iYXV0byIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgaGlnaGxpZ2h0ZWQtbm9kZT0iW1tfZ2V0VmlzaWJsZShoaWdobGlnaHRlZE5vZGUpXV0iIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iIHNlbGVjdGVkLWVkZ2U9Int7c2VsZWN0ZWRFZGdlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgcHJvZ3Jlc3M9IltbcHJvZ3Jlc3NdXSIgbm9kZS1jb250ZXh0LW1lbnUtaXRlbXM9Iltbbm9kZUNvbnRleHRNZW51SXRlbXNdXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIgaGFuZGxlLWVkZ2Utc2VsZWN0ZWQ9IltbaGFuZGxlRWRnZVNlbGVjdGVkXV0iIHRyYWNlLWlucHV0cz0iW1t0cmFjZUlucHV0c11dIj48L3RmLWdyYXBoLXNjZW5lPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC90Zi1ncmFwaC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaCIscHJvcGVydGllczp7Z3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2dyYXBoQ2hhbmdlZCJ9LGJhc2ljR3JhcGg6T2JqZWN0LHN0YXRzOk9iamVjdCxkZXZpY2VzRm9yU3RhdHM6T2JqZWN0LGhpZXJhcmNoeVBhcmFtczpPYmplY3QscHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sdGl0bGU6U3RyaW5nLHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZEVkZ2U6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX2xhc3RTZWxlY3RlZEVkZ2VHcm91cDpPYmplY3QsaGlnaGxpZ2h0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkT25seTohMH0scmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LHRyYWNlSW5wdXRzOkJvb2xlYW4sCm5vZGVDb250ZXh0TWVudUl0ZW1zOkFycmF5LF9yZW5kZXJEZXB0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2FsbG93R3JhcGhTZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsaGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXIsZWRnZVdpZHRoRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOiIifSxoYW5kbGVOb2RlU2VsZWN0ZWQ6e3R5cGU6T2JqZWN0LHZhbHVlOiIifSxlZGdlTGFiZWxGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGhhbmRsZUVkZ2VTZWxlY3RlZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9fSxvYnNlcnZlcnM6WyJfc3RhdHNDaGFuZ2VkKHN0YXRzLCBkZXZpY2VzRm9yU3RhdHMpIiwiX2J1aWxkTmV3UmVuZGVySGllcmFyY2h5KGdyYXBoSGllcmFyY2h5LCBlZGdlV2lkdGhGdW5jdGlvbiwgaGFuZGxlTm9kZVNlbGVjdGVkLCBlZGdlTGFiZWxGdW5jdGlvbiwgaGFuZGxlRWRnZVNlbGVjdGVkKSIsIl9zZWxlY3RlZE5vZGVDaGFuZ2VkKHNlbGVjdGVkTm9kZSkiLAoiX3NlbGVjdGVkRWRnZUNoYW5nZWQoc2VsZWN0ZWRFZGdlKSJdLHBhblRvTm9kZShhKXt0aGlzLiQkKCJ0Zi1ncmFwaC1zY2VuZSIpLnBhblRvTm9kZShhKX0sX2J1aWxkTmV3UmVuZGVySGllcmFyY2h5KGEpe2EmJnRoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KGEpfSxfc3RhdHNDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dGhpcy5ncmFwaEhpZXJhcmNoeSYmKGEmJmMmJih0Zi5ncmFwaC5qb2luU3RhdHNJbmZvV2l0aEdyYXBoKHRoaXMuYmFzaWNHcmFwaCxhLGMpLHRmLmdyYXBoLmhpZXJhcmNoeS5qb2luQW5kQWdncmVnYXRlU3RhdHModGhpcy5ncmFwaEhpZXJhcmNoeSkpLHRoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KHRoaXMuZ3JhcGhIaWVyYXJjaHkpKX0sX2J1aWxkUmVuZGVySGllcmFyY2h5OmZ1bmN0aW9uKGEpe3RmLmdyYXBoLnV0aWwudGltZSgibmV3IHRmLmdyYXBoLnJlbmRlci5IaWVyYXJjaHkiLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYyhmKXtyZXR1cm57bWluVmFsdWU6Zi5kb21haW4oKVswXSwKbWF4VmFsdWU6Zi5kb21haW4oKVsxXSxzdGFydENvbG9yOmYucmFuZ2UoKVswXSxlbmRDb2xvcjpmLnJhbmdlKClbMV19fWlmKGEucm9vdC50eXBlPT09dGYuZ3JhcGguTm9kZVR5cGUuTUVUQSl7dmFyIGQ9bmV3IHRmLmdyYXBoLnJlbmRlci5SZW5kZXJHcmFwaEluZm8oYSwhIXRoaXMuc3RhdHMpO2QuZWRnZUxhYmVsRnVuY3Rpb249dGhpcy5lZGdlTGFiZWxGdW5jdGlvbjtkLmVkZ2VXaWR0aEZ1bmN0aW9uPXRoaXMuZWRnZVdpZHRoRnVuY3Rpb247dGhpcy5fc2V0Q29sb3JCeVBhcmFtcyh7Y29tcHV0ZV90aW1lOmMoZC5jb21wdXRlVGltZVNjYWxlKSxtZW1vcnk6YyhkLm1lbW9yeVVzYWdlU2NhbGUpLGRldmljZTpfLm1hcChkLmRldmljZUNvbG9yTWFwLmRvbWFpbigpLGZ1bmN0aW9uKGYpe3JldHVybntkZXZpY2U6Zixjb2xvcjpkLmRldmljZUNvbG9yTWFwKGYpfX0pLHhsYV9jbHVzdGVyOl8ubWFwKGQueGxhQ2x1c3RlckNvbG9yTWFwLmRvbWFpbigpLGZ1bmN0aW9uKGYpe3JldHVybnt4bGFfY2x1c3RlcjpmLApjb2xvcjpkLnhsYUNsdXN0ZXJDb2xvck1hcChmKX19KX0pO3RoaXMuX3NldFJlbmRlckhpZXJhcmNoeShkKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJyZW5kZXJlZCIpfSl9fS5iaW5kKHRoaXMpKX0sX2dldFZpc2libGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0TmVhcmVzdFZpc2libGVBbmNlc3RvcihhKTphfSxsaXN0ZW5lcnM6eyJncmFwaC1zZWxlY3QiOiJfZ3JhcGhTZWxlY3RlZCIsImRpc2FibGUtY2xpY2siOiJfZGlzYWJsZUNsaWNrIiwiZW5hYmxlLWNsaWNrIjoiX2VuYWJsZUNsaWNrIiwibm9kZS10b2dnbGUtZXhwYW5kIjoiX25vZGVUb2dnbGVFeHBhbmQiLCJub2RlLXNlbGVjdCI6Il9ub2RlU2VsZWN0ZWQiLCJub2RlLWhpZ2hsaWdodCI6Il9ub2RlSGlnaGxpZ2h0ZWQiLCJub2RlLXVuaGlnaGxpZ2h0IjoiX25vZGVVbmhpZ2hsaWdodGVkIiwibm9kZS10b2dnbGUtZXh0cmFjdCI6Il9ub2RlVG9nZ2xlRXh0cmFjdCIsCiJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCI6Il9ub2RlVG9nZ2xlU2VyaWVzR3JvdXAiLCJlZGdlLXNlbGVjdCI6Il9lZGdlU2VsZWN0ZWQiLCJhbm5vdGF0aW9uLXNlbGVjdCI6Il9ub2RlU2VsZWN0ZWQiLCJhbm5vdGF0aW9uLWhpZ2hsaWdodCI6Il9ub2RlSGlnaGxpZ2h0ZWQiLCJhbm5vdGF0aW9uLXVuaGlnaGxpZ2h0IjoiX25vZGVVbmhpZ2hsaWdodGVkIn0sZml0OmZ1bmN0aW9uKCl7dGhpcy4kLnNjZW5lLmZpdCgpfSxfZ3JhcGhDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJncmFwaC1zZWxlY3QiKX0sX2dyYXBoU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiYodGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsbnVsbCksdGhpcy5zZXQoInNlbGVjdGVkRWRnZSIsbnVsbCkpO3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITB9LF9kaXNhYmxlQ2xpY2s6ZnVuY3Rpb24oKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSExfSxfZW5hYmxlQ2xpY2s6ZnVuY3Rpb24oKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PQohMH0sX3NlbGVjdGVkTm9kZUNoYW5nZWQoYSl7dGhpcy5oYW5kbGVOb2RlU2VsZWN0ZWQmJnRoaXMuaGFuZGxlTm9kZVNlbGVjdGVkKGEpfSxfc2VsZWN0ZWRFZGdlQ2hhbmdlZChhKXt0aGlzLl9kZXNlbGVjdFByZXZpb3VzRWRnZSgpO2EmJih0aGlzLl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAuY2xhc3NlZCh0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVELCEwKSx0aGlzLl91cGRhdGVNYXJrZXJPZlNlbGVjdGVkRWRnZShhKSk7dGhpcy5oYW5kbGVFZGdlU2VsZWN0ZWQmJnRoaXMuaGFuZGxlRWRnZVNlbGVjdGVkKGEpfSxfbm9kZVNlbGVjdGVkOmZ1bmN0aW9uKGEpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJnRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLGEuZGV0YWlsLm5hbWUpO3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITB9LF9lZGdlU2VsZWN0ZWQoYSl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmKHRoaXMuc2V0KCJfbGFzdFNlbGVjdGVkRWRnZUdyb3VwIixhLmRldGFpbC5lZGdlR3JvdXApLAp0aGlzLnNldCgic2VsZWN0ZWRFZGdlIixhLmRldGFpbC5lZGdlRGF0YSkpO3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITB9LF9ub2RlSGlnaGxpZ2h0ZWQ6ZnVuY3Rpb24oYSl7dGhpcy5zZXQoImhpZ2hsaWdodGVkTm9kZSIsYS5kZXRhaWwubmFtZSl9LF9ub2RlVW5oaWdobGlnaHRlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJoaWdobGlnaHRlZE5vZGUiLG51bGwpfSxfbm9kZVRvZ2dsZUV4cGFuZDpmdW5jdGlvbihhKXt0aGlzLl9ub2RlU2VsZWN0ZWQoYSk7YT1hLmRldGFpbC5uYW1lO3ZhciBjPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoYSk7Yy5ub2RlLnR5cGUhPT10Zi5ncmFwaC5Ob2RlVHlwZS5PUCYmKHRoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGEpLGMuZXhwYW5kZWQ9IWMuZXhwYW5kZWQsdGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuJC5zY2VuZS5zZXROb2RlRXhwYW5kZWQoYyl9LDc1KSl9LF9ub2RlVG9nZ2xlRXh0cmFjdDpmdW5jdGlvbihhKXt0aGlzLm5vZGVUb2dnbGVFeHRyYWN0KGEuZGV0YWlsLm5hbWUpfSwKbm9kZVRvZ2dsZUV4dHJhY3Q6ZnVuY3Rpb24oYSl7YT10aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKGEpO2Eubm9kZS5pbmNsdWRlPWEubm9kZS5pbmNsdWRlPT10Zi5ncmFwaC5JbmNsdXNpb25UeXBlLklOQ0xVREU/dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFOmEubm9kZS5pbmNsdWRlPT10Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU/dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5JTkNMVURFOnRoaXMucmVuZGVySGllcmFyY2h5LmlzTm9kZUF1eGlsaWFyeShhKT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLklOQ0xVREU6dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFO3RoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KHRoaXMuZ3JhcGhIaWVyYXJjaHkpfSxfbm9kZVRvZ2dsZVNlcmllc0dyb3VwOmZ1bmN0aW9uKGEpe3RoaXMubm9kZVRvZ2dsZVNlcmllc0dyb3VwKGEuZGV0YWlsLm5hbWUpfSxub2RlVG9nZ2xlU2VyaWVzR3JvdXA6ZnVuY3Rpb24oYSl7dGYuZ3JhcGgudG9nZ2xlTm9kZVNlcmllc0dyb3VwKHRoaXMuaGllcmFyY2h5UGFyYW1zLnNlcmllc01hcCwKYSk7dGhpcy5zZXQoInByb2dyZXNzIix7dmFsdWU6MCxtc2c6IiJ9KTt0Zi5ncmFwaC5oaWVyYXJjaHkuYnVpbGQodGhpcy5iYXNpY0dyYXBoLHRoaXMuaGllcmFyY2h5UGFyYW1zLHRmLmdyYXBoLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIodGYuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpLDEwMCwiTmFtZXNwYWNlIGhpZXJhcmNoeSIpKS50aGVuKGZ1bmN0aW9uKGMpe3RoaXMuc2V0KCJncmFwaEhpZXJhcmNoeSIsYyk7dGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSl9LmJpbmQodGhpcykpfSxfZGVzZWxlY3RQcmV2aW91c0VkZ2UoKXtkMy5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQpLmNsYXNzZWQodGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCwhMSkuZWFjaChhPT57aWYoYS5sYWJlbCl7Y29uc3QgYz1kMy5zZWxlY3QodGhpcykuc2VsZWN0QWxsKCJwYXRoLmVkZ2VsaW5lIik7YS5sYWJlbC5zdGFydE1hcmtlcklkJiYKYy5zdHlsZSgibWFya2VyLXN0YXJ0IixgdXJsKCMke2EubGFiZWwuc3RhcnRNYXJrZXJJZH0pYCk7YS5sYWJlbC5lbmRNYXJrZXJJZCYmYy5zdHlsZSgibWFya2VyLWVuZCIsYHVybCgjJHthLmxhYmVsLmVuZE1hcmtlcklkfSlgKX19KX0sX3VwZGF0ZU1hcmtlck9mU2VsZWN0ZWRFZGdlKGEpe2lmKGEubGFiZWwpe3ZhciBjPWEubGFiZWwuc3RhcnRNYXJrZXJJZHx8YS5sYWJlbC5lbmRNYXJrZXJJZDtpZihjKXtjb25zdCBkPWMucmVwbGFjZSgiZGF0YWZsb3ctIiwic2VsZWN0ZWQtIik7bGV0IGY9dGhpcy4kJCgiIyIrZCk7Znx8KGM9dGhpcy4kLnNjZW5lLnF1ZXJ5U2VsZWN0b3IoIiMiK2MpLGY9Yy5jbG9uZU5vZGUoITApLGYuc2V0QXR0cmlidXRlKCJpZCIsZCksZi5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZC1hcnJvd2hlYWQiKSxjLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZikpO2E9YS5sYWJlbC5zdGFydE1hcmtlcklkPyJtYXJrZXItc3RhcnQiOiJtYXJrZXItZW5kIjt0aGlzLl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAuc2VsZWN0QWxsKCJwYXRoLmVkZ2VsaW5lIikuc3R5bGUoYSwKYHVybCgjJHtkfSlgKX19fSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIWF9fSk7Cjwvc2NyaXB0PgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWxvYWRlciI+IDwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1sb2FkZXIvdGYtZ3JhcGgtbG9hZGVyLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLWxvYWRlciIscHJvcGVydGllczp7ZGF0YXNldHM6QXJyYXksc2VsZWN0ZWREYXRhOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWxlY3RlZEZpbGU6T2JqZWN0LGNvbXBhdGliaWxpdHlQcm92aWRlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBhLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcn0sb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG91dEdyYXBoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dEdyYXBoOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dEhpZXJhcmNoeVBhcmFtczp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX2xvYWREYXRhKGRhdGFzZXRzLCBzZWxlY3RlZERhdGEsIG92ZXJyaWRpbmdIaWVyYXJjaHlQYXJhbXMsIGNvbXBhdGliaWxpdHlQcm92aWRlcikiLAoiX2xvYWRGaWxlKHNlbGVjdGVkRmlsZSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSJdLF9sb2FkRGF0YSgpe3RoaXMuZGVib3VuY2UoImxvYWQiLCgpPT57Y29uc3QgZD10aGlzLmRhdGFzZXRzW3RoaXMuc2VsZWN0ZWREYXRhXTtkJiZ0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKGQucGF0aCl9KX0sX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZCxmKXtjb25zdCB7b3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtczpnLGNvbXBhdGliaWxpdHlQcm92aWRlcjpsfT10aGlzO3RoaXMucHJvZ3Jlc3M9e3ZhbHVlOjAsbXNnOiIifTtjb25zdCBrPWEuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpLG09T2JqZWN0LmFzc2lnbih7fSxhLmdyYXBoLmhpZXJhcmNoeS5EZWZhdWx0SGllcmFyY2h5UGFyYW1zLGcpO2EuZ3JhcGgubG9hZGVyLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoaywKZCxmLGwsbSkudGhlbigoe2dyYXBoOnAsZ3JhcGhIaWVyYXJjaHk6cX0pPT57dGhpcy5fc2V0T3V0SGllcmFyY2h5UGFyYW1zKG0pO3RoaXMuX3NldE91dEdyYXBoKHApO3RoaXMuX3NldE91dEdyYXBoSGllcmFyY2h5KHEpfSl9LF9sb2FkRmlsZShkKXtpZihkKXtkPWQudGFyZ2V0O3ZhciBmPWQuZmlsZXNbMF07ZiYmKGQudmFsdWU9IiIsdGhpcy5fcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChudWxsLGYpKX19fSl9KShjLmxvYWRlcnx8KGMubG9hZGVyPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwo8L3NjcmlwdD4KCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvaGVhbHRoLXBpbGxzLmpzCnZhciBpbTsKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZyxsKXtpZihudWxsPT1nKXRocm93IEVycm9yKGBNaXNzaW5nIHJlZlZhbHVlIGZvciBjb25kaXRpb24gKCR7bH0pLmApO31mdW5jdGlvbiBkKGcpe3JldHVybiBudWxsPT1nfHwwPT1nLmxlbmd0aHx8MSE9PWdbMF19Y29uc3QgZj17SU5GX09SX05BTjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zICsvLVx1MjIxZSBvciBOYU4iLHByZWRpY2F0ZTpnPT4wPGdbMl18fDA8Z1szXXx8MDxnWzddfSxJTkY6e2Rlc2NyaXB0aW9uOiJDb250YWlucyArLy1cdTIyMWUiLHByZWRpY2F0ZTpnPT4wPGdbM118fDA8Z1s3XX0sTkFOOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgTmFOIixwcmVkaWNhdGU6Zz0+MDxnWzJdfSxNQVhfR1Q6e2Rlc2NyaXB0aW9uOiJNYXggXHgzZSIscHJlZGljYXRlOihnLGwpPT57YyhsLCJNQVhfR1QiKTtyZXR1cm4gZ1s5XT5sfX0sTUFYX0xUOntkZXNjcmlwdGlvbjoiTWF4IFx4M2MiLHByZWRpY2F0ZTooZyxsKT0+e2MobCwiTUFYX0xUIik7CnJldHVybiBnWzldPGx9fSxNSU5fR1Q6e2Rlc2NyaXB0aW9uOiJNaW4gXHgzZSIscHJlZGljYXRlOihnLGwpPT57YyhsLCJNSU5fR1QiKTtyZXR1cm4gZ1s4XT5sfX0sTUlOX0xUOntkZXNjcmlwdGlvbjoiTWluIFx4M2MiLHByZWRpY2F0ZTooZyxsKT0+e2MobCwiTUlOX0xUIik7cmV0dXJuIGdbOF08bH19LE1FQU5fR1Q6e2Rlc2NyaXB0aW9uOiJNZWFuIFx4M2UiLHByZWRpY2F0ZTooZyxsKT0+e2MobCwiTUVBTl9HVCIpO3JldHVybiBnWzEwXT5sfX0sTUVBTl9MVDp7ZGVzY3JpcHRpb246Ik1lYW4gXHgzYyIscHJlZGljYXRlOihnLGwpPT57YyhsLCJNRUFOX0xUIik7cmV0dXJuIGdbMTBdPGx9fSxSQU5HRV9HVDp7ZGVzY3JpcHRpb246Ik1heCAtIE1pbiBceDNlIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIlJBTkdFX0dUIik7cmV0dXJuIGdbOV0tZ1s4XT5sfX0sUkFOR0VfTFQ6e2Rlc2NyaXB0aW9uOiJNYXggLSBNaW4gXHgzYyIscHJlZGljYXRlOihnLGwpPT57YyhsLCJSQU5HRV9MVCIpOwpyZXR1cm4gZ1s5XS1nWzhdPGx9fSxTVERERVZfR1Q6e2Rlc2NyaXB0aW9uOiJTdGFuZGFyZCBkZXZpYXRpb24gXHgzZSIscHJlZGljYXRlOihnLGwpPT57YyhsLCJTVERERVZfR1QiKTtyZXR1cm4gTWF0aC5zcXJ0KGdbMTFdKT5sfX0sU1REREVWX0xUOntkZXNjcmlwdGlvbjoiU3RhbmRhcmQgZGV2aWF0aW9uIFx4M2MiLHByZWRpY2F0ZTooZyxsKT0+e2MobCwiU1REREVWX0xUIik7cmV0dXJuIE1hdGguc3FydChnWzExXSk8bH19fTthLnRlbnNvckNvbmRpdGlvbkRlc2NyaXB0aW9uMktleT1mdW5jdGlvbihnKXtmb3IoY29uc3QgbCBpbiBmKWlmKGYuaGFzT3duUHJvcGVydHkobCkmJmZbbF0uZGVzY3JpcHRpb249PT1nKXJldHVybiBsO3JldHVybiBudWxsfTthLmNoZWNrSGVhbHRoUGlsbEFnYWluc3RUZW5zb3JDb25kaXRpb25LZXk9ZnVuY3Rpb24oZyxsLGspe2lmKGQobCkpcmV0dXJuITE7Zz1mW2ddLnByZWRpY2F0ZTtyZXR1cm4gZyhsLGspfX0pKGltfHwoaW09e30pKTsKPC9zY3JpcHQ+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1jb250aW51ZS1kaWFsb2ciLHByb3BlcnRpZXM6e2NvbnRpbnVlTnVtOnt0eXBlOk51bWJlcix2YWx1ZTo1fSxzZXNzaW9uUnVuR286RnVuY3Rpb24sdGVuc29yQ29uZGl0aW9uR286RnVuY3Rpb24sZm9yY2VDb250aW51YXRpb25TdG9wOkZ1bmN0aW9uLF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LF9jb250aW51ZUJ1dHRvbkNvbnRpbnVlVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IkNvbnRpbnVlLi4uIixyZWFkb25seTohMH0sX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJTdG9wIENvbnRpbnVhdGlvbiIscmVhZG9ubHk6ITB9LF9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbjpTdHJpbmcsX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sX2lzUmVmVmFsdWVJbnB1dEhpZGRlbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLApub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfb25TZWxlY3RlZFRlbnNvckNvbmRpdGlvbkNoYW5nZWQoX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKSJdLG5vdGlmeUNvbnRpbnVhdGlvblN0b3AoKXt0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMSl9LF9vcGVuRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLm9wZW4oKX0sX2Nsb3NlRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLmNsb3NlKCl9LF9jb250aW51ZUJ1dHRvbkNhbGxiYWNrKCl7dGhpcy5fY29udGludWVCdXR0b25UZXh0PT09dGhpcy5fY29udGludWVCdXR0b25TdG9wVGV4dD90aGlzLmZvcmNlQ29udGludWF0aW9uU3RvcCgpOnRoaXMuX29wZW5EaWFsb2coKX0sdXBkYXRlQ29udGludWVCdXR0b25UZXh0KGEpe3RoaXMuc2V0KCJfY29udGludWVCdXR0b25UZXh0IixhP3RoaXMuX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6dGhpcy5fY29udGludWVCdXR0b25Db250aW51ZVRleHQpfSxfc2Vzc2lvblJ1bkdvQnV0dG9uQ2FsbGJhY2soKXswPAp0aGlzLmNvbnRpbnVlTnVtPyh0aGlzLnNlc3Npb25SdW5Hbyh0aGlzLmNvbnRpbnVlTnVtKSx0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMCksdGhpcy5fY2xvc2VEaWFsb2coKSk6dGhpcy5zZXQoImNvbnRpbnVlTnVtIiwxKX0sX3RlbnNvckNvbnRpbnVlR29CdXR0b25DYWxsYmFjaygpe2lmKG51bGwhPXRoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKXt2YXIgYT1pbS50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXkodGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO251bGw9PWEmJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgVGVuc29yIENvbmRpdGlvbiBuYW1lOiIrdGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO3ZhciBjPU51bWJlcih0aGlzLl90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZSk7TnVtYmVyLmlzRmluaXRlKGMpPyh0aGlzLnRlbnNvckNvbmRpdGlvbkdvKGEsYyksdGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApLHRoaXMuX2Nsb3NlRGlhbG9nKCkpOgp0aGlzLnNldCgiX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlIiwwKX19LF9vblNlbGVjdGVkVGVuc29yQ29uZGl0aW9uQ2hhbmdlZChhKXthPWltLnRlbnNvckNvbmRpdGlvbkRlc2NyaXB0aW9uMktleShhKTt0aGlzLnNldCgiX2lzUmVmVmFsdWVJbnB1dEhpZGRlbiIsLTEhPT1bIklORl9PUl9OQU4iLCJJTkYiLCJOQU4iXS5pbmRleE9mKGEpKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kZWJ1Z2dlci1pbml0aWFsLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX29wZW5dXSI+CiAgICAgIDxkaXYgaWQ9ImRhc2hib2FyZC1iYWNrZHJvcCI+PC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGlhbG9nIiBuby1jYW5jZWwtb24tb3V0c2lkZS1jbGljayBuby1jYW5jZWwtb24tZXNjLWtleSBvcGVuZWQ9Int7X29wZW59fSI+CiAgICAgIDxoMiBpZD0iZGlhbG9nLXRpdGxlIj5bW190aXRsZV1dPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImN1c3RvbS1tZXNzYWdlIj5bW19jdXN0b21NZXNzYWdlXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzQ3VzdG9tTWVzc2FnZV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbi10aXRsZSI+CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL1Nlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPnRmLlNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKc2VzcyA9IHRmLlNlc3Npb24oKQpzZXNzID0gdGZfZGVidWcuVGVuc29yQm9hcmREZWJ1Z1dyYXBwZXJTZXNzaW9uKHNlc3MsICJbW19ob3N0XV06W1tfcG9ydF1dIikKc2Vzcy5ydW4obXlfZmV0Y2hlcykKICAgICAgICAgIDwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9wcm9ncmFtbWVyc19ndWlkZS9lc3RpbWF0b3JzIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj5Fc3RpbWF0b3I8L2E+CiAgICAgICAgICAgICAgfAogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi90cmFpbi9Nb25pdG9yZWRTZXNzaW9uIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj5Nb25pdG9yZWRTZXNzaW9uPC9hPjoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUtc25pcHBldCI+aW1wb3J0IHRlbnNvcmZsb3cgYXMgdGYKZnJvbSB0ZW5zb3JmbG93LnB5dGhvbiBpbXBvcnQgZGVidWcgYXMgdGZfZGVidWcKCmhvb2sgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnSG9vaygiW1tfaG9zdF1dOltbX3BvcnRdXSIpCm15X2VzdGltYXRvci5maXQoeD14X2RhdGEsIHk9eV9kYXRhLCBzdGVwcz0xMDAwLCBtb25pdG9ycz1baG9va10pCiAgICAgICAgICAgIDwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2tlcmFzLmlvL21vZGVscy9tb2RlbC8iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPktlcmFzIE1vZGVsPC9hPjoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUtc25pcHBldCI+aW1wb3J0IHRlbnNvcmZsb3cgYXMgdGYKZnJvbSB0ZW5zb3JmbG93LnB5dGhvbiBpbXBvcnQgZGVidWcgYXMgdGZfZGVidWcKaW1wb3J0IGtlcmFzCgprZXJhcy5iYWNrZW5kLnNldF9zZXNzaW9uKAogICAgdGZfZGVidWcuVGVuc29yQm9hcmREZWJ1Z1dyYXBwZXJTZXNzaW9uKHRmLlNlc3Npb24oKSwgIltbX2hvc3RdXTpbW19wb3J0XV0iKSkKIyBEZWZpbmUgeW91ciBrZXJhcyBtb2RlbCwgY2FsbGVkICJtb2RlbCIuCm1vZGVsLmZpdCguLi4pCiAgICAgICAgICAgIDwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZT4KICAgICAgLyoqIFdlIHJlbHkgb24gYSBzZXBhcmF0ZSBgX2hpZGRlbmAgcHJvcGVydHkgaW5zdGVhZCBvZiBkaXJlY3RseSBtYWtpbmcgdXNlCiAgICAgICAgICBvZiB0aGUgYF9vcGVuYCBhdHRyaWJ1dGUgYmVjYXVzZSB0aGlzIENTUyBzcGVjaWZpY2F0aW9uIG1heSBzdHJhbmdlbHkKICAgICAgICAgIGFmZmVjdCBvdGhlciBlbGVtZW50cyB0aHJvdWdob3V0IFRlbnNvckJvYXJkLiBTZWUgIzg5OS4gKi8KICAgICAgOmhvc3QoW19oaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICA6aG9zdCwKICAgICAgI2Rhc2hib2FyZC1iYWNrZHJvcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgI2Rhc2hib2FyZC1iYWNrZHJvcCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICB9CgogICAgICAuY29kZS1leGFtcGxlIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgfQogICAgICAuY29kZS1leGFtcGxlLXNlY3Rpb24gewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLmNvZGUtc25pcHBldCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxZW07CiAgICAgIH0KCiAgICAgICNkaWFsb2ctdGl0bGUgewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY3VzdG9tLW1lc3NhZ2UgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2ciLHByb3BlcnRpZXM6e190aXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2N1c3RvbU1lc3NhZ2U6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9oYXNDdXN0b21NZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQ3VzdG9tTWVzc2FnZShfY3VzdG9tTWVzc2FnZSkifSxfaG9zdDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3BvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vcGVuOnt0eXBlOkJvb2xlYW59LF9oaWRkZW46e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIaWRkZW4oX29wZW4pIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvcGVuRGlhbG9nKGEsYyl7dGhpcy5zZXQoIl90aXRsZSIsIkRlYnVnZ2VyIGlzIHdhaXRpbmcgZm9yIFNlc3Npb24ucnVuKCkgY29ubmVjdGlvbnMuLi4iKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLG51bGwpO3RoaXMuJC5kaWFsb2cub3BlbigpOwpudWxsIT1hJiZudWxsIT1jJiYodGhpcy5zZXQoIl9ob3N0IixhKSx0aGlzLnNldCgiX3BvcnQiLGMpKX0sY2xvc2VEaWFsb2coKXt0aGlzLiQuZGlhbG9nLmNsb3NlKCl9LG9wZW5EaXNhYmxlZERpYWxvZygpe3RoaXMuc2V0KCJfdGl0bGUiLCJEZWJ1Z2dlciBpcyBub3QgZW5hYmxlZCBpbiB0aGlzIFRlbnNvckJvYXJkIGluc3RhbmNlIik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIiwiVG8gZW5hYmxlIHRoZSBkZWJ1Z2dlciBpbiBUZW5zb3JCb2FyZCwgdXNlIHRoZSBmbGFnOiAtLWRlYnVnZ2VyX3BvcnQgXHgzY3BvcnRfbnVtYmVyXHgzZSIpO3RoaXMuJC5kaWFsb2cub3BlbigpfSxfY29tcHV0ZUhpZGRlbihhKXtyZXR1cm4hYX0sX2NvbXB1dGVIYXNDdXN0b21NZXNzYWdlKGEpe3JldHVybiFfLmlzRW1wdHkoYSl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLXJlc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImJhcnMiPgogICAgICA8ZGl2IGNsYXNzPSJiYXJzLXJvdGF0b3IiPgogICAgICAgIDxzcGFuIGNsYXNzPSJiYXJzLXRleHQiPnwgfDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW19yZXNpemVyLWlkZW50aWZpZXJdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJhY2tncm91bmQ6ICNjY2M7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpcy1ob3Jpem9udGFsXSkgewogICAgICAgIGN1cnNvcjogcm93LXJlc2l6ZTsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoW19pcy12ZXJ0aWNhbF0pIHsKICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICAgICAgcmlnaHQ6IC0xNXB4OwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5iYXJzIHsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICB9CgogICAgICAvKiogVGhpcyBibG9jayBwcmV2ZW50cyB0aGUgYmFycyByb3RhdG9yIGZyb20gaGF2aW5nIGEgaGVpZ2h0IHRoYXQgaXMKICAgICAgICAgIHRoZSBlbnRpcmUgdmlld3BvcnQsIHRodXMgb2NjbHVkaW5nIGl0IGFuZCBnaXZpbmcgaXQgYW4gdW5kZXNpcmVkIGN1cnNvcgogICAgICAgICAgdmFsdWUuICovCiAgICAgIC5iYXJzLXJvdGF0b3IgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSAuYmFycy1yb3RhdG9yIHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CiAgICAgIH0KCiAgICAgIC5iYXJzLXRleHQgewogICAgICAgIHRyYW5zZm9ybTogc2NhbGVZKDE1KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLXJlc2l6ZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItcmVzaXplciIscHJvcGVydGllczp7Y3VycmVudExlbmd0aDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxtaW5MZW5ndGg6TnVtYmVyLG1heExlbmd0aDpOdW1iZXIsaXNIb3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcmVzaXplcklkZW50aWZpZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9pc1ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNWZXJ0aWNhbChpc0hvcml6b250YWwpIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9LF9kcmFnU3RhcnRQb3NpdGlvbjpOdW1iZXIsX2RyYWdTdGFydExlbmd0aDpOdW1iZXIsX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s6T2JqZWN0LF9wcmV2aW91c01vdXNlVXBDYWxsYmFjazpPYmplY3R9LGxpc3RlbmVyczp7bW91c2Vkb3duOiJfaGFuZGxlTW91c2VEb3duIn0sCl9oYW5kbGVNb3VzZURvd24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKTt0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrPWM9PntjLnByZXZlbnREZWZhdWx0KCk7Yz10aGlzLl9kcmFnU3RhcnRMZW5ndGgrKHRoaXMuX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGMpLXRoaXMuX2RyYWdTdGFydFBvc2l0aW9uKTtjPU1hdGgubWF4KGMsdGhpcy5taW5MZW5ndGgpO2M9TWF0aC5taW4oYyx0aGlzLm1heExlbmd0aCk7dGhpcy5zZXQoImN1cnJlbnRMZW5ndGgiLGMpfTt0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaz1jPT57Yy5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKX07dGhpcy5zZXQoIl9kcmFnU3RhcnRQb3NpdGlvbiIsdGhpcy5fZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYSkpO3RoaXMuc2V0KCJfZHJhZ1N0YXJ0TGVuZ3RoIix0aGlzLmN1cnJlbnRMZW5ndGgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwKdGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2ssITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2ssITEpfSxfZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYSl7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsP2EuY2xpZW50WTphLmNsaWVudFh9LF9lbmREcmFnKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaz1udWxsO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s9bnVsbH0sX2NvbXB1dGVJc1ZlcnRpY2FsKGEpe3JldHVybiFhfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3Atc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXY+CiAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJmaWx0ZXItbW9kZSIgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJGaWx0ZXIgTW9kZSIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZmlsdGVyTW9kZX19Ij4KICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Tm9kZSBOYW1lPC9wYXBlci1pdGVtPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk9wIFR5cGU8L3BhcGVyLWl0ZW0+CiAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0iZmlsdGVyLWlucHV0IiBsYWJlbD0iRmlsdGVyIFJlZ2V4IiBhbHdheXMtZmxvYXQtbGFiZWwgdmFsdWU9Int7X2ZpbHRlcklucHV0fX0iPjwvcGFwZXItaW5wdXQ+CiAgICA8L2Rpdj4KICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGNsYXNzPSJzcGlubmVyIiBpZD0ibG9hZGluZy1zcGlubmVyIiBoaWRkZW49IltbIV9pc0xvYWRpbmddXSI+CiAgICA8L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgIDxkaXYgaWQ9InNlbGVjdG9yLWhpZXJhcmNoeSI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDIwcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC1jb250YWluZXIgaXJvbi1jb2xsYXBzZSB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgcGFwZXItY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgbWFyZ2luOiAwIDhweCAwIDA7CiAgICAgIH0KCiAgICAgIC5vcC10eXBlIHsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogICAgICAgIGNvbG9yOiAjNDQ0OwogICAgICB9CgogICAgICAub3AtdGl0bGUtbGVhZiB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAub3AtdGl0bGUtbGVhZjpob3ZlciB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KCiAgICAgIC5wYXJ0aWFsLWNoZWNrYm94IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjU3YzAwOwogICAgICB9CgogICAgICAubm9kZS1leHBhbmQtYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xM3B4OwogICAgICB9CgogICAgICAubGV2ZWwtdGl0bGUtdGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMXB4OwogICAgICB9CgogICAgICAub3AtZGVzY3JpcHRpb24gewogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAyN3B4OwogICAgICAgIHBhZGRpbmc6IDEwcHggMDsKICAgICAgfQoKICAgICAgLnNwaW5uZXIgewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAjZmlsdGVyLW1vZGUgewogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItaW5wdXQgewogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5oaWdobGlnaHRlZCB7CiAgICAgICAgY29sb3I6IHJlZDsKICAgICAgfQogICAgICAuaGlnaGxpZ2h0ZWQgPiAub3AtdHlwZSB7CiAgICAgICAgY29sb3I6IHJlZDsKICAgICAgfQoKICAgICAgI3NlbGVjdG9yLWhpZXJhcmNoeSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWRlYnVnZ2VyLWRhc2hib2FyZC9zZWxlY3Rpb24tdHJlZS1ub2RlLmpzCihmdW5jdGlvbihhKXthLk5PREVfTkFNRV9TRVBBUkFUT1I9Ii8iO2EuREVWSUNFX05BTUVfUEFUVEVSTj0vXlwvam9iOltBLVphLXowLTlfXStcL3JlcGxpY2E6WzAtOV9dK1wvdGFzazpbMC05XStcL2RldmljZTpbQS1aYS16MC05X10rOlswLTldKy87bGV0IGM7KGZ1bmN0aW9uKGcpe2dbZy5FTVBUWT0wXT0iRU1QVFkiO2dbZy5DSEVDS0VEPTFdPSJDSEVDS0VEIjtnW2cuUEFSVElBTD0yXT0iUEFSVElBTCJ9KShjPWEuQ2hlY2tib3hTdGF0ZXx8KGEuQ2hlY2tib3hTdGF0ZT17fSkpO2Euc3BsaXROb2RlTmFtZT1mdW5jdGlvbihnKXtsZXQgbD1bXTtjb25zdCBrPWcubWF0Y2goYS5ERVZJQ0VfTkFNRV9QQVRURVJOKTtudWxsIT1rJiYobC5wdXNoKGtbMF0pLCIvIiE9PWdba1swXS5sZW5ndGhdJiZjb25zb2xlLmVycm9yKCdObyBzbGFzaCAoIi8iKSBhZnRlciBkZXZpY2UgbmFtZSBpbiBub2RlIG5hbWU6JyxnKSxnPWcuc2xpY2Uoa1swXS5sZW5ndGgrMSkpO3JldHVybiBsLmNvbmNhdChnLnNwbGl0KGEuTk9ERV9OQU1FX1NFUEFSQVRPUikpfTsKYS5nZXRDbGVhbk5vZGVOYW1lPWZ1bmN0aW9uKGcpe2xldCBsPWc7Y29uc3Qgaz1nLm1hdGNoKGEuREVWSUNFX05BTUVfUEFUVEVSTik7bnVsbCE9az8obC5sZW5ndGg+a1swXS5sZW5ndGgmJiIvIiE9bFtrWzBdLmxlbmd0aF0mJmNvbnNvbGUuZXJyb3IoJ05vIHNsYXNoICgiLyIpIGFmdGVyIGRldmljZSBuYW1lIGluIG5vZGUgbmFtZTonLGcpLGw9bC5zbGljZShrWzBdLmxlbmd0aCsxKSk6Ii8iPT09bFswXSYmKGw9bC5zbGljZSgxKSk7bC5pbmRleE9mKCIpIik9PT1sLmxlbmd0aC0xJiYobD1sLnNsaWNlKDAsbC5pbmRleE9mKCIvKCIpKSk7cmV0dXJuIGx9O2Euc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXM9ZnVuY3Rpb24oZyl7Zy5zb3J0KChrLG0pPT5rLm5vZGVfbmFtZTxtLm5vZGVfbmFtZT8tMTprLm5vZGVfbmFtZT5tLm5vZGVfbmFtZT8xOmsub3V0cHV0X3Nsb3QtbS5vdXRwdXRfc2xvdCk7Zm9yKGxldCBrPTA7azxnLmxlbmd0aDsrK2spe3ZhciBsPWdba10ubm9kZV9uYW1lKwoiLyI7bGV0IG09ITE7Zm9yKGxldCBwPWsrMTtwPGcubGVuZ3RoOysrcClpZigwPT09Z1twXS5ub2RlX25hbWUuaW5kZXhPZihsKSl7bT0hMDticmVha31tJiYobD1nW2tdLm5vZGVfbmFtZS5zcGxpdCgiLyIpLGdba10ubm9kZV9uYW1lKz0iLygiK2xbbC5sZW5ndGgtMV0rIikiKX19O2EucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uPWZ1bmN0aW9uKGcpe3JldHVybiBnLmVuZHNXaXRoKCIpIik/Zy5zbGljZSgwLGcubGFzdEluZGV4T2YoIi8oIikpOmd9O2EuYXNzZW1ibGVEZXZpY2VBbmROb2RlTmFtZXM9ZnVuY3Rpb24oZyl7Y29uc3QgbD1bbnVsbCxudWxsXTtpZihnWzBdLm1hdGNoKGEuREVWSUNFX05BTUVfUEFUVEVSTikpe2xldCBrPWdbMF07Ii8iPT09a1trLmxlbmd0aC0xXSYmKGs9ay5zbGljZSgwLGsubGVuZ3RoLTEpKTtsWzBdPWs7bFsxXT1nLnNsaWNlKDEpLmpvaW4oIi8iKX1lbHNlIGxbMV09Zy5qb2luKCIvIik7cmV0dXJuIGx9O2xldCBkOyhmdW5jdGlvbihnKXtnW2cuTm9kZU5hbWU9CjBdPSJOb2RlTmFtZSI7Z1tnLk9wVHlwZT0xXT0iT3BUeXBlIn0pKGQ9YS5EZWJ1Z1dhdGNoRmlsdGVyTW9kZXx8KGEuRGVidWdXYXRjaEZpbHRlck1vZGU9e30pKTthLmZpbHRlckRlYnVnV2F0Y2hlcz1mdW5jdGlvbihnLGwsayl7aWYobD09PWQuTm9kZU5hbWUpcmV0dXJuIGcuZmlsdGVyKG09Pm0ubm9kZV9uYW1lLm1hdGNoKGspKTtpZihsPT09ZC5PcFR5cGUpcmV0dXJuIGcuZmlsdGVyKG09Pm0ub3BfdHlwZS5tYXRjaChrKSl9O2NsYXNzIGZ7Y29uc3RydWN0b3IoZyxsLGssbSl7dGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlPWw7dGhpcy5kZWJ1Z1dhdGNoPW07dGhpcy5uYW1lPWc7dGhpcy5kZWJ1Z1dhdGNoPW07dGhpcy5jaGVja2JveFN0YXRlPWMuRU1QVFk7dGhpcy5wYXJlbnQ9azt0aGlzLmNoaWxkcmVuPXt9O3RoaXMuY2hlY2tib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItY2hlY2tib3giKTt0aGlzLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsKCk9Pgp7dGhpcy5faGFuZGxlQ2hhbmdlKCl9LCExKX1faGFuZGxlQ2hhbmdlKCl7aWYodGhpcy5hdm9pZFByb3BhZ2F0aW9uKXRoaXMuZGVidWdXYXRjaCYmdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5kZWJ1Z1dhdGNoKXRoaXMuc2V0Q2hlY2tib3hTdGF0ZSh0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/Yy5DSEVDS0VEOmMuRU1QVFksITApLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT90aGlzLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKTp0aGlzLnNldE5vZGVzQWJvdmVUb0VtcHR5KCksdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5zZXRDaGVja2JveFN0YXRlKHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT9jLkNIRUNLRUQ6Yy5FTVBUWSwhMCksdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKXtjb25zdCBsPV8udmFsdWVzKHRoaXMuY2hpbGRyZW4pOwpmb3IoO2wubGVuZ3RoOyl7dmFyIGc9bC5wb3AoKTtfLmZvckVhY2goZy5jaGlsZHJlbixrPT5sLnB1c2goaykpO2cuc2V0Q2hlY2tib3hTdGF0ZShjLkNIRUNLRUQsITApfXRoaXMuc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpfWVsc2V7Y29uc3QgbD1fLnZhbHVlcyh0aGlzLmNoaWxkcmVuKTtmb3IoO2wubGVuZ3RoOylnPWwucG9wKCksXy5mb3JFYWNoKGcuY2hpbGRyZW4saz0+bC5wdXNoKGspKSxnLnNldENoZWNrYm94U3RhdGUoYy5FTVBUWSwhMCk7dGhpcy5zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpfX1pc0xlYWYoKXtyZXR1cm4hIXRoaXMuZGVidWdXYXRjaH1zZXRUb0FsbENoZWNrZWRFeHRlcm5hbGx5KCl7dGhpcy5zZXRDaGVja2JveFN0YXRlKGMuQ0hFQ0tFRCk7dGhpcy5faGFuZGxlQ2hhbmdlKCl9c2V0Q2hlY2tib3hTdGF0ZShnLGwpe3RoaXMuYXZvaWRQcm9wYWdhdGlvbj1sO3RoaXMuY2hlY2tib3hTdGF0ZT1nO3RoaXMuY2hlY2tib3guY2xhc3NMaXN0LnRvZ2dsZSgicGFydGlhbC1jaGVja2JveCIsCmc9PT1jLlBBUlRJQUwpO2c9PT1jLkNIRUNLRUQ/dGhpcy5jaGVja2JveC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik6dGhpcy5jaGVja2JveC5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTt0aGlzLmF2b2lkUHJvcGFnYXRpb249ITF9aXNDaGVja2JveENoZWNrZWQoKXtyZXR1cm4gdGhpcy5jaGVja2JveC5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKX1zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCl7bGV0IGc9dGhpcy5wYXJlbnQsbD0hMTtmb3IoO2c7KWw/Zy5zZXRDaGVja2JveFN0YXRlKGMuUEFSVElBTCwhMCk6KGw9LTEhPT1fLmZpbmRJbmRleChfLnZhbHVlcyhnLmNoaWxkcmVuKSxrPT5rLmNoZWNrYm94U3RhdGUhPT1jLkNIRUNLRUQpLGcuc2V0Q2hlY2tib3hTdGF0ZShsP2MuUEFSVElBTDpjLkNIRUNLRUQsITApKSxnPWcucGFyZW50fXNldE5vZGVzQWJvdmVUb0VtcHR5KCl7bGV0IGc9dGhpcy5wYXJlbnQsbD0hMTtmb3IoO2c7KWw/Zy5zZXRDaGVja2JveFN0YXRlKGMuUEFSVElBTCwKITApOihsPS0xIT09Xy5maW5kSW5kZXgoXy52YWx1ZXMoZy5jaGlsZHJlbiksaz0+ay5jaGVja2JveFN0YXRlIT09Yy5FTVBUWSksZy5zZXRDaGVja2JveFN0YXRlKGw/Yy5QQVJUSUFMOmMuRU1QVFksITApKSxnPWcucGFyZW50fXNldExldmVsRG9tKGcpe3RoaXMubGV2ZWxEb209Z319YS5TZWxlY3Rpb25UcmVlTm9kZT1mfSkoaW18fChpbT17fSkpOwo8L3NjcmlwdD4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLW9wLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntkZWJ1Z1dhdGNoZXM6QXJyYXksZGVidWdXYXRjaENoYW5nZTpPYmplY3Qsbm9kZUNsaWNrZWQ6RnVuY3Rpb24sZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxmb3JjZUV4cGFuZE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9sZXZlbE5hbWUyQ29udGFpbmVyOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbGV2ZWxOYW1lMk5vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF93YXRjaEhpZXJhcmNoeTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlV2F0Y2hIaWVyYXJjaHkoZGVidWdXYXRjaGVzLCBkZWJ1Z1dhdGNoQ2hhbmdlLCBfZmlsdGVyTW9kZSwgX2ZpbHRlcklucHV0KSJ9LF9maWx0ZXJNb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToiTm9kZSBOYW1lIiwKbm90aWZ5OiEwfSxfZmlsdGVySW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sX2lzTG9hZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaGlnaGxpZ2h0ZWRMZXZlbERvbTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9yZW5kZXJIaWVyYXJjaHlXaXRoVGltZW91dChfd2F0Y2hIaWVyYXJjaHksIGRlYnVnV2F0Y2hDaGFuZ2UpIiwiX2hhbmRsZUZvcmNlTm9kZUV4cGFuZEFuZENoZWNrKGZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSkiLCJfaGFuZGxlRm9yY2VOb2RlRXhwYW5kKGZvcmNlRXhwYW5kTm9kZU5hbWUpIl0sX2NvbXB1dGVXYXRjaEhpZXJhcmNoeShhLGMsZCxmKXtmPWYudHJpbSgpO2xldCBnPWE7bnVsbCE9ZCYmMDxmLmxlbmd0aCYmKGc9aW0uZmlsdGVyRGVidWdXYXRjaGVzKGEsaW0uRGVidWdXYXRjaEZpbHRlck1vZGVbZC5yZXBsYWNlKC9ccy9nLCIiKV0sbmV3IFJlZ0V4cChmKSkpO2NvbnN0IGw9bmV3IGltLlNlbGVjdGlvblRyZWVOb2RlKCIiLApjKTtsLmlzUm9vdD0hMDtfLmZvckVhY2goZyxrPT57Y29uc3QgbT1pbS5zcGxpdE5vZGVOYW1lKGsuZGV2aWNlX25hbWUrIi8iK2subm9kZV9uYW1lKTtsZXQgcD1sO18uZm9yRWFjaChtLChxLHIpPT57cj09PW0ubGVuZ3RoLTE/KHI9bmV3IGltLlNlbGVjdGlvblRyZWVOb2RlKHEsYyxwLGspLHAuY2hpbGRyZW5bcV09cik6KHAuY2hpbGRyZW5bcV18fChwLmNoaWxkcmVuW3FdPW5ldyBpbS5TZWxlY3Rpb25UcmVlTm9kZShxLGMscCkpLHA9cC5jaGlsZHJlbltxXSl9KX0pO3JldHVybiBsfSxfY2xlYXJTZWxlY3RvckhpZXJhcmNoeSgpe2NvbnN0IGE9dGhpcy4kJCgiI3NlbGVjdG9yLWhpZXJhcmNoeSIpO2Zvcig7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9LF9yZW5kZXJIaWVyYXJjaHlXaXRoVGltZW91dChhLGMsZCxmKXt0aGlzLl9pc0xvYWRpbmd8fCh0aGlzLnNldCgiX2lzTG9hZGluZyIsITApLHRoaXMuX2NsZWFyU2VsZWN0b3JIaWVyYXJjaHkoKSwKc2V0VGltZW91dCgoKT0+e3RoaXMuX3JlbmRlckhpZXJhcmNoeShhLGMsZCxmKX0sMTApKX0sX3JlbmRlckhpZXJhcmNoeShhLGMpe3RoaXMuc2V0KCJfbGV2ZWxOYW1lMkNvbnRhaW5lciIse30pO3RoaXMuc2V0KCJfbGV2ZWxOYW1lMk5vZGUiLHt9KTthPXRoaXMuX3JlbmRlckxldmVsKG51bGwsbnVsbCxhLGMpO1BvbHltZXIuZG9tKHRoaXMuJCQoIiNzZWxlY3Rvci1oaWVyYXJjaHkiKSkuYXBwZW5kQ2hpbGQoYSk7dGhpcy5zZXQoIl9pc0xvYWRpbmciLCExKX0sX3JlbmRlckxldmVsKGEsYyxkLGYpe2NvbnN0IGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bnVsbCE9YSYmZy5zZXRBdHRyaWJ1dGUoImxldmVsLW5hbWUiLGEpO2xldCBsO2w9bnVsbD09Yz9hOmMrIi8iK2E7UG9seW1lci5kb20oZykuY2xhc3NMaXN0LmFkZCgibGV2ZWwtY29udGFpbmVyIik7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWNvbGxhcHNlIik7aWYoYSl7dGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcltsXT0KaztrLnJlbW92ZUF0dHJpYnV0ZSgib3BlbmVkIik7UG9seW1lci5kb20oZykuY2xhc3NMaXN0LmFkZCgiaW5kZW50ZWQtbGV2ZWwtY29udGFpbmVyIik7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtQb2x5bWVyLmRvbShjKS5jbGFzc0xpc3QuYWRkKCJsZXZlbC10aXRsZSIpO2NvbnN0IHE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTtQb2x5bWVyLmRvbShxKS5jbGFzc0xpc3QuYWRkKCJub2RlLWV4cGFuZC1idXR0b24iKTtjb25zdCByPSgpPT57cS5zZXRBdHRyaWJ1dGUoImljb24iLGsuaGFzQXR0cmlidXRlKCJvcGVuZWQiKT8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSIpfTtxLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2suaGFzQXR0cmlidXRlKCJvcGVuZWQiKT9rLnJlbW92ZUF0dHJpYnV0ZSgib3BlbmVkIik6ay5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApO3IoKX0sITEpO3IoKTtQb2x5bWVyLmRvbShjKS5hcHBlbmRDaGlsZChxKTsKUG9seW1lci5kb20oYykuYXBwZW5kQ2hpbGQoZC5jaGVja2JveCk7ZC5zZXRMZXZlbERvbShjKTtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtQb2x5bWVyLmRvbSh0KS5jbGFzc0xpc3QuYWRkKCJsZXZlbC10aXRsZS10ZXh0Iik7dC50ZXh0Q29udGVudD1hO1BvbHltZXIuZG9tKGMpLmFwcGVuZENoaWxkKHQpO1BvbHltZXIuZG9tKGcpLmFwcGVuZENoaWxkKGMpOyhhLm1hdGNoKGltLkRFVklDRV9OQU1FX1BBVFRFUk4pfHwxPT09T2JqZWN0LmtleXMoZC5jaGlsZHJlbikubGVuZ3RoKSYmay5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApfWVsc2Ugay5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApO2NvbnN0IG09W10scD1bXTtQb2x5bWVyLmRvbShrKS5jbGFzc0xpc3QuYWRkKCJjb250ZW50LWNvbnRhaW5lciIpO18uZm9yRWFjaChkLmNoaWxkcmVuLChxLHIpPT57Y29uc3QgdD1xLmRlYnVnV2F0Y2g7dmFyIHY9bDtudWxsPT1sJiYodj0iIik7dis9Ii8iK3I7CnRoaXMuX2xldmVsTmFtZTJOb2RlW3ZdPXE7bnVsbCE9dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1t2XSYmKHEuc2V0Q2hlY2tib3hTdGF0ZShpbS5DaGVja2JveFN0YXRlLkNIRUNLRUQpLHEuc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpKTtpZih0KXt2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1BvbHltZXIuZG9tKHYpLmNsYXNzTGlzdC5hZGQoIm9wLWRlc2NyaXB0aW9uIik7cS5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHk9Pnt0aGlzLl9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGYsdCx5LnRhcmdldC5jaGVja2VkKX0sITEpO1BvbHltZXIuZG9tKHYpLmFwcGVuZENoaWxkKHEuY2hlY2tib3gpO3Euc2V0TGV2ZWxEb20odik7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO0EudGV4dENvbnRlbnQ9IlsiK3Qub3BfdHlwZSsiXSI7QS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3AtdHlwZSIpO1BvbHltZXIuZG9tKHYpLmFwcGVuZENoaWxkKEEpOwpBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtBLnRleHRDb250ZW50PXI7QS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3AtdGl0bGUtbGVhZiIpO0EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57Y29uc3QgeT10aGlzLl9nZXREZXZpY2VBbmROb2RlTmFtZXMocixnKTt0aGlzLm5vZGVDbGlja2VkKHlbMF0seVsxXSl9LCExKTtQb2x5bWVyLmRvbSh2KS5hcHBlbmRDaGlsZChBKTtwLnB1c2godil9ZWxzZSBxLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIseT0+e3RoaXMuX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKHEsZix5LnRhcmdldC5jaGVja2VkKX0pLG0ucHVzaCh0aGlzLl9yZW5kZXJMZXZlbChyLGwscSxmKSl9KTthPXE9PntQb2x5bWVyLmRvbShrKS5hcHBlbmRDaGlsZChxKX07Xy5mb3JFYWNoKHAsYSk7Xy5mb3JFYWNoKG0sYSk7UG9seW1lci5kb20oZykuYXBwZW5kQ2hpbGQoayk7cmV0dXJuIGd9LF9nZXRMZWFmRGVidWdXYXRjaGVzKGEsYyl7YS5kZWJ1Z1dhdGNoPwpjLnB1c2goYS5kZWJ1Z1dhdGNoKTpfLmZvckVhY2goYS5jaGlsZHJlbixkPT57dGhpcy5fZ2V0TGVhZkRlYnVnV2F0Y2hlcyhkLGMpfSl9LF9nZXREZXZpY2VBbmROb2RlTmFtZXMoYSxjKXtmb3IoYT1bYV07Oyl7Y29uc3QgZD1jLmdldEF0dHJpYnV0ZSgibGV2ZWwtbmFtZSIpO2lmKG51bGw9PWQpYnJlYWs7ZWxzZSBhLnB1c2goZCk7Yz1Qb2x5bWVyLmRvbShjKS5wYXJlbnROb2RlLnBhcmVudE5vZGV9YS5yZXZlcnNlKCk7cmV0dXJuIGltLmFzc2VtYmxlRGV2aWNlQW5kTm9kZU5hbWVzKGEpfSxfaGFuZGxlTWV0YU5vZGVDaGFuZ2UoYSxjLGQpe2xldCBmPVtdO3RoaXMuX2dldExlYWZEZWJ1Z1dhdGNoZXMoYSxmKTtfLmZvckVhY2goZixnPT57dGhpcy5faGFuZGxlTGVhZk5vZGVTZWxlY3RlZChjLGcsZCl9KX0sX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoYSxjLGQpe2NvbnN0IGY9Yy5kZXZpY2VfbmFtZSsiLyIrYy5ub2RlX25hbWU7ZD90aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2ZdPQpjOmRlbGV0ZSB0aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2ZdO2EoYyxkKX0sX2hhbmRsZUZvcmNlTm9kZShhLGMpe3RoaXMuc2V0KCJfZmlsdGVySW5wdXQiLCIiKTtzZXRUaW1lb3V0KCgpPT57aWYobnVsbCE9YSYmbnVsbCE9dGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcil7dmFyIGQ9aW0uc3BsaXROb2RlTmFtZShhKTtmb3IobGV0IGc9MTtnPD1kLmxlbmd0aDsrK2cpe3ZhciBmPWQuc2xpY2UoMCxnKS5qb2luKCIvIik7Y29uc3QgbD10aGlzLl9sZXZlbE5hbWUyTm9kZVtmXTtudWxsIT1sJiZudWxsIT1sLmxldmVsRG9tJiZsLmxldmVsRG9tLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KTtnPGQubGVuZ3RoP251bGwhPXRoaXMuX2xldmVsTmFtZTJDb250YWluZXJbZl0mJnRoaXMuX2xldmVsTmFtZTJDb250YWluZXJbZl0uc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKToobC5kZWJ1Z1dhdGNofHx0aGlzLl9oYW5kbGVNZXRhTm9kZUNoYW5nZShsLApsLmRlYnVnV2F0Y2hDaGFuZ2UsITApLGMmJihsLnNldFRvQWxsQ2hlY2tlZEV4dGVybmFsbHkoKSwoZj1sLmRlYnVnV2F0Y2gpJiZudWxsPT10aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2Yubm9kZV9uYW1lXSYmKHRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbYV09ZikpLG51bGwhPXRoaXMuX2hpZ2hsaWdodGVkTGV2ZWxEb20mJnRoaXMuX2hpZ2hsaWdodGVkTGV2ZWxEb20uY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKSxsLmxldmVsRG9tLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkIiksdGhpcy5zZXQoIl9oaWdobGlnaHRlZExldmVsRG9tIixsLmxldmVsRG9tKSl9fX0sMjApfSxfaGFuZGxlRm9yY2VOb2RlRXhwYW5kQW5kQ2hlY2soYSl7dGhpcy5faGFuZGxlRm9yY2VOb2RlKGEsITApfSxfaGFuZGxlRm9yY2VOb2RlRXhwYW5kKGEpe3RoaXMuX2hhbmRsZUZvcmNlTm9kZShhLCExKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtc2Vzc2lvbi1ydW5zLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9InNlc3Npb24tcnVucy1kaXYiPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TZXNzaW9uIFJ1bnM8L2Rpdj4KICAgICAgPHRhYmxlIGlkPSJzZXNzaW9uLXJ1bnMtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0ic2Vzc2lvbi1ydW5zLXRhYmxlIj4KICAgICAgICA8dHIgYWxpZ249ImxlZnQiPgogICAgICAgICAgPHRoPkZlZWRzPC90aD4KICAgICAgICAgIDx0aD5GZXRjaGVzPC90aD4KICAgICAgICAgIDx0aD5UYXJnZXRzPC90aD4KICAgICAgICAgIDx0aD4jKERldmljZXMpPC90aD4KICAgICAgICAgIDx0aD5Db3VudDwvdGg+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CgogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC8qIFRPRE8oY2Fpcyk6IFRoaXMgbmVlZHMgd29yazogdGhlIHRhYmxlIHNob3VsZG4ndCBnZXQgdG9vIHdpZGUgd2hlbgogICAgICAgICB0aGVyZSBhcmUgbWFueSBmZWVkcy9mZXRjaGVzL3Rhcmd0ZSBuYW1lcy4gKi8KICAgICAgLnNlc3Npb24tcnVucy10YWJsZSB7CiAgICAgICAgYWxpZ24tY29udGVudDogbGVmdDsKICAgICAgICBhbGlnbi1pdGVtczogbGVmdDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICAgIGJvcmRlci1zdHlsZTogc29saWQgMXB4IGJsYWNrOwogICAgICAgIHRhYmxlLWxheW91dDogZml4ZWQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgfQogICAgICAuYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIC5zb2xlLWFjdGl2ZS1zZXNzaW9uLXJ1biB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE3MiwgMjMyLCAxODgpOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAubm9kZS1vci10ZW5zb3ItZWxlbWVudCB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAubm9kZS1vci10ZW5zb3ItZWxlbWVudDpob3ZlciB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXNlc3Npb24tcnVucy12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNlc3Npb24tcnVucy12aWV3Iixwcm9wZXJ0aWVzOntsYXRlc3RTZXNzaW9uUnVuOk9iamVjdCxzZXNzaW9uUnVuS2V5VG9EZXZpY2VOYW1lczpPYmplY3Qsc29sZUFjdGl2ZTpCb29sZWFuLG5vZGVPclRlbnNvckNsaWNrZWQ6RnVuY3Rpb24sX3J1bktleTJDb3VudDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9ydW5LZXkyTnVtRGV2aWNlczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9hY3RpdmVSdW5LZXk6U3RyaW5nfSxvYnNlcnZlcnM6WyJyZW5kZXJMYXRlc3QobGF0ZXN0U2Vzc2lvblJ1bikiLCJzZXRTb2xlQWN0aXZlU3RhdHVzKHNvbGVBY3RpdmUpIl0scmVuZGVyTGF0ZXN0KGEpe2E9SlNPTi5zdHJpbmdpZnkoYSk7dGhpcy5fcnVuS2V5MkNvdW50W2FdPXZvaWQgMD09PXRoaXMuX3J1bktleTJDb3VudFthXT8xOnRoaXMuX3J1bktleTJDb3VudFthXSsxO3ZvaWQgMD09PXRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2FdJiYodGhpcy5fcnVuS2V5Mk51bURldmljZXNbYV09CjApO3RoaXMuX2FjdGl2ZVJ1bktleT1hO3RoaXMuX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpfSx1cGRhdGVOdW1EZXZpY2VzKGEpe251bGwhPXRoaXMuX2FjdGl2ZVJ1bktleSYmKHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW3RoaXMuX2FjdGl2ZVJ1bktleV09YSx0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKSl9LHNldFNvbGVBY3RpdmVTdGF0dXMoKXt0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKX0sX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpe3RoaXMuX2NsZWFyVGFibGUoKTt0aGlzLl9yZW5kZXJIZWFkZXIoKTtsZXQgYTtmb3IoY29uc3QgZCBpbiB0aGlzLl9ydW5LZXkyQ291bnQpaWYodGhpcy5fcnVuS2V5MkNvdW50Lmhhc093blByb3BlcnR5KGQpKXt2YXIgYz1KU09OLnBhcnNlKGQpOyhjPXRoaXMuX3JlbmRlclJvdyhjLHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2RdLHRoaXMuX3J1bktleTJDb3VudFtkXSx0aGlzLl9hY3RpdmVSdW5LZXk9PT1kLHRoaXMuc29sZUFjdGl2ZSkpJiYKKGE9Yyl9YSYmKFBvbHltZXIuZG9tKHRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKSkucGFyZW50Tm9kZS5wYXJlbnROb2RlLnNjcm9sbFRvcD1hLm9mZnNldFRvcCl9LF9jbGVhclRhYmxlKCl7Y29uc3QgYT10aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIik7Zm9yKDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX0sX3JlbmRlckhlYWRlcigpe2NvbnN0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7Yy50ZXh0Q29udGVudD0iRmVlZHMiO2NvbnN0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtkLnRleHRDb250ZW50PSJGZXRjaGVzIjtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7Zi50ZXh0Q29udGVudD0iVGFyZ2V0cyI7Y29uc3QgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2cudGV4dENvbnRlbnQ9IiMoRGV2aWNlcykiO2NvbnN0IGw9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7bC50ZXh0Q29udGVudD0iQ291bnQiO2EuYXBwZW5kQ2hpbGQoYyk7YS5hcHBlbmRDaGlsZChkKTthLmFwcGVuZENoaWxkKGYpO2EuYXBwZW5kQ2hpbGQoZyk7YS5hcHBlbmRDaGlsZChsKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKGEpfSxfcmVuZGVyUm93KGEsYyxkLGYsZyl7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGs9dGhpcy5fcmVuZGVyR3JhcGhFbGVtZW50cyhhLmZlZWRzKSxtPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYS5mZXRjaGVzKTthPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYS50YXJnZXRzKTtjb25zdCBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7cC50ZXh0Q29udGVudD1jO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtjLnRleHRDb250ZW50PWQ7bC5hcHBlbmRDaGlsZChrKTtsLmFwcGVuZENoaWxkKG0pOwpsLmFwcGVuZENoaWxkKGEpO2wuYXBwZW5kQ2hpbGQocCk7bC5hcHBlbmRDaGlsZChjKTtmJiYoZz9sLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJzb2xlLWFjdGl2ZS1zZXNzaW9uLXJ1biIpOmwuc2V0QXR0cmlidXRlKCJjbGFzcyIsImFjdGl2ZS1zZXNzaW9uLXJ1biIpKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKGwpO2lmKGYpcmV0dXJuIGx9LF9yZW5kZXJHcmFwaEVsZW1lbnRzKGEpe2NvbnN0IGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtfLmZvckVhY2goYSxkPT57Y29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtmLnRleHRDb250ZW50PWQ7Zi5zZXRBdHRyaWJ1dGUoImNsYXNzIiwibm9kZS1vci10ZW5zb3ItZWxlbWVudCIpO2YuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5ub2RlT3JUZW5zb3JDbGlja2VkKGQpfSk7Yy5hcHBlbmRDaGlsZChmKX0pO3JldHVybiBjfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zb3VyY2UtY29kZS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJmdWxsU3RhY2tEaWFsb2ciIGhpZGRlbiQ9IltbIV9mdWxsU3RhY2tTaG93bl1dIj4KICAgICAgPGRpdiBpZD0iZnVsbC1zdGFjay10aXRsZSI+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImZpbHRlci1saXN0IiBkaXNhYmxlZD0idHJ1ZSI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICBGdWxsIFN0YWNrIFRyYWNlIG9mIE5vZGU6CiAgICAgICAgPGRpdiBpZD0iZnVsbC1zdGFjay1ub2RlLW5hbWUiPiJbW19mdWxsU3RhY2tOb2RlTmFtZV1dIjwvZGl2PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJjbG9zZSIgaWQ9ImNsb3NlLWZ1bGwtc3RhY2stYnV0dG9uIiB0aXRsZT0iQ2xvc2UgRnVsbCBTdGFjayIgb24tdGFwPSJfY2xvc2VGdWxsU3RhY2tEaWFsb2ciPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8dWwgaWQ9ImZ1bGwtc3RhY2stY29udGVudCI+PC91bD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXRhYnMgaWQ9InNvdXJjZS1maWxlcy10YWJzIiBzZWxlY3RlZD0ie3tfZmlsZVBhdGhTZWxlY3RlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2hvcnRGaWxlUGF0aHNdXSI+CiAgICAgICAgPHBhcGVyLXRhYiBpZD0iW1tpdGVtLmlkXV0iPltbaXRlbS5uYW1lXV08L3BhcGVyLXRhYj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItdGFicz4KICAgIDxkaXYgaWQ9InNvdXJjZS1maWxlLWNvbnRlbnQiIGNsYXNzPSJzb3VyY2UtY29udGVudCI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2ZpbGVMaW5lc11dIj4KICAgICAgICA8ZGl2IGNsYXNzJD0ie3tpdGVtLnNvdXJjZUNsYXNzfX0iIGlkPSJzb3VyY2UtbGluZS1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgPHNwYW4gY2xhc3M9InNvdXJjZS1saW5lLW51bWJlciIgaWQ9InNvdXJjZS1saW5lbm8tW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLmxpbmVub11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZS10b2dnbGUiIGlkPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZS1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubnVtTm9kZXNdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9InNvdXJjZS1saW5lLXRleHQiIGlkPSJzb3VyY2UtbGluZS10ZXh0LVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS50ZXh0XV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNvdXJjZS1saW5lLW5vZGVzIiBpZD0ic291cmNlLWxpbmUtbm9kZXMtW1tpdGVtLmxpbmVub11dIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAjc291cmNlLWZpbGVzLXRhYnMgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDglOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOTAlOwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgb3ZlcmZsb3cteDogc2Nyb2xsOwogICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgICAgfQogICAgICAuc291cmNlLWNvbnRlbnQgOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZjAwOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZC1zb3VyY2UtbGluZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZlMDsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbnVtYmVyIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgY29sb3I6IGxpZ2h0Ymx1ZTsKICAgICAgICB3aWR0aDogMmVtOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZS10b2dnbGUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB3aWR0aDogNWVtOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDRlbTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgbWFyZ2luLXRvcDogMGVtOwogICAgICAgIG1hcmdpbi1ib3R0b206IDBlbTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZS1lbnRyeSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxZW07CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlcyBzcGFuIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgICNmdWxsU3RhY2tEaWFsb2cgewogICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB3aWR0aDogNDUlOwogICAgICAgIGhlaWdodDogODUlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjZnVsbC1zdGFjay10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjZnVsbC1zdGFjay1ub2RlLW5hbWUgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIDpob3N0ICNmdWxsLXN0YWNrLWNvbnRlbnQgewogICAgICAgIHBhZGRpbmctdG9wOiAxZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogMC41ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMC41ZW07CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1jbGlja2FibGUgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc3RhY2stZnJhbWUtbm9uY2xpY2thYmxlIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgfQogICAgICAjY2xvc2UtZnVsbC1zdGFjay1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtc291cmNlLWNvZGUtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zb3VyY2UtY29kZS12aWV3Iixwcm9wZXJ0aWVzOntyZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sZm9jdXNOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29sZEZvY3VzTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGRlYnVnV2F0Y2hlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sbm9kZUNsaWNrZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sY29udGludWVUb05vZGU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sX2hpZ2hsaWdodGVkRWxlbWVudHM6e3R5cGU6QXJyYXksdmFsdWU6W119LF9maWxlUGF0aFNlbGVjdGVkOk51bWJlcixfZnVsbEZpbGVQYXRoczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfc2hvcnRGaWxlUGF0aHM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2ZpbGVMaW5lczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyRGV2aWNlTmFtZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sCl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX25vZGVOYW1lMk5vZGVFbGVtZW50czp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnQ6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQ6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9mdWxsU3RhY2tTaG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZnVsbFN0YWNrTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9yZW5kZXJEZWxheU1pbGxpczp7dHlwZTpOdW1iZXIsdmFsdWU6NTAscmVhZG9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfcmVuZGVyRmlsZShfZmlsZVBhdGhTZWxlY3RlZCkiLCJfZm9jdXNPbk5vZGUoZm9jdXNOb2RlTmFtZSkiXSxyZW5kZXIoYSl7bnVsbCE9YSYmdGhpcy5zZXQoIl9kZWJ1Z1dhdGNoZXMiLGEpO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJwYXRocyJ9KS50aGVuKGM9Pgp7dGhpcy5zZXQoIl9mdWxsRmlsZVBhdGhzIixjLnBhdGhzKTtjb25zdCBkPWMucGF0aHMubWFwKGY9Pih7aWQ6ZixuYW1lOnRoaXMuX3Nob3J0ZW5QYXRoKGYsYy5wYXRocyl9KSk7dGhpcy5zZXQoIl9zaG9ydEZpbGVQYXRocyIsZCk7MDxkLmxlbmd0aCYmdGhpcy5zZXQoIl9maWxlUGF0aFNlbGVjdGVkIiwwKX0pfSxfc2hvcnRlblBhdGgoYSl7YT1hLnJlcGxhY2UoL1xcL2csIi8iKTthPWEuc3BsaXQoIi8iKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sX3JlbmRlckZpbGUoYSl7aWYobnVsbCE9YSl7dmFyIGM9dGhpcy5fc2hvcnRGaWxlUGF0aHNbYV0uaWQ7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6ImNvbnRlbnQiLGZpbGVfcGF0aDpjfSkudGhlbihkPT57Y29uc3QgZj1bXSxnPWQuY29udGVudFtjXSxsPWQubGluZW5vX3RvX29wX25hbWVfYW5kX3N0YWNrX3BvcztkPXt9O2Zvcih2YXIgayBpbiBsKWwuaGFzT3duUHJvcGVydHkoaykmJihkW2tdPWxba10ubGVuZ3RoKTsKdGhpcy5fZmlsdGVyRmlsZVRyYWNlYmFja3NCeURlYnVnV2F0Y2hlcyhsKTtmb3Ioaz0wO2s8Zy5sZW5ndGg7KytrKXtjb25zdCBwPWsrMTtmLnB1c2goe2xpbmVubzpwLG51bU5vZGVzOm51bGwhPWxbcF0/U3RyaW5nKGxbcF0ubGVuZ3RoKSsiLyIrU3RyaW5nKGRbcF0pKyIgXHUyNWJjIjoiIix0ZXh0OnRoaXMuX2h0bWxFc2NhcGUoZ1trXSl9KX10aGlzLnNldCgiX2ZpbGVMaW5lcyIsZik7Y29uc3QgbT10aGlzO3NldFRpbWVvdXQoKCk9Pntjb25zdCBwPXt9LHE9e307Zm9yKGNvbnN0IHQgaW4gbCl7aWYoIWwuaGFzT3duUHJvcGVydHkodCkpY29udGludWU7Zm9yKHZhciByPW0uJCQoIiNzb3VyY2UtbGluZS1ub2Rlcy0iK3QpO3IuZmlyc3RDaGlsZDspci5yZW1vdmVDaGlsZChyLmZpcnN0Q2hpbGQpO2NvbnN0IHY9bFt0XTt2LnNvcnQoZnVuY3Rpb24oQSx5KXtyZXR1cm4gQVswXTx5WzBdPy0xOkFbMF0+eVswXT8xOjB9KTtmb3IobGV0IEE9MDtBPHYubGVuZ3RoOysrQSl7Y29uc3QgeT0KdltBXVswXSx4PXZbQV1bMV0sQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtGLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJzb3VyY2UtbGluZS1ub2RlLWVudHRyeSIpO0Yuc2V0QXR0cmlidXRlKCJzb3VyY2VMaW5lbm8iLHQpO0YudGV4dENvbnRlbnQ9eTtGLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLm5vZGVDbGlja2VkKHRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbeV0sdGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbeV0sITApfSk7Y29uc3QgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO0Quc2V0QXR0cmlidXRlKCJpY29uIiwiZmlsdGVyLWxpc3QiKTtELnNldEF0dHJpYnV0ZSgidGl0bGUiLCJTaG93IHN0YWNrIik7RC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5faGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKHkpO3RoaXMuc2V0KCJfZnVsbFN0YWNrTm9kZU5hbWUiLAp5KTt0aGlzLnNldCgiX2Z1bGxTdGFja1Nob3duIiwhMCk7dGhpcy5fcG9wdWxhdGVGdWxsU3RhY2soeSx0aGlzLl9mdWxsRmlsZVBhdGhzW3RoaXMuX2ZpbGVQYXRoU2VsZWN0ZWRdLE51bWJlcih0KSl9KTtjb25zdCBCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7Qi5zZXRBdHRyaWJ1dGUoImljb24iLCJmb3J3YXJkIik7Qi5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQ29udGludWUgdG8iKTtCLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLm5vZGVDbGlja2VkKHRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbeV0sdGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbeV0sITApO2NvbnN0IEc9dGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSxLPXRoaXMuX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lW3ldO3RoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixGKTt0aGlzLmNvbnRpbnVlVG9Ob2RlKEcsCkspfSk7Qy5hcHBlbmRDaGlsZChEKTtDLmFwcGVuZENoaWxkKEIpO0MuYXBwZW5kQ2hpbGQoRik7ci5hcHBlbmRDaGlsZChDKTtwLmhhc093blByb3BlcnR5KHkpfHwocFt5XT1bXSk7cFt5XS5wdXNoKEYpO3EuaGFzT3duUHJvcGVydHkoeSl8fChxW3ldPVtGLHhdKTt4PnFbeV1bMV0mJihxW3ldPVtGLHhdKX1yLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwhMCk7cj1tLiQkKCIjc291cmNlLWxpbmUtbm9kZS10b2dnbGUtIit0KTtudWxsPT1yLmdldEF0dHJpYnV0ZSgidGFwQ2FsbGJhY2tTZXQiKSYmKHIuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e20uX3RvZ2dsZUxpbmVOb2RlcyhOdW1iZXIodCkpfSksci5zZXRBdHRyaWJ1dGUoInRhcENhbGxiYWNrU2V0IiwhMCkpfW0uc2V0KCJfbm9kZU5hbWUyTm9kZUVsZW1lbnRzIixwKTtmb3IoY29uc3QgdCBpbiBxKXEuaGFzT3duUHJvcGVydHkodCkmJihxW3RdPXFbdF1bMF0pO20uc2V0KCJfbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudCIsCnEpfSx0aGlzLl9yZW5kZXJEZWxheU1pbGxpcyl9KX19LF90b2dnbGVMaW5lTm9kZXMoYSxjPSExKXthPXRoaXMuJCQoIiNzb3VyY2UtbGluZS1ub2Rlcy0iK2EpO251bGw9PWEuZ2V0QXR0cmlidXRlKCJoaWRkZW4iKSYmITAhPT1jP2Euc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTphLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9LF9maWx0ZXJGaWxlVHJhY2ViYWNrc0J5RGVidWdXYXRjaGVzKGEpe2NvbnN0IGM9dGhpcy5kZWJ1Z1dhdGNoZXMubWFwKGc9PmltLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihnLm5vZGVfbmFtZSkpLGQ9e30sZj17fTtmb3IoY29uc3QgZyBvZiB0aGlzLmRlYnVnV2F0Y2hlcyl7Y29uc3QgbD1pbS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZy5ub2RlX25hbWUpO2RbbF09Zy5kZXZpY2VfbmFtZTtmW2xdPWcubm9kZV9uYW1lfXRoaXMuc2V0KCJfbm9kZU5hbWUyRGV2aWNlTmFtZSIsZCk7dGhpcy5zZXQoIl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZSIsCmYpO2Zvcihjb25zdCBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGFbZ109YVtnXS5maWx0ZXIobD0+Xy5pbmNsdWRlcyhjLGxbMF0pKSl9LF9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludChhKXtjb25zdCBjPVBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9zb3VyY2VfY29kZSIpO2E9UGsuYWRkUGFyYW1zKGMsYSk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKX0sX2h0bWxFc2NhcGUoYSl7cmV0dXJuIGEucmVwbGFjZSgvIC9nLCJcdTAwYTAiKX0sX2ZvY3VzT25Ob2RlKGEpe2lmKG51bGwhPWEpe3ZhciBjPXRoaXMuX3Nob3J0RmlsZVBhdGhzW3RoaXMuX2ZpbGVQYXRoU2VsZWN0ZWRdLmlkLGQ9dGhpczt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToib3BfdHJhY2ViYWNrIixvcF9uYW1lOmF9KS50aGVuKGY9Pntjb25zdCBnPWYub3BfdHJhY2ViYWNrW2FdO2Y9W107Zm9yKGxldCBrPTA7azxnLmxlbmd0aDsrK2spe2NvbnN0IG09Cmdba11bMV07Z1trXVswXT09PWMmJmYucHVzaChtKX1mb3IodmFyIGwgb2YgZC5faGlnaGxpZ2h0ZWRFbGVtZW50cylsLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIik7bD1bXTtmb3IoY29uc3QgayBvZiBmKWY9dGhpcy4kJCgiI3NvdXJjZS1saW5lLSIrayksbC5wdXNoKGYpLGYuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQtc291cmNlLWxpbmUiKSxkLl90b2dnbGVMaW5lTm9kZXMoaywhMCk7ZC5zZXQoIl9oaWdobGlnaHRlZEVsZW1lbnRzIixsKTt0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoYSl9KX19LF9oaWdobGlnaHROb2RlRWxlbWVudHMoYSl7aWYobnVsbCE9dGhpcy5fb2xkRm9jdXNOb2RlTmFtZSlmb3IoY29uc3QgYyBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbdGhpcy5fb2xkRm9jdXNOb2RlTmFtZV0pYy5zdHlsZVsiZm9udC13ZWlnaHQiXT0ibm9ybWFsIjtmb3IoY29uc3QgYyBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbYV0pYy5zdHlsZVsiZm9udC13ZWlnaHQiXT0KImJvbGQiO251bGw9PXRoaXMuX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudD90aGlzLl9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50W2FdLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KTp0aGlzLnNldCgiX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudCIsbnVsbCk7dGhpcy5zZXQoIl9vbGRGb2N1c05vZGVOYW1lIixhKX0sX3BvcHVsYXRlRnVsbFN0YWNrKGEsYyxkKXt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToib3BfdHJhY2ViYWNrIixvcF9uYW1lOmF9KS50aGVuKGY9Pntjb25zdCBnPXRoaXMuJCQoIiNmdWxsLXN0YWNrLWNvbnRlbnQiKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2Zvcihjb25zdCBsIG9mIGYub3BfdHJhY2ViYWNrW2FdKXtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIiksbT1sWzBdLHA9TnVtYmVyKGxbMV0pO2sudGV4dENvbnRlbnQ9Cm0rIjogIitTdHJpbmcocCk7Xy5pbmNsdWRlcyh0aGlzLl9mdWxsRmlsZVBhdGhzLG0pPyhrLmNsYXNzTGlzdC5hZGQoInN0YWNrLWZyYW1lLWNsaWNrYWJsZSIpLGsuc3R5bGUuY29sb3I9ImJsdWUiLGsuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJ1bmRlcmxpbmUiLGsuc3R5bGUuY3Vyc29yPSJwb2ludGVyIixtPT09YyYmcD09PWQmJihrLnN0eWxlWyJmb250LXdlaWdodCJdPSJib2xkIiksay5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5zZXQoIl9maWxlUGF0aFNlbGVjdGVkIix0aGlzLl9mdWxsRmlsZVBhdGhzLmluZGV4T2YobSkpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLl90b2dnbGVMaW5lTm9kZXMocCwhMCk7Zm9yKGNvbnN0IHEgb2YgdGhpcy5fbm9kZU5hbWUyTm9kZUVsZW1lbnRzW2FdKU51bWJlcihxLmdldEF0dHJpYnV0ZSgic291cmNlTGluZW5vIikpPT09TnVtYmVyKHApJiYocS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSksCnRoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixrKSx0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoYSksYz09PW0mJmQ9PT1wfHx0aGlzLl9wb3B1bGF0ZUZ1bGxTdGFjayhhLG0scCkpfSwyKnRoaXMuX3JlbmRlckRlbGF5TWlsbGlzKX0pKTooay5jbGFzc0xpc3QuYWRkKCJzdGFjay1mcmFtZS1ub25jbGlja2FibGUiKSxrLnN0eWxlLmNvbG9yPSIjNTU1Iik7Zy5hcHBlbmRDaGlsZChrKX19KX0sX2Nsb3NlRnVsbFN0YWNrRGlhbG9nKCl7dGhpcy5zZXQoIl9mdWxsU3RhY2tTaG93biIsITEpfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5Ij4KICA8dGVtcGxhdGU+CiAgICA8c3BhbiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+VGVuc29yIFZhbHVlIE92ZXJ2aWV3PC9zcGFuPgogICAgPGRpdiBpZD0idGVuc29yLWRhdGEtZGl2IiBjbGFzcz0idGVuc29yLWRhdGEtZGl2Ij4KICAgICAgPHRhYmxlIGlkPSJ0ZW5zb3ItZGF0YS10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJ0ZW5zb3ItZGF0YS10YWJsZSI+CiAgICAgICAgPHRoZWFkPgogICAgICAgICAgPHRyIGFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgPHRoPlRlbnNvcjwvdGg+CiAgICAgICAgICAgIDx0aD5Db3VudDwvdGg+CiAgICAgICAgICAgIDx0aD5EVHlwZTwvdGg+CiAgICAgICAgICAgIDx0aD5TaGFwZTwvdGg+CiAgICAgICAgICAgIDx0aCB3aWR0aD0iMjUlIj5WYWx1ZTwvdGg+CiAgICAgICAgICAgIDx0aCB3aWR0aD0iMjUlIj4KICAgICAgICAgICAgICBIZWFsdGggUGlsbAogICAgICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGlkPSJzaG93LWhlYWx0aC1waWxscyIgY2hlY2tlZD0ie3tfaGVhbHRoUGlsbHNFbmFibGVkfX0iPgogICAgICAgICAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItY2FyZD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWx0aC1waWxsLWxlZ2VuZCIgaWQ9ImhlYWx0aC1waWxsLWxlZ2VuZCI+PC9kaXY+CiAgICAgICAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICAgICAgICA8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjUlIj48L3RoPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0ICN0ZW5zb3ItZGF0YS1kaXYgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQogICAgICA6aG9zdCAudGVuc29yLWRhdGEtdGFibGUgewogICAgICAgIGFsaWduLWNvbnRlbnQ6IGxlZnQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGxlZnQ7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgfQogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtdGFibGUgdGggewogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KICAgICAgOmhvc3QgLmFjdGl2ZS10ZW5zb3IgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggIzg4ODsKICAgICAgfQogICAgICA6aG9zdCAuaGlnaGxpZ2h0ZWQgewogICAgICAgIGNvbG9yOiByZWQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmhlYWx0aC1waWxsLWxlZ2VuZCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgICAgOmhvc3QgI3Nob3ctaGVhbHRoLXBpbGxzIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgLnZhbHVlLWV4cGFuc2lvbi1saW5rIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLnZhbHVlLWV4cGFuc2lvbi1saW5rIDpob3ZlciB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgLmhlYWx0aC1waWxsIDpob3ZlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZSA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci1kYXRhLXN1bW1hcnkiLHByb3BlcnRpZXM6e2xhdGVzdFRlbnNvckRhdGE6T2JqZWN0LGV4cGFuZEhhbmRsZXI6T2JqZWN0LGNvbnRpbnVlVG9DYWxsYmFjazpGdW5jdGlvbixoaWdobGlnaHRlZE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx0ZW5zb3JOYW1lQ2xpY2tlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9uLF9oZWFsdGhQaWxsc0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxub3RpZnk6ITB9LF93YXRjaEtleXM6e3R5cGU6QXJyYXksdmFsdWU6W119LF93YXRjaEtleTJEYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MkNvdW50Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyVmFsdWVTaG9ydDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJSb3c6e3R5cGU6T2JqZWN0LAp2YWx1ZTp7fX0sX2FjdGl2ZVdhdGNoS2V5OlN0cmluZyxfaGVhbHRoUGlsbFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZToyMDAscmVhZG9ubHk6ITB9LF9oZWFsdGhQaWxsSGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTozMixyZWFkb25seTohMH19LG9ic2VydmVyczpbIl9yZW5kZXJMYXRlc3QobGF0ZXN0VGVuc29yRGF0YSwgZXhwYW5kSGFuZGxlcikiLCJfaGlnaGxpZ2h0KGhpZ2hsaWdodGVkTm9kZU5hbWUpIl0sbGlzdGVuZXJzOnsic2hvdy1oZWFsdGgtcGlsbHMuY2hhbmdlIjoiX3Nob3dIZWFsdGhQaWxsc0NoYW5nZWQifSxyZWFkeSgpe3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKX0sZW5hYmxlSGVhbHRoUGlsbHMoKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxzRW5hYmxlZCIsITApO3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKX0sX3Nob3dIZWFsdGhQaWxsc0NoYW5nZWQoKXt0aGlzLl9oZWFsdGhQaWxsc0VuYWJsZWQ/dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpOgp0aGlzLl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKTt0aGlzLl9yZW5kZXJBbGwoKX0sX3JlbmRlckFsbCgpe3RoaXMuX2NsZWFyVGVuc29yRGF0YVRhYmxlKCk7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fd2F0Y2hLZXlzKXRoaXMuX3JlbmRlckxhdGVzdCh0aGlzLl93YXRjaEtleTJEYXRhW2FdLHRoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbYV0pfSxfdGVuc29yRGF0YTJXYXRjaEtleShhKXtyZXR1cm4gYS5kZXZpY2VOYW1lKyIvIithLnRlbnNvck5hbWUrIjoiK2EuZGVidWdPcH0sX3JlbmRlckxhdGVzdChhLGMpe2lmKGEpe3ZhciBkPXRoaXMuX3RlbnNvckRhdGEyV2F0Y2hLZXkoYSksZj1udWxsOyJVbmluaXRpYWxpemVkIiE9PWEuZHR5cGUmJiJVbnN1cHBvcnRlZCIhPT1hLmR0eXBlJiYoZj0oKT0+YyhhKSk7dmFyIGc9bnVsbCE9YS52YWx1ZT9KU09OLnN0cmluZ2lmeShhLnZhbHVlLChsLGspPT5rLnRvRml4ZWQ/TnVtYmVyKGsudG9GaXhlZCgzKSk6ayk6IihDbGljayB0byB2aWV3KSI7CnRoaXMuX3dhdGNoS2V5MkRhdGFbZF09YTstMT09PXRoaXMuX3dhdGNoS2V5cy5pbmRleE9mKGQpPyh0aGlzLl93YXRjaEtleXMucHVzaChkKSx0aGlzLl93YXRjaEtleTJDb3VudFtkXT0xKTp0aGlzLl93YXRjaEtleTJDb3VudFtkXSs9MTt0aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2RdPWY7dGhpcy5fd2F0Y2hLZXkyVmFsdWVTaG9ydFtkXT1nO3RoaXMuX2FjdGl2ZVdhdGNoS2V5PWQ7dGhpcy5fcmVtb3ZlQWN0aXZlU3RhdHVzRnJvbUFsbFJvd3MoKTt0aGlzLl9yZW5kZXJSb3coZCl9fSxfY2xlYXJUZW5zb3JEYXRhVGFibGUoKXtmb3IoY29uc3QgYSBpbiB0aGlzLl93YXRjaEtleTJSb3cpdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGEpJiYodGhpcy5fd2F0Y2hLZXkyUm93W2FdLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLl93YXRjaEtleTJSb3dbYV0pfSxfY2xlYXJUZW5zb3JEYXRhUm93KGEpe2Zvcig7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9LApfY2xlYXJIZWFsdGhQaWxsTGVnZW5kKCl7Y29uc3QgYT10aGlzLiQkKCIjaGVhbHRoLXBpbGwtbGVnZW5kIik7Zm9yKDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX0sX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKXt0aGlzLl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKTtjb25zdCBhPXRoaXMuJCQoIiNoZWFsdGgtcGlsbC1sZWdlbmQiKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnRleHRDb250ZW50PSJMZWdlbmQ6IjthLmFwcGVuZENoaWxkKGMpO2Muc3R5bGVbIm1hcmdpbi1yaWdodCJdPSIwLjVlbSI7Yy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siO2ZvcihjPTA7Yzx0Zi5ncmFwaC5zY2VuZS5oZWFsdGhQaWxsRW50cmllcy5sZW5ndGg7KytjKXtjb25zdCBkPXRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzW2NdLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOwpmLnN0eWxlWyJtYXJnaW4tcmlnaHQiXT0iMC4yNWVtIjtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLnRleHRDb250ZW50PSJcdTI1YTAiO2cuc3R5bGUuY29sb3I9ZC5iYWNrZ3JvdW5kX2NvbG9yO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2wudGV4dENvbnRlbnQ9ZC5sYWJlbDtsLnN0eWxlLmNvbG9yPWQuYmFja2dyb3VuZF9jb2xvcjtmLmFwcGVuZENoaWxkKGcpO2YuYXBwZW5kQ2hpbGQobCk7YS5hcHBlbmRDaGlsZChmKX19LF9yZW1vdmVBY3RpdmVTdGF0dXNGcm9tQWxsUm93cygpe2Zvcihjb25zdCBhIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl7aWYoIXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShhKSljb250aW51ZTtjb25zdCBjPXRoaXMuX3dhdGNoS2V5MlJvd1thXTtQb2x5bWVyLmRvbShjKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUtdGVuc29yIik7UG9seW1lci5kb20oYykuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKX19LApfcmVuZGVyUm93KGEpe2xldCBjLGQ9ITE7bnVsbCE9dGhpcy5fd2F0Y2hLZXkyUm93W2FdPyhjPXRoaXMuX3dhdGNoS2V5MlJvd1thXSx0aGlzLl9jbGVhclRlbnNvckRhdGFSb3coYyksZD0hMSk6KGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxkPSEwKTtjb25zdCBmPXRoaXMuX3dhdGNoS2V5MkRhdGFbYV0uZGV2aWNlTmFtZSxnPXRoaXMuX3dhdGNoS2V5MkRhdGFbYV0ubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxsPWYrIi8iK2c7dmFyIGs9dGhpcy5fd2F0Y2hLZXkyQ291bnRbYV0sbT10aGlzLl93YXRjaEtleTJEYXRhW2FdLnRlbnNvck5hbWUscD10aGlzLl93YXRjaEtleTJEYXRhW2FdLmRlYnVnT3AscT10aGlzLl93YXRjaEtleTJWYWx1ZVNob3J0W2FdO2NvbnN0IHI9dGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlclthXSx0PWE9PT10aGlzLl9hY3RpdmVXYXRjaEtleSx2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20odikuY2xhc3NMaXN0LmFkZCgidGVuc29yLW5hbWUiKTsKdi5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSI7di5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3YudGV4dENvbnRlbnQ9bTt2LmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9PntudWxsIT10aGlzLnRlbnNvck5hbWVDbGlja2VkJiZ0aGlzLnRlbnNvck5hbWVDbGlja2VkKGYsZyl9KTtjb25zdCBBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7QS50ZXh0Q29udGVudD1rO2NvbnN0IHk9dGhpcy5fd2F0Y2hLZXkyRGF0YVthXS5kdHlwZTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Y29uc3QgeD10aGlzLl93YXRjaEtleTJEYXRhW2FdLnNoYXBlO2sudGV4dENvbnRlbnQ9eTtjb25zdCBDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Qy50ZXh0Q29udGVudD1KU09OLnN0cmluZ2lmeSh4KTtjb25zdCBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ri50ZXh0Q29udGVudD1xO1BvbHltZXIuZG9tKEYpLmNsYXNzTGlzdC5hZGQoInZhbHVlLWV4cGFuc2lvbi1saW5rIik7Cm51bGwhPXImJihGLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsciwhMSksRi5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSIsRi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtxPW51bGw7cT10aGlzLl9oZWFsdGhQaWxsc0VuYWJsZWQ/dGhpcy5fcmVuZGVySGVhbHRoUGlsbChtKyI6IitwLHtkZXZpY2VfbmFtZTpmLG5vZGVfbmFtZTpnLGR0eXBlOnksc2hhcGU6eCx2YWx1ZTpudWxsfSxyKTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7cC5zZXRBdHRyaWJ1dGUoImljb24iLCJmb3J3YXJkIik7cC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQ29udGludWUgdG8iKTtwLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3RoaXMuY29udGludWVUb0NhbGxiYWNrKGYsZyl9KTttLmFwcGVuZENoaWxkKHApO2MuYXBwZW5kQ2hpbGQodik7CmMuYXBwZW5kQ2hpbGQoQSk7Yy5hcHBlbmRDaGlsZChrKTtjLmFwcGVuZENoaWxkKEMpO2MuYXBwZW5kQ2hpbGQoRik7Yy5hcHBlbmRDaGlsZChxKTtjLmFwcGVuZENoaWxkKG0pO2Muc2V0QXR0cmlidXRlKCJub2RlTmFtZVdpdGhEZXZpY2UiLGwpO3QmJihQb2x5bWVyLmRvbShjKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUtdGVuc29yIiksUG9seW1lci5kb20oYykuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQiKSk7dGhpcy5fd2F0Y2hLZXkyUm93W2FdPWM7ZCYmUG9seW1lci5kb20odGhpcy4kJCgiI3RlbnNvci1kYXRhLXRhYmxlIHRib2R5IikpLmFwcGVuZENoaWxkKGMpO2Muc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJlbmQiLGlubGluZToibmVhcmVzdCIsYmVoYXZpb3VyOiJzbW9vdGgifSl9LF9yZW5kZXJIZWFsdGhQaWxsKGEsYyxkKXtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20oZikuY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwiKTsKbnVsbCE9ZCYmZi5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLGQsITEpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRmLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsInN2ZyIpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5faGVhbHRoUGlsbFdpZHRoKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0Iix0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0KTtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0Zi5ncmFwaC5zY2VuZS5TVkdfTkFNRVNQQUNFLCJnIik7ZC5hcHBlbmRDaGlsZChnKTtmLmFwcGVuZENoaWxkKGQpO2NvbnN0IGw9InRkcC8iK2E7dGhpcy5nZXRIZWFsdGhQaWxsKGEsYy5kZXZpY2VfbmFtZSxjLm5vZGVfbmFtZSxrPT57bnVsbD09az8oZi50ZXh0Q29udGVudD0iTi9BIixmLnN0eWxlLmNvbG9yPSJncmF5Iik6KGMudmFsdWU9ayx0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxsKGcsYyxudWxsLGwsdGhpcy5faGVhbHRoUGlsbFdpZHRoLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQvCjIsdGhpcy5faGVhbHRoUGlsbEhlaWdodC8yLDApKX0pO3JldHVybiBmfSxfaGlnaGxpZ2h0KGEpe1BvbHltZXIuZG9tKHRoaXMuJCQoIiN0ZW5zb3ItZGF0YS10YWJsZSIpKTtjb25zdCBjPVtdO2Zvcihjb25zdCBkIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl7aWYoIXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShkKSljb250aW51ZTtjb25zdCBmPXRoaXMuX3dhdGNoS2V5MlJvd1tkXTtudWxsIT1mLmdldEF0dHJpYnV0ZSYmKGYuZ2V0QXR0cmlidXRlKCJub2RlTmFtZVdpdGhEZXZpY2UiKT09PWE/Yy5wdXNoKGYpOlBvbHltZXIuZG9tKGYpLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIikpfWlmKG51bGwhPWEpZm9yKGE9MDthPGMubGVuZ3RoOysrYSlQb2x5bWVyLmRvbShjW2FdKS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpLGNbYV0uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJlbmQiLGlubGluZToibmVhcmVzdCIsYmVoYXZpb3VyOiJzbW9vdGgifSl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RlbnNvci13aWRnZXQvdGVuc29yX3dpZGdldF9iaW5hcnkuanMKdmFyIGptPXRoaXMmJnRoaXMuX19nZW5lcmF0b3J8fGZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChxKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIGYoW3Escl0pfX1mdW5jdGlvbiBmKHEpe2lmKGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpO2Zvcig7ZzspdHJ5e2lmKGw9MSxrJiYobT1xWzBdJjI/a1sicmV0dXJuIl06cVswXT9rWyJ0aHJvdyJdfHwoKG09a1sicmV0dXJuIl0pJiZtLmNhbGwoayksMCk6ay5uZXh0KSYmIShtPW0uY2FsbChrLHFbMV0pKS5kb25lKXJldHVybiBtO2lmKGs9MCxtKXE9W3FbMF0mMixtLnZhbHVlXTtzd2l0Y2gocVswXSl7Y2FzZSAwOmNhc2UgMTptPXE7YnJlYWs7Y2FzZSA0OnJldHVybiBnLmxhYmVsKysse3ZhbHVlOnFbMV0sZG9uZTohMX07Y2FzZSA1OmcubGFiZWwrKztrPXFbMV07cT1bMF07Y29udGludWU7Y2FzZSA3OnE9Zy5vcHMucG9wKCk7Zy50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoIShtPQpnLnRyeXMsbT0wPG0ubGVuZ3RoJiZtW20ubGVuZ3RoLTFdKSYmKDY9PT1xWzBdfHwyPT09cVswXSkpe2c9MDtjb250aW51ZX1pZigzPT09cVswXSYmKCFtfHxxWzFdPm1bMF0mJnFbMV08bVszXSkpZy5sYWJlbD1xWzFdO2Vsc2UgaWYoNj09PXFbMF0mJmcubGFiZWw8bVsxXSlnLmxhYmVsPW1bMV0sbT1xO2Vsc2UgaWYobSYmZy5sYWJlbDxtWzJdKWcubGFiZWw9bVsyXSxnLm9wcy5wdXNoKHEpO2Vsc2V7bVsyXSYmZy5vcHMucG9wKCk7Zy50cnlzLnBvcCgpO2NvbnRpbnVlfX1xPWMuY2FsbChhLGcpfWNhdGNoKHIpe3E9WzYscl0saz0wfWZpbmFsbHl7bD1tPTB9aWYocVswXSY1KXRocm93IHFbMV07cmV0dXJue3ZhbHVlOnFbMF0/cVsxXTp2b2lkIDAsZG9uZTohMH19dmFyIGc9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKG1bMF0mMSl0aHJvdyBtWzFdO3JldHVybiBtWzFdfSx0cnlzOltdLG9wczpbXX0sbCxrLG0scDtyZXR1cm4gcD17bmV4dDpkKDApLCJ0aHJvdyI6ZCgxKSwKInJldHVybiI6ZCgyKX0sImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJihwW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHB9LGttPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoRCxCLEcsSyl7cmV0dXJuIG5ldyAoR3x8KEc9UHJvbWlzZSkpKGZ1bmN0aW9uKEwsSil7ZnVuY3Rpb24gUChUKXt0cnl7TihLLm5leHQoVCkpfWNhdGNoKFkpe0ooWSl9fWZ1bmN0aW9uIFMoVCl7dHJ5e04oS1sidGhyb3ciXShUKSl9Y2F0Y2goWSl7SihZKX19ZnVuY3Rpb24gTihUKXtULmRvbmU/TChULnZhbHVlKToobmV3IEcoZnVuY3Rpb24oWSl7WShULnZhbHVlKX0pKS50aGVuKFAsUyl9TigoSz1LLmFwcGx5KEQsQnx8W10pKS5uZXh0KCkpfSl9ZnVuY3Rpb24gZChEKXtyZXR1cm4gbnVsbCE9PUQubWF0Y2goL15pbnRbMC05XSskLyl8fG51bGwhPT1ELm1hdGNoKC9edWludFswLTldKyQvKX1mdW5jdGlvbiBmKEQpe3JldHVybiBudWxsIT09RC5tYXRjaCgvXmZsb2F0WzAtOV0rJC8pfHwKbnVsbCE9PUQubWF0Y2goL15iZmxvYXRbMC05XSskLyl9ZnVuY3Rpb24gZyhEKXtyZXR1cm4iYm9vbCI9PT1ELnRvTG93ZXJDYXNlKCl8fCJib29sZWFuIj09PUQudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBsKEQpe3JldHVybiJzdHIiPT09RC50b0xvd2VyQ2FzZSgpfHwic3RyaW5nIj09PUQudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBrKEQpe3ZhciBCPTE7RC5mb3JFYWNoKGZ1bmN0aW9uKEcpe0IqPUd9KTtyZXR1cm4gQn1mdW5jdGlvbiBtKEQpe3JldHVybiAwPT09RC5sZW5ndGg/InNjYWxhciI6IlsiK0QrIl0ifWZ1bmN0aW9uIHAoRCl7dmFyIEI9e3NsaWNpbmdEaW1zQW5kSW5kaWNlczpbXSx2aWV3aW5nRGltczpbXSx2ZXJ0aWNhbFJhbmdlOm51bGwsaG9yaXpvbnRhbFJhbmdlOm51bGx9LEc9RC5sZW5ndGg7aWYoMT09PUcpQi52aWV3aW5nRGltcz1bMF07ZWxzZSBpZigxPEcpe2lmKDI8Rylmb3IodmFyIEs9MDtLPEctMjsrK0spQi5zbGljaW5nRGltc0FuZEluZGljZXMucHVzaCh7ZGltOkssCmluZGV4OjA9PT1EW0tdP251bGw6MH0pO2ZvcihLPUQubGVuZ3RoLTI7SzxELmxlbmd0aDsrK0spQi52aWV3aW5nRGltcy5wdXNoKEspfXJldHVybiBCfWZ1bmN0aW9uIHEoRCxCKXtpZihELnZpZXdpbmdEaW1zWzBdIT09Qi52aWV3aW5nRGltc1swXXx8RC52aWV3aW5nRGltc1sxXSE9PUIudmlld2luZ0RpbXNbMV0pcmV0dXJuITE7Qj1ELnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oRyl7cmV0dXJuIEcuZGltfSk7Qi5zb3J0KCk7RD1ELnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oRyl7cmV0dXJuIEcuZGltfSk7RC5zb3J0KCk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KEIpPT09SlNPTi5zdHJpbmdpZnkoRCl9ZnVuY3Rpb24gcihEKXtyZXR1cm4gMjA+PUQubGVuZ3RoP0Q6RC5zbGljZSgwLDEwKSsiLi4uIitELnNsaWNlKEQubGVuZ3RoLTcsRC5sZW5ndGgpfWZ1bmN0aW9uIHQoRCxCLEcsSyl7dm9pZCAwPT09RyYmKEc9Mik7aWYoaXNOYU4oRCkpcmV0dXJuIk5hTiI7CmlmKC1JbmZpbml0eT09PUQpcmV0dXJuIi1cdTIyMWUiO2lmKEluZmluaXR5PT09RClyZXR1cm4iK1x1MjIxZSI7bnVsbD09SyYmKEs9TWF0aC5hYnMoRCksSz0xRTM+SyYmLjAxPD1LfHwwPT09Sz8iZml4ZWQiOiJleHBvbmVudGlhbCIpO3JldHVybiBudWxsPT1LfHwiZml4ZWQiPT09Sz9CPyIiK0Q6RC50b0ZpeGVkKEcpOkQudG9FeHBvbmVudGlhbChHKX1mdW5jdGlvbiB2KEQsQil7dm9pZCAwPT09QiYmKEI9ITApO3JldHVybiBEP0I/IlQiOiJUcnVlIjpCPyJGIjoiRmFsc2UifWZ1bmN0aW9uIEEoRCxCKXt2b2lkIDA9PT1CJiYoQj00KTtyZXR1cm4gbnVsbD09PUJ8fEQubGVuZ3RoPD1CP0Q6RC5zbGljZSgwLEItMSkrIlx1MjAyNiJ9dmFyIHk7KGZ1bmN0aW9uKEQpe0RbRC5VUD0xXT0iVVAiO0RbRC5ET1dOPTJdPSJET1dOIjtEW0QuTEVGVD0zXT0iTEVGVCI7RFtELlJJR0hUPTRdPSJSSUdIVCJ9KSh5fHwoeT17fSkpO3ZhciB4PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRChCLEcsSywKTCxKLFApe3RoaXMuc2hhcGU9Qjt0aGlzLnNsaWNlRGltcz1bXTt0aGlzLnNsaWNlSW5kaWNlcz1bXTtpZigwPT09ayh0aGlzLnNoYXBlKSl0aHJvdyBFcnJvcigiVGVuc29yRWxlbWVudFNlbGVjdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGVuc29yIHdpdGggemVybyBlbGVtZW50cy4iKTtmb3IoQj0wO0I8Ry5zbGljaW5nRGltc0FuZEluZGljZXMubGVuZ3RoOysrQil7dGhpcy5zbGljZURpbXMucHVzaChHLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tCXS5kaW0pO3ZhciBTPUcuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW0JdLmluZGV4O2lmKG51bGw9PT1TKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIFRlbnNvckVsZW1lbnRTZWxlY3Rpb24gZHVlIHRvIHVuZGV0ZXJtaW5lZCBzbGljaW5nIGluZGV4IGF0IGRpbWVuc2lvbiAiK0IpO3RoaXMuc2xpY2VJbmRpY2VzLnB1c2goUyl9dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoO2lmKDA8dGhpcy5yYW5rJiZ0aGlzLnNsaWNlRGltcy5sZW5ndGg+PQp0aGlzLnJhbmspdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHNsaWNlRGltcyB0byBoYXZlIGEgbGVuZ3RoIGxlc3MgdGhhbiByYW5rICIrdGhpcy5yYW5rKyIsICIrKCJidXQgZ290IGxlbmd0aCAiK3RoaXMuc2xpY2VEaW1zLmxlbmd0aCkpO3RoaXMudmlld0RpbXM9W107Zm9yKEI9MDtCPHRoaXMucmFuazsrK0IpLTE9PT10aGlzLnNsaWNlRGltcy5pbmRleE9mKEIpJiZ0aGlzLnZpZXdEaW1zLnB1c2goQik7aWYoMjx0aGlzLnZpZXdEaW1zLmxlbmd0aCl0aHJvdyBFcnJvcigiT25seSBzZWxlY3Rpb25zIGluIDFEIGFuZCAyRCBhcmUgc3VwcG9ydGVkLiIpO3RoaXMucm93U3RhcnQ9bnVsbD09Sz8wOks7dGhpcy5jb2xTdGFydD1udWxsPT1MPzA6TDt0aGlzLnJvd0NvdW50PW51bGw9PUo/MTpKO3RoaXMuY29sQ291bnQ9bnVsbD09UD8xOlB9RC5wcm90b3R5cGUuZ2V0RWxlbWVudFN0YXR1cz1mdW5jdGlvbihCKXtpZihCLmxlbmd0aCE9PXRoaXMucmFuayl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgaW5kaWNlcyB0byBoYXZlIGEgcmFuayBvZiAiKwp0aGlzLnJhbmsrIiwgIisoImJ1dCBnb3QgIitCLmxlbmd0aCsiIChbIitCKyJdKSIpKTtmb3IodmFyIEc9MDtHPEIubGVuZ3RoOysrRylpZigtMSE9PXRoaXMuc2xpY2VEaW1zLmluZGV4T2YoRykmJkJbR10hPT10aGlzLnNsaWNlSW5kaWNlc1t0aGlzLnNsaWNlRGltcy5pbmRleE9mKEcpXSlyZXR1cm4gbnVsbDtHPW51bGw7dmFyIEs9dGhpcy5yb3dTdGFydCt0aGlzLnJvd0NvdW50LEw9dGhpcy5jb2xTdGFydCt0aGlzLmNvbENvdW50O2lmKDA9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCkwPT09Qi5sZW5ndGgmJihHPXt0b3BFZGdlOiEwLGJvdHRvbUVkZ2U6ITAsbGVmdEVkZ2U6ITAscmlnaHRFZGdlOiEwfSk7ZWxzZSBpZigxPT09dGhpcy52aWV3RGltcy5sZW5ndGgpe3ZhciBKPXRoaXMudmlld0RpbXNbMF07QltKXT49dGhpcy5yb3dTdGFydCYmQltKXTxLJiYoRz17dG9wRWRnZTpCW0pdPT09dGhpcy5yb3dTdGFydCxib3R0b21FZGdlOkJbSl09PT1LLTEsbGVmdEVkZ2U6ITAscmlnaHRFZGdlOiEwfSl9ZWxzZSBpZigyPT09CnRoaXMudmlld0RpbXMubGVuZ3RoKXtKPXRoaXMudmlld0RpbXNbMF07dmFyIFA9dGhpcy52aWV3RGltc1sxXTtCW0pdPj10aGlzLnJvd1N0YXJ0JiZCW0pdPEsmJkJbUF0+PXRoaXMuY29sU3RhcnQmJkJbUF08TCYmKEc9e3RvcEVkZ2U6QltKXT09PXRoaXMucm93U3RhcnQsYm90dG9tRWRnZTpCW0pdPT09Sy0xLGxlZnRFZGdlOkJbUF09PT10aGlzLmNvbFN0YXJ0LHJpZ2h0RWRnZTpCW1BdPT09TC0xfSl9ZWxzZSB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBsZW5ndGggb2Ygdmlld0RpbXM6ICIrdGhpcy52aWV3RGltcyk7cmV0dXJuIEd9O0QucHJvdG90eXBlLm1vdmU9ZnVuY3Rpb24oQixHKXt2YXIgSz1udWxsO2lmKDA9PT10aGlzLnJhbmt8fDE9PT10aGlzLnJhbmsmJihCPT09eS5MRUZUfHxCPT09eS5SSUdIVCkpcmV0dXJuIG51bGw7aWYobnVsbD09PUcudmVydGljYWxSYW5nZXx8bnVsbD09PUcudmVydGljYWxSYW5nZVsxXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIG1vdmUgZHVlIHRvIHVuZGV0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTsKQj09PXkuVVA/MDx0aGlzLnJvd1N0YXJ0JiYodGhpcy5yb3dTdGFydC0tLG51bGwhPUcudmVydGljYWxSYW5nZSYmdGhpcy5yb3dTdGFydDxHLnZlcnRpY2FsUmFuZ2VbMF0mJihLPXkuVVApKTpCPT09eS5ET1dOP251bGwhPUcudmlld2luZ0RpbXMmJm51bGwhPUcudmlld2luZ0RpbXNbMF0mJnRoaXMucm93U3RhcnQ8dGhpcy5zaGFwZVtHLnZpZXdpbmdEaW1zWzBdXS0xJiYodGhpcy5yb3dTdGFydCsrLG51bGwhPUcudmVydGljYWxSYW5nZSYmdGhpcy5yb3dTdGFydD49Ry52ZXJ0aWNhbFJhbmdlWzFdJiYoSz15LkRPV04pKTpCPT09eS5MRUZUPzA8dGhpcy5jb2xTdGFydCYmKHRoaXMuY29sU3RhcnQtLSxudWxsIT1HLmhvcml6b250YWxSYW5nZSYmdGhpcy5jb2xTdGFydDxHLmhvcml6b250YWxSYW5nZVswXSYmKEs9eS5MRUZUKSk6Qj09PXkuUklHSFQmJm51bGwhPUcudmlld2luZ0RpbXMmJm51bGwhPUcudmlld2luZ0RpbXNbMV0mJnRoaXMuY29sU3RhcnQ8dGhpcy5zaGFwZVtHLnZpZXdpbmdEaW1zWzFdXS0KMSYmKHRoaXMuY29sU3RhcnQrKyxudWxsIT1HLmhvcml6b250YWxSYW5nZSYmdGhpcy5jb2xTdGFydD49Ry5ob3Jpem9udGFsUmFuZ2VbMV0mJihLPXkuUklHSFQpKTt0aGlzLmNvbENvdW50PXRoaXMucm93Q291bnQ9MTtyZXR1cm4gS307RC5wcm90b3R5cGUuZ2V0Um93U3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dTdGFydH07RC5wcm90b3R5cGUuZ2V0Um93Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dDb3VudH07RC5wcm90b3R5cGUuZ2V0Q29sU3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xTdGFydH07RC5wcm90b3R5cGUuZ2V0Q29sQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xDb3VudH07cmV0dXJuIER9KCksQz1mdW5jdGlvbigpe2Z1bmN0aW9uIEQoQixHLEspe3ZvaWQgMD09PUsmJihLPWZ1bmN0aW9uKCl7fSk7dGhpcy5yb290RGl2PUI7dGhpcy5zaGFwZT1HO3RoaXMub25TbGljaW5nU3BlY0NoYW5nZT1LO3RoaXMuZGltQ29udHJvbHM9CltdO3RoaXMuZGltSW5wdXRzPVtdO3RoaXMuY29tbWFzPVtdO3RoaXMuZHJvcGRvd25zPVtdO3RoaXMuYnJhY2tldERpdnM9W251bGwsbnVsbF07dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoO2lmKDM+dGhpcy5yYW5rKXRocm93IEVycm9yKCJEaW1lbnNpb24gY29udHJvbCBpcyBub3QgYXBwbGljYWJsZSB0byB0ZW5zb3Igc2hhcGVzIGxlc3MgdGhhbiAiKygiM0Q6IHJlY2VpdmVkICIrdGhpcy5yYW5rKyJEIHRlbnNvciBzaGFwZTogIikrKEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcGUpKyIuIikpO3RoaXMuY3JlYXRlQ29tcG9uZW50cygpO3RoaXMuc2xpY2luZ1NwZWM9cChHKX1ELnByb3RvdHlwZS5jcmVhdGVDb21wb25lbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciBCPXRoaXM7dGhpcy5yb290RGl2LmZpcnN0Q2hpbGQ7KXRoaXMucm9vdERpdi5yZW1vdmVDaGlsZCh0aGlzLnJvb3REaXYuZmlyc3RDaGlsZCk7dGhpcy5kaW1Db250cm9scz0KW107dGhpcy5kaW1JbnB1dHM9W107dGhpcy5jb21tYXM9W107dGhpcy5kcm9wZG93bnM9W107dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5icmFja2V0RGl2c1swXT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmJyYWNrZXREaXZzWzBdLnRleHRDb250ZW50PSJTbGljaW5nOiBbIjt0aGlzLmJyYWNrZXREaXZzWzBdLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWJyYWNrZXRzIik7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMuYnJhY2tldERpdnNbMF0pO2Zvcih2YXIgRz0wO0c8dGhpcy5yYW5rOysrRyl7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO0sudGl0bGU9IkRpbWVuc2lvbiAiK0crIjogc2l6ZVx4M2QiK3RoaXMuc2hhcGVbR107dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKEspO3RoaXMuZGltQ29udHJvbHMucHVzaChLKTt0aGlzLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZC5wdXNoKCExKTsKSz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0iKTtLLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChLKTt0aGlzLmRpbUlucHV0cy5wdXNoKEspO0c8dGhpcy5yYW5rLTEmJihLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEsuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tY29tbWEiKSxLLnRleHRDb250ZW50PSIsIix0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoSyksdGhpcy5jb21tYXMucHVzaChLKSk7Sz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtLLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7Sy5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoSyk7dGhpcy5kcm9wZG93bnMucHVzaChLKX10aGlzLmJyYWNrZXREaXZzWzFdPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmJyYWNrZXREaXZzWzFdLnRleHRDb250ZW50PSJdIjt0aGlzLmJyYWNrZXREaXZzWzFdLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWJyYWNrZXRzIik7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMuYnJhY2tldERpdnNbMV0pO3RoaXMucm9vdERpdi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe0IuY2xlYXJBbGxEcm9wZG93bnMoKX0pfTtELnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oQil7ZnVuY3Rpb24gRyhTKXt2YXIgTj1QLmRpbUNvbnRyb2xzW1NdLFQ9UC5kaW1JbnB1dHNbU10sWT1QLmRyb3Bkb3duc1tTXTtpZigibm9uZSIhPT1ULnN0eWxlLmRpc3BsYXkpcmV0dXJuImNvbnRpbnVlIjt2YXIgYWE9UC5zaGFwZVtTXTtpZigtMSE9PUwuaW5kZXhPZihTKSl7dmFyIGhhPUpbTC5pbmRleE9mKFMpXTtOLnRleHRDb250ZW50PVN0cmluZyhoYSk7VC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO1QudHlwZT0KIm51bWJlciI7VC5taW49IjAiO1QubWF4PVN0cmluZyhhYS0xKTtULnZhbHVlPVN0cmluZyhoYSk7UC5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbU118fChOLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe0suY2xlYXJBbGxEcm9wZG93bnMoKTtOLnN0eWxlLmRpc3BsYXk9Im5vbmUiO1Quc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0pLFQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixmdW5jdGlvbigpe2lmKG51bGw9PT1LLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgY2hhbmdlIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzcGVjLiIpO3ZhciBYPXBhcnNlSW50KFQudmFsdWUsMTApOyFpc0Zpbml0ZShYKXx8MD5YfHxYPj1hYXx8TWF0aC5mbG9vcihhYSkhPWFhP1QudmFsdWU9U3RyaW5nKEsuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW0wuaW5kZXhPZihTKV0uaW5kZXgpOihLLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tMLmluZGV4T2YoUyldLmluZGV4PQpYLE4udGV4dENvbnRlbnQ9U3RyaW5nKFgpLEsub25TbGljaW5nU3BlY0NoYW5nZShLLnNsaWNpbmdTcGVjKSl9KSxULmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLGZ1bmN0aW9uKCl7VC5zdHlsZS5kaXNwbGF5PSJub25lIjtOLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayJ9KSxQLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFtTXT0hMCl9ZWxzZXtpZihQLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdPT09Uyl7aWYobnVsbD09PVAuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZS4iKTtOLnRleHRDb250ZW50PSJcdTIxOTUgIitQLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rIjoiKygiIitQLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV0pfWVsc2V7aWYobnVsbD09PVAuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UuIik7Ti50ZXh0Q29udGVudD0KIlx1MjE5NCAiK1Auc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdKyI6IisoIiIrUC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV0pfU4uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0iKTtQLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFtTXXx8KE4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIFg9Ti5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtLLnJlbmRlckRyb3Bkb3duTWVudUl0ZW1zKFksWC5ib3R0b20sWC5sZWZ0LFMpfSksUC5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbU109ITApfX12YXIgSz10aGlzO251bGwhPUImJih0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQikpKTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiU2xpY2luZyBjb250cm9sIHJlbmRlcmluZyBmYWlsZWQgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3ZhciBMPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihTKXtyZXR1cm4gUy5kaW19KSwKSj10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuIFMuaW5kZXh9KSxQPXRoaXM7Zm9yKEI9MDtCPHRoaXMucmFuazsrK0IpRyhCKX07RC5wcm90b3R5cGUucmVuZGVyRHJvcGRvd25NZW51SXRlbXM9ZnVuY3Rpb24oQixHLEssTCl7ZnVuY3Rpb24gSihhYSl7aWYoLTE9PT1TLmluZGV4T2YoYWEpfHxMPT09Ti5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXSYmYWE8PU4uc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF18fEw9PU4uc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF0mJmFhPj1OLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdKXJldHVybiJjb250aW51ZSI7dmFyIGhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2hhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2hhLnRleHRDb250ZW50PSJTd2FwIHdpdGggZGltZW5zaW9uICIrYWE7Qi5hcHBlbmRDaGlsZChoYSk7CmhhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLGZ1bmN0aW9uKCl7aGEuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpO1AuZGltQ29udHJvbHNbYWFdLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIil9KTtoYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2hhLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtQLmRpbUNvbnRyb2xzW2FhXS5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7dmFyIFg9Ti5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXT09PUw7aGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7aWYobnVsbD09PVAuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIkRpbWVuc2lvbiBzd2FwcGluZyBmYWlsZWQgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjIik7CnZhciBjYT1TLmluZGV4T2YoYWEpO1Auc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbWD8wOjFdPWFhO1Auc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW2NhXT17ZGltOkwsaW5kZXg6MH07UC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPW51bGw7UC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9bnVsbDtpZihQLm9uU2xpY2luZ1NwZWNDaGFuZ2UpUC5vblNsaWNpbmdTcGVjQ2hhbmdlKFAuc2xpY2luZ1NwZWMpfSl9dmFyIFA9dGhpcztpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiU2xpY2luZyBjb250cm9sIGNhbm5vdCByZW5kZXIgZHJvcGRvd24gbWVudSBpdGVtcyBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMuIik7dGhpcy5jbGVhckFsbERyb3Bkb3ducygpO2Zvcih2YXIgUz10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oYWEpe3JldHVybiBhYS5kaW19KSxOPXRoaXMsVD0wO1Q8dGhpcy5yYW5rOysrVClKKFQpOwpCLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Qi5zdHlsZS5kaXNwbGF5PSJub25lIn0pO2lmKEIuZmlyc3RDaGlsZCl7Qi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO0Iuc3R5bGUudG9wPUcrInB4IjtCLnN0eWxlLmxlZnQ9SysicHgiO0Iuc3R5bGUuZGlzcGxheT0iYmxvY2siO1Q9Qi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgWT1ULmxlZnQtSztCLnN0eWxlLnRvcD0oRy0oVC50b3AtRykpLnRvRml4ZWQoMSkrInB4IjtCLnN0eWxlLmxlZnQ9KEstWSkudG9GaXhlZCgxKSsicHgifX07RC5wcm90b3R5cGUuc2V0U2xpY2luZ1NwZWM9ZnVuY3Rpb24oQil7dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEIpKTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldCBzbGljaW5nIHNwZWMgdG8gbnVsbC4iKTt0aGlzLnJlbmRlcih0aGlzLnNsaWNpbmdTcGVjKX07RC5wcm90b3R5cGUuY2xlYXJBbGxEcm9wZG93bnM9CmZ1bmN0aW9uKCl7dGhpcy5kcm9wZG93bnMuZm9yRWFjaChmdW5jdGlvbihCKXtpZihudWxsIT1CKXtmb3IoO0IuZmlyc3RDaGlsZDspQi5yZW1vdmVDaGlsZChCLmZpcnN0Q2hpbGQpO0Iuc3R5bGUuZGlzcGxheT0ibm9uZSJ9fSl9O3JldHVybiBEfSgpLEY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBEKEIsRyxLKXt0aGlzLnJvb3RFbGVtZW50PUI7dGhpcy50ZW5zb3JWaWV3PUc7dGhpcy5iYXNlUnVsZXJUaWNrPXRoaXMudG9wUnVsZXI9dGhpcy52YWx1ZVNlY3Rpb249dGhpcy5zbGljaW5nU3BlY1Jvb3Q9dGhpcy5pbmZvU3Vic2VjdGlvbj10aGlzLmhlYWRlclNlY3Rpb249bnVsbDt0aGlzLnRvcFJ1bGVyVGlja3M9W107dGhpcy5sZWZ0UnVsZXJUaWNrcz1bXTt0aGlzLnZhbHVlUm93cz1bXTt0aGlzLnZhbHVlRGl2cz1bXTt0aGlzLnNsaWNpbmdDb250cm9sPXRoaXMudmFsdWVUb29sdGlwPW51bGw7dGhpcy5jb2xzQ3V0b2ZmPXRoaXMucm93c0N1dG9mZj0hMTt0aGlzLnNlbGVjdGlvbj0KbnVsbDt0aGlzLm9wdGlvbnM9S3x8e307dGhpcy5zbGljaW5nU3BlYz1wKHRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlKTt0aGlzLnJhbms9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUubGVuZ3RofUQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBqbSh0aGlzLGZ1bmN0aW9uKEIpe3N3aXRjaChCLmxhYmVsKXtjYXNlIDA6dGhpcy5yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0Iik7dGhpcy5yZW5kZXJIZWFkZXIoKTtpZighKGQodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxmKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8Zyh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGwodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpKSl0aHJvdyBFcnJvcigiUmVuZGVyaW5nIGR0eXBlICIrdGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUrIiBpcyBub3Qgc3VwcG9ydGVkIHlldC4iKTsKcmV0dXJuWzQsdGhpcy5yZW5kZXJWYWx1ZXMoKV07Y2FzZSAxOnJldHVybiBCLnNlbnQoKSxbMl19fSl9KX07RC5wcm90b3R5cGUucmVuZGVySGVhZGVyPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5oZWFkZXJTZWN0aW9uJiYodGhpcy5oZWFkZXJTZWN0aW9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuaGVhZGVyU2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWhlYWRlciIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oZWFkZXJTZWN0aW9uKSk7dGhpcy5yZW5kZXJJbmZvKCl9O0QucHJvdG90eXBlLnJlbmRlckluZm89ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5oZWFkZXJTZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIGluZm8gZmFpbGVkIGR1ZSB0byBtaXNpbmcgaGVhZGVyIHNlY3Rpb24iKTtudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uJiYodGhpcy5pbmZvU3Vic2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5pbmZvU3Vic2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWluZm8iKSx0aGlzLmhlYWRlclNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy5pbmZvU3Vic2VjdGlvbikpO2Zvcig7dGhpcy5pbmZvU3Vic2VjdGlvbi5maXJzdENoaWxkOyl0aGlzLmluZm9TdWJzZWN0aW9uLnJlbW92ZUNoaWxkKHRoaXMuaW5mb1N1YnNlY3Rpb24uZmlyc3RDaGlsZCk7dGhpcy5yZW5kZXJOYW1lKCk7dGhpcy5yZW5kZXJEVHlwZSgpO3RoaXMucmVuZGVyU2hhcGUoKX07RC5wcm90b3R5cGUucmVuZGVyTmFtZT1mdW5jdGlvbigpe2lmKG51bGw9PXRoaXMuaW5mb1N1YnNlY3Rpb24pdGhyb3cgRXJyb3IoIlJlbmRlcmluZyB0ZW5zb3IgbmFtZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO2lmKG51bGwhPXRoaXMub3B0aW9ucy5uYW1lJiYwIT09dGhpcy5vcHRpb25zLm5hbWUubGVuZ3RoKXt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtCLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdGVuc29yLW5hbWUiKTsKQi50ZXh0Q29udGVudD1yKHRoaXMub3B0aW9ucy5uYW1lKTtCLnRpdGxlPXRoaXMub3B0aW9ucy5uYW1lO3RoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoQil9fTtELnByb3RvdHlwZS5yZW5kZXJEVHlwZT1mdW5jdGlvbigpe2lmKG51bGw9PXRoaXMuaW5mb1N1YnNlY3Rpb24pdGhyb3cgRXJyb3IoIlJlbmRlcmluZyB0ZW5zb3IgZHR5cGUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTt2YXIgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtCLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZHR5cGUiKTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Ry5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWR0eXBlLWxhYmVsIik7Ry50ZXh0Q29udGVudD0iZHR5cGU6IjtCLmFwcGVuZENoaWxkKEcpO0c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO0cudGV4dENvbnRlbnQ9dGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGU7CkIuYXBwZW5kQ2hpbGQoRyk7dGhpcy5pbmZvU3Vic2VjdGlvbi5hcHBlbmRDaGlsZChCKX07RC5wcm90b3R5cGUucmVuZGVyU2hhcGU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIHNoYXBlIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBpbmZvIHN1YnNlY3Rpb24uIik7dmFyIEI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Qi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNoYXBlIik7dmFyIEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ry5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIik7Ry50ZXh0Q29udGVudD0ic2hhcGU6IjtCLmFwcGVuZENoaWxkKEcpO0c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ry5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIik7Ry50ZXh0Q29udGVudD1tKHRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlKTsKQi5hcHBlbmRDaGlsZChHKTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKEIpfTtELnByb3RvdHlwZS5yZW5kZXJWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYyh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgQj10aGlzO3JldHVybiBqbSh0aGlzLGZ1bmN0aW9uKEcpe3N3aXRjaChHLmxhYmVsKXtjYXNlIDA6cmV0dXJuIDI8dGhpcy5yYW5rJiZudWxsPT09dGhpcy5zbGljaW5nU3BlY1Jvb3QmJih0aGlzLnNsaWNpbmdTcGVjUm9vdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNsaWNpbmdTcGVjUm9vdC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2xpY2luZ1NwZWNSb290KSksbnVsbD09dGhpcy52YWx1ZVNlY3Rpb24mJih0aGlzLnZhbHVlU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnZhbHVlU2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXNlY3Rpb24iKSwKdGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnZhbHVlU2VjdGlvbiksdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGZ1bmN0aW9uKEspe3JldHVybiBjKEIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBqbSh0aGlzLGZ1bmN0aW9uKEwpe3N3aXRjaChMLmxhYmVsKXtjYXNlIDA6aWYobnVsbD09dGhpcy5zZWxlY3Rpb24pcmV0dXJuWzJdO0suc3RvcFByb3BhZ2F0aW9uKCk7Sy5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpO3JldHVybls0LHRoaXMuc2Nyb2xsVXBPckRvd24oMDxLLmRlbHRhWT95LkRPV046eS5VUCldO2Nhc2UgMTpyZXR1cm4gTC5zZW50KCksWzJdfX0pfSl9KSx0aGlzLnZhbHVlU2VjdGlvbi50YWJJbmRleD0xMDI0LHRoaXMudmFsdWVTZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKEspe3ZhciBMPVszOCw0MCwzNywzOV07aWYobnVsbCE9Qi5zZWxlY3Rpb24mJgotMSE9PUwuaW5kZXhPZihLLmtleUNvZGUpKXtLLnN0b3BQcm9wYWdhdGlvbigpO0sucHJldmVudERlZmF1bHQoKTtCLmhpZGVWYWx1ZVRvb2x0aXAoKTt2YXIgSj1MPW51bGw7Mzg9PT1LLmtleUNvZGU/Sj15LlVQOjQwPT09Sy5rZXlDb2RlP0o9eS5ET1dOOjM3PT09Sy5rZXlDb2RlP0o9eS5MRUZUOjM5PT09Sy5rZXlDb2RlJiYoSj15LlJJR0hUKTtudWxsIT09SiYmKEw9Qi5zZWxlY3Rpb24ubW92ZShKLEIuc2xpY2luZ1NwZWMpKTtudWxsPT09TD9CLnJlbmRlclNlbGVjdGlvbigpOkw9PT15LlVQfHxMPT09eS5ET1dOP0Iuc2Nyb2xsVXBPckRvd24oTCk6KEw9PT15LkxFRlR8fEw9PT15LlJJR0hUKSYmQi5zY3JvbGxMZWZ0T3JSaWdodChMKX19KSksdGhpcy5jbGVhclZhbHVlU2VjdGlvbigpLHRoaXMuY3JlYXRlVG9wUnVsZXIoKSx0aGlzLmNyZWF0ZUxlZnRSdWxlcigpLHRoaXMuY3JlYXRlVmFsdWVEaXZzKCksWzQsdGhpcy5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKV07Y2FzZSAxOnJldHVybiBHLnNlbnQoKSwKMjx0aGlzLnJhbmsmJih0aGlzLnNsaWNpbmdDb250cm9sPW5ldyBDKHRoaXMuc2xpY2luZ1NwZWNSb290LHRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlLGZ1bmN0aW9uKEspe3JldHVybiBjKEIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBqbSh0aGlzLGZ1bmN0aW9uKEwpe3N3aXRjaChMLmxhYmVsKXtjYXNlIDA6aWYocSh0aGlzLnNsaWNpbmdTcGVjLEspKXJldHVyblszLDJdO3RoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShLKSk7cmV0dXJuWzQsdGhpcy5yZW5kZXIoKV07Y2FzZSAxOnJldHVybiBMLnNlbnQoKSxbMyw0XTtjYXNlIDI6cmV0dXJuIHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShLKSksWzQsdGhpcy5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKV07Y2FzZSAzOkwuc2VudCgpLEwubGFiZWw9NDtjYXNlIDQ6cmV0dXJuWzJdfX0pfSl9KSx0aGlzLnNsaWNpbmdDb250cm9sLnJlbmRlcih0aGlzLnNsaWNpbmdTcGVjKSksClsyXX19KX0pfTtELnByb3RvdHlwZS5jbGVhclZhbHVlU2VjdGlvbj1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLnZhbHVlU2VjdGlvbil7Zm9yKDt0aGlzLnZhbHVlU2VjdGlvbi5maXJzdENoaWxkOyl0aGlzLnZhbHVlU2VjdGlvbi5yZW1vdmVDaGlsZCh0aGlzLnZhbHVlU2VjdGlvbi5maXJzdENoaWxkKTt0aGlzLnRvcFJ1bGVyPW51bGw7dGhpcy52YWx1ZVJvd3M9W119fTtELnByb3RvdHlwZS5jcmVhdGVUb3BSdWxlcj1mdW5jdGlvbigpe3ZhciBCPXRoaXM7aWYobnVsbD09PXRoaXMudmFsdWVTZWN0aW9uKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHRvcCBydWxlciBkdWUgdG8gbWlzc2luZyB2YWx1ZSBzZWN0aW9uLiIpO251bGw9PXRoaXMudG9wUnVsZXImJih0aGlzLnRvcFJ1bGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudG9wUnVsZXIuY2xhc3NMaXN0LmFkZCgidGVuZXNvci13aWRnZXQtdG9wLXJ1bGVyIiksdGhpcy50b3BSdWxlci5zdHlsZS53aGl0ZVNwYWNlPQoibm93cmFwIix0aGlzLnZhbHVlU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLnRvcFJ1bGVyKSx0aGlzLnRvcFJ1bGVyVGlja3M9W10sdGhpcy50b3BSdWxlci5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZnVuY3Rpb24oUCl7cmV0dXJuIGMoQix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIGptKHRoaXMsZnVuY3Rpb24oUyl7c3dpdGNoKFMubGFiZWwpe2Nhc2UgMDppZihudWxsPT10aGlzLnNlbGVjdGlvbilyZXR1cm5bMl07UC5zdG9wUHJvcGFnYXRpb24oKTtQLnByZXZlbnREZWZhdWx0KCk7dGhpcy5oaWRlVmFsdWVUb29sdGlwKCk7cmV0dXJuWzQsdGhpcy5zY3JvbGxMZWZ0T3JSaWdodCgwPFAuZGVsdGFZP3kuUklHSFQ6eS5MRUZUKV07Y2FzZSAxOnJldHVybiBTLnNlbnQoKSxbMl19fSl9KX0pKTtmb3IoO3RoaXMudG9wUnVsZXIuZmlyc3RDaGlsZDspdGhpcy50b3BSdWxlci5yZW1vdmVDaGlsZCh0aGlzLnRvcFJ1bGVyLmZpcnN0Q2hpbGQpO3RoaXMuYmFzZVJ1bGVyVGljaz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5iYXNlUnVsZXJUaWNrLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2siKTt0aGlzLnRvcFJ1bGVyLmFwcGVuZENoaWxkKHRoaXMuYmFzZVJ1bGVyVGljayk7Mjw9dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9WzAsbnVsbF0pO3ZhciBHPTE+PXRoaXMucmFuaz8xOnRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO3ZhciBLPXRoaXMucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7dGhpcy5jb2xzQ3V0b2ZmPSExO2Zvcih2YXIgTD0wO0w8RzsrK0wpe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0ouY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpO3RoaXMudG9wUnVsZXIuYXBwZW5kQ2hpbGQoSik7dGhpcy50b3BSdWxlclRpY2tzLnB1c2goSik7CmlmKEouZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ+PUspe2lmKDI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1MKzE7dGhpcy5jb2xzQ3V0b2ZmPSEwfWJyZWFrfX1pZighdGhpcy5jb2xzQ3V0b2ZmJiYyPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09R319O0QucHJvdG90eXBlLmNyZWF0ZUxlZnRSdWxlcj1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLnZhbHVlU2VjdGlvbil0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBsZWZ0IHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7CnRoaXMudmFsdWVSb3dzPVtdO3RoaXMubGVmdFJ1bGVyVGlja3M9W107MTw9dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPVswLG51bGxdKTt2YXIgQj0wPT09dGhpcy5yYW5rPzE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07dGhpcy5yb3dzQ3V0b2ZmPSExO2Zvcih2YXIgRz10aGlzLnJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSxLPTA7SzxCOysrSyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7TC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyIpO3RoaXMudmFsdWVTZWN0aW9uLmFwcGVuZENoaWxkKEwpO3RoaXMudmFsdWVSb3dzLnB1c2goTCk7dmFyIEo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Si5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7TC5hcHBlbmRDaGlsZChKKTsKdGhpcy5sZWZ0UnVsZXJUaWNrcy5wdXNoKEopO2lmKEouZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tPj1HKXtpZigxPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09SysxO3RoaXMucm93c0N1dG9mZj0hMH1icmVha319aWYoIXRoaXMucm93c0N1dG9mZiYmMTw9dGhpcy5yYW5rKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdPUJ9fTtELnByb3RvdHlwZS5jcmVhdGVWYWx1ZURpdnM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBCKFMpe2Z1bmN0aW9uIE4oWSl7dmFyIGFhPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdiIpO0oudmFsdWVSb3dzW1NdLmFwcGVuZENoaWxkKGFhKTtKLnZhbHVlRGl2c1tTXS5wdXNoKGFhKTthYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtHLnNlbGVjdGlvbj1uZXcgeChHLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxHLnNsaWNpbmdTcGVjLG51bGw9PUcuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZXx8bnVsbD09Ry5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdPzA6Ry5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdK1MsbnVsbD09Ry5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2V8fG51bGw9PUcuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdPzA6Ry5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rWSwxLDEpO0cucmVuZGVyU2VsZWN0aW9uKCl9KTthYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwKZnVuY3Rpb24oKXt2YXIgaGE9YWEuZ2V0QXR0cmlidXRlKCJkZXRhaWxlZC12YWx1ZSIpO2lmKG51bGwhPT1oYSl7dmFyIFg9Ry5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjYT1hYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlYT1jYS5ib3R0b20tY2EudG9wLGthPWNhLnJpZ2h0LWNhLmxlZnQsYmE9Ry5jYWxjdWxhdGVJbmRpY2VzKFMsWSk7Ry5kcmF3VmFsdWVUb29sdGlwKGJhLGhhLGNhLnRvcC1YLnRvcCsuOCplYSxjYS5sZWZ0LVgubGVmdCsuNzUqa2EpfX0pO2FhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Ry5oaWRlVmFsdWVUb29sdGlwKCl9KX1KLnZhbHVlRGl2c1tTXT1bXTtmb3IodmFyIFQ9MDtUPEs7KytUKU4oVCl9dmFyIEc9dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZhbHVlIHJvd3MgYXJlIHVuZXhwZWN0ZWRseSB1bmluaXRpYWxpemVkLiIpO3RoaXMudmFsdWVEaXZzPVtdO2Zvcih2YXIgSz0KdGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aCxMPXRoaXMudmFsdWVSb3dzLmxlbmd0aCxKPXRoaXMsUD0wO1A8TDsrK1ApQihQKX07RC5wcm90b3R5cGUucmVuZGVyVG9wUnVsZXI9ZnVuY3Rpb24oKXtpZigyPD10aGlzLnJhbmspZm9yKHZhciBCPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dLEc9MDtHPHRoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGg7KytHKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3ZhciBLPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK0c7dGhpcy50b3BSdWxlclRpY2tzW0ddLnRleHRDb250ZW50PUs8Qj8iIitLOiIifX07RC5wcm90b3R5cGUucmVuZGVyTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYoMTw9dGhpcy5yYW5rKWZvcih2YXIgQj0KdGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0sRz0wO0c8dGhpcy5sZWZ0UnVsZXJUaWNrcy5sZW5ndGg7KytHKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRjaWFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7dmFyIEs9dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdK0c7dGhpcy5sZWZ0UnVsZXJUaWNrc1tHXS50ZXh0Q29udGVudD1LPEI/IiIrSzoiIn19O0QucHJvdG90eXBlLnJlbmRlclZhbHVlRGl2cz1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBCLEcsSyxMLEosUCxTLE47cmV0dXJuIGptKHRoaXMsZnVuY3Rpb24oVCl7c3dpdGNoKFQubGFiZWwpe2Nhc2UgMDpyZXR1cm4gQj10aGlzLnZhbHVlRGl2cy5sZW5ndGgsRz10aGlzLnZhbHVlRGl2c1swXS5sZW5ndGgsCls0LHRoaXMudGVuc29yVmlldy52aWV3KHRoaXMuc2xpY2luZ1NwZWMpXTtjYXNlIDE6Sz1ULnNlbnQoKTswPT09dGhpcy5yYW5rP0s9W1tLXV06MT09PXRoaXMucmFuayYmKEs9Sy5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuW1ldfSkpO0w9dGhpcy5nZXRWYWx1ZUNsYXNzKCk7Zm9yKEo9MDtKPEI7KytKKWZvcihQPTA7UDxHOysrUClTPXRoaXMudmFsdWVEaXZzW0pdW1BdLEo8Sy5sZW5ndGgmJlA8S1tKXS5sZW5ndGg/KE49S1tKXVtQXSwibnVtZXJpYyI9PT1MP1MudGV4dENvbnRlbnQ9dChOLGQodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpKToiYm9vbGVhbiI9PT1MP1MudGV4dENvbnRlbnQ9dihOKToic3RyaW5nIj09PUwmJihTLnRleHRDb250ZW50PUEoTikpLFMuc2V0QXR0cmlidXRlKCJkZXRhaWxlZC12YWx1ZSIsdGhpcy5nZXREZXRhaWxlZFZhbHVlVG9vbHRpcFN0cmluZyhOKSkpOihTLnRleHRDb250ZW50PSIiLFMuc2V0QXR0cmlidXRlKCJkZXRhaWxlZC12YWx1ZSIsIiIpKTsKdGhpcy5yZW5kZXJTZWxlY3Rpb24oKTtyZXR1cm5bMl19fSl9KX07RC5wcm90b3R5cGUuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmc9ZnVuY3Rpb24oQil7cmV0dXJuImJvb2xlYW4iPT09dGhpcy5nZXRWYWx1ZUNsYXNzKCk/dihCLCExKToic3RyaW5nIj09PXRoaXMuZ2V0VmFsdWVDbGFzcygpPyJMZW5ndGgtIitCLmxlbmd0aCsnIHN0cmluZzogIicrQShCLDUwMCkrJyInOlN0cmluZyhCKX07RC5wcm90b3R5cGUucmVuZGVyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5zZWxlY3Rpb24pZm9yKHZhciBCPXRoaXMudmFsdWVEaXZzLmxlbmd0aCxHPXRoaXMudmFsdWVEaXZzWzBdLmxlbmd0aCxLPTA7SzxCOysrSylmb3IodmFyIEw9MDtMPEc7KytMKXt2YXIgSj10aGlzLnZhbHVlRGl2c1tLXVtMXTtKLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiIpO0ouY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCIpOwpKLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKTtKLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0Iik7Si5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tcmlnaHQiKTt2YXIgUD10aGlzLmNhbGN1bGF0ZUluZGljZXMoSyxMKTtQPXRoaXMuc2VsZWN0aW9uLmdldEVsZW1lbnRTdGF0dXMoUCk7bnVsbCE9PVAmJihKLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiIpLFAudG9wRWRnZSYmSi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIiksUC5ib3R0b21FZGdlJiZKLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKSxQLmxlZnRFZGdlJiZKLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IiksClAucmlnaHRFZGdlJiZKLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCIpKX19O0QucHJvdG90eXBlLmNhbGN1bGF0ZUluZGljZXM9ZnVuY3Rpb24oQixHKXtmb3IodmFyIEs9W10sTD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uZGltfSksSj10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uaW5kZXh9KSxQPTA7UDx0aGlzLnJhbms7KytQKWlmKC0xIT09TC5pbmRleE9mKFApKXt2YXIgUz1KW0wuaW5kZXhPZihQKV07aWYobnVsbD09PVMpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlczogVW5kZXRlcm1pbmVkIGluZGV4IGF0IGRpbWVuc2lvbiAiK1ApO0sucHVzaChTKX1lbHNlIGlmKFA9PT10aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlfHwKbnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzIGR1ZSB0byB1bmRlcnRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO0sucHVzaCh0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rQil9ZWxzZSBpZihQPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXSl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlfHxudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlcyBkdWUgdG8gdW5kZXJ0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTtLLnB1c2godGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rRyl9cmV0dXJuIEt9O0QucHJvdG90eXBlLmRyYXdWYWx1ZVRvb2x0aXA9ZnVuY3Rpb24oQixHLEssTCl7bnVsbD09PXRoaXMudmFsdWVUb29sdGlwJiYKKHRoaXMudmFsdWVUb29sdGlwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmFsdWVUb29sdGlwLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52YWx1ZVRvb2x0aXApKTtmb3IoO3RoaXMudmFsdWVUb29sdGlwLmZpcnN0Q2hpbGQ7KXRoaXMudmFsdWVUb29sdGlwLnJlbW92ZUNoaWxkKHRoaXMudmFsdWVUb29sdGlwLmZpcnN0Q2hpbGQpO3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0ouY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMiKTtKLnRleHRDb250ZW50PSJJbmRpY2VzOiAiK0pTT04uc3RyaW5naWZ5KEIpO3RoaXMudmFsdWVUb29sdGlwLmFwcGVuZENoaWxkKEopO0I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Qi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtdmFsdWUiKTsKQi50ZXh0Q29udGVudD1HO3RoaXMudmFsdWVUb29sdGlwLmFwcGVuZENoaWxkKEIpO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLnRvcD1LKyJweCI7dGhpcy52YWx1ZVRvb2x0aXAuc3R5bGUubGVmdD1MKyJweCI7dGhpcy52YWx1ZVRvb2x0aXAuc3R5bGUuZGlzcGxheT0iYmxvY2sifTtELnByb3RvdHlwZS5oaWRlVmFsdWVUb29sdGlwPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy52YWx1ZVRvb2x0aXAmJih0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS5kaXNwbGF5PSJub25lIil9O0QucHJvdG90eXBlLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cz1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBqbSh0aGlzLGZ1bmN0aW9uKEIpe3N3aXRjaChCLmxhYmVsKXtjYXNlIDA6cmV0dXJuIG51bGwhPXRoaXMuc2xpY2luZ0NvbnRyb2wmJnRoaXMuc2xpY2luZ0NvbnRyb2wuc2V0U2xpY2luZ1NwZWModGhpcy5zbGljaW5nU3BlYyksdGhpcy5yZW5kZXJUb3BSdWxlcigpLAp0aGlzLnJlbmRlckxlZnRSdWxlcigpLFs0LHRoaXMucmVuZGVyVmFsdWVEaXZzKCldO2Nhc2UgMTpyZXR1cm4gQi5zZW50KCksWzJdfX0pfSl9O0QucHJvdG90eXBlLnNjcm9sbEhvcml6b250YWxseT1mdW5jdGlvbihCKXtyZXR1cm4gYyh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgRyxLO3JldHVybiBqbSh0aGlzLGZ1bmN0aW9uKEwpe3N3aXRjaChMLmxhYmVsKXtjYXNlIDA6aWYoMT49dGhpcy5yYW5rKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO0c9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07aWYoMD5CfHxCPj1HKXRocm93IEVycm9yKCJJbmRleCBvdXQgb2YgYm91bmQ6ICIrQisiIGlzIG91dHNpZGUgWzAsICIrRysiXSkiKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXT0KQjt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1CK3RoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGg7Sz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdXTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT5LJiYodGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09Syk7cmV0dXJuWzQsdGhpcy5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKV07Y2FzZSAxOnJldHVybiBMLnNlbnQoKSxbMl19fSl9KX07RC5wcm90b3R5cGUuc2Nyb2xsVmVydGljYWxseT1mdW5jdGlvbihCKXtyZXR1cm4gYyh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgRyxLO3JldHVybiBqbSh0aGlzLGZ1bmN0aW9uKEwpe3N3aXRjaChMLmxhYmVsKXtjYXNlIDA6aWYoMD09PXRoaXMucmFuaylyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgIisKdGhpcy5yYW5rKyJEIHRlbnNvci4iKTtpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZlcnRpY2FsIHNjcm9sbGluZyBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgdmFsdWUgcm93cy4iKTtHPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF1dO2lmKDA+Qnx8Qj49Ryl0aHJvdyBFcnJvcigiSW5kZXggb3V0IG9mIGJvdW5kOiAiK0IrIiBpcyBvdXRzaWRlIFswLCAiK0crIl0pIik7dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdPUI7dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdPUIrdGhpcy52YWx1ZVJvd3MubGVuZ3RoO0s9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdPksmJih0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09Syk7cmV0dXJuWzQsdGhpcy5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKV07CmNhc2UgMTpyZXR1cm4gTC5zZW50KCksWzJdfX0pfSl9O0QucHJvdG90eXBlLnNjcm9sbFVwT3JEb3duPWZ1bmN0aW9uKEIpe3JldHVybiBjKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBHLEssTDtyZXR1cm4gam0odGhpcyxmdW5jdGlvbihKKXtzd2l0Y2goSi5sYWJlbCl7Y2FzZSAwOmlmKDA9PT10aGlzLnJhbmt8fCF0aGlzLnJvd3NDdXRvZmYpcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTtpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZlcnRpY2FsIHNjcm9sbGluZyBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgdmFsdWUgcm93cy4iKTtHPXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXTtpZihCIT09eS5ET1dOKXJldHVyblszLDNdO0s9dGhpcy52YWx1ZVJvd3MubGVuZ3RoLQoxO0w9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0tSztyZXR1cm4gRzxMP1s0LHRoaXMuc2Nyb2xsVmVydGljYWxseShHKzEpXTpbMywyXTtjYXNlIDE6Si5zZW50KCksSi5sYWJlbD0yO2Nhc2UgMjpyZXR1cm5bMyw1XTtjYXNlIDM6cmV0dXJuIDA8PUctMT9bNCx0aGlzLnNjcm9sbFZlcnRpY2FsbHkoRy0xKV06WzMsNV07Y2FzZSA0Okouc2VudCgpLEoubGFiZWw9NTtjYXNlIDU6cmV0dXJuWzJdfX0pfSl9O0QucHJvdG90eXBlLnNjcm9sbExlZnRPclJpZ2h0PWZ1bmN0aW9uKEIpe3JldHVybiBjKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBHLEssTDtyZXR1cm4gam0odGhpcyxmdW5jdGlvbihKKXtzd2l0Y2goSi5sYWJlbCl7Y2FzZSAwOmlmKDE+PXRoaXMucmFua3x8IXRoaXMuY29sc0N1dG9mZilyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJIb3Jpem9udGFsIHNjcm9sbGluZyBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTsKRz10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXTtpZihCIT09eS5SSUdIVClyZXR1cm5bMywzXTtLPXRoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGgtMTtMPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dLUs7cmV0dXJuIEc8TD9bNCx0aGlzLnNjcm9sbEhvcml6b250YWxseShHKzEpXTpbMywyXTtjYXNlIDE6Si5zZW50KCksSi5sYWJlbD0yO2Nhc2UgMjpyZXR1cm5bMyw1XTtjYXNlIDM6cmV0dXJuIDA8PUctMT9bNCx0aGlzLnNjcm9sbEhvcml6b250YWxseShHLTEpXTpbMyw1XTtjYXNlIDQ6Si5zZW50KCksSi5sYWJlbD01O2Nhc2UgNTpyZXR1cm5bMl19fSl9KX07RC5wcm90b3R5cGUubmF2aWdhdGVUb0luZGljZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYyh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gam0odGhpcyxmdW5jdGlvbigpe3Rocm93IEVycm9yKCJuYXZpZ2F0ZVRvSW5kaWNlcygpIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7Cn0pfSl9O0QucHJvdG90eXBlLmdldFZhbHVlQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgQj10aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZTtyZXR1cm4gZChCKXx8ZihCKT8ibnVtZXJpYyI6ZyhCKT8iYm9vbGVhbiI6InN0cmluZyJ9O3JldHVybiBEfSgpO2EudGVuc29yV2lkZ2V0PWZ1bmN0aW9uKEQsQixHKXtyZXR1cm4gbmV3IEYoRCxCLEcpfTthLlZFUlNJT049IjAuMC4wIjtyZXR1cm4gYX0oe30pOwo8L3NjcmlwdD4KPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwogIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWR0eXBlIHsKICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiA0OHB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcGFkZGluZy1sZWZ0OiAxNHB4OwogIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWR0eXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1oZWFkZXIgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTIsIDI1MiwgMjUyKTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGhlaWdodDogNDBweDsKICBsaW5lLWhlaWdodDogNDBweDsKICBtYXgtaGVpZ2h0OiA0MHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiAxMDAlOwp9CgoudGVuc29yLXdpZGdldC1pbmZvIHsKICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgY29sb3I6IHJnYigwLCAwLCAyNTUpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDIycHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWFyZ2luLWxlZnQ6IDhweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGVuc29yLXdpZGdldC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwogIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWR0eXBlIHsKICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiA0OHB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcGFkZGluZy1sZWZ0OiAxNHB4OwogIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWR0eXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1oZWFkZXIgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTIsIDI1MiwgMjUyKTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGhlaWdodDogNDBweDsKICBsaW5lLWhlaWdodDogNDBweDsKICBtYXgtaGVpZ2h0OiA0MHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiAxMDAlOwp9CgoudGVuc29yLXdpZGdldC1pbmZvIHsKICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgY29sb3I6IHJnYigwLCAwLCAyNTUpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDIycHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWFyZ2luLWxlZnQ6IDhweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Ij4KICA8dGVtcGxhdGU+CiAgICA8dnotbGluZS1jaGFydDIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfbGluZUNoYXJ0WENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW19saW5lQ2hhcnRZVmFsdWVBY2Nlc3Nvcl1dIiB0b29sdGlwLWNvbHVtbnM9IltbX2xpbmVDaGFydFRvb2x0aXBDb2x1bW5zXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19saW5lQ2hhcnRTbW9vdGhpbmdFbmFibGVkXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICA8c3R5bGU+CiAgICAgIHZ6LWxpbmUtY2hhcnQyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWxpbmUtY2hhcnQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItbGluZS1jaGFydCIscHJvcGVydGllczp7ZGF0YTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2RlZmF1bHRTZXJpZXNOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZToiX19kZWJ1Z2dlcl9kYXRhX18iLHJlYWRvbmx5OiEwfSxfbGluZUNoYXJ0WENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PigpPT57Y29uc3QgYT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOmEsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhhLCJib3R0b20iKSxhY2Nlc3NvcjpjPT5jLnN0ZXB9fX0sX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+YT0+YS5zY2FsYXJ9LF9saW5lQ2hhcnRUb29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTooKT0+W3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6YT0+CiJzdGVwXHgzZCIrYS5kYXR1bS5zdGVwKyI7IHNjYWxhclx4M2QgIithLmRhdHVtLnNjYWxhcn1dfSxfbGluZUNoYXJ0U21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb2JzZXJ2ZXJzOlsicmVuZGVyKGRhdGEpIl0scmVuZGVyKGEpe2lmKG51bGwhPWEpe3ZhciBjPXRoaXMuJCQoInZ6LWxpbmUtY2hhcnQyIik7Yy5zZXRWaXNpYmxlU2VyaWVzKFt0aGlzLl9kZWZhdWx0U2VyaWVzTmFtZV0pO3ZhciBkPVtdLGY9YS54O2E9YS55O2ZvcihsZXQgZz0wO2c8Zi5sZW5ndGg7KytnKWQucHVzaCh7c3RlcDpmW2ddLHNjYWxhcjphW2ddfSk7Yy5zZXRTZXJpZXNEYXRhKHRoaXMuX2RlZmF1bHRTZXJpZXNOYW1lLGQpfX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItdG9hc3QgaWQ9InRlbnNvclZhbHVlVG9hc3QiIHRleHQ9IiIgYWx3YXlzLW9uLXRvcD48L3BhcGVyLXRvYXN0PgogICAgPHRhYmxlIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtdmlldy10YWJsZSI+CiAgICAgIDx0cj4KICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8cGFwZXItaXRlbSBpZD0idGVuc29yLW5hbWUiIG9uLXRhcD0idGVuc29yTmFtZUNhbGxiYWNrIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGVuc29yLW5hbWUtdGV4dCI+W1t0ZW5zb3JOYW1lXV08L3NwYW4+CiAgICAgICAgICAgIDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBjbGFzcz0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgaWQ9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIHRpdGxlPSJDbG9zZSIgb24tdGFwPSJjbG9zZUJ1dHRvbkNhbGxiYWNrIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZm9yd2FyZCIgY2xhc3M9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIGlkPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiB0aXRsZT0iQ29udGludWUgdG8iIG9uLXRhcD0iY29udGludWVUb0J1dHRvbkNhbGxiYWNrIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtdmFsdWUtdHIiPgogICAgICAgIDx0ZD4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdXNlVGVuc29yV2lkZ2V0XV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3Itd2lkZ2V0Ij48L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfdXNlVGVuc29yV2lkZ2V0XV0iPgogICAgICAgICAgICA8cGFwZXItaXRlbSBpZD0iZGVidWctb3AiPjwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImlubGluZSB2YWx1ZS1jYXJkLWlucHV0IiBsYWJlbD0iU2xpY2luZyIgaWQ9InNsaWNpbmciIHZhbHVlPSJ7e3NsaWNpbmd9fSIgb24tY2hhbmdlPSJyZWZyZXNoIj4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImlubGluZSB2YWx1ZS1jYXJkLWlucHV0IiBsYWJlbD0iVGltZSBJbmRpY2VzIiBpZD0idGltZS1pbmRpY2VzIiB2YWx1ZT0ie3t0aW1lSW5kaWNlc319IiBvbi1jaGFuZ2U9InJlZnJlc2giPgogICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGlkPSJ0aW1lLWluZGljZXMtdG9nZ2xlLWJ1dHRvbiIgY2xhc3M9InRlbnNvci12YWx1ZS1idXR0b25zIiBvbi1jbGljaz0iX3RpbWVJbmRpY2VzVG9nZ2xlQnV0dG9uQ2FsbGJhY2siPkZ1bGwgSGlzdG9yeTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICA8L2Rpdj48L3RlbXBsYXRlPjwvdGQ+PHRkIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtdmlldy10ZCI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVmFsdWVTY2FsYXJdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBjbGFzcz0iaW5saW5lIiBsYWJlbD0iU2NhbGFyIFZhbHVlIiBpZD0idmFsdWUtc2NhbGFyIiB2YWx1ZT0iW1tfZGF0YVNjYWxhcl1dIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVmFsdWVMaW5lQ2hhcnRdXSI+CiAgICAgICAgICAgICAgICAgIDx0Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0IGRhdGE9IltbX2xpbmVDaGFydERhdGFdXSI+PC90Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNWYWx1ZUltYWdlXV0iPgogICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPSJ2YWx1ZS1pbWFnZSIgaGVpZ2h0PSIyNTBweCIgd2lkdGg9IjI1MHB4IiBzcmMkPSJbW19kYXRhSW1hZ2VTcmNdXSI+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIAogICAgICAgICAgCiAgICAgICAgCiAgICAgIDwvdHI+CiAgICA8L3RhYmxlPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0ZW5zb3Itd2lkZ2V0LXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAudGVuc29yLXZhbHVlLWJ1dHRvbnMgewogICAgICAgIGhlaWdodDogNzUlOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgfQogICAgICAudGVuc29yLXZhbHVlLXZpZXctdGFibGUgewogICAgICAgIHdpZHRoOiA1MDBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtdGFibGU7CiAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDVweDsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAxcHggMXB4ICNkOGQ4ZDg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRkIHsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgIH0KICAgICAgLnZhbHVlLWNhcmQtaW5wdXQgewogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgfQogICAgICAjdGVuc29yLW5hbWUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLnRlbnNvci1uYW1lLXRleHQgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CiAgICAgICNkZWJ1Zy1vcCB7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgIH0KICAgICAgLnZhbHVlLWltYWdlIHsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgfQogICAgICAudmFsdWUtdmlldy1pY29uLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICB3aWR0aDogMjAlOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgICAjdGVuc29yLXdpZGdldCB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogICAgICAgIC8qIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CiAgICAgICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsgKi8KICAgICAgICBoZWlnaHQ6IDI4MHB4OwogICAgICAgIHdpZHRoOiA0ODRweDsKICAgICAgfQogICAgICAjc2xpY2luZywKICAgICAgI3RpbWUtaW5kaWNlcyB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi10ZW5zb3ItdmFsdWUtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi10ZW5zb3ItdmFsdWUtdmlldyIscHJvcGVydGllczp7dmlld0lkOlN0cmluZyx0ZW5zb3JOYW1lOlN0cmluZyxkZWJ1Z09wOlN0cmluZyxzbGljaW5nOlN0cmluZyx0aW1lSW5kaWNlczpTdHJpbmcsZHR5cGU6U3RyaW5nLHNoYXBlOkFycmF5LGNvbnRpbnVlVG9CdXR0b25DYWxsYmFjazpPYmplY3QsY2xvc2VCdXR0b25DYWxsYmFjazpPYmplY3QsdGVuc29yTmFtZUNhbGxiYWNrOk9iamVjdCx0ZW5zb3JXaWRnZXQ6T2JqZWN0LF9pc1RlbnNvclZhbHVlU2NhbGFyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pc1RlbnNvclZhbHVlTGluZUNoYXJ0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pc1RlbnNvclZhbHVlSW1hZ2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2RhdGFTY2FsYXI6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9LF9saW5lQ2hhcnREYXRhOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9kYXRhSW1hZ2VTcmM6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LApfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUGsuUmVxdWVzdE1hbmFnZXIoMTApfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVRpbWVJbmRpY2VzVG9nZ2xlKHRpbWVJbmRpY2VzKSJdLHJlbmRlclRlbnNvclZhbHVlKCl7aWYodGhpcy50ZW5zb3JOYW1lKWlmKG51bGw9PXRoaXMuc2xpY2luZyl7dGhpcy5zZXQoIl91c2VUZW5zb3JXaWRnZXQiLCEwKTtjb25zdCBjPXtzcGVjOntkdHlwZTp0aGlzLmR0eXBlLHNoYXBlOnRoaXMuc2hhcGV9LGdldDooKT0+e3Rocm93IEVycm9yKCJ0ZW5zb3JWaWV3LmdldCgpIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7fSx2aWV3OmQ9Pntjb25zdCBmPXRoaXM7cmV0dXJuIERiKGZ1bmN0aW9uKigpe2NvbnN0IGc9Zi5zaGFwZS5sZW5ndGgsbD1kLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAocD0+cC5kaW0pLGs9ZC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKHA9PnAuaW5kZXgpO2xldCBtPSJbIjtmb3IobGV0IHA9MDtwPApnOysrcCktMSE9PWwuaW5kZXhPZihwKT9tKz1gJHtrW2wuaW5kZXhPZihwKV19YDpkLnZpZXdpbmdEaW1zWzBdPT09cD9tKz1gJHtkLnZlcnRpY2FsUmFuZ2VbMF19OiR7ZC52ZXJ0aWNhbFJhbmdlWzFdfWA6ZC52aWV3aW5nRGltc1sxXT09PXAmJihtKz1gJHtkLmhvcml6b250YWxSYW5nZVswXX06JHtkLmhvcml6b250YWxSYW5nZVsxXX1gKSxwPGctMSYmKG0rPSIsIik7bSs9Il0iO3JldHVybiBuZXcgUHJvbWlzZSgocCxxKT0+e2NvbnN0IHI9Zi5fZ2V0VGVuc29yRGF0YVVSTCh7d2F0Y2hfa2V5OmYudGVuc29yTmFtZSsiOiIrZi5kZWJ1Z09wLHNsaWNpbmc6bSx0aW1lX2luZGljZXM6Zi50aW1lSW5kaWNlcyxtYXBwaW5nOiJub25lIn0pO2YuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QocikudGhlbih0PT57bnVsbD09dC5lcnJvcj9wKHQudGVuc29yX2RhdGFbdC50ZW5zb3JfZGF0YS5sZW5ndGgtMV0pOnEodC5lcnJvcil9KS5jYXRjaCh0PT5xKHQpKX0pfSl9fTtzZXRUaW1lb3V0KCgpPT4Ke251bGw9PXRoaXMudGVuc29yV2lkZ2V0JiYodGhpcy50ZW5zb3JXaWRnZXQ9a20udGVuc29yV2lkZ2V0KHRoaXMuJCQoIiN0ZW5zb3Itd2lkZ2V0IiksYykpO3RoaXMudGVuc29yV2lkZ2V0LnJlbmRlcigpfSwxMCl9ZWxzZXt0aGlzLnNldCgiX3VzZVRlbnNvcldpZGdldCIsITEpO3ZhciBhPXRoaXMuX3JhbmtGcm9tU2xpY2luZyh0aGlzLnNsaWNpbmcudHJpbSgpKTtjb25zdCBjPXRoaXMuX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKHRoaXMudGltZUluZGljZXMpO2xldCBkPWE7aWYoIWMpe2lmKDE8YSl7dGhpcy5fc2hvd1RvYXN0KCJIaXN0b3J5IGZvciB0ZW5zb3JzIFx4M2UgMUQgaXMgbm90IHlldCBzdXBwb3J0ZWQuIik7cmV0dXJufWQrPTF9YT10aGlzLl9nZXRUZW5zb3JEYXRhVVJMKHt3YXRjaF9rZXk6dGhpcy50ZW5zb3JOYW1lKyI6Iit0aGlzLmRlYnVnT3Asc2xpY2luZzp0aGlzLnNsaWNpbmcsdGltZV9pbmRpY2VzOnRoaXMudGltZUluZGljZXMsbWFwcGluZzoyPD1kPwoiaW1hZ2UvcG5nIjoibm9uZSJ9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oZj0+e3RoaXMuJCQoIiNkZWJ1Zy1vcCIpLnRleHRDb250ZW50PXRoaXMuX2NhbGN1bGF0ZURlYnVnT3BUb0Rpc3BsYXkoKTtpZihudWxsIT1mLmVycm9yKXRoaXMuX3Nob3dUb2FzdChmLmVycm9yLnR5cGUrIjogIitmLmVycm9yLm1lc3NhZ2UpO2Vsc2UgaWYoZj1jP2YudGVuc29yX2RhdGFbMF06Zi50ZW5zb3JfZGF0YSwwPT09ZCl0aGlzLl9zZXRWaXN1YWxpemF0aW9uVHlwZSgic2NhbGFyIiksdGhpcy5zZXQoIl9kYXRhU2NhbGFyIixmKTtlbHNlIGlmKDE9PT1kKXt0aGlzLl9zZXRWaXN1YWxpemF0aW9uVHlwZSgibGluZUNoYXJ0Iik7bGV0IGc9e3g6W10seTpmfTtmb3IobGV0IGw9MDtsPGYubGVuZ3RoOysrbClnLngucHVzaChsKzEpO3RoaXMuc2V0KCJfbGluZUNoYXJ0RGF0YSIsZyl9ZWxzZSAyPD1kPyh0aGlzLl9zZXRWaXN1YWxpemF0aW9uVHlwZSgiaW1hZ2UiKSx0aGlzLnNldCgiX2RhdGFJbWFnZVNyYyIsCiJkYXRhOmltYWdlL3BuZztiYXNlNjQsIitmKSk6dGhpcy5fc2hvd1RvYXN0KCJWaXN1YWxpemF0aW9uIG9mIHJhbmstIitkKyIgdGVuc29ycyBpcyBub3QgeWV0IHN1cHBvcnRlZC4iKX0pfX0scmVmcmVzaCgpe3RoaXMudGVuc29yTmFtZS50cmltKCkmJnRoaXMucmVuZGVyVGVuc29yVmFsdWUoKX0sX2dldFRlbnNvckRhdGFVUkwoYSl7Y29uc3QgYz1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvdGVuc29yX2RhdGEiKTtyZXR1cm4gUGsuYWRkUGFyYW1zKGMsYSl9LF9yYW5rRnJvbVNsaWNpbmcoYSl7YS5zdGFydHNXaXRoKCJbIikmJihhPWEuc2xpY2UoMSxhLmxlbmd0aC0xKSk7aWYoMD09PWEubGVuZ3RoKXJldHVybiAwO3thPWEuc3BsaXQoIiwiKTtsZXQgYz1hLmxlbmd0aDtmb3IoY29uc3QgZCBvZiBhKWlzTmFOKE51bWJlcihkKSl8fGMtLTtyZXR1cm4gY319LF9zZXRWaXN1YWxpemF0aW9uVHlwZShhKXsic2NhbGFyIj09PWE/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsCiEwKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToibGluZUNoYXJ0Ij09PWE/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsITEpLHRoaXMuc2V0KCJfaXNWYWx1ZUxpbmVDaGFydCIsITApLHRoaXMuc2V0KCJfaXNWYWx1ZUltYWdlIiwhMSkpOiJpbWFnZSI9PT1hPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITApKTpjb25zb2xlLmVycm9yKCJJbnZhbGlkIHZpc3VhbGl6YXRpb25UeXBlOiIsYSl9LF90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrKCl7ImZ1bGwgaGlzdG9yeSI9PT1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQudG9Mb3dlckNhc2UoKT90aGlzLnNldCgidGltZUluZGljZXMiLCI6Iik6dGhpcy5zZXQoInRpbWVJbmRpY2VzIiwKIi0xIik7dGhpcy5yZW5kZXJUZW5zb3JWYWx1ZSgpfSxfdXBkYXRlVGltZUluZGljZXNUb2dnbGUoYSl7dGhpcy5faXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYSk/UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50PSJGdWxsIEhpc3RvcnkiOlBvbHltZXIuZG9tKHRoaXMuJCQoIiN0aW1lLWluZGljZXMtdG9nZ2xlLWJ1dHRvbiIpKS50ZXh0Q29udGVudD0iTGF0ZXN0IFRpbWUgUG9pbnQifSxfaXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYSl7YS5zdGFydHNXaXRoKCJbIikmJihhPWEuc2xpY2UoMSxhLmxlbmd0aC0xKSk7cmV0dXJuIWlzTmFOKE51bWJlcihhKSl9LF9jYWxjdWxhdGVEZWJ1Z09wVG9EaXNwbGF5KCl7cmV0dXJuIkRlYnVnSWRlbnRpdHkiPT09dGhpcy5kZWJ1Z09wPyIiOnRoaXMuZGVidWdPcH0sX3Nob3dUb2FzdChhKXt0aGlzLiQudGVuc29yVmFsdWVUb2FzdC5zZXRBdHRyaWJ1dGUoInRleHQiLGEpO3RoaXMuJC50ZW5zb3JWYWx1ZVRvYXN0Lm9wZW4oKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9Im11bHRpVmlldyI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZXM8L2Rpdj4KICAgICAgPGRpdiBpZD0ibXVsdGktdGVuc29yLXZpZXctY29udGFpbmVyIj48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNtdWx0aVZpZXcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZWVlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi10ZW5zb3ItdmFsdWUtbXVsdGktdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi10ZW5zb3ItdmFsdWUtbXVsdGktdmlldyIscHJvcGVydGllczp7Y29udGludWVUb0NhbGxiYWNrOkZ1bmN0aW9uLHRlbnNvck5hbWVDbGlja2VkOkZ1bmN0aW9uLF90ZW5zb3JWaWV3Q291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LGFkZFZpZXcoYSl7Y29uc3QgYz10aGlzLiQkKCIjbXVsdGktdGVuc29yLXZpZXctY29udGFpbmVyIiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Zi10ZW5zb3ItdmFsdWUtdmlldyIpO2Quc2V0QXR0cmlidXRlKCJjbGFzcyIsImRlYnVnZ2VyLXRlbnNvci12aWV3Iik7ZC52aWV3SWQ9YS52aWV3SWQ7ZC50ZW5zb3JOYW1lPWEudGVuc29yTmFtZTtkLmRlYnVnT3A9YS5kZWJ1Z09wO2QuZHR5cGU9YS5kdHlwZTtkLnNoYXBlPWEuc2hhcGU7ZC5zbGljaW5nPWEuc2xpY2luZztkLnRpbWVJbmRpY2VzPWEudGltZUluZGljZXM7ZC5jbG9zZUJ1dHRvbkNhbGxiYWNrPXRoaXMuX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYS52aWV3SWQpOwpkLmNvbnRpbnVlVG9CdXR0b25DYWxsYmFjaz0oKT0+e3RoaXMuY29udGludWVUb0NhbGxiYWNrKGEuZGV2aWNlTmFtZSxhLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUpfTtkLnRlbnNvck5hbWVDYWxsYmFjaz0oKT0+e3RoaXMudGVuc29yTmFtZUNsaWNrZWQoYS5kZXZpY2VOYW1lLGEubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSl9O2MuYXBwZW5kQ2hpbGQoZCk7ZC5yZWZyZXNoKCl9LGdldFZpZXdzKCl7Y29uc3QgYT1bXTtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGM9PnthLnB1c2goe3ZpZXdJZDpjLnZpZXdJZCx0ZW5zb3JOYW1lOmMudGVuc29yTmFtZSxkZWJ1Z09wOmMuZGVidWdPcCxzbGljaW5nOmMuc2xpY2luZyx0aW1lSW5kaWNlczpjLnRpbWVJbmRpY2VzfSl9KTtyZXR1cm4gYX0scmVuZGVyVGVuc29yVmFsdWVzKCl7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSwKYT0+e2EucmVuZGVyVGVuc29yVmFsdWUoKX0pfSxfcmVkcmF3Vmlld3MoYSl7Y29uc3QgYz10aGlzLiQkKCIjbXVsdGktdGVuc29yLXZpZXctY29udGFpbmVyIik7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxkPT57Yy5yZW1vdmVDaGlsZChkKX0pO18uZm9yRWFjaChhLGQ9Pnt0aGlzLmFkZFZpZXcoZCl9KX0sX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYSl7cmV0dXJuKCk9Pntjb25zdCBjPVtdLGQ9dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpO2ZvcihsZXQgZj0wO2Y8ZC5sZW5ndGg7KytmKXtjb25zdCBnPWRbZl07Zy52aWV3SWQhPT1hJiZjLnB1c2goe3ZpZXdJZDpnLnZpZXdJZCx0ZW5zb3JOYW1lOmcudGVuc29yTmFtZSxkZWJ1Z09wOmcuZGVidWdPcCxkdHlwZTpnLmR0eXBlLHNoYXBlOmcuc2hhcGUsc2xpY2luZzpnLnNsaWNpbmcsdGltZUluZGljZXM6Zy50aW1lSW5kaWNlc30pfXRoaXMuX3JlZHJhd1ZpZXdzKGMpfX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGVidWdnZXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItdG9hc3QgaWQ9InRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0Zi1kZWJ1Z2dlci1pbml0aWFsLWRpYWxvZyBpZD0iaW5pdGlhbERpYWxvZyI+PC90Zi1kZWJ1Z2dlci1pbml0aWFsLWRpYWxvZz4KICAgIAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiIGlkPSJsZWZ0LXBhbmUiPgogICAgICAgIDxkaXYgaWQ9Im5vZGUtZW50cmllcyIgY2xhc3M9Im5vZGUtZW50cmllcyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWJ1Z2dlci1zZWN0aW9uLXRpdGxlIj5SdW50aW1lIE5vZGUgTGlzdDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLXNvdXJjZS1jb2RlIj4KICAgICAgICAgICAgU2hvdyBDb2RlOgogICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjbGFzcz0idG9nZ2xlLXNvdXJjZS1jb2RlIiBpZD0ic2hvdy1zb3VyY2UtY29kZSIgY2hlY2tlZD0ie3tfc291cmNlQ29kZVNob3dufX0iPjwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRmLW9wLXNlbGVjdG9yIGRlYnVnLXdhdGNoZXM9IltbX2RlYnVnV2F0Y2hlc11dIiBkZWJ1Zy13YXRjaC1jaGFuZ2U9IltbX2NyZWF0ZURlYnVnV2F0Y2hDaGFuZ2VIYW5kbGVyKCldXSIgbm9kZS1jbGlja2VkPSJbW19jcmVhdGVOb2RlQ2xpY2tlZEhhbmRsZXIoKV1dIiBmb3JjZS1leHBhbmQtYW5kLWNoZWNrLW5vZGUtbmFtZT0iW1tfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lXV0iIGZvcmNlLWV4cGFuZC1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kTm9kZU5hbWVdXSI+CiAgICAgICAgICA8L3RmLW9wLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBjbGFzcz0ic291cmNlLWNvZGUtdmlldy1kaXYiIGhpZGRlbiQ9Int7IV9zb3VyY2VDb2RlU2hvd259fSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWJ1Z2dlci1zZWN0aW9uLXRpdGxlIj5Tb3VyY2UgQ29kZTwvZGl2PgogICAgICAgICAgPHRmLXNvdXJjZS1jb2RlLXZpZXcgaWQ9InNvdXJjZUNvZGVWaWV3IiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIGRlYnVnLXdhdGNoZXM9IltbX2RlYnVnV2F0Y2hlc11dIiBmb2N1cy1ub2RlLW5hbWU9IltbX3NvdXJjZUZvY3VzTm9kZU5hbWVdXSIgbm9kZS1jbGlja2VkPSJbW19jcmVhdGVOb2RlQ2xpY2tlZEhhbmRsZXIoKV1dIiBjb250aW51ZS10by1ub2RlPSJbW19jcmVhdGVDb250aW51ZVRvTm9kZUhhbmRsZXIoKV1dIj48L3RmLXNvdXJjZS1jb2RlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRmLWRlYnVnZ2VyLXJlc2l6ZXIgY3VycmVudC1sZW5ndGg9Int7X2xlZnRQYW5lV2lkdGh9fSIgbWluLWxlbmd0aD0iW1tfbWlubGVmdFBhbmVXaWR0aF1dIiBtYXgtbGVuZ3RoPSJbW19tYXhsZWZ0UGFuZVdpZHRoXV0iPgogICAgICAgIDwvdGYtZGVidWdnZXItcmVzaXplcj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHRmLXNlc3Npb24tcnVucy12aWV3IGlkPSJzZXNzaW9uUnVuc1ZpZXciIGxhdGVzdC1zZXNzaW9uLXJ1bj0iW1tfbGF0ZXN0U2Vzc2lvblJ1bl1dIiBzZXNzaW9uLXJ1bi1rZXktdG8tZGV2aWNlLW5hbWVzPSJbW19zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzXV0iIHNvbGUtYWN0aXZlPSJbW19zZXNzaW9uUnVuU29sZUFjdGl2ZV1dIiBub2RlLW9yLXRlbnNvci1jbGlja2VkPSJbW19jcmVhdGVGZWVkRmV0Y2hUYXJnZXRDbGlja2VkSGFuZGxlcigpXV0iPgogICAgICAgICAgPC90Zi1zZXNzaW9uLXJ1bnMtdmlldz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b25zLWNvbnRhaW5lciI+CiAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0iY29udGludWUtYnV0dG9uIiBvbi1jbGljaz0iX3N0ZXAiPgogICAgICAgICAgICA8c3Bhbj5bW19zdGVwQnV0dG9uVGV4dF1dPC9zcGFuPgogICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8dGYtZGVidWdnZXItY29udGludWUtZGlhbG9nIGlkPSJjb250aW51ZURpYWxvZyIgc2Vzc2lvbi1ydW4tZ289IltbX2NyZWF0ZVNlc3Npb25SdW5HbygpXV0iIHRlbnNvci1jb25kaXRpb24tZ289IltbX2NyZWF0ZVRlbnNvckNvbmRpdGlvbkdvKCldXSIgZm9yY2UtY29udGludWF0aW9uLXN0b3A9IltbX2NyZWF0ZUZvcmNlQ29udGludWF0aW9uU3RvcCgpXV0iPgogICAgICAgICAgPC90Zi1kZWJ1Z2dlci1jb250aW51ZS1kaWFsb2c+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgIDx0Zi1ncmFwaC1sb2FkZXIgaWQ9ImxvYWRlciIgb3V0LWdyYXBoLWhpZXJhcmNoeT0ie3tncmFwaEhpZXJhcmNoeX19IiBvdXQtZ3JhcGg9Int7Z3JhcGh9fSIgb3V0LXN0YXRzPSJ7e3N0YXRzfX0iIHByb2dyZXNzPSJ7e19ncmFwaFByb2dyZXNzfX0iPjwvdGYtZ3JhcGgtbG9hZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiIGlkPSJjZW50ZXItY29udGVudCI+CiAgICAgICAgPGRpdiBpZD0idG9wLXJpZ2h0LXF1YWRyYW50Ij4KICAgICAgICAgIDxwYXBlci10YWJzIHNlbGVjdGVkPSJ7e190b3BSaWdodFNlbGVjdGVkfX0iPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW190b3BSaWdodFRhYnNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLXRhYiBpZD0iW1tpdGVtLmlkXV0iPltbaXRlbS5uYW1lXV08L3BhcGVyLXRhYj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bnRpbWUtZ3JhcGgtZGV2aWNlIj4KICAgICAgICAgICAgPHNwYW4gaWQ9InJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiPiA8L3NwYW4+CiAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSIgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJEZXZpY2UgbmFtZSIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZX19Ij4KICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19hY3RpdmVTZXNzaW9uUnVuRGV2aWNlc11dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBjbGFzcz0ic3Bpbm5lciIgaWQ9InRvcC1yaWdodC1zcGlubmVyIiBoaWRkZW49IltbIV9idXN5XV0iIGFjdGl2ZT0iW1tfYnVzeV1dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxwYXBlci1wcm9ncmVzcyBpZD0idG9wLXJpZ2h0LXByb2dyZXNzLWJhciIgdmFsdWU9IjAiPjwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlXV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJncmFwaC1jb250YWluZXIiPgogICAgICAgICAgICAgIDx0Zi1ncmFwaCBpZD0iZ3JhcGgiIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBiYXNpYy1ncmFwaD0iW1tncmFwaF1dIiBzdGF0cz0iW1tzdGF0c11dIiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319IiBjb2xvci1ieT0ic3RydWN0dXJlIiBjb2xvci1ieS1wYXJhbXM9Int7Y29sb3JCeVBhcmFtc319IiByZW5kZXItaGllcmFyY2h5PSJ7e19yZW5kZXJIaWVyYXJjaHl9fSIgbm9kZS1jb250ZXh0LW1lbnUtaXRlbXM9IltbX2NyZWF0ZU5vZGVDb250ZXh0TWVudUl0ZW1zKCldXSI+PC90Zi1ncmFwaD4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmVdXSI+CiAgICAgICAgICAgIDx0Zi10ZW5zb3ItdmFsdWUtbXVsdGktdmlldyBpZD0idGVuc29yVmFsdWVNdWx0aVZpZXciIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiB0ZW5zb3ItbmFtZS1jbGlja2VkPSJbW19jcmVhdGVOb2RlQ2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgICAgPC90Zi10ZW5zb3ItdmFsdWUtbXVsdGktdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGlzLWhvcml6b250YWw9InRydWUiIGN1cnJlbnQtbGVuZ3RoPSJ7e190b3BSaWdodFF1YWRyYW50SGVpZ2h0fX0iIG1pbi1sZW5ndGg9IltbX21pblRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSIgbWF4LWxlbmd0aD0iW1tfbWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CgogICAgICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhIiBjbGFzcz0idGVuc29yLWRhdGEiPgogICAgICAgICAgPHRmLXRlbnNvci1kYXRhLXN1bW1hcnkgaWQ9InRlbnNvckRhdGFTdW1tYXJ5IiBsYXRlc3QtdGVuc29yLWRhdGE9IltbX2xhdGVzdFRlbnNvckRhdGFdXSIgZXhwYW5kLWhhbmRsZXI9IltbX2NyZWF0ZVRlbnNvckRhdGFFeHBhbmRIYW5kbGVyKCldXSIgY29udGludWUtdG8tY2FsbGJhY2s9IltbX2NyZWF0ZUNvbnRpbnVlVG9DYWxsYmFjaygpXV0iIGhpZ2hsaWdodGVkLW5vZGUtbmFtZT0iW1tfaGlnaGxpZ2h0Tm9kZU5hbWVdXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICA8L3RmLXRlbnNvci1kYXRhLXN1bW1hcnk+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgcGFwZXItdG9hc3QgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgd2lkdGg6IDQwdnc7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDMwdnc7CiAgICAgIH0KICAgICAgdGYtZGFzaGJvYXJkLWxheW91dCB7CiAgICAgICAgLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItYmFzaXM6IGF1dG87CiAgICAgICAgLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItbWF4LXdpZHRoOiBub25lOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1pbi13aWR0aDogbm9uZTsKICAgICAgfQogICAgICAuZGVidWdnZXItc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgICAgcGFwZXItdGFiLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGNvbG9yOiBibGFjazsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjaW5pdGlhbERpYWxvZyB7CiAgICAgICAgLyoqIFRoaXMgbWF0Y2hlcyB0aGUgZGVmYXVsdCB6LWluZGV4IG9mIHBhcGVyLWRpYWxvZyBiYWNrZHJvcHMuICovCiAgICAgICAgei1pbmRleDogMTAyOwogICAgICB9CiAgICAgIC8qKiBSZXNpemUgdGhlIHJlZ2lvbiBmb3IgdGhlIGdyYXBoIGFzIHRoZSB1c2VyIHJlc2l6ZXMgdGhlIHJlZ2lvbi4gKi8KICAgICAgI2dyYXBoLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAxMjBweCk7CiAgICAgICAgLyoqIENsaXAgdGhlIG1pbmltYXAgaWYgdGhlIGhlaWdodCBvZiB0aGUgZ3JhcGggY29udGFpbmVyIGlzIHNtYWxsLiAqLwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgICNncmFwaCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZy1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTNweDsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KICAgICAgI3gtdHlwZS1zZWxlY3RvciBwYXBlci1idXR0b24gewogICAgICAgIG1hcmdpbjogNXB4IDNweDsKICAgICAgfQogICAgICAucnVudGltZS1ncmFwaC1kZXZpY2UgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgI3J1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUgewogICAgICAgIGZvbnQtc2l6ZTogODUlOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgI2FjdGl2ZS1ydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcHJvZ3Jlc3MtYmFyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteDogdmlzaWJsZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgLmNlbnRlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICB0Zi1kZWJ1Z2dlci1yZXNpemVyIHsKICAgICAgICByaWdodDogLTEwcHg7CiAgICAgIH0KICAgICAgI2NlbnRlci1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgLyoqIFRoZSByZXNpemVyIHNob3VsZCBoYXZlIG5vIHNwYWNlIHRvIHRoZSBsZWZ0IG9mIGl0LiAqLwogICAgICAjY2VudGVyLWNvbnRlbnQgdGYtZGVidWdnZXItcmVzaXplcltpcy1ob3Jpem9udGFsXSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0yM3B4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlMmUyZTI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNGQ0ZDQ7CiAgICAgIH0KICAgICAgLnNwaW5uZXIgewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICAgIC5ub2RlLWVudHJpZXMgewogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGhlaWdodDogODAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29kZS12aWV3LWRpdiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogNDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgI3Nlc3Npb25SdW5zVmlldyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IDI1dmg7CiAgICAgIH0KICAgICAgLmJ1dHRvbnMtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvci1kYXRhIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICAgIG1hcmdpbjogMCAwIDIwcHggMDsKICAgICAgfQogICAgICAjdGVuc29yRGF0YVN1bW1hcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgIH0KICAgICAgI3RvcC1yaWdodC1xdWFkcmFudCB7CiAgICAgICAgaGVpZ2h0OiA2NiU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnRvZ2dsZS1zb3VyY2UtY29kZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxZW07CiAgICAgICAgZm9udC1zaXplOiA4MCU7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgewogICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KICAgICAgLmNvbnRleHQtbWVudSB1bCBsaTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzOTEzZTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgIH0KICAgICAgLmlubGluZSwKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICB9CgogICAgICB2ei1saW5lLWNoYXJ0IHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGVuc29yLXNoYXBlLWhlbHBlci5qcwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhkLGYpe3JldHVybiBkPD1mPyI6OiI6Ijo6IitNYXRoLmNlaWwoZC9mKX1hLmdldERlZmF1bHRTbGljaW5nPWZ1bmN0aW9uKGQpe3JldHVybiAwPT09ZC5sZW5ndGg/IiI6MT09PWQubGVuZ3RoPyJbIitjKGRbMF0sMUUzKSsiXSI6Mj09PWQubGVuZ3RoPyJbIitjKGRbMF0sMjUwKSsiLCAiK2MoZFsxXSwyNTApKyJdIjpudWxsfTthLnJhbmtGcm9tU2xpY2luZz1mdW5jdGlvbihkKXtkLnN0YXJ0c1dpdGgoIlsiKSYmKGQ9ZC5zbGljZSgxLGQubGVuZ3RoLTEpKTtpZigwPT09ZC5sZW5ndGgpcmV0dXJuIDA7e2Q9ZC5zcGxpdCgiLCIpO2xldCBmPWQubGVuZ3RoO2Zvcihjb25zdCBnIG9mIGQpaXNOYU4oTnVtYmVyKGcpKXx8Zi0tO3JldHVybiBmfX19KShpbXx8KGltPXt9KSk7Cjwvc2NyaXB0PgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItZGFzaGJvYXJkLmh0bWwuanMKY29uc3QgbG09KCk9PndpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsbW09KCk9PndpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsbm09KGxtKCktNzApLzI7ClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190b3BSaWdodFRhYnM6e3R5cGU6QXJyYXksdmFsdWU6W3tpZDoidGFiLXJ1bnRpbWUtZ3JhcGhzIixuYW1lOiJSdW50aW1lIEdyYXBocyJ9LHtpZDoidGFiLXRlbnNvci12YWx1ZXMiLG5hbWU6IlRlbnNvciBWYWx1ZXMifV0scmVhZG9ubHk6ITB9LF9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdG9wUmlnaHRTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6IjAiLG9ic2VydmVyOiJfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQifSxfbG9uZ1BvbGxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3N0ZXBCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RlcCJ9LF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LApfdGVuc29yVmlld0lkQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saXNSZWxvYWREaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSxhbHJlYWR5U3RhcnRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3VycmVudFNlc3Npb25SdW5JbmZvOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2Vzc2lvblJ1blRvdGFsQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3Nlc3Npb25SdW5Db3VudGVyczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2FjdGl2ZVNlc3Npb25SdW5LZXk6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2FjdGl2ZVNlc3Npb25SdW5OdW1EZXZpY2VzOnt0eXBlOk51bWJlcix2YWx1ZTotMX0sX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWU6e3R5cGU6U3RyaW5nLAp2YWx1ZTpudWxsLG5vdGlmeTohMH0sX2hpZ2hsaWdodE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY29udGludWVUb1R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jb250aW51ZVN0b3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvbnRpbnVlVG9UYXJnZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXJUYXJnZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOi0xfSxfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOlN0cmluZyxfZm9yY2VFeHBhbmROb2RlTmFtZTpTdHJpbmcsX3NvdXJjZUZvY3VzTm9kZU5hbWU6U3RyaW5nLF9zb3VyY2VDb2RlU2hvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3Nob3dTb3VyY2VDb2RlQ2hhbmdlZCJ9LF9ncmFwaFByb2dyZXNzOnt0eXBlOk9iamVjdH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Cm5ldyBQay5SZXF1ZXN0TWFuYWdlcig1MCl9LF9idXN5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9sZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpWbC5nZXROdW1iZXJJbml0aWFsaXplcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksb2JzZXJ2ZXI6Il9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXIifSxfbWlubGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NDUwLHJlYWRPbmx5OiEwfSxfbWF4bGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChfd2luZG93V2lkdGgsIF9tYXhNYWluQ29udGVudFdpZHRoLCBfcmVzaXplcldpZHRoKSJ9LF9tYXhNYWluQ29udGVudFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTozNTAscmVhZE9ubHk6ITB9LF90b3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTpWbC5nZXROdW1iZXJJbml0aWFsaXplcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOm5tfSksb2JzZXJ2ZXI6Il90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXIifSxfbWluVG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjAwLHJlYWRPbmx5OiEwfSxfbWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChfd2luZG93SGVpZ2h0LCBfcmVzaXplcldpZHRoKSJ9LF9yZXNpemVyV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjMwLHJlYWRPbmx5OiEwfSxfd2luZG93V2lkdGg6TnVtYmVyLF93aW5kb3dIZWlnaHQ6TnVtYmVyLF9kZWJ1Z1dhdGNoZXM6QXJyYXksX2xhdGVzdFNlc3Npb25SdW46T2JqZWN0fSxvYnNlcnZlcnM6WyJfb25BY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lQ2hhbmdlKF9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKSIsIl9zaXplRGFzaGJvYXJkUmVnaW9ucyhfbGVmdFBhbmVXaWR0aCwgX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQsIF93aW5kb3dXaWR0aCkiLAoiX2dyYXBoUHJvZ3Jlc3NVcGRhdGVkKF9ncmFwaFByb2dyZXNzKSJdLHJlYWR5KCl7dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKCk9Pnt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKX0sITEpO3RoaXMucmVsb2FkKCl9LGxvbmdfcG9sbCgpe2NvbnN0IGE9e3BvczorK3RoaXMuX2xvbmdQb2xsQ291bnR9O2xldCBjPVBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9jb21tIik7Yz1Qay5hZGRQYXJhbXMoYyxhKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGMpLnRoZW4oZD0+e2NvbnN0IGY9ZC50eXBlO2Q9ZC5kYXRhO2lmKCJtZXRhIj09PWYpe3ZhciBnPWQucnVuX2tleSxsPWdbMF0uc3BsaXQoIiwiKSxrPWdbMV0uc3BsaXQoIiwiKTtjb25zdCBwPWdbMl0uc3BsaXQoIiwiKTt2YXIgbT10aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5O3RoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bktleSIsCmcpO3RoaXMuc2V0KCJfbGF0ZXN0U2Vzc2lvblJ1biIse2ZlZWRzOmwsZmV0Y2hlczprLHRhcmdldHM6cH0pO3RoaXMuc2V0KCJfc2Vzc2lvblJ1blNvbGVBY3RpdmUiLCEwKTt2b2lkIDA9PT10aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2ddPyh0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2ddPVtdLHRoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLFtdKSk6dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsdGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1tnXSk7dGhpcy5fY3VycmVudFNlc3Npb25SdW5JbmZvPWw9IkZlZWRzOiAiK2wrIjsgRmV0Y2hlczogIitrKyI7IFRhcmdldHM6ICIrcDt0aGlzLl9zZXNzaW9uUnVuQ291bnRlcnMuaGFzT3duUHJvcGVydHkobCk/dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzW2xdKz0xOnRoaXMuX3Nlc3Npb25SdW5Db3VudGVyc1tsXT0xO3RoaXMuX3Nlc3Npb25SdW5Ub3RhbENvdW50ZXIrKzsKdGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKTt0aGlzLl9jb250aW51ZVRvVHlwZSYmXy5pc0VxdWFsKG0sZyl8fCh0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoZywhMSksdGhpcy5fYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCkpfWVsc2UidGVuc29yIj09PWY/KGc9ZC5kZXZpY2VfbmFtZSxtPWQubm9kZV9uYW1lLGw9ZC5tYXliZV9iYXNlX2V4cGFuZGVkX25vZGVfbmFtZSx0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIT1nP3RoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsZyk6IXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZ0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmKHRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoZyxsKSx0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGcrIi8iK2wpKSx0aGlzLnNldCgiX3Nlc3Npb25SdW5Tb2xlQWN0aXZlIiwhMSksaz1tKyI6IitkLm91dHB1dF9zbG90LHRoaXMuc2V0KCJfbGF0ZXN0VGVuc29yRGF0YSIsCntkZXZpY2VOYW1lOmcsdGVuc29yTmFtZTprLG5vZGVOYW1lOm0sbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTpsLGRlYnVnT3A6ZC5kZWJ1Z19vcCxkdHlwZTpkLmR0eXBlLHNoYXBlOmQuc2hhcGUsdmFsdWU6ZC52YWx1ZXN9KSx0aGlzLl9tYXliZVVwZGF0ZVRlbnNvclZhbHVlVmlld3MoayxkLmRlYnVnX29wKSx0aGlzLnNldCgiX2J1c3kiLCExKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCBsb25nLXBvbGxpbmcgcmVzcG9uc2UgdHlwZTogIixmKTtudWxsIT10aGlzLl9jb250aW51ZVRvVHlwZSYmdGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG8oZixkKTt0aGlzLmxvbmdfcG9sbCgpfSl9LF9wcm9jZXNzQ29udGludWVUbyhhLGMpe3RoaXMuX2NvbnRpbnVlU3RvcD90aGlzLl9jbGVhckNvbnRpbnVlVG8oKToiU2Vzc2lvblJ1biI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb1Nlc3Npb25SdW4oIm1ldGEiPT09YSk6IlRlbnNvckNvbmRpdGlvbiI9PT0KdGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fc3RlcCgpOiJvcCI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb09wKCJtZXRhIj09PWEsYyk6bnVsbCE9dGhpcy5fY29udGludWVUb1R5cGUmJiIiIT09dGhpcy5fY29udGludWVUb1R5cGUmJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgX2NvbnRpbnVlVG9UeXBlOiIsdGhpcy5fY29udGludWVUb1R5cGUpfSxfcHJvY2Vzc0NvbnRpbnVlVG9TZXNzaW9uUnVuKGEpe2EmJnRoaXMuc2V0KCJfY29udGludWVUb0NvdW50ZXIiLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyKzEpO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0P3RoaXMuX3N0ZXAoKTp0aGlzLl9jbGVhckNvbnRpbnVlVG8oKX0sX3Byb2Nlc3NDb250aW51ZVRvT3AoYSxjKXthJiZ0aGlzLl9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKTthPWMuZGV2aWNlX25hbWU7Yz1jLm1heWJlX2Jhc2VfZXhwYW5kZWRfbm9kZV9uYW1lOwpjb25zdCBkPW51bGw9PWM/bnVsbDppbS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oYyk7YSsiLyIrYz09PXRoaXMuX2NvbnRpbnVlVG9UYXJnZXR8fGErIi8iK2Q9PT10aGlzLl9jb250aW51ZVRvVGFyZ2V0Pyh0aGlzLl9jbGVhckNvbnRpbnVlVG8oKSx0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsZCkpOnRoaXMuX3N0ZXAoKX0sX21heWJlVXBkYXRlVGVuc29yVmFsdWVWaWV3cyhhLGMpe2NvbnN0IGQ9dGhpcy4kJCgiI3RlbnNvclZhbHVlTXVsdGlWaWV3Iik7aWYobnVsbCE9ZCl7dmFyIGY9ITE7Xy5mb3JFYWNoKGQuZ2V0Vmlld3MoKSxnPT57aWYoZy50ZW5zb3JOYW1lPT09YSYmZy5kZWJ1Z09wPT09YylyZXR1cm4gZj0hMCwhMX0pO2YmJmQucmVuZGVyVGVuc29yVmFsdWVzKCl9fSxyZWxvYWQoKXtpZighdGhpcy5hbHJlYWR5U3RhcnRlZCl7dGhpcy5zZXQoImFscmVhZHlTdGFydGVkIiwhMCk7dmFyIGE9UGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwKIi9kZWJ1Z2dlcl9ncnBjX2hvc3RfcG9ydCIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57MDxjLnBvcnQ/KHRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5EaWFsb2coYy5ob3N0LGMucG9ydCksdGhpcy5sb25nX3BvbGwoKSk6dGhpcy4kLmluaXRpYWxEaWFsb2cub3BlbkRpc2FibGVkRGlhbG9nKCl9KX19LF9zaG93U291cmNlQ29kZUNoYW5nZWQoKXt0aGlzLl9zb3VyY2VDb2RlU2hvd24/KHRoaXMuJCQoIiNub2RlLWVudHJpZXMiKS5zdHlsZS5oZWlnaHQ9IjQwJSIsdGhpcy4kLnNvdXJjZUNvZGVWaWV3LnJlbmRlcigpKTp0aGlzLiQkKCIjbm9kZS1lbnRyaWVzIikuc3R5bGUuaGVpZ2h0PSI4MCUifSxfc2hvd1RvYXN0KGEpe3RoaXMuJC50b2FzdC5zZXRBdHRyaWJ1dGUoInRleHQiLGEpO3RoaXMuJC50b2FzdC5vcGVuKCl9LF9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKXt0aGlzLl9zaG93VG9hc3QoIlNlc3Npb24ucnVuKCkgIyIrdGhpcy5fc2Vzc2lvblJ1blRvdGFsQ291bnRlcisKIiBpcyBzdGFydGluZy4iKX0sX2Rpc3BsYXlHcmFwaChhLGMpe2E9e3J1bl9rZXk6SlNPTi5zdHJpbmdpZnkoYSksZGV2aWNlX25hbWU6Y307YT1Qay5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi9kZWJ1Z2dlci9kZWJ1Z2dlcl9ncmFwaCIsYSk7dGhpcy4kLmxvYWRlci5kYXRhc2V0cz1be25hbWU6Ii9kZWJ1Z2dlcl9ncmFwaCIscGF0aDphfV07dGhpcy4kLmxvYWRlci5zZXQoInNlbGVjdGVkRGF0YXNldCIsMCl9LF9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYSxjKXtjP2NvbnNvbGUubG9nKCJQb2xsaW5nIGZvciBmaXJzdCBHcmFwaERlZiBmb3IgcnVuIGtleToiLGEpOnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsbnVsbCk7dmFyIGQ9e21vZGU6InJldHJpZXZlX2FsbCIscnVuX2tleTpKU09OLnN0cmluZ2lmeShhKX07Y29uc3QgZj1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2Q9UGsuYWRkUGFyYW1zKGYsCmQpO2xldCBnPVtdO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZCkudGhlbihsPT57aWYoMD09bC5kZXZpY2VfbmFtZXMubGVuZ3RoKWN8fHRoaXMuX3N0ZXAoKSx0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYSwhMCk7ZWxzZXt2YXIgaz1udWxsO2Zvcihjb25zdCBtIGluIGwuZ2F0ZWRfZ3JwY190ZW5zb3JzKWlmKGwuZ2F0ZWRfZ3JwY190ZW5zb3JzLmhhc093blByb3BlcnR5KG0pKXstMT09PXRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYV0uaW5kZXhPZihtKSYmKHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYV0ucHVzaChtKSx0aGlzLiQuc2Vzc2lvblJ1bnNWaWV3LnVwZGF0ZU51bURldmljZXModGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1thXS5sZW5ndGgpKTt0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIix0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2FdLnNsaWNlKCkpO2s9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNbdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoLQoxXTtjb25zdCBwPWwuZ2F0ZWRfZ3JwY190ZW5zb3JzW21dO2ZvcihsZXQgcT0wO3E8cC5sZW5ndGg7KytxKWcucHVzaCh7ZGV2aWNlX25hbWU6bSxub2RlX25hbWU6cFtxXVswXSxvcF90eXBlOnBbcV1bMV0sb3V0cHV0X3Nsb3Q6cFtxXVsyXSxkZWJ1Z19vcDpwW3FdWzNdfSl9bnVsbCE9ayYmKHRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsayksbD1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiKSksbnVsbCE9bCYmbC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIixrKSk7aW0uc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXMoZyk7dGhpcy5zZXQoIl9kZWJ1Z1dhdGNoZXMiLGcpO3RoaXMuJC5zb3VyY2VDb2RlVmlldy5yZW5kZXIoZyl9fSl9LF9jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpe3JldHVybihhLGMpPT57Yz1jPyJicmVhayI6ImRpc2FibGUiO3RoaXMuX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoaW0uZ2V0Q2xlYW5Ob2RlTmFtZShhLmRldmljZV9uYW1lKwoiLyIrYS5ub2RlX25hbWUpLGEub3V0cHV0X3Nsb3QsYS5kZWJ1Z19vcCxjKX19LF9mb2N1c09uR3JhcGhOb2RlKGEsYyl7bnVsbCE9YSYmdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSE9PWEmJnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsYSk7dGhpcy5fc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKTtjb25zdCBkPXRoaXMuJCQoIiNncmFwaCIpO2lmKGQuc2VsZWN0ZWROb2RlPT09YylkLnBhblRvTm9kZShjKTtlbHNle2NvbnN0IGY9ZC5nZXQoInJlbmRlckhpZXJhcmNoeSIpLmhpZXJhcmNoeS5nZXROb2RlTWFwKCk7bnVsbD09ZltjXSYmKGM9aW0ucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGMpKTtudWxsIT1mW2NdJiZkLnNldCgic2VsZWN0ZWROb2RlIixjKX10aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixhKyIvIitjKX0sX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpe3JldHVybihhLGMsZCk9Pnt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJgohMCE9PWQmJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsaW0ucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGMpKTt0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGEsYyk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixhKyIvIitjKX19LF9jcmVhdGVGZWVkRmV0Y2hUYXJnZXRDbGlja2VkSGFuZGxlcigpe3JldHVybiBhPT57bGV0IGM9YTstMSE9PWMuaW5kZXhPZigiOiIpJiYoYz1jLnNsaWNlKDAsYy5pbmRleE9mKCI6IikpKTthPV8uZmluZCh0aGlzLl9kZWJ1Z1dhdGNoZXMsZD0+ZC5ub2RlX25hbWU9PT1jfHwwPT09ZC5ub2RlX25hbWUuaW5kZXhPZihjKSYmIigiPT09ZC5ub2RlX25hbWVbYy5sZW5ndGhdKTtudWxsPT1hP3RoaXMuX3Nob3dUb2FzdCgiTm9kZSAnIitjKyInIGlzIG5vdCBpbiB0aGUgcnVudGltZSBncmFwaCBvZiB0aGUgY3VycmVudCBTZXNzaW9uLnJ1biBvciBkb2VzIG5vdCBoYXZlIGEgZGVidWcgb3AgYXR0YWNoZWQuIik6dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShhLmRldmljZV9uYW1lLApjKX19LF9jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpe3JldHVybiBhPT57dGhpcy5fc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLiQkKCIjdGVuc29yVmFsdWVNdWx0aVZpZXciKS5hZGRWaWV3KHt2aWV3SWQ6dGhpcy5fY3JlYXRlVGVuc29yVmlld0lkKCksZGV2aWNlTmFtZTphLmRldmljZU5hbWUsdGVuc29yTmFtZTphLnRlbnNvck5hbWUsbm9kZU5hbWU6YS5ub2RlTmFtZSxtYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lOmEubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxkZWJ1Z09wOmEuZGVidWdPcCxkdHlwZTphLmR0eXBlLHNoYXBlOmEuc2hhcGUsc2xpY2luZzppbS5nZXREZWZhdWx0U2xpY2luZyhhLnNoYXBlKSx0aW1lSW5kaWNlczoiLTEifSl9LDEwKX19LF9jcmVhdGVUZW5zb3JWaWV3SWQoKXtjb25zdCBhPSJkZWJ1Z2dlci10ZW5zb3Itdmlldy0iK3RoaXMuX3RlbnNvclZpZXdJZENvdW50ZXI7dGhpcy5fdGVuc29yVmlld0lkQ291bnRlcisrOwpyZXR1cm4gYX0sX2NyZWF0ZU5vZGVDb250ZXh0TWVudUl0ZW1zKCl7cmV0dXJuW3t0aXRsZTooKT0+IkV4cGFuZCBhbmQgaGlnaGxpZ2h0IixhY3Rpb246YT0+e2NvbnN0IGM9aW0uZ2V0Q2xlYW5Ob2RlTmFtZShhLm5vZGUubmFtZSk7YT10aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKyIvIithLm5vZGUubmFtZTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGEpO3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGEpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixpbS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oYykpfX0se3RpdGxlOigpPT4iQWRkIGJyZWFrcG9pbnQiLGFjdGlvbjphPT57Y29uc3QgYz1pbS5nZXRDbGVhbk5vZGVOYW1lKGEubm9kZS5uYW1lKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSIsdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSsKIi8iK2Eubm9kZS5uYW1lKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsaW0ucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGMpKX19LHt0aXRsZTooKT0+IkNvbnRpbnVlIHRvIixhY3Rpb246YT0+ey0xIT09WyJfQXJnIiwiX1JldHZhbCJdLmluZGV4T2YoYS5ub2RlLm9wKT90aGlzLl9zaG93VG9hc3QoJ0Nhbm5vdCBjb250aW51ZSB0byBub2RlICInK2Eubm9kZS5uYW1lKyciLCBkdWUgdG8gb3AgdHlwZSAiJythLm5vZGUub3ArJyIuJyk6dGhpcy5fY29udGludWVUb05vZGUodGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSxhLm5vZGUubmFtZSl9fV19LF9jcmVhdGVHZXRIZWFsdGhQaWxsKCl7cmV0dXJuKGEsYyxkLGYpPT57dmFyIGc9e3dhdGNoX2tleTphLHRpbWVfaW5kaWNlczoiLTEiLG1hcHBpbmc6ImhlYWx0aC1waWxsIn07Y29uc3QgbD1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLAoiL3RlbnNvcl9kYXRhIik7Zz1Qay5hZGRQYXJhbXMobCxnKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGcpLnRoZW4oaz0+e2s9ay50ZW5zb3JfZGF0YVswXTtmKGspO3RoaXMuX2NvbmRpdGlvbmFsSGVhbHRoUGlsbFN0b3AoYSxjLGQsayl9KX19LF9jb25kaXRpb25hbEhlYWx0aFBpbGxTdG9wKGEsYyxkLGYpe2lmKCJUZW5zb3JDb25kaXRpb24iPT09dGhpcy5fY29udGludWVUb1R5cGUmJmltLmNoZWNrSGVhbHRoUGlsbEFnYWluc3RUZW5zb3JDb25kaXRpb25LZXkodGhpcy5fY29udGludWVUb1RhcmdldCxmLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0KSl7dGhpcy5zZXQoIl9jb250aW51ZVN0b3AiLCEwKTtmPWltLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsZik7dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShjLGQpO2NvbnN0IGc9YysiLyIrZDt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLApnKTtzZXRUaW1lb3V0KCgpPT57dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsbnVsbCk7dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsZyl9LDEwMCk7dGhpcy5fc2hvd1RvYXN0KCdUZW5zb3IgY29uZGl0aW9uICInK3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQrJyIgaXMgbWV0IGJ5IHdhdGNoIGtleTogIicrYSsnIi5cblN0b3BwaW5nIGNvbnRpbnVhdGlvbi4nKX19LF9jb250aW51ZVRvTm9kZShhLGMpe2NvbnN0IGQ9aW0uZ2V0Q2xlYW5Ob2RlTmFtZShjKTthPWErIi8iK2M7dGhpcy5fcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShkLDAsIkRlYnVnSWRlbnRpdHkiLCJicmVhayIpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lIixhKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsaW0ucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKTt0aGlzLl9zZXRDb250aW51ZVRvKCJvcCIsYSk7CnRoaXMuJC5jb250aW51ZURpYWxvZy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApO3RoaXMuX3N0ZXAoKX0sX2NyZWF0ZUNvbnRpbnVlVG9Ob2RlSGFuZGxlcigpe3JldHVybihhLGMpPT57dGhpcy5fY29udGludWVUb05vZGUoYSxjKX19LF9vbkFjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWVDaGFuZ2UoYSl7Y29uc3QgYz1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSIpKTtpZigwPHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aCl7bGV0IGQ7ZD1hKygiIChkZXZpY2UgIisodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMuaW5kZXhPZihhKSsxKSsiIG9mICIrdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoKyIpIik7dGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJm51bGwhPWMmJihjLnRleHRDb250ZW50PWQpfWVsc2UgdGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJgpudWxsIT1jJiYoYy50ZXh0Q29udGVudD0iV2FpdGluZyBmb3IgZGV2aWNlLi4uIik7bnVsbCE9YSYmdGhpcy5fZGlzcGxheUdyYXBoKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksYSl9LF9zdGVwKCl7aWYobnVsbCE9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSl7dGhpcy5zZXQoIl9idXN5IiwhMCk7dmFyIGE9e21vZGU6InJldHJpZXZlX2RldmljZV9uYW1lcyIscnVuX2tleTpKU09OLnN0cmluZ2lmeSh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5KX0sYz1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2E9UGsuYWRkUGFyYW1zKGMsYSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGQ9PntsZXQgZj0hMTtmb3IobGV0IGc9MDtnPGQuZGV2aWNlX25hbWVzLmxlbmd0aDsrK2cpaWYoLTE9PT10aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5pbmRleE9mKGQuZGV2aWNlX25hbWVzW2ddKSl7Zj0hMDticmVha31kPQpQay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvYWNrIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKCgpPT57ZiYmdGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksITEpfSl9KX19LF9jcmVhdGVTZXNzaW9uUnVuR28oKXtyZXR1cm4gYT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlNlc3Npb25SdW4iLHRoaXMuX2N1cnJlbnRTZXNzaW9uUnVuSW5mbyxhKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlVGVuc29yQ29uZGl0aW9uR28oKXtyZXR1cm4oYSxjKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlRlbnNvckNvbmRpdGlvbiIsYSxjKTt0aGlzLiQudGVuc29yRGF0YVN1bW1hcnkuZW5hYmxlSGVhbHRoUGlsbHMoKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlRm9yY2VDb250aW51YXRpb25TdG9wKCl7cmV0dXJuKCk9Pnt0aGlzLl9zaG93VG9hc3QoJ0NvbnRpbnVhdGlvbiBvZiB0eXBlICInK3RoaXMuX2NvbnRpbnVlVG9UeXBlKwonIiB3YXMgaW50ZXJydXB0ZWQgYnkgdXNlci4nKTt0aGlzLnNldCgiX2NvbnRpbnVlU3RvcCIsITApfX0sX3NldENvbnRpbnVlVG8oYSxjLGQ9LTEpe3RoaXMuX2NvbnRpbnVlVG9UeXBlPWE7dGhpcy5fY29udGludWVUb1RhcmdldD1jO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0PWQ7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITF9LF9jbGVhckNvbnRpbnVlVG8oKXt0aGlzLiQuY29udGludWVEaWFsb2cubm90aWZ5Q29udGludWF0aW9uU3RvcCgpO3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQ9dGhpcy5fY29udGludWVUb1R5cGU9IiI7dGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQ9LTE7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITE7dGhpcy5zZXQoIl9idXN5IiwhMSl9LF9jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKXtyZXR1cm4oYSxjKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIm9wIixhKyIvIisKYyk7dGhpcy5fc3RlcCgpO3RoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiZ0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGEsYyk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixhKyIvIitjKX19LF90b3BSaWdodFNlbGVjdGVkQ2hhbmdlZChhKXthPXRoaXMuX3RvcFJpZ2h0VGFic1thXS5pZDt0aGlzLnNldCgiX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlIiwidGFiLXJ1bnRpbWUtZ3JhcGhzIj09PWEpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsInRhYi10ZW5zb3ItdmFsdWVzIj09PWEpfSxfc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKXt0aGlzLnNldCgiX3RvcFJpZ2h0U2VsZWN0ZWQiLCIwIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITApO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITEpfSxfc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpe3RoaXMuc2V0KCJfdG9wUmlnaHRTZWxlY3RlZCIsCiIxIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITEpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITApfSxfcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShhLGMsZCxmKXthPXttb2RlOiJzZXRfc3RhdGUiLG5vZGVfbmFtZTphLG91dHB1dF9zbG90OmMsZGVidWdfb3A6ZCxzdGF0ZTpmfTtjPVBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9nYXRlZF9ncnBjIik7YT1Qay5hZGRQYXJhbXMoYyxhKTt0aGlzLnNldCgiX2J1c3kiLCEwKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oZz0+e3RoaXMuc2V0KCJfYnVzeSIsITEpO2NvbnNvbGUubG9nKCJCcmVha3BvaW50IHNldF9zdGF0ZSByZXNwb25zZTogIixnKX0pfSxfZ3JhcGhQcm9ncmVzc1VwZGF0ZWQoYSl7Y29uc3QgYz10aGlzLiQkKCIjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciIpO251bGw9PXRoaXMuX2xhdGVzdFNlc3Npb25SdW4/CihjLnNldEF0dHJpYnV0ZSgidmFsdWUiLDApLHRoaXMuc2V0KCJfYnVzeSIsITEpKTooYy5zZXRBdHRyaWJ1dGUoInZhbHVlIixhLnZhbHVlKSx0aGlzLnNldCgiX2J1c3kiLDEwMD5hLnZhbHVlKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLnNldCgiX3dpbmRvd1dpZHRoIixtbSgpKTt0aGlzLnNldCgiX3dpbmRvd0hlaWdodCIsbG0oKSk7dGhpcy5fc2l6ZURhc2hib2FyZFJlZ2lvbnModGhpcy5fbGVmdFBhbmVXaWR0aCx0aGlzLl90b3BSaWdodFF1YWRyYW50SGVpZ2h0LHRoaXMuX3dpbmRvd1dpZHRoKX0sX2NvbXB1dGVNYXhsZWZ0UGFuZVdpZHRoKGEsYyxkKXtyZXR1cm4gYS1jLWR9LF9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChhLGMpe3JldHVybiBhLWMtNzB9LF9zaXplRGFzaGJvYXJkUmVnaW9ucyhhLGMsZCl7dGhpcy4kJCgiI2xlZnQtcGFuZSIpLnN0eWxlLndpZHRoPWErInB4IjthPWQtYS10aGlzLl9yZXNpemVyV2lkdGgtODt0aGlzLiQkKCIjY2VudGVyLWNvbnRlbnQiKS5zdHlsZS53aWR0aD0KYSsicHgiO2E9Yy10aGlzLl9yZXNpemVyV2lkdGg7dGhpcy4kJCgiI3RvcC1yaWdodC1xdWFkcmFudCIpLnN0eWxlLmhlaWdodD1hKyJweCI7dGhpcy4kJCgiI3RlbnNvci1kYXRhIikuc3R5bGUudG9wPWMrInB4In0sX2xlZnRQYW5lV2lkdGhPYnNlcnZlcjpWbC5nZXROdW1iZXJPYnNlcnZlcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHRPYnNlcnZlcjpWbC5nZXROdW1iZXJPYnNlcnZlcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLHtkZWZhdWx0VmFsdWU6bm19KX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItbWF0ZXJpYWwvcGFwZXItbWF0ZXJpYWwuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItbWF0ZXJpYWwiLHByb3BlcnRpZXM6e2VsZXZhdGlvbjp7dHlwZTpOdW1iZXIscmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOjF9LGFuaW1hdGVkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfX19KTsKPC9zY3JpcHQ+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgaDIgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWxlZ2VuZCB7CiAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWxlZ2VuZCBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IHsKICAgICAgICBtYXJnaW46IDEwcHggMTBweCAxMHB4IDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItcHJldmlldyB7CiAgICAgICAgd2lkdGg6IDI2cHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIDEwcHggMCAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLmNvbG9yLWxhYmVsLAogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgY29sb3I6ICM3Nzc7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI2cHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC50ZW5zb3ItY291bnQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xNXB4OwogICAgICAgIC8qIDMxIGNvbWVzIGZyb20gYWRkaW5nIGEgcGFkZGluZyBvZiAxNXB4IGZyb20gYm90aCBzaWRlcyBvZiB0aGUgcGFwZXItc2xpZGVyLCBzdWJ0cmFjdGluZwogICAqIDFweCBzbyB0aGF0IHRoZSBzbGlkZXIgd2lkdGggYWxpZ25zIHdpdGggdGhlIGltYWdlICh0aGUgbGFzdCBzbGlkZXIgbWFya2VyIHRha2VzIHVwIDFweCksCiAgICogYW5kIGFkZGluZyAycHggdG8gYWNjb3VudCBmb3IgYSBib3JkZXIgb2YgMXB4IG9uIGJvdGggc2lkZXMgb2YgdGhlIGltYWdlLiAzMCAtIDEgKyAyLgogICAqIEFwcGFyZW50bHksIHRoZSBwYXBlci1zbGlkZXIgbGFja3MgYSBtaXhpbiBmb3IgdGhvc2UgcGFkZGluZyB2YWx1ZXMuICovCiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSArIDMxcHgpOwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGxzLWxvYWRpbmctc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbC1zdGVwLW51bWJlci1pbnB1dCB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB0ZCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIC5maXJzdC1vZmZlbnNlLXRkIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5maXJzdC1vZmZlbnNlLXRkIHsKICAgICAgICB3aWR0aDogODBweDsKICAgICAgfQoKICAgICAgLnRlbnNvci1kZXZpY2UtdGQgewogICAgICAgIG1heC13aWR0aDogMTQwcHg7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CgogICAgICAudGVuc29yLXNlY3Rpb24td2l0aGluLXRhYmxlIHsKICAgICAgICBjb2xvcjogIzI2NjIzNjsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CgogICAgICAudGVuc29yLXNlY3Rpb24td2l0aGluLXRhYmxlOmhvdmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuZGV2aWNlLXNlY3Rpb24td2l0aGluLXRhYmxlIHsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLm1pbmktaGVhbHRoLXBpbGwgewogICAgICAgIHdpZHRoOiAxMzBweDsKICAgICAgfQoKICAgICAgLm1pbmktaGVhbHRoLXBpbGwgPiBkaXYgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogNjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIH0KCiAgICAgICNldmVudC1jb3VudHMtdGggewogICAgICAgIHBhZGRpbmc6IDAgMCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC5uZWdhdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjU1LCAxNDEsIDApOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAucG9zaXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiKDAsIDYyLCAyMTIpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiKDIwNCwgNDcsIDQ0KTsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uLAogICAgICAubmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm8tbnVtZXJpYy1hbGVydHMtbm90aWZpY2F0aW9uIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0iY2FyZCBoZWFsdGgtcGlsbC1sZWdlbmQiPgogICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgRW5hYmxlIGFsbCAobm90IGp1c3Qgc2FtcGxlZCkgc3RlcHMuIFJlcXVpcmVzIHNsb3cgZGlzayByZWFkLgogICAgICA8L2Rpdj4KICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gaWQ9ImVuYWJsZUFsbFN0ZXBzTW9kZVRvZ2dsZSIgY2hlY2tlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iPgogICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgIDxoMj4KICAgICAgICBTdGVwIG9mIEhlYWx0aCBQaWxsczoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJoZWFsdGgtcGlsbC1zdGVwLW51bWJlci1pbnB1dCIgbWluPSIwIiBtYXg9IltbX2JpZ2dlc3RTdGVwRXZlclNlZW5dXSIgdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcDo6aW5wdXR9fSI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWFsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgICBbW19jdXJyZW50U3RlcERpc3BsYXlWYWx1ZV1dCiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZSBoaWRkZW4kPSJbWyFhcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgaWQ9ImhlYWx0aC1waWxscy1sb2FkaW5nLXNwaW5uZXIiPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICA8L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJoZWFsdGgtcGlsbC1zdGVwLXNsaWRlciIgaW1tZWRpYXRlLXZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIgbWF4PSJbW19iaWdnZXN0U3RlcEV2ZXJTZWVuXV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX21heFN0ZXBJbmRleF1dIj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxoMj4KICAgICAgICBIZWFsdGggUGlsbAogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlXV0iPgogICAgICAgICAgQ291bnRzIGZvciBTZWxlY3RlZCBOb2RlCiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBMZWdlbmQKICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2hlYWx0aFBpbGxFbnRyaWVzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWx0aC1waWxsLWVudHJ5Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXByZXZpZXciIHN0eWxlPSJiYWNrZ3JvdW5kOltbaXRlbS5iYWNrZ3JvdW5kX2NvbG9yXV0iPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGFiZWwiPltbaXRlbS5sYWJlbF1dPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZW5zb3ItY291bnQiPgogICAgICAgICAgICBbW19jb21wdXRlVGVuc29yQ291bnRTdHJpbmcoaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZSwKICAgICAgICAgICAgaW5kZXgpXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGhpZGRlbiQ9IltbIV9oYXNEZWJ1Z2dlck51bWVyaWNBbGVydHMoZGVidWdnZXJOdW1lcmljQWxlcnRzKV1dIj4KICAgICAgICA8aDIgaWQ9Im51bWVyaWMtYWxlcnRzLWhlYWRlciI+TnVtZXJpYyBBbGVydHM8L2gyPgogICAgICAgIDxwPgogICAgICAgICAgQWxlcnRzIGFyZSBzb3J0ZWQgZnJvbSB0b3AgdG8gYm90dG9tIGJ5IGluY3JlYXNpbmcgdGltZXN0YW1wLgogICAgICAgIAogICAgICAgIDxkaXYgaWQ9Im51bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciI+CiAgICAgICAgICA8dGFibGUgaWQ9Im51bWVyaWMtYWxlcnRzLXRhYmxlIj4KICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aD5GaXJzdCBPZmZlbnNlPC90aD4KICAgICAgICAgICAgICAgIDx0aD5UZW5zb3IgKERldmljZSk8L3RoPgogICAgICAgICAgICAgICAgPHRoIGlkPSJldmVudC1jb3VudHMtdGgiPkV2ZW50IENvdW50czwvdGg+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgPHRib2R5IGlkPSJudW1lcmljLWFsZXJ0cy1ib2R5Ij48L3Rib2R5PgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxwIGNsYXNzPSJuby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24iPgogICAgICAgICAgTm8gbnVtZXJpYyBhbGVydHMgc28gZmFyLiBUaGF0IGlzIGxpa2VseSBnb29kLiBBbGVydHMgaW5kaWNhdGUgdGhlCiAgICAgICAgICBwcmVzZW5jZSBvZiBOYU4gb3IgKCsvLSkgSW5maW5pdHkgdmFsdWVzLCB3aGljaCBtYXkgYmUgY29uY2VybmluZy4KICAgICAgICAKICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkL3RmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsaGVhbHRoUGlsbFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LGFyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLGhlYWx0aFBpbGxFbnRyaWVzOnt0eXBlOkFycmF5LHZhbHVlOnRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzLHJlYWRPbmx5OiEwfSxoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlOnt0eXBlOkFycmF5LApjb21wdXRlZDoiX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZShub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4LCBzZWxlY3RlZE5vZGUsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIGFyZUhlYWx0aFBpbGxzTG9hZGluZykifSxhbGxTdGVwc01vZGVFbmFibGVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfYmlnZ2VzdFN0ZXBFdmVyU2Vlbjp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2Vlbihub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9jdXJyZW50U3RlcERpc3BsYXlWYWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXBEaXNwbGF5VmFsdWUobm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCwgYWxsU3RlcHNNb2RlRW5hYmxlZCwgc3BlY2lmaWNIZWFsdGhQaWxsU3RlcCwgYXJlSGVhbHRoUGlsbHNMb2FkaW5nKSJ9fSwKb2JzZXJ2ZXJzOlsiX3VwZGF0ZUFsZXJ0c0xpc3QoZGVidWdnZXJOdW1lcmljQWxlcnRzKSJdLHJlYWR5OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5Db250YWluZXIiKSxjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWRhc2hib2FyZC1sYXlvdXQgLnNjcm9sbGJhciIpO2EmJmMmJihhLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfSxfaGVhbHRoUGlsbHNBdmFpbGFibGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYSYmY30sX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZzpmdW5jdGlvbihhLGMpe3JldHVybiBhP2FbY10udG9GaXhlZCgwKToiIn0sX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZTpmdW5jdGlvbihhLGMsZCxmLGcpe2lmKGd8fCFkKXJldHVybiBudWxsO2E9YVtkXTtyZXR1cm4gYT8oYz1hW2Y/MDpjXSk/Yy52YWx1ZS5zbGljZSgyLDgpOm51bGw6bnVsbH0sX2NvbXB1dGVDdXJyZW50U3RlcERpc3BsYXlWYWx1ZTpmdW5jdGlvbihhLApjLGQsZixnKXtpZihkKXJldHVybiBmLnRvRml4ZWQoMCk7aWYoZylyZXR1cm4gMDtmb3IobGV0IGwgaW4gYSlyZXR1cm4gYVtsXVtjXS5zdGVwLnRvRml4ZWQoMCk7cmV0dXJuIDB9LF9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2VlbjpmdW5jdGlvbihhKXtmb3IobGV0IGMgaW4gYSlyZXR1cm4gYT1hW2NdLE1hdGgubWF4KHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW4sYVthLmxlbmd0aC0xXS5zdGVwKTtyZXR1cm4gdGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2Vlbnx8MH0sX2NvbXB1dGVNYXhTdGVwSW5kZXg6ZnVuY3Rpb24oYSl7Zm9yKGxldCBjIGluIGEpcmV0dXJuIGFbY10ubGVuZ3RoLTE7cmV0dXJuIDB9LF9oYXNEZWJ1Z2dlck51bWVyaWNBbGVydHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEubGVuZ3RofSxfdXBkYXRlQWxlcnRzTGlzdDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLiQkKCIjbnVtZXJpYy1hbGVydHMtYm9keSIpO2lmKGMpe2MuaW5uZXJIVE1MPSIiO2Zvcih2YXIgZD0KMDtkPGEubGVuZ3RoO2QrKyl7dmFyIGY9YVtkXSxnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2wuaW5uZXJIVE1MPXRmLmdyYXBoLnV0aWwuY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lKGYuZmlyc3RfdGltZXN0YW1wKTtsLmNsYXNzTGlzdC5hZGQoImZpcnN0LW9mZmVuc2UtdGQiKTtnLmFwcGVuZENoaWxkKGwpO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtsLmNsYXNzTGlzdC5hZGQoInRlbnNvci1kZXZpY2UtdGQiKTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLmNsYXNzTGlzdC5hZGQoInRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZSIpO2suaW5uZXJIVE1MPWYudGVuc29yX25hbWU7dGhpcy5fYWRkT3BFeHBhbnNpb25MaXN0ZW5lcihrLGYudGVuc29yX25hbWUpO2wuYXBwZW5kQ2hpbGQoayk7az1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLmNsYXNzTGlzdC5hZGQoImRldmljZS1zZWN0aW9uLXdpdGhpbi10YWJsZSIpOwprLmlubmVySFRNTD0iKCIrZi5kZXZpY2VfbmFtZSsiKSI7bC5hcHBlbmRDaGlsZChrKTtnLmFwcGVuZENoaWxkKGwpO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJtaW5pLWhlYWx0aC1waWxsIik7az1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2suY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbC10ZCIpO2suYXBwZW5kQ2hpbGQobCk7Zy5hcHBlbmRDaGlsZChrKTtmLm5lZ19pbmZfZXZlbnRfY291bnQmJihrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGsuY2xhc3NMaXN0LmFkZCgibmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGsuaW5uZXJIVE1MPWYubmVnX2luZl9ldmVudF9jb3VudCxrLnNldEF0dHJpYnV0ZSgidGl0bGUiLGYubmVnX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIC1cdTIyMWUiKSxsLmFwcGVuZENoaWxkKGspKTtmLnBvc19pbmZfZXZlbnRfY291bnQmJihrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAprLmNsYXNzTGlzdC5hZGQoInBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxrLmlubmVySFRNTD1mLnBvc19pbmZfZXZlbnRfY291bnQsay5zZXRBdHRyaWJ1dGUoInRpdGxlIixmLnBvc19pbmZfZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCArXHUyMjFlIiksbC5hcHBlbmRDaGlsZChrKSk7Zi5uYW5fZXZlbnRfY291bnQmJihrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGsuY2xhc3NMaXN0LmFkZCgibmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGsuaW5uZXJIVE1MPWYubmFuX2V2ZW50X2NvdW50LGsuc2V0QXR0cmlidXRlKCJ0aXRsZSIsZi5uYW5fZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCBOYU4iKSxsLmFwcGVuZENoaWxkKGspKTtQb2x5bWVyLmRvbShjKS5hcHBlbmRDaGlsZChnKX19fSxfYWRkT3BFeHBhbnNpb25MaXN0ZW5lcjpmdW5jdGlvbihhLGMpe2EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dmFyIGQ9dGYuZ3JhcGgucmVuZGVyLmV4cGFuZFVudGlsTm9kZUlzU2hvd24odGhpcy5yZW5kZXJIaWVyYXJjaHksCmMpLGYsZz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0Zi1ncmFwaC1pbmZvI2dyYXBoLWluZm8iKTtnJiYoZj1nLnNjcm9sbEhlaWdodC1nLnNjcm9sbFRvcCk7dmFyIGw9dGhpcy5zZWxlY3RlZE5vZGU7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsZCk7ZD0oKT0+e2cuc2Nyb2xsVG9wPWcuc2Nyb2xsSGVpZ2h0LWZ9O2cmJihsP2QoKTp3aW5kb3cuc2V0VGltZW91dChkLDIwKSl9KX19KX0pKCk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vaXJvbi1zY3JvbGwtdGFyZ2V0LWJlaGF2aW9yL2lyb24tc2Nyb2xsLXRhcmdldC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6SFRNTEVsZW1lbnQsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmYXVsdFNjcm9sbFRhcmdldH19fSxvYnNlcnZlcnM6WyJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZChzY3JvbGxUYXJnZXQsIGlzQXR0YWNoZWQpIl0sX3Nob3VsZEhhdmVMaXN0ZW5lcjohMCxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihhLGMpe3RoaXMuX29sZFNjcm9sbFRhcmdldCYmKHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKCExLHRoaXMuX29sZFNjcm9sbFRhcmdldCksdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0PW51bGwpO2MmJigiZG9jdW1lbnQiPT09YT90aGlzLnNjcm9sbFRhcmdldD10aGlzLl9kb2M6InN0cmluZyI9PT10eXBlb2YgYT90aGlzLnNjcm9sbFRhcmdldD0oYz10aGlzLmRvbUhvc3QpJiZjLiQ/Yy4kW2FdOlBvbHltZXIuZG9tKHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvcigiIyIrCmEpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuX29sZFNjcm9sbFRhcmdldD1hLHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHRoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcixhKSkpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe30sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuX2RvY30sZ2V0IF9kb2MoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudH0sZ2V0IF9zY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWU9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A6MH0sZ2V0IF9zY3JvbGxMZWZ0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVhPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdDoKMH0sc2V0IF9zY3JvbGxUb3AoYSl7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCxhKTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9YSl9LHNldCBfc2Nyb2xsTGVmdChhKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8oYSx3aW5kb3cucGFnZVlPZmZzZXQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9YSl9LHNjcm9sbDpmdW5jdGlvbihhLGMpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhhLGMpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9YSx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9Yyl9LGdldCBfc2Nyb2xsVGFyZ2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpPwp0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJXaWR0aDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aDowfSxnZXQgX3Njcm9sbFRhcmdldEhlaWdodCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDowfSxfaXNWYWxpZFNjcm9sbFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fSxfdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYSxjKXtjPWM9PT10aGlzLl9kb2M/d2luZG93OmM7YT90aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fCh0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9dGhpcy5fc2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpLGMuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpKToKdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyJiYoYy5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciksdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPW51bGwpfSx0b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbihhKXt0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXI9YTt0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcihhLHRoaXMuc2Nyb2xsVGFyZ2V0KX19Owo8L3NjcmlwdD4KCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWxpc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1heC1kZXZpY2UtcGl4ZWwtcmF0aW86IDEpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI2l0ZW1zIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWxpc3QtaXRlbXMtY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZ3JpZF0pKSAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8YXJyYXktc2VsZWN0b3IgaWQ9InNlbGVjdG9yIiBpdGVtcz0ie3tpdGVtc319IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEl0ZW1zfX0iIHNlbGVjdGVkLWl0ZW09Int7c2VsZWN0ZWRJdGVtfX0iPjwvYXJyYXktc2VsZWN0b3I+CgogICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tbGlzdC9pcm9uLWxpc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGM9YSYmODw9YVsxXSxkPW51bGwhPVBvbHltZXIuZmx1c2gsZj1kP1BvbHltZXIuQXN5bmMuYW5pbWF0aW9uRnJhbWU6MCxnPWQ/UG9seW1lci5Bc3luYy5pZGxlUGVyaW9kOjEsbD1kP1BvbHltZXIuQXN5bmMubWljcm9UYXNrOjI7UG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3J8fChQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcj17fSk7UG9seW1lcih7aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7aXRlbXM6e3R5cGU6QXJyYXl9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9LHNlbGVjdGVkQXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJzZWxlY3RlZCJ9LGdyaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsCm9ic2VydmVyOiJfZ3JpZENoYW5nZWQifSxzZWxlY3Rpb25FbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG11bHRpU2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LG9ic2VydmVyczpbIl9pdGVtc0NoYW5nZWQoaXRlbXMuKikiLCJfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQoc2VsZWN0aW9uRW5hYmxlZCkiLCJfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkKG11bHRpU2VsZWN0aW9uKSIsIl9zZXRPdmVyZmxvdyhzY3JvbGxUYXJnZXQsIHNjcm9sbE9mZnNldCkiXSxiZWhhdmlvcnM6W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JdLApfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9tYXhQYWdlczoyLF9mb2N1c2VkSXRlbTpudWxsLF9mb2N1c2VkVmlydHVhbEluZGV4Oi0xLF9mb2N1c2VkUGh5c2ljYWxJbmRleDotMSxfb2Zmc2NyZWVuRm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNCYWNrZmlsbEl0ZW06bnVsbCxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLF90ZW1wbGF0ZUNvc3Q6MCwKX3BhcmVudE1vZGVsOiEwLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4odGhpcy5ncmlkP3RoaXMuX3BoeXNpY2FsUm93cyp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplKS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9pdGVtc1BhcmVudCgpe3JldHVybiBQb2x5bWVyLmRvbShQb2x5bWVyLmRvbSh0aGlzLl91c2VyVGVtcGxhdGUpLnBhcmVudE5vZGUpfSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsT2Zmc2V0fSwKZ2V0IF9tYXhWaXJ0dWFsU3RhcnQoKXt2YXIgaz10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KHRoaXMuX3ZpcnR1YWxDb3VudCk7cmV0dXJuIE1hdGgubWF4KDAsay10aGlzLl9waHlzaWNhbENvdW50KX0sc2V0IF92aXJ0dWFsU3RhcnQoayl7az10aGlzLl9jbGFtcChrLDAsdGhpcy5fbWF4VmlydHVhbFN0YXJ0KTt0aGlzLmdyaWQmJihrLT1rJXRoaXMuX2l0ZW1zUGVyUm93KTt0aGlzLl92aXJ0dWFsU3RhcnRWYWw9a30sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxzZXQgX3BoeXNpY2FsU3RhcnQoayl7ayU9dGhpcy5fcGh5c2ljYWxDb3VudDswPmsmJihrPXRoaXMuX3BoeXNpY2FsQ291bnQrayk7dGhpcy5ncmlkJiYoay09ayV0aGlzLl9pdGVtc1BlclJvdyk7dGhpcy5fcGh5c2ljYWxTdGFydFZhbD1rfSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sZ2V0IF9waHlzaWNhbEVuZCgpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kwp0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LHNldCBfcGh5c2ljYWxDb3VudChrKXt0aGlzLl9waHlzaWNhbENvdW50VmFsPWt9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfHwwfSxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiAwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQ/SW5maW5pdHk6dGhpcy5fdmlld3BvcnRIZWlnaHQqdGhpcy5fbWF4UGFnZXN9LGdldCBfaXNWaXNpYmxlKCl7cmV0dXJuISghdGhpcy5vZmZzZXRXaWR0aCYmIXRoaXMub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7dmFyIGs9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09ayl7dmFyIG09dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPWs9dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHAscSl7bSs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHApOwppZihtPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiB0aGlzLmdyaWQ/cS1xJXRoaXMuX2l0ZW1zUGVyUm93OnE7aWYodGhpcy5ncmlkJiZ0aGlzLl92aXJ0dWFsQ291bnQtMT09PXEpcmV0dXJuIHEtcSV0aGlzLl9pdGVtc1BlclJvd30pfHwwfXJldHVybiBrfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe3ZhciBrPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09ayl7aWYodGhpcy5ncmlkKWs9TWF0aC5taW4odGhpcy5fdmlydHVhbENvdW50LHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdy0xKTtlbHNle3ZhciBtPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCxxKXttPHRoaXMuX3Njcm9sbEJvdHRvbSYmKGs9cSk7bSs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHApfSl9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1rfXJldHVybiBrfSwKZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3RoaXMuc2Nyb2xsT2Zmc2V0fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2RpZEZvY3VzLmJpbmQodGhpcyksITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsZik7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKTt0aGlzLmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIik7dGhpcy51bmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LF9zZXRPdmVyZmxvdzpmdW5jdGlvbihrKXt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPWs9PT10aGlzPyJ0b3VjaCI6IiI7dGhpcy5zdHlsZS5vdmVyZmxvd1k9az09PXRoaXM/ImF1dG8iOiIiO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGYpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt2YXIgaz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9CnRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcz8wOnBhcnNlSW50KGtbInBhZGRpbmctdG9wIl0sMTApO3RoaXMuX2lzUlRMPSJydGwiPT09ay5kaXJlY3Rpb247dGhpcy5fdmlld3BvcnRXaWR0aD10aGlzLiQuaXRlbXMub2Zmc2V0V2lkdGg7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuZ3JpZCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKX0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgaz1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxtPWstdGhpcy5fc2Nyb2xsUG9zaXRpb24scD0wPD1tO3RoaXMuX3Njcm9sbFBvc2l0aW9uPWs7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO01hdGguYWJzKG0pPnRoaXMuX3BoeXNpY2FsU2l6ZSYmMDx0aGlzLl9waHlzaWNhbFNpemU/KG0tPXRoaXMuX3Njcm9sbE9mZnNldCxwPU1hdGgucm91bmQobS8KdGhpcy5fcGh5c2ljYWxBdmVyYWdlKSp0aGlzLl9pdGVtc1BlclJvdyx0aGlzLl92aXJ0dWFsU3RhcnQrPXAsdGhpcy5fcGh5c2ljYWxTdGFydCs9cCx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLHRoaXMuX3VwZGF0ZSgpKTowPHRoaXMuX3BoeXNpY2FsQ291bnQmJihrPXRoaXMuX2dldFJldXNhYmxlcyhwKSxwPyh0aGlzLl9waHlzaWNhbFRvcD1rLnBoeXNpY2FsVG9wLHRoaXMuX3ZpcnR1YWxTdGFydCs9ay5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1rLmluZGV4ZXMubGVuZ3RoKToodGhpcy5fdmlydHVhbFN0YXJ0LT1rLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQtPWsuaW5kZXhlcy5sZW5ndGgpLHRoaXMuX3VwZGF0ZShrLmluZGV4ZXMscD9udWxsOmsuaW5kZXhlcyksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsCnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywwKSxsKSl9LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24oayl7dmFyIG09W10scD10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxxPXRoaXMuX3ZpcnR1YWxTdGFydCxyPXRoaXMuX3ZpcnR1YWxFbmQsdD10aGlzLl9waHlzaWNhbENvdW50LHY9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciBBPXRoaXMuX3BoeXNpY2FsQm90dG9tK3RoaXMuX3Njcm9sbE9mZnNldDt2YXIgeT10aGlzLl9zY3JvbGxUb3AseD10aGlzLl9zY3JvbGxCb3R0b207aWYoayl7dmFyIEM9dGhpcy5fcGh5c2ljYWxTdGFydDtBPXktdn1lbHNlIEM9dGhpcy5fcGh5c2ljYWxFbmQsQS09eDtmb3IoOzspe3ZhciBGPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChDKTtBLT1GO2lmKG0ubGVuZ3RoPj10fHxBPD1wKWJyZWFrO2lmKGspe2lmKHIrbS5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrOwppZih2K0Y+PXktdGhpcy5fc2Nyb2xsT2Zmc2V0KWJyZWFrO20ucHVzaChDKTt2Kz1GO0M9KEMrMSkldH1lbHNle2lmKDA+PXEtbS5sZW5ndGgpYnJlYWs7aWYodit0aGlzLl9waHlzaWNhbFNpemUtRjw9eClicmVhazttLnB1c2goQyk7di09RjtDPTA9PT1DP3QtMTpDLTF9fXJldHVybntpbmRleGVzOm0scGh5c2ljYWxUb3A6di10aGlzLl9zY3JvbGxPZmZzZXR9fSxfdXBkYXRlOmZ1bmN0aW9uKGssbSl7aWYoIShrJiYwPT09ay5sZW5ndGh8fDA9PT10aGlzLl9waHlzaWNhbENvdW50KSl7dGhpcy5fbWFuYWdlRm9jdXMoKTt0aGlzLl9hc3NpZ25Nb2RlbHMoayk7dGhpcy5fdXBkYXRlTWV0cmljcyhrKTtpZihtKWZvcig7bS5sZW5ndGg7KWs9bS5wb3AoKSx0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGspO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGspe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7CnZhciBtLHA9QXJyYXkoayk7Zm9yKG09MDttPGs7bSsrKXt2YXIgcT10aGlzLnN0YW1wKG51bGwpO3BbbV09cS5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChxLnJvb3QpfXJldHVybiBwfSxfaXNDbGllbnRGdWxsOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxCb3R0b20tMT49dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbFRvcDw9dGhpcy5fc2Nyb2xsUG9zaXRpb259LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbihrKXtrPXRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQraywzLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQpO2s9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyhrKTtpZih0aGlzLmdyaWQpe3ZhciBtPWsldGhpcy5faXRlbXNQZXJSb3c7bSYmay1tPD10aGlzLl9waHlzaWNhbENvdW50JiYoays9dGhpcy5faXRlbXNQZXJSb3cpOwprLT1tfWstPXRoaXMuX3BoeXNpY2FsQ291bnQ7bT1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoMD5rKSl7aWYoMDxrKXttPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChrKSk7Zm9yKHZhciBwPTA7cDxrO3ArKyl0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7dGhpcy5fcGh5c2ljYWxDb3VudCs9azt0aGlzLl9waHlzaWNhbFN0YXJ0PnRoaXMuX3BoeXNpY2FsRW5kJiZ0aGlzLl9pc0luZGV4UmVuZGVyZWQodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkmJnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCk8dGhpcy5fcGh5c2ljYWxFbmQmJih0aGlzLl9waHlzaWNhbFN0YXJ0Kz1rKTt0aGlzLl91cGRhdGUoKTt0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS1tKS9rO209TWF0aC5yb3VuZCguNSoKdGhpcy5fcGh5c2ljYWxDb3VudCl9dGhpcy5fdmlydHVhbEVuZD49dGhpcy5fdmlydHVhbENvdW50LTF8fDA9PT1tfHwodGhpcy5faXNDbGllbnRGdWxsKCk/dGhpcy5fcGh5c2ljYWxTaXplPHRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHRoaXMuX2NsYW1wKE1hdGgucm91bmQoNTAvdGhpcy5fdGVtcGxhdGVDb3N0KSwxLG0pKSxnKTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsbSksbCkpfX0sX3JlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faXNWaXNpYmxlKWlmKDAhPT10aGlzLl9waHlzaWNhbENvdW50KXt2YXIgaz10aGlzLl9nZXRSZXVzYWJsZXMoITApO3RoaXMuX3BoeXNpY2FsVG9wPWsucGh5c2ljYWxUb3A7dGhpcy5fdmlydHVhbFN0YXJ0Kz0Kay5pbmRleGVzLmxlbmd0aDt0aGlzLl9waHlzaWNhbFN0YXJ0Kz1rLmluZGV4ZXMubGVuZ3RoO3RoaXMuX3VwZGF0ZShrLmluZGV4ZXMpO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApfWVsc2UgMDx0aGlzLl92aXJ0dWFsQ291bnQmJih0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDMpKX0sX2Vuc3VyZVRlbXBsYXRpemVkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY3Rvcil7KHRoaXMuX3VzZXJUZW1wbGF0ZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oInRlbXBsYXRlIikpfHxjb25zb2xlLndhcm4oImlyb24tbGlzdCByZXF1aXJlcyBhIHRlbXBsYXRlIHRvIGJlIHByb3ZpZGVkIGluIGxpZ2h0LWRvbSIpO3ZhciBrPXtfX2tleV9fOiEwfTtrW3RoaXMuYXNdPSEwO2tbdGhpcy5pbmRleEFzXT0hMDtrW3RoaXMuc2VsZWN0ZWRBc109ITA7ay50YWJJbmRleD0hMDt0aGlzLl9pbnN0YW5jZVByb3BzPQprO3RoaXMudGVtcGxhdGl6ZSh0aGlzLl91c2VyVGVtcGxhdGUsdGhpcy5tdXRhYmxlRGF0YSl9fSxfZ3JpZENoYW5nZWQ6ZnVuY3Rpb24oayxtKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBtJiYodGhpcy5ub3RpZnlSZXNpemUoKSxQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpLGsmJnRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCkpfSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGspe2lmKCJpdGVtcyI9PT1rLnBhdGgpdGhpcy5fcGh5c2ljYWxUb3A9dGhpcy5fdmlydHVhbFN0YXJ0PTAsdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0aGlzLl9jb2xsZWN0aW9uPXRoaXMuaXRlbXMmJlBvbHltZXIuQ29sbGVjdGlvbj9Qb2x5bWVyLkNvbGxlY3Rpb24uZ2V0KHRoaXMuaXRlbXMpOm51bGwsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPQpudWxsLHRoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudHx8MCx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdLHRoaXMuX3BoeXNpY2FsU2l6ZXM9dGhpcy5fcGh5c2ljYWxTaXplc3x8W10sdGhpcy5fcGh5c2ljYWxTdGFydD0wLHRoaXMuX3Njcm9sbFRvcD50aGlzLl9zY3JvbGxPZmZzZXQmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCksdGhpcy5fcmVtb3ZlRm9jdXNlZEl0ZW0oKSx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGYpO2Vsc2UgaWYoIml0ZW1zLnNwbGljZXMiPT09ay5wYXRoKXt0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXgoay52YWx1ZS5pbmRleFNwbGljZXMpO3RoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjA7aWYoay52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihwKXtyZXR1cm4gMDxwLmFkZGVkQ291bnR8fDA8cC5yZW1vdmVkLmxlbmd0aH0pKXt2YXIgbT0KdGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3RoaXMuY29udGFpbnMobSkmJm0uYmx1cigpfWs9ay52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihwKXtyZXR1cm4gcC5pbmRleCtwLmFkZGVkQ291bnQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmcC5pbmRleDw9dGhpcy5fdmlydHVhbEVuZH0sdGhpcyk7dGhpcy5faXNDbGllbnRGdWxsKCkmJiFrfHx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGYpfWVsc2UiaXRlbXMubGVuZ3RoIiE9PWsucGF0aCYmdGhpcy5fZm9yd2FyZEl0ZW1QYXRoKGsucGF0aCxrLnZhbHVlKX0sX2ZvcndhcmRJdGVtUGF0aDpmdW5jdGlvbihrLG0pe2s9ay5zbGljZSg2KTt2YXIgcD1rLmluZGV4T2YoIi4iKTstMT09PXAmJihwPWsubGVuZ3RoKTt2YXIgcSxyPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTtpZihkKXt2YXIgdD1wYXJzZUludChrLnN1YnN0cmluZygwLHApLDEwKTtpZihxPXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KSl7dmFyIHY9CnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodCk7dmFyIEE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t2XSl9ZWxzZSByJiYoQT1yKTtpZighQXx8QVt0aGlzLmluZGV4QXNdIT09dClyZXR1cm59ZWxzZSBpZih0PWsuc3Vic3RyaW5nKDAscCksciYmci5fX2tleV9fPT09dClBPXI7ZWxzZSBpZih2PXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdF0sQT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3ZdKSwhQXx8QS5fX2tleV9fIT09dClyZXR1cm47az1rLnN1YnN0cmluZyhwKzEpO2s9dGhpcy5hcysoaz8iLiIrazoiIik7ZD9BLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoayxtLCExLCEwKTpBLm5vdGlmeVBhdGgoayxtLCEwKTtBLl9mbHVzaFByb3BlcnRpZXMmJkEuX2ZsdXNoUHJvcGVydGllcyghMCk7cSYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW3ZdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCkpfSwKX2FkanVzdFZpcnR1YWxJbmRleDpmdW5jdGlvbihrKXtrLmZvckVhY2goZnVuY3Rpb24obSl7bS5yZW1vdmVkLmZvckVhY2godGhpcy5fcmVtb3ZlSXRlbSx0aGlzKTttLmluZGV4PHRoaXMuX3ZpcnR1YWxTdGFydCYmKG09TWF0aC5tYXgobS5hZGRlZENvdW50LW0ucmVtb3ZlZC5sZW5ndGgsbS5pbmRleC10aGlzLl92aXJ0dWFsU3RhcnQpLHRoaXMuX3ZpcnR1YWxTdGFydCs9bSwwPD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiYodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCs9bSkpfSx0aGlzKX0sX3JlbW92ZUl0ZW06ZnVuY3Rpb24oayl7dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KGspO3RoaXMuX2ZvY3VzZWRJdGVtJiZ0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9mb2N1c2VkSXRlbSlbdGhpcy5hc109PT1rJiZ0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGssbSl7dmFyIHAscTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmbSlmb3IocT0KMDtxPG0ubGVuZ3RoO3ErKyl7dmFyIHI9bVtxXTt2YXIgdD10aGlzLl9jb21wdXRlVmlkeChyKTtpZihudWxsIT0ocD1rLmNhbGwodGhpcyxyLHQpKSlyZXR1cm4gcH1lbHNle3I9dGhpcy5fcGh5c2ljYWxTdGFydDtmb3IodD10aGlzLl92aXJ0dWFsU3RhcnQ7cjx0aGlzLl9waHlzaWNhbENvdW50O3IrKyx0KyspaWYobnVsbCE9KHA9ay5jYWxsKHRoaXMscix0KSkpcmV0dXJuIHA7Zm9yKHI9MDtyPHRoaXMuX3BoeXNpY2FsU3RhcnQ7cisrLHQrKylpZihudWxsIT0ocD1rLmNhbGwodGhpcyxyLHQpKSlyZXR1cm4gcH19LF9jb21wdXRlVmlkeDpmdW5jdGlvbihrKXtyZXR1cm4gaz49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGstdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2t9LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24oayl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0sCnApe3ZhciBxPXRoaXMuX3BoeXNpY2FsSXRlbXNbbV0scj10aGlzLml0ZW1zJiZ0aGlzLml0ZW1zW3BdO2lmKG51bGwhPXIpe3ZhciB0PXRoaXMubW9kZWxGb3JFbGVtZW50KHEpO3QuX19rZXlfXz10aGlzLl9jb2xsZWN0aW9uP3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHIpOm51bGw7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHQsdGhpcy5hcyxyKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodCx0aGlzLnNlbGVjdGVkQXMsdGhpcy4kLnNlbGVjdG9yLmlzU2VsZWN0ZWQocikpO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh0LHRoaXMuaW5kZXhBcyxwKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodCwidGFiSW5kZXgiLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9PT1wPzA6LTEpO3RoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdC5fX2tleV9fXT1tO3QuX2ZsdXNoUHJvcGVydGllcyYmdC5fZmx1c2hQcm9wZXJ0aWVzKCEwKTtxLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9ZWxzZSBxLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwKIiIpfSxrKX0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24oayl7UG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKTt2YXIgbT0wLHA9MCxxPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LHI9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbih0KXtwKz10aGlzLl9waHlzaWNhbFNpemVzW3RdO3RoaXMuX3BoeXNpY2FsU2l6ZXNbdF09dGhpcy5fcGh5c2ljYWxJdGVtc1t0XS5vZmZzZXRIZWlnaHQ7bSs9dGhpcy5fcGh5c2ljYWxTaXplc1t0XTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t0XT8xOjB9LGspO3RoaXMuZ3JpZD8odGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFNpemU9TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCk6KHA9MT09PXRoaXMuX2l0ZW1zUGVyUm93P3A6Ck1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQsdGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZSttLXAsdGhpcy5faXRlbXNQZXJSb3c9MSk7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1xJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKHIqcSttKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfdXBkYXRlR3JpZE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtV2lkdGg9MDx0aGlzLl9waHlzaWNhbENvdW50P3RoaXMuX3BoeXNpY2FsSXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg6MjAwO3RoaXMuX3Jvd0hlaWdodD0wPHRoaXMuX3BoeXNpY2FsQ291bnQ/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5vZmZzZXRIZWlnaHQ6MjAwO3RoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1XaWR0aD9NYXRoLmZsb29yKHRoaXMuX3ZpZXdwb3J0V2lkdGgvdGhpcy5faXRlbVdpZHRoKToKdGhpcy5faXRlbXNQZXJSb3d9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgaz10aGlzLl9waHlzaWNhbFRvcDtpZih0aGlzLmdyaWQpe3ZhciBtPSh0aGlzLl92aWV3cG9ydFdpZHRoLXRoaXMuX2l0ZW1zUGVyUm93KnRoaXMuX2l0ZW1XaWR0aCkvMjt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCxxKXt2YXIgcj1NYXRoLmZsb29yKHEldGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoK20pO3RoaXMuX2lzUlRMJiYocio9LTEpO3RoaXMudHJhbnNsYXRlM2QocisicHgiLGsrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbcF0pO3RoaXMuX3Nob3VsZFJlbmRlck5leHRSb3cocSkmJihrKz10aGlzLl9yb3dIZWlnaHQpfSl9ZWxzZSB0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCl7dGhpcy50cmFuc2xhdGUzZCgwLGsrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbcF0pO2srPXRoaXMuX3BoeXNpY2FsU2l6ZXNbcF19KX0sCl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuZ3JpZD90aGlzLl9jb21wdXRlVmlkeChrKSV0aGlzLl9pdGVtc1BlclJvdyE9PXRoaXMuX2l0ZW1zUGVyUm93LTE/MDp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplc1trXX0sX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24oayl7cmV0dXJuIGsldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgaz0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT1rKXt0aGlzLl9waHlzaWNhbFRvcC09azt2YXIgbT10aGlzLl9zY3JvbGxUb3A7IWMmJjA8bSYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihtLWspfX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oayl7dGhpcy5zY3JvbGxUYXJnZXQmJgowPD1rJiYodGhpcy5fc2Nyb2xsUG9zaXRpb249dGhpcy5fc2Nyb2xsVG9wPWspfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKGspe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLmdyaWQ/dGhpcy5fdmlydHVhbFJvd0NvdW50KnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChrPShrPShrPWt8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fHRoaXMuZ3JpZCYmdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodDx0aGlzLl9lc3RTY3JvbGxIZWlnaHQpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD0KdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KyJweCIsdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodH0sc2Nyb2xsVG9JdGVtOmZ1bmN0aW9uKGspe3JldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGspKX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbihrKXtpZighKCJudW1iZXIiIT09dHlwZW9mIGt8fDA+a3x8az50aGlzLml0ZW1zLmxlbmd0aC0xKSYmKFBvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCksMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpKXtrPXRoaXMuX2NsYW1wKGssMCx0aGlzLl92aXJ0dWFsQ291bnQtMSk7aWYoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZChrKXx8az49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KXRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLmdyaWQ/ay0yKnRoaXMuX2l0ZW1zUGVyUm93OmstMTt0aGlzLl9tYW5hZ2VGb2N1cygpO3RoaXMuX2Fzc2lnbk1vZGVscygpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoKTsKdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIG09dGhpcy5fcGh5c2ljYWxTdGFydCxwPXRoaXMuX3ZpcnR1YWxTdGFydCxxPTAscj10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTtwPGsmJnE8PXI7KXErPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChtKSxtPShtKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQscCsrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0K3EpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH19LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD0KdGhpcy5fcGh5c2ljYWxBdmVyYWdlPTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLGZ1bmN0aW9uKCl7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5faXNWaXNpYmxlPyh0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9LGYpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGspe3JldHVybiB0aGlzLnNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihrKSl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKGspe2lmKCEoMD5rfHxrPj10aGlzLl92aXJ0dWFsQ291bnQpKXshdGhpcy5tdWx0aVNlbGVjdGlvbiYmdGhpcy5zZWxlY3RlZEl0ZW0mJnRoaXMuY2xlYXJTZWxlY3Rpb24oKTtpZih0aGlzLl9pc0luZGV4UmVuZGVyZWQoaykpe3ZhciBtPQp0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgoayldKTttJiYobVt0aGlzLnNlbGVjdGVkQXNdPSEwKTt0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChrKX10aGlzLiQuc2VsZWN0b3Iuc2VsZWN0SW5kZXg/dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KGspOnRoaXMuJC5zZWxlY3Rvci5zZWxlY3QodGhpcy5pdGVtc1trXSl9fSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuZGVzZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaykpfSxkZXNlbGVjdEluZGV4OmZ1bmN0aW9uKGspezA+a3x8az49dGhpcy5fdmlydHVhbENvdW50fHwodGhpcy5faXNJbmRleFJlbmRlcmVkKGspJiYodGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGspXSlbdGhpcy5zZWxlY3RlZEFzXT0hMSx0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChrKSksdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXg/CnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KGspOnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdCh0aGlzLml0ZW1zW2tdKSl9LHRvZ2dsZVNlbGVjdGlvbkZvckl0ZW06ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGspKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXg6ZnVuY3Rpb24oayl7KHRoaXMuJC5zZWxlY3Rvci5pc0luZGV4U2VsZWN0ZWQ/dGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZChrKTp0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2tdKSk/dGhpcy5kZXNlbGVjdEluZGV4KGspOnRoaXMuc2VsZWN0SW5kZXgoayl9LGNsZWFyU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGspe3RoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNba10pW3RoaXMuc2VsZWN0ZWRBc109ITF9KTt0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sCl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZDpmdW5jdGlvbihrKXsoaz90aGlzLmxpc3Rlbjp0aGlzLnVubGlzdGVuKS5jYWxsKHRoaXMsdGhpcywidGFwIiwiX3NlbGVjdGlvbkhhbmRsZXIiKX0sX3NlbGVjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oayl7dmFyIG09dGhpcy5tb2RlbEZvckVsZW1lbnQoay50YXJnZXQpO2lmKG0pe3ZhciBwPVBvbHltZXIuZG9tKGspLnBhdGhbMF07az10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCk7dmFyIHE9dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KG1bdGhpcy5pbmRleEFzXSldO2lmKCJpbnB1dCIhPT1wLmxvY2FsTmFtZSYmImJ1dHRvbiIhPT1wLmxvY2FsTmFtZSYmInNlbGVjdCIhPT1wLmxvY2FsTmFtZSl7cD1tLnRhYkluZGV4O20udGFiSW5kZXg9LTEwMDt2YXIgcj1rP2sudGFiSW5kZXg6LTE7bS50YWJJbmRleD1wO2smJnEhPT1rJiZxLmNvbnRhaW5zKGspJiYtMTAwIT09cnx8dGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJdGVtKG1bdGhpcy5hc10pfX19LApfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKGspe3RoaXMuY2xlYXJTZWxlY3Rpb24oKTt0aGlzLiQuc2VsZWN0b3IubXVsdGk9a30sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihrKSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbihrKXtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGspKXJldHVybiBudWxsO3RoaXMuX3VwZGF0ZU1ldHJpY3MoW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgoayldKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7cmV0dXJuIG51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciBrPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7MDw9ayYmazx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKGspP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6MDx0aGlzLl92aXJ0dWFsQ291bnQmJgowPHRoaXMuX3BoeXNpY2FsQ291bnQmJih0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9waHlzaWNhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dGhpcy5fdmlydHVhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fcGh5c2ljYWxTdGFydF0pfSxfY29udmVydEluZGV4VG9Db21wbGV0ZVJvdzpmdW5jdGlvbihrKXt0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MTtyZXR1cm4gdGhpcy5ncmlkP01hdGguY2VpbChrL3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9pdGVtc1BlclJvdzprfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGspe3JldHVybiBrPj10aGlzLl92aXJ0dWFsU3RhcnQmJms8PXRoaXMuX3ZpcnR1YWxFbmR9LF9pc0luZGV4VmlzaWJsZTpmdW5jdGlvbihrKXtyZXR1cm4gaz49dGhpcy5maXJzdFZpc2libGVJbmRleCYmazw9dGhpcy5sYXN0VmlzaWJsZUluZGV4fSxfZ2V0UGh5c2ljYWxJbmRleDpmdW5jdGlvbihrKXtyZXR1cm4gZD8KKHRoaXMuX3BoeXNpY2FsU3RhcnQrKGstdGhpcy5fdmlydHVhbFN0YXJ0KSkldGhpcy5fcGh5c2ljYWxDb3VudDp0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHRoaXMuaXRlbXNba10pXX0sZm9jdXNJdGVtOmZ1bmN0aW9uKGspe3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKGspfSxfZm9jdXNQaHlzaWNhbEl0ZW06ZnVuY3Rpb24oayl7aWYoISgwPmt8fGs+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpO3RoaXMuX2lzSW5kZXhSZW5kZXJlZChrKXx8dGhpcy5zY3JvbGxUb0luZGV4KGspO3ZhciBtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChrKV0scD10aGlzLm1vZGVsRm9yRWxlbWVudChtKSxxO3AudGFiSW5kZXg9LTEwMDstMTAwPT09bS50YWJJbmRleCYmKHE9bSk7cXx8KHE9UG9seW1lci5kb20obSkucXVlcnlTZWxlY3RvcignW3RhYmluZGV4XHgzZCItMTAwIl0nKSk7CnAudGFiSW5kZXg9MDt0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PWs7cSYmcS5mb2N1cygpfX0sX3JlbW92ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX2l0ZW1zUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTt0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbT1udWxsO3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciBrPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIG09dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT0KbS5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChtLnJvb3QpfXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNba107dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLnRhYkluZGV4PTA7dGhpcy5fcGh5c2ljYWxJdGVtc1trXT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbTt0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD1rO3RoaXMudHJhbnNsYXRlM2QoMCwiLTEwMDAwcHgiLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciBrPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksCm09dGhpcy5fcGh5c2ljYWxJdGVtc1trXTtpZihtKXt2YXIgcD10aGlzLm1vZGVsRm9yRWxlbWVudChtKSxxPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTtwW3RoaXMuYXNdPT09cVt0aGlzLmFzXT8odGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09bSxwLnRhYkluZGV4PS0xLHRoaXMuX3BoeXNpY2FsSXRlbXNba109dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy50cmFuc2xhdGUzZCgwLCItMTAwMDBweCIsMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpO3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKGspe2s9dGhpcy5tb2RlbEZvckVsZW1lbnQoay50YXJnZXQpO3ZhciBtPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxwPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSwKcT10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4O2smJihtPT09az90aGlzLl9pc0luZGV4VmlzaWJsZShxKXx8dGhpcy5zY3JvbGxUb0luZGV4KHEpOih0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSxtJiYobS50YWJJbmRleD0tMSksay50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9cT1rW3RoaXMuaW5kZXhBc10sdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleChxKSx0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4XSxwJiYhdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX3VwZGF0ZSgpKSl9LF9rZXlkb3duSGFuZGxlcjpmdW5jdGlvbihrKXtzd2l0Y2goay5rZXlDb2RlKXtjYXNlIDQwOnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8dGhpcy5fdmlydHVhbENvdW50LTEmJmsucHJldmVudERlZmF1bHQoKTt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KwoodGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM5OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/LTE6MSkpO2JyZWFrO2Nhc2UgMzg6MDx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiZrLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleC0odGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM3OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/MTotMSkpO2JyZWFrO2Nhc2UgMTM6dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksdGhpcy5zZWxlY3Rpb25FbmFibGVkJiZ0aGlzLl9zZWxlY3Rpb25IYW5kbGVyKGspfX0sX2NsYW1wOmZ1bmN0aW9uKGssCm0scCl7cmV0dXJuIE1hdGgubWluKHAsTWF0aC5tYXgobSxrKSl9LF9kZWJvdW5jZTpmdW5jdGlvbihrLG0scCl7ZD8odGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW2tdPVBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNba10scCxtLmJpbmQodGhpcykpLFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9kZWJvdW5jZXJzW2tdKSk6UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UoayxtKSl9LF9mb3J3YXJkUHJvcGVydHk6ZnVuY3Rpb24oayxtLHApe2Q/ay5fc2V0UGVuZGluZ1Byb3BlcnR5KG0scCk6a1ttXT1wfSxfZm9yd2FyZEhvc3RQcm9wVjI6ZnVuY3Rpb24oayxtKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKHApe3AmJnRoaXMubW9kZWxGb3JFbGVtZW50KHApLmZvcndhcmRIb3N0UHJvcChrLAptKX0sdGhpcyl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihrLG0scCl7UG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcyxtKSYmKGs9a1t0aGlzLmluZGV4QXNdLG09PXRoaXMuYXMmJih0aGlzLml0ZW1zW2tdPXApLHRoaXMubm90aWZ5UGF0aChQb2x5bWVyLlBhdGgudHJhbnNsYXRlKHRoaXMuYXMsIml0ZW1zLiIrayxtKSxwKSl9LF9nZXRTdGFtcGVkQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxJdGVtc30sX2ZvcndhcmRJbnN0YW5jZVBhdGg6ZnVuY3Rpb24oayxtLHApezA9PT1tLmluZGV4T2YodGhpcy5hcysiLiIpJiZ0aGlzLm5vdGlmeVBhdGgoIml0ZW1zLiIray5fX2tleV9fKyIuIittLnNsaWNlKHRoaXMuYXMubGVuZ3RoKzEpLHApfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24oayxtKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKHApe3AmJgp0aGlzLm1vZGVsRm9yRWxlbWVudChwKS5ub3RpZnlQYXRoKGssbSwhMCl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFByb3A6ZnVuY3Rpb24oayxtKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKHApe3AmJih0aGlzLm1vZGVsRm9yRWxlbWVudChwKVtrXT1tKX0sdGhpcyl9LF9nZXRBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5faXRlbXNQYXJlbnQubm9kZS5kb21Ib3N0O3JldHVybiBQb2x5bWVyLmRvbShrP2sucm9vdDpkb2N1bWVudCkuYWN0aXZlRWxlbWVudH19KX0pKCk7Cjwvc2NyaXB0PgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLWJvZHkiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47IC8qIG5lZWRlZCBmb3IgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXMgdG8gd29yayBvbiBmZiAqLwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgOmhvc3QoW3R3by1saW5lXSkgewogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tYm9keS10d28tbGluZS1taW4taGVpZ2h0LCA3MnB4KTsKICAgICAgfQoKICAgICAgOmhvc3QoW3RocmVlLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXRocmVlLWxpbmUtbWluLWhlaWdodCwgODhweCk7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKFtzZWNvbmRhcnldKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1ib2R5MTsKCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnktY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9wYXBlci1pdGVtL3BhcGVyLWl0ZW0tYm9keS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtLWJvZHkifSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtc2l6ZTogMDsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QgewogICAgICAgIGZpbGw6IHVybCgjcmVjdEhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLWVsbGlwc2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QsCiAgICAgIC5mYWRlZC1lbGxpcHNlLAogICAgICAuZmFkZWQtc2VyaWVzIHsKICAgICAgICBzdHJva2U6IHZhcigtLXRiLWdyYXBoLWZhZGVkKSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgICNyZWN0SGF0Y2ggbGluZSwKICAgICAgI2VsbGlwc2VIYXRjaCBsaW5lIHsKICAgICAgICBjb2xvcjogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICAgIHN0cm9rZTogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgCiAgICA8c3ZnIGhlaWdodD0iMCIgd2lkdGg9IjAiIGlkPSJzdmdEZWZzIj4KICAgICAgPGRlZnM+CiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KICAgICAgICAKICAgICAgICA8ZWxsaXBzZSBpZD0ib3Atbm9kZS1zdGFtcCIgcng9IjcuNSIgcnk9IjMiIHN0cm9rZT0iaW5oZXJpdCIgZmlsbD0iaW5oZXJpdCIgLz4KICAgICAgICAKICAgICAgICA8ZWxsaXBzZSBpZD0ib3Atbm9kZS1hbm5vdGF0aW9uLXN0YW1wIiByeD0iNSIgcnk9IjIiIHN0cm9rZT0iaW5oZXJpdCIgZmlsbD0iaW5oZXJpdCIgLz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjkiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI2IiAvPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iMyIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPGcgaWQ9Im9wLXNlcmllcy1ob3Jpem9udGFsLXN0YW1wIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjE2IiB5PSI0IiAvPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTIiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI0IiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ic3VtbWFyeS1pY29uIiBmaWxsPSIjODQ4NDg0IiBoZWlnaHQ9IjEyIiB2aWV3Ym94PSIwIDAgMjQgMjQiIHdpZHRoPSIxMiI+CiAgICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9kZWZzPgogICAgPC9zdmc+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnQ09OU1QnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTAgMTAiPgogICAgICAgIDxjaXJjbGUgY3g9IjUiIGN5PSI1IiByPSIzIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NVTU1BUlknKV1dIj4KICAgICAgPHN2ZyB3aWR0aCQ9IltbaGVpZ2h0XV0iIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHZpZXdib3g9IjAgMCAyNCAyNCIgZmlsbD0iIzg0ODQ4NCI+CiAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ09QJyldXSI+CiAgICAgIDxzdmcgaGVpZ2h0JD0iW1toZWlnaHRdXSIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE2IDgiPgogICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnZWxsaXBzZScpfX0iIHg9IjgiIHk9IjQiIC8+CiAgICAgIDwvc3ZnPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdNRVRBJyldXSI+CiAgICAgIDxzdmcgaGVpZ2h0JD0iW1toZWlnaHRdXSIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDM3IDE2Ij4KICAgICAgICA8cmVjdCB4PSIxIiB5PSIxIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAncmVjdCcpfX0iIHN0cm9rZS13aWR0aD0iMnB4IiBoZWlnaHQ9IjE0IiB3aWR0aD0iMzUiIHJ4PSI1IiByeT0iNSIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NFUklFUycpXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgMTUiPgogICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLXNlcmllcy12ZXJ0aWNhbC1zdGFtcCIgZmlsbCQ9IltbX2ZpbGxdXSIgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iIGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhmYWRlZCwgJ3NlcmllcycpfX0iIHg9IjAiIHk9IjIiIC8+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMjQgMTAiPgogICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLXNlcmllcy1ob3Jpem9udGFsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMSIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWdyYXBoLWNvbW1vbi90Zi1ncmFwaC1pY29uLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2xldCBmOyhmdW5jdGlvbihnKXtnLkNPTlNUPSJDT05TVCI7Zy5NRVRBPSJNRVRBIjtnLk9QPSJPUCI7Zy5TRVJJRVM9IlNFUklFUyI7Zy5TVU1NQVJZPSJTVU1NQVJZIn0pKGY9ZC5HcmFwaEljb25UeXBlfHwoZC5HcmFwaEljb25UeXBlPXt9KSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWljb24iLHByb3BlcnRpZXM6e3R5cGU6U3RyaW5nLHZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGxPdmVycmlkZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc3Ryb2tlT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LGZhZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maWxsOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVGaWxsKHR5cGUsIGZpbGxPdmVycmlkZSkifSxfc3Ryb2tlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTdHJva2UodHlwZSwgc3Ryb2tlT3ZlcnJpZGUpIn19LApnZXRTdmdEZWZpbmFibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuJC5zdmdEZWZzfSxfY29tcHV0ZUZpbGwoZyxsKXtpZihudWxsIT1sKXJldHVybiBsO3N3aXRjaChnKXtjYXNlIGYuTUVUQTpyZXR1cm4gYS5ncmFwaC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2Nhc2UgZi5TRVJJRVM6cmV0dXJuIGEuZ3JhcGgucmVuZGVyLlNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2RlZmF1bHQ6cmV0dXJuIGEuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEx9fSxfY29tcHV0ZVN0cm9rZShnLGwpe2lmKG51bGwhPWwpcmV0dXJuIGw7c3dpdGNoKGcpe2Nhc2UgZi5NRVRBOnJldHVybiBhLmdyYXBoLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRTtjYXNlIGYuU0VSSUVTOnJldHVybiBhLmdyYXBoLnJlbmRlci5TZXJpZXNOb2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFO2RlZmF1bHQ6cmV0dXJuIGEuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRX19LApfaXNUeXBlKGcsbCl7cmV0dXJuIGc9PT1sfSxfZmFkZWRDbGFzczpmdW5jdGlvbihnLGwpe3JldHVybiBnPyJmYWRlZC0iK2w6IiJ9fSl9KShjLmljb258fChjLmljb249e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtaWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB0Zi1ncmFwaC1pY29uIHsKICAgICAgICAtLXRiLWdyYXBoLWZhZGVkOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGYtZ3JhcGgtaWNvbiBpZD0iaWNvbiIgdHlwZT0iW1tfZ2V0VHlwZShub2RlLCBzdW1tYXJ5LCBjb25zdCwgdHlwZSldXSIgaGVpZ2h0PSJbW2hlaWdodF1dIiBmaWxsLW92ZXJyaWRlPSJbW19maWxsT3ZlcnJpZGVdXSIgc3Ryb2tlLW92ZXJyaWRlPSJbW19nZXRTdHJva2VPdmVycmlkZShfZmlsbE92ZXJyaWRlKV1dIiBmYWRlZD0iW1tfZ2V0RmFkZWQocmVuZGVySW5mbyldXSIgdmVydGljYWw9IltbX2lzVmVydGljYWwobm9kZSwgdmVydGljYWwpXV0iPjwvdGYtZ3JhcGgtaWNvbj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtY29tbW9uL3RmLW5vZGUtaWNvbi5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWljb24iLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHJlbmRlckluZm86e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LGNvbG9yQnk6e3R5cGU6T2JqZWN0LHZhbHVlOiJzdHJ1Y3R1cmFsIn0sdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSx0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjb25zdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzdW1tYXJ5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF9maWxsT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGxPdmVycmlkZShub2RlLCByZW5kZXJJbmZvLCBjb2xvckJ5LCB0ZW1wbGF0ZUluZGV4LCBmaWxsKSIsb2JzZXJ2ZXI6Il9vbkZpbGxPdmVycmlkZUNoYW5nZWQifX0sCl9jb21wdXRlRmlsbE92ZXJyaWRlOmZ1bmN0aW9uKGEsYyxkLGYsZyl7cmV0dXJuIGEmJmMmJmQmJmY/KGE9dGYuZ3JhcGguc2NlbmUubm9kZSxhLmdldEZpbGxGb3JOb2RlKGYsYS5Db2xvckJ5W2QudG9VcHBlckNhc2UoKV0sYywhMSkpOmd9LF9nZXRTdHJva2VPdmVycmlkZTpmdW5jdGlvbihhKXtyZXR1cm4gYT90Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFN0cm9rZUZvckZpbGwoYSk6bnVsbH0sX2dldFR5cGU6ZnVuY3Rpb24oYSxjLGQsZil7Y29uc3Qge0dyYXBoSWNvblR5cGU6Z309dGYuZ3JhcGguaWNvbjtpZihhKXN3aXRjaChhLnR5cGUpe2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuT1A6cmV0dXJuIGE9YS5vcCwic3RyaW5nIiE9PXR5cGVvZiBhP2cuT1A6IkNvbnN0Ij09PWF8fGQ/Zy5DT05TVDphLmVuZHNXaXRoKCJTdW1tYXJ5Iil8fGM/Zy5TVU1NQVJZOmcuT1A7Y2FzZSB0Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBOnJldHVybiBnLk1FVEE7Y2FzZSB0Zi5ncmFwaC5Ob2RlVHlwZS5TRVJJRVM6cmV0dXJuIGcuU0VSSUVTfXJldHVybiBmfSwKX2lzVmVydGljYWw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT9hLmhhc05vbkNvbnRyb2xFZGdlczohIWN9LF9nZXRGYWRlZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5pc0ZhZGVkT3V0fSxfb25GaWxsT3ZlcnJpZGVDaGFuZ2VkKGEsYyl7Y29uc3Qge25vZGU6ZCxyZW5kZXJJbmZvOmYsY29sb3JCeTpnLHRlbXBsYXRlSW5kZXg6bH09dGhpcyxrPXRmLmdyYXBoLnNjZW5lLm5vZGU7YSE9PWMmJmsucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuaWNvbi5nZXRTdmdEZWZpbmFibGVFbGVtZW50KCkpO2QmJmYmJmcmJmwmJmsuZ2V0RmlsbEZvck5vZGUobCxrLkNvbG9yQnlbZy50b1VwcGVyQ2FzZSgpXSxmLCExLHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSl9fSl9KSgpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICNsaXN0LWl0ZW0gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgLmNsaWNrYWJsZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtIHNwYW4gewogICAgICAgIG1hcmdpbi1sZWZ0OiA0MHB4OwogICAgICB9CgogICAgICAjbGlzdC1pdGVtLmV4Y2x1ZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICB9CgogICAgICAjbGlzdC1pdGVtIHNwYW4uZWRnZS1sYWJlbCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW4tbGVmdDogM3B4OwogICAgICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgICB9CgogICAgICAubm9kZS1pY29uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxcHg7CiAgICAgICAgbGVmdDogMnB4OwogICAgICB9CgogICAgICAuZmFkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWdyYXBoLWZhZGVkKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJsaXN0LWl0ZW0iIG9uLW1vdXNlb3Zlcj0iX25vZGVMaXN0ZW5lciIgb24tbW91c2VvdXQ9Il9ub2RlTGlzdGVuZXIiIG9uLWNsaWNrPSJfbm9kZUxpc3RlbmVyIj4KICAgICAgPGRpdiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoaXRlbVJlbmRlckluZm8pfX0iPgogICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgaGVpZ2h0PSIxMiIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9IltbY29sb3JCeVBhcmFtc11dIiBub2RlPSJbW2l0ZW1Ob2RlXV0iIHJlbmRlci1pbmZvPSJbW2l0ZW1SZW5kZXJJbmZvXV0iIHRlbXBsYXRlLWluZGV4PSJbW3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgPC90Zi1ub2RlLWljb24+CiAgICAgICAgPHNwYW4gdGl0bGUkPSJbW25hbWVdXSI+W1tuYW1lXV08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSIscHJvcGVydGllczp7Y2FyZE5vZGU6T2JqZWN0LGl0ZW1Ob2RlOk9iamVjdCxlZGdlTGFiZWw6U3RyaW5nLGl0ZW1SZW5kZXJJbmZvOk9iamVjdCxuYW1lOlN0cmluZyxpdGVtVHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOk9iamVjdCx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9ufSxfaXRlbVR5cGVDaGFuZ2VkOmZ1bmN0aW9uKCl7InN1Ym5vZGUiIT09dGhpcy5pdGVtVHlwZT90aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5hZGQoImNsaWNrYWJsZSIpOnRoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LnJlbW92ZSgiY2xpY2thYmxlIil9LF9ub2RlTGlzdGVuZXI6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJub2RlLWxpc3QtaXRlbS0iK2EudHlwZSx7bm9kZU5hbWU6dGhpcy5uYW1lLHR5cGU6dGhpcy5pdGVtVHlwZX0pfSwKX2ZhZGVkQ2xhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuaXNGYWRlZE91dD8iZmFkZWQiOiIifX0pfSkoKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDUwMHB4OwogICAgICB9CgogICAgICAuaW5jb21wYXRpYmxlLW9wcy1saXN0IHsKICAgICAgICBoZWlnaHQ6IDM1MHB4OwogICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIGlyb24tbGlzdCB7CiAgICAgICAgZmxleDogMSAxIGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYmFja2dyb3VuZDogI2U5ZTllOTsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbS1ib2R5W3R3by1saW5lXSB7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweCA0cHg7CiAgICAgIH0KCiAgICAgIC5leHBhbmRlZEluZm8gewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubm9kZS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLnN1YnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgY29sb3I6ICM1ZTVlNWU7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vbi1jb250cm9sLWxpc3QtaXRlbSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CgogICAgICBkaXYub3AtY29tcGF0LWRpc3BsYXkgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICBzdmcub3AtY29tcGF0IHsKICAgICAgICB3aWR0aDogMjUwcHg7CiAgICAgICAgaGVpZ2h0OiAyNXB4OwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CgogICAgICBkaXYub3AtY29tcGF0LXZhbHVlIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHBhcGVyLWl0ZW0+CiAgICAgIDxwYXBlci1pdGVtLWJvZHkgdHdvLWxpbmU+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9leHBhbmRlZCl9fSIgb24tY2xpY2s9Il90b2dnbGVFeHBhbmRlZCIgY2xhc3M9InRvZ2dsZS1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vZGUtbmFtZSIgaWQ9Im5vZGV0aXRsZSI+W1tub2RlVGl0bGVdXTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc2Vjb25kYXJ5PgogICAgICAgICAgPGRpdiBjbGFzcz0ic3VidGl0bGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcC1jb21wYXQtZGlzcGxheSI+CiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0ib3AtY29tcGF0IiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMjUwIDI1Ij4KICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICA8bGluZWFyZ3JhZGllbnQgaWQ9Im9wLWNvbXBhdC1maWxsIj4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3IkPSJbW19vcENvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQkPSJbW19vcENvbXBhdFNjb3JlXV0iIHN0b3AtY29sb3IkPSJbW19vcENvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQkPSJbW19vcENvbXBhdFNjb3JlXV0iIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3JdXSI+PC9zdG9wPgogICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvciQ9IltbX29wSW5jb21wYXRDb2xvciBdXSI+PC9zdG9wPgogICAgICAgICAgICAgICAgICA8L2xpbmVhcmdyYWRpZW50PgogICAgICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICAgICAgPHJlY3QgaGVpZ2h0PSIyNSIgd2lkdGg9IjI1MCIgcng9IjUiIHJ5PSI1IiBzdHlsZT0iZmlsbDogdXJsKCcjb3AtY29tcGF0LWZpbGwnKTsiIC8+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LXZhbHVlIj5bW19vcENvbXBhdFNjb3JlTGFiZWxdXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWl0ZW0tYm9keT4KICAgIDwvcGFwZXItaXRlbT4KCiAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X2V4cGFuZGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2V4cGFuZGVkfX0iIHJlc3RhbXA9InRydWUiPgogICAgICAgIDxkaXYgY2xhc3M9ImV4cGFuZGVkSW5mbyI+CiAgICAgICAgICBJbmNvbXBhdGlibGUgT3BlcmF0aW9uczogKDxzcGFuPltbX3RvdGFsSW5jb21wYXRPcHNdXTwvc3Bhbj4pCiAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJpbmNvbXBhdGlibGUtb3BzLWxpc3QiIGlkPSJpbmNvbXBhdGlibGVPcHNMaXN0IiBpdGVtcz0iW1tfaW5jb21wYXRpYmxlT3BOb2Rlc11dIj4KICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGl0ZW0tbm9kZT0iW1tpdGVtXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbX2dldFJlbmRlckluZm8oaXRlbS5uYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgaXRlbS10eXBlPSJpbmNvbXBhdGlibGUtb3BzIj4KICAgICAgICAgICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQvdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQiLHByb3BlcnRpZXM6e2dyYXBoSGllcmFyY2h5Ok9iamVjdCxoaWVyYXJjaHlQYXJhbXM6T2JqZWN0LHJlbmRlckhpZXJhcmNoeTpPYmplY3Qsbm9kZVRpdGxlOlN0cmluZyxfdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbixjb21wdXRlZDoiX2dldFRlbXBsYXRlSW5kZXgoZ3JhcGhIaWVyYXJjaHkpIn0sX2luY29tcGF0aWJsZU9wTm9kZXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0SW5jb21wYXRpYmxlT3BOb2RlcyhncmFwaEhpZXJhcmNoeSwgaGllcmFyY2h5UGFyYW1zKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfb3BDb21wYXRTY29yZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlT3BDb21wYXRTY29yZShncmFwaEhpZXJhcmNoeSkifSxfb3BDb21wYXRTY29yZUxhYmVsOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldE9wQ29tcGF0U2NvcmVMYWJlbChfb3BDb21wYXRTY29yZSkifSwKX29wQ29tcGF0Q29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOnRmLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuQ09NUEFUSUJMRX0sX29wSW5jb21wYXRDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6dGYuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5JTkNPTVBBVElCTEV9LF90b3RhbEluY29tcGF0T3BzOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2dldFRvdGFsSW5jb21wYXRpYmxlT3BzKGdyYXBoSGllcmFyY2h5KSJ9fSxfZ2V0VGVtcGxhdGVJbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRUZW1wbGF0ZUluZGV4KCl9LF9nZXROb2RlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGMubm9kZShhKX0sX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4oYXx8IiIpLnJlcGxhY2UoL1wvL2csIlx4M2N3YnJceDNlLyIpfSxfZ2V0UmVuZGVySW5mbzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGEpfSwKX3RvZ2dsZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fZXhwYW5kZWQ9IXRoaXMuX2V4cGFuZGVkfSxfZ2V0VG9nZ2xlSWNvbjpmdW5jdGlvbihhKXtyZXR1cm4gYT8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9LF9yZXNpemVMaXN0OmZ1bmN0aW9uKGEpeyhhPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSkpJiZhLmZpcmUoImlyb24tcmVzaXplIil9LF9nZXRJbmNvbXBhdGlibGVPcE5vZGVzOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYS5yb290KXJldHVybiB0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLCIjaW5jb21wYXRpYmxlT3BzTGlzdCIpKSx0Zi5ncmFwaC5oaWVyYXJjaHkuZ2V0SW5jb21wYXRpYmxlT3BzKGEsYyl9LF9jb21wdXRlT3BDb21wYXRTY29yZTpmdW5jdGlvbihhKXtpZihhJiZhLnJvb3Qpe3ZhciBjPWEucm9vdDthPWMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlO2M9Yy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZTsKcmV0dXJuIDA9PWEmJjA9PWM/MDpNYXRoLmZsb29yKDEwMCphLyhhK2MpKS8xMDB9cmV0dXJuIDB9LF9nZXRPcENvbXBhdFNjb3JlTGFiZWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGQzLmZvcm1hdCgiLjAlIikoYSl9LF9nZXRUb3RhbEluY29tcGF0aWJsZU9wczpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5yb290P2Eucm9vdC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZTowfX0pfSkoKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlZGdlLWxhYmVsIj5bW2VkZ2VMYWJlbF1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1pbmZvL3RmLW5vZGUtbGlzdC1pdGVtLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLW5vZGUtbGlzdC1pdGVtIixwcm9wZXJ0aWVzOntjYXJkTm9kZTpPYmplY3QsaXRlbU5vZGU6T2JqZWN0LGVkZ2VMYWJlbDpTdHJpbmcsaXRlbVJlbmRlckluZm86T2JqZWN0LG5hbWU6U3RyaW5nLGl0ZW1UeXBlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6T2JqZWN0LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb259LF9pdGVtVHlwZUNoYW5nZWQ6ZnVuY3Rpb24oKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX0sX25vZGVMaXN0ZW5lcjpmdW5jdGlvbihhKXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrYS50eXBlLHtjYXJkTm9kZTp0aGlzLmNhcmROb2RlLm5hbWUsbm9kZU5hbWU6dGhpcy5uYW1lLAp0eXBlOnRoaXMuaXRlbVR5cGV9KX0sX2ZhZGVkQ2xhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuaXNGYWRlZE91dD8iZmFkZWQiOiIifX0pfSkoKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1pbmZvIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5zdWItbGlzdC1ncm91cCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAzMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgIC5hdHRyLWxlZnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHdpZHRoOiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICAuYXR0ci1yaWdodCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDMwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlIHsKICAgICAgICBkaXNwbGF5OiB0YWJsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyB7CiAgICAgICAgZGlzcGxheTogdGFibGUtcm93OwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUtcm93IC5zdWItbGlzdC10YWJsZS1jZWxsOmxhc3QtY2hpbGQgewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUtY2VsbCB7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBtYXgtd2lkdGg6IDIwMHB4OwogICAgICAgIHBhZGRpbmc6IDAgNHB4OwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgfQoKICAgICAgLmNvbnRyb2xEZXBzIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCA4cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAubm9kZS1pY29uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIGNvbG9yOiAjNWU1ZTVlOwogICAgICB9CgogICAgICAuY29udHJvbExpbmUgewogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLXRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZS1ncm91cCB7CiAgICAgICAgcGFkZGluZy10b3A6IDRweDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmNsdWRlIHsKICAgICAgICBtYXJnaW46IDVweCA2cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgcGFkZGluZzogNHB4IDZweDsKICAgICAgICBmb250LXNpemU6IDEwcHQ7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmNsdWRlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc2Vjb25kYXJ5PgogICAgICAgICAgPHRmLW5vZGUtaWNvbiBjbGFzcz0ibm9kZS1pY29uIiBub2RlPSJbW19ub2RlXV0iIHJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKG5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+PC90Zi1ub2RlLWljb24+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUub3B9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgICBPcGVyYXRpb246CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5vcF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUubWV0YWdyYXBofX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgU3ViZ3JhcGg6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5jYXJkaW5hbGl0eV1dPC9zcGFuPiBub2RlcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgYXR0cmlidXRlcyI+CiAgICAgICAgICAgIEF0dHJpYnV0ZXMgKDxzcGFuPltbX2F0dHJpYnV0ZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImF0dHJpYnV0ZXNMaXN0IiBpdGVtcz0iW1tfYXR0cmlidXRlc11dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPltbaXRlbS5rZXldXTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW2l0ZW0udmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2RldmljZX19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgZGV2aWNlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPkRldmljZTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbX2RldmljZV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBwcmVkZWNlc3NvcnMiPgogICAgICAgICAgICBJbnB1dHMgKDxzcGFuPltbX3RvdGFsUHJlZGVjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImlucHV0c0xpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMucmVndWxhcl1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgY2FyZC1ub2RlPSJbW19ub2RlXV0iIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xQcmVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0icHJlZGVjZXNzb3JzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0ib3V0cHV0c0xpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJzdWNjZXNzb3IiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFN1Y2MpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlQ29udHJvbFN1Y2MiIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iIG5vLWFuaW1hdGlvbj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaXRlbXM9IltbX3N1Y2Nlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaGFzRGlzcGxheWFibGVOb2RlU3RhdHN9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIG5vZGUtc3RhdHMiPgogICAgICAgICAgICAgIE5vZGUgU3RhdHMKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy50b3RhbEJ5dGVzfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPk1lbW9yeTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXNdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2dldFRvdGFsTWljcm9zKF9ub2RlU3RhdHMpfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPkNvbXB1dGUgVGltZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWVdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy5vdXRwdXRTaXplfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPlRlbnNvciBPdXRwdXQgU2l6ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW1dXSA8YnI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJmdW5jdGlvblVzYWdlc0xpc3QiIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9ImZ1bmN0aW9uVXNhZ2VzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1pbmZvIixwcm9wZXJ0aWVzOntub2RlTmFtZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LHJlbmRlckhpZXJhcmNoeTpPYmplY3QsY29sb3JCeTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9ub2RlOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGUobm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX25vZGVTdGF0czp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHMobm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKF9ub2RlU3RhdHMpIn0sX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlcyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZShfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKF9ub2RlU3RhdHMpIn0sbm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQifSxfYXR0cmlidXRlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEF0dHJpYnV0ZXMoX25vZGUpIn0sX2RldmljZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXREZXZpY2UoX25vZGUpIn0sX3N1Y2Nlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0U3VjY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sCl9wcmVkZWNlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0UHJlZGVjZXNzb3JzKF9ub2RlLCBncmFwaEhpZXJhcmNoeSkifSxfZnVuY3Rpb25Vc2FnZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRGdW5jdGlvblVzYWdlcyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX3N1Ym5vZGVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0U3Vibm9kZXMoX25vZGUpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF90b3RhbFByZWRlY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFByZWQoX3ByZWRlY2Vzc29ycykifSxfdG90YWxTdWNjZXNzb3JzOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2dldFRvdGFsU3VjYyhfc3VjY2Vzc29ycykifSxfb3BlbmVkQ29udHJvbFByZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX29wZW5lZENvbnRyb2xTdWNjOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hdXhCdXR0b25UZXh0OlN0cmluZyxfZ3JvdXBCdXR0b25UZXh0OlN0cmluZ30sCmV4cGFuZE5vZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIl9ub2RlLmV4cGFuZCIsdGhpcy5ub2RlKX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihhLGMpe3JldHVybiBjLm5vZGUoYSl9LF9nZXROb2RlU3RhdHM6ZnVuY3Rpb24oYSxjKXtyZXR1cm4oYT10aGlzLl9nZXROb2RlKGEsYykpP2Euc3RhdHM6bnVsbH0sX2dldFRvdGFsTWljcm9zOmZ1bmN0aW9uKGEpe3JldHVybiBhP2EuZ2V0VG90YWxNaWNyb3MoKTowfSxfZ2V0SGFzRGlzcGxheWFibGVOb2RlU3RhdHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRmLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoYSl9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlczpmdW5jdGlvbihhKXtpZihhJiZhLnRvdGFsQnl0ZXMpcmV0dXJuIHRmLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKGEudG90YWxCeXRlcyx0Zi5ncmFwaC51dGlsLk1FTU9SWV9VTklUUyl9LApfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6ZnVuY3Rpb24oYSl7aWYoYSYmYS5nZXRUb3RhbE1pY3JvcygpKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShhLmdldFRvdGFsTWljcm9zKCksdGYuZ3JhcGgudXRpbC5USU1FX1VOSVRTKX0sX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzOmZ1bmN0aW9uKGEpe2lmKGEmJmEub3V0cHV0U2l6ZSYmYS5vdXRwdXRTaXplLmxlbmd0aClyZXR1cm4gXy5tYXAoYS5vdXRwdXRTaXplLGZ1bmN0aW9uKGMpe3JldHVybiAwPT09Yy5sZW5ndGg/InNjYWxhciI6IlsiK2Muam9pbigiLCAiKSsiXSJ9KX0sX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4oYXx8IiIpLnJlcGxhY2UoL1wvL2csIlx4M2N3YnJceDNlLyIpfSxfZ2V0UmVuZGVySW5mbzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGEpfSwKX2dldEF0dHJpYnV0ZXM6ZnVuY3Rpb24oYSl7dGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2F0dHJpYnV0ZXNMaXN0IikpO2lmKCFhfHwhYS5hdHRyKXJldHVybltdO3ZhciBjPVtdO18uZWFjaChhLmF0dHIsZnVuY3Rpb24oZCl7ZC5rZXk9PT10Zi5ncmFwaC5MQVJHRV9BVFRSU19LRVk/Yz1jLmNvbmNhdChkLnZhbHVlLmxpc3Qucy5tYXAoZnVuY3Rpb24oZil7cmV0dXJue2tleTpmLHZhbHVlOiJUb28gbGFyZ2UgdG8gc2hvdy4uLiJ9fSkpOmMucHVzaCh7a2V5OmQua2V5LHZhbHVlOkpTT04uc3RyaW5naWZ5KGQudmFsdWUpfSl9KTtyZXR1cm4gY30sX2dldERldmljZTpmdW5jdGlvbihhKXtyZXR1cm4gYT9hLmRldmljZTpudWxsfSxfZ2V0U3VjY2Vzc29ycyhhLGMpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImlucHV0c0xpc3QiKTtyZXR1cm4gYT90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChjLmdldFN1Y2Nlc3NvcnMoYS5uYW1lKSwKITEsYS5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRQcmVkZWNlc3NvcnMoYSxjKXt0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJvdXRwdXRzTGlzdCIpO3JldHVybiBhP3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGMuZ2V0UHJlZGVjZXNzb3JzKGEubmFtZSksITAsYS5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRGdW5jdGlvblVzYWdlcyhhLGMpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImZ1bmN0aW9uVXNhZ2VzTGlzdCIpO3JldHVybiBhJiZhLnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBPyhhPWMubGlicmFyeUZ1bmN0aW9uc1thLmFzc29jaWF0ZWRGdW5jdGlvbl0pP2EudXNhZ2VzOltdOltdfSxfcmVmcmVzaE5vZGVJdGVtTGlzdChhKXt0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLGAjJHthfWApKX0sX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0OmZ1bmN0aW9uKGEsCmMsZCl7dmFyIGY9bD0+Xy5tYXAobC5iYXNlRWRnZUxpc3Qsaz0+e3ZhciBtPWM/ay52OmsudztyZXR1cm57bmFtZTptLG5vZGU6dGhpcy5fZ2V0Tm9kZShtLHRoaXMuZ3JhcGhIaWVyYXJjaHkpLGVkZ2VMYWJlbDp0Zi5ncmFwaC5zY2VuZS5lZGdlLmdldExhYmVsRm9yQmFzZUVkZ2Uoayx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKG0sdGhpcy5yZW5kZXJIaWVyYXJjaHkpfX0pLGc9ZnVuY3Rpb24obCl7dmFyIGs9W107Xy5lYWNoKGwsbT0+e3ZhciBwPWM/bS52Om0udztkJiYxIT1tLmJhc2VFZGdlTGlzdC5sZW5ndGg/ay5wdXNoKHtuYW1lOnAsbm9kZTp0aGlzLl9nZXROb2RlKHAsdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnRmLmdyYXBoLnNjZW5lLmVkZ2UuZ2V0TGFiZWxGb3JFZGdlKG0sdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhwLHRoaXMucmVuZGVySGllcmFyY2h5KX0pOgprPWsuY29uY2F0KGYobSkpfSk7cmV0dXJuIGt9LmJpbmQodGhpcyk7cmV0dXJue3JlZ3VsYXI6ZyhhLnJlZ3VsYXIpLGNvbnRyb2w6ZyhhLmNvbnRyb2wpfX0sX2dldFN1Ym5vZGVzOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLm1ldGFncmFwaD9hLm1ldGFncmFwaC5ub2RlcygpOm51bGx9LF9nZXRUb3RhbFByZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVndWxhci5sZW5ndGgrYS5jb250cm9sLmxlbmd0aH0sX2dldFRvdGFsU3VjYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZWd1bGFyLmxlbmd0aCthLmNvbnRyb2wubGVuZ3RofSxfdG9nZ2xlQ29udHJvbFByZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hdGhpcy5fb3BlbmVkQ29udHJvbFByZWR9LF90b2dnbGVDb250cm9sU3VjYzpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPSF0aGlzLl9vcGVuZWRDb250cm9sU3VjY30sX3RvZ2dsZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fZXhwYW5kZWQ9CiF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzZXRTdGF0ZTpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPXRoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExO3RoaXMuc2V0KCJfZ3JvdXBCdXR0b25UZXh0Iix0Zi5ncmFwaC5zY2VuZS5ub2RlLmdldEdyb3VwU2V0dGluZ0xhYmVsKHRoaXMuX25vZGUpKTt0aGlzLl9ub2RlJiYoUG9seW1lci5kb20odGhpcy4kLm5vZGV0aXRsZSkuaW5uZXJIVE1MPXRoaXMuX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZSh0aGlzLl9ub2RlLm5hbWUpKX0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYSl7KGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhKSkmJmEuZmlyZSgiaXJvbi1yZXNpemUiKX0sX3RvZ2dsZUluY2x1ZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLWluY2x1c2lvbiIse25hbWU6dGhpcy5ub2RlTmFtZX0pfSwKX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuc2V0KCJfYXV4QnV0dG9uVGV4dCIsdGYuZ3JhcGguZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoYSkpfSxfdG9nZ2xlR3JvdXA6ZnVuY3Rpb24oKXt2YXIgYT10Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFNlcmllc05hbWUodGhpcy5fbm9kZSk7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCIse25hbWU6YX0pfSxfaXNMaWJyYXJ5RnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEubmFtZS5zdGFydHNXaXRoKHRmLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfSxfaXNJblNlcmllczpmdW5jdGlvbihhKXtyZXR1cm4gdGYuZ3JhcGguc2NlbmUubm9kZS5jYW5CZUluU2VyaWVzKGEpfX0pfSkoKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1heC1oZWlnaHQ6IDY1MHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e3NlbGVjdGVkTm9kZX19Ij4KICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9ImNhcmQiPgogICAgICAgIDx0Zi1ub2RlLWluZm8gZ3JhcGgtaGllcmFyY2h5PSJbW2dyYXBoSGllcmFyY2h5XV0iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGZsYXQtZ3JhcGg9IltbZ3JhcGhdXSIgbm9kZS1uYW1lPSJbW3NlbGVjdGVkTm9kZV1dIiBub2RlLWluY2x1ZGU9Iltbc2VsZWN0ZWROb2RlSW5jbHVkZV1dIiBoaWdobGlnaHRlZC1ub2RlPSJ7e2hpZ2hsaWdodGVkTm9kZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iPgogICAgICAgIDwvdGYtbm9kZS1pbmZvPgogICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgIDx0Zi1ncmFwaC1vcC1jb21wYXQtY2FyZCBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgaGllcmFyY2h5LXBhcmFtcz0iW1toaWVyYXJjaHlQYXJhbXNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBub2RlLXRpdGxlPSJbW2NvbXBhdE5vZGVUaXRsZV1dIj4KICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtY2FyZD4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hlYWx0aFBpbGxzQXZhaWxhYmxlKGRlYnVnZ2VyRGF0YUVuYWJsZWQsIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpXV0iPgogICAgICA8dGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIiBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+CiAgICAgIDwvdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1pbmZvL3RmLWdyYXBoLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtaW5mbyIscHJvcGVydGllczp7dGl0bGU6U3RyaW5nLGdyYXBoSGllcmFyY2h5Ok9iamVjdCxncmFwaDpPYmplY3QscmVuZGVySGllcmFyY2h5Ok9iamVjdCxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITB9LGNvbG9yQnk6U3RyaW5nLGNvbXBhdE5vZGVUaXRsZTpTdHJpbmcsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LGRlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbn0sbGlzdGVuZXJzOnsibm9kZS1saXN0LWl0ZW0tY2xpY2siOiJfbm9kZUxpc3RJdGVtQ2xpY2tlZCIsIm5vZGUtbGlzdC1pdGVtLW1vdXNlb3ZlciI6Il9ub2RlTGlzdEl0ZW1Nb3VzZW92ZXIiLCJub2RlLWxpc3QtaXRlbS1tb3VzZW91dCI6Il9ub2RlTGlzdEl0ZW1Nb3VzZW91dCJ9LApfbm9kZUxpc3RJdGVtQ2xpY2tlZDpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdGVkTm9kZT1hLmRldGFpbC5ub2RlTmFtZX0sX25vZGVMaXN0SXRlbU1vdXNlb3ZlcjpmdW5jdGlvbihhKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1hLmRldGFpbC5ub2RlTmFtZX0sX25vZGVMaXN0SXRlbU1vdXNlb3V0OmZ1bmN0aW9uKCl7dGhpcy5oaWdobGlnaHRlZE5vZGU9bnVsbH0sX2hlYWx0aFBpbGxzQXZhaWxhYmxlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEmJmMmJjA8T2JqZWN0LmtleXMoYykubGVuZ3RofSxfZXF1YWxzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE9PT1jfX0pfSkoKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1ib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6Omhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAvZGVlcC8gLmNsb3NlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGxlZnQ6IDE1cHg7CiAgICAgICAgYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nIHsKICAgICAgICBjdXJzb3I6IHByb2dyZXNzOwogICAgICAgIG9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nLmVycm9yIHsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgIH0KCiAgICAgICNpbmZvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDVweDsKICAgICAgICB0b3A6IDVweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzODBweDsKICAgICAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgfQoKICAgICAgI21haW4gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNDBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLW1zZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IDZweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogI2YzOTEzZTsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgewogICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgICBwYWRkaW5nOiA0cHggMTZweDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc05vdENvbXBsZXRlKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIj4KICAgICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1tc2ciPltbcHJvZ3Jlc3MubXNnXV08L2Rpdj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgdmFsdWU9IltbcHJvZ3Jlc3MudmFsdWVdXSI+PC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBjbGFzcyQ9IltbX2dldENvbnRhaW5lckNsYXNzKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0ibWFpbiI+CiAgICAgICAgPHRmLWdyYXBoIGlkPSJncmFwaCIgZ3JhcGgtaGllcmFyY2h5PSJ7e2dyYXBoSGllcmFyY2h5fX0iIGJhc2ljLWdyYXBoPSJbW2dyYXBoXV0iIGhpZXJhcmNoeS1wYXJhbXM9IltbaGllcmFyY2h5UGFyYW1zXV0iIHJlbmRlci1oaWVyYXJjaHk9Int7cmVuZGVySGllcmFyY2h5fX0iIGRldmljZXMtZm9yLXN0YXRzPSJbW2RldmljZXNGb3JTdGF0c11dIiBzdGF0cz0iW1tzdGF0c11dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBoaWdobGlnaHRlZC1ub2RlPSJ7e19oaWdobGlnaHRlZE5vZGV9fSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7Y29sb3JCeVBhcmFtc319IiBwcm9ncmVzcz0ie3twcm9ncmVzc319IiBlZGdlLWxhYmVsLWZ1bmN0aW9uPSJbW2VkZ2VMYWJlbEZ1bmN0aW9uXV0iIGVkZ2Utd2lkdGgtZnVuY3Rpb249IltbZWRnZVdpZHRoRnVuY3Rpb25dXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgaGFuZGxlLW5vZGUtc2VsZWN0ZWQ9IltbaGFuZGxlTm9kZVNlbGVjdGVkXV0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImluZm8iPgogICAgICAgIDx0Zi1ncmFwaC1pbmZvIGlkPSJncmFwaC1pbmZvIiB0aXRsZT0ic2VsZWN0ZWQiIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBncmFwaD0iW1tncmFwaF1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1ub2RlLWluY2x1ZGU9Int7X3NlbGVjdGVkTm9kZUluY2x1ZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tkZWJ1Z2dlck51bWVyaWNBbGVydHNdXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IiBjb21wYXQtbm9kZS10aXRsZT0iW1tjb21wYXROb2RlVGl0bGVdXSIgb24tbm9kZS10b2dnbGUtaW5jbHVzaW9uPSJfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZCIgb24tbm9kZS10b2dnbGUtc2VyaWVzZ3JvdXA9Il9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQiPjwvdGYtZ3JhcGgtaW5mbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtYm9hcmQvdGYtZ3JhcGgtYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtYm9hcmQiLHByb3BlcnRpZXM6e2dyYXBoSGllcmFyY2h5Ok9iamVjdCxncmFwaDpPYmplY3Qsc3RhdHM6T2JqZWN0LHByb2dyZXNzOk9iamVjdCx0cmFjZUlucHV0czpCb29sZWFuLGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0scmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdCxub3RpZnk6ITB9LGRlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbixhcmVIZWFsdGhQaWxsc0xvYWRpbmc6Qm9vbGVhbixkZWJ1Z2dlck51bWVyaWNBbGVydHM6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxhbGxTdGVwc01vZGVFbmFibGVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6MH0saGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXIsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZywKbm90aWZ5OiEwfSxjb21wYXROb2RlVGl0bGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJUUFUgQ29tcGF0aWJpbGl0eSJ9LGVkZ2VXaWR0aEZ1bmN0aW9uOk9iamVjdCxfc2VsZWN0ZWROb2RlSW5jbHVkZTpOdW1iZXIsX2hpZ2hsaWdodGVkTm9kZTpTdHJpbmcsaGFuZGxlTm9kZVNlbGVjdGVkOk9iamVjdCxlZGdlTGFiZWxGdW5jdGlvbjpPYmplY3QsaGFuZGxlRWRnZVNlbGVjdGVkOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZU5vZGVJbmNsdWRlKHNlbGVjdGVkTm9kZSwgcmVuZGVySGllcmFyY2h5KSJdLGZpdDpmdW5jdGlvbigpe3RoaXMuJC5ncmFwaC5maXQoKX0sX2lzTm90Q29tcGxldGU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwMD5hLnZhbHVlfSxfZ2V0Q29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGM9ImNvbnRhaW5lciI7YS5lcnJvciYmKGMrPSIgZXJyb3IiKTt0aGlzLl9pc05vdENvbXBsZXRlKGEpJiYoYys9IiBsb2FkaW5nIik7cmV0dXJuIGN9LF9vbk5vZGVJbmNsdXNpb25Ub2dnbGVkKGEpe3RoaXMuJC5ncmFwaC5ub2RlVG9nZ2xlRXh0cmFjdChhLmRldGFpbC5uYW1lKX0sCl9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQoYSl7dGhpcy4kLmdyYXBoLm5vZGVUb2dnbGVTZXJpZXNHcm91cChhLmRldGFpbC5uYW1lKX0sX3VwZGF0ZU5vZGVJbmNsdWRlKCl7Y29uc3QgYT10aGlzLnJlbmRlckhpZXJhcmNoeT90aGlzLnJlbmRlckhpZXJhcmNoeS5nZXROb2RlQnlOYW1lKHRoaXMuc2VsZWN0ZWROb2RlKTpudWxsO3RoaXMuX3NlbGVjdGVkTm9kZUluY2x1ZGU9YT9hLmluY2x1ZGU6dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRH19KTsKPC9zY3JpcHQ+CgoKCgoKCgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLW1lbnUtYmVoYXZpb3IvaXJvbi1tZW51YmFyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uTWVudWJhckJlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6Im1lbnViYXIifSxrZXlCaW5kaW5nczp7bGVmdDoiX29uTGVmdEtleSIscmlnaHQ6Il9vblJpZ2h0S2V5In0sX29uVXBLZXk6ZnVuY3Rpb24oYSl7dGhpcy5mb2N1c2VkSXRlbS5jbGljaygpO2EuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRG93bktleTpmdW5jdGlvbihhKXt0aGlzLmZvY3VzZWRJdGVtLmNsaWNrKCk7YS5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxnZXQgX2lzUlRMKCl7cmV0dXJuInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb259LF9vbkxlZnRLZXk6ZnVuY3Rpb24oYSl7dGhpcy5faXNSVEw/dGhpcy5fZm9jdXNOZXh0KCk6dGhpcy5fZm9jdXNQcmV2aW91cygpO2EuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uUmlnaHRLZXk6ZnVuY3Rpb24oYSl7dGhpcy5faXNSVEw/CnRoaXMuX2ZvY3VzUHJldmlvdXMoKTp0aGlzLl9mb2N1c05leHQoKTthLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbktleWRvd246ZnVuY3Rpb24oYSl7dGhpcy5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXMoYSwidXAgZG93biBsZWZ0IHJpZ2h0IGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGEpfX07UG9seW1lci5Jcm9uTWVudWJhckJlaGF2aW9yPVtQb2x5bWVyLklyb25NZW51QmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudWJhckJlaGF2aW9ySW1wbF07Cjwvc2NyaXB0PgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1yYWRpby1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tc2l6ZSwgMTZweCk7CiAgICAgICAgLyogLTFweCBpcyBhIHNlbnRpbmVsIGZvciB0aGUgZGVmYXVsdCBhbmQgaXMgcmVwbGFjZSBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSwgLTFweCk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgICNyYWRpb0NvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLXJhZGlvLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgICNpbmtbY2hlY2tlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvLCAjb25SYWRpbyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yOHM7CiAgICAgIH0KCiAgICAgICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbCB7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXSkgI3JhZGlvTGFiZWwgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbDpkaXIocnRsKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZywgMTBweCk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgLyogc2xpZ2h0bHkgZGFya2VyIHRoYW4gdGhlIGJ1dHRvbiwgc28gdGhhdCBpdCdzIHJlYWRhYmxlICovCiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJyYWRpb0NvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9Im9mZlJhZGlvIj48L2Rpdj4KICAgICAgPGRpdiBpZD0ib25SYWRpbyI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJyYWRpb0xhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLXJhZGlvLWJ1dHRvbi9wYXBlci1yYWRpby1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItcmFkaW8tYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToicmFkaW8iLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnJhZGlvQ29udGFpbmVyfSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiKS50cmltKCkpe3ZhciBhPXBhcnNlRmxvYXQodGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSIpLnRyaW0oKSksCmM9TWF0aC5mbG9vcigzKmEpO2MlMiE9PWElMiYmYysrO3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiOmMrInB4In0pfX0pfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWdyb3VwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgcGFkZGluZzogdmFyKC0tcGFwZXItcmFkaW8tZ3JvdXAtaXRlbS1wYWRkaW5nLCAxMnB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLXJhZGlvLWdyb3VwL3BhcGVyLXJhZGlvLWdyb3VwLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWdyb3VwIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvZ3JvdXAifSxwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJuYW1lIn0sc2VsZWN0ZWRBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJjaGVja2VkIn0sc2VsZWN0YWJsZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBhcGVyLXJhZGlvLWJ1dHRvbiJ9LGFsbG93RW1wdHlTZWxlY3Rpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LHNlbGVjdDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl92YWx1ZVRvSXRlbShhKTtpZighY3x8IWMuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXtpZih0aGlzLnNlbGVjdGVkKXtjPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2lmKHRoaXMuc2VsZWN0ZWQ9PWEpaWYodGhpcy5hbGxvd0VtcHR5U2VsZWN0aW9uKWE9IiI7ZWxzZXtjJiYKKGMuY2hlY2tlZD0hMCk7cmV0dXJufWMmJihjLmNoZWNrZWQ9ITEpfVBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5zZWxlY3QuYXBwbHkodGhpcyxbYV0pO3RoaXMuZmlyZSgicGFwZXItcmFkaW8tZ3JvdXAtY2hhbmdlZCIpfX0sX2FjdGl2YXRlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9pdGVtQWN0aXZhdGUodGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuZm9jdXNlZEl0ZW0pLHRoaXMuZm9jdXNlZEl0ZW0pfSxfb25VcEtleTpmdW5jdGlvbihhKXt0aGlzLl9mb2N1c1ByZXZpb3VzKCk7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uRG93bktleTpmdW5jdGlvbihhKXt0aGlzLl9mb2N1c05leHQoKTthLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfSxfb25MZWZ0S2V5OmZ1bmN0aW9uKGEpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uTGVmdEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CnRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uUmlnaHRLZXk6ZnVuY3Rpb24oYSl7UG9seW1lci5Jcm9uTWVudWJhckJlaGF2aW9ySW1wbC5fb25SaWdodEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfX0pOwo8L3NjcmlwdD4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b29sdGlwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICB6LWluZGV4OiAxMDAyOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAjdG9vbHRpcCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b29sdGlwLWJhY2tncm91bmQsICM2MTYxNjEpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b29sdGlwLXRleHQtY29sb3IsIHdoaXRlKTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXA7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTY2FsZVVwIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMCk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNjYWxlRG93biB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjApOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVGYWRlSW5PcGFjaXR5IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVGYWRlT3V0T3BhY2l0eSB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2xpZGVEb3duSW4gewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNsaWRlRG93bk91dCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgICAxMCUgewogICAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICAuZmFkZS1pbi1hbmltYXRpb24gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lRmFkZUluT3BhY2l0eTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5mYWRlLW91dC1hbmltYXRpb24gewogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZUZhZGVPdXRPcGFjaXR5OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zY2FsZS11cC1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNjYWxlVXA7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2NhbGUtZG93bi1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTY2FsZURvd247CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNsaWRlLWRvd24tYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2xpZGVEb3duSW47CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wLCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2xpZGUtZG93bi1hbmltYXRpb24tb3V0IHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTbGlkZURvd25PdXQ7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLmNhbmNlbC1hbmltYXRpb24gewogICAgICAgIGFuaW1hdGlvbi1kZWxheTogLTMwcyAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAvKiBUaGFua3MgSUUgMTAuICovCgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9vbHRpcCIgY2xhc3M9ImhpZGRlbiI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9wYXBlci10b29sdGlwL3BhcGVyLXRvb2x0aXAuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9vbHRpcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2x0aXAiLHRhYmluZGV4Oi0xfSxwcm9wZXJ0aWVzOntmb3I6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfZmluZFRhcmdldCJ9LG1hbnVhbE1vZGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX21hbnVhbE1vZGVDaGFuZ2VkIn0scG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiJib3R0b20ifSxmaXRUb1Zpc2libGVCb3VuZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sb2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZToxNH0sbWFyZ2luVG9wOnt0eXBlOk51bWJlcix2YWx1ZToxNH0sYW5pbWF0aW9uRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxvYnNlcnZlcjoiX2RlbGF5Q2hhbmdlIn0sYW5pbWF0aW9uRW50cnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25FeGl0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sYW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZW50cnk6W3tuYW1lOiJmYWRlLWluLWFuaW1hdGlvbiIsbm9kZTp0aGlzLHRpbWluZzp7ZGVsYXk6MH19XSxleGl0Olt7bmFtZToiZmFkZS1vdXQtYW5pbWF0aW9uIixub2RlOnRoaXN9XX19fSxfc2hvd2luZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sbGlzdGVuZXJzOnt3ZWJraXRBbmltYXRpb25FbmQ6Il9vbkFuaW1hdGlvbkVuZCJ9LGdldCB0YXJnZXQoKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlLGM9UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCk7cmV0dXJuIHRoaXMuZm9yP1BvbHltZXIuZG9tKGMpLnF1ZXJ5U2VsZWN0b3IoIiMiK3RoaXMuZm9yKTphLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/Yy5ob3N0OmF9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZmluZFRhcmdldCgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCl9LApwbGF5QW5pbWF0aW9uOmZ1bmN0aW9uKGEpeyJlbnRyeSI9PT1hP3RoaXMuc2hvdygpOiJleGl0Ij09PWEmJnRoaXMuaGlkZSgpfSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJjYW5jZWwtYW5pbWF0aW9uIil9LHNob3c6ZnVuY3Rpb24oKXtpZighdGhpcy5fc2hvd2luZyl7aWYoIiI9PT1Qb2x5bWVyLmRvbSh0aGlzKS50ZXh0Q29udGVudC50cmltKCkpe2Zvcih2YXIgYT0hMCxjPVBvbHltZXIuZG9tKHRoaXMpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKSxkPTA7ZDxjLmxlbmd0aDtkKyspaWYoIiIhPT1jW2RdLnRleHRDb250ZW50LnRyaW0oKSl7YT0hMTticmVha31pZihhKXJldHVybn10aGlzLl9zaG93aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSk7CnRoaXMudXBkYXRlUG9zaXRpb24oKTt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSl9fSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5fc2hvd2luZyYmKHRoaXMuX2FuaW1hdGlvblBsYXlpbmc/KHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fY2FuY2VsQW5pbWF0aW9uKCkpOih0aGlzLl9vbkFuaW1hdGlvbkZpbmlzaCgpLHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMCkpfSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX3RhcmdldCYmdGhpcy5vZmZzZXRQYXJlbnQpe3ZhciBhPXRoaXMub2Zmc2V0OzE0IT10aGlzLm1hcmdpblRvcCYmMTQ9PXRoaXMub2Zmc2V0JiYoYT10aGlzLm1hcmdpblRvcCk7dmFyIGM9dGhpcy5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD10aGlzLl90YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCmY9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxnPShkLndpZHRoLWYud2lkdGgpLzIsbD0oZC5oZWlnaHQtZi5oZWlnaHQpLzIsaz1kLmxlZnQtYy5sZWZ0LG09ZC50b3AtYy50b3A7c3dpdGNoKHRoaXMucG9zaXRpb24pe2Nhc2UgInRvcCI6dmFyIHA9aytnO3ZhciBxPW0tZi5oZWlnaHQtYTticmVhaztjYXNlICJib3R0b20iOnA9aytnO3E9bStkLmhlaWdodCthO2JyZWFrO2Nhc2UgImxlZnQiOnA9ay1mLndpZHRoLWE7cT1tK2w7YnJlYWs7Y2FzZSAicmlnaHQiOnA9aytkLndpZHRoK2EscT1tK2x9dGhpcy5maXRUb1Zpc2libGVCb3VuZHM/KGMubGVmdCtwK2Yud2lkdGg+d2luZG93LmlubmVyV2lkdGg/KHRoaXMuc3R5bGUucmlnaHQ9IjBweCIsdGhpcy5zdHlsZS5sZWZ0PSJhdXRvIik6KHRoaXMuc3R5bGUubGVmdD1NYXRoLm1heCgwLHApKyJweCIsdGhpcy5zdHlsZS5yaWdodD0iYXV0byIpLGMudG9wK3ErZi5oZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0Pyh0aGlzLnN0eWxlLmJvdHRvbT0KYy5oZWlnaHQrInB4Iix0aGlzLnN0eWxlLnRvcD0iYXV0byIpOih0aGlzLnN0eWxlLnRvcD1NYXRoLm1heCgtYy50b3AscSkrInB4Iix0aGlzLnN0eWxlLmJvdHRvbT0iYXV0byIpKToodGhpcy5zdHlsZS5sZWZ0PXArInB4Iix0aGlzLnN0eWxlLnRvcD1xKyJweCIpfX0sX2FkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKTt0aGlzLmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfSwKX2ZpbmRUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO3RoaXMuX3RhcmdldD10aGlzLnRhcmdldDt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX2FkZExpc3RlbmVycygpfSxfZGVsYXlDaGFuZ2U6ZnVuY3Rpb24oYSl7NTAwIT09YSYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4iOmErIm1zIn0pfSxfbWFudWFsTW9kZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGU/dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk6dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9jYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIik7CnRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfSxfb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIiksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMTt0aGlzLl9zaG93aW5nfHwodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpKX0sX2dldEFuaW1hdGlvblR5cGU6ZnVuY3Rpb24oYSl7aWYoImVudHJ5Ij09PWEmJiIiIT09dGhpcy5hbmltYXRpb25FbnRyeSlyZXR1cm4gdGhpcy5hbmltYXRpb25FbnRyeTsKaWYoImV4aXQiPT09YSYmIiIhPT10aGlzLmFuaW1hdGlvbkV4aXQpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRXhpdDtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1thXSYmInN0cmluZyI9PT10eXBlb2YgdGhpcy5hbmltYXRpb25Db25maWdbYV1bMF0ubmFtZSl7aWYodGhpcy5hbmltYXRpb25Db25maWdbYV1bMF0udGltaW5nJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZ1thXVswXS50aW1pbmcuZGVsYXkmJjAhPT10aGlzLmFuaW1hdGlvbkNvbmZpZ1thXVswXS50aW1pbmcuZGVsYXkpe3ZhciBjPXRoaXMuYW5pbWF0aW9uQ29uZmlnW2FdWzBdLnRpbWluZy5kZWxheTsiZW50cnkiPT09YT90aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6YysibXMifSk6ImV4aXQiPT09YSYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0IjpjKyJtcyJ9KX1yZXR1cm4gdGhpcy5hbmltYXRpb25Db25maWdbYV1bMF0ubmFtZX19LF9yZW1vdmVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl90YXJnZXQmJgoodGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlZW50ZXIiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJibHVyIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMudW5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMudW5saXN0ZW4odGhpcywibW91c2VlbnRlciIsImhpZGUiKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0ic2VhcmNoLWNvbnRhaW5lciI+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0icnVucy1yZWdleCIgbGFiZWw9IlNlYXJjaCBub2Rlcy4gUmVnZXhlcyBzdXBwb3J0ZWQuIiB2YWx1ZT0ie3tfcmF3UmVnZXhJbnB1dH19Ij4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPGRpdiBpZD0ic2VhcmNoLXJlc3VsdHMtYW5jaG9yIj4KICAgICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cyI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19yZWdleE1hdGNoZXNdXSI+CiAgICAgICAgICAgIDxkaXYgaWQ9InNlYXJjaC1tYXRjaCIgb24tY2xpY2s9Il9tYXRjaENsaWNrZWQiPltbaXRlbV1dPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAjc2VhcmNoLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgICNydW5zLXJlZ2V4IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NlYXJjaC1yZXN1bHRzLWFuY2hvciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMgewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgI3NlYXJjaC1tYXRjaCB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpcmVjdGlvbjogcnRsOwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utd2Vhayk7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWdyYXBoLW5vZGUtc2VhcmNoL3RmLWdyYXBoLW5vZGUtc2VhcmNoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLW5vZGUtc2VhcmNoIixwcm9wZXJ0aWVzOntyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfcmF3UmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9yZWdleElucHV0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSZWdleElucHV0KHJlbmRlckhpZXJhcmNoeSwgX3Jhd1JlZ2V4SW5wdXQpIn0sX3ByZXZpb3VzUmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9zZWFyY2hUaW1lb3V0RGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjE1MCxyZWFkT25seTohMH0sX3NlYXJjaFBlbmRpbmc6Qm9vbGVhbixfbWF4UmVnZXhSZXN1bHRzOnt0eXBlOk51bWJlcix2YWx1ZTo0Mn0sX3JlZ2V4TWF0Y2hlczpBcnJheX0sb2JzZXJ2ZXJzOlsiX3JlZ2V4SW5wdXRDaGFuZ2VkKF9yZWdleElucHV0KSJdLF9jb21wdXRlUmVnZXhJbnB1dChhLGMpe3JldHVybiBjLnRyaW0oKX0sCl9yZWdleElucHV0Q2hhbmdlZCgpe3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sX2NsZWFyU2VhcmNoUmVzdWx0cygpe3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixbXSl9LF9yZXF1ZXN0U2VhcmNoKCl7dGhpcy5fc2VhcmNoUGVuZGluZ3x8KHRoaXMuX3JlZ2V4SW5wdXQ9PT10aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ/dGhpcy5fc2VhcmNoUGVuZGluZz0hMToodGhpcy5fc2VhcmNoUGVuZGluZz0hMCx0aGlzLl9leGVjdXRlU2VhcmNoKCksdGhpcy5hc3luYygoKT0+e3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE7dGhpcy5fcmVxdWVzdFNlYXJjaCgpfSx0aGlzLl9zZWFyY2hUaW1lb3V0RGVsYXkpKSl9LF9leGVjdXRlU2VhcmNoKCl7aWYodGhpcy5fcHJldmlvdXNSZWdleElucHV0PXRoaXMuX3JlZ2V4SW5wdXQpe3RyeXt2YXIgYT1uZXcgUmVnRXhwKHRoaXMuX3JlZ2V4SW5wdXQpfWNhdGNoKGQpe3RoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpO3JldHVybn12YXIgYz1bXTtfLmVhY2godGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5LmdldE5vZGVNYXAoKSwKKGQsZik9PntpZihjLmxlbmd0aD49dGhpcy5fbWF4UmVnZXhSZXN1bHRzKXJldHVybiExO2EudGVzdChmKSYmYy5wdXNoKGYpfSk7dGhpcy5zZXQoIl9yZWdleE1hdGNoZXMiLGMpfWVsc2UgdGhpcy5fY2xlYXJTZWFyY2hSZXN1bHRzKCl9LF9tYXRjaENsaWNrZWQoYSl7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYS5tb2RlbC5pdGVtKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDogewogICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgIH0KICAgICAgICAtLWlyb24taWNvbi13aWR0aDogMTVweDsKICAgICAgICAtLWlyb24taWNvbi1oZWlnaHQ6IDE1cHg7CiAgICAgICAgLS1wcmltYXJ5LXRleHQtY29sb3I6IGdyYXk7CiAgICAgICAgLS1wYXBlci1pdGVtLW1pbi1oZWlnaHQ6IDMwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbltyYWlzZWRdLmtleWJvYXJkLWZvY3VzIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CgogICAgICAucnVuLWRyb3Bkb3duIHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjogewogICAgICAgICAgcGFkZGluZzogOHB4IDAgOHB4IDEwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICAuY29sb3ItZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA5cHggMCAwIDEzcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICB0YWJsZSB7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgICBib3JkZXItc3BhY2luZzogMDsKICAgICAgfQoKICAgICAgdGFibGUgdGQgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgewogICAgICAgIHBhZGRpbmc6IDAgMjBweCAyMHB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubGVnZW5kLWhvbGRlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2U5ZTllOTsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjYzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICAgIHBhZGRpbmc6IDE1cHggMjBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1sZWdlbmQtYnV0dG9uIHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQogICAgICBzdmcuaWNvbiwKICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CiAgICAgIC5kb21haW5WYWx1ZXMgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDE2NXB4OwogICAgICB9CiAgICAgIC5kb21haW5TdGFydCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgLmRvbWFpbkVuZCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICAgIC5jb2xvckJveCB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5pbWFnZS1pY29uIHsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLWljb24gewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLmdyYXkgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAudGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBtYXJnaW46IDhweCA1cHggOHB4IDA7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICB9CiAgICAgIC50aXRsZSBzbWFsbCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgfQogICAgICAuZGV2aWNlTGlzdCwKICAgICAgLnhsYUNsdXN0ZXJMaXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAjZmlsZSB7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgIH0KCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGNsZWFyOiBib3RoOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgLmxhYmVsLAogICAgICAuY29sb3ItbGVnZW5kLXJvdyBzdmcsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHRmLWdyYXBoLWljb24gewogICAgICAgIGZsZXg6IDAgMCA0MHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMjBweDsKICAgICAgfQoKICAgICAgLmRldmljZXMtY2hlY2tib3ggaW5wdXQgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtaG9sZGVyIC5pY29uLWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbjogMCAtNXB4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi10ZXh0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KCiAgICAgIC51cGxvYWQtYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgICAgaGVpZ2h0OiAyNXB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1pY29uIHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICB9CgogICAgICAuaGlkZGVuLWlucHV0IHsKICAgICAgICBoZWlnaHQ6IDBweDsKICAgICAgICB3aWR0aDogMHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgewogICAgICAgIGNsZWFyOiBib3RoOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLmNvbnRyb2wtaG9sZGVyIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KCiAgICAgIHNwYW4uY291bnRlciB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiBncmF5OwogICAgICB9CgogICAgICAucnVucyBwYXBlci1pdGVtIHsKICAgICAgICAtLXBhcGVyLWl0ZW06IHsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgfQogICAgICB9CgogICAgICB0YWJsZS5jb250cm9sLWhvbGRlciB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KCiAgICAgIHRhYmxlLnRmLWdyYXBoLWNvbnRyb2xzIHRkLmlucHV0LWVsZW1lbnQtdGFibGUtZGF0YSB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLnNwYWNlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAuY29sb3ItdGV4dCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqIE92ZXJyaWRlIGlubGluZSBzdHlsZXMgdGhhdCBzdXBwcmVzcyBwb2ludGVyIGV2ZW50cyBmb3IgZGlzYWJsZWQgYnV0dG9ucy4gT3RoZXJ3aXNlLCB0aGUgKi8KICAgICAgLyogIHRvb2x0aXBzIGRvIG5vdCBhcHBlYXIuICovCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogaGVscDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtY2xhcmlmaWVyIHBhcGVyLXRvb2x0aXAgewogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgfQoKICAgICAgLyoqIE90aGVyd2lzZSwgcG9seW1lciBVSSBjb250cm9scyBhcHBlYXIgYXRvcCBub2RlIHNlYXJjaC4gKi8KICAgICAgdGYtZ3JhcGgtbm9kZS1zZWFyY2ggewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJhbGxjb250cm9scyI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8dGYtZ3JhcGgtbm9kZS1zZWFyY2ggc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSI+PC90Zi1ncmFwaC1ub2RlLXNlYXJjaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tdGFwPSJfZml0IiBhbHQ9IkZpdCB0byBzY3JlZW4iPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJhc3BlY3QtcmF0aW8iIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkZpdCB0byBTY3JlZW48L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0iaWNvbi1idXR0b24iIG9uLWNsaWNrPSJkb3dubG9hZCIgYWx0PSJEb3dubG9hZCBQTkciPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJmaWxlLWRvd25sb2FkIiBjbGFzcz0iYnV0dG9uLWljb24iPjwvaXJvbi1pY29uPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5Eb3dubG9hZCBQTkc8L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgPGEgaHJlZj0iIyIgaWQ9ImdyYXBoZG93bmxvYWQiIGNsYXNzPSJ0aXRsZSIgZG93bmxvYWQ9ImdyYXBoLnBuZyI+PC9hPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIgcnVucyI+CiAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgUnVuIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tkYXRhc2V0cy5sZW5ndGhdXSk8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgbm8tYW5pbWF0aW9ucyBub2luayBob3Jpem9udGFsLWFsaWduPSJsZWZ0IiBjbGFzcz0icnVuLWRyb3Bkb3duIj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRSdW5JbmRleH19IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tkYXRhc2V0c11dIj4KICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2l0ZW0ubmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93U2Vzc2lvblJ1bnNEcm9wZG93bl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICAgIFRhZwogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbX251bVRhZ3MoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4KV1dKTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgbm8tYW5pbWF0aW9ucyBob3Jpem9udGFsLWFsaWduPSJsZWZ0IiBub2luayBjbGFzcz0icnVuLWRyb3Bkb3duIj4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFRhZ0luZGV4fX0iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2dldFRhZ3MoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4KV1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5kaXNwbGF5TmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dVcGxvYWRCdXR0b25dXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPlVwbG9hZDwvZGl2PgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9InVwbG9hZC1idXR0b24iIG9uLWNsaWNrPSJfZ2V0RmlsZSIgdGl0bGU9IlVwbG9hZCBhIGdyYXBoIHBidHh0IGZpbGUgdG8gdmlldyB0aGUgZ3JhcGgiPgogICAgICAgICAgICBDaG9vc2UgRmlsZQogICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoaWRkZW4taW5wdXQiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImZpbGUiIG5hbWU9ImZpbGUiIG9uLWNoYW5nZT0iX3VwZGF0ZUZpbGVJbnB1dCIgYWNjZXB0PSIucGJ0eHQiPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkR3JhcGhUeXBlfX0iPgogICAgICAgICAgCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9Im9wX2dyYXBoIiBkaXNhYmxlZD0iW1tfZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPkdyYXBoPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImNvbmNlcHR1YWxfZ3JhcGgiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Db25jZXB0dWFsR3JhcGhEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5Db25jZXB0dWFsIEdyYXBoPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InByb2ZpbGUiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+UHJvZmlsZTwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7dHJhY2VJbnB1dHN9fSIgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVHJhY2UgaW5wdXRzCiAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e2hlYWx0aFBpbGxzVG9nZ2xlZE9ufX0iIGNsYXNzPSJ0aXRsZSI+U2hvdyBoZWFsdGggcGlsbHM8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+Q29sb3I8L2Rpdj4KICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7Y29sb3JCeX19Ij4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ic3RydWN0dXJlIj5TdHJ1Y3R1cmU8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImRldmljZSI+RGV2aWNlPC9wYXBlci1yYWRpby1idXR0b24+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ieGxhLWNsdXN0ZXItcmFkaW8tYnV0dG9uIiBuYW1lPSJ4bGFfY2x1c3RlciIgZGlzYWJsZWQ9IltbIV94bGFDbHVzdGVyc1Byb3ZpZGVkKHJlbmRlckhpZXJhcmNoeSldXSI+CiAgICAgICAgICAgIFhMQSBDbHVzdGVyCiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgWExBIGNsdXN0ZXIgaXMgb25seSBlbmFibGVkIGlmIGF0IGxlYXN0IDEgb3Agc3BlY2lmaWVzCiAgICAgICAgICAgIGFuIFhMQSBjbHVzdGVyLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImNvbXB1dGUtdGltZS1yYWRpby1idXR0b24iIG5hbWU9ImNvbXB1dGVfdGltZSIgZGlzYWJsZWQ9IltbIXN0YXRzXV0iPgogICAgICAgICAgICBDb21wdXRlIHRpbWUKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9ImNvbXB1dGUtdGltZS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgY29tcHV0ZSB0aW1lIGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJtZW1vcnktcmFkaW8tYnV0dG9uIiBuYW1lPSJtZW1vcnkiIGRpc2FibGVkPSJbWyFzdGF0c11dIj4KICAgICAgICAgICAgTWVtb3J5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJtZW1vcnktcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IG1lbW9yeSBpcyBvbmx5IGVuYWJsZWQgaWYgdGhlIFJ1bk1ldGFkYXRhIHByb3RvIGlzCiAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgRmlsZVdyaXRlciB3aGVuIGEgc3BlY2lmaWMgc2Vzc2lvbiBpcyBydW4uCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0idHB1LWNvbXBhdGliaWxpdHktcmFkaW8tYnV0dG9uIiBuYW1lPSJvcF9jb21wYXRpYmlsaXR5Ij4KICAgICAgICAgICAgVFBVIENvbXBhdGliaWxpdHkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InRwdS1jb21wYXRpYmlsaXR5LXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSB3aGV0aGVyIGFuIG9wZXJhdGlvbiBpcyBjb21wYXRpYmxlIGZvciB0aGUgVFBVIGRldmljZS4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgIDxzcGFuIGNsYXNzPSJzcGFjZXIiPjwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0dyYWRpZW50Q29sb3Jpbmcoc3RhdHMsIGNvbG9yQnkpXV0iPgogICAgICAgICAgPHN2ZyB3aWR0aD0iMTQwIiBoZWlnaHQ9IjIwIiBzdHlsZT0ibWFyZ2luOiAwIDVweCIgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICA8bGluZWFyZ3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50IiB4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIwJSI+CiAgICAgICAgICAgICAgICA8c3RvcCBjbGFzcz0ic3RhcnQiIG9mZnNldD0iMCUiIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuc3RhcnRDb2xvcl1dIiAvPgogICAgICAgICAgICAgICAgPHN0b3AgY2xhc3M9ImVuZCIgb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLmVuZENvbG9yXV0iIC8+CiAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTM1IiBoZWlnaHQ9IjIwIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50KSIgc3Ryb2tlPSJibGFjayIgLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluVmFsdWVzIGNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5TdGFydCI+W1tfY3VycmVudEdyYWRpZW50UGFyYW1zLm1pblZhbHVlXV08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluRW5kIj5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWF4VmFsdWVdXTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8YnIgc3R5bGU9ImNsZWFyOiBib3RoIj4KICAgICAgICAgIDxkaXY+RGV2aWNlcyBpbmNsdWRlZCBpbiBzdGF0czo8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRldmljZUxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50RGV2aWNlc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93IGRldmljZXMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgPHNwYW4+PGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZSQ9IltbaXRlbS5kZXZpY2VdXSIgY2hlY2tlZCQ9IltbaXRlbS51c2VkXV0iIG9uLWNsaWNrPSJfZGV2aWNlQ2hlY2tib3hDbGlja2VkIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8c3Bhbj5bW2l0ZW0uc3VmZml4XV08L3NwYW4+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXRlbS5pZ25vcmVkTXNnXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscCIgY2xhc3M9ImhlbHAtaWNvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiIGFuaW1hdGlvbi1kZWxheT0iMCI+W1tpdGVtLmlnbm9yZWRNc2ddXTwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdzdHJ1Y3R1cmUnKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwiPgogICAgICAgICAgICAgICAgY29sb3JzCiAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnNhbWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2VlZSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5pcXVlIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdkZXZpY2UnKV1dIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnREZXZpY2VQYXJhbXNdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSJbW2l0ZW0uY29sb3JdXSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0uZGV2aWNlXV08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNlZWUiIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVua25vd24gZGV2aWNlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3hsYV9jbHVzdGVyJyldXSI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50WGxhQ2x1c3RlclBhcmFtc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDxzdmc+CiAgICAgICAgICAgICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiN1bmZpbGxlZC1yZWN0IiB4PSIwIiB5PSIwIiBzdHlsZT0iZmlsbDpbW2l0ZW0uY29sb3JdXSIgLz4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+W1tpdGVtLnhsYV9jbHVzdGVyXV08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDxzdmc+CiAgICAgICAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjZ3JleS1yZWN0IiB4PSIwIiB5PSIwIiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVua25vd24gWExBIGNsdXN0ZXI8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnb3BfY29tcGF0aWJpbGl0eScpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjMGY5ZDU4IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5WYWxpZCBPcDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZGI0NDM3IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5JbnZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGF0c05vdE51bGwoc3RhdHMpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZhZGVkPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW51c2VkIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtaG9sZGVyIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUxlZ2VuZEljb24oX2xlZ2VuZE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVMZWdlbmRPcGVuIiBjbGFzcz0idG9nZ2xlLWxlZ2VuZC1idXR0b24iPgogICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0idG9nZ2xlLWxlZ2VuZC10ZXh0Ij4KICAgICAgICBbW19nZXRUb2dnbGVUZXh0KF9sZWdlbmRPcGVuZWQpXV0KICAgICAgPC9zcGFuPgogICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX2xlZ2VuZE9wZW5lZF1dIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9InRpdGxlIj5HcmFwaDwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgPHRkPigqID0gZXhwYW5kYWJsZSk8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2Q5ZDlkOSIgc3Ryb2tlLW92ZXJyaWRlPSIjY2NjIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBOYW1lc3BhY2U8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBFbmNhcHN1bGF0ZXMgYSBzZXQgb2Ygbm9kZXMuIE5hbWVzcGFjZSBpcyBoaWVyYXJjaGljYWwgYW5kCiAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gc2NvcGUuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJPUCIgaGVpZ2h0PSIxNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgT3BOb2RlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IHBlcmZvcm1zIGFuIG9wZXJhdGlvbi4gVGhlc2Ugbm9kZXMgY2Fubm90IGV4cGFuZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgVW5jb25uZWN0ZWQgc2VyaWVzPHNwYW4gY2xhc3M9ImdyYXkiPio8L3NwYW4+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugb2YgbnVtYmVyZWQgbm9kZXMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB0byBlYWNoCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTRVJJRVMiIGhlaWdodD0iMTYiIHZlcnRpY2FsPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iPgogICAgICAgICAgICAgICAgICA8Y2lyY2xlIGZpbGw9IndoaXRlIiBzdHJva2U9IiM4NDg0ODQiIGN4PSIxMCIgY3k9IjEwIiByPSI1IiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb25zdGFudAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIE5vZGUgdGhhdCBvdXRwdXRzIGEgY29uc3RhbnQgdmFsdWUuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTVU1NQVJZIiBoZWlnaHQ9IjIwIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBTdW1tYXJ5CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IGNvbGxlY3RzIGRhdGEgZm9yIHZpc3VhbGl6YXRpb24gd2l0aGluCiAgICAgICAgICAgICAgICAgICAgVGVuc29yQm9hcmQuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiBoZWlnaHQ9IjE1cHgiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNSAxNSI+CiAgICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICAgIDxtYXJrZXIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNiYmIiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCkiIHN0cm9rZT0iI2JiYiIgZD0iTTIgOSBsIDI5IDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgLz4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgRGF0YWZsb3cgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgZGF0YSBmbG93IGJldHdlZW4gb3BlcmF0aW9ucy4gRWRnZXMgZmxvdwogICAgICAgICAgICAgICAgICAgIHVwd2FyZHMgdW5sZXNzIGFycm93aGVhZHMgc3BlY2lmeSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiBoZWlnaHQ9IjE1cHgiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNSAxNSI+CiAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT0iI2JiYiIgZD0iTTIgOSBsIDI5IDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWRhc2hhcnJheT0iMiwgMiIgLz4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmN5IGVkZ2UKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhlIGNvbnRyb2wgZGVwZW5kZW5jeSBiZXR3ZWVuIG9wZXJhdGlvbnMuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiBoZWlnaHQ9IjE1cHgiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNSAxNSI+CiAgICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICAgIDxtYXJrZXIgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kIiBmaWxsPSIjRkZCNzREIiBtYXJrZXJ3aWR0aD0iMTAiIG1hcmtlcmhlaWdodD0iMTAiIHJlZng9IjkiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICAgICAgICAgICAgICA8L21hcmtlcj4KICAgICAgICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICAgICAgICA8cGF0aCBtYXJrZXItZW5kPSJ1cmwoI3JlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjRkZCNzREIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBSZWZlcmVuY2UgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGF0IHRoZSBvdXRnb2luZyBvcGVyYXRpb24gbm9kZSBjYW4gbXV0YXRlIHRoZQogICAgICAgICAgICAgICAgICAgIGluY29taW5nIHRlbnNvci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ncmFwaC1jb250cm9scy90Zi1ncmFwaC1jb250cm9scy5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtjb25zdCBmPS9kZXZpY2U6KFteOl0rOlswLTldKykkLyxnPVt7cmVnZXg6Zn1dLGw9W107bGV0IGs7KGZ1bmN0aW9uKHApe3AuQ09NUFVURV9USU1FPSJjb21wdXRlX3RpbWUiO3AuTUVNT1JZPSJtZW1vcnkiO3AuU1RSVUNUVVJFPSJzdHJ1Y3R1cmUiO3AuWExBX0NMVVNURVI9InhsYV9jbHVzdGVyIjtwLk9QX0NPTVBBVElCSUxJVFk9Im9wX2NvbXBhdGliaWxpdHkifSkoaz1kLkNvbG9yQnl8fChkLkNvbG9yQnk9e30pKTtjb25zdCBtPW5ldyBTZXQoW2suQ09NUFVURV9USU1FLGsuTUVNT1JZXSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntzdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0YXRzQ2hhbmdlZCJ9LGRldmljZXNGb3JTdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGNvbG9yQnk6e3R5cGU6U3RyaW5nLAp2YWx1ZTprLlNUUlVDVFVSRSxub3RpZnk6ITB9LGNvbG9yQnlQYXJhbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkb25seTohMH0sZGF0YXNldHM6e3R5cGU6QXJyYXksb2JzZXJ2ZXI6Il9kYXRhc2V0c0NoYW5nZWQiLHZhbHVlOigpPT5bXX0scmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdH0sc2VsZWN0aW9uOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlU2VsZWN0aW9uKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgsIF9zZWxlY3RlZEdyYXBoVHlwZSkifSxzZWxlY3RlZEZpbGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX3NlbGVjdGVkUnVuSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFJ1bkluZGV4Q2hhbmdlZCJ9LHRyYWNlSW5wdXRzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxfc2VsZWN0ZWRUYWdJbmRleDp7dHlwZTpOdW1iZXIsCnZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCJ9LF9zZWxlY3RlZEdyYXBoVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6YS5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2N1cnJlbnREZXZpY2VzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZXMoZGV2aWNlc0ZvclN0YXRzKSJ9LF9jdXJyZW50RGV2aWNlUGFyYW1zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZVBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50WGxhQ2x1c3RlclBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zKGNvbG9yQnlQYXJhbXMpIn0sX2N1cnJlbnRHcmFkaWVudFBhcmFtczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXRDdXJyZW50R3JhZGllbnRQYXJhbXMoY29sb3JCeVBhcmFtcywgY29sb3JCeSkifSwKc2hvd1Nlc3Npb25SdW5zRHJvcGRvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sc2hvd1VwbG9hZEJ1dHRvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxoZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkOkJvb2xlYW4saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9sZWdlbmRPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LF94bGFDbHVzdGVyc1Byb3ZpZGVkOmZ1bmN0aW9uKHApe3JldHVybiBwJiZwLmhpZXJhcmNoeSYmMDxwLmhpZXJhcmNoeS54bGFDbHVzdGVycy5sZW5ndGh9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24ocCl7aWYobnVsbCE9cCl7dmFyIHE9e307Xy5lYWNoKHAuZGV2X3N0YXRzLGZ1bmN0aW9uKHIpe3ZhciB0PV8uc29tZShnLGZ1bmN0aW9uKEEpe3JldHVybiBBLnJlZ2V4LnRlc3Qoci5kZXZpY2UpfSksdj1fLnNvbWUobCxmdW5jdGlvbihBKXtyZXR1cm4gQS5yZWdleC50ZXN0KHIuZGV2aWNlKX0pO3QmJiF2JiYocVtyLmRldmljZV09CiEwKX0pO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLHEpfX0sX2dldEN1cnJlbnREZXZpY2VzOmZ1bmN0aW9uKHApe3ZhciBxPXRoaXMuc3RhdHM7cT0ocT9xLmRldl9zdGF0czpbXSkubWFwKHQ9PnQuZGV2aWNlKS5maWx0ZXIodD0+Zy5zb21lKHY9PnYucmVnZXgudGVzdCh0KSkpO2NvbnN0IHI9YS5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChxKTtpZigxPT1yLmxlbmd0aCl7Y29uc3QgdD1yWzBdLm1hdGNoKGYpO3QmJihyWzBdPXRbMV0pfXJldHVybiBxLm1hcCgodCx2KT0+e2xldCBBPW51bGw7bC5mb3JFYWNoKHk9Pnt5LnJlZ2V4LnRlc3QodCkmJihBPXkubXNnKX0pO3JldHVybntkZXZpY2U6dCxzdWZmaXg6clt2XSx1c2VkOnBbdF0saWdub3JlZE1zZzpBfX0pfSxfZGV2aWNlQ2hlY2tib3hDbGlja2VkOmZ1bmN0aW9uKHApe3A9cC50YXJnZXQ7Y29uc3QgcT1PYmplY3QuYXNzaWduKHt9LHRoaXMuZGV2aWNlc0ZvclN0YXRzKSxyPXAudmFsdWU7cC5jaGVja2VkPwpxW3JdPSEwOmRlbGV0ZSBxW3JdO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLHEpfSxfbnVtVGFnczpmdW5jdGlvbihwLHEpe3JldHVybiB0aGlzLl9nZXRUYWdzKHAscSkubGVuZ3RofSxfZ2V0VGFnczpmdW5jdGlvbihwLHEpe3JldHVybiBwJiZwW3FdP3BbcV0udGFnczpbXX0sX2ZpdDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZml0LXRhcCIpfSxfaXNHcmFkaWVudENvbG9yaW5nOmZ1bmN0aW9uKHAscSl7cmV0dXJuIG0uaGFzKHEpJiZudWxsIT1wfSxfZXF1YWxzOmZ1bmN0aW9uKHAscSl7cmV0dXJuIHA9PT1xfSxfZ2V0Q3VycmVudERldmljZVBhcmFtczpmdW5jdGlvbihwKXtwPXAuZGV2aWNlLmZpbHRlcih0PT5nLnNvbWUodj0+di5yZWdleC50ZXN0KHQuZGV2aWNlKSkpO2NvbnN0IHE9YS5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChwLm1hcCh0PT50LmRldmljZSkpO2lmKDE9PXEubGVuZ3RoKXt2YXIgcj1xWzBdLm1hdGNoKGYpO3ImJihxWzBdPXJbMV0pfXJldHVybiBwLm1hcCgodCwKdik9Pih7ZGV2aWNlOnFbdl0sY29sb3I6dC5jb2xvcn0pKX0sX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zOmZ1bmN0aW9uKHApe3JldHVybiBwLnhsYV9jbHVzdGVyfSxfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zOmZ1bmN0aW9uKHAscSl7aWYodGhpcy5faXNHcmFkaWVudENvbG9yaW5nKHRoaXMuc3RhdHMscSkpe3A9cFtxXTt2YXIgcj1wLm1pblZhbHVlLHQ9cC5tYXhWYWx1ZTtxPT09ay5NRU1PUlk/KHI9YS5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShyLGEuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpLHQ9YS5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh0LGEuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpKTpxPT09ay5DT01QVVRFX1RJTUUmJihyPWEuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocixhLmdyYXBoLnV0aWwuVElNRV9VTklUUyksdD1hLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHQsCmEuZ3JhcGgudXRpbC5USU1FX1VOSVRTKSk7cmV0dXJue21pblZhbHVlOnIsbWF4VmFsdWU6dCxzdGFydENvbG9yOnAuc3RhcnRDb2xvcixlbmRDb2xvcjpwLmVuZENvbG9yfX19LGRvd25sb2FkOmZ1bmN0aW9uKCl7dGhpcy4kLmdyYXBoZG93bmxvYWQuY2xpY2soKX0sX3VwZGF0ZUZpbGVJbnB1dDpmdW5jdGlvbihwKXt2YXIgcT1wLnRhcmdldC5maWxlc1swXTtpZihxKXtxPXEubmFtZTt2YXIgcj1xLmxhc3RJbmRleE9mKCIuIik7MDw9ciYmKHE9cS5zdWJzdHJpbmcoMCxyKSk7cj1xLmxhc3RJbmRleE9mKCIvIik7MDw9ciYmKHE9cS5zdWJzdHJpbmcocisxKSk7dGhpcy5fc2V0RG93bmxvYWRGaWxlbmFtZShxKTt0aGlzLnNldCgic2VsZWN0ZWRGaWxlIixwKX19LF9kYXRhc2V0c0NoYW5nZWQ6ZnVuY3Rpb24ocCxxKXtudWxsIT1xJiYodGhpcy5fc2VsZWN0ZWRSdW5JbmRleD0wKX0sX2NvbXB1dGVTZWxlY3Rpb246ZnVuY3Rpb24ocCxxLHIsdCl7cmV0dXJuIHBbcV0mJnBbcV0udGFnc1tyXT8Ke3J1bjpwW3FdLm5hbWUsdGFnOnBbcV0udGFnc1tyXS50YWcsdHlwZTp0fTpudWxsfSxfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQ6ZnVuY3Rpb24ocCl7dGhpcy5kYXRhc2V0cyYmKHRoaXMuY29sb3JCeT1rLlNUUlVDVFVSRSx0aGlzLl9zZWxlY3RlZFRhZ0luZGV4PTAsdGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKSx0aGlzLnRyYWNlSW5wdXRzPSExLHRoaXMuX3NldERvd25sb2FkRmlsZW5hbWUodGhpcy5kYXRhc2V0c1twXT90aGlzLmRhdGFzZXRzW3BdLm5hbWU6IiIpKX0sX3NlbGVjdGVkVGFnSW5kZXhDaGFuZ2VkKCl7dGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKX0sX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl7Y29uc3Qge2RhdGFzZXRzOnAsX3NlbGVjdGVkUnVuSW5kZXg6cSxfc2VsZWN0ZWRUYWdJbmRleDpyfT10aGlzO3JldHVybiBwJiZwW3FdJiZwW3FdLnRhZ3Nbcl0mJgohcFtxXS50YWdzW3JdLm9wR3JhcGg/cFtxXS50YWdzW3JdLnByb2ZpbGU/YS5ncmFwaC5TZWxlY3Rpb25UeXBlLlBST0ZJTEU6cFtxXS50YWdzW3JdLmNvbmNlcHR1YWxHcmFwaD9hLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDphLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6YS5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSxfZ2V0RmlsZTpmdW5jdGlvbigpe3RoaXMuJCQoIiNmaWxlIikuY2xpY2soKX0sX3NldERvd25sb2FkRmlsZW5hbWU6ZnVuY3Rpb24ocCl7dGhpcy4kLmdyYXBoZG93bmxvYWQuc2V0QXR0cmlidXRlKCJkb3dubG9hZCIscCsiLnBuZyIpfSxfc3RhdHNOb3ROdWxsOmZ1bmN0aW9uKHApe3JldHVybiBudWxsIT09cH0sX3RvZ2dsZUxlZ2VuZE9wZW4oKXt0aGlzLnNldCgiX2xlZ2VuZE9wZW5lZCIsIXRoaXMuX2xlZ2VuZE9wZW5lZCl9LF9nZXRUb2dnbGVUZXh0KHApe3JldHVybiBwPyJDbG9zZSBsZWdlbmQuIjoiRXhwYW5kIGxlZ2VuZC4ifSwKX2dldFRvZ2dsZUxlZ2VuZEljb24ocCl7cmV0dXJuIHA/ImV4cGFuZC1tb3JlIjoiZXhwYW5kLWxlc3MifSxfZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKHAscSxyKXtyZXR1cm4hcFtxXXx8IXBbcV0udGFnc1tyXXx8IXBbcV0udGFnc1tyXS5vcEdyYXBofSxfZ2V0U2VsZWN0aW9uUHJvZmlsZURpc2FibGVkKHAscSxyKXtyZXR1cm4hcFtxXXx8IXBbcV0udGFnc1tyXXx8IXBbcV0udGFnc1tyXS5wcm9maWxlfSxfZ2V0U2VsZWN0aW9uQ29uY2VwdHVhbEdyYXBoRGlzYWJsZWQocCxxLHIpe3JldHVybiFwW3FdfHwhcFtxXS50YWdzW3JdfHwhcFtxXS50YWdzW3JdLmNvbmNlcHR1YWxHcmFwaH19KX0pKGMuY29udHJvbHN8fChjLmNvbnRyb2xzPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwo8L3NjcmlwdD4KCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIiPiA8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtbG9hZGVyL3RmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIuanMKaG09dGhpcyYmdGhpcy5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKGEsYyxkLGYpe3JldHVybiBuZXcgKGR8fChkPVByb21pc2UpKShmdW5jdGlvbihnLGwpe2Z1bmN0aW9uIGsocSl7dHJ5e3AoZi5uZXh0KHEpKX1jYXRjaChyKXtsKHIpfX1mdW5jdGlvbiBtKHEpe3RyeXtwKGZbInRocm93Il0ocSkpfWNhdGNoKHIpe2wocil9fWZ1bmN0aW9uIHAocSl7cS5kb25lP2cocS52YWx1ZSk6KG5ldyBkKGZ1bmN0aW9uKHIpe3IocS52YWx1ZSl9KSkudGhlbihrLG0pfXAoKGY9Zi5hcHBseShhLGN8fFtdKSkubmV4dCgpKX0pfTsKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlciIscHJvcGVydGllczp7ZGF0YXNldHM6QXJyYXkscHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sc2VsZWN0aW9uOk9iamVjdCxzZWxlY3RlZEZpbGU6T2JqZWN0LGNvbXBhdGliaWxpdHlQcm92aWRlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBhLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcn0saGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+YS5ncmFwaC5oaWVyYXJjaHkuRGVmYXVsdEhpZXJhcmNoeVBhcmFtc30sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0U3RhdHM6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2dyYXBoUnVuVGFnOk9iamVjdH0sCm9ic2VydmVyczpbIl9zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbiwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsIl9zZWxlY3RlZEZpbGVDaGFuZ2VkKHNlbGVjdGVkRmlsZSwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSJdLF9zZWxlY3Rpb25DaGFuZ2VkKCl7dGhpcy5kZWJvdW5jZSgic2VsZWN0aW9uY2hhbmdlIiwoKT0+e3RoaXMuX2xvYWQodGhpcy5zZWxlY3Rpb24pfSl9LF9sb2FkOmZ1bmN0aW9uKGQpe2NvbnN0IHtydW46Zix0YWc6Zyx0eXBlOmx9PWQ7c3dpdGNoKGwpe2Nhc2UgYS5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIOmNhc2UgYS5ncmFwaC5TZWxlY3Rpb25UeXBlLkNPTkNFUFRVQUxfR1JBUEg6cmV0dXJuIHRoaXMuX3NldE91dFN0YXRzKG51bGwpLGQ9bmV3IFVSTFNlYXJjaFBhcmFtcyxkLnNldCgicnVuIixmKSxkLnNldCgiY29uY2VwdHVhbCIsU3RyaW5nKGw9PT1hLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSCkpLGcmJmQuc2V0KCJ0YWciLApnKSxkPVBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLGQpLHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZCkudGhlbigoKT0+e3RoaXMuX2dyYXBoUnVuVGFnPXtydW46Zix0YWc6Z319KTtjYXNlIGEuZ3JhcGguU2VsZWN0aW9uVHlwZS5QUk9GSUxFOnsoe3RhZ3M6ZH09dGhpcy5kYXRhc2V0cy5maW5kKCh7bmFtZTpxfSk9PnE9PT1mKSk7Y29uc3Qgaz1kLmZpbmQocT0+cS50YWc9PT1nKS5vcEdyYXBoP2c6bnVsbDtjb25zb2xlLmFzc2VydChkLmZpbmQocT0+cS50YWc9PT1rKSxgUmVxdWlyZWQgdGFnICgke2t9KSBpcyBtaXNzaW5nLmApO2Q9dGhpcy5fZ3JhcGhSdW5UYWcmJnRoaXMuX2dyYXBoUnVuVGFnLnJ1bj09PWYmJnRoaXMuX2dyYXBoUnVuVGFnLnRhZz09PWs/UHJvbWlzZS5yZXNvbHZlKCk6dGhpcy5fbG9hZCh7cnVuOmYsdGFnOmssdHlwZTphLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEh9KTtjb25zdCBtPQpuZXcgVVJMU2VhcmNoUGFyYW1zO20uc2V0KCJ0YWciLGcpO20uc2V0KCJydW4iLGYpO2NvbnN0IHA9UGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ydW5fbWV0YWRhdGEiLG0pO3JldHVybiBkLnRoZW4oKCk9PnRoaXMuX3JlYWRBbmRQYXJzZU1ldGFkYXRhKHApKX1kZWZhdWx0OnJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcihgVW5rbm93biBzZWxlY3Rpb24gdHlwZTogJHtsfWApKX19LF9yZWFkQW5kUGFyc2VNZXRhZGF0YTpmdW5jdGlvbihkKXt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO2EuZ3JhcGgucGFyc2VyLmZldGNoQW5kUGFyc2VNZXRhZGF0YShkLGEuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpKS50aGVuKGY9Pnt0aGlzLl9zZXRPdXRTdGF0cyhmKX0pfSxfZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaDpmdW5jdGlvbihkLGYpe3JldHVybiBobSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dGhpcy5zZXQoInByb2dyZXNzIiwKe3ZhbHVlOjAsbXNnOiIifSk7cmV0dXJuIGEuZ3JhcGgubG9hZGVyLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoYS5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksZCxmLHRoaXMuY29tcGF0aWJpbGl0eVByb3ZpZGVyLHRoaXMuaGllcmFyY2h5UGFyYW1zKS50aGVuKCh7Z3JhcGg6ZyxncmFwaEhpZXJhcmNoeTpsfSk9Pnt0aGlzLl9zZXRPdXRHcmFwaChnKTt0aGlzLl9zZXRPdXRHcmFwaEhpZXJhcmNoeShsKX0pfSl9LF9zZWxlY3RlZEZpbGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe2lmKGQpe2Q9ZC50YXJnZXQ7dmFyIGY9ZC5maWxlc1swXTtmJiYoZC52YWx1ZT0iIix0aGlzLl9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsZikpfX19KX0pKGMubG9hZGVyfHwoYy5sb2FkZXI9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0PgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJlcnJvci1kaWFsb2ciIHdpdGgtYmFja2Ryb3A+PC9wYXBlci1kaWFsb2c+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFzZXRzU3RhdGUoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCAnRU1QVFknKV1dIj4KICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1NDBweDsgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOyI+CiAgICAgICAgPGgzPk5vIGdyYXBoIGRlZmluaXRpb24gZmlsZXMgd2VyZSBmb3VuZC48L2gzPgogICAgICAgIDxwPgogICAgICAgICAgVG8gc3RvcmUgYSBncmFwaCwgY3JlYXRlIGEKICAgICAgICAgIDxjb2RlPnRmLnN1bW1hcnkuRmlsZVdyaXRlcjwvY29kZT4KICAgICAgICAgIGFuZCBwYXNzIHRoZSBncmFwaCBlaXRoZXIgdmlhIHRoZSBjb25zdHJ1Y3Rvciwgb3IgYnkgY2FsbGluZyBpdHMKICAgICAgICAgIDxjb2RlPmFkZF9ncmFwaCgpPC9jb2RlPiBtZXRob2QuIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9ncmFwaF92aXoiPmdyYXBoIHZpc3VhbGl6ZXIgdHV0b3JpYWw8L2E+LgogICAgICAgIAoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZAogICAgICAgICAgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YXNldHNTdGF0ZShkYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ1BSRVNFTlQnKV1dIj4KICAgICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgICAgPHRmLWdyYXBoLWNvbnRyb2xzIGlkPSJjb250cm9scyIgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiIGRldmljZXMtZm9yLXN0YXRzPSJ7e19kZXZpY2VzRm9yU3RhdHN9fSIgY29sb3ItYnktcGFyYW1zPSJbW19jb2xvckJ5UGFyYW1zXV0iIHN0YXRzPSJbW19zdGF0c11dIiBjb2xvci1ieT0ie3tfY29sb3JCeX19IiBkYXRhc2V0cz0iW1tfZGF0YXNldHNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tfcmVuZGVySGllcmFyY2h5XV0iIHNlbGVjdGlvbj0ie3tfc2VsZWN0aW9ufX0iIHNlbGVjdGVkLWZpbGU9Int7X3NlbGVjdGVkRmlsZX19IiBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIgaGVhbHRoLXBpbGxzLWZlYXR1cmUtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBoZWFsdGgtcGlsbHMtdG9nZ2xlZC1vbj0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IiBvbi1maXQtdGFwPSJfZml0IiB0cmFjZS1pbnB1dHM9Int7X3RyYWNlSW5wdXRzfX0iPjwvdGYtZ3JhcGgtY29udHJvbHM+CiAgICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgICAgPHRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIgaWQ9ImxvYWRlciIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHNlbGVjdGlvbj0iW1tfc2VsZWN0aW9uXV0iIHNlbGVjdGVkLWZpbGU9IltbX3NlbGVjdGVkRmlsZV1dIiBvdXQtZ3JhcGgtaGllcmFyY2h5PSJ7e19ncmFwaEhpZXJhcmNoeX19IiBvdXQtZ3JhcGg9Int7X2dyYXBofX0iIG91dC1zdGF0cz0ie3tfc3RhdHN9fSIgcHJvZ3Jlc3M9Int7X3Byb2dyZXNzfX0iIGhpZXJhcmNoeS1wYXJhbXM9IltbX2hpZXJhcmNoeVBhcmFtc11dIiBjb21wYXRpYmlsaXR5LXByb3ZpZGVyPSJbW19jb21wYXRpYmlsaXR5UHJvdmlkZXJdXSI+PC90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyPgogICAgICAgICAgPHRmLWdyYXBoLWJvYXJkIGlkPSJncmFwaGJvYXJkIiBkZXZpY2VzLWZvci1zdGF0cz0iW1tfZGV2aWNlc0ZvclN0YXRzXV0iIGNvbG9yLWJ5PSJbW19jb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0ie3tfY29sb3JCeVBhcmFtc319IiBncmFwaC1oaWVyYXJjaHk9IltbX2dyYXBoSGllcmFyY2h5XV0iIGdyYXBoPSJbW19ncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgcHJvZ3Jlc3M9IltbX3Byb2dyZXNzXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbX2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tfZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW19ub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IiBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1tfaGVhbHRoUGlsbFN0ZXBJbmRleF1dIiByZW5kZXItaGllcmFyY2h5PSJ7e19yZW5kZXJIaWVyYXJjaHl9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIHN0YXRzPSJbW19zdGF0c11dIiB0cmFjZS1pbnB1dHM9IltbX3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGgtYm9hcmQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC9kZWVwLyB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRpYWxvZyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZ3JhcGgtZGFzaGJvYXJkL3RmLWdyYXBoLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19kYXRhc2V0czp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9kYXRhc2V0c0ZldGNoZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3NlbGVjdGVkRGF0YXNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3JlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLkNhbmNlbGxlcn0sX2RlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbixhbGxTdGVwc01vZGVFbmFibGVkOkJvb2xlYW4sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZCJ9LApzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2lzQXR0YWNoZWQ6Qm9vbGVhbixfaW5pdGlhbGl6ZWQ6Qm9vbGVhbixfYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4sX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2hlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLF9oZWFsdGhQaWxsUmVxdWVzdElkOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZDpOdW1iZXIsX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxyZWFkT25seTohMH0scnVuczpBcnJheSxydW46e3R5cGU6U3RyaW5nLG5vdGlmeTohMCx2YWx1ZTpWbC5nZXRTdHJpbmdJbml0aWFsaXplcigicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMX0pLG9ic2VydmVyOiJfcnVuT2JzZXJ2ZXIifSwKX3NlbGVjdGlvbjp7dHlwZTpPYmplY3R9LF9jb21wYXRpYmlsaXR5UHJvdmlkZXI6T2JqZWN0LF90cmFjZUlucHV0czpCb29sZWFufSxsaXN0ZW5lcnM6eyJub2RlLXRvZ2dsZS1leHBhbmQiOiJfaGFuZGxlTm9kZVRvZ2dsZUV4cGFuZCJ9LG9ic2VydmVyczpbIl9tYXliZUZldGNoSGVhbHRoUGlsbHMoX2RlYnVnZ2VyRGF0YUVuYWJsZWQsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIHNwZWNpZmljSGVhbHRoUGlsbFN0ZXAsIF9zZWxlY3RlZE5vZGUpIiwiX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZChfaXNBdHRhY2hlZCkiLCJfZGV0ZXJtaW5lU2VsZWN0ZWREYXRhc2V0KF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgcnVuKSIsIl91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgX3NlbGVjdGVkRGF0YXNldCkiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsCiExKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZHx8dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChQay5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShhPT57YS5jYW5jZWxsZWR8fGEudmFsdWVbImRlYnVnZ2VyIl0mJnRoaXMuc2V0KCJfZGVidWdnZXJEYXRhRW5hYmxlZCIsITApfSkpO3RoaXMuX21heWJlRmV0Y2hIZWFsdGhQaWxscygpfSxfZml0OmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2dyYXBoYm9hcmQiKS5maXQoKX0sX3J1bk9ic2VydmVyOlZsLmdldFN0cmluZ09ic2VydmVyKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIscG9seW1lclByb3BlcnR5OiJydW4iLHVzZUxvY2FsU3RvcmFnZTohMX0pLF9mZXRjaERhdGFzZXQoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChQay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2luZm8iKSl9LF9mZXRjaEhlYWx0aFBpbGxzKGEsCmMpe2E9e25vZGVfbmFtZXM6SlNPTi5zdHJpbmdpZnkoYSkscnVuOiJfX2RlYnVnZ2VyX2RhdGFfXyJ9O3ZvaWQgMCE9PWMmJihhLnN0ZXA9Yyk7Yz1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvaGVhbHRoX3BpbGxzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYyxhKX0sX2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9udW1lcmljc19hbGVydF9yZXBvcnQiKSl9LF9ncmFwaFVybChhLGMsZCl7cmV0dXJuIFBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3J1bjphLGxpbWl0X2F0dHJfc2l6ZTpjLGxhcmdlX2F0dHJzX2tleTpkfSkpfSxfc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWQmJgp0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uJiZ0aGlzLl9yZW5kZXJIaWVyYXJjaHkmJnRoaXMuX2RhdGFzZXRzU3RhdGUodGhpcy5fZGF0YXNldHNGZXRjaGVkLHRoaXMuX2RhdGFzZXRzLCJQUkVTRU5UIil9LF9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQ6ZnVuY3Rpb24oYSl7IXRoaXMuX2luaXRpYWxpemVkJiZhJiYodGhpcy5zZXQoIl9jb21wYXRpYmlsaXR5UHJvdmlkZXIiLG5ldyB0Zi5ncmFwaC5vcC5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXIpLHRoaXMuX2luaXRpYWxpemVkPSEwLHRoaXMuX2ZldGNoRGF0YXNldCgpLnRoZW4oYz0+e3RoaXMuX2RhdGFzZXRzPU9iamVjdC5rZXlzKGMpLnNvcnQoT2suY29tcGFyZVRhZ05hbWVzKS5tYXAoZD0+e2NvbnN0IGY9Y1tkXTt2YXIgZz1PYmplY3Qua2V5cyhmLnRhZ3MpLnNvcnQoT2suY29tcGFyZVRhZ05hbWVzKS5tYXAobD0+Zi50YWdzW2xdKS5tYXAoKHt0YWc6bCxjb25jZXB0dWFsX2dyYXBoOmssb3BfZ3JhcGg6bSxwcm9maWxlOnB9KT0+Cih7dGFnOmwsZGlzcGxheU5hbWU6bCxjb25jZXB0dWFsR3JhcGg6ayxvcEdyYXBoOm0scHJvZmlsZTpwfSkpO2c9Zi5ydW5fZ3JhcGg/W3t0YWc6bnVsbCxkaXNwbGF5TmFtZToiRGVmYXVsdCIsY29uY2VwdHVhbEdyYXBoOiExLG9wR3JhcGg6ITAscHJvZmlsZTohMX0sLi4uZ106ZztyZXR1cm57bmFtZTpkLHRhZ3M6Z319KTt0aGlzLl9kYXRhc2V0c0ZldGNoZWQ9ITB9KSl9LF9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoYSxjLGQpe2Q/KGM9Yy5maW5kSW5kZXgoZj0+Zi5uYW1lPT09ZCksLTE9PT1jP2EmJihhPXRoaXMuJCQoIiNlcnJvci1kaWFsb2ciKSxhLnRleHRDb250ZW50PWBObyBkYXRhc2V0IG5hbWVkICIke2R9IiBjb3VsZCBiZSBmb3VuZC5gLGEub3BlbigpKTp0aGlzLnNldCgiX3NlbGVjdGVkRGF0YXNldCIsYykpOnRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IiwwKX0sX3VwZGF0ZVNlbGVjdGVkRGF0YXNldE5hbWUoYSxjLGQpe2EmJihjLmxlbmd0aDw9ZHx8dGhpcy5zZXQoInJ1biIsCmNbZF0ubmFtZSkpfSxfcmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCEwKTt2YXIgYT0rK3RoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQ7bnVsbCE9PXRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQpLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbCk7dGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbDt0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHMoYSl9LmJpbmQodGhpcyksdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheSk6dGhpcy5faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKGEpfSwKX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxsczpmdW5jdGlvbihhKXtpZih0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkPT09YSl7dmFyIGM9dGhpcy5fZmV0Y2hIZWFsdGhQaWxscyh0aGlzLl9yZW5kZXJIaWVyYXJjaHkuZ2V0TmFtZXNPZlJlbmRlcmVkT3BzKCksdGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp2b2lkIDApLGQ9dGhpcy5fZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCk7UHJvbWlzZS5hbGwoW2MsZF0pLnRoZW4oZnVuY3Rpb24oZil7dmFyIGc9ZlswXTtmPWZbMV07aWYodGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmYT09PXRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQpe2Zvcih2YXIgbCBpbiBnKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwSW5kZXgiLGdbbF0ubGVuZ3RoLTEpO2JyZWFrfXRoaXMuc2V0KCJfZGVidWdnZXJOdW1lcmljQWxlcnRzIixmKTt0aGlzLnNldCgiX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLApnKTt0aGlzLnNldCgiX2FyZUhlYWx0aFBpbGxzTG9hZGluZyIsITEpO3RoaXMuc2V0KCJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCIsbnVsbCl9fS5iaW5kKHRoaXMpKX19LF9kYXRhc2V0c1N0YXRlOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gYT9jJiZjLmxlbmd0aD8iUFJFU0VOVCI9PT1kOiJFTVBUWSI9PT1kOiJOT1RfTE9BREVEIj09PWR9LF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZU5vZGVUb2dnbGVFeHBhbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKX0sX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZDpmdW5jdGlvbihhKXthP3RoaXMucmVsb2FkKCk6dGhpcy5zZXQoIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix7fSl9LF9tYXliZUZldGNoSGVhbHRoUGlsbHM6ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHMoKSYmdGhpcy5fcmVxdWVzdEhlYWx0aFBpbGxzKCl9fSk7Cjwvc2NyaXB0PgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZ6LWRpc3RyaWJ1dGlvbi1jaGFydCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBsb3R0YWJsZS1zdHlsZSI+PC9zdHlsZT4KICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjY2hhcnRkaXYgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdnotZGlzdHJpYnV0aW9uLWNoYXJ0L3Z6LWRpc3RyaWJ1dGlvbi1jaGFydC5qcwp2YXIgb207CihmdW5jdGlvbihhKXtjbGFzcyBje2NvbnN0cnVjdG9yKGQsZil7dGhpcy5ydW4yZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPWY7dGhpcy5idWlsZENoYXJ0KGQpfWdldERhdGFzZXQoZCl7dm9pZCAwPT09dGhpcy5ydW4yZGF0YXNldHNbZF0mJih0aGlzLnJ1bjJkYXRhc2V0c1tkXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se3J1bjpkfSkpO3JldHVybiB0aGlzLnJ1bjJkYXRhc2V0c1tkXX1idWlsZENoYXJ0KGQpe3RoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpO2Q9Ym0uZ2V0WENvbXBvbmVudHMoZCk7dGhpcy54QWNjZXNzb3I9ZC5hY2Nlc3Nvcjt0aGlzLnhTY2FsZT1kLnNjYWxlO3RoaXMueEF4aXM9ZC5heGlzO3RoaXMueEF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoMyk7dGhpcy55U2NhbGU9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3RoaXMueUF4aXM9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtkPQpibS5tdWx0aXNjYWxlRm9ybWF0dGVyKGJtLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihkKTt0aGlzLnlBeGlzLnVzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uKCk7ZD10aGlzLmJ1aWxkUGxvdCh0aGlzLnhBY2Nlc3Nvcix0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5ncmlkbGluZXM9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5jZW50ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxkXSk7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdChkLGYsZyl7bGV0IGw9WzAsMjI4LDE1ODcsMzA4NSw1RTMsNjkxNSw4NDEzLDk3NzIsMUU0XSxrPV8ucmFuZ2UobC5sZW5ndGgtCjEpLm1hcCh0PT4obFt0KzFdLWxbdF0pLzI1MDApLG09bC5tYXAoKHQsdik9PkE9PkFbdl1bMV0pLHA9bVs0XSxxPV8ucmFuZ2UobS5sZW5ndGgtMSkubWFwKHQ9PntsZXQgdj1uZXcgUGxvdHRhYmxlLlBsb3RzLkFyZWE7di54KGQsZik7bGV0IEE9NDx0P21bdF06bVt0KzFdO3YueSg0PHQ/bVt0KzFdOm1bdF0sZyk7di55MChBKTt2LmF0dHIoImZpbGwiLCh5LHgsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7di5hdHRyKCJzdHJva2UiLCh5LHgsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7di5hdHRyKCJzdHJva2Utd2VpZ2h0IiwoKT0+IjAuNXB4Iik7di5hdHRyKCJzdHJva2Utb3BhY2l0eSIsKCk9PmtbdF0pO3YuYXR0cigiZmlsbC1vcGFjaXR5IiwoKT0+a1t0XSk7cmV0dXJuIHZ9KSxyPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtyLngoZCxmKTtyLnkocCxnKTtyLmF0dHIoInN0cm9rZSIsKHQsdixBKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKEEucnVuKSk7CnRoaXMucGxvdHM9cTtyZXR1cm4gbmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKHEpfXNldFZpc2libGVTZXJpZXMoZCl7dGhpcy5ydW5zPWQ7bGV0IGY9ZC5tYXAoZz0+dGhpcy5nZXREYXRhc2V0KGcpKTt0aGlzLnBsb3RzLmZvckVhY2goZz0+Zy5kYXRhc2V0cyhmKSl9c2V0U2VyaWVzRGF0YShkLGYpe3RoaXMuZ2V0RGF0YXNldChkKS5kYXRhKGYpfXJlbmRlclRvKGQpe3RoaXMudGFyZ2V0U1ZHPWQ7dGhpcy5vdXRlci5yZW5kZXJUbyhkKX1yZWRyYXcoKXt0aGlzLm91dGVyLnJlZHJhdygpfWRlc3Ryb3koKXt0aGlzLm91dGVyLmRlc3Ryb3koKX19YS5EaXN0cmlidXRpb25DaGFydD1jO1BvbHltZXIoe2lzOiJ2ei1kaXN0cmlidXRpb24tY2hhcnQiLHByb3BlcnRpZXM6e2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZShkMy5zY2hlbWVDYXRlZ29yeTEwKX19LHhUeXBlOnt0eXBlOlN0cmluZywKdmFsdWU6InN0ZXAifSxfYXR0YWNoZWQ6Qm9vbGVhbixfY2hhcnQ6T2JqZWN0LF92aXNpYmxlU2VyaWVzQ2FjaGU6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX21ha2VDaGFydCh4VHlwZSwgY29sb3JTY2FsZSwgX2F0dGFjaGVkKSIsIl9yZWxvYWRGcm9tQ2FjaGUoX2NoYXJ0KSJdLHNldFZpc2libGVTZXJpZXM6ZnVuY3Rpb24oZCl7dGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPWQ7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKGQpLHRoaXMucmVkcmF3KCkpfSxzZXRTZXJpZXNEYXRhOmZ1bmN0aW9uKGQsZil7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW2RdPWY7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZCwKZil9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0LnJlZHJhdygpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5jaGFydGRpdiwhMCl9LF9tYWtlQ2hhcnQ6ZnVuY3Rpb24oZCxmLGcpe251bGw9PT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJnRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2lmKGcpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dmFyIGw9bmV3IGMoZCxmKSxrPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO2wucmVuZGVyVG8oayk7dGhpcy5fY2hhcnQ9bH19LDM1MCl9LF9yZWxvYWRGcm9tQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSwKdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZvckVhY2goZnVuY3Rpb24oZCl7dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShkLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtkXXx8W10pfS5iaW5kKHRoaXMpKSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9fSl9KShvbXx8KG9tPXt9KSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgCiAgICA8dnotZGlzdHJpYnV0aW9uLWNoYXJ0IGlkPSJjaGFydCIgeC10eXBlPSJbW3hUeXBlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iPjwvdnotZGlzdHJpYnV0aW9uLWNoYXJ0PgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC90Zi1kaXN0cmlidXRpb24tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyx0YWdNZXRhZGF0YTpPYmplY3QseFR5cGU6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmF9KT0+YX0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmEscnVuOmN9KT0+UGsuYWRkUGFyYW1zKFBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkaXN0cmlidXRpb25zIiwiL2Rpc3RyaWJ1dGlvbnMiKSx7dGFnOmEscnVuOmN9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihhLGMsZCk9PnthPWQubWFwKGY9Pntjb25zdCBbZyxsLGtdPWY7ay53YWxsX3RpbWU9bmV3IERhdGUoMUUzKmcpO2suc3RlcD1sO3JldHVybiBrfSk7CmM9dGhpcy5nZXREYXRhTG9hZE5hbWUoYyk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoYyxhKTt0aGlzLiQuY2hhcnQuc2V0VmlzaWJsZVNlcmllcyhbY10pfX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2FsZTpabC5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLkNhbmNlbGxlcn19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiXSxiZWhhdmlvcnM6W1dsLkRhdGFMb2FkZXJCZWhhdmlvcl0sX2NvbXB1dGVEYXRhVG9Mb2FkKGEsYyl7cmV0dXJuW3tydW46YSx0YWc6Y31dfSxfY29tcHV0ZVJ1bkNvbG9yKGEpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnNjYWxlKGEpfSwKcmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InhUeXBlU2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGRpc3RyaWJ1dGlvbiBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgICAoSGlzdG9ncmFtcyBhbmQgZGlzdHJpYnV0aW9ucyBib3RoIHVzZSB0aGUgaGlzdG9ncmFtIHN1bW1hcnkKICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4pCiAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtZGlzdHJpYnV0aW9uLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQvdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfeFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWc6T2JqZWN0LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOlN0cmluZyxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWcsIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkRGlzdHJpYnV0aW9ucygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBhPVBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkaXN0cmlidXRpb25zIiwKIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57aWYoIV8uaXNFcXVhbChjLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBkPV8ubWFwVmFsdWVzKGMsZz0+T2JqZWN0LmtleXMoZykpLGY9UGsuZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnIixkKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZERpc3RyaWJ1dGlvbnMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtZGlzdHJpYnV0aW9uLWxvYWRlciIpLmZvckVhY2goYT0+e2EucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYSl7cmV0dXJuIDI+PWF9LF9tYWtlQ2F0ZWdvcmllcyhhLGMsZCl7cmV0dXJuIFFrLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYSxjLGQpfSxfdGFnTWV0YWRhdGEoYSwKYyxkKXtyZXR1cm4gYVtjXVtkXX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0idG9vbHRpcCI+PHNwYW4+PC9zcGFuPjwvZGl2PgogICAgPHN2ZyBpZD0ic3ZnIj4KICAgICAgPGc+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeCI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5IHNsaWNlIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InN0YWdlIj4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJiYWNrZ3JvdW5kIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGNsYXNzPSJ4LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9Inktc2xpY2UtYXhpcy1ob3ZlciI+PC9nPgogICAgICA8L2c+CiAgICA8L3N2Zz4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICBmb250LWZhbWlseTogcm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgewogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWxsOiByZWQ7CiAgICAgIH0KCiAgICAgIC5oaXN0b2dyYW0gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuaG92ZXIgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGRvbWluYW50LWJhc2VsaW5lOiBtaWRkbGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyIGNpcmNsZSB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CgogICAgICAuaG92ZXIgdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgY2lyY2xlIHsKICAgICAgICBmaWxsOiBibGFjayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuYmFzZWxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLm91dGxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAub3V0bGluZS5vdXRsaW5lLWhvdmVyIHsKICAgICAgICBzdHJva2U6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIsCiAgICAgIC55LWF4aXMtaG92ZXIsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgLmxhYmVsIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LWFuY2hvcjogZW5kOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIGxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktYXhpcy1ob3ZlciByZWN0LAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHJlY3QgewogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICB9CgogICAgICAuYXhpcyB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICB9CgogICAgICAuYXhpcyBwYXRoLmRvbWFpbiB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgfQoKICAgICAgLmF4aXMgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjZGRkOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMjsKICAgICAgfQoKICAgICAgLnNtYWxsIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmZpcnN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmxhc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzL3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToib2Zmc2V0In0sdGltZVByb3BlcnR5Ont0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LGJpbnM6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5zIn0seDp7dHlwZTpTdHJpbmcsdmFsdWU6IngifSxkeDp7dHlwZTpTdHJpbmcsdmFsdWU6ImR4In0seTp7dHlwZTpTdHJpbmcsdmFsdWU6InkifSxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSxtb2RlVHJhbnNpdGlvbkR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTo1MDB9LF9hdHRhY2hlZDpCb29sZWFuLF9uYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsicmVkcmF3KHRpbWVQcm9wZXJ0eSwgX2F0dGFjaGVkKSIsIl9tb2RlUmVkcmF3KG1vZGUpIl0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLnN2ZywhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oYSxjKXt0aGlzLl9uYW1lPWE7dGhpcy5fZGF0YT1jO3RoaXMucmVkcmF3KCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2RyYXcoMCl9LF9tb2RlUmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fZHJhdyh0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb24pfSxfZHJhdzpmdW5jdGlvbihhKXtpZih0aGlzLl9hdHRhY2hlZCYmdGhpcy5fZGF0YSl7aWYodm9pZCAwPT09YSl0aHJvdyBFcnJvcigidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgX2RyYXcgbmVlZHMgZHVyYXRpb24iKTtpZigwPj10aGlzLl9kYXRhLmxlbmd0aCl0aHJvdyBFcnJvcigiTm90IGVub3VnaCBzdGVwcyBpbiB0aGUgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdLmhhc093blByb3BlcnR5KHRoaXMuYmlucykpdGhyb3cgRXJyb3IoIk5vIGJpbnMgcHJvcGVydHkgb2YgJyIrCnRoaXMuYmlucysiJyBpbiBkYXRhIik7aWYoMD49dGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdLmxlbmd0aCl0aHJvdyBFcnJvcigiTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBiaW4gaW4gYmlucyBpbiBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLngpKXRocm93IEVycm9yKCJObyB4IHByb3BlcnR5ICciK3RoaXMueCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMuZHgpKXRocm93IEVycm9yKCJObyBkeCBwcm9wZXJ0eSAnIit0aGlzLmR4KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy55KSl0aHJvdyBFcnJvcigiTm8geSBwcm9wZXJ0eSAnIit0aGlzLnkrIicgb24gYmlucyBkYXRhIik7dmFyIGM9dGhpcy50aW1lUHJvcGVydHksZD10aGlzLngsZj10aGlzLmJpbnMsZz10aGlzLmR4LApsPXRoaXMueSxrPXRoaXMuX2RhdGEsbT10aGlzLm1vZGUscD1kMy5oY2wodGhpcy5jb2xvclNjYWxlKHRoaXMuX25hbWUpKSxxPWQzLnNlbGVjdCh0aGlzLiQudG9vbHRpcCkscj1mdW5jdGlvbihFYSl7cmV0dXJuIEVhW2RdfSx0PWZ1bmN0aW9uKEVhKXtyZXR1cm4gRWFbbF19LHY9ZnVuY3Rpb24oRWEpe3JldHVybiBFYVtkXStFYVtnXX0sQT1mdW5jdGlvbihFYSl7cmV0dXJuIEVhW2NdfTsicmVsYXRpdmUiPT09YyYmKEE9ZnVuY3Rpb24oRWEpe3JldHVybiBFYS53YWxsX3RpbWUta1swXS53YWxsX3RpbWV9KTt2YXIgeT10aGlzLiQuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHg9eS53aWR0aCxDPXkuaGVpZ2h0LEY9NTtpZigib2Zmc2V0Ij09PW0pe3ZhciBEPUMvMi41O0Y9RCs1fWVsc2UgRD1DLUYtMjA7dmFyIEI9eC0yNC02MCxHPUMtRi0yMDtkMy5taW4oayxyKTtkMy5tYXgoayx2KTt2YXIgSz1kMy5mb3JtYXQoIi4zbiIpO3k9ZDMuZm9ybWF0KCIuMGYiKTsid2FsbF90aW1lIj09PQpjP3k9ZDMudGltZUZvcm1hdCgiJW0vJWQgJVgiKToicmVsYXRpdmUiPT09YyYmKHk9ZnVuY3Rpb24oRWEpe3JldHVybiBkMy5mb3JtYXQoIi4xciIpKEVhLzM2RTUpKyJoIn0pO3ZhciBMPWsubWFwKGZ1bmN0aW9uKEVhKXtyZXR1cm5bZDMubWluKEVhW2ZdLHIpLGQzLm1heChFYVtmXSx2KV19KSxKPWsubWFwKGZ1bmN0aW9uKEVhKXtyZXR1cm4gZDMuZXh0ZW50KEVhW2ZdLHQpfSksUD1kMy5leHRlbnQoayxBKSxTPSgid2FsbF90aW1lIj09PWM/ZDMuc2NhbGVUaW1lKCk6ZDMuc2NhbGVMaW5lYXIoKSkuZG9tYWluKFApLnJhbmdlKFswLCJvZmZzZXQiPT09bT9HOjBdKSxOPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLGQzLm1heChrLGZ1bmN0aW9uKEVhLEdhKXtyZXR1cm4gSltHYV1bMV19KV0pLnJhbmdlKFtELDBdKSxUPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKE4uZG9tYWluKCkpLnJhbmdlKFs1MDAsMF0pLFk9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW2QzLm1pbihrLGZ1bmN0aW9uKEVhLApHYSl7cmV0dXJuIExbR2FdWzBdfSksZDMubWF4KGssZnVuY3Rpb24oRWEsR2Epe3JldHVybiBMW0dhXVsxXX0pXSkubmljZSgpLnJhbmdlKFswLEJdKSxhYT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihZLmRvbWFpbigpKS5yYW5nZShbMCw1MDBdKSxoYT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihkMy5leHRlbnQoayxBKSkucmFuZ2UoW3AuZGFya2VyKCkscC5icmlnaHRlcigpXSkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVIY2wpO3A9ZDMuYXhpc0JvdHRvbShZKS50aWNrcygpO3ZhciBYPWQzLmF4aXNSaWdodChTKS50aWNrcygpLnRpY2tGb3JtYXQoeSksY2E9ZDMuYXhpc1JpZ2h0KE4pLnRpY2tzKCkudGlja1NpemUoQis1KS50aWNrRm9ybWF0KEspLGVhPWZ1bmN0aW9uKEVhKXtyZXR1cm4gRWFbZF0rRWFbZ10vMn0sa2E9ZDMubGluZSgpLngoZnVuY3Rpb24oRWEpe3JldHVybiBhYShlYShFYSkpfSkueShmdW5jdGlvbihFYSl7cmV0dXJuIFQoRWFbbF0pfSksYmE9ZnVuY3Rpb24oRWEpe3JldHVybiJNIisKYWEoZWEoRWFbMF0pKSsiLCIrVCgwKSsiTCIra2EoRWEpLnNsaWNlKDEpKyJMIithYShlYShFYVtFYS5sZW5ndGgtMV0pKSsiLCIrVCgwKX0sbGE9dGhpcy4kLnN2Zzt5PWQzLnNlbGVjdChsYSk7YT15LnRyYW5zaXRpb24oKS5kdXJhdGlvbihhKTt5PXkuc2VsZWN0KCJnIikuY2xhc3NlZCgic21hbGwiLGZ1bmN0aW9uKCl7cmV0dXJuIDA8QiYmMTUwPj1CfSkuY2xhc3NlZCgibWVkaXVtIixmdW5jdGlvbigpe3JldHVybiAxNTA8QiYmMzAwPj1CfSkuY2xhc3NlZCgibGFyZ2UiLGZ1bmN0aW9uKCl7cmV0dXJuIDMwMDxCfSk7YT1hLnNlbGVjdCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgyNCwiK0YrIikiKTt2YXIgd2E9ZDMuYmlzZWN0b3IodikubGVmdDtQPXkuc2VsZWN0KCIuc3RhZ2UiKS5vbigibW91c2VvdmVyIixmdW5jdGlvbigpe3hhLnN0eWxlKCJvcGFjaXR5IiwxKTt6YS5zdHlsZSgib3BhY2l0eSIsMSk7RmEuc3R5bGUoIm9wYWNpdHkiLDEpO1NhLnN0eWxlKCJvcGFjaXR5IiwKMSk7cS5zdHlsZSgib3BhY2l0eSIsMSl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7eGEuc3R5bGUoIm9wYWNpdHkiLDApO3phLnN0eWxlKCJvcGFjaXR5IiwwKTtGYS5zdHlsZSgib3BhY2l0eSIsMCk7U2Euc3R5bGUoIm9wYWNpdHkiLDApO3hhLmNsYXNzZWQoImhvdmVyLWNsb3Nlc3QiLCExKTtDYS5jbGFzc2VkKCJvdXRsaW5lLWhvdmVyIiwhMSk7cS5zdHlsZSgib3BhY2l0eSIsMCl9KS5vbigibW91c2Vtb3ZlIixmdW5jdGlvbigpe2Z1bmN0aW9uIEVhKCRiKXtyZXR1cm4gTWF0aC5taW4oJGJbZl0ubGVuZ3RoLTEsd2EoJGJbZl0sZGIpKX12YXIgR2E9ZDMubW91c2UodGhpcyksZGI9WS5pbnZlcnQoR2FbMF0pO1MuaW52ZXJ0KEdhWzFdKTt2YXIgeGIsQ2I9SW5maW5pdHkseWI7eGEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbigkYil7dmFyIGZjPUVhKCRiKTt5Yj0kYjt2YXIgQWE9WSgkYltmXVtmY11bZF0rJGJbZl1bZmNdW2ddLzIpO2ZjPU4oJGJbZl1bZmNdW2xdKTt2YXIgTWI9CiJvZmZzZXQiPT09bT9TKEEoJGIpKS0oRC1mYyk6ZmM7TWI9TWF0aC5hYnMoR2FbMV0tTWIpO01iPENiJiYoQ2I9TWIseGI9JGIpO3JldHVybiJ0cmFuc2xhdGUoIitBYSsiLCIrZmMrIikifSk7eGEuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigkYil7dmFyIGZjPUVhKCRiKTtyZXR1cm4gJGJbZl1bZmNdW2xdfSk7eGEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsZnVuY3Rpb24oJGIpe3JldHVybiAkYj09PXhifSk7Q2EuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsZnVuY3Rpb24oJGIpe3JldHVybiAkYj09PXhifSk7dmFyIHRiPUVhKHliKTt6YS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK1koeWJbZl1bdGJdW2RdK3liW2ZdW3RiXVtnXS8yKSsiLCAiK0crIikifSkuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBLKHliW2ZdW3RiXVtkXSt5YltmXVt0Yl1bZ10vMil9KTt2YXIgQ2M9WC50aWNrRm9ybWF0KCk7RmEuYXR0cigidHJhbnNmb3JtIiwKZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrQisiLCAiKygib2Zmc2V0Ij09PW0/UyhBKHhiKSk6MCkrIikifSkuc3R5bGUoImRpc3BsYXkiLCJvZmZzZXQiPT09bT8iIjoibm9uZSIpLnNlbGVjdCgidGV4dCIpLnRleHQoZnVuY3Rpb24oKXtyZXR1cm4gQ2MoQSh4YikpfSk7dmFyIFpiPWNhLnRpY2tGb3JtYXQoKTtTYS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1tPzA6Tih4YltmXVt0Yl1bbF0pKSsiKSJ9KS5zdHlsZSgiZGlzcGxheSIsIm9mZnNldCI9PT1tPyJub25lIjoiIikuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBaYih4YltmXVt0Yl1bbF0pfSk7dmFyIGhkPWQzLm1vdXNlKGxhKTtxLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoaGRbMF0rMTUpKyJweCwiKyhoZFsxXS0xNSkrInB4KSIpLnNlbGVjdCgic3BhbiIpLnRleHQoIm9mZnNldCI9PT1tP1piKHhiW2ZdW3RiXVtsXSk6Cigic3RlcCI9PT1jPyJzdGVwICI6IiIpK0NjKEEoeGIpKSl9KTtQLnNlbGVjdCgiLmJhY2tncm91bmQiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTI0LCIrLUYrIikiKS5hdHRyKCJ3aWR0aCIseCkuYXR0cigiaGVpZ2h0IixDKTtDPVAuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuZGF0YShrKTtDLmV4aXQoKS5yZW1vdmUoKTt4PUMuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpc3RvZ3JhbSIpO0M9eC5tZXJnZShDKS5zb3J0KGZ1bmN0aW9uKEVhLEdhKXtyZXR1cm4gQShFYSktQShHYSl9KTtGPWEuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihFYSl7cmV0dXJuInRyYW5zbGF0ZSgwLCAiKygib2Zmc2V0Ij09PW0/UyhBKEVhKSktRDowKSsiKSJ9KTt4LmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwiYmFzZWxpbmUiKTtGLnNlbGVjdCgiLmJhc2VsaW5lIikuc3R5bGUoInN0cm9rZS1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09Cm0/LjE6MH0pLmF0dHIoInkxIixEKS5hdHRyKCJ5MiIsRCkuYXR0cigieDIiLEIpO3guYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJvdXRsaW5lIik7dmFyIENhPUMuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInZlY3Rvci1lZmZlY3QiLCJub24tc2NhbGluZy1zdHJva2UiKS5hdHRyKCJkIixmdW5jdGlvbihFYSl7cmV0dXJuIGJhKEVhW2ZdKX0pLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpO0Yuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInRyYW5zZm9ybSIsInNjYWxlKCIrQi81MDArIiwgIitELzUwMCsiKSIpLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKEVhKXtyZXR1cm4ib2Zmc2V0Ij09PW0/IndoaXRlIjpoYShBKEVhKSl9KS5zdHlsZSgiZmlsbC1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09bT8xOjB9KS5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oRWEpe3JldHVybiBoYShBKEVhKSl9KTt4PXguYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJob3ZlciIpLnN0eWxlKCJmaWxsIiwKZnVuY3Rpb24oRWEpe3JldHVybiBoYShBKEVhKSl9KTt2YXIgeGE9Qy5zZWxlY3QoIi5ob3ZlciIpO3guYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwyKTt4LmFwcGVuZCgidGV4dCIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoImR4Iiw0KTt4PXkuc2VsZWN0KCIueC1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieCJdKTtDPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIHphPXgubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtMjApLmF0dHIoInkiLDYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDApLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsNik7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeSIsMTgpO3g9eS5zZWxlY3QoIi55LWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pOwpDPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIEZhPXgubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4Iiw4KS5hdHRyKCJ5IiwtNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KTtDLmFwcGVuZCgibGluZSIpLmF0dHIoIngxIiwwKS5hdHRyKCJ4MiIsNikuYXR0cigieTEiLDApLmF0dHIoInkyIiwwKTtDLmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7eT15LnNlbGVjdCgiLnktc2xpY2UtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbInkiXSk7eD15LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBTYT15Lm1lcmdlKHgpO3guYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7eC5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwKMCkuYXR0cigieTIiLDApO3guYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHgiLDgpLmF0dHIoImR5Iiw0KTthLnNlbGVjdCgiLnkuYXhpcy5zbGljZSIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PW0/MDoxKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1tPy1EOjApKyIpIikuY2FsbChjYSk7YS5zZWxlY3QoIi54LmF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIitHKyIpIikuY2FsbChwKTthLnNlbGVjdCgiLnkuYXhpcyIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PW0/MTowKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitCKyIsICIrKCJvZmZzZXQiPT09bT8wOkcpKyIpIikuY2FsbChYKTthLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoImZpbGwiLCIjYWFhIik7YS5zZWxlY3RBbGwoIi5heGlzIHBhdGguZG9tYWluIikuYXR0cigic3Ryb2tlIiwibm9uZSIpfX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQvaGlzdG9ncmFtQ29yZS5qcwp2YXIgcG07CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGYpe2NvbnN0IFtnLGwsa109ZjtyZXR1cm57d2FsbF90aW1lOmcsc3RlcDpsLG1pbjpkMy5taW4oay5tYXAoKFttXSk9Pm0pKSxtYXg6ZDMubWF4KGsubWFwKChbLG1dKT0+bSkpLGJ1Y2tldHM6ay5tYXAoKFttLHAscV0pPT4oe2xlZnQ6bSxyaWdodDpwLGNvdW50OnF9KSl9fWZ1bmN0aW9uIGQoZixnLGwsaz0zMCl7bD09PWcmJihsPTEuMSpnKzEsZz1nLzEuMS0xKTtjb25zdCBtPShsLWcpL2s7bGV0IHA9MDtyZXR1cm4gZDMucmFuZ2UoZyxsLG0pLm1hcChxPT57Y29uc3Qgcj1xK207bGV0IHQ9MDtmb3IoO3A8Zi5idWNrZXRzLmxlbmd0aDspe2NvbnN0IEE9TWF0aC5taW4obCxmLmJ1Y2tldHNbcF0ucmlnaHQpO3ZhciB2PU1hdGgubWF4KGcsZi5idWNrZXRzW3BdLmxlZnQpO2NvbnN0IHk9TWF0aC5taW4oQSxyKS1NYXRoLm1heCh2LHEpO3Y9eS8oQS12KSpmLmJ1Y2tldHNbcF0uY291bnQ7dCs9MDx5P3Y6MDtpZihBPnIpYnJlYWs7cCsrfXJldHVybnt4OnEsCmR4Om0seTp0fX0pfWEuYmFja2VuZFRvSW50ZXJtZWRpYXRlPWM7YS5pbnRlcm1lZGlhdGVUb0QzPWQ7YS5iYWNrZW5kVG9Wej1mdW5jdGlvbihmKXtmPWYubWFwKGMpO2NvbnN0IGc9ZDMubWluKGYsaz0+ay5taW4pLGw9ZDMubWF4KGYsaz0+ay5tYXgpO3JldHVybiBmLm1hcChrPT4oe3dhbGxfdGltZTprLndhbGxfdGltZSxzdGVwOmsuc3RlcCxiaW5zOmQoayxnLGwpfSkpfX0pKHBtfHwocG09e30pKTsKPC9zY3JpcHQ+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgCiAgICA8dnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgaWQ9ImNoYXJ0IiB0aW1lLXByb3BlcnR5PSJbW3RpbWVQcm9wZXJ0eV1dIiBtb2RlPSJbW2hpc3RvZ3JhbU1vZGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVGdW5jdGlvbl1dIj48L3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzPgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL3RmLWhpc3RvZ3JhbS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaGlzdG9ncmFtLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmF9KT0+YX0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmEscnVuOmN9KT0+UGsuYWRkUGFyYW1zKFBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL2hpc3RvZ3JhbXMiKSx7dGFnOmEscnVuOmN9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihhLGMsZCk9PnthPXBtLmJhY2tlbmRUb1Z6KGQpO2M9dGhpcy5nZXREYXRhTG9hZE5hbWUoYyk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoYyxhKX19fSx0YWdNZXRhZGF0YTpPYmplY3QsdGltZVByb3BlcnR5OlN0cmluZywKaGlzdG9ncmFtTW9kZTpTdHJpbmcsX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PlpsLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcsIHJlcXVlc3RNYW5hZ2VyKSJdLGJlaGF2aW9yczpbV2wuRGF0YUxvYWRlckJlaGF2aW9yXSxfY29tcHV0ZURhdGFUb0xvYWQoYSxjKXtyZXR1cm5be3J1bjphLHRhZzpjfV19LF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbihhKX0scmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0iaGlzdG9ncmFtTW9kZVNlbGVjdG9yIiBuYW1lPSJIaXN0b2dyYW0gbW9kZSIgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im92ZXJsYXkiPm92ZXJsYXk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib2Zmc2V0Ij5vZmZzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIgbmFtZT0iT2Zmc2V0IHRpbWUgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGhpc3RvZ3JhbSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaGlzdG9ncmFtLWRhc2hib2FyZCIscHJvcGVydGllczp7X2hpc3RvZ3JhbU1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmZzZXQifSxfdGltZVByb3BlcnR5Ont0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX3Jlc3RhbXA6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBQay5SZXF1ZXN0TWFuYWdlcn19LGxpc3RlbmVyczp7ImNvbnRlbnQtdmlzaWJpbGl0eS1jaGFuZ2VkIjoiX3JlZHJhd0NhdGVnb3J5UGFuZSJ9LApfcmVkcmF3Q2F0ZWdvcnlQYW5lKGEsYyl7YyYmYS50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goZD0+ZC5yZWRyYXcoKSl9LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEhpc3RvZ3JhbXMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYT1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57aWYoIV8uaXNFcXVhbChjLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBkPV8ubWFwVmFsdWVzKGMsZz0+T2JqZWN0LmtleXMoZykpLGY9UGsuZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnIixkKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+Cnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWRIaXN0b2dyYW1zKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWhpc3RvZ3JhbS1sb2FkZXIiKS5mb3JFYWNoKGE9PnthLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGEpe3JldHVybiAyPj1hfSxfbWFrZUNhdGVnb3JpZXMoYSxjLGQpe3JldHVybiBRay5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGEsYyxkKX0sX3RhZ01ldGFkYXRhKGEsYyxkKXtyZXR1cm4gYVtjXVtkXX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGV4dC1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgcnVuPSJbW3J1bl1dIiB0YWc9IltbdGFnXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgaWQ9InN0ZXBzLWNvbnRhaW5lciIgY2xhc3M9ImNvbnRhaW5lciBzY3JvbGxiYXIiIHN0eWxlPSJib3JkZXItY29sb3I6IFtbX3J1bkNvbG9yXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW190ZXh0c11dIj4KICAgICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0ic3RlcC1jb250YWluZXIiPgogICAgICAgICAgc3RlcCA8c3BhbiBjbGFzcz0ic3RlcC12YWx1ZSI+W1tfZm9ybWF0U3RlcChpdGVtLnN0ZXApXV08L3NwYW4+CiAgICAgICAgPC9wYXBlci1tYXRlcmlhbD4KICAgICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0idGV4dCI+CiAgICAgICAgICA8dGYtbWFya2Rvd24tdmlldyBodG1sPSJbW2l0ZW0udGV4dF1dIj48L3RmLW1hcmtkb3duLXZpZXc+CiAgICAgICAgPC9wYXBlci1tYXRlcmlhbD4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgICAuc2Nyb2xsYmFyIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICAgICNzdGVwcy1jb250YWluZXIgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAvKiBjb2xvciBjb21wdXRlZCBhbmQgc2V0IGFzIGlubGluZSBzdHlsZSAqLzsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CiAgICAgIC50ZXh0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAwIDNweCAzcHggM3B4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zdGVwLWNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7IC8qIHRvIGNvcnJlY3QgZm9yIGJvcmRlciAqLwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXI6bm90KDpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi10ZXh0LWRhc2hib2FyZC90Zi10ZXh0LWxvYWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi10ZXh0LWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IocnVuKSJ9LF90ZXh0czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUGsuQ2FuY2VsbGVyfX0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gWmwucnVuc0NvbG9yU2NhbGUoYSl9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7aWYodGhpcy5fYXR0YWNoZWQpe3RoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTt2YXIgYT1Qay5hZGRQYXJhbXMoUGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInRleHQiLCIvdGV4dCIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVufSksYz10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwKKGQ9ZC52YWx1ZS5tYXAoZj0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmYud2FsbF90aW1lKSxzdGVwOmYuc3RlcCx0ZXh0OmYudGV4dH0pKSx0aGlzLnNldCgiX3RleHRzIixkLnNsaWNlKCkucmV2ZXJzZSgpKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjKX19LF9mb3JtYXRTdGVwKGEpe3JldHVybiBkMy5mb3JtYXQoIiwiKShhKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyB0ZXh0IGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHRleHQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtdGV4dC1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWc9IltbaXRlbS50YWddXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi10ZXh0LWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUGsuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRUZXh0cygpfSl9LF9zaG91bGRPcGVuKGEpe3JldHVybiAyPj1hfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYT1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT4Ke2lmKCFfLmlzRXF1YWwoYyx0aGlzLl9ydW5Ub1RhZykpe3ZhciBkPVBrLmdldFRhZ3MoYyk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1kLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZFRleHRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXRleHQtbG9hZGVyIikuZm9yRWFjaChhPT57YS5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYSxjLGQpe3JldHVybiBRay5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGEsYyxkKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgoKICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbX3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2RdXSIgeS12YWx1ZS1hY2Nlc3Nvcj0iW1tfeVZhbHVlQWNjZXNzb3JdXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZUZ1bmN0aW9uXV0iIGRlZmF1bHQteC1yYW5nZT0iW1tfZGVmYXVsdFhSYW5nZV1dIiBkZWZhdWx0LXktcmFuZ2U9IltbX2RlZmF1bHRZUmFuZ2VdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGRhdGEtc2VyaWVzPSJbW3J1bnNdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIGFjdGl2ZT0iW1thY3RpdmVdXSI+PC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgoKICAgIDxkaXYgaWQ9ImJ1dHRvbnMtcm93Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJSZXNldCBheGVzIHRvIFswLCAxXS4iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJzdGVwLWxlZ2VuZCI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU3RlcEF2YWlsYWJsZV1dIiBhcz0icnVuIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6IFtbX2NvbXB1dGVSdW5Db2xvcihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIFtbcnVuXV0gaXMgYXQKICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWxhYmVsLXRleHQiPgogICAgICAgICAgICBzdGVwIFtbX2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSA8L3NwYW4+PGJyPgogICAgICAgICAgPHNwYW4gY2xhc3M9IndhbGwtdGltZS1sYWJlbC10ZXh0Ij4KICAgICAgICAgICAgKFtbX2NvbXB1dGVDdXJyZW50V2FsbFRpbWVGb3JSdW4oX3J1blRvUHJDdXJ2ZUVudHJ5LCBydW4pXV0pCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDUwMHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgewogICAgICAgIGhlaWdodDogNjAwcHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQogICAgICAjc3RlcC1sZWdlbmQgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZm9udC1zaXplOiAwLjhlbTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDEwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1yb3cgewogICAgICAgIG1hcmdpbjogNXB4IDAgNXB4IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmNvbG9yLWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtbGFiZWwtdGV4dCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLndhbGwtdGltZS1sYWJlbC10ZXh0IHsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLXByLWN1cnZlLWRhc2hib2FyZC90Zi1wci1jdXJ2ZS1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXksdGFnOlN0cmluZyx0YWdNZXRhZGF0YTpPYmplY3QscnVuVG9TdGVwQ2FwOk9iamVjdCxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsYWN0aXZlOkJvb2xlYW4sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcnVuVG9QckN1cnZlRW50cnk6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9ydW5zV2l0aFN0ZXBBdmFpbGFibGU6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlUnVuc1dpdGhTdGVwQXZhaWxhYmxlKHJ1bnMsIF9ydW5Ub1ByQ3VydmVFbnRyeSkifSxfc2V0T2ZSZWxldmFudFJ1bnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNldE9mUmVsZXZhbnRSdW5zKF9ydW5zV2l0aFN0ZXBBdmFpbGFibGUpIn0sX3J1blRvRGF0YU92ZXJUaW1lOk9iamVjdCwKX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6WmwucnVuc0NvbG9yU2NhbGV9KX0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBQay5DYW5jZWxsZXJ9LF9hdHRhY2hlZDpCb29sZWFuLF94Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+KCk9Pntjb25zdCBhPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6YSxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGEsImJvdHRvbSIpLGFjY2Vzc29yOmM9PmMucmVjYWxsfX19LF95VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmE9PmEucHJlY2lzaW9ufSxfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Pntjb25zdCBhPWJtLm11bHRpc2NhbGVGb3JtYXR0ZXIoYm0uWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLApjPWQ9PmlzTmFOKGQpPyJOYU4iOmEoZCk7cmV0dXJuW3t0aXRsZToiUnVuIixldmFsdWF0ZTpkPT5kLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRocmVzaG9sZCIsZXZhbHVhdGU6ZD0+YyhkLmRhdHVtLnRocmVzaG9sZHMpfSx7dGl0bGU6IlByZWNpc2lvbiIsZXZhbHVhdGU6ZD0+YyhkLmRhdHVtLnByZWNpc2lvbil9LHt0aXRsZToiUmVjYWxsIixldmFsdWF0ZTpkPT5jKGQuZGF0dW0ucmVjYWxsKX0se3RpdGxlOiJUUCIsZXZhbHVhdGU6ZD0+ZC5kYXR1bS50cnVlX3Bvc2l0aXZlc30se3RpdGxlOiJGUCIsZXZhbHVhdGU6ZD0+ZC5kYXR1bS5mYWxzZV9wb3NpdGl2ZXN9LHt0aXRsZToiVE4iLGV2YWx1YXRlOmQ9PmQuZGF0dW0udHJ1ZV9uZWdhdGl2ZXN9LHt0aXRsZToiRk4iLGV2YWx1YXRlOmQ9PmQuZGF0dW0uZmFsc2VfbmVnYXRpdmVzfV19fSxfc2VyaWVzRGF0YUZpZWxkczp7dHlwZTpBcnJheSx2YWx1ZToidGhyZXNob2xkcyBwcmVjaXNpb24gcmVjYWxsIHRydWVfcG9zaXRpdmVzIGZhbHNlX3Bvc2l0aXZlcyB0cnVlX25lZ2F0aXZlcyBmYWxzZV9uZWdhdGl2ZXMiLnNwbGl0KCIgIiksCnJlYWRPbmx5OiEwfSxfZGVmYXVsdFhSYW5nZTp7dHlwZTpBcnJheSx2YWx1ZTpbLS4wNSwxLjA1XSxyZWFkT25seTohMH0sX2RlZmF1bHRZUmFuZ2U6e3R5cGU6QXJyYXksdmFsdWU6Wy0uMDUsMS4wNV0scmVhZE9ubHk6ITB9LF9kYXRhVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9Pntjb25zdCBjPXRoaXMudGFnO3JldHVybiBQay5hZGRQYXJhbXMoUGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi9wcl9jdXJ2ZXMiKSx7dGFnOmMscnVuOmF9KX19fSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1bnMsIHRhZykiLCJfc2V0Q2hhcnREYXRhKF9ydW5Ub1ByQ3VydmVFbnRyeSwgX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnksIF9zZXRPZlJlbGV2YW50UnVucykiLCJfdXBkYXRlUnVuVG9QckN1cnZlRW50cnkoX3J1blRvRGF0YU92ZXJUaW1lLCBydW5Ub1N0ZXBDYXApIl0sCl9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCl7cmV0dXJuKGEsYyxkKT0+e3RoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9EYXRhT3ZlclRpbWUsZCkpfX0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uLnNjYWxlKGEpfSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2F0dGFjaGVkJiYoMD09PXRoaXMucnVucy5sZW5ndGg/dGhpcy5zZXQoIl9ydW5Ub0RhdGFPdmVyVGltZSIse30pOnRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWxvYWQoKSl9LF9zZXRDaGFydERhdGEoYSxjLGQpe18uZm9yT3duKGEsKGYsZyk9Pntjb25zdCBsPWNbZ107bCYmYVtnXS5zdGVwPT09bC5zdGVwfHwoZFtnXT90aGlzLl91cGRhdGVTZXJpZXNEYXRhRm9yUnVuKGcsZik6dGhpcy5fY2xlYXJTZXJpZXNEYXRhKGcpKX0pfSwKX3VwZGF0ZVNlcmllc0RhdGFGb3JSdW4oYSxjKXtjb25zdCBkPV8ucmVkdWNlKHRoaXMuX3Nlcmllc0RhdGFGaWVsZHMsKGcsbCk9PntnW2xdPWNbbF0uc2xpY2UoKS5yZXZlcnNlKCk7cmV0dXJuIGd9LHt9KSxmPUFycmF5KGRbdGhpcy5fc2VyaWVzRGF0YUZpZWxkc1swXV0ubGVuZ3RoKTtmb3IobGV0IGc9MDtnPGYubGVuZ3RoO2crKylmW2ddPV8ubWFwVmFsdWVzKGQsbD0+bFtnXSk7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnNldFNlcmllc0RhdGEoYSxmKX0sX2NsZWFyU2VyaWVzRGF0YShhKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikuc2V0U2VyaWVzRGF0YShhLFtdKX0sX3VwZGF0ZVJ1blRvUHJDdXJ2ZUVudHJ5KGEsYyl7Y29uc3QgZD17fTtfLmZvck93bihhLChmLGcpPT57ZiYmZi5sZW5ndGgmJihkW2ddPXRoaXMuX2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKGNbZ10sZikpfSk7dGhpcy5zZXQoIl9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5IiwKdGhpcy5fcnVuVG9QckN1cnZlRW50cnkpO3RoaXMuc2V0KCJfcnVuVG9QckN1cnZlRW50cnkiLGQpfSxfY29tcHV0ZUVudHJ5Q2xvc2VzdE9yRXF1YWxUb1N0ZXBDYXAoYSxjKXthPU1hdGgubWluKF8uc29ydGVkSW5kZXgoYy5tYXAoZD0+ZC5zdGVwKSxhKSxjLmxlbmd0aC0xKTtyZXR1cm4gY1thXX0sX2NvbXB1dGVSdW5zV2l0aFN0ZXBBdmFpbGFibGUoYSxjKXtyZXR1cm4gXy5maWx0ZXIoYSxkPT5jW2RdKS5zb3J0KCl9LF9jb21wdXRlU2V0T2ZSZWxldmFudFJ1bnMoYSl7Y29uc3QgYz17fTtfLmZvckVhY2goYSxkPT57Y1tkXT0hMH0pO3JldHVybiBjfSxfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKGEsYyl7cmV0dXJuKGE9YVtjXSk/YS5zdGVwOm51bGx9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lRm9yUnVuKGEsYyl7cmV0dXJuKGE9YVtjXSk/KG5ldyBEYXRlKDFFMyphLndhbGxfdGltZSkpLnRvU3RyaW5nKCk6bnVsbH0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsCiF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3Jlc2V0RG9tYWluKCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlc2V0RG9tYWluKCl9LHJlZHJhdygpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWRyYXcoKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU2xpZGVyc11dIiBhcz0icnVuIj4KICAgICAgPGRpdiBjbGFzcz0icnVuLXdpZGdldCI+CiAgICAgICAgPGRpdiBjbGFzcz0icnVuLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi1jb2xvci1ib3giIHN0eWxlPSJiYWNrZ3JvdW5kOltbX2NvbXB1dGVDb2xvckZvclJ1bihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi10ZXh0Ij4KICAgICAgICAgICAgW1tydW5dXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RlcC1kaXNwbGF5LWNvbnRhaW5lciI+CiAgICAgICAgICBbW19jb21wdXRlVGltZVRleHRGb3JSdW4ocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgX3J1blRvU3RlcEluZGV4LAogICAgICAgICAgcnVuLCB0aW1lRGlzcGxheVR5cGUpXV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItc2xpZGVyIGRhdGEtcnVuJD0iW1tydW5dXSIgc3RlcD0iMSIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG1heD0iW1tfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBydW4pXV0iIHZhbHVlPSJbW19nZXRTdGVwKF9ydW5Ub1N0ZXBJbmRleCwgcnVuKV1dIiBvbi1pbW1lZGlhdGUtdmFsdWUtY2hhbmdlZD0iX3NsaWRlclZhbHVlQ2hhbmdlZCI+PC9wYXBlci1zbGlkZXI+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnJ1bi13aWRnZXQgewogICAgICAgIG1hcmdpbjogMTBweCAwIDAgMDsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIG1hcmdpbjogLThweCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLnN0ZXAtZGlzcGxheS1jb250YWluZXIgewogICAgICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICAgICAgbWFyZ2luOiAwIDE1cHggMCAwOwogICAgICB9CiAgICAgIC5ydW4tdGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC5ydW4tY29sb3ItYm94IHsKICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkscnVuVG9BdmFpbGFibGVUaW1lRW50cmllczpPYmplY3QscnVuVG9TdGVwOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlUnVuVG9TdGVwKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIF9ydW5Ub1N0ZXBJbmRleCkifSx0aW1lRGlzcGxheVR5cGU6U3RyaW5nLF9ydW5Ub1N0ZXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9ydW5zV2l0aFNsaWRlcnM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlUnVuc1dpdGhTbGlkZXJzKHJ1bnMsIHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMpIn19LG9ic2VydmVyczpbIl91cGRhdGVTdGVwc0Zvck5ld1J1bnMocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcykiXSxfY29tcHV0ZUNvbG9yRm9yUnVuKGEpe3JldHVybiBabC5ydW5zQ29sb3JTY2FsZShhKX0sX2NvbXB1dGVUaW1lVGV4dEZvclJ1bihhLApjLGQsZil7Yz1jW2RdO2lmKCFfLmlzTnVtYmVyKGMpKXJldHVybiIiO2E9YVtkXTtpZighYSlyZXR1cm4iIjthPWFbY11bZl07aWYoInN0ZXAiPT09ZilyZXR1cm5gc3RlcCAke2F9YDtpZigicmVsYXRpdmUiPT09ZilyZXR1cm4gMT5hP2AkeygxRTMqYSkudG9GaXhlZCgyKX0gbXNgOmAke2EudG9GaXhlZCgyKX0gc2A7aWYoIndhbGxfdGltZSI9PT1mKXJldHVybihuZXcgRGF0ZSgxRTMqYSkpLnRvU3RyaW5nKCk7dGhyb3cgRXJyb3IoYFRoZSBkaXNwbGF5IHR5cGUgb2YgJHtmfSBpcyBub3QgcmVjb2duaXplZC5gKTt9LF9zbGlkZXJWYWx1ZUNoYW5nZWQoYSl7Y29uc3QgYz1hLnRhcmdldC5kYXRhc2V0LnJ1bixkPWEudGFyZ2V0LmltbWVkaWF0ZVZhbHVlLGY9T2JqZWN0LmFzc2lnbih7fSx0aGlzLl9ydW5Ub1N0ZXBJbmRleCk7aXNOYU4oZCk/ZGVsZXRlIGZbY106ZltjXT1hLnRhcmdldC5pbW1lZGlhdGVWYWx1ZTt0aGlzLl9ydW5Ub1N0ZXBJbmRleD1mfSxfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihhLApjKXtyZXR1cm4oYT1hW2NdKSYmYS5sZW5ndGg/YS5sZW5ndGgtMTowfSxfdXBkYXRlU3RlcHNGb3JOZXdSdW5zKGEpe2NvbnN0IGM9T2JqZWN0LmFzc2lnbih7fSx0aGlzLl9ydW5Ub1N0ZXBJbmRleCk7Xy5mb3JPd24oYSwoZCxmKT0+e18uaXNOdW1iZXIoY1tmXSl8fChjW2ZdPWQubGVuZ3RoLTEpfSk7dGhpcy5fcnVuVG9TdGVwSW5kZXg9Y30sX2dldFN0ZXAoYSxjKXtyZXR1cm4gdGhpcy5fcnVuVG9TdGVwSW5kZXg/dGhpcy5fcnVuVG9TdGVwSW5kZXhbY106MH0sX2NvbXB1dGVSdW5Ub1N0ZXAoYSxjKXtjb25zdCBkPXt9O18uZm9yT3duKGMsKGYsZyk9Pntjb25zdCBsPWFbZ107bCYmKGRbZ109bFtmXS5zdGVwKX0pO3JldHVybiBkfSxfY29tcHV0ZVJ1bnNXaXRoU2xpZGVycyhhLGMpe3JldHVybiBhLmZpbHRlcihkPT5jW2RdKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lLXR5cGUtc2VsZWN0b3IiIG5hbWU9IlRpbWUgRGlzcGxheSBUeXBlIiBzZWxlY3RlZC1pZD0ie3tfdGltZURpc3BsYXlUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iIGlkPSJzdGVwcy1zZWxlY3Rvci1jb250YWluZXIiPgogICAgICAgICAgICA8dGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IgcnVucz0iW1tfcmVsZXZhbnRTZWxlY3RlZFJ1bnNdXSIgcnVuLXRvLXN0ZXA9Int7X3J1blRvU3RlcH19IiBydW4tdG8tYXZhaWxhYmxlLXRpbWUtZW50cmllcz0iW1tfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc11dIiB0aW1lLWRpc3BsYXktdHlwZT0iW1tfdGltZURpc3BsYXlUeXBlXV0iPjwvdGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gcHJlY2lzaW9u4oCTcmVjYWxsIGN1cnZlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtcHItY3VydmUtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bnM9IltbaXRlbS5ydW5zXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVucywgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVuLXRvLXN0ZXAtY2FwPSJbW19ydW5Ub1N0ZXBdXSI+PC90Zi1wci1jdXJ2ZS1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC8qKiBEbyBub3QgbGV0IHRoZSBzdGVwcyBzZWxlY3RvciBvY2NsdWRlIHRoZSBydW4gc2VsZWN0b3IuICovCiAgICAgICNzdGVwcy1zZWxlY3Rvci1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3RpbWVEaXNwbGF5VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3J1blRvVGFnSW5mbzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3JlbGV2YW50U2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJlbGV2YW50U2VsZWN0ZWRSdW5zKF9zZWxlY3RlZFJ1bnMsIF9ydW5Ub1RhZ0luZm8pIn0sX3J1bnNXaXRoUHJDdXJ2ZURhdGE6QXJyYXksX3J1blRvU3RlcDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSwKX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLlJlcXVlc3RNYW5hZ2VyfSxfc3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe1Byb21pc2UuYWxsKFt0aGlzLl9mZXRjaFRhZ3MoKSx0aGlzLl9mZXRjaFRpbWVFbnRyaWVzUGVyUnVuKCldKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkQ2FyZHMoKX0pfSxfc2hvdWxkT3BlbihhKXtyZXR1cm4gMj49YX0sX2ZldGNoVGFncygpe2NvbnN0IGE9UGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57aWYoIV8uaXNFcXVhbChjLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBkPV8ubWFwVmFsdWVzKGMsZj0+Xy5rZXlzKGYpKTtkPVBrLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1kLmxlbmd0aCk7CnRoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixjKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfZmV0Y2hUaW1lRW50cmllc1BlclJ1bigpe2NvbnN0IGE9UGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi9hdmFpbGFibGVfdGltZV9lbnRyaWVzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57Xy5mb3JPd24oYyxkPT57Xy5mb3JFYWNoKGQsZj0+e2YucmVsYXRpdmU9Zi53YWxsX3RpbWUtZFswXS53YWxsX3RpbWV9KX0pO3RoaXMuc2V0KCJfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllcyIsYyk7Yz1fLmtleXMoYykuc2xpY2UoKS5zb3J0KCk7Xy5pc0VxdWFsKGMsdGhpcy5fcnVuc1dpdGhQckN1cnZlRGF0YSl8fHRoaXMuc2V0KCJfcnVuc1dpdGhQckN1cnZlRGF0YSIsYyl9KX0sX3JlbG9hZENhcmRzKCl7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1wci1jdXJ2ZS1jYXJkIiksCmE9PnthLnJlbG9hZCgpfSl9LF9tYWtlQ2F0ZWdvcmllcyhhLGMsZCl7YT1fLm1hcFZhbHVlcyhhLGY9Pk9iamVjdC5rZXlzKGYpKTtyZXR1cm4gUWsuY2F0ZWdvcml6ZVRhZ3MoYSxjLGQpfSxfY29tcHV0ZUNvbG9yRm9yUnVuKGEpe3JldHVybiBabC5ydW5zQ29sb3JTY2FsZShhKX0sX2NvbXB1dGVSZWxldmFudFNlbGVjdGVkUnVucyhhLGMpe3JldHVybiBhLmZpbHRlcihkPT5jW2RdKX0sX3RhZ01ldGFkYXRhKGEsYyxkKXtjb25zdCBmPXt9O2MuZm9yRWFjaChnPT57ZltnXT1hW2ddW2RdfSk7Yz1kLnJlcGxhY2UoL1wvcHJfY3VydmVzJC8sIiIpO3JldHVybiBhbS5hZ2dyZWdhdGVUYWdJbmZvKGYsYyl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zcGlubmVyIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1zcGlubmVyLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJzcGlubmVyQ29udGFpbmVyIiBjbGFzcy1uYW1lPSJbW19fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXMoYWN0aXZlLCBfX2Nvb2xpbmdEb3duKV1dIiBvbi1hbmltYXRpb25lbmQ9Il9fcmVzZXQiIG9uLXdlYmtpdC1hbmltYXRpb24tZW5kPSJfX3Jlc2V0Ij4KICAgICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciBsYXllci0xIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+PC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciBsYXllci0yIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+PC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciBsYXllci0zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+PC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciBsYXllci00Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zcGlubmVyIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3JdfSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImlucHV0LXBpcGVsaW5lLWFuYWx5emVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1oZWFkZXIgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMjAwJTsKICAgICAgfQogICAgICAuc3ViLXNlY3Rpb24taGVhZGVyIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDE1MCU7CiAgICAgIH0KICAgICAgI3N1bW1hcnktaG9zdCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXRleHQgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTIwJTsKICAgICAgfQogICAgICAuc3RkZGV2LXRleHQgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KICAgICAgLmxlZnQtcGFuZSB7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgfQogICAgICAucmlnaHQtcGFuZSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgfQogICAgICAudGFibGUtc3R5bGUgewogICAgICAgIHRhYmxlLWxheW91dDogZml4ZWQ7CiAgICAgICAgd2lkdGg6IDk1JTsKICAgICAgfQogICAgICAucGVyZm9ybWFuY2UtdGFibGUgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIC54LWF4aXMtdGl0bGUgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgICAgfQogICAgICAueS1heGlzLXRpdGxlIHsKICAgICAgICB3cml0aW5nLW1vZGU6IGJ0LXJsOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7CiAgICAgIH0KICAgICAgI3JlY29tbWVuZGF0aW9uX2RldGFpbHMgewogICAgICAgIGNvbG9yOiBncmVlbjsKICAgICAgfQogICAgICAjcmVjb21tZW5kYXRpb25fZGV0YWlscyBhIHsKICAgICAgICBjb2xvcjogI2ZmMzNjYzsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjc3VtbWFyeV9jb25jbHVzaW9uIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZGVyOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBjb2xvcjogdmFyKC0tc3VtbWFyeS1jb2xvciwgZ3JlZW4pOwogICAgICB9CiAgICAgICNzdW1tYXJ5X25leHRzdGVwIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZGVyOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBjb2xvcjogZ3JlZW47CiAgICAgIH0KICAgICAgI3JlY29tbWVuZGF0aW9uX3RpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZGVyOwogICAgICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2PgogICAgICA8ZGl2IGlkPSJzZWN0aW9uX3N1bW1hcnkiPgogICAgICAgIDxkaXYgaWQ9InRpdGxlX3N1bW1hcnkiPgogICAgICAgICAgPHAgY2xhc3M9InNlY3Rpb24taGVhZGVyIj4KICAgICAgICAgICAgU2VjdGlvbiAxOiBTdW1tYXJ5IG9mIGlucHV0LXBpcGVsaW5lIGFuYWx5c2lzCiAgICAgICAgICAKICAgICAgICA8L2Rpdj4KICAgICAgICA8cD48c3BhbiBpZD0ic3VtbWFyeV9jb25jbHVzaW9uIj5bW19zdW1tYXJ5X2NvbmNsdXNpb25dXTwvc3Bhbj4KICAgICAgICA8cD4KICAgICAgICAgIDxzcGFuIGlkPSJyZWNvbW1lbmRhdGlvbl90aXRsZSI+UmVjb21tZW5kYXRpb24gZm9yIG5leHQgc3RlcDogPC9zcGFuPjxzcGFuIGlkPSJzdW1tYXJ5X25leHRzdGVwIj5bW19zdW1tYXJ5X25leHRzdGVwXV08L3NwYW4+CiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJzZWN0aW9uX2RldmljZV9zaWRlX2FuYWx5c2lzIiBoaWRkZW49IltbIV9zaG93X2RldmljZV9zaWRlX2FuYWx5c2lzXV0iPgogICAgICAgIDxkaXYgaWQ9InRpdGxlX2RldmljZV9zaWRlX2FuYWx5c2lzIj4KICAgICAgICAgIDxwIGNsYXNzPSJzZWN0aW9uLWhlYWRlciI+U2VjdGlvbiAyOiBEZXZpY2Utc2lkZSBhbmFseXNpcyBkZXRhaWxzCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ic2VjdGlvbl9kZXZpY2Vfc3RlcF90aW1lIj4KICAgICAgICAgIDxkaXYgaWQ9InRpdGxlX2RldmljZV9zdGVwX3RpbWUiPgogICAgICAgICAgICA8cCBjbGFzcz0ic3ViLXNlY3Rpb24taGVhZGVyIj5TZWN0aW9uIDIuMTogRGV2aWNlIHN0ZXAgdGltZQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlLXN0eWxlIj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVmdC1wYW5lIj4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJoaWdobGlnaHRlZC10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICBEZXZpY2Ugc3RlcC10aW1lIHN0YXRpc3RpY3MgKGluIG1zKQogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPkF2ZXJhZ2U6PC9iPiA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuPltbX3N0ZXB0aW1lX21zX2F2ZXJhZ2VdXSBtcyA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGRkZXYtdGV4dCI+KM+DID0gW1tfc3RlcHRpbWVfbXNfc3RkZGV2XV0gbXMpPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgPHNwYW4+PGI+UmFuZ2U6PC9iPiA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuPltbX3N0ZXB0aW1lX21zX21pbmltdW1dXSAtIFtbX3N0ZXB0aW1lX21zX21heGltdW1dXQogICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0ieS1heGlzLXRpdGxlIj5taWxsaXNlY29uZHM8L2Rpdj48L3RkPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0icmlnaHQtcGFuZSI+CiAgICAgICAgICAgICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImRldmljZV9zdGVwX2NoYXJ0IiBzdHlsZT0iaGVpZ2h0OjMwMHB4OyI+PC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgIDxkaXY+PHAgY2xhc3M9IngtYXhpcy10aXRsZSI+dHJhaW5pbmcgc3RlcCBudW1iZXI8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzZWN0aW9uX2RldmljZV9pbmZlZWRkZXFfdGltZSI+CiAgICAgICAgICA8ZGl2IGlkPSJ0aXRsZV9kZXZpY2VfaW5mZWVkZGVxX3RpbWUiPgogICAgICAgICAgICA8cCBjbGFzcz0ic3ViLXNlY3Rpb24taGVhZGVyIj4KICAgICAgICAgICAgICA8c3Bhbj5TZWN0aW9uIDIuMjogUmFuZ2Ugb2YgZGV2aWNlIHRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YQogICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8c3Bhbj48aSBzdHlsZT0ib3BhY2l0eTowLjUiPmFjcm9zcyBjb3JlczwvaT4gYXQgZWFjaCBzdGVwIDwvc3Bhbj4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUtc3R5bGUiPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWZ0LXBhbmUiPgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoaWdobGlnaHRlZC10ZXh0Ij4lIG9mIGRldmljZSBzdGVwIHRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgKGF2ZXJhZ2Ugb3ZlciB0aGUgbWF4aW11bSB3YWl0aW5nIHRpbWUgYWNyb3NzIGNvcmVzIGF0IGVhY2gKICAgICAgICAgICAgICAgICAgICBzdGVwKTwvc3Bhbj4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPkF2ZXJhZ2U6PC9iPiA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuPltbX2luZmVlZF9wZXJjZW50X2F2ZXJhZ2VdXSAlIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZGRldi10ZXh0Ij4oz4MgPSBbW19pbmZlZWRfcGVyY2VudF9zdGRkZXZdXSAlKTwvc3Bhbj4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPlJhbmdlOjwvYj4gPC9zcGFuPgogICAgICAgICAgICAgICAgICA8c3Bhbj5bW19pbmZlZWRfcGVyY2VudF9taW5pbXVtXV0gLSBbW19pbmZlZWRfcGVyY2VudF9tYXhpbXVtXV0KICAgICAgICAgICAgICAgICAgICAlPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ5LWF4aXMtdGl0bGUiPjxwPiUgb2YgZGV2aWNlIHN0ZXAgdGltZTwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyaWdodC1wYW5lIj4KICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBpZD0iZGV2aWNlX2luZmVlZF9jaGFydCIgc3R5bGU9ImhlaWdodDozMDBweDsiPjwvdnotbGluZS1jaGFydDI+CiAgICAgICAgICAgICAgICA8ZGl2PjxwIGNsYXNzPSJ4LWF4aXMtdGl0bGUiPnRyYWluaW5nIHN0ZXAgbnVtYmVyPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJzZWN0aW9uX2hvc3Rfc2lkZV9hbmFseXNpcyI+CiAgICAgICAgPGRpdiBpZD0idGl0bGVfaG9zdF9zaWRlX2FuYWx5c2lzIj4KICAgICAgICAgIDxwIGNsYXNzPSJzZWN0aW9uLWhlYWRlciI+U2VjdGlvbiAzOiBIb3N0LXNpZGUgYW5hbHlzaXMgZGV0YWlscwogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuJD0iW1shX3Nob3dfaG9zdF9zaWRlX2NoYXJ0XV0iPgogICAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OjMwMHB4OyIgaWQ9Imhvc3Rfc2lkZV9jaGFydCI+PC9kaXY+CiAgICAgICAgICA8cD4KICAgICAgICAgICAgPHNwYW4+PGI+V2hhdCBjYW4gYmUgZG9uZSB0byByZWR1Y2UgYWJvdmUgY29tcG9uZW50cyBvZiB0aGUgaG9zdCBpbnB1dAogICAgICAgICAgICAgICAgdGltZTo8L2I+PC9zcGFuPgogICAgICAgICAgCiAgICAgICAgICA8ZGl2IGlkPSJyZWNvbW1lbmRhdGlvbl9kZXRhaWxzIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbiQ9IltbX3Nob3dfaG9zdF9zaWRlX2NoYXJ0XV0iPgogICAgICAgICAgSG9zdCBzaWRlIGFuYWx5c2lzIGNhbiBub3QgYmUgZG9uZSB3aXRob3V0IGluc3RydW1lbnRhdGlvbi4KICAgICAgICA8L2Rpdj4KICAgICAgICA8cD4KICAgICAgICAgIENsaWNrIHRoZSAiU2hvdyIgYnV0dG9uIGJlbG93IHRvIHNlZSB0aGUgc291cmNlIGRhdGEgb2YgdGhlIGJyZWFrZG93bi4KICAgICAgICAKICAgICAgICA8YnV0dG9uIG9uLWNsaWNrPSJvbkNsaWNrIj5bW190b2dnbGVfYnV0dG9uX3RleHRdXTwvYnV0dG9uPgogICAgICAgIDx0YWJsZSBjbGFzcz0icGVyZm9ybWFuY2UtdGFibGUiIGhpZGRlbiQ9IltbIV9zaG93X2hvc3Rfc2lkZV90YWJsZV1dIj4KICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgPHRyPjx0aD5JbnB1dCBPcDwvdGg+CiAgICAgICAgICAgIDx0aD5Db3VudDwvdGg+CiAgICAgICAgICAgIDx0aD5Ub3RhbCBUaW1lIChpbiBtcyk8L3RoPgogICAgICAgICAgICA8dGg+VG90YWwgVGltZSAoYXMgJSBvZiB0b3RhbCBpbnB1dC1wcm9jZXNzaW5nIHRpbWUpPC90aD4KICAgICAgICAgICAgPHRoPlRvdGFsIFNlbGYgVGltZSAoaW4gbXMpPC90aD4KICAgICAgICAgICAgPHRoPlRvdGFsIFNlbGYgVGltZSAoYXMgJSBvZiB0b3RhbCBpbnB1dC1wcm9jZXNzaW5nIHRpbWUpPC90aD4KICAgICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD4KICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICA8dGJvZHkgaWQ9Imhvc3Rfc2lkZV90YWJsZV9jb250ZW50Ij48L3Rib2R5PgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWlucHV0LXBpcGVsaW5lL2lucHV0LXBpcGVsaW5lLWFuYWx5emVyLmh0bWwuanMKUG9seW1lcih7aXM6ImlucHV0LXBpcGVsaW5lLWFuYWx5emVyIixwcm9wZXJ0aWVzOntfZGF0YTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVWaWV3In0sX3Nob3dfZGV2aWNlX3NpZGVfYW5hbHlzaXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxub3RpZnk6ITB9LF9zaG93X2hvc3Rfc2lkZV9jaGFydDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMH0sX3Nob3dfaG9zdF9zaWRlX3RhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxfdG9nZ2xlX2J1dHRvbl90ZXh0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldFRvZ2dsZUJ1dHRvblRleHQoX3Nob3dfaG9zdF9zaWRlX3RhYmxlKSJ9LF9kZXZpY2VKc29uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9ob3N0SnNvbjp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfcmVjb21tZW5kYXRpb25Kc29uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsCm9ic2VydmVyOiJfb25BY3RpdmVDaGFuZ2VkIn0sX3N1bW1hcnlfY29uY2x1c2lvbjp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfc3VtbWFyeV9uZXh0c3RlcDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfaW5mZWVkX3BlcmNlbnRfYXZlcmFnZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfaW5mZWVkX3BlcmNlbnRfc3RkZGV2Ont0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9pbmZlZWRfcGVyY2VudF9taW5pbXVtOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9pbmZlZWRfcGVyY2VudF9tYXhpbXVtOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9zdGVwdGltZV9tc19hdmVyYWdlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9zdGVwdGltZV9tc19zdGRkZXY6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3N0ZXB0aW1lX21zX21pbmltdW06e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3N0ZXB0aW1lX21zX21heGltdW06e3R5cGU6U3RyaW5nLG5vdGlmeTohMH19LG9ic2VydmVyczpbIl9zaG93RGV2aWNlU3RlcENoYXJ0KF9kZXZpY2VKc29uKSIsCiJfc2hvd0RldmljZUluZmVlZENoYXJ0KF9kZXZpY2VKc29uKSIsIl9zaG93SG9zdENoYXJ0KF9ob3N0SnNvbikiLCJfc2hvd0hvc3RUYWJsZShfaG9zdEpzb24pIiwiX21ha2VSZWNvbW1lbmRhdGlvbnMoX3JlY29tbWVuZGF0aW9uSnNvbikiXSxvbkNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9zaG93X2hvc3Rfc2lkZV90YWJsZSIsIXRoaXMuX3Nob3dfaG9zdF9zaWRlX3RhYmxlKX0sX29uQWN0aXZlQ2hhbmdlZDpmdW5jdGlvbihhKXthfHwodGhpcy5fc2hvd19ob3N0X3NpZGVfdGFibGU9dGhpcy5fc2hvd19ob3N0X3NpZGVfY2hhcnQ9dGhpcy5fc2hvd19kZXZpY2Vfc2lkZV9hbmFseXNpcz0hMSl9LF9nZXRUb2dnbGVCdXR0b25UZXh0OmZ1bmN0aW9uKGEpe3JldHVybihhPyJIaWRlIjoiU2hvdyIpKyIgSW5wdXQgT3AgU3RhdGlzdGljcyJ9LF91c1RvTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKE51bWJlcihhKSkvMUUzfSxfdXBkYXRlVmlldzpmdW5jdGlvbigpe2lmKHRoaXMuX2RhdGEmJgp0aGlzLl9hY3RpdmUpe3ZhciBhPXRoaXMuX2RhdGFbMF07dGhpcy5fZGV2aWNlSnNvbj1hO3RoaXMuX2hvc3RKc29uPXRoaXMuX2RhdGFbMl07dGhpcy5fcmVjb21tZW5kYXRpb25Kc29uPXRoaXMuX2RhdGFbM107dGhpcy5fc3VtbWFyeV9jb25jbHVzaW9uPWEucC5zdW1tYXJ5X2NvbmNsdXNpb247dGhpcy5fc3VtbWFyeV9uZXh0c3RlcD1hLnAuc3VtbWFyeV9uZXh0c3RlcDt0aGlzLl9pbmZlZWRfcGVyY2VudF9hdmVyYWdlPWEucC5pbmZlZWRfcGVyY2VudF9hdmVyYWdlO3RoaXMuX2luZmVlZF9wZXJjZW50X3N0ZGRldj1hLnAuaW5mZWVkX3BlcmNlbnRfc3RhbmRhcmRfZGV2aWF0aW9uO3RoaXMuX2luZmVlZF9wZXJjZW50X21pbmltdW09YS5wLmluZmVlZF9wZXJjZW50X21pbmltdW07dGhpcy5faW5mZWVkX3BlcmNlbnRfbWF4aW11bT1hLnAuaW5mZWVkX3BlcmNlbnRfbWF4aW11bTt0aGlzLl9zdGVwdGltZV9tc19hdmVyYWdlPWEucC5zdGVwdGltZV9tc19hdmVyYWdlO3RoaXMuX3N0ZXB0aW1lX21zX3N0ZGRldj0KYS5wLnN0ZXB0aW1lX21zX3N0YW5kYXJkX2RldmlhdGlvbjt0aGlzLl9zdGVwdGltZV9tc19taW5pbXVtPWEucC5zdGVwdGltZV9tc19taW5pbXVtO3RoaXMuX3N0ZXB0aW1lX21zX21heGltdW09YS5wLnN0ZXB0aW1lX21zX21heGltdW07dGhpcy5fc3VtbWFyeV9jb25jbHVzaW9uLmluY2x1ZGVzKCJISUdITFkiKT90aGlzLmN1c3RvbVN0eWxlWyItLXN1bW1hcnktY29sb3IiXT0icmVkIjp0aGlzLl9zdW1tYXJ5X2NvbmNsdXNpb24uaW5jbHVkZXMoIk1PREVSQVRFIikmJih0aGlzLmN1c3RvbVN0eWxlWyItLXN1bW1hcnktY29sb3IiXT0ib3JhbmdlIik7dGhpcy51cGRhdGVTdHlsZXMoKX19LF9zaG93RGV2aWNlU3RlcENoYXJ0OmZ1bmN0aW9uKGEpe2lmKGEmJjAhPWEucm93cy5sZW5ndGgmJnRoaXMuX2FjdGl2ZSl7dGhpcy5fc2hvd19kZXZpY2Vfc2lkZV9hbmFseXNpcz0hMDt2YXIgYz1bXSxkPVtdLGY9MCxnPS0xO2Eucm93cy5mb3JFYWNoKGZ1bmN0aW9uKGwpe2c9MDxnPysrZzoKTnVtYmVyKGwuY1swXS52KTtjLnB1c2goe3NjYWxhcjpsLmNbMV0udixzdGVwOmcsdHB1X3N0ZXA6TnVtYmVyKGwuY1swXS52KSxsb3dfd2F0ZXJtYXJrOjB9KTtkLnB1c2goe3NjYWxhcjpsLmNbMV0uditsLmNbMl0udixzdGVwOmcsbG93X3dhdGVybWFyazpsLmNbMV0udn0pO2Y9TWF0aC5tYXgoZixsLmNbMV0uditsLmNbMl0udil9KTtpZihhPXRoaXMuJC5kZXZpY2Vfc3RlcF9jaGFydClhLnNldFZpc2libGVTZXJpZXMoWyJkZXZpY2Ugc3RlcCB0aW1lIiwiY29tcHV0ZSB0aW1lIl0pLGEuc2V0U2VyaWVzRGF0YSgiZGV2aWNlIHN0ZXAgdGltZSIsZCksYS5zZXRTZXJpZXNEYXRhKCJjb21wdXRlIHRpbWUiLGMpLGEuZGVmYXVsdFlSYW5nZT1bMCwxLjEqZl0sYS5zbW9vdGhpbmdFbmFibGVkPSExLGEudG9vbHRpcENvbHVtbnM9W3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6bD0+bC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJUaW1lKG1zKSIsZXZhbHVhdGU6bD0+bC5kYXR1bS5zY2FsYXIudG9GaXhlZCgyKX0sCnt0aXRsZToiU3RlcCIsZXZhbHVhdGU6bD0+bC5kYXR1bS5zdGVwfV0sYS5maWxsQXJlYT17aGlnaGVyQWNjZXNzb3I6bD0+bC5zY2FsYXIsbG93ZXJBY2Nlc3NvcjpsPT5sLmxvd193YXRlcm1hcmt9LGEueEF4aXNGb3JtYXR0ZXI9ZDMuZm9ybWF0KCJkIil9ZWxzZSB0aGlzLl9zaG93X2RldmljZV9zaWRlX2FuYWx5c2lzPSExfSxfc2hvd0RldmljZUluZmVlZENoYXJ0OmZ1bmN0aW9uKGEpe2lmKGEmJjAhPWEucm93cy5sZW5ndGgpe3ZhciBjPVtdLGQ9LTE7YS5yb3dzLmZvckVhY2goZnVuY3Rpb24oZil7ZD0wPGQ/KytkOk51bWJlcihmLmNbMF0udik7Yy5wdXNoKHtzdGVwOmQsdHB1X3N0ZXA6TnVtYmVyKGYuY1swXS52KSxzY2FsYXI6Zi5jWzRdLnYsbWluOmYuY1s1XS52LG1heDpmLmNbNl0udn0pfSk7aWYoYT10aGlzLiQuZGV2aWNlX2luZmVlZF9jaGFydClhLnNldFZpc2libGVTZXJpZXMoWyJpbnB1dCB0aW1lJSJdKSxhLnNldFNlcmllc0RhdGEoImlucHV0IHRpbWUlIixjKSwKYS50b29sdGlwQ29sdW1ucz1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpmPT5mLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOmY9PmYuZGF0dW0udHB1X3N0ZXB9LHt0aXRsZToiQXZlcmFnZSglKSIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS5zY2FsYXIudG9GaXhlZCg0KSsiJSJ9LHt0aXRsZToiTWluKCUpIixldmFsdWF0ZTpmPT5mLmRhdHVtLm1pbi50b0ZpeGVkKDQpKyIlIn0se3RpdGxlOiJNYXgoJSkiLGV2YWx1YXRlOmY9PmYuZGF0dW0ubWF4LnRvRml4ZWQoNCkrIiUifV0sYS5maWxsQXJlYT17aGlnaGVyQWNjZXNzb3I6Zj0+Zi5tYXgsbG93ZXJBY2Nlc3NvcjpmPT5mLm1pbn0sYS54QXhpc0Zvcm1hdHRlcj1kMy5mb3JtYXQoImQiKX1lbHNlIHRoaXMuX3Nob3dfZGV2aWNlX3NpZGVfYW5hbHlzaXM9ITF9LF9zaG93SG9zdENoYXJ0OmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPXRoaXMuX3VzVG9NcyhhLnAudW5jbGFzc2lmaWVkX25vbmVxdWV1ZV91cyksCmQ9dGhpcy5fdXNUb01zKGEucC5kZW1hbmRlZF9maWxlX3JlYWRfdXMpLGY9dGhpcy5fdXNUb01zKGEucC5hZHZhbmNlZF9maWxlX3JlYWRfdXMpLGc9dGhpcy5fdXNUb01zKGEucC5wcmVwcm9jZXNzaW5nX3VzKTthPXRoaXMuX3VzVG9NcyhhLnAuZW5xdWV1ZV91cyk7dmFyIGw9YytkK2YrZythO3RoaXMuX3Nob3dfaG9zdF9zaWRlX2NoYXJ0PTA8bDswPGwmJihmPVt7TmFtZToiT3RoZXIgZGF0YSByZWFkaW5nIG9yIHByb2Nlc3NpbmciLFRvdGFsOmMvbCoxMDB9LHtOYW1lOiJSZWFkaW5nIGRhdGEgZnJvbSBmaWxlcyBvbiBkZW1hbmQiLFRvdGFsOmQvbCoxMDB9LHtOYW1lOiJSZWFkaW5nIGRhdGEgZnJvbSBmaWxlcyBpbiBhZHZhbmNlIFtpbmNsdWRpbmcgY2FjaGluZywgcHJlZmV0Y2hpbmcsIGludGVybGVhdmluZ10iLFRvdGFsOmYvbCoxMDB9LHtOYW1lOiJEYXRhIHByZXByb2Nlc3NpbmciLFRvdGFsOmcvbCoxMDB9LHtOYW1lOiJFbnF1ZXVpbmcgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCB0byBkZXZpY2UiLApUb3RhbDphL2wqMTAwfV0sZz1uZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcixkPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5MZWdlbmQoZyksYz1kMy5zZWxlY3QodGhpcy4kLmhvc3Rfc2lkZV9jaGFydCksZj0obmV3IFBsb3R0YWJsZS5QbG90cy5QaWUpLmF0dHIoImZpbGwiLGZ1bmN0aW9uKGspe3JldHVybiBrLk5hbWV9LGcpLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KGYpKS5zZWN0b3JWYWx1ZShmdW5jdGlvbihrKXtyZXR1cm4gay5Ub3RhbH0pLmxhYmVsc0VuYWJsZWQoITApLmxhYmVsRm9ybWF0dGVyKGZ1bmN0aW9uKGspe3JldHVybiBOdW1iZXIoaykudG9GaXhlZCgyKSsiJSJ9KSxkPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW2YsZF1dKSxjLnNlbGVjdCgiKiIpLnJlbW92ZSgpLGQucmVuZGVyVG8oYykpfX0sX3Nob3dIb3N0VGFibGU6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9dGhpcy4kLmhvc3Rfc2lkZV90YWJsZV9jb250ZW50O2MuaW5uZXJIVE1MPQoiIjt0aGlzLl9zaG93X2hvc3Rfc2lkZV90YWJsZT0hMTswIT1hLnJvd3MubGVuZ3RoJiZhLnJvd3MuZm9yRWFjaChmdW5jdGlvbihkKXtsZXQgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpO1BvbHltZXIuZG9tKGMpLmFwcGVuZENoaWxkKGYpO2xldCBnPVtdO2cucHVzaChkLmNbMF0udik7Zy5wdXNoKGQuY1sxXS52KTtnLnB1c2goZC5jWzJdLnYudG9GaXhlZCgyKSk7Zy5wdXNoKCgxMDAqZC5jWzNdLnYpLnRvRml4ZWQoMikrIiUiKTtnLnB1c2goZC5jWzRdLnYudG9GaXhlZCgyKSk7Zy5wdXNoKCgxMDAqZC5jWzVdLnYpLnRvRml4ZWQoMikrIiUiKTtnLnB1c2goZC5jWzZdLnYpO2cuZm9yRWFjaChmdW5jdGlvbihsKXtsZXQgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO1BvbHltZXIuZG9tKGYpLmFwcGVuZENoaWxkKGspO1BvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGwpKX0pfSl9fSxfbWFrZVJlY29tbWVuZGF0aW9uczpmdW5jdGlvbihhKXtpZihhKXt2YXIgYz0KIiI7YS5yb3dzLmZvckVhY2goZnVuY3Rpb24oZCl7Yys9Ilx4M2NsaVx4M2UiK2QuY1swXS52KyJceDNjL2xpXHgzZSJ9KTt0aGlzLiQucmVjb21tZW5kYXRpb25fZGV0YWlscy5pbm5lckhUTUw9Y319LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aXZlPSEwO3RoaXMuX3VwZGF0ZVZpZXcoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hY3RpdmU9ITF9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taW1hZ2UiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI2Jhc2VVUklBbmNob3IgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNzaXplZEltZ0RpdiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHJpZ2h0OiAwcHg7CiAgICAgICAgYm90dG9tOiAwcHg7CiAgICAgICAgbGVmdDogMHB4OwoKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAjaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogdmFyKC0taXJvbi1pbWFnZS13aWR0aCwgYXV0byk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1pcm9uLWltYWdlLWhlaWdodCwgYXV0byk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtzaXppbmddKSAjc2l6ZWRJbWdEaXYgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbc2l6aW5nXSkgI2ltZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgI3BsYWNlaG9sZGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgcmlnaHQ6IDBweDsKICAgICAgICBib3R0b206IDBweDsKICAgICAgICBsZWZ0OiAwcHg7CgogICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7CiAgICAgICAgb3BhY2l0eTogMTsKCiAgICAgICAgQGFwcGx5IC0taXJvbi1pbWFnZS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgI3BsYWNlaG9sZGVyLmZhZGVkLW91dCB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzIGxpbmVhcjsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxhIGlkPSJiYXNlVVJJQW5jaG9yIiBocmVmPSIjIj48L2E+CiAgICA8ZGl2IGlkPSJzaXplZEltZ0RpdiIgcm9sZT0iaW1nIiBoaWRkZW4kPSJbW19jb21wdXRlSW1nRGl2SGlkZGVuKHNpemluZyldXSIgYXJpYS1oaWRkZW4kPSJbW19jb21wdXRlSW1nRGl2QVJJQUhpZGRlbihhbHQpXV0iIGFyaWEtbGFiZWwkPSJbW19jb21wdXRlSW1nRGl2QVJJQUxhYmVsKGFsdCwgc3JjKV1dIj48L2Rpdj4KICAgIDxpbWcgaWQ9ImltZyIgYWx0JD0iW1thbHRdXSIgaGlkZGVuJD0iW1tfY29tcHV0ZUltZ0hpZGRlbihzaXppbmcpXV0iIGNyb3Nzb3JpZ2luJD0iW1tjcm9zc29yaWdpbl1dIiBvbi1sb2FkPSJfaW1nT25Mb2FkIiBvbi1lcnJvcj0iX2ltZ09uRXJyb3IiPgogICAgPGRpdiBpZD0icGxhY2Vob2xkZXIiIGhpZGRlbiQ9IltbX2NvbXB1dGVQbGFjZWhvbGRlckhpZGRlbihwcmVsb2FkLCBmYWRlLCBsb2FkaW5nLCBsb2FkZWQpXV0iIGNsYXNzJD0iW1tfY29tcHV0ZVBsYWNlaG9sZGVyQ2xhc3NOYW1lKHByZWxvYWQsIGZhZGUsIGxvYWRpbmcsIGxvYWRlZCldXSI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24taW1hZ2UvaXJvbi1pbWFnZS5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWltYWdlIixwcm9wZXJ0aWVzOntzcmM6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbHQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGNyb3Nzb3JpZ2luOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxwcmV2ZW50TG9hZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzaXppbmc6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGwscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImNlbnRlciJ9LHByZWxvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGwsb2JzZXJ2ZXI6Il9wbGFjZWhvbGRlckNoYW5nZWQifSxmYWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGxvYWRlZDp7bm90aWZ5OiEwLHJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbG9hZGluZzp7bm90aWZ5OiEwLHJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZXJyb3I6e25vdGlmeTohMCwKcmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExfSx3aWR0aDp7b2JzZXJ2ZXI6Il93aWR0aENoYW5nZWQiLHR5cGU6TnVtYmVyLHZhbHVlOm51bGx9LGhlaWdodDp7b2JzZXJ2ZXI6Il9oZWlnaHRDaGFuZ2VkIix0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX3RyYW5zZm9ybUNoYW5nZWQoc2l6aW5nLCBwb3NpdGlvbikiLCJfbG9hZFN0YXRlT2JzZXJ2ZXIoc3JjLCBwcmV2ZW50TG9hZCkiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVzb2x2ZWRTcmM9IiJ9LF9pbWdPbkxvYWQ6ZnVuY3Rpb24oKXt0aGlzLiQuaW1nLnNyYz09PXRoaXMuX3Jlc29sdmVTcmModGhpcy5zcmMpJiYodGhpcy5fc2V0TG9hZGluZyghMSksdGhpcy5fc2V0TG9hZGVkKCEwKSx0aGlzLl9zZXRFcnJvcighMSkpfSxfaW1nT25FcnJvcjpmdW5jdGlvbigpe3RoaXMuJC5pbWcuc3JjPT09dGhpcy5fcmVzb2x2ZVNyYyh0aGlzLnNyYykmJih0aGlzLiQuaW1nLnJlbW92ZUF0dHJpYnV0ZSgic3JjIiksCnRoaXMuJC5zaXplZEltZ0Rpdi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9IiIsdGhpcy5fc2V0TG9hZGluZyghMSksdGhpcy5fc2V0TG9hZGVkKCExKSx0aGlzLl9zZXRFcnJvcighMCkpfSxfY29tcHV0ZVBsYWNlaG9sZGVySGlkZGVuOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMucHJlbG9hZHx8IXRoaXMuZmFkZSYmIXRoaXMubG9hZGluZyYmdGhpcy5sb2FkZWR9LF9jb21wdXRlUGxhY2Vob2xkZXJDbGFzc05hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmVsb2FkJiZ0aGlzLmZhZGUmJiF0aGlzLmxvYWRpbmcmJnRoaXMubG9hZGVkPyJmYWRlZC1vdXQiOiIifSxfY29tcHV0ZUltZ0RpdkhpZGRlbjpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNpemluZ30sX2NvbXB1dGVJbWdEaXZBUklBSGlkZGVuOmZ1bmN0aW9uKCl7cmV0dXJuIiI9PT10aGlzLmFsdD8idHJ1ZSI6dm9pZCAwfSxfY29tcHV0ZUltZ0RpdkFSSUFMYWJlbDpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5hbHQ/dGhpcy5hbHQ6CiIiPT09dGhpcy5zcmM/IiI6dGhpcy5fcmVzb2x2ZVNyYyh0aGlzLnNyYykucmVwbGFjZSgvWz98I10uKi9nLCIiKS5zcGxpdCgiLyIpLnBvcCgpfSxfY29tcHV0ZUltZ0hpZGRlbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5zaXppbmd9LF93aWR0aENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLndpZHRoPWlzTmFOKHRoaXMud2lkdGgpP3RoaXMud2lkdGg6dGhpcy53aWR0aCsicHgifSxfaGVpZ2h0Q2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUuaGVpZ2h0PWlzTmFOKHRoaXMuaGVpZ2h0KT90aGlzLmhlaWdodDp0aGlzLmhlaWdodCsicHgifSxfbG9hZFN0YXRlT2JzZXJ2ZXI6ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLl9yZXNvbHZlU3JjKGEpO2QhPT10aGlzLl9yZXNvbHZlZFNyYyYmKHRoaXMuX3Jlc29sdmVkU3JjPSIiLHRoaXMuJC5pbWcucmVtb3ZlQXR0cmlidXRlKCJzcmMiKSx0aGlzLiQuc2l6ZWRJbWdEaXYuc3R5bGUuYmFja2dyb3VuZEltYWdlPSIiLCIiPT09CmF8fGM/dGhpcy5fc2V0TG9hZGluZyghMSk6KHRoaXMuX3Jlc29sdmVkU3JjPWQsdGhpcy4kLmltZy5zcmM9dGhpcy5fcmVzb2x2ZWRTcmMsdGhpcy4kLnNpemVkSW1nRGl2LnN0eWxlLmJhY2tncm91bmRJbWFnZT0ndXJsKCInK3RoaXMuX3Jlc29sdmVkU3JjKyciKScsdGhpcy5fc2V0TG9hZGluZyghMCkpLHRoaXMuX3NldExvYWRlZCghMSksdGhpcy5fc2V0RXJyb3IoITEpKX0sX3BsYWNlaG9sZGVyQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuJC5wbGFjZWhvbGRlci5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9dGhpcy5wbGFjZWhvbGRlcj8ndXJsKCInK3RoaXMucGxhY2Vob2xkZXIrJyIpJzoiIn0sX3RyYW5zZm9ybUNoYW5nZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiQuc2l6ZWRJbWdEaXYuc3R5bGUsYz10aGlzLiQucGxhY2Vob2xkZXIuc3R5bGU7YS5iYWNrZ3JvdW5kU2l6ZT1jLmJhY2tncm91bmRTaXplPXRoaXMuc2l6aW5nO2EuYmFja2dyb3VuZFBvc2l0aW9uPWMuYmFja2dyb3VuZFBvc2l0aW9uPQp0aGlzLnNpemluZz90aGlzLnBvc2l0aW9uOiIiO2EuYmFja2dyb3VuZFJlcGVhdD1jLmJhY2tncm91bmRSZXBlYXQ9dGhpcy5zaXppbmc/Im5vLXJlcGVhdCI6IiJ9LF9yZXNvbHZlU3JjOmZ1bmN0aW9uKGEpe2E9UG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVVcmwoYSx0aGlzLiQuYmFzZVVSSUFuY2hvci5ocmVmKTsiLyI9PT1hWzBdJiYoYT0obG9jYXRpb24ub3JpZ2lufHxsb2NhdGlvbi5wcm90b2NvbCsiLy8iK2xvY2F0aW9uLmhvc3QpK2EpO3JldHVybiBhfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2FyZC1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItY2FyZDsKICAgICAgfQoKICAgICAgLyogSUUgMTAgc3VwcG9ydCBmb3IgSFRNTDUgaGlkZGVuIGF0dHIgKi8KICAgICAgOmhvc3QoW2hpZGRlbl0pLCBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaGVhZGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogaW5oZXJpdDsKICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogaW5oZXJpdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1jYXJkLWhlYWRlcjsKICAgICAgfQoKICAgICAgLmhlYWRlciBpcm9uLWltYWdlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAtLWlyb24taW1hZ2Utd2lkdGg6IDEwMCU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWNhcmQtaGVhZGVyLWltYWdlOwogICAgICB9CgogICAgICAuaGVhZGVyIC50aXRsZS10ZXh0IHsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jYXJkLWhlYWRlci1jb2xvciwgIzAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWNhcmQtaGVhZGVyLXRleHQ7CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgLnRpdGxlLXRleHQub3Zlci1pbWFnZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1jYXJkLWhlYWRlci1pbWFnZS10ZXh0OwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoLmNhcmQtY29udGVudCkgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWNhcmQtY29udGVudDsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKC5jYXJkLWFjdGlvbnMpIHsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U4ZThlODsKICAgICAgICBwYWRkaW5nOiA1cHggMTZweDsKICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItY2FyZC1hY3Rpb25zOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIxIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMiJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjMiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0zOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI0Il0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4KICAgICAgPGlyb24taW1hZ2UgaGlkZGVuJD0iW1shaW1hZ2VdXSIgYXJpYS1oaWRkZW4kPSJbW19pc0hpZGRlbihpbWFnZSldXSIgc3JjPSJbW2ltYWdlXV0iIGFsdD0iW1thbHRdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJJbWFnZV1dIiBwcmVsb2FkPSJbW3ByZWxvYWRJbWFnZV1dIiBmYWRlPSJbW2ZhZGVJbWFnZV1dIj48L2lyb24taW1hZ2U+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shaGVhZGluZ11dIiBjbGFzcyQ9InRpdGxlLXRleHQgW1tfY29tcHV0ZUhlYWRpbmdDbGFzcyhpbWFnZSldXSI+W1toZWFkaW5nXV08L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItY2FyZC9wYXBlci1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWNhcmQiLHByb3BlcnRpZXM6e2hlYWRpbmc6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJfaGVhZGluZ0NoYW5nZWQifSxpbWFnZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGFsdDp7dHlwZTpTdHJpbmd9LHByZWxvYWRJbWFnZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxmYWRlSW1hZ2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0scGxhY2Vob2xkZXJJbWFnZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZWxldmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZToxLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sYW5pbWF0ZWRTaGFkb3c6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYW5pbWF0ZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlQW5pbWF0ZWQoYW5pbWF0ZWRTaGFkb3cpIn19LF9pc0hpZGRlbjpmdW5jdGlvbihhKXtyZXR1cm4gYT8iZmFsc2UiOiJ0cnVlIn0sX2hlYWRpbmdDaGFuZ2VkOmZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLmdldEF0dHJpYnV0ZSgiaGVhZGluZyIpLGQ9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTsic3RyaW5nIj09PXR5cGVvZiBkJiZkIT09Y3x8dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGEpfSxfY29tcHV0ZUhlYWRpbmdDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gYT8iIG92ZXItaW1hZ2UiOiIifSxfY29tcHV0ZUFuaW1hdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJvdmVydmlldy1wYWdlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIG1hcmdpbjogNXB4OwogICAgICAgIC0tcGFwZXItY2FyZC1oZWFkZXItY29sb3I6ICNmNWY1ZjU7CiAgICAgICAgLS1wYXBlci1jYXJkLWhlYWRlcjogewogICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzQyODVmNDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLmZsZXgtaG9yaXpvbnRhbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KICAgICAgLnN0ZXB0aW1lLWF2ZXJhZ2UgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBjb2xvcjogdmFyKC0tc3VtbWFyeS1jb2xvciwgZ3JlZW4pOwogICAgICB9CiAgICAgIC50YWJsZS1zdHlsZSB7CiAgICAgICAgdGFibGUtbGF5b3V0OiBhdXRvOwogICAgICAgIHdpZHRoOiA5NSU7CiAgICAgIH0KICAgICAgLnRvcC1vcHMtdGFibGUgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIHZ6LWxpbmUtY2hhcnQyLnN0ZXAtZ3JhcGggewogICAgICAgIHdpZHRoOiA4NjBweDsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICB9CiAgICAgIC54LWF4aXMtdGl0bGUgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOwogICAgICB9CiAgICAgIC55LWF4aXMtdGl0bGUgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIHdyaXRpbmctbW9kZTogYnQtcmw7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgICAgfQogICAgICBkaXYuYm90dGxlbmVjay1zdGF0ZW1lbnQgewogICAgICAgIGNvbG9yOiB2YXIoLS1zdW1tYXJ5LWNvbG9yLCBncmVlbik7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGRlcjsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KICAgICAgZGl2LmVycm9yTWVzc2FnZSB7CiAgICAgICAgY29sb3I6IHJlZDsKICAgICAgICBmb250LXNpemU6IDAuNWNtOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkZXI7CiAgICAgICAgbWFyZ2luLXRvcDogMC41Y207CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41Y207CiAgICAgIH0KICAgICAgZGl2LmJvdHRsZW5lY2tUaXBzIHsKICAgICAgICBjb2xvcjogIzAwMDAwMDsKICAgICAgfQogICAgICBkaXYuYm90dGxlbmVja1RpcHMgYSB7CiAgICAgICAgY29sb3I6ICNmZjMzY2M7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgZGl2LmRvY3VtZW50YXRpb25UaXBzIHsKICAgICAgICBjb2xvcjogIzY2NjY5OTsKICAgICAgfQogICAgICBkaXYuZG9jdW1lbnRhdGlvblRpcHMgYSB7CiAgICAgICAgY29sb3I6ICMzM2NjMDA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJlcnJvck1lc3NhZ2UiIGhpZGRlbj0iW1shX2Vycm9yX21lc3NhZ2VdXSI+CiAgICAgIDxzcGFuPltbX2Vycm9yX21lc3NhZ2VdXTwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdiBoaWRkZW49IltbX2Vycm9yX21lc3NhZ2VdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciBmbGV4LWhvcml6b250YWwiPgogICAgICAgIDxwYXBlci1jYXJkIGhlYWRpbmc9IlBlcmZvcm1hbmNlIFN1bW1hcnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgPGI+QXZlcmFnZSBzdGVwIHRpbWU8L2I+IChsb3dlciBpcyBiZXR0ZXIpOgogICAgICAgICAgICAgIDxiPjxzcGFuIGNsYXNzPSJzdGVwdGltZS1hdmVyYWdlIj5bW19zdGVwdGltZV9tc19hdmVyYWdlXV0gbXM8L3NwYW4+CiAgICAgICAgICAgICAgPC9iPgogICAgICAgICAgICAgIDxpIHN0eWxlPSJvcGFjaXR5OjAuNyI+KHN0YW5kYXJkIGRldmlhdGlvbiA9CiAgICAgICAgICAgICAgICA8c3Bhbj5bW19zdGVwdGltZV9tc19zdGRkZXZdXTwvc3Bhbj4gbXMpPC9pPgogICAgICAgICAgICAKICAgICAgICAgICAgPHVsIGhpZGRlbiQ9IltbIV9pbmZlZWRfbXNfYXZlcmFnZV1dIj4KICAgICAgICAgICAgICA8bGk+QXZlcmFnZSBpbmZlZWQ6IDxzcGFuPltbX2luZmVlZF9tc19hdmVyYWdlXV08L3NwYW4+IG1zPC9saT4KICAgICAgICAgICAgICA8bGk+QXZlcmFnZSBjb21wdXRlOiA8c3Bhbj5bW19jb21wdXRlX21zX2F2ZXJhZ2VdXTwvc3Bhbj4gbXM8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICA8Yj5Ib3N0IGlkbGUgdGltZTwvYj4gKGxvd2VyIGlzIGJldHRlcik6CiAgICAgICAgICAgICAgPHNwYW4+W1tfaG9zdF9pZGxlX3RpbWVfcGVyY2VudF1dPC9zcGFuPgogICAgICAgICAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgPGI+VFBVIGlkbGUgdGltZTwvYj4gKGxvd2VyIGlzIGJldHRlcik6CiAgICAgICAgICAgICAgPHNwYW4+W1tfZGV2aWNlX2lkbGVfdGltZV9wZXJjZW50XV08L3NwYW4+CiAgICAgICAgICAgIAogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICA8Yj5VdGlsaXphdGlvbiBvZiBUUFUgTWF0cml4IFVuaXRzPC9iPiAoaGlnaGVyIGlzIGJldHRlcik6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbXh1X3V0aWxpemF0aW9uX3BlcmNlbnRdXTwvc3Bhbj4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3BhcGVyLWNhcmQ+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0iU3RlcC10aW1lIEdyYXBoIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCIgaGlkZGVuPSJbWyFfc2hvd19zdGVwX3RpbWVfZ3JhcGhdXSI+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUtc3R5bGUiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPSJ5LWF4aXMtdGl0bGUiPm1pbGxpc2Vjb25kczwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBjbGFzcz0ic3RlcC1ncmFwaCIgaWQ9ImRldmljZV9zdGVwX2NoYXJ0Ij4KICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgPGRpdj48cCBjbGFzcz0ieC1heGlzLXRpdGxlIj50cmFpbmluZyBzdGVwIG51bWJlcjwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGZsZXgtaG9yaXpvbnRhbCI+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZyQ9IltbX3RvcF9vcHNfaGVhZGluZ11dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+CiAgICAgICAgICAgIDxidXR0b24gb24tY2xpY2s9Im9uQ2xpY2tUb3BPcHMiPltbX3RvcF9vcHNfYnV0dG9uX3RleHRdXTwvYnV0dG9uPgogICAgICAgICAgICA8dGhyZWFkPgogICAgICAgICAgICAgICAgPC90aHJlYWQ+PHRhYmxlIGNsYXNzPSJ0b3Atb3BzLXRhYmxlIiBoaWRkZW4kPSJbWyFfc2hvd190b3Bfb3BzX3RhYmxlXV0iPgogICAgICAgICAgICAgIDx0cj48dGg+VGltZSAoJSk8L3RoPgogICAgICAgICAgICAgICAgPHRoPkN1bXVsYXRpdmUgdGltZSAoJSk8L3RoPgogICAgICAgICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD4KICAgICAgICAgICAgICAgIDx0aD5PcGVyYXRpb248L3RoPgogICAgICAgICAgICAgICAgPHRoPkdGbG9wcy9zZWM8L3RoPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDx0Ym9keSBpZD0idG9wX29wc190YWJsZV9jb250ZW50Ij48L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGZsZXgtaG9yaXpvbnRhbCI+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0iUnVuIEVudmlyb25tZW50Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+CiAgICAgICAgICAgIDxwPjxiPk51bWJlciBvZiBIb3N0cyB1c2VkPC9iPjogPHNwYW4+W1tfaG9zdF9jb3VudF1dPC9zcGFuPgogICAgICAgICAgICA8cD48Yj5UUFUgdHlwZTwvYj46IENsb3VkIFRQVQogICAgICAgICAgICA8cD48Yj5OdW1iZXIgb2YgVFBVIGNvcmVzPC9iPjogPHNwYW4+IFtbX3RwdV9jb3JlX2NvdW50XV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3BhcGVyLWNhcmQ+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0iUmVjb21tZW5kYXRpb24gZm9yIE5leHQgU3RlcHMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm90dGxlbmVjay1zdGF0ZW1lbnQiPjxzcGFuPltbX3N0YXRlbWVudF1dPC9zcGFuPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJob3N0X3NpZGVfdGlwcyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9ImRldmljZV9zaWRlX3RpcHMiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJkb2N1bWVudGF0aW9uX3RpcHMiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1vdmVydmlldy1wYWdlL292ZXJ2aWV3LXBhZ2UuaHRtbC5qcwpQb2x5bWVyKHtpczoib3ZlcnZpZXctcGFnZSIscHJvcGVydGllczp7X2RhdGE6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfdXBkYXRlVmlldyJ9LF9zaG93X3RvcF9vcHNfdGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3Nob3dfc3RlcF90aW1lX2dyYXBoOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9zaG91bGRTaG93U3RlcFRpbWVHcmFwaChfZGF0YSwgX2FjdGl2ZSkifSxfdG9wX29wc19idXR0b25fdGV4dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRUb3BPcHNCdXR0b25UZXh0KF9zaG93X3RvcF9vcHNfdGFibGUpIn0sX2dlbmVyYWxBbmFseXNpc0pzb246e3R5cGU6U3RyaW5nfSxfaW5wdXRBbmFseXNpc0pzb246e3R5cGU6U3RyaW5nfSxfcnVuRW52aXJvbm1lbnRKc29uOnt0eXBlOlN0cmluZ30sX3JlY29tbWVuZGF0aW9uSnNvbjp7dHlwZTpTdHJpbmd9LF9hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29uQWN0aXZlQ2hhbmdlZCJ9LF9ob3N0X2lkbGVfdGltZV9wZXJjZW50Ont0eXBlOlN0cmluZ30sCl9kZXZpY2VfaWRsZV90aW1lX3BlcmNlbnQ6e3R5cGU6U3RyaW5nfSxfbXh1X3V0aWxpemF0aW9uX3BlcmNlbnQ6e3R5cGU6U3RyaW5nfSxfc3RlcHRpbWVfbXNfYXZlcmFnZTp7dHlwZTpTdHJpbmd9LF9zdGVwdGltZV9tc19zdGRkZXY6e3R5cGU6U3RyaW5nfSxfaW5mZWVkX21zX2F2ZXJhZ2U6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29tcHV0ZV9tc19hdmVyYWdlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX3RvcF9vcHNfaGVhZGluZzp7dHlwZTpTdHJpbmd9LF9lcnJvcl9tZXNzYWdlOnt0eXBlOlN0cmluZ30sX2hvc3RfY291bnQ6e3R5cGU6U3RyaW5nfSxfdHB1X3R5cGU6e3R5cGU6U3RyaW5nfSxfdHB1X2NvcmVfY291bnQ6e3R5cGU6U3RyaW5nfSxfYmF0Y2hfc2l6ZTp7dHlwZTpTdHJpbmd9LF9jaGFuZ2VfbGlzdDp7dHlwZTpTdHJpbmd9LF9idWlsZF90aW1lOnt0eXBlOlN0cmluZ30sX2J1aWxkX3RhcmdldDp7dHlwZTpTdHJpbmd9LF9zdGF0ZW1lbnQ6e3R5cGU6U3RyaW5nfX0sCm9ic2VydmVyczpbIl9zaG93U3VtbWFyeShfaW5wdXRBbmFseXNpc0pzb24sIF9nZW5lcmFsQW5hbHlzaXNKc29uKSIsIl9zaG93UnVuRW52aXJvbm1lbnQoX3J1bkVudmlyb25tZW50SnNvbikiLCJfc2hvd0RldmljZVN0ZXBDaGFydChfaW5wdXRBbmFseXNpc0pzb24pIiwiX3Nob3dUb3BPcHNUYWJsZShfZ2VuZXJhbEFuYWx5c2lzSnNvbikiLCJfc2hvd1JlY29tbWVuZGF0aW9uKF9yZWNvbW1lbmRhdGlvbkpzb24pIl0sb25DbGlja1RvcE9wczpmdW5jdGlvbigpe3RoaXMuX3Nob3dfdG9wX29wc190YWJsZT0hdGhpcy5fc2hvd190b3Bfb3BzX3RhYmxlfSxfZ2V0VG9wT3BzQnV0dG9uVGV4dDpmdW5jdGlvbihhKXtyZXR1cm4oYT8iSGlkZSI6IlNob3ciKSsiIHRhYmxlIn0sX3VwZGF0ZVZpZXc6ZnVuY3Rpb24oKXtpZih0aGlzLl9kYXRhJiZ0aGlzLl9hY3RpdmUpe3RoaXMuX2dlbmVyYWxBbmFseXNpc0pzb249dGhpcy5fZGF0YVswXTt0aGlzLl9pbnB1dEFuYWx5c2lzSnNvbj10aGlzLl9kYXRhWzFdOwp0aGlzLl9ydW5FbnZpcm9ubWVudEpzb249dGhpcy5fZGF0YVsyXTt2YXIgYT10aGlzLl9kYXRhWzNdO3RoaXMuX3JlY29tbWVuZGF0aW9uSnNvbj1hO3RoaXMuX3N0YXRlbWVudD1hLnAuc3RhdGVtZW50O2E9ImdyZWVuIjt0aGlzLl9zdGF0ZW1lbnQuaW5jbHVkZXMoIkhJR0hMWSIpP2E9InJlZCI6dGhpcy5fc3RhdGVtZW50LmluY2x1ZGVzKCJNT0RFUkFURSIpJiYoYT0ib3JhbmdlIik7dGhpcy51cGRhdGVTdHlsZXMoeyItLXN1bW1hcnktY29sb3IiOmF9KX19LF9zaG93U3VtbWFyeTpmdW5jdGlvbihhLGMpe2EmJmMmJih0aGlzLl9ob3N0X2lkbGVfdGltZV9wZXJjZW50PWMucC5ob3N0X2lkbGVfdGltZV9wZXJjZW50LHRoaXMuX2RldmljZV9pZGxlX3RpbWVfcGVyY2VudD1jLnAuZGV2aWNlX2lkbGVfdGltZV9wZXJjZW50LHRoaXMuX214dV91dGlsaXphdGlvbl9wZXJjZW50PWMucC5teHVfdXRpbGl6YXRpb25fcGVyY2VudCx0aGlzLl9zdGVwdGltZV9tc19hdmVyYWdlPWEucC5zdGVwdGltZV9tc19hdmVyYWdlLAp0aGlzLl9zdGVwdGltZV9tc19zdGRkZXY9YS5wLnN0ZXB0aW1lX21zX3N0YW5kYXJkX2RldmlhdGlvbix0aGlzLl9jb21wdXRlX21zX2F2ZXJhZ2U9YS5wLmNvbXB1dGVfbXNfYXZlcmFnZSx0aGlzLl9pbmZlZWRfbXNfYXZlcmFnZT1hLnAuaW5mZWVkX21zX2F2ZXJhZ2UpfSxfc2hvd1J1bkVudmlyb25tZW50OmZ1bmN0aW9uKGEpe2EmJih0aGlzLl9lcnJvcl9tZXNzYWdlPWEucC5lcnJvcl9tZXNzYWdlLHRoaXMuX2hvc3RfY291bnQ9YS5wLmhvc3RfY291bnQsdGhpcy5fdHB1X3R5cGU9YS5wLnRwdV90eXBlLHRoaXMuX3RwdV9jb3JlX2NvdW50PWEucC50cHVfY29yZV9jb3VudCx0aGlzLl9iYXRjaF9zaXplPWEucC5iYXRjaF9zaXplLHRoaXMuX2NoYW5nZV9saXN0PWEucC5jaGFuZ2VfbGlzdCx0aGlzLl9idWlsZF90aW1lPWEucC5idWlsZF90aW1lLHRoaXMuX2J1aWxkX3RhcmdldD1hLnAuYnVpbGRfdGFyZ2V0KX0sX3Nob3dEZXZpY2VTdGVwQ2hhcnQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5fc2hvd19zdGVwX3RpbWVfZ3JhcGgpe3ZhciBjPQpbXSxkPVtdLGY9MCxnPS0xO2Eucm93cy5mb3JFYWNoKGZ1bmN0aW9uKGwpe2c9MDxnPysrZzpOdW1iZXIobC5jWzBdLnYpO2MucHVzaCh7c2NhbGFyOmwuY1sxXS52LHN0ZXA6Zyx0cHVfc3RlcDpOdW1iZXIobC5jWzBdLnYpLGxvd193YXRlcm1hcms6MH0pO2QucHVzaCh7c2NhbGFyOmwuY1sxXS52K2wuY1syXS52LHN0ZXA6Zyxsb3dfd2F0ZXJtYXJrOmwuY1sxXS52fSk7Zj1NYXRoLm1heChmLGwuY1sxXS52K2wuY1syXS52KX0pO2lmKGE9dGhpcy4kJCgiI2RldmljZV9zdGVwX2NoYXJ0IikpYS5zZXRWaXNpYmxlU2VyaWVzKFsiY29tcHV0ZS10aW1lIiwic3RlcC10aW1lIFx4M2QgaW5wdXQtdGltZSArIGNvbXB1dGUtdGltZSJdKSxhLnNldFNlcmllc0RhdGEoImNvbXB1dGUtdGltZSIsYyksYS5zZXRTZXJpZXNEYXRhKCJzdGVwLXRpbWUgXHgzZCBpbnB1dC10aW1lICsgY29tcHV0ZS10aW1lIixkKSxhLmRlZmF1bHRZUmFuZ2U9WzAsMS4xKmZdLGEuc21vb3RoaW5nRW5hYmxlZD0KITEsYS50b29sdGlwQ29sdW1ucz1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpsPT5sLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRpbWUobXMpIixldmFsdWF0ZTpsPT5sLmRhdHVtLnNjYWxhci50b0ZpeGVkKDIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOmw9PmwuZGF0dW0uc3RlcH1dLGEuZmlsbEFyZWE9e2hpZ2hlckFjY2Vzc29yOmw9Pmwuc2NhbGFyLGxvd2VyQWNjZXNzb3I6bD0+bC5sb3dfd2F0ZXJtYXJrfSxhLnhBeGlzRm9ybWF0dGVyPWQzLmZvcm1hdCgiZCIpfX0sX3Nob3dUb3BPcHNUYWJsZTpmdW5jdGlvbihhKXtpZihhJiZhLnJvd3MmJmEucm93cy5sZW5ndGgmJnRoaXMuX2FjdGl2ZSl7dmFyIGM9MCxkPXRoaXMuJCQoIiN0b3Bfb3BzX3RhYmxlX2NvbnRlbnQiKTtkJiYoZC5pbm5lckhUTUw9IiIsYS5yb3dzLmZvckVhY2goZnVuY3Rpb24oZil7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZChnKTsKdmFyIGw9W107bC5wdXNoKCgxMDAqZi5jWzBdLnYpLnRvRml4ZWQoMikrIiUiKTtsLnB1c2goKDEwMCpmLmNbMV0udikudG9GaXhlZCgyKSsiJSIpO2wucHVzaChmLmNbMl0udik7bC5wdXNoKGYuY1szXS52KTtsLnB1c2goZi5jWzRdLnYudG9GaXhlZCgyKSk7bC5mb3JFYWNoKGZ1bmN0aW9uKGspe3ZhciBtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20oZykuYXBwZW5kQ2hpbGQobSk7UG9seW1lci5kb20obSkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaykpfSk7Yys9MX0pLHRoaXMuX3RvcF9vcHNfaGVhZGluZz0iVG9wICIrYysiIFRlbnNvckZsb3cgb3BlcmF0aW9ucyBleGVjdXRlZCBvbiBUUFUiLHRoaXMuX3Nob3dfdG9wX29wc190YWJsZT0hMSl9fSxfZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWw6ZnVuY3Rpb24oYSxjLGQsZil7dmFyIGc9Ilx4M2NwXHgzZVx4MjZuYnNwO1x4M2MvcFx4M2UiO2crPSdceDNjZGl2IGNsYXNzXHgzZCInKwpjKyciXHgzZSc7Zys9Ilx4M2NiXHgzZSIrZisiOlx4M2MvYlx4M2UiO2Eucm93cy5mb3JFYWNoKGZ1bmN0aW9uKGwpe2wuY1swXS52PT1kJiYoZys9Ilx4M2NsaVx4M2UiK2wuY1sxXS52KyJceDNjL2xpXHgzZSIpfSk7cmV0dXJuIGcrPSJceDNjL2Rpdlx4M2UifSxfc2hvd1JlY29tbWVuZGF0aW9uOmZ1bmN0aW9uKGEpe2lmKGEmJnRoaXMuX2FjdGl2ZSl7dmFyIGM9YS5wLmJvdHRsZW5lY2ssZD10aGlzLiQkKCIjaG9zdF9zaWRlX3RpcHMiKSxmPXRoaXMuJCQoIiNkZXZpY2Vfc2lkZV90aXBzIik7ZCYmZiYmKCJkZXZpY2UiPT1jPyhkLmlubmVySFRNTD0iIixmLmlubmVySFRNTD10aGlzLl9nZW5lcmF0ZVJlY29tbWVuZGF0aW9uSHRtbChhLCJib3R0bGVuZWNrVGlwcyIsImRldmljZSIsIk5leHQgdG9vbHMgdG8gdXNlIGZvciByZWR1Y2luZyB0aGUgVFBVIHRpbWUiKSk6Imhvc3QiPT1jPyhkLmlubmVySFRNTD10aGlzLl9nZW5lcmF0ZVJlY29tbWVuZGF0aW9uSHRtbChhLCJib3R0bGVuZWNrVGlwcyIsCiJob3N0IiwiTmV4dCB0b29scyB0byB1c2UgZm9yIHJlZHVjaW5nIHRoZSBpbnB1dCB0aW1lIiksZi5pbm5lckhUTUw9IiIpOihkLmlubmVySFRNTD10aGlzLl9nZW5lcmF0ZVJlY29tbWVuZGF0aW9uSHRtbChhLCJib3R0bGVuZWNrVGlwcyIsImhvc3QiLCJOZXh0IHRvb2xzIHRvIHVzZSBmb3IgcmVkdWNpbmcgdGhlIGlucHV0IHRpbWUiKSxmLmlubmVySFRNTD10aGlzLl9nZW5lcmF0ZVJlY29tbWVuZGF0aW9uSHRtbChhLCJib3R0bGVuZWNrVGlwcyIsImRldmljZSIsIk5leHQgdG9vbHMgdG8gdXNlIGZvciByZWR1Y2luZyB0aGUgVFBVIHRpbWUiKSksYz10aGlzLiQkKCIjZG9jdW1lbnRhdGlvbl90aXBzIikpJiYoYy5pbm5lckhUTUw9dGhpcy5fZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWwoYSwiZG9jdW1lbnRhdGlvblRpcHMiLCJkb2MiLCJPdGhlciB1c2VmdWwgcmVzb3VyY2VzIikpfX0sX29uQWN0aXZlQ2hhbmdlZDpmdW5jdGlvbihhKXthP3RoaXMuX3VwZGF0ZVZpZXcoKToKdGhpcy5fc2hvd190b3Bfb3BzX3RhYmxlPXRoaXMuX3Nob3dfc3RlcF90aW1lX2dyYXBoPSExfSxfc2hvdWxkU2hvd1N0ZXBUaW1lR3JhcGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYyYmYSYmYVsxXSYmYVsxXS5yb3dzJiZhWzFdLnJvd3MubGVuZ3RofSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FjdGl2ZT0hMDt0aGlzLl91cGRhdGVWaWV3KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aXZlPSExfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtb3AtcHJvZmlsZS91dGlscy5qcwp2YXIgcW07CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGwsayxtLHApe3JldHVybiJyZ2JhKCIrTWF0aC5yb3VuZCgyNTUqbCkrIiwiK01hdGgucm91bmQoMjU1KmspKyIsIitNYXRoLnJvdW5kKDI1NSptKSsiLCIrcCsiKSJ9ZnVuY3Rpb24gZChsLGs9MSxtPTEscD1NYXRoLnNxcnQpe2lmKGlzTmFOKGwpKXJldHVybiBjKGssayxrLG0pO2w9cChsKTtyZXR1cm4uNT5sP2MoaywyKmwqaywwLG0pOmMoMiooMS1sKSprLGssMCxtKX1mdW5jdGlvbiBmKGwpe3JldHVybiBsJiZsLm1ldHJpY3MmJmwubWV0cmljcy50aW1lP2wubWV0cmljcy5mbG9wcy9sLm1ldHJpY3MudGltZTpOYU59ZnVuY3Rpb24gZyhsKXtyZXR1cm4gbCYmbC5tZXRyaWNzJiZsLm1ldHJpY3MubWVtb3J5QmFuZHdpZHRoP2wubWV0cmljcy5tZW1vcnlCYW5kd2lkdGg6TmFOfWEuZmxhbWVDb2xvcj1kO2EuZmxvcHNDb2xvcj1mdW5jdGlvbihsKXtyZXR1cm4gZChsLC43KX07YS5id0NvbG9yPWZ1bmN0aW9uKGwpe3JldHVybiBkKDEtbCwKLjcpfTthLnV0aWxpemF0aW9uPWY7YS5tZW1vcnlVdGlsaXphdGlvbj1nO2EuaGFzTWVtb3J5VXRpbGl6YXRpb249ZnVuY3Rpb24obCl7cmV0dXJuIGwmJmwubWV0cmljcyYmbC5tZXRyaWNzLm1lbW9yeUJhbmR3aWR0aH07YS5oYXNGbG9wcz1mdW5jdGlvbihsKXtyZXR1cm4gbCYmbC5tZXRyaWNzJiZsLm1ldHJpY3MudGltZX07YS5wZXJjZW50PWZ1bmN0aW9uKGwpe3JldHVybiBpc05hTihsKT8iLSI6Ljk5NTw9bD8iMTAwJSI6MUUtNT5sPyIwLjAwJSI6KDEwMCpsKS50b1ByZWNpc2lvbigyKSsiJSJ9O2EudGltZVdhc3RlZD1mdW5jdGlvbihsKXtyZXR1cm4gbCYmbC5tZXRyaWNzP2wubWV0cmljcy50aW1lKigxLU1hdGgubWF4KGYobCksZyhsKSkpOk5hTn19KShxbXx8KHFtPXt9KSk7Cjwvc2NyaXB0PgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtdGFibGUtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0aW1lLAogICAgICAjd2FzdGVkLAogICAgICAjdXRpbGl6YXRpb24gewogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICAgICNuYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiA0MCU7CiAgICAgIH0KICAgICAgI3JvdywKICAgICAgI2hlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CiAgICAgICNyb3cgPiAqLAogICAgICAjaGVhZGVyID4gKiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CiAgICAgICNoZWFkZXIgPiAqIHsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQogICAgICAjcHJvdmVuYW5jZSB7CiAgICAgICAgZmxleDogMSAxIDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAjdXRpbGl6YXRpb24gewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtdGFibGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1vcC10YWJsZS1zdHlsZXMiPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgIH0KICAgICAgI2hlYWRlciB7CiAgICAgICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjI1ZW07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2NjY7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIC8qIE1hdGNoIGluZGVudGVkIG5hbWVzICovCiAgICAgICNoZWFkZXIgPiAjbmFtZSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0idGltZSI+VGltZTwvc3Bhbj4KICAgICAgPHNwYW4gaWQ9Indhc3RlZCI+V2FzdGVkPC9zcGFuPgogICAgICA8c3BhbiBpZD0ibmFtZSI+TmFtZTwvc3Bhbj4KICAgICAgPHNwYW4gaWQ9InByb3ZlbmFuY2UiPlRlbnNvckZsb3cgT3A8L3NwYW4+CiAgICAgIDxzcGFuIGlkPSJ1dGlsaXphdGlvbiI+RkxPUFM8L3NwYW4+CiAgICA8L2Rpdj4KICAgIDx0Zi1vcC10YWJsZS1lbnRyeSBub2RlPSJbW3Jvb3ROb2RlXV0iIGhlYWRlci1ob3Zlcj0iW1tfb25IZWFkZXJIb3Zlcl1dIiBoZWFkZXItY2xpY2s9IltbX29uSGVhZGVyQ2xpY2tdXSIgY2hpbGRyZW4tY291bnQ9Int7Y2hpbGRyZW5Db3VudH19IiBzaG93LXA5MD0ie3tzaG93UDkwfX0iIGJ5LXdhc3RlPSJ7e2J5V2FzdGV9fSIgZXhwYW5kZWQ9InRydWUiPgogICAgPC90Zi1vcC10YWJsZS1lbnRyeT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtb3AtcHJvZmlsZS90Zi1vcC10YWJsZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1vcC10YWJsZSIscHJvcGVydGllczp7cm9vdE5vZGU6e3R5cGU6T2JqZWN0fSxhY3RpdmU6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfYWN0aXZlKF9zZWxlY3RlZCwgX2hvdmVyKSIsbm90aWZ5OiEwfSxzaG93UDkwOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxieVdhc3RlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxjaGlsZHJlbkNvdW50Ont0eXBlOk51bWJlcix2YWx1ZToxMCxub3RpZnk6ITB9LF9zZWxlY3RlZDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxub3RpZnk6ITB9LF9ob3Zlcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxub3RpZnk6ITB9LF9vbkhlYWRlckhvdmVyOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBhPT50aGlzLl9ob3Zlcj1hfX0sX29uSGVhZGVyQ2xpY2s6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9Pnt0aGlzLl9zZWxlY3RlZCYmKHRoaXMuX3NlbGVjdGVkLnNlbGVjdGVkPQohMSk7dGhpcy5fc2VsZWN0ZWQ9YTthLnNlbGVjdGVkPSEwfX19fSxfYWN0aXZlOmZ1bmN0aW9uKGEsYyl7aWYoYylyZXR1cm4gYy5ub2RlO2lmKGEpcmV0dXJuIGEubm9kZX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtdGFibGUtZW50cnkiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1vcC10YWJsZS1zdHlsZXMiPgogICAgICAjcm93IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCAwIHJnYmEoMCwgMCwgMCwgMC4wNik7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgfQogICAgICAjYmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHotaW5kZXg6IC0xOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjZGU7CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIDpob3N0KC5zZWxlY3RlZCkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNCk7CiAgICAgIH0KICAgICAgOmhvc3QoLnNlbGVjdGVkKSA+ICNyb3cgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNyb3c6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7CiAgICAgIH0KICAgICAgI2Rpc2Nsb3N1cmUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMWVtOwogICAgICB9CiAgICAgICNuYW1lIHsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CiAgICAgICN0aW1lLAogICAgICAjd2FzdGVkLAogICAgICAjdXRpbGl6YXRpb24gewogICAgICAgIGZvbnQtc2l6ZTogc21hbGxlcjsKICAgICAgfQogICAgICAvKiBVdGlsaXphdGlvbiBoYXMgYSBiYWNrZ3JvdW5kIGNvbG9yLCBzbyBpdCBzdHJldGNoZXMgdG8gZmlsbCB0aGUgcm93LgogICAgICAgICBJdHMgdGV4dCBpcyBpbiBhbiBpbm5lciBkaXYgdGhhdCByZW1haW5zIHZlcnRpY2FsbHkgY2VudGVyZWQuICovCiAgICAgICN1dGlsaXphdGlvbiB7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfQogICAgICAjdXRpbGl6YXRpb24gZGl2IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0icm93IiBvbi1jbGljaz0iX2hhbmRsZUhlYWRlckNsaWNrIiBvbi1tb3VzZWVudGVyPSJfaGFuZGxlSGVhZGVyTW91c2VFbnRlciIgb24tbW91c2VsZWF2ZT0iX2hhbmRsZUhlYWRlck1vdXNlTGVhdmUiIGhpZGRlbj0iW1shbGV2ZWxdXSI+CiAgICAgIDxkaXYgaWQ9ImJhciIgc3R5bGUkPSJ3aWR0aDp7e19iYXJXaWR0aChub2RlKX19Ij48L2Rpdj4KICAgICAgPHNwYW4gaWQ9InRpbWUiPnt7X3BlcmNlbnQobm9kZSl9fTwvc3Bhbj4KICAgICAgPHNwYW4gaWQ9Indhc3RlZCI+e3tfdGltZVdhc3RlZChub2RlKX19PC9zcGFuPgogICAgICA8c3BhbiBpZD0ibmFtZSIgc3R5bGUkPSJwYWRkaW5nLWxlZnQ6W1tsZXZlbF1dZW07Ij4KICAgICAgICA8c3BhbiBpZD0iZGlzY2xvc3VyZSI+CiAgICAgICAgICA8c3BhbiBoaWRkZW49IltbIW5vZGUuY2hpbGRyZW4ubGVuZ3RoXV0iPgogICAgICAgICAgICA8c3BhbiBoaWRkZW49IltbZXhwYW5kZWRdXSI+4pa2PC9zcGFuPgogICAgICAgICAgICA8c3BhbiBoaWRkZW49IltbIWV4cGFuZGVkXV0iPuKWvDwvc3Bhbj4KICAgICAgICAgIDwvc3Bhbj4gPC9zcGFuPnt7bm9kZS5uYW1lfX0KICAgICAgPC9zcGFuPgogICAgICA8c3BhbiBpZD0icHJvdmVuYW5jZSI+e3tfcHJvdmVuYW5jZShub2RlKX19Jm5ic3A7PC9zcGFuPgogICAgICA8c3BhbiBpZD0idXRpbGl6YXRpb24iIGhpZGRlbj0iW1shX2hhc0Zsb3BzKG5vZGUpXV0iIHN0eWxlJD0iYmFja2dyb3VuZC1jb2xvcjp7e19mbGFtZUNvbG9yKG5vZGUpfX0iPgogICAgICAgIHt7X3V0aWxpemF0aW9uKG5vZGUpfX08L3NwYW4+CiAgICA8L2Rpdj4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tleHBhbmRlZF1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfZ2V0S0NoaWxkcmVuKG5vZGUsIGNoaWxkcmVuQ291bnQsIHNob3dQOTAsIGxldmVsKX19IiBzb3J0PSJbW19zb3J0KGJ5V2FzdGUpXV0iPgogICAgICAgIDx0Zi1vcC10YWJsZS1lbnRyeSBub2RlPSJbW2l0ZW1dXSIgY2hpbGRyZW4tY291bnQ9Int7Y2hpbGRyZW5Db3VudH19IiBzaG93LXA5MD0ie3tzaG93UDkwfX0iIGJ5LXdhc3RlPSJ7e2J5V2FzdGV9fSIgbGV2ZWw9Int7X25leHRMZXZlbChsZXZlbCl9fSIgaGVhZGVyLWhvdmVyPSJ7e2hlYWRlckhvdmVyfX0iIGhlYWRlci1jbGljaz0ie3toZWFkZXJDbGlja319Ij4KICAgICAgICA8L3RmLW9wLXRhYmxlLWVudHJ5PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0xlZnRvdXQobm9kZSwgY2hpbGRyZW5Db3VudCwgbGV2ZWwpXV0iPgogICAgICAgIDxzcGFuIGlkPSJuYW1lIiBzdHlsZSQ9InBhZGRpbmctbGVmdDpbW19nZXRQYWRkaW5nTGVmdChsZXZlbCldXWVtOyI+CiAgICAgICAgICBbW19udW1MZWZ0b3V0KG5vZGUsIGNoaWxkcmVuQ291bnQpXV0gY2F0ZWdvcmllcyBvciBvcHMgaGF2ZSBiZWVuIGxlZnQKICAgICAgICAgIG91dC4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1vcC1wcm9maWxlL3RmLW9wLXRhYmxlLmh0bWwtMi5qcwpQb2x5bWVyKHtpczoidGYtb3AtdGFibGUtZW50cnkiLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0fSxsZXZlbDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saGVhZGVySG92ZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5mdW5jdGlvbigpe30sbm90aWZ5OiEwfSxoZWFkZXJDbGljazp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PmZ1bmN0aW9uKCl7fSxub3RpZnk6ITB9LGV4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxzZWxlY3RlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfc2VsZWN0ZWRDaGFuZ2VkIn19LF9lcTpmdW5jdGlvbihhLGMpe3JldHVybiBhPT1jfSxfbmV4dExldmVsOmZ1bmN0aW9uKGEpe3JldHVybiBhKzF9LF9oYW5kbGVIZWFkZXJDbGljazpmdW5jdGlvbigpe3RoaXMuZXhwYW5kZWRePTE7dGhpcy5oZWFkZXJDbGljayh0aGlzKX0sX2hhbmRsZUhlYWRlck1vdXNlRW50ZXI6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlckhvdmVyKHRoaXMpfSwKX2hhbmRsZUhlYWRlck1vdXNlTGVhdmU6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlckhvdmVyKG51bGwpfSxfcGVyY2VudDpmdW5jdGlvbihhKXtyZXR1cm4gYS5tZXRyaWNzJiZhLm1ldHJpY3MudGltZT9xbS5wZXJjZW50KGEubWV0cmljcy50aW1lKToiIn0sX3RpbWVXYXN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHFtLnBlcmNlbnQocW0udGltZVdhc3RlZChhKSl9LF9wcm92ZW5hbmNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnhsYSYmYS54bGEucHJvdmVuYW5jZT9hLnhsYS5wcm92ZW5hbmNlLnJlcGxhY2UoL14uKlwvLywiIik6IiJ9LF91dGlsaXphdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gcW0ucGVyY2VudChxbS51dGlsaXphdGlvbihhKSl9LF9oYXNGbG9wczpxbS5oYXNGbG9wcyxfZmxhbWVDb2xvcjpmdW5jdGlvbihhKXtyZXR1cm4gcW0uZmxhbWVDb2xvcihxbS51dGlsaXphdGlvbihhKSwxLC4yKX0sX2JhcldpZHRoOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1ldHJpY3MmJmEubWV0cmljcy50aW1lPwpxbS5wZXJjZW50KGEubWV0cmljcy50aW1lKTowfSxfc2VsZWN0ZWRDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuY2xhc3NMaXN0LnRvZ2dsZSgic2VsZWN0ZWQiLGEpfSxfZ2V0S0NoaWxkcmVuOmZ1bmN0aW9uKGEsYyxkLGYpe2lmKGQmJjA8YS5jaGlsZHJlbi5sZW5ndGgmJmEuY2hpbGRyZW5bMF0ubWV0cmljcyl7Zm9yKHZhciBnPWQ9MCxsPS45KmEubWV0cmljcy50aW1lO2c8TWF0aC5taW4oYyxhLmNoaWxkcmVuLmxlbmd0aCkmJiEoZD49bCk7ZysrKWQrPWEuY2hpbGRyZW5bZ10ubWV0cmljcy50aW1lO2M9Z31yZXR1cm4gZj9hLmNoaWxkcmVuLnNsaWNlKDAsYyk6YS5jaGlsZHJlbn0sX2hhc0xlZnRvdXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkP2EubnVtQ2hpbGRyZW4+TWF0aC5taW4oYyxhLmNoaWxkcmVuLmxlbmd0aCk6ITF9LF9udW1MZWZ0b3V0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEubnVtQ2hpbGRyZW4tTWF0aC5taW4oYyxhLmNoaWxkcmVuLmxlbmd0aCl9LF9nZXRQYWRkaW5nTGVmdDpmdW5jdGlvbihhKXtyZXR1cm4gYSsKNX0sX3NvcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/KGMsZCk9PnFtLnRpbWVXYXN0ZWQoZCktcW0udGltZVdhc3RlZChjKTowfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1iYXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgICZuYnNwO1tbX3BlcmNlbnQodmFsdWUpXV0KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1vcC1wcm9maWxlL3RmLW9wLWRldGFpbHMuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3AtYmFyIixwcm9wZXJ0aWVzOnt2YWx1ZTp7dHlwZTpOdW1iZXJ9LGNvbG9yOnt0eXBlOlN0cmluZ319LG9ic2VydmVyczpbIl91cGRhdGVWYWx1ZSh2YWx1ZSwgY29sb3IpIl0sX3BlcmNlbnQ6cW0ucGVyY2VudCxfdXBkYXRlVmFsdWU6ZnVuY3Rpb24oYSxjKXtjJiYoYT1xbS5wZXJjZW50KGEpLHRoaXMuc3R5bGUuYmFja2dyb3VuZD1gbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAke2N9ICR7YX0sICNjY2MgJHthfSlgKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtZGV0YWlscyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICBwYXBlci1jYXJkIHsKICAgICAgICAtLXBhcGVyLWNhcmQtaGVhZGVyLWNvbG9yOiB3aGl0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICB0Zi1vcC1iYXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgICNzdWJoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAgMTZweCA2cHg7CiAgICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdG9wOiAtMTBweDsKICAgICAgfQogICAgICAuY2FyZC1jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICB9CiAgICAgIC5jYXJkLWNvbnRlbnQgPiBkaXYgewogICAgICAgIG1hcmdpbi1ib3R0b206IDFlbTsKICAgICAgfQogICAgICAuZXhwcmVzc2lvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC51bmF2YWlsYWJsZSB7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubGF5b3V0IHsKICAgICAgICBkaXNwbGF5OiB0YWJsZTsKICAgICAgICB3aWR0aDogNTAlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiAxZW0gMC4zZW07CiAgICAgIH0KICAgICAgLmxheW91dCA+ICogewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQogICAgICAubGF5b3V0ID4gKiA+ICogewogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgIH0KICAgICAgLmxheW91dCAuc2l6ZSwKICAgICAgLmxheW91dCAuc2l6ZS14IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLmxheW91dCAuc2l6ZS14IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgfQogICAgICAubGF5b3V0IC5zZW1hbnRpY3MgewogICAgICAgIGZvbnQtc2l6ZTogc21hbGxlcjsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBjb2xvcjogIzQ4YzsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxheW91dCAuYWxpZ25tZW50IHsKICAgICAgICAvKiBNYWtlIHRoZSBiYWNrZ3JvdW5kIGV4dGVuZCBvdXRzaWRlIHRoZSBib3ggKi8KICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgbWFyZ2luLXRvcDogLTAuNWVtOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1jYXJkIGlkPSJjYXJkIiBoZWFkaW5nPSJbW25vZGUubmFtZV1dIiBlbGV2YXRpb249IjIiPgogICAgICA8ZGl2IGlkPSJzdWJoZWFkZXIiPltbX3N1YmhlYWRlcihub2RlKV1dPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIV9oYXNGbG9wcyhub2RlKV1dIj4KICAgICAgICAgIDxiPkZMT1BTIHV0aWxpemF0aW9uOiA8L2I+CiAgICAgICAgICA8dGYtb3AtYmFyIGNvbG9yPSJbW19mbG9wc0NvbG9yKG5vZGUpXV0iIHZhbHVlPSJbW191dGlsaXphdGlvbihub2RlKV1dIj48L3RmLW9wLWJhcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shX2hhc01lbW9yeVV0aWxpemF0aW9uKG5vZGUpXV0iPgogICAgICAgICAgPGI+TWVtb3J5IGJhbmR3aWR0aCB1dGlsaXphdGlvbjogPC9iPgogICAgICAgICAgPHRmLW9wLWJhciBjb2xvcj0iW1tfYndDb2xvcihub2RlKV1dIiB2YWx1ZT0iW1tfbWVtb3J5VXRpbGl6YXRpb24obm9kZSldXSI+PC90Zi1vcC1iYXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0idW5hdmFpbGFibGUiIGhpZGRlbj0iW1shX2Z1c2VkKG5vZGUpXV0iPgogICAgICAgICAgUGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gZm9yIGluZGl2aWR1YWwgZnVzZWQgb3BlcmF0aW9ucyBpcyBub3QKICAgICAgICAgIGF2YWlsYWJsZS4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ1bmF2YWlsYWJsZSIgaGlkZGVuPSJbWyFub2RlLmNhdGVnb3J5XV0iPgogICAgICAgICAgU2VsZWN0IGl0ZW1zIHdpdGhpbiB0aGlzIGNhdGVnb3J5IGZvciBwZXJmb3JtYW5jZSBkZXRhaWxzLgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFub2RlLnhsYS5leHByZXNzaW9uXV0iPgogICAgICAgICAgPGI+WExBIEV4cHJlc3Npb246IDwvYj4KICAgICAgICAgIDxjb2RlIGNsYXNzPSJleHByZXNzaW9uIj5bW25vZGUueGxhLmV4cHJlc3Npb25dXTwvY29kZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shbm9kZS54bGEucHJvdmVuYW5jZV1dIj4KICAgICAgICAgIDxiPlRlbnNvckZsb3cgTmFtZTogPC9iPgogICAgICAgICAgPGNvZGUgY2xhc3M9ImV4cHJlc3Npb24iPltbbm9kZS54bGEucHJvdmVuYW5jZV1dPC9jb2RlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFub2RlLnhsYS5sYXlvdXRdXSI+CiAgICAgICAgICA8Yj5MYXlvdXQ6IDwvYj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dCIgaGlkZGVuPSJbWyFub2RlLnhsYS5sYXlvdXRdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZS54bGEubGF5b3V0LmRpbWVuc2lvbnNdXSI+CiAgICAgICAgICAgICAgPGRpdiBoaWRkZW49IltbIWluZGV4XV0iPjxzcGFuIGNsYXNzPSJzaXplLXgiPsOXPC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2l6ZSI+W1tpdGVtLnNpemVdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZW1hbnRpY3MiPltbaXRlbS5zZW1hbnRpY3NdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJhbGlnbm1lbnQiIHN0eWxlJD0iYmFja2dyb3VuZC1jb2xvcjpbW19kaW1lbnNpb25Db2xvcihpdGVtKV1dIj5bW19kaW1lbnNpb25IaW50KGl0ZW0pXV08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWNhcmQ+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLW9wLXByb2ZpbGUvdGYtb3AtZGV0YWlscy5odG1sLTIuanMKUG9seW1lcih7aXM6InRmLW9wLWRldGFpbHMiLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX3VwZGF0ZUNhcmQifX0sX3V0aWxpemF0aW9uOnFtLnV0aWxpemF0aW9uLF9tZW1vcnlVdGlsaXphdGlvbjpxbS5tZW1vcnlVdGlsaXphdGlvbixfaGFzRmxvcHM6cW0uaGFzRmxvcHMsX2hhc01lbW9yeVV0aWxpemF0aW9uOnFtLmhhc01lbW9yeVV0aWxpemF0aW9uLF91cGRhdGVDYXJkOmZ1bmN0aW9uKGEpe2EmJihhPXFtLmZsYW1lQ29sb3IocW0udXRpbGl6YXRpb24oYSksLjcpLHRoaXMuJC5jYXJkLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2FyZC1iYWNrZ3JvdW5kLWNvbG9yIjphfSkpfSxfc3ViaGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBhP2EueGxhP2EueGxhLmNhdGVnb3J5KyIgb3BlcmF0aW9uIjphLmNhdGVnb3J5PyJPcGVyYXRpb24gY2F0ZWdvcnkiOiJVbmtub3duIjpudWxsfSxfZnVzZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJgphLnhsYSYmIShhLm1ldHJpY3MmJmEubWV0cmljcy50aW1lKX0sX2RpbWVuc2lvbkNvbG9yOmZ1bmN0aW9uKGEpe2lmKCFhfHwhYS5hbGlnbm1lbnQpcmV0dXJuIG51bGw7YT1hLnNpemUvYS5hbGlnbm1lbnQ7cmV0dXJuIHFtLmZsYW1lQ29sb3IoYS9NYXRoLmNlaWwoYSksMSwuMjUsYz0+MS1NYXRoLnNxcnQoMS1jKSl9LF9kaW1lbnNpb25IaW50OmZ1bmN0aW9uKGEpe2lmKCFhfHwhYS5hbGlnbm1lbnQpcmV0dXJuIG51bGw7dmFyIGM9TWF0aC5jZWlsKGEuc2l6ZS9hLmFsaWdubWVudCksZD0xPT1jPyIiOiI6ICIrYysiIFx1MDBkNyAiK2EuYWxpZ25tZW50O3JldHVybiAwPT1hLnNpemUlYS5hbGlnbm1lbnQ/IkV4YWN0IGZpdCIrZDoiUGFkIHRvICIrYyphLmFsaWdubWVudCtkfSxfZmxvcHNDb2xvcjpmdW5jdGlvbihhKXtyZXR1cm4gcW0uZmxvcHNDb2xvcihxbS51dGlsaXphdGlvbihhKSl9LF9id0NvbG9yOmZ1bmN0aW9uKGEpe3JldHVybiBxbS5id0NvbG9yKHFtLm1lbW9yeVV0aWxpemF0aW9uKGEpKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1wcm9maWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICNjb250cm9sIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZmxvdzogcm93IG5vd3JhcDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwogICAgICAgIHRleHQtYWxpZ246IGJvdHRvbTsKICAgICAgfQogICAgICAuY29udHJvbFJvd0xlZnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbGluZS1oZWlnaHQ6IDUwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogYm90dG9tOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQogICAgICAuY29udHJvbFJvd1JpZ2h0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZmxvdzogcm93IG5vd3JhcDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGxpbmUtaGVpZ2h0OiA1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGJvdHRvbTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItaW5wdXQ6IHsKICAgICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1zbGlkZXItaGVpZ2h0OiAzcHg7CiAgICAgIH0KICAgICAgI2Rlc2NyaXB0aW9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyZW07CiAgICAgICAgd2lkdGg6IDYwMHB4OwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGYtb3AtcHJvZmlsZSI+CiAgICAgIDxoMz4KICAgICAgICBPdmVyYWxsIFRQVSBGTE9QUyB1dGlsaXphdGlvbiBpcwogICAgICAgIDxzcGFuIHN0eWxlJD0iY29sb3I6W1tfZmxvcHNDb2xvcihfcm9vdCldXSI+CiAgICAgICAgICBbW191dGlsaXphdGlvblBlcmNlbnQoX3Jvb3QpXV08L3NwYW4+CiAgICAgICAgLCBtZW1vcnkgYmFuZHdpZHRoIHV0aWxpemF0aW9uIGlzCiAgICAgICAgPHNwYW4gc3R5bGUkPSJjb2xvcjpbW19id0NvbG9yKF9yb290KV1dIj4KICAgICAgICAgIFtbX21lbW9yeVV0aWxpemF0aW9uUGVyY2VudChfcm9vdCldXTwvc3Bhbj4KICAgICAgPC9oMz4KICAgICAgPGRpdiBpZD0iZGVzY3JpcHRpb24iPgogICAgICAgIDxwPgogICAgICAgICAgTW9kaWZ5aW5nIHlvdXIgbW9kZWwncyBhcmNoaXRlY3R1cmUsIGRhdGEgZGltZW5zaW9ucywgYW5kIGltcHJvdmluZwogICAgICAgICAgdGhlIGVmZmljaWVuY3kgb2YgQ1BVIG9wZXJhdGlvbnMgbWF5IGhlbHAgcmVhY2ggdGhlIFRQVSdzIEZMT1BTCiAgICAgICAgICBwb3RlbnRpYWwuCiAgICAgICAgCiAgICAgICAgPHA+CiAgICAgICAgICAiSWRsZSIgcmVwcmVzZW50cyB0aGUgcG9ydGlvbiBvZiB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgb24gZGV2aWNlCiAgICAgICAgICB0aGF0IGlzIGlkbGUuIFdhc3RlZCB0aW1lIGlzIGRlZmluZWQgYnkKICAgICAgICAgIDxjb2RlPlJ1bnRpbWVGcmFjdGlvbiAqICgxIC0gbWF4KEZsb3BzVXRpbGl6YXRpb24sCiAgICAgICAgICAgIE1lbW9yeVV0aWxpemF0aW9uKSk8L2NvZGU+LgogICAgICAgIAogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iY29udHJvbCI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRyb2xSb3dMZWZ0IiBoaWRkZW4kPSJbWyFfaGFzVHdvUHJvZmlsZXNdXSI+QnkgUHJvZ3JhbQogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3tpc0J5Q2F0ZWdvcnl9fSI+IDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj5CeSBDYXRlZ29yeTwvc3Bhbj4KICAgICAgICAKICAgICAgICA8c3BhbiBjbGFzcz0iY29udHJvbFJvd0xlZnQiPlNob3cgdG9wCiAgICAgICAgICA8cGFwZXItc2xpZGVyIG1pbj0iMTAiIG1heD0iMTAwIiBzbmFwcyBzdGVwPSIxMCIgdmFsdWU9Int7Y2hpbGRyZW5Db3VudH19IiBlZGl0YWJsZT4KICAgICAgICAgIDwvcGFwZXItc2xpZGVyPm9wczwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29udHJvbFJvd1JpZ2h0Ij4mbmJzcDsKICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7YnlXYXN0ZX19Ij4gPC9wYXBlci10b2dnbGUtYnV0dG9uPlNvcnQKICAgICAgICAgIGJ5IHdhc3RlZCB0aW1lPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjb250cm9sUm93UmlnaHQiPm9mZiZuYnNwOwogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3tzaG93UDkwfX0iPiA8L3BhcGVyLXRvZ2dsZS1idXR0b24+VG9wCiAgICAgICAgICA5MCU8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8dGYtb3AtdGFibGUgcm9vdC1ub2RlPSJbW19yb290XV0iIGFjdGl2ZT0ie3thY3RpdmV9fSIgYnktd2FzdGU9Int7YnlXYXN0ZX19IiBzaG93LXA5MD0ie3tzaG93UDkwfX0iIGNoaWxkcmVuLWNvdW50PSJ7e2NoaWxkcmVuQ291bnR9fSI+CiAgICAgIDwvdGYtb3AtdGFibGU+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtb3AtcHJvZmlsZS90Zi1vcC1wcm9maWxlLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wLXByb2ZpbGUiLHByb3BlcnRpZXM6e19kYXRhOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9yb290Ont0eXBlOk9iamVjdCxub3RpZnk6ITB9LGFjdGl2ZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOm51bGx9LF9oYXNUd29Qcm9maWxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY2hlY2tQcm9maWxlcyhfZGF0YSkiLG5vdGlmeTohMH0saXNCeUNhdGVnb3J5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxzaG93UDkwOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxieVdhc3RlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxjaGlsZHJlbkNvdW50Ont0eXBlOk51bWJlcix2YWx1ZToxMCxub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfZ2V0Um9vdChfZGF0YSwgaXNCeUNhdGVnb3J5KSJdLF9sb2FkOmZ1bmN0aW9uKGEpe3RoaXMuX2RhdGE9YX0sX2dldFJvb3Q6ZnVuY3Rpb24oYSxjKXt0aGlzLl9yb290PQp0aGlzLl9oYXNUd29Qcm9maWxlcz9jP2EuYnlDYXRlZ29yeTphLmJ5UHJvZ3JhbTphLmJ5Q2F0ZWdvcnl8fGEuYnlQcm9ncmFtfSxfY2hlY2tQcm9maWxlczpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YS5ieVByb2dyYW0mJm51bGwhPWEuYnlDYXRlZ29yeX0sX3V0aWxpemF0aW9uUGVyY2VudDpmdW5jdGlvbihhKXtyZXR1cm4gcW0ucGVyY2VudChxbS51dGlsaXphdGlvbihhKSl9LF9tZW1vcnlVdGlsaXphdGlvblBlcmNlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHFtLnBlcmNlbnQocW0ubWVtb3J5VXRpbGl6YXRpb24oYSkpfSxfaGFzRmxvcHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5tZXRyaWNzLmZsb3BzfSxfZmxvcHNDb2xvcjpmdW5jdGlvbihhKXtyZXR1cm4gcW0uZmxvcHNDb2xvcihxbS51dGlsaXphdGlvbihhKSl9LF9id0NvbG9yOmZ1bmN0aW9uKGEpe3JldHVybiBxbS5id0NvbG9yKHFtLm1lbW9yeVV0aWxpemF0aW9uKGEpKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1wcm9maWxlLWNvbW1vbi91dGlsLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2QudGltZT1mdW5jdGlvbihmLGcpe2xldCBsPURhdGUubm93KCk7Zz1nKCk7Y29uc29sZS5sb2coZiwiOiIsRGF0ZS5ub3coKS1sLCJtcyIpO3JldHVybiBnfTtkLmdldFRyYWNrZXI9ZnVuY3Rpb24oZil7cmV0dXJue3NldE1lc3NhZ2U6ZnVuY3Rpb24oZyl7Zi5zZXQoInByb2dyZXNzIix7dmFsdWU6Zi5wcm9ncmVzcy52YWx1ZSxtc2c6Z30pfSx1cGRhdGVQcm9ncmVzczpmdW5jdGlvbihnKXtmLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTpmLnByb2dyZXNzLnZhbHVlK2csbXNnOmYucHJvZ3Jlc3MubXNnfSl9LHJlcG9ydEVycm9yOmZ1bmN0aW9uKGcsbCl7Y29uc29sZS5lcnJvcihsLnN0YWNrKTtmLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTpmLnByb2dyZXNzLnZhbHVlLG1zZzpnLGVycm9yOiEwfSl9fX07ZC5ydW5UYXNrPWZ1bmN0aW9uKGYsZyxsLGspe2suc2V0TWVzc2FnZShmKTt0cnl7bGV0IG09YS5wcm9maWxlLnV0aWwudGltZShmLApsKTtrLnVwZGF0ZVByb2dyZXNzKGcpO3JldHVybiBtfWNhdGNoKG0pe2sucmVwb3J0RXJyb3IoIkZhaWxlZCAiK2YsbSl9fX0pKGMudXRpbHx8KGMudXRpbD17fSkpfSkoYS5wcm9maWxlfHwoYS5wcm9maWxlPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0PgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L21lbW9yeS12aWV3ZXIvdXRpbHMuanMKdmFyIHJtOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhkLGYsZyxsKXtyZXR1cm4icmdiYSgiK01hdGgucm91bmQoMjU1KmQpKyIsIitNYXRoLnJvdW5kKDI1NSpmKSsiLCIrTWF0aC5yb3VuZCgyNTUqZykrIiwiK2wrIikifWEuYnl0ZXNUb01pQj1mdW5jdGlvbihkKXtyZXR1cm4gZC8xMDQ4NTc2fTthLmJ5dGVTaXplT2ZQcmltaXRpdmVUeXBlPWZ1bmN0aW9uKGQpe3N3aXRjaChkKXtjYXNlICJQUkVEIjpyZXR1cm4gMTtjYXNlICJTOCI6cmV0dXJuIDE7Y2FzZSAiUzE2IjpyZXR1cm4gMjtjYXNlICJTMzIiOnJldHVybiA0O2Nhc2UgIlM2NCI6cmV0dXJuIDg7Y2FzZSAiVTgiOnJldHVybiAxO2Nhc2UgIlUxNiI6cmV0dXJuIDI7Y2FzZSAiVTMyIjpyZXR1cm4gNDtjYXNlICJVNjQiOnJldHVybiA4O2Nhc2UgIkJGMTYiOnJldHVybiAyO2Nhc2UgIkYxNiI6cmV0dXJuIDI7Y2FzZSAiRjMyIjpyZXR1cm4gNDtjYXNlICJGNjQiOnJldHVybiA4O2Nhc2UgIkM2NCI6cmV0dXJuIDg7Y2FzZSAiVE9LRU4iOnJldHVybiAwO2RlZmF1bHQ6cmV0dXJuIGNvbnNvbGUuZXJyb3IoIlVuaGFuZGxlZCBwcmltaXRpdmUgdHlwZSAiKwpkKSwwfX07YS5mbGFtZUNvbG9yPWZ1bmN0aW9uKGQsZixnLGwpe3ZvaWQgMD09PWYmJihmPTEpO3ZvaWQgMD09PWcmJihnPTEpO3ZvaWQgMD09PWwmJihsPWs9PjEtTWF0aC5zcXJ0KDEtaykpO2lmKGlzTmFOKGQpKXJldHVybiBjKGYsZixmLGcpO2Q9bChkKTtyZXR1cm4uNT5kP2MoZiwyKmQqZiwwLGcpOmMoMiooMS1kKSpmLGYsMCxnKX07YS5wZXJjZW50PWZ1bmN0aW9uKGQpe3JldHVybiBpc05hTihkKT8iLSI6Ljk5NTw9ZD8iMTAwJSI6MUUtNT5kPyIwLjAwJSI6KDEwMCpkKS50b1ByZWNpc2lvbigyKSsiJSJ9fSkocm18fChybT17fSkpOwo8L3NjcmlwdD4KCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vbWVtb3J5LXZpZXdlci9zaGFwZS5qcwp2YXIgc207CihmdW5jdGlvbihhKXtjbGFzcyBje2NvbnN0cnVjdG9yKGQpe3RoaXMuZWxlbWVudFR5cGU9ZC5lbGVtZW50VHlwZS50b1N0cmluZygpO3RoaXMuZGltZW5zaW9ucz1kLmRpbWVuc2lvbnMubWFwKGY9PnBhcnNlSW50KGYsMTApKTtkLnR1cGxlU2hhcGVzJiYodGhpcy50dXBsZVNoYXBlcz1kLnR1cGxlU2hhcGVzLm1hcChmPT5uZXcgYyhmKSkpO3RoaXMubGF5b3V0PWQubGF5b3V0fXJlc29sdmVTaGFwZUluZGV4KGQpe3JldHVybiBkLnJlZHVjZSgoZixnKT0+Zi50dXBsZVNoYXBlc1tnXSx0aGlzKX11bnBhZGRlZEhlYXBTaXplQnl0ZXMoKXtpZigiVE9LRU4iPT09dGhpcy5lbGVtZW50VHlwZSlyZXR1cm4gMDtpZigiVFVQTEUiPT09dGhpcy5lbGVtZW50VHlwZSlyZXR1cm4gOCp0aGlzLnR1cGxlU2hhcGVzLmxlbmd0aDtsZXQgZD0wO2lmKHRoaXMubGF5b3V0JiYiREVOU0UiIT10aGlzLmxheW91dC5mb3JtYXQpIlNQQVJTRSI9PXRoaXMubGF5b3V0LmZvcm1hdCYmKGY9cGFyc2VJbnQodGhpcy5sYXlvdXQubWF4U3BhcnNlRWxlbWVudHMsCjEwKSxkPWYqcm0uYnl0ZVNpemVPZlByaW1pdGl2ZVR5cGUodGhpcy5lbGVtZW50VHlwZSksZCs9Zip0aGlzLmRpbWVuc2lvbnMubGVuZ3RoKjgpO2Vsc2V7dmFyIGY9dGhpcy5kaW1lbnNpb25zLnJlZHVjZSgoZyxsKT0+ZypsLDEpO2QrPWYqcm0uYnl0ZVNpemVPZlByaW1pdGl2ZVR5cGUodGhpcy5lbGVtZW50VHlwZSl9cmV0dXJuIGR9aHVtYW5TdHJpbmdXaXRoTGF5b3V0KCl7aWYoIlRVUExFIj09PXRoaXMuZWxlbWVudFR5cGUpe3ZhciBkPSIoIjtsZXQgZj0iIjtmb3IoY29uc3QgZyBvZiB0aGlzLnR1cGxlU2hhcGVzKWQ9ZCtmK2cuaHVtYW5TdHJpbmdXaXRoTGF5b3V0KCksZj0iLCAiO3JldHVybiBkKz0iKSJ9ZD10aGlzLmVsZW1lbnRUeXBlLnRvTG93ZXJDYXNlKCkrIlsiO2QrPXRoaXMuZGltZW5zaW9ucy5qb2luKCkrIl0iOyJPUEFRVUUiIT09dGhpcy5lbGVtZW50VHlwZSYmIlRPS0VOIiE9PXRoaXMuZWxlbWVudFR5cGUmJjA8dGhpcy5kaW1lbnNpb25zLmxlbmd0aCYmdGhpcy5sYXlvdXQmJgooZCs9dGhpcy5odW1hbkxheW91dFN0cmluZyh0aGlzLmxheW91dCkpO3JldHVybiBkfWh1bWFuTGF5b3V0U3RyaW5nKGQpe3JldHVybiJTUEFSU0UiPT1kLmZvcm1hdD8ic3BhcnNleyIrZC5tYXhTcGFyc2VFbGVtZW50cysifSI6IkRFTlNFIj09ZC5mb3JtYXQ/InsiK2QubWlub3JUb01ham9yLmpvaW4oKSsifSI6IiJ9fWEuU2hhcGU9Y30pKHNtfHwoc209e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9tZW1vcnktdmlld2VyL2xvZ2ljYWwtYnVmZmVyLmpzCnZhciB0bTsoZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3RvcihkKXt0aGlzLmluc3RydWN0aW9uTmFtZT10aGlzLmNvbXB1dGF0aW9uTmFtZT0iIjt0aGlzLnNoYXBlSW5kZXg9W107dGhpcy5pZD1wYXJzZUludChkLmlkLDEwKTt0aGlzLnNpemU9cGFyc2VJbnQoZC5zaXplLDEwKTt0aGlzLmNvbG9yPXBhcnNlSW50KGQuY29sb3IsMTApO3RoaXMuaW5pdEJ1ZmZlckxvY2F0aW9uXyhkLmRlZmluZWRBdCl9aW5pdEJ1ZmZlckxvY2F0aW9uXyhkKXtkJiYodGhpcy5jb21wdXRhdGlvbk5hbWU9ZC5jb21wdXRhdGlvbk5hbWUsdGhpcy5pbnN0cnVjdGlvbk5hbWU9ZC5pbnN0cnVjdGlvbk5hbWUsdGhpcy5zaGFwZUluZGV4PWQuc2hhcGVJbmRleC5tYXAoZj0+cGFyc2VJbnQoZiwxMCkpKX19YS5Mb2dpY2FsQnVmZmVyPWN9KSh0bXx8KHRtPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vbWVtb3J5LXZpZXdlci9idWZmZXItYWxsb2NhdGlvbi5qcwp2YXIgdW07KGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5pbmRleD1wYXJzZUludChkLmluZGV4LDEwKTt0aGlzLnNpemU9cGFyc2VJbnQoZC5zaXplLDEwKTt0aGlzLmlzVGhyZWFkTG9jYWw9ZC5pc1RocmVhZExvY2FsfHwhMTt0aGlzLmFzc2lnbmVkPWQuYXNzaWduZWQubWFwKGY9Pm5ldyB2bS5CdWZmZXJBbGxvY2F0aW9uQXNzaWduZWQoZikpO3RoaXMuZ3JvdXBOYW1lPXRoaXMuZ2V0R3JvdXBOYW1lKGQpfWdldEdyb3VwTmFtZShkKXtyZXR1cm4gZC5pc0VudHJ5Q29tcHV0YXRpb25QYXJhbWV0ZXI/IlBhcmFtZXRlciI6ZC5tYXliZUxpdmVPdXQ/Ik91dHB1dCI6ZC5pc1RocmVhZExvY2FsPyJUaHJlYWQtbG9jYWwiOiJUZW1wb3JhcnkifX1hLkJ1ZmZlckFsbG9jYXRpb249Y30pKHVtfHwodW09e30pKTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9tZW1vcnktdmlld2VyL2J1ZmZlci1hbGxvY2F0aW9uLWFzc2lnbmVkLmpzCnZhciB2bTsoZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3RvcihkKXt0aGlzLmxvZ2ljYWxCdWZmZXJJZD1wYXJzZUludChkLmxvZ2ljYWxCdWZmZXJJZCwxMCk7dGhpcy5vZmZzZXQ9cGFyc2VJbnQoZC5vZmZzZXQsMTApO3RoaXMuc2l6ZT1wYXJzZUludChkLnNpemUsMTApfX1hLkJ1ZmZlckFsbG9jYXRpb25Bc3NpZ25lZD1jfSkodm18fCh2bT17fSkpOwo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L21lbW9yeS12aWV3ZXIvaGxvLWluc3RydWN0aW9uLmpzCnZhciB3bTsoZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3RvcihkKXt0aGlzLm5hbWU9ZC5uYW1lP2QubmFtZToiIjt0aGlzLm9wY29kZT1kLm9wY29kZT9kLm9wY29kZToiIjt0aGlzLnNoYXBlPWQuc2hhcGU/bmV3IHNtLlNoYXBlKGQuc2hhcGUpOm51bGw7ZC5tZXRhZGF0YSYmKHRoaXMudGZPcE5hbWU9ZC5tZXRhZGF0YS5vcE5hbWU/ZC5tZXRhZGF0YS5vcE5hbWU6IiIpfX1hLkhsb0luc3RydWN0aW9uPWN9KSh3bXx8KHdtPXt9KSk7Cjwvc2NyaXB0PgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L21lbW9yeS12aWV3ZXIvbWVtb3J5LXVzYWdlLmpzCnZhciB4bTsKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5idWZmZXJzXz1bXTt0aGlzLmlkVG9CdWZmZXJfPXt9O3RoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fPXt9O3RoaXMubmFtZVRvSGxvXz17fTt0aGlzLnVucGFkZGVkUGVha0hlYXBTaXplQnl0ZXM9dGhpcy5wZWFrSGVhcFNpemVCeXRlcz10aGlzLnJlc3RfPXRoaXMubkNvbG9yXz0wO3RoaXMucGVha0xvZ2ljYWxCdWZmZXJzPVtdO3RoaXMuaW5kZWZpbml0ZU1lbW9yeVVzYWdlQnl0ZXM9dGhpcy5wZWFrSGVhcFNpemVQb3NpdGlvbj0wO3RoaXMuaGVhcFNpemVzPVtdO3RoaXMudW5wYWRkZWRIZWFwU2l6ZXM9W107dGhpcy5tYXhIZWFwPVtdO3RoaXMubWF4SGVhcEJ5U2l6ZT1bXTt0aGlzLmJ5U2l6ZVRvTWF4SGVhcD1bXTt0aGlzLm1heEhlYXBUb0J5U2l6ZT1bXTt0aGlzLmxvZ2ljYWxCdWZmZXJTcGFucz17fTt0aGlzLnVuU2VlbkxvZ2ljYWxCdWZmZXJzXz1uZXcgU2V0O3RoaXMuc2VlbkJ1ZmZlckFsbG9jYXRpb25zXz1uZXcgU2V0Owp0aGlzLnNtYWxsQnVmZmVyU2l6ZT0xNjM4NDt0aGlzLmluaXRIbG9JbnN0cnVjdGlvbnNfKGQuaGxvTW9kdWxlKTt0aGlzLmluaXRNZW1vcnlVc2FnZV8oZC5idWZmZXJBc3NpZ25tZW50KTt0aGlzLmluaXRNYXhIZWFwXygpfWluaXRIbG9JbnN0cnVjdGlvbnNfKGQpe2lmKGQpZm9yKGNvbnN0IGYgb2YgZC5jb21wdXRhdGlvbnMpZm9yKGNvbnN0IGcgb2YgZi5pbnN0cnVjdGlvbnMpZy5uYW1lJiYodGhpcy5uYW1lVG9IbG9fW2cubmFtZV09bmV3IHdtLkhsb0luc3RydWN0aW9uKGcpKTtlbHNlIGNvbnNvbGUud2FybigiTWlzc2luZyBobG9Nb2R1bGUsIHNraXBwaW5nIHVucGFkZGVkIGFsbG9jYXRpb24gc2l6ZSBhbmFseXNpcyIpfWluaXRNZW1vcnlVc2FnZV8oZCl7ZD8odGhpcy5pbml0QnVmZmVyc18oZCksdGhpcy5pbml0QWxsb2NhdGlvbnNfKGQpLChkPXRoaXMuZ2V0SGJtSGVhcFRyYWNlXyhkKSk/dGhpcy5maW5kUGVha01lbW9yeVVzYWdlXyhkKTpjb25zb2xlLmVycm9yKCJNaXNzaW5nIGhibSBoZWFwIHNpbXVsYXRvciB0cmFjZS4iKSk6CmNvbnNvbGUuZXJyb3IoIk5vIGJ1ZmZlciBhc3NpZ25tZW50IGluZm8iKX1nZXRIYm1IZWFwVHJhY2VfKGQpe2Zvcihjb25zdCBmIG9mIGQuaGVhcFNpbXVsYXRvclRyYWNlcylmb3IoY29uc3QgZyBvZiBmLmV2ZW50cylpZihnLmJ1ZmZlcklkJiYoZD10aGlzLmlkVG9CdWZmZXJfW2cuYnVmZmVySWRdKSl7aWYoMCE9ZC5jb2xvcilicmVhaztyZXR1cm4gZn1yZXR1cm4gbnVsbH1pbml0QnVmZmVyc18oZCl7Zm9yKGxldCBmIG9mIGQubG9naWNhbEJ1ZmZlcnMpZD1uZXcgdG0uTG9naWNhbEJ1ZmZlcihmKSx0aGlzLmJ1ZmZlcnNfLnB1c2goZCksdGhpcy5pZFRvQnVmZmVyX1tkLmlkXT1kLHRoaXMudW5TZWVuTG9naWNhbEJ1ZmZlcnNfLmFkZChkLmlkKX1pbml0QWxsb2NhdGlvbnNfKGQpe2Zvcihjb25zdCBmIG9mIGQuYnVmZmVyQWxsb2NhdGlvbnMpe2Q9bmV3IHVtLkJ1ZmZlckFsbG9jYXRpb24oZik7Zm9yKGNvbnN0IGcgb2YgZi5hc3NpZ25lZClnLmxvZ2ljYWxCdWZmZXJJZCYmKHRoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fW2cubG9naWNhbEJ1ZmZlcklkXT0KZCl9fW5ld0hlYXBPYmplY3RfKGQsZixnLGwsayl7Y29uc3QgbT1nP3JtLmJ5dGVzVG9NaUIoZy51bnBhZGRlZEhlYXBTaXplQnl0ZXMoKSk6MDtyZXR1cm57aW5zdHJ1Y3Rpb25OYW1lOmYuaW5zdHJ1Y3Rpb25OYW1lLGxvZ2ljYWxCdWZmZXJJZDpmLmlkLHVucGFkZGVkU2l6ZU1pQjptLHRmT3BOYW1lOmwudGZPcE5hbWUsb3Bjb2RlOmwub3Bjb2RlLHNpemVNaUI6cm0uYnl0ZXNUb01pQihmLnNpemUpLGNvbG9yOmQsc2hhcGU6Zz9nLmh1bWFuU3RyaW5nV2l0aExheW91dCgpOiIiLGdyb3VwTmFtZTprfX1hZGRIZWFwT2JqZWN0XyhkLGYsZyl7aWYoZi5zaXplPD1kLnNtYWxsQnVmZmVyU2l6ZSlkLnJlc3RfKz1mLnNpemU7ZWxzZSBpZihmLmluc3RydWN0aW9uTmFtZSl7dmFyIGw9ZC5uYW1lVG9IbG9fW2YuaW5zdHJ1Y3Rpb25OYW1lXTtpZihsKXt2YXIgaz1sLnNoYXBlLnJlc29sdmVTaGFwZUluZGV4KGYuc2hhcGVJbmRleCk7ZC5tYXhIZWFwLnB1c2goZC5uZXdIZWFwT2JqZWN0XyhkLm5Db2xvcl8rKywKZixrLGwsZykpfX19aW5pdE1heEhlYXBfKCl7Zm9yKHZhciBkIG9mIHRoaXMucGVha0xvZ2ljYWxCdWZmZXJzKXtjb25zdCBmPXRoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fW2RdO3RoaXMuYWRkSGVhcE9iamVjdF8odGhpcyx0aGlzLmlkVG9CdWZmZXJfW2RdLGY/Zi5ncm91cE5hbWU6IiIpfTAhPXRoaXMucmVzdF8mJihkPSJzbWFsbCAoXHgzYyIrdGhpcy5zbWFsbEJ1ZmZlclNpemUvMTAyNCsiIEtpQikiLHRoaXMubWF4SGVhcC5wdXNoKHtpbnN0cnVjdGlvbk5hbWU6ZCxzaXplTWlCOnJtLmJ5dGVzVG9NaUIodGhpcy5yZXN0XyksY29sb3I6MCxncm91cE5hbWU6ZH0pKTtkPXRoaXMubWF4SGVhcC5tYXAoZnVuY3Rpb24oZixnKXtyZXR1cm57aW5kOmcsdmFsOmZ9fSk7ZC5zb3J0KChmLGcpPT5nLnZhbC5zaXplTWlCLWYudmFsLnNpemVNaUIpO3RoaXMubWF4SGVhcEJ5U2l6ZT1kLm1hcChmdW5jdGlvbihmKXtyZXR1cm4gZi52YWx9KTt0aGlzLmJ5U2l6ZVRvTWF4SGVhcD1kLm1hcChmdW5jdGlvbihmKXtyZXR1cm4gZi5pbmR9KTsKdGhpcy5tYXhIZWFwVG9CeVNpemUubGVuZ3RoPXRoaXMubWF4SGVhcC5sZW5ndGg7Zm9yKGQ9MDtkPHRoaXMuYnlTaXplVG9NYXhIZWFwLmxlbmd0aDtkKyspdGhpcy5tYXhIZWFwVG9CeVNpemVbdGhpcy5ieVNpemVUb01heEhlYXBbZF1dPWR9ZmluZFBlYWtNZW1vcnlVc2FnZV8oZCl7bGV0IGY9W10sZz1bXTt2YXIgbD1bXTtsZXQgaz1bXSxtPTAscD0wLHE9MCxyPTAsdD0wO2Zvcihjb25zdCB5IG9mIGQuZXZlbnRzKXtmLnB1c2gocm0uYnl0ZXNUb01pQihtKSk7Zy5wdXNoKHJtLmJ5dGVzVG9NaUIocCkpO2NvbnN0IHg9cGFyc2VJbnQoeS5idWZmZXJJZCwxMCk7ZD10aGlzLmlkVG9CdWZmZXJfW3hdO3RoaXMudW5TZWVuTG9naWNhbEJ1ZmZlcnNfLmRlbGV0ZSh4KTt2YXIgdj10aGlzLmlkVG9CdWZmZXJBbGxvY2F0aW9uX1t4XTt2JiZ0aGlzLnNlZW5CdWZmZXJBbGxvY2F0aW9uc18uYWRkKHYuaW5kZXgpO3Y9bnVsbDtkLmluc3RydWN0aW9uTmFtZSYmIiIhPWQuaW5zdHJ1Y3Rpb25OYW1lJiYKKHY9dGhpcy5uYW1lVG9IbG9fW2QuaW5zdHJ1Y3Rpb25OYW1lXS5zaGFwZS5yZXNvbHZlU2hhcGVJbmRleChkLnNoYXBlSW5kZXgpKTtzd2l0Y2goeS5raW5kLnRvU3RyaW5nKCkpe2Nhc2UgIkFMTE9DIjpjYXNlICJTSEFSRV9XSVRIIjpsLnB1c2goeCk7bSs9ZC5zaXplO3YmJihwKz12LnVucGFkZGVkSGVhcFNpemVCeXRlcygpKTt0aGlzLmxvZ2ljYWxCdWZmZXJTcGFuc1t4XT1bZi5sZW5ndGgsLTFdO20+cSYmKHE9bSxyPXAsdD1mLmxlbmd0aCxrPWwuc2xpY2UoKSk7YnJlYWs7Y2FzZSAiRlJFRSI6bD1sLmZpbHRlcihDPT5DIT09eCk7bS09ZC5zaXplO3YmJihwLT12LnVucGFkZGVkSGVhcFNpemVCeXRlcygpKTt0aGlzLmxvZ2ljYWxCdWZmZXJTcGFuc1t4XVsxXT1mLmxlbmd0aDswPm0mJmNvbnNvbGUuZXJyb3IoImhlYXBfc2l6ZV9ieXRlcyBceDNjIDAiKTticmVhaztkZWZhdWx0OmNvbnNvbGUubG9nKCJFUlJPUjogdW5rbm93biBoZWFwIGV2ZW50IGtpbmQ6Iix5KX19Zi5wdXNoKHJtLmJ5dGVzVG9NaUIobSkpOwpsPXRoaXMuZmluZEluZGVmaW5pdGVNZW1vcnlVc2FnZV8odGhpcy51blNlZW5Mb2dpY2FsQnVmZmVyc18pO3RoaXMucGVha0hlYXBTaXplQnl0ZXM9cStsO3RoaXMudW5wYWRkZWRQZWFrSGVhcFNpemVCeXRlcz1yK2w7dGhpcy5wZWFrTG9naWNhbEJ1ZmZlcnM9azt0aGlzLnBlYWtIZWFwU2l6ZVBvc2l0aW9uPXQ7Y29uc3QgQT1ybS5ieXRlc1RvTWlCKGwpO3RoaXMuaGVhcFNpemVzPWYubWFwKHk9PnkrQSk7dGhpcy51bnBhZGRlZEhlYXBTaXplcz1nLm1hcCh5PT55K0EpfWZpbmRJbmRlZmluaXRlTWVtb3J5VXNhZ2VfKGQpe2xldCBmPTA7ZC5mb3JFYWNoKGc9Pntjb25zdCBsPXRoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fW2ddO2wuaXNUaHJlYWRMb2NhbHx8dGhpcy5zZWVuQnVmZmVyQWxsb2NhdGlvbnNfLmhhcyhsLmluZGV4KXx8KHRoaXMuc2VlbkJ1ZmZlckFsbG9jYXRpb25zXy5hZGQobC5pbmRleCksZis9bC5zaXplLHRoaXMuYWRkSGVhcE9iamVjdF8odGhpcyx0aGlzLmlkVG9CdWZmZXJfW2ddLApsLmdyb3VwTmFtZSkpfSk7cmV0dXJuIHRoaXMuaW5kZWZpbml0ZU1lbW9yeVVzYWdlQnl0ZXM9Zn19YS5NZW1vcnlVc2FnZT1jfSkoeG18fCh4bT17fSkpOwo8L3NjcmlwdD4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0ibXYtbGluZS1jaGFydCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBsb3R0YWJsZS1zdHlsZSI+PC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9Im12LWxpbmUtY2hhcnQiPgogICAgICA8aDI+V29ya2luZyBTcGFjZSBTaXplIChNaUIpIHZzIFByb2dyYW0gT3JkZXIgKEhMTyBTZXF1ZW5jZSk8L2gyPgogICAgICA8ZGl2IGlkPSJjaGFydGRpdiIgc3R5bGU9IndpZHRoOjEyMDBweDtoZWlnaHQ6Mzg0cHgiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJtYXhoZWFwLWRldGFpbHMiPgogICAgICAgIDxlbT5Ib3ZlciBvdmVyIGEgYmFyIGZvciBidWZmZXIgZGV0YWlscyB0byBhcHBlYXIgb24gdGhlIGxlZnQuPC9lbT4KICAgICAgPC9kaXY+CiAgICAgIDxoMz5CeSBQcm9ncmFtIE9yZGVyPC9oMz4KICAgICAgPGRpdiBpZD0ibWF4aGVhcGNoYXJ0IiBzdHlsZT0id2lkdGg6MTIwMHB4O2hlaWdodDoyMDBweCI+PC9kaXY+CiAgICAgIDxoMz5CeSBTaXplPC9oMz4KICAgICAgPGRpdiBpZD0ibWF4aGVhcHNpemVjaGFydCIgc3R5bGU9IndpZHRoOjEyMDBweDtoZWlnaHQ6MjAwcHgiPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vbWVtb3J5LXZpZXdlci9tdi1saW5lLWNoYXJ0LmpzCnZhciB5bTsKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Im12LWxpbmUtY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2RhdGFDaGFuZ2VkIn0sYWN0aXZlOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9yZW5kZXJTcGFucyJ9LGJ1ZmZlclNpemVzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sdW5wYWRkZWRCdWZmZXJTaXplczp7dHlwZTpBcnJheSxub3RpZnk6ITB9LG1heEhlYXA6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxtYXhIZWFwQnlTaXplOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sc3BhblBsb3Q6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sY29sb3JTY2FsZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfc2VsZWN0ZWRFbnRpdHlJblNyY0NoYXJ0Ont0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZEVudGl0eUNoYW5nZWQifSxfc2VsZWN0ZWRFbnRpdHlJbkRzdENoYXJ0Ont0eXBlOk9iamVjdCxub3RpZnk6ITAsCm9ic2VydmVyOiJfc2VsZWN0ZWRFbnRpdHlDaGFuZ2VkIn0sX3N5bWJvbFRvRXZlbnRDYWxsYmFjazp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBNYXB9fSxfbWFrZUNoYXJ0RGF0YXNldCgpe2lmKHRoaXMuZGF0YSl7dGhpcy5idWZmZXJTaXplcz10aGlzLmRhdGEuaGVhcFNpemVzLm1hcCgoZCxmKT0+W2YsZF0pO3RoaXMudW5wYWRkZWRCdWZmZXJTaXplcz10aGlzLmRhdGEudW5wYWRkZWRIZWFwU2l6ZXMubWFwKChkLGYpPT5bZixkXSk7dmFyIGE9dGhpcy5kYXRhLm1heEhlYXA7dGhpcy5kYXRhLm1heEhlYXAucmVkdWNlKGZ1bmN0aW9uKGQsZixnKXthW2ddLm9mZnNldD1kO3JldHVybiBkK2Yuc2l6ZU1pQn0sMCk7dGhpcy5tYXhIZWFwPWE7dmFyIGM9dGhpcy5kYXRhLm1heEhlYXBCeVNpemU7dGhpcy5kYXRhLm1heEhlYXBCeVNpemUucmVkdWNlKGZ1bmN0aW9uKGQsZixnKXtjW2ddLm9mZnNldEJ5U2l6ZT1kO3JldHVybiBkK2Yuc2l6ZU1pQn0sMCk7dGhpcy5tYXhIZWFwQnlTaXplPQpjfX0sX2RyYXdQcm9ncmFtT3JkZXIoKXtpZih0aGlzLmRhdGEpe3ZhciBhPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcixjPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcixkPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGEsImJvdHRvbSIpLGY9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYywibGVmdCIpLGc9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO2cuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodGhpcy5idWZmZXJTaXplcykpO2cueChmdW5jdGlvbih2KXtyZXR1cm4gdlswXX0sYSkueShmdW5jdGlvbih2KXtyZXR1cm4gdlsxXX0sYykuYXR0cigic3Ryb2tlIiwicmVkIik7dmFyIGw9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO2wuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodGhpcy51bnBhZGRlZEJ1ZmZlclNpemVzKSk7bC54KGZ1bmN0aW9uKHYpe3JldHVybiB2WzBdfSxhKS55KGZ1bmN0aW9uKHYpe3JldHVybiB2WzFdfSxjKS5hdHRyKCJzdHJva2UiLAoiZ3JleSIpO3ZhciBrPW5ldyBQbG90dGFibGUuUGxvdHMuUmVjdGFuZ2xlLG09dGhpcy5idWZmZXJTaXplcy5sZW5ndGgvNDA7ay5hZGREYXRhc2V0KG5ldyBQbG90dGFibGUuRGF0YXNldChbdGhpcy5idWZmZXJTaXplc1t0aGlzLmRhdGEucGVha0hlYXBTaXplUG9zaXRpb25dXSkpO2sueChmdW5jdGlvbih2KXtyZXR1cm4gdlswXS1tLzJ9LGEpLnkoZnVuY3Rpb24oKXtyZXR1cm4gMH0sYykueDIoZnVuY3Rpb24odil7cmV0dXJuIHZbMF0rbS8yfSkueTIoZnVuY3Rpb24odil7cmV0dXJuIHZbMV19KS5hdHRyKCJmaWxsIiwicmVkIikuYXR0cigib3BhY2l0eSIsLjMpO3ZhciBwPXRoaXMuY29sb3JTY2FsZSxxPW5ldyBQbG90dGFibGUuUGxvdHMuUmVjdGFuZ2xlLHI9dGhpcy5kYXRhLmxvZ2ljYWxCdWZmZXJTcGFucyx0PXRoaXMubWF4SGVhcC5tYXAodj0+e2NvbnN0IEE9clt2LmxvZ2ljYWxCdWZmZXJJZF07cmV0dXJuIEE/e2lkOnYubG9naWNhbEJ1ZmZlcklkLHNwYW46QSxzaXplOnYuc2l6ZU1pQiwKY29sb3I6di5jb2xvcn06bnVsbH0pO3Q9dC5maWx0ZXIodj0+bnVsbCE9PXYpO3EuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodCkpO3EueChmdW5jdGlvbih2KXtyZXR1cm4gdi5zcGFuWzBdfSxhKS55KGZ1bmN0aW9uKCl7cmV0dXJuIDB9LGMpLngyKGZ1bmN0aW9uKHYpe3JldHVybiB2LnNwYW5bMV19KS55MihmdW5jdGlvbih2KXtyZXR1cm4gdi5zaXplfSkuYXR0cigiZmlsbCIsZnVuY3Rpb24odil7cmV0dXJuKHYuY29sb3IlMTApLnRvU3RyaW5nKCl9LHApLmF0dHIoImZpbGwtb3BhY2l0eSIsMCk7dGhpcy5zcGFuUGxvdD1xO3A9bmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3I7cC5yYW5nZShbInJlZCIsImdyZXkiXSk7cC5kb21haW4oWyJTaXplcyIsIlVucGFkZGVkIFNpemVzIl0pO3A9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkxlZ2VuZChwKTtwLm1heEVudHJpZXNQZXJSb3coMik7YT1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JpZGxpbmVzKGEsYyk7Cmc9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFtrLGcsbCxhLHFdKTtkPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW251bGwscF0sW2YsZ10sW251bGwsZF1dKTtmPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO2Yuc2VsZWN0QWxsKCIuY29tcG9uZW50IikucmVtb3ZlKCk7ZC5yZW5kZXJUbyhmKX19LF9kcmF3TWF4SGVhcCgpe2xldCBhPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcixjPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhjLCJ0b3AiKTtuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhhLCJsZWZ0Iik7bGV0IGQ9dGhpcy5jb2xvclNjYWxlO2QzLnNlbGVjdCh0aGlzLiQubWF4aGVhcGNoYXJ0KS5zZWxlY3RBbGwoIi5jb21wb25lbnQiKS5yZW1vdmUoKTtkMy5zZWxlY3QodGhpcy4kLm1heGhlYXBzaXplY2hhcnQpLnNlbGVjdEFsbCgiLmNvbXBvbmVudCIpLnJlbW92ZSgpO3RoaXMuX21heEhlYXBDaGFydE1vdXNlTW92ZUtleSYmCih0aGlzLl91bmxpc3Rlbih0aGlzLl9tYXhIZWFwQ2hhcnRNb3VzZU1vdmVLZXkpLHRoaXMuX21heEhlYXBDaGFydE1vdXNlTW92ZUtleT1udWxsKTt0aGlzLl9tYXhIZWFwU2l6ZUNoYXJ0TW91c2VNb3ZlS2V5JiYodGhpcy5fdW5saXN0ZW4odGhpcy5fbWF4SGVhcFNpemVDaGFydE1vdXNlTW92ZUtleSksdGhpcy5fbWF4SGVhcFNpemVDaGFydE1vdXNlTW92ZUtleT1udWxsKTtsZXQgZj1uZXcgUGxvdHRhYmxlLlBsb3RzLlJlY3RhbmdsZTtmLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHRoaXMubWF4SGVhcCkpLngoZnVuY3Rpb24obCl7cmV0dXJuIGwub2Zmc2V0fSxjKS55KGZ1bmN0aW9uKCl7cmV0dXJuIDB9LGEpLngyKGZ1bmN0aW9uKGwpe3JldHVybiBsLm9mZnNldCtsLnNpemVNaUJ9KS55MihmdW5jdGlvbigpe3JldHVybiAxMn0pLmF0dHIoImZpbGwiLGZ1bmN0aW9uKGwpe3JldHVybihsLmNvbG9yJTEwKS50b1N0cmluZygpfSxkKS5hdHRyKCJvcGFjaXR5IiwKIjAuNiIpLnJlbmRlclRvKGQzLnNlbGVjdCh0aGlzLiQubWF4aGVhcGNoYXJ0KSk7bGV0IGc9bmV3IFBsb3R0YWJsZS5QbG90cy5SZWN0YW5nbGU7Zy5hZGREYXRhc2V0KG5ldyBQbG90dGFibGUuRGF0YXNldCh0aGlzLm1heEhlYXBCeVNpemUpKS54KGZ1bmN0aW9uKGwpe3JldHVybiBsLm9mZnNldEJ5U2l6ZX0sYykueShmdW5jdGlvbigpe3JldHVybiAwfSxhKS54MihmdW5jdGlvbihsKXtyZXR1cm4gbC5vZmZzZXRCeVNpemUrbC5zaXplTWlCfSkueTIoZnVuY3Rpb24oKXtyZXR1cm4gMTJ9KS5hdHRyKCJmaWxsIixmdW5jdGlvbihsKXtyZXR1cm4obC5jb2xvciUxMCkudG9TdHJpbmcoKX0sZCkuYXR0cigib3BhY2l0eSIsIjAuNiIpLnJlbmRlclRvKGQzLnNlbGVjdCh0aGlzLiQubWF4aGVhcHNpemVjaGFydCkpO3RoaXMuX21heEhlYXBDaGFydE1vdXNlTW92ZUtleT10aGlzLl9saXN0ZW4odGhpcy4kLm1heGhlYXBjaGFydCwibW91c2Vtb3ZlIixsPT57dGhpcy5fb25Ib3ZlckludGVyYWN0aW9uKGwsCmYsZyx0aGlzLmRhdGEubWF4SGVhcFRvQnlTaXplKX0se3Bhc3NpdmU6ITB9KTt0aGlzLl9tYXhIZWFwU2l6ZUNoYXJ0TW91c2VNb3ZlS2V5PXRoaXMuX2xpc3Rlbih0aGlzLiQubWF4aGVhcHNpemVjaGFydCwibW91c2Vtb3ZlIixsPT57dGhpcy5fb25Ib3ZlckludGVyYWN0aW9uKGwsZyxmLHRoaXMuZGF0YS5ieVNpemVUb01heEhlYXApfSx7cGFzc2l2ZTohMH0pfSxfbGlzdGVuKGEsYyxkLGY9bnVsbCl7Y29uc3QgZz1TeW1ib2woKTthLmFkZEV2ZW50TGlzdGVuZXIoYyxkLGYpO3RoaXMuX3N5bWJvbFRvRXZlbnRDYWxsYmFjay5zZXQoZyx7ZXZlbnROYW1lOmMsbm9kZTphLGNhbGxiYWNrOmQsb3B0aW9uczpmfSk7cmV0dXJuIGd9LF91bmxpc3RlbihhKXtjb25zb2xlLmFzc2VydCh0aGlzLl9zeW1ib2xUb0V2ZW50Q2FsbGJhY2suaGFzKGEpLCJDYW5ub3QgdW5saXN0ZW4gYW4gdW5rbm93biBldmVudCIpO2E9dGhpcy5fc3ltYm9sVG9FdmVudENhbGxiYWNrLmdldChhKTtjb25zdCB7Y2FsbGJhY2s6YywKZXZlbnROYW1lOmQsbm9kZTpmLG9wdGlvbnM6Z309YTtmLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLGcpfSxfb25Ib3ZlckludGVyYWN0aW9uKGEsYyxkLGYpe3ZhciBnPWMucm9vdEVsZW1lbnQoKS5ub2RlKCk7KHtsZWZ0Omd9PWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO2NvbnN0IGw9YS5jbGllbnRYLWc7KGE9Yy5lbnRpdGllcygpLmZpbmQoaz0+e2NvbnN0IHt4Om0sd2lkdGg6cH09ay5ib3VuZHM7cmV0dXJuIG08PWwmJm0rcD49bH0pKT8odGhpcy5hY3RpdmU9YS5kYXR1bSx0aGlzLl9zZWxlY3RlZEVudGl0eUluU3JjQ2hhcnQ9YSx0aGlzLl9zZWxlY3RlZEVudGl0eUluRHN0Q2hhcnQ9ZC5lbnRpdGllcygpW2ZbYS5pbmRleF1dKTp0aGlzLmFjdGl2ZT10aGlzLl9zZWxlY3RlZEVudGl0eUluRHN0Q2hhcnQ9dGhpcy5fc2VsZWN0ZWRFbnRpdHlJblNyY0NoYXJ0PW51bGx9LF9zZWxlY3RlZEVudGl0eUNoYW5nZWQoYSxjKXtjJiZjLnNlbGVjdGlvbi5hdHRyKCJvcGFjaXR5IiwKIjAuNiIpO2EmJmEuc2VsZWN0aW9uLmF0dHIoIm9wYWNpdHkiLCIxLjAiKX0sX3JlbmRlclNwYW5zKGEpe3RoaXMuc3BhblBsb3QmJih0aGlzLnNwYW5QbG90LnNlbGVjdGlvbnMoKS5hdHRyKCJmaWxsLW9wYWNpdHkiLCIwIiksYSYmdGhpcy5zcGFuUGxvdC5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5zZWxlY3Rpb24uYXR0cigiZmlsbC1vcGFjaXR5IixjLmRhdHVtLmlkPT09YS5sb2dpY2FsQnVmZmVySWQ/MTowKX0pKX0sX3JlZHJhdzpmdW5jdGlvbigpe3RoaXMuZGF0YSYmKHRoaXMuY29sb3JTY2FsZT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcigiQ2F0ZWdvcnkxMCIpLHRoaXMuX21ha2VDaGFydERhdGFzZXQoKSx0aGlzLl9kcmF3UHJvZ3JhbU9yZGVyKCksdGhpcy5fZHJhd01heEhlYXAoKSl9LF9kYXRhQ2hhbmdlZChhKXthJiZ0aGlzLl9yZWRyYXcoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9yZWRyYXcoKX19KX0pKHltfHwoeW09e30pKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW12LWJhciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0iYnVmZmVyLWRldGFpbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgcGFwZXItY2FyZCB7CiAgICAgICAgLS1wYXBlci1jYXJkLWhlYWRlci1jb2xvcjogd2hpdGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtbXYtYmFyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjc3ViaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwIDE2cHggNnB4OwogICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogLTEwcHg7CiAgICAgIH0KICAgICAgLmNhcmQtY29udGVudCB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgfQogICAgICAuY2FyZC1jb250ZW50ID4gZGl2IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxZW07CiAgICAgIH0KICAgICAgLmV4cHJlc3Npb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1jYXJkIGlkPSJjYXJkIiBoZWFkaW5nPSJbW25vZGUuaW5zdHJ1Y3Rpb25OYW1lXV0iIGhpZGRlbj0iW1shbm9kZV1dIiBlbGV2YXRpb249IjIiPgogICAgICA8ZGl2IGlkPSJzdWJoZWFkZXIiPltbX3N1YmhlYWRlcihub2RlKV1dPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIXNpemVdXSI+CiAgICAgICAgICA8aDQ+U2l6ZTogPHNwYW4+W1tzaXplXV08L3NwYW4+PGI+IE1pQjwvYj48L2g0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyF1bnBhZGRlZFNpemVdXSI+CiAgICAgICAgICA8Yj5VbnBhZGRlZCBTaXplOiA8L2I+PHNwYW4+W1t1bnBhZGRlZFNpemVdXTwvc3Bhbj48Yj4gTWlCPC9iPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFwYWRkaW5nXV0iPgogICAgICAgICAgPGI+RXh0cmEgbWVtb3J5IGR1ZSB0byBwYWRkaW5nOiA8L2I+PHNwYW4+W1twYWRkaW5nXV08L3NwYW4+PGI+IE1pQjwvYj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shZXhwYW5zaW9uXV0iPgogICAgICAgICAgPGI+RXhwYW5zaW9uOiA8L2I+PHNwYW4+W1tleHBhbnNpb25dXTwvc3Bhbj48Yj5YPC9iPgogICAgICAgICAgPHRmLW12LWJhciB2YWx1ZT0iW1t1dGlsaXphdGlvbl1dIj48L3RmLW12LWJhcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shbm9kZS5zaGFwZV1dIj4KICAgICAgICAgIDxiPlNoYXBlIChhbmQgbWlub3ItdG8tbWFqb3Igb3JkZXIpOiA8L2I+CiAgICAgICAgICA8Y29kZSBjbGFzcz0iZXhwcmVzc2lvbiI+W1tub2RlLnNoYXBlXV08L2NvZGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIW5vZGUudGZPcE5hbWVdXSI+CiAgICAgICAgICA8Yj5UZiBPcCBOYW1lOiA8L2I+CiAgICAgICAgICA8Y29kZSBjbGFzcz0iZXhwcmVzc2lvbiI+W1tub2RlLnRmT3BOYW1lXV08L2NvZGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIW5vZGUuZ3JvdXBOYW1lXV0iPgogICAgICAgICAgPGI+QWxsb2NhdGlvbiBUeXBlOiA8L2I+PHNwYW4+W1tub2RlLmdyb3VwTmFtZV1dPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItY2FyZD4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9tZW1vcnktdmlld2VyL2J1ZmZlci1kZXRhaWxzLmpzCnZhciB6bTsKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLW12LWJhciIscHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCxvYnNlcnZlcjoiX3VwZGF0ZVZhbHVlIn19LF91cGRhdGVWYWx1ZTpmdW5jdGlvbihhKXtjb25zdCBjPXJtLmZsYW1lQ29sb3IoYSk7YT1ybS5wZXJjZW50KGEpO3RoaXMuc3R5bGUuYmFja2dyb3VuZD1gbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAke2N9ICR7YX0sICNjY2MgJHthfSlgfX0pO1BvbHltZXIoe2lzOiJidWZmZXItZGV0YWlscyIscHJvcGVydGllczp7bm9kZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfdXBkYXRlQ2FyZCJ9LHNpemU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sdW5wYWRkZWRTaXplOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHBhZGRpbmc6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sZXhwYW5zaW9uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHV0aWxpemF0aW9uOnt0eXBlOk51bWJlcixub3RpZnk6ITB9fSwKX3VwZGF0ZUNhcmQ6ZnVuY3Rpb24oYSl7aWYoYSl7dGhpcy5zaXplPWEuc2l6ZU1pQi50b0ZpeGVkKDEpO3ZhciBjPSJyZ2IoMTkyLDE5MiwxOTIpIjthLnVucGFkZGVkU2l6ZU1pQiYmKHRoaXMudW5wYWRkZWRTaXplPWEudW5wYWRkZWRTaXplTWlCLnRvRml4ZWQoMSksdGhpcy5wYWRkaW5nPShhLnNpemVNaUItYS51bnBhZGRlZFNpemVNaUIpLnRvRml4ZWQoMSksdGhpcy51dGlsaXphdGlvbj1hLnVucGFkZGVkU2l6ZU1pQi9hLnNpemVNaUIsdGhpcy5leHBhbnNpb249KDEvdGhpcy51dGlsaXphdGlvbikudG9GaXhlZCgxKSxjPXJtLmZsYW1lQ29sb3IodGhpcy51dGlsaXphdGlvbiwuNykpO3RoaXMuJC5jYXJkLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2FyZC1iYWNrZ3JvdW5kLWNvbG9yIjpjfSk7dGhpcy4kLnN1YmhlYWRlci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Y319LF9zdWJoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEub3Bjb2RlP2Eub3Bjb2RlKyIgb3BlcmF0aW9uIjoKIiJ9fSl9KSh6bXx8KHptPXt9KSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9Im1lbW9yeS12aWV3ZXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgICNkZXNjcmlwdGlvbiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMmVtOwogICAgICAgIHdpZHRoOiA2MDBweDsKICAgICAgfQogICAgICBtdi1saW5lLWNoYXJ0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJtZW1vcnktdmlld2VyLWRhc2hib2FyZCIgc3R5bGU9Im92ZXJmbG93OmF1dG8iPgogICAgICA8aDM+TW9kdWxlIG5hbWU6IDxzcGFuPltbbW9kdWxlTmFtZV9dXTwvc3Bhbj48L2gzPgogICAgICA8aDM+CiAgICAgICAgUGVhayBtZW1vcnkgYWxsb2NhdGlvbiBpcyA8c3Bhbj57e3BlYWtIZWFwU2l6ZU1pQl99fTwvc3Bhbj4gTWlCCiAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToyMHB4IiBoaWRkZW49Int7IXVucGFkZGVkUGVha0hlYXBTaXplTWlCX319Ij4oIHt7dW5wYWRkZWRQZWFrSGVhcFNpemVNaUJffX0gTWlCIHdpdGhvdXQgcGFkZGluZyk8L3NwYW4+CiAgICAgIDwvaDM+CiAgICAgIDxkaXYgaWQ9ImRlc2NyaXB0aW9uIj4KICAgICAgICA8cD4KICAgICAgICAgIE1vZGlmeWluZyB5b3VyIG1vZGVsJ3MgYXJjaGl0ZWN0dXJlLCBiYXRjaCBzaXplIGFuZCBkYXRhIGRpbWVudGlvbnMKICAgICAgICAgIG1heSBoZWxwIHJlZHVjZSB0aGUgbWVtb3J5IGZvb3RwcmludC4KICAgICAgICAKICAgICAgPC9kaXY+CiAgICAgIDxtdi1saW5lLWNoYXJ0IGRhdGE9Int7dXNhZ2V9fSIgYWN0aXZlPSJ7e2FjdGl2ZX19Ij48L212LWxpbmUtY2hhcnQ+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9tZW1vcnktdmlld2VyL21lbW9yeS12aWV3ZXItZGFzaGJvYXJkLmpzCnZhciBBbTsKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Im1lbW9yeS12aWV3ZXItZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfZGF0YTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJkYXRhQ2hhbmdlZF8ifSxobG9Nb2R1bGVfOnt0eXBlOk9iamVjdH0sbW9kdWxlTmFtZV86e3R5cGU6U3RyaW5nfSxwZWFrSGVhcFNpemVNaUJfOnt0eXBlOlN0cmluZ30sdW5wYWRkZWRQZWFrSGVhcFNpemVNaUJfOnt0eXBlOlN0cmluZ30sdXNhZ2U6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sYWN0aXZlOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LGRhdGFDaGFuZ2VkXyhhKXthJiZhLmhsb01vZHVsZSYmYS5idWZmZXJBc3NpZ25tZW50JiYodGhpcy5obG9Nb2R1bGVfPWEuaGxvTW9kdWxlLHRoaXMubW9kdWxlTmFtZV89dGhpcy5obG9Nb2R1bGVfLm5hbWU/dGhpcy5obG9Nb2R1bGVfLm5hbWU6IiIsdGhpcy51c2FnZT1uZXcgeG0uTWVtb3J5VXNhZ2UoYSksdGhpcy5wZWFrSGVhcFNpemVNaUJfPXJtLmJ5dGVzVG9NaUIodGhpcy51c2FnZS5wZWFrSGVhcFNpemVCeXRlcykudG9GaXhlZCgyKSwKdGhpcy51bnBhZGRlZFBlYWtIZWFwU2l6ZU1pQl89cm0uYnl0ZXNUb01pQih0aGlzLnVzYWdlLnVucGFkZGVkUGVha0hlYXBTaXplQnl0ZXMpLnRvRml4ZWQoMikpfX0pfSkoQW18fChBbT17fSkpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcG9kLXZpZXdlci9wcm90by5qcwo8L3NjcmlwdD4KCgo8ZG9tLW1vZHVsZSBpZD0iZGV0YWlscy1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIG1heC1oZWlnaHQ6IDUwdmg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICAtLXBhcGVyLWNhcmQtaGVhZGVyLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLWNhcmQtaGVhZGVyOiB7CiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTc4LCAzNCwgMzQpOwogICAgICAgIH0KICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmNhcmQtY29udGVudCA+IGRpdiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgICAgIHRvcDogLTVweDsKICAgICAgfQoKICAgICAgLnZhbHVlIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICAuaW5mbyB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuY29kZS1zdHlsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItY2FyZCBpZD0iY2FyZCIgaGVhZGluZz0iW1tfbmFtZV1dIiBoaWRkZW49IltbIV9uYW1lXV0iIGVsZXZhdGlvbj0iMiI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZXNdXSIgYXM9Im5vZGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCBpbmZvIj4KICAgICAgICAgIDxkaXYgaGlkZGVuPSJbW19pc1N0ZXAobm9kZSldXSI+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIERhdGEgVHJhbnNmZXJyZWQ6CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InZhbHVlIj5bW19zaXplTWlCKG5vZGUuZGF0YVNpemUpXV0gTWlCPC9zcGFuPgogICAgICAgICAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgTGF0ZW5jeToKICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idmFsdWUiPltbX2Zvcm1hdChub2RlLmR1cmF0aW9uVXMpXV0gwrVzPC9zcGFuPgogICAgICAgICAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgQlc6CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InZhbHVlIj4KICAgICAgICAgICAgICAgIFtbX2JhbmR3aWR0aChub2RlLmRhdGFTaXplLCBub2RlLmR1cmF0aW9uVXMpXV0gR2lCL3M8L3NwYW4+CiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGhpZGRlbj0iW1shX2lzQ2hhbm5lbChub2RlKV1dIj4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgU2VuZCBEZWxheToKICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idmFsdWUiPltbX2Zvcm1hdChub2RlLnNlbmREZWxheVVzKV1dIMK1czwvc3Bhbj4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxwPkhsbyBOYW1lczoKICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImNvZGUtc3R5bGUiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZS5obG9OYW1lc11dIj4KICAgICAgICAgICAgICAgICJbW2l0ZW1dXSIKICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2NvZGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaGlkZGVuPSJbWyFfaGFzUmVwbGljYUdyb3Vwcyhub2RlKV1dIj4KICAgICAgICAgICAgPHA+UmVwbGljYSBHcm91cHMKICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImNvZGUtc3R5bGUiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZS5yZXBsaWNhR3JvdXBzXV0iPgogICAgICAgICAgICAgICAge1tbaXRlbS5yZXBsaWNhSWRzXV19PGJyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvY29kZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBoaWRkZW49IltbIV9pc1N0ZXAobm9kZSldXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbc3RlcEJyZWFrZG93bkxheWVyc11dIj4KICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIFtbaXRlbS5sYWJlbF1dOgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InZhbHVlIj4KICAgICAgICAgICAgICAgICAgW1tfZ2V0U3RlcEJyZWFrZG93blZhbHVlKG5vZGUsIGl0ZW0ua2V5KV1dIMK1cwogICAgICAgICAgICAgICAgICBbW19nZXRTdGVwQnJlYWtkb3duUGN0KG5vZGUsIGl0ZW0ua2V5KV1dPC9zcGFuPgogICAgICAgICAgICAgIAogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLWNhcmQ+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcG9kLXZpZXdlci9kZXRhaWxzLWNhcmQuanMKdmFyIEJtOwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiZGV0YWlscy1jYXJkIixwcm9wZXJ0aWVzOntub2Rlczp7dHlwZTpBcnJheX0sX25hbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZU5hbWUobm9kZXMpIn0sc3RlcEJyZWFrZG93bkxheWVyczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3trZXk6ImhpZ2hGbG9wc0NvbXB1dGVVcyIsbGFiZWw6IkhpZ2ggZmxvcHMgY29tcHV0ZSJ9LHtrZXk6Imxvd0Zsb3BzQ29tcHV0ZVVzIixsYWJlbDoiTG93IGZsb3BzIGNvbXB1dGUifSx7a2V5OiJob3N0SW5mZWVkRHVyYXRpb25VcyIsbGFiZWw6IkluZmVlZCJ9LHtrZXk6Imhvc3RPdXRmZWVkRHVyYXRpb25VcyIsbGFiZWw6Ik91dGZlZWQifSx7a2V5OiJhbGxSZWR1Y2VDb21wdXRlRHVyYXRpb25VcyIsbGFiZWw6IkFsbFJlZHVjZSBjb21wdXRlIn0se2tleToiYWxsUmVkdWNlU3luY0R1cmF0aW9uVXMiLGxhYmVsOiJBbGxSZWR1Y2Ugc3luYyJ9LHtrZXk6InNlbmREdXJhdGlvblVzIixsYWJlbDoiU2VuZCJ9LAp7a2V5OiJyZWN2RHVyYXRpb25VcyIsbGFiZWw6IlJlY3YifV19fSxfaXNBbGxSZWR1Y2UoYSl7cmV0dXJuIHZvaWQgMCE9YS5yZXBsaWNhR3JvdXBzfSxfaXNDaGFubmVsKGEpe3JldHVybiB2b2lkIDAhPWEuY2hhbm5lbElkfSxfaXNTdGVwKGEpe3JldHVybiB2b2lkIDAhPWEuaG9zdE5hbWV9LF9oYXNSZXBsaWNhR3JvdXBzKGEpe3JldHVybiBhLnJlcGxpY2FHcm91cHMmJjA8YS5yZXBsaWNhR3JvdXBzLmxlbmd0aH0sX2NvbXB1dGVOYW1lOmZ1bmN0aW9uKGEpe2lmKGEmJjAhPWEubGVuZ3RoKXthPWFbMF07aWYodGhpcy5faXNDaGFubmVsKGEpKXJldHVybiJDaGFubmVsICMgIithLmNoYW5uZWxJZDtpZih0aGlzLl9pc0FsbFJlZHVjZShhKSlyZXR1cm4gYS5uYW1lO2lmKHRoaXMuX2lzU3RlcChhKSlyZXR1cm4iU3RlcCBicmVha2Rvd24gb2YgY2hpcCAiK2EuY2hpcElkKyIsIGNvcmUgIithLm5vZGVJZH19LF9ieXRlc1RvTWlCOmZ1bmN0aW9uKGEpe3JldHVybiBhLzEwNDg1NzZ9LApfc2l6ZU1pQjpmdW5jdGlvbihhKXtpZihhKXJldHVybiB0aGlzLl9mb3JtYXQodGhpcy5fYnl0ZXNUb01pQihhKSl9LF9iYW5kd2lkdGg6ZnVuY3Rpb24oYSxjKXtpZihhJiZjKXJldHVybiB0aGlzLl9mb3JtYXQoYS9jLzEwNzMuNzQpfSxfY2hpcElkOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmZsb29yKGEvMil9LF9ub2RlSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmMX0sX2Zvcm1hdDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjphLnRvRml4ZWQoMil9LF9nZXRTdGVwQnJlYWtkb3duVmFsdWU6ZnVuY3Rpb24oYSxjKXtpZihjJiZhKXJldHVybiB0aGlzLl9mb3JtYXQoYVtjXT9hW2NdOjApfSxfZ2V0U3RlcEJyZWFrZG93blBjdDpmdW5jdGlvbihhLGMpe2lmKGMmJmEmJmEudG90YWxEdXJhdGlvblVzJiZhW2NdKXJldHVybihhW2NdL2EudG90YWxEdXJhdGlvblVzKjEwMCkudG9GaXhlZCgyKSsiJSJ9fSl9KShCbXx8KEJtPXt9KSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InN0YWNrLWJhci1jaGFydCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxLjVlbTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgZm9udDogMTRweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuc3ZnLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBhZGRpbmctYm90dG9tOiA5MCU7IC8qIGFzcGVjdCByYXRpbyAqLwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIHdpZHRoOiA5MCU7CiAgICAgIH0KCiAgICAgIC5zdmctY29udGVudC1yZXNwb25zaXZlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0ic3RhY2stYmFyLWNoYXJ0Ij4KICAgICAgPGRpdiBpZD0iY2hhcnQiPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcG9kLXZpZXdlci9zdGFjay1iYXItY2hhcnQuanMKdmFyIENtOwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoic3RhY2stYmFyLWNoYXJ0Iixwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoiX2RhdGFDaGFuZ2VkIn0sYWN0aXZlQmFyOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHhEb21haW5GdW5jOnt0eXBlOk9iamVjdH0sc3RhY2tMYXllcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLG9ic2VydmVyOiJfb25TdGFja0xheWVyc0NoYW5nZWQifX0sc3RhY2tCYXJDaGFydDpmdW5jdGlvbihhKXtpZihhLmxlbmd0aCYmdGhpcy5pc0F0dGFjaGVkJiYwIT10aGlzLnN0YWNrTGF5ZXJzLmxlbmd0aCl7dmFyIGM9dGhpcy5zdGFja0xheWVycy5tYXAocD0+cC5rZXkpLGQ9dGhpcy5zdGFja0xheWVycy5tYXAocD0+cC5sYWJlbCksZj01MCphLmxlbmd0aCxnPWQzLnNjYWxlQmFuZCgpLnJhbmdlKFswLGZdKS5wYWRkaW5nKC40KSxsPWQzLnNjYWxlTGluZWFyKCkucmFuZ2UoWzI1MCwwXSksaz1kMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCkuZG9tYWluKFswLDE5XSksCm09ZDMuc2VsZWN0KHRoaXMuJC5jaGFydCkuc2VsZWN0KCJzdmciKTttLmVtcHR5KCkmJihtPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnQpLmFwcGVuZCgic3ZnIikuYXR0cigid2lkdGgiLE1hdGgubWF4KDE2MDAsZisxMDArMjApKS5hdHRyKCJoZWlnaHQiLDMwMCkuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDEwMCwyMCkiKSxtLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwieCBheGlzIikuc3R5bGUoImZvbnQtc2l6ZSIsMTQpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLDI1NSkiKSxtLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwieSBheGlzIikuc3R5bGUoImZvbnQtc2l6ZSIsMTQpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLDApIikpO2M9ZDMuc3RhY2soKS5rZXlzKGMpLm9yZGVyKGQzLnN0YWNrT3JkZXJOb25lKS5vZmZzZXQoZDMuc3RhY2tPZmZzZXROb25lKShhKTtnLmRvbWFpbihhLm1hcCh0aGlzLnhEb21haW5GdW5jKSk7bC5kb21haW4oWzAsCmQzLm1heChjW2MubGVuZ3RoLTFdLHA9PnBbMF0rcFsxXSldKS5uaWNlKCk7dGhpcy5kcmF3TGF5ZXJzKG0sYyxnLGwsayk7dGhpcy5kcmF3QXhlcyhtLGcsbCwyNTApO2E9ZDMuc2VsZWN0KHRoaXMuJC5jaGFydCkuc2VsZWN0KCIubGVnZW5kIik7YS5lbXB0eSgpJiYoYT1tLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGVnZW5kIikuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigiZm9udC1zaXplIiwxNCkuYXR0cigidGV4dC1hbmNob3IiLCJzdGFydCIpKTt0aGlzLmRyYXdMZWdlbmQoYSxkLGspfX0sZHJhd0xheWVyczpmdW5jdGlvbihhLGMsZCxmLGcpe2xldCBsPXRoaXM7YT1hLnNlbGVjdEFsbCgiLmxheWVyIikuZGF0YShjKTtjPWEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxheWVyIikubWVyZ2UoYSkuc3R5bGUoImZpbGwiLChrLG0pPT5nKG0pKS5zZWxlY3RBbGwoInJlY3QiKS5kYXRhKGs9PmspO2MuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5tZXJnZShjKS5hdHRyKCJ3aWR0aCIsCmQuYmFuZHdpZHRoKCkpLmF0dHIoInkiLGs9PmYoa1sxXSkpLmF0dHIoImhlaWdodCIsaz0+ZihrWzBdKS1mKGtbMV0pKS5hdHRyKCJ4IixrPT5kKGwueERvbWFpbkZ1bmMoay5kYXRhKSkpLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKGspe2QzLnNlbGVjdCh0aGlzKS5zdHlsZSgib3BhY2l0eSIsLjUpO2wuYWN0aXZlQmFyPWsuZGF0YX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oKXtkMy5zZWxlY3QodGhpcykuc3R5bGUoIm9wYWNpdHkiLDEpO2wuYWN0aXZlQmFyPW51bGx9KS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMUUzKTthLmV4aXQoKS5yZW1vdmUoKX0sZHJhd0F4ZXM6ZnVuY3Rpb24oYSxjLGQpe2Euc2VsZWN0KCIueC5heGlzIikudHJhbnNpdGlvbigpLmR1cmF0aW9uKDFFMykuY2FsbChkMy5heGlzQm90dG9tKGMpKTthLnNlbGVjdCgiLnkuYXhpcyIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpLmNhbGwoZDMuYXhpc0xlZnQoZCkpfSxkcmF3TGVnZW5kOmZ1bmN0aW9uKGEsCmMsZCl7YT1hLnNlbGVjdEFsbCgiZyIpLmRhdGEoYy5zbGljZSgpKTthLmV4aXQoKS5yZW1vdmUoKTtjPWEuZW50ZXIoKS5hcHBlbmQoImciKTtjLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLDIwMCkuYXR0cigid2lkdGgiLDE5KS5hdHRyKCJoZWlnaHQiLDE5KTtjLmFwcGVuZCgidGV4dCIpLmF0dHIoIngiLDIyNCkuYXR0cigieSIsOS41KS5hdHRyKCJkeSIsIjAuMzJlbSIpO2E9Yy5tZXJnZShhKTthLmF0dHIoInRyYW5zZm9ybSIsKGYsZyk9PmB0cmFuc2xhdGUoJHsxNTAqZy03NTAqTWF0aC5mbG9vcihnLzUpfSwgJHszMCpNYXRoLmZsb29yKGcvNSl9KWApO2Euc2VsZWN0KCJyZWN0IikuYXR0cigiZmlsbCIsKGYsZyk9PmQoZykpO2Euc2VsZWN0KCJ0ZXh0IikudGV4dChmPT5mKX0scmVkcmF3OmZ1bmN0aW9uKGEpe2EmJjAhPWEubGVuZ3RoJiZ0aGlzLnN0YWNrQmFyQ2hhcnQoYSl9LF9vblN0YWNrTGF5ZXJzQ2hhbmdlZDpmdW5jdGlvbihhKXthJiYwIT1hLmxlbmd0aCYmdGhpcy5yZWRyYXcodGhpcy5kYXRhKX0sCl9kYXRhQ2hhbmdlZDpmdW5jdGlvbihhKXthJiYwIT1hLmxlbmd0aCYmdGhpcy5yZWRyYXcoYSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5yZWRyYXcodGhpcy5kYXRhKX19KX0pKENtfHwoQ209e30pKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRvcG9sb2d5LWdyYXBoIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICAgIC5mbGV4LWhvcml6b250YWwgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICB9CgogICAgICAuZmxleGNoaWxkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogMS41ZW07CiAgICAgIH0KCiAgICAgIC5jZWxscyB7CiAgICAgICAgZmlsbDogI2FhYTsKICAgICAgfQoKICAgICAgLmxhYmVsIHsKICAgICAgICBmb250OiAyNHB4IHNhbnMtc2VyaWY7CiAgICAgICAgdGV4dC1hbmNob3I6IHN0YXJ0OwogICAgICB9CgogICAgICAvKiBkaXNhYmxlIHRleHQgc2VsZWN0aW9uICovCiAgICAgIHN2ZyAqOjpzZWxlY3Rpb24sCiAgICAgIHN2ZyAqOjotbW96LXNlbGVjdGlvbiwKICAgICAgc3ZnICo6Oi13ZWJraXQtc2VsZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgcmVjdC5zZWxlY3Rpb24gewogICAgICAgIGZpbGw6IHRyYW5zcGFyZW50OwogICAgICAgIHN0cm9rZTogIzMzMzsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiA0cHg7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgcmVjdC5ib3JkZXJlZCB7CiAgICAgICAgc3Ryb2tlOiAjZTZlNmU2OwogICAgICAgIHN0cm9rZS13aWR0aDogMnB4OwogICAgICB9CgogICAgICByZWN0LmNlbGwtYm9yZGVyIHsKICAgICAgICBzdHJva2U6ICNlZWU7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAwLjNweDsKICAgICAgfQoKICAgICAgcmVjdC5jZWxsLXNlbGVjdGVkIHsKICAgICAgICBzdHJva2U6IHJnYig1MSwgMTAyLCAxNTMpOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41cHg7CiAgICAgIH0KCiAgICAgIHJlY3QuY2VsbC1ob3ZlciB7CiAgICAgICAgc3Ryb2tlOiAjZjAwOwogICAgICAgIHN0cm9rZS13aWR0aDogMC4zcHg7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgLXdlYmtpdC1ib3gtc2hhZG93OiA0cHggNHB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIC1tb3otYm94LXNoYWRvdzogNHB4IDRweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgICBib3gtc2hhZG93OiA0cHggNHB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgIH0KCiAgICAgICN0b29sdGlwLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgcCB7CiAgICAgICAgZm9udDogMTJweCBzYW5zLXNlcmlmOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfQoKICAgICAgI292ZXJ2aWV3IHsKICAgICAgICBtYXJnaW4tbGVmdDogMjBweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbTpob3Zlci5tZW51LW9wdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogI2UwZTBlMDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1pbnB1dDogewogICAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm1ldHJpY3MtYnV0dG9uIHsKICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgIH0KCiAgICAgIC50b3BvLWhlYWRlciB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLXJvdy1sZWZ0IHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBsaW5lLWhlaWdodDogNTBweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgICB0ZXh0LWFsaWduOiBib3R0b207CiAgICAgIH0KCiAgICAgIC5tZXRyaWNzLWxhYmVsIHsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAudG9wby10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGxpbmUtaGVpZ2h0OiAzMnB4OwogICAgICAgIHRleHQtYWxpZ246IGJvdHRvbTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwogICAgICB9CgogICAgICAjY29udGFpbmVyIHsKICAgICAgICAvKiBUb29sdGlwIHNob3VsZCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyLiAqLwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRvcG9sb2d5LWdyYXBoIj4KICAgICAgPGRpdiBjbGFzcz0idG9wby1oZWFkZXIgY29udGFpbmVyIGZsZXgtaG9yaXpvbnRhbCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1yb3ctbGVmdCB0b3BvLXRpdGxlIj4KICAgICAgICAgIHt7X3RwdVR5cGV9fSB7e190b3RhbENvcmVDb3VudH19CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRyb2wtcm93LWxlZnQgbWV0cmljcy1sYWJlbCI+CiAgICAgICAgICBbW19nZXRTZWxlY3RlZE1ldHJpY0xhYmVsKG1ldHJpY3MsIHNlbGVjdGVkTWV0cmljSWR4KV1dPC9zcGFuPgogICAgICAgIDxwYXBlci1tZW51LWJ1dHRvbiBjbG9zZS1vbi1hY3RpdmF0ZT0idHJ1ZSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gcmFpc2VkIGljb249ImFycm93LWRyb3AtZG93biIgc2xvdD0iZHJvcGRvd24tdHJpZ2dlciIgY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIgbWV0cmljcy1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZE1ldHJpY0lkeH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1ttZXRyaWNzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJbW2l0ZW0ua2V5XV0iPltbaXRlbS5sYWJlbF1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICAgIDxkaXYgaWQ9InRwZ3JhcGgiPjwvZGl2PgogICAgICAgIDxkaXYgaWQ9InRvb2x0aXAiIGNsYXNzPSJoaWRkZW4iPgogICAgICAgICAgPHA+PHNwYW4gaWQ9InZhbHVlIj48L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcG9kLXZpZXdlci90b3BvbG9neS1ncmFwaC5qcwp2YXIgRG07CihmdW5jdGlvbigpe2NvbnN0IGE9IiNmZmZmZDkgI2VkZjhiMSAjYzdlOWI0ICM3ZmNkYmIgIzQxYjZjNCAjMWQ5MWMwICMyMjVlYTggIzI1MzQ5NCAjMDgxZDU4Ii5zcGxpdCgiICIpLGM9ZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihbMCwxXSkucmFuZ2UoYSk7UG9seW1lcih7aXM6InRvcG9sb2d5LWdyYXBoIixwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOk9iamVjdH0scnVuRW52aXJvbm1lbnQ6e3R5cGU6T2JqZWN0fSxtZXRyaWNzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sYWN0aXZlQmFyOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX2FjdGl2ZUJhckNoYW5nZWQifSxzZWxlY3RlZE1ldHJpY0lkeDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoiX3NlbGVjdGVkTWV0cmljSWR4Q2hhbmdlZCJ9LF90b3BvRGF0YTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlVG9wb0RhdGEoZGF0YSwgcnVuRW52aXJvbm1lbnQsIG1ldHJpY3MpIn0sX3hEaW1lbnNpb246e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVhEaW1lbnNpb24ocnVuRW52aXJvbm1lbnQpIn0sCl95RGltZW5zaW9uOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVZRGltZW5zaW9uKHJ1bkVudmlyb25tZW50KSJ9LF90b3RhbENvcmVDb3VudDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlVG90YWxDb3JlQ291bnQoX3hEaW1lbnNpb24sIF95RGltZW5zaW9uKSJ9LF90cHVUeXBlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUcHVUeXBlKHJ1bkVudmlyb25tZW50KSJ9LF9ob3N0WFN0cmlkZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlSG9zdFhTdHJpZGUoX3RwdVR5cGUpIn0sX2hvc3RHcmlkV2lkdGg6e3R5cGU6TnVtYmVyfSxfaG9zdEdyaWRIZWlnaHQ6e3R5cGU6TnVtYmVyfSxfbm9kZUdyaWRIZWlnaHQ6e3R5cGU6TnVtYmVyfSxfbm9kZUdyaWRXaWR0aDp7dHlwZTpOdW1iZXJ9LF9nU1ZHOnt0eXBlOk9iamVjdH19LG9ic2VydmVyczpbImRyYXdUb3BvbG9neShfdG9wb0RhdGEsIHJ1bkVudmlyb25tZW50KSJdLF9jb21wdXRlVG9wb0RhdGE6ZnVuY3Rpb24oZCwKZixnKXtpZihkJiZmJiZmLnRvcG9sb2d5JiZnKXt2YXIgbD1wYXJzZUludChmLnRvcG9sb2d5LnhEaW1lbnNpb24sMTApO3JldHVybiBPYmplY3Qua2V5cyhkLnBvZFN0YXRzUGVyQ29yZSkubWFwKGs9Pntjb25zdCBtPWQucG9kU3RhdHNQZXJDb3JlW2tdO2xldCBwPWcubWFwKHE9Pm1bcS5rZXldP21bcS5rZXldOjApO3JldHVybnt4ZGltOm0uY2hpcElkJWwseWRpbTpNYXRoLmZsb29yKG0uY2hpcElkL2wpLG5pZDptLm5vZGVJZCxjaWQ6bS5jaGlwSWQscmlkOmQuY29yZUlkVG9SZXBsaWNhSWRNYXBba10saG9zdDptLmhvc3ROYW1lLHZhbHVlczpwLHRvdGFsOm0udG90YWxEdXJhdGlvblVzfX0pfX0sX2NvbXB1dGVUcHVUeXBlOmZ1bmN0aW9uKGQpe2lmKGQpcmV0dXJuIGQudHB1VHlwZX0sX2NvbXB1dGVYRGltZW5zaW9uOmZ1bmN0aW9uKGQpe2lmKGQmJmQudG9wb2xvZ3kpcmV0dXJuIHBhcnNlSW50KGQudG9wb2xvZ3kueERpbWVuc2lvbiwxMCl9LF9jb21wdXRlWURpbWVuc2lvbjpmdW5jdGlvbihkKXtpZihkJiYKZC50b3BvbG9neSlyZXR1cm4gcGFyc2VJbnQoZC50b3BvbG9neS55RGltZW5zaW9uLDEwKX0sX2NvbXB1dGVUb3RhbENvcmVDb3VudDpmdW5jdGlvbihkLGYpe3JldHVybiBkKmYqMn0sX2NvbXB1dGVIb3N0WFN0cmlkZTpmdW5jdGlvbihkKXtyZXR1cm4iVFBVIHYzIj09ZD80OjJ9LHRvcG9sb2d5R3JhcGg6ZnVuY3Rpb24oZCl7dGhpcy5faG9zdEdyaWRXaWR0aD10aGlzLmdldEhvc3RHcmlkU2l6ZSh0aGlzLl9ob3N0WFN0cmlkZSk7dGhpcy5faG9zdEdyaWRIZWlnaHQ9dGhpcy5nZXRIb3N0R3JpZFNpemUoMik7dGhpcy5fbm9kZUdyaWRXaWR0aD0xNTt0aGlzLl9ub2RlR3JpZEhlaWdodD0zMDt2YXIgZj10aGlzLl94RGltZW5zaW9uL3RoaXMuX2hvc3RYU3RyaWRlO2NvbnN0IGc9dGhpcy5feURpbWVuc2lvbi8yLGw9QXJyYXkuZnJvbShBcnJheSh0aGlzLl94RGltZW5zaW9uKS5rZXlzKCkpLGs9QXJyYXkuZnJvbShBcnJheSh0aGlzLl95RGltZW5zaW9uKS5rZXlzKCkpO3RoaXMuX2dTVkd8fAoodGhpcy5fZ1NWRz1kMy5zZWxlY3QodGhpcy4kLnRwZ3JhcGgpLmFwcGVuZCgic3ZnIikuYXR0cigid2lkdGgiLDE2MjApLmF0dHIoImhlaWdodCIsZyp0aGlzLl9ob3N0R3JpZEhlaWdodCsxNTApLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgzMCw1MCkiKSx0aGlzLl9nU1ZHLmFwcGVuZCgic3ZnOmciKS5jbGFzc2VkKCJncmFwaCIsITApLHRoaXMuX2dTVkcuYXBwZW5kKCJzdmc6ZyIpLmNsYXNzZWQoImxpbmsiLCEwKSx0aGlzLl9nU1ZHLmFwcGVuZCgic3ZnOmRlZnMiKS5hcHBlbmQoInN2ZzptYXJrZXIiKS5hdHRyKCJpZCIsImFycm93IikuYXR0cigidmlld0JveCIsIjAgLTUgMTAgMTAiKS5hdHRyKCJtYXJrZXJXaWR0aCIsNSkuYXR0cigibWFya2VySGVpZ2h0Iiw1KS5hdHRyKCJvcmllbnQiLCJhdXRvIikuYXBwZW5kKCJzdmc6cGF0aCIpLnN0eWxlKCJzdHJva2UiLCJyZWQiKS5zdHlsZSgiZmlsbCIsInJlZCIpLmF0dHIoImQiLCJNMCwtNUwxMCwwTDAsNSIpKTsKbGV0IG09dGhpcy5fZ1NWRy5zZWxlY3QoIi5ncmFwaCIpO2Y9dGhpcy5jcmVhdGVIb3N0RGF0YShmLGcpO3RoaXMuZHJhd0hvc3RDYXJkcyhtLGYsdGhpcy5faG9zdEdyaWRXaWR0aCx0aGlzLl9ob3N0R3JpZEhlaWdodCk7dGhpcy5kcmF3Tm9kZUNhcmRzKG0sZCxjKTt0aGlzLmRyYXdMYWJlbHMobSxsLGspO3RoaXMuZHJhd0xlZ2VuZChtLHRoaXMuX2hvc3RHcmlkSGVpZ2h0Kk1hdGguY2VpbCh0aGlzLl95RGltZW5zaW9uLzIpKzEwLGMpfSxnZXRIb3N0R3JpZFNpemUoZCl7cmV0dXJuIDMwKzEwKihkLTEpKzMwKmQrMTB9LGdldENoaXBYTG9jOmZ1bmN0aW9uKGQsZil7cmV0dXJuIGQqdGhpcy5faG9zdEdyaWRXaWR0aCsxNSs0MCpmfSxnZXRDaGlwWUxvYzpmdW5jdGlvbihkLGYpe3JldHVybiBkKnRoaXMuX2hvc3RHcmlkSGVpZ2h0KzE1KzQwKmZ9LGdldE5vZGVYTG9jOmZ1bmN0aW9uKGQsZixnKXtyZXR1cm4gdGhpcy5nZXRDaGlwWExvYyhkLGYpK2cqdGhpcy5fbm9kZUdyaWRXaWR0aH0sCmNyZWF0ZUhvc3REYXRhOmZ1bmN0aW9uKGQsZil7bGV0IGc9W107Zm9yKGxldCBsPTA7bDxkO2wrKylmb3IobGV0IGs9MDtrPGY7aysrKWcucHVzaCh7eGRpbTpsLHlkaW06a30pO3JldHVybiBnfSxkcmF3TGFiZWxzOmZ1bmN0aW9uKGQsZixnKXtmPWQuc2VsZWN0QWxsKCIueC1sYWJlbCIpLmRhdGEoZik7Zi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLm1lcmdlKGYpLnRleHQobD0+bCkuYXR0cigieCIsKGwsayk9PnRoaXMuZ2V0Q2hpcFhMb2MoTWF0aC5mbG9vcihrL3RoaXMuX2hvc3RYU3RyaWRlKSxrJXRoaXMuX2hvc3RYU3RyaWRlKSkuYXR0cigieSIsMCkuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDE1LCAtNikiKS5hdHRyKCJjbGFzcyIsIngtbGFiZWwiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMUUzKTtmLmV4aXQoKS5yZW1vdmUoKTtkPWQuc2VsZWN0QWxsKCIueS1sYWJlbCIpLmRhdGEoZyk7ZC5lbnRlcigpLmFwcGVuZCgidGV4dCIpLm1lcmdlKGQpLnRleHQobD0+CmwpLmF0dHIoIngiLDApLmF0dHIoInkiLChsLGspPT50aGlzLmdldENoaXBZTG9jKE1hdGguZmxvb3Ioay8yKSxrJTIpKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTEyLDE1KSIpLmF0dHIoImNsYXNzIiwieS1sYWJlbCIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpO2QuZXhpdCgpLnJlbW92ZSgpfSxkcmF3SG9zdENhcmRzOmZ1bmN0aW9uKGQsZixnLGwpe2Q9ZC5zZWxlY3RBbGwoIi5ob3N0IikuZGF0YShmKTtkLmVudGVyKCkuYXBwZW5kKCJyZWN0IikubWVyZ2UoZCkuYXR0cigieCIsaz0+ay54ZGltKmcpLmF0dHIoInkiLGs9PmsueWRpbSpsKS5hdHRyKCJyeCIsNCpnL2wpLmF0dHIoInJ5Iiw0KS5hdHRyKCJjbGFzcyIsImhvc3QgYm9yZGVyZWQiKS5hdHRyKCJ3aWR0aCIsZy0xMCkuYXR0cigiaGVpZ2h0IixsLTEwKS5hdHRyKCJib3JkZXIiLDEpLnN0eWxlKCJmaWxsIiwiRjBGMEYwIikuc3R5bGUoInN0cm9rZSIsCiJibGFjayIpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpO2QuZXhpdCgpLnJlbW92ZSgpfSxkcmF3Tm9kZUNhcmRzOmZ1bmN0aW9uKGQsZixnKXtkPWQuc2VsZWN0QWxsKCIubm9kZSIpLmRhdGEoZik7bGV0IGw9dGhpcyxrPU1hdGgubWF4KHRoaXMuc2VsZWN0ZWRNZXRyaWNJZHgsMCk7ZC5lbnRlcigpLmFwcGVuZCgicmVjdCIpLm1lcmdlKGQpLmF0dHIoImlkIixtPT4icmlkIittLnJpZCkuYXR0cigieCIsbT0+dGhpcy5nZXROb2RlWExvYyhNYXRoLmZsb29yKG0ueGRpbS90aGlzLl9ob3N0WFN0cmlkZSksbS54ZGltJXRoaXMuX2hvc3RYU3RyaWRlLG0ubmlkKSkuYXR0cigieSIsbT0+dGhpcy5nZXRDaGlwWUxvYyhNYXRoLmZsb29yKG0ueWRpbS8yKSxtLnlkaW0lMikpLmF0dHIoInJ4IiwyKS5hdHRyKCJyeSIsNCkuYXR0cigiY2xhc3MiLCJub2RlIGJvcmRlcmVkIikuYXR0cigid2lkdGgiLHRoaXMuX25vZGVHcmlkV2lkdGgpLmF0dHIoImhlaWdodCIsCnRoaXMuX25vZGVHcmlkSGVpZ2h0KS5hdHRyKCJib3JkZXIiLDEpLnN0eWxlKCJzdHJva2UiLCJibGFjayIpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpLnN0eWxlKCJmaWxsIixtPT5nKG0udmFsdWVzW2tdL20udG90YWwpKS5vbigibW91c2VvdmVyIixmdW5jdGlvbihtKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiY2VsbC1ob3ZlciIsITApLnN0eWxlKCJvcGFjaXR5IiwuNSk7dmFyIHA9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBxPWwuJC5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj1wLngrcC53aWR0aCs1LXEueDtwPXAueS1xLnk7ZDMuc2VsZWN0KGwuJC50b29sdGlwKS5zdHlsZSgibGVmdCIscisicHgiKS5zdHlsZSgidG9wIixwKyJweCIpLnNlbGVjdCgiI3ZhbHVlIikudGV4dChsLl9nZXRUb29sVGlwVGV4dChtKSk7ZDMuc2VsZWN0KGwuJC50b29sdGlwKS5jbGFzc2VkKCJoaWRkZW4iLCExKX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiY2VsbC1ob3ZlciIsCiExKS5zdHlsZSgib3BhY2l0eSIsMSk7ZDMuc2VsZWN0KGwuJC50b29sdGlwKS5jbGFzc2VkKCJoaWRkZW4iLCEwKX0pLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpO2QuZXhpdCgpLnJlbW92ZSgpfSxkcmF3TGlua3M6ZnVuY3Rpb24oZCxmKXtmJiZmLmxlbmd0aCYmZCYmKGQ9ZC5zZWxlY3QoIi5saW5rIikuc2VsZWN0QWxsKCJwYXRoIikuZGF0YShmKSxkLmVudGVyKCkuYXBwZW5kKCJzdmc6cGF0aCIpLm1lcmdlKGQpLmF0dHIoInN0cm9rZS13aWR0aCIsMikuYXR0cigic3Ryb2tlIiwicmVkIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJtYXJrZXItZW5kIiwidXJsKCNhcnJvdykiKS5hdHRyKCJkIixnPT50aGlzLmxpbmtUb1BhdGgoZ1swXSxnWzFdKSksZC5leGl0KCkucmVtb3ZlKCkpfSxjb3JlSWRUb1BvczpmdW5jdGlvbihkKXt2YXIgZj1NYXRoLmZsb29yKGQvMik7Y29uc3QgZz1mJXRoaXMuX3hEaW1lbnNpb247Zj1NYXRoLmZsb29yKGYvdGhpcy5feERpbWVuc2lvbik7CnJldHVybnt4OjcuNSt0aGlzLmdldE5vZGVYTG9jKE1hdGguZmxvb3IoZy90aGlzLl9ob3N0WFN0cmlkZSksZyV0aGlzLl9ob3N0WFN0cmlkZSxkJjEpLHk6dGhpcy5nZXRDaGlwWUxvYyhNYXRoLmZsb29yKGYvMiksZiUyKSsxNX19LGxpbmtUb1BhdGg6ZnVuY3Rpb24oZCxmKXtkPXRoaXMuY29yZUlkVG9Qb3MoZD9kOjApO2Y9dGhpcy5jb3JlSWRUb1BvcyhmP2Y6MCk7cmV0dXJuIk0gIitkLngrIiAiK2QueSsiTCAiK2YueCsiICIrZi55fSxfZ2V0VG9vbFRpcFRleHQ6ZnVuY3Rpb24oZCl7Y29uc3QgZj0wPD10aGlzLnNlbGVjdGVkTWV0cmljSWR4P3RoaXMubWV0cmljc1t0aGlzLnNlbGVjdGVkTWV0cmljSWR4XS5sYWJlbDoiIixnPTA8PXRoaXMuc2VsZWN0ZWRNZXRyaWNJZHg/ZC52YWx1ZXNbdGhpcy5zZWxlY3RlZE1ldHJpY0lkeF06MCxsPW5ldyBJbnRsLk51bWJlckZvcm1hdChuYXZpZ2F0b3IubGFuZ3VhZ2Use3N0eWxlOiJwZXJjZW50IixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pOwpyZXR1cm5gcG9zOiAoJHtkLnlkaW19LCAke2QueGRpbX0pLAogICAgICAgIGhvc3Q6ICR7ZC5ob3N0fSwKICAgICAgICBjaGlwIGlkOiAke2QuY2lkfSwKICAgICAgICBjb3JlIGlkOiAke2QubmlkfSwKICAgICAgICByZXBsaWNhIGlkOiAke2QucmlkfQogICAgICAgICR7Zj9gJHtmfSBzcGVuZHMgJHtnLnRvRml4ZWQoMil9XHUwMGI1cyBpbiB0b3RhbCwKICAgICAgICAgICAgdGFraW5nICR7bC5mb3JtYXQoZy9kLnRvdGFsKX0gb2YgYSBzdGVwLmA6IiJ9YH0sZHJhd0xlZ2VuZDpmdW5jdGlvbihkLGYsZyl7ZD1kLnNlbGVjdEFsbCgiLmxlZ2VuZCIpLmRhdGEoWzBdLmNvbmNhdChnLnF1YW50aWxlcygpKSxsPT5sKTtkLmV4aXQoKS5yZW1vdmUoKTtnPWQuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxlZ2VuZCIpO2cuYXBwZW5kKCJyZWN0IikuYXR0cigid2lkdGgiLDYwKS5hdHRyKCJoZWlnaHQiLDMwKS5tZXJnZShkLnNlbGVjdCgicmVjdCIpKS5hdHRyKCJ4IiwobCxrKT0+NjAqaykuYXR0cigieSIsZikuc3R5bGUoImZpbGwiLChsLGspPT5hW2tdKTtnLmFwcGVuZCgidGV4dCIpLm1lcmdlKGQuc2VsZWN0KCJ0ZXh0IikpLnRleHQobD0+Ilx1MjI2NSAwLiIrTWF0aC5yb3VuZCgxMCpsKSkuYXR0cigieCIsKGwsayk9PjYwKmspLmF0dHIoInkiLGYrNjApfSxkcmF3VG9wb2xvZ3k6ZnVuY3Rpb24oZCxmKXtkJiZmJiZ0aGlzLmlzQXR0YWNoZWQmJgp0aGlzLnRvcG9sb2d5R3JhcGgoZCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5kcmF3VG9wb2xvZ3kodGhpcy5fdG9wb0RhdGEsdGhpcy5ydW5FbnZpcm9ubWVudCl9LF9zZWxlY3RlZE1ldHJpY0lkeENoYW5nZWQ6ZnVuY3Rpb24oZCl7MD5kfHxkMy5zZWxlY3QodGhpcy4kLnRwZ3JhcGgpLnNlbGVjdEFsbCgiLm5vZGUiKS5zdHlsZSgiZmlsbCIsZj0+YyhmLnZhbHVlc1tkXS9mLnRvdGFsKSl9LF9hY3RpdmVCYXJDaGFuZ2VkOmZ1bmN0aW9uKGQpe3ZhciBmPWQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTEwKS5kb21haW4oZDMucmFuZ2UoMCwxOSkpO2lmKGQpaWYoZC5yZXBsaWNhR3JvdXBzJiYwPGQucmVwbGljYUdyb3Vwcy5sZW5ndGgpe2ZvcihsZXQgZz0wO2c8ZC5yZXBsaWNhR3JvdXBzLmxlbmd0aDtnKyspe2NvbnN0IGw9ZC5yZXBsaWNhR3JvdXBzW2ddLnJlcGxpY2FJZHM7Zm9yKGxldCBrPTA7azxsLmxlbmd0aDtrKyspZDMuc2VsZWN0KHRoaXMuJC50cGdyYXBoKS5zZWxlY3RBbGwoIiNyaWQiKwpsW2tdKS5zdHlsZSgiZmlsbCIsZihnJTIwKSl9dGhpcy5zZWxlY3RlZE1ldHJpY0lkeD0tMX1lbHNlIGQuc3JjQ29yZUlkcyYmKGY9ZC5zcmNDb3JlSWRzLm1hcCgoZyxsKT0+W2csZC5kc3RDb3JlSWRzW2xdXSksdGhpcy5kcmF3TGlua3ModGhpcy5fZ1NWRyxmKSl9LF9nZXRTZWxlY3RlZE1ldHJpY0xhYmVsOmZ1bmN0aW9uKGQsZil7cmV0dXJuIDA+Znx8IWR8fGY+ZC5sZW5ndGg/IlBsZWFzZSBzZWxlY3QgYSBtZXRyaWMiOiJDb2xvcjogIitkW2ZdLmxhYmVsfX0pfSkoRG18fChEbT17fSkpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJwb2Qtdmlld2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxLjVlbTsKICAgICAgfQoKICAgICAgI2NvbnRyb2wgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICB0ZXh0LWFsaWduOiBib3R0b207CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwogICAgICB9CgogICAgICAuY29udHJvbC1yb3ctbGVmdCB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZmxvdzogcm93IG5vd3JhcDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDUwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogYm90dG9tOwogICAgICB9CgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWlucHV0OiB7CiAgICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItc2xpZGVyLWhlaWdodDogM3B4OwogICAgICB9CgogICAgICAuc3RlcC1udW0tdGV4dCB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHBhZGRpbmctbGVmdDogMWVtOwogICAgICB9CgogICAgICAuc3RhY2stdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLmJhci1jaGFydCB7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgICN0aXRsZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5lcnJvci1tZXNzYWdlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICAgIGZvbnQtc2l6ZTogMzJweDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgICBtYXJnaW4tdG9wOiAzMnB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iZXJyb3ItbWVzc2FnZSIgaGlkZGVuPSJbWyFfZXJyb3JNZXNzYWdlXV0iPgogICAgICA8c3Bhbj5bW19lcnJvck1lc3NhZ2VdXTwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iY29udHJvbCIgaGlkZGVuPSJbW19lcnJvck1lc3NhZ2VdXSI+CiAgICAgIAogICAgICA8c3BhbiBjbGFzcz0iY29udHJvbC1yb3ctbGVmdCI+UGxlYXNlIHNlbGVjdCBhIHN0ZXAKICAgICAgICA8cGFwZXItc2xpZGVyIG1pbj0iMCIgbWF4PSJbW19tYXhTdGVwSWRdXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7Y3VyU3RlcElkfX0iPgogICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLW51bS10ZXh0Ij5TdGVwIFtbX2dldFN0ZXBOdW0oX3BvZFN0YXRzTWFwKV1dPC9zcGFuPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBvZC12aWV3ZXItZGFzaGJvYXJkIiBoaWRkZW49IltbX2Vycm9yTWVzc2FnZV1dIj4KICAgICAgPGRpdiBpZD0idG9wby1ncmFwaCI+CiAgICAgICAgPHRvcG9sb2d5LWdyYXBoIHJ1bi1lbnZpcm9ubWVudD0iW1tfcnVuRW52aXJvbm1lbnRdXSIgZGF0YT0iW1tfcG9kU3RhdHNNYXBdXSIgbWV0cmljcz0iW1tfc3RlcEJyZWFrZG93bkxheWVyc11dIiBhY3RpdmUtYmFyPSJbW2FjdGl2ZUJhcl1dIj4KICAgICAgICA8L3RvcG9sb2d5LWdyYXBoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iY2hhbm5lbC1iYXJzIiBjbGFzcz0iYmFyLWNoYXJ0IiBoaWRkZW49IltbIV9jaGFubmVsRGJdXSI+CiAgICAgICAgPGRpdiBpZD0idGl0bGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhY2stdGl0bGUiPkxhdGVuY3kgb2YgU2VuZCBhbmQgUmVjdiBjaGFubmVsczwvZGl2PgogICAgICAgICAgPHA+KHgtYXhpczogY2hhbm5lbCBpZCwgeS1heGlzOiB0aW1lICjCtXMpKQogICAgICAgIDwvZGl2PgogICAgICAgIDxzdGFjay1iYXItY2hhcnQgZGF0YT0iW1tfY2hhbm5lbERiXV0iIHN0YWNrLWxheWVycz0iW1tfY2hhbm5lbExheWVyc11dIiB4LWRvbWFpbi1mdW5jPSJbW19jaGFubmVsRnVuY11dIiBhY3RpdmUtYmFyPSJ7e2FjdGl2ZUJhcn19Ij48L3N0YWNrLWJhci1jaGFydD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImFsbC1yZWR1Y2UtYmFycyIgY2xhc3M9ImJhci1jaGFydCIgaGlkZGVuPSJbWyFfYWxsUmVkdWNlRGJdXSI+CiAgICAgICAgPGRpdiBpZD0idGl0bGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhY2stdGl0bGUiPgogICAgICAgICAgICBEdXJhdGlvbiBvZiBhbGwtcmVkdWNlIG9wIG9yIGN1c3RvbSBmdXNpb24gZm9yIGFsbC1yZWR1Y2UKICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHA+CiAgICAgICAgICAgICh4LWF4aXM6IHNob3J0IG5hbWVzIGZvciBhbGwtcmVkdWNlcyBvcHMgKGEjKSBvciBmdXNpb24gKGYjKSwKICAgICAgICAgICAgeS1heGlzOiB0aW1lICjCtXMpKQogICAgICAgICAgCiAgICAgICAgPC9kaXY+CiAgICAgICAgPHN0YWNrLWJhci1jaGFydCBkYXRhPSJbW19hbGxSZWR1Y2VEYl1dIiBzdGFjay1sYXllcnM9IltbX2FsbFJlZHVjZUxheWVyc11dIiB4LWRvbWFpbi1mdW5jPSJbW19hbGxSZWR1Y2VGdW5jXV0iIGFjdGl2ZS1iYXI9Int7YWN0aXZlQmFyfX0iPjwvc3RhY2stYmFyLWNoYXJ0PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0ic3RhY2stYmFycyIgY2xhc3M9ImJhci1jaGFydCIgaGlkZGVuPSJbWyFfc3RlcFN0YXRzXV0iPgogICAgICAgIDxkaXYgaWQ9InRpdGxlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YWNrLXRpdGxlIj5TdGVwIGJyZWFrZG93bjwvZGl2PgogICAgICAgICAgPHA+KHgtYXhpczogZ2xvYmFsIGNoaXAgaWQsIGNvcmUgaWQsIHktYXhpczogdGltZSAowrVzKSkKICAgICAgICA8L2Rpdj4KICAgICAgICA8c3RhY2stYmFyLWNoYXJ0IGRhdGE9IltbX3N0ZXBTdGF0c11dIiBzdGFjay1sYXllcnM9IltbX3N0ZXBCcmVha2Rvd25MYXllcnNdXSIgeC1kb21haW4tZnVuYz0iW1tfc3RlcEJyZWFrZG93bkZ1bmNdXSIgYWN0aXZlLWJhcj0ie3thY3RpdmVCYXJ9fSI+PC9zdGFjay1iYXItY2hhcnQ+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcG9kLXZpZXdlci9wb2Qtdmlld2VyLWRhc2hib2FyZC5qcwp2YXIgRW07CihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJwb2Qtdmlld2VyLWRhc2hib2FyZCIscHJvcGVydGllczp7ZGF0YTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9kYXRhQ2hhbmdlZCJ9LGFjdGl2ZURldGFpbHM6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxhY3RpdmVCYXI6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2FjdGl2ZUJhckNoYW5nZWQifSxjdXJTdGVwSWQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9wb2RTdGF0c01hcHM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVBvZFN0YXRzTWFwcyhkYXRhKSJ9LF9tYXhTdGVwSWQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJZChfcG9kU3RhdHNNYXBzKSJ9LF9lcnJvck1lc3NhZ2U6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUVycm9yTWVzc2FnZShfbWF4U3RlcElkKSJ9LF9ydW5FbnZpcm9ubWVudDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlUnVuRW52aXJvbm1lbnQoZGF0YSkifSxfc3RlcEJyZWFrZG93bkxheWVyczp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT5be2tleToiaGlnaEZsb3BzQ29tcHV0ZVVzIixsYWJlbDoiSGlnaCBmbG9wcyBjb21wdXRlIn0se2tleToibG93RmxvcHNDb21wdXRlVXMiLGxhYmVsOiJMb3cgZmxvcHMgY29tcHV0ZSJ9LHtrZXk6Imhvc3RJbmZlZWREdXJhdGlvblVzIixsYWJlbDoiSW5mZWVkIn0se2tleToiaG9zdE91dGZlZWREdXJhdGlvblVzIixsYWJlbDoiT3V0ZmVlZCJ9LHtrZXk6ImFsbFJlZHVjZUNvbXB1dGVEdXJhdGlvblVzIixsYWJlbDoiQWxsUmVkdWNlIGNvbXB1dGUifSx7a2V5OiJhbGxSZWR1Y2VTeW5jRHVyYXRpb25VcyIsbGFiZWw6IkFsbFJlZHVjZSBzeW5jIn0se2tleToic2VuZER1cmF0aW9uVXMiLGxhYmVsOiJTZW5kIn0se2tleToicmVjdkR1cmF0aW9uVXMiLGxhYmVsOiJSZWN2In1dfSxfcG9kU3RhdHNNYXA6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVBvZFN0YXRzTWFwKF9wb2RTdGF0c01hcHMsIGN1clN0ZXBJZCwgX3N0ZXBCcmVha2Rvd25MYXllcnMpIn0sCl9zdGVwU3RhdHM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbCxjb21wdXRlZDoiX2NvbXB1dGVTdGVwU3RhdHMoX3BvZFN0YXRzTWFwKSJ9LF9jaGFubmVsRGI6e3R5cGU6QXJyYXksdmFsdWU6bnVsbCxjb21wdXRlZDoiX2NvbXB1dGVDaGFubmVsRGIoX3BvZFN0YXRzTWFwKSJ9LF9hbGxSZWR1Y2VEYjp7dHlwZTpBcnJheSx2YWx1ZTpudWxsLGNvbXB1dGVkOiJfY29tcHV0ZUFsbFJlZHVjZURiKF9wb2RTdGF0c01hcCkifSxfY2hhbm5lbExheWVyczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3trZXk6ImR1cmF0aW9uVXMiLGxhYmVsOiJEdXJhdGlvbiAocykifV19LF9hbGxSZWR1Y2VMYXllcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7a2V5OiJkdXJhdGlvblVzIixsYWJlbDoiRHVyYXRpb24gKFx1MDBiNXMpIn1dfSxfc3RlcEJyZWFrZG93bkZ1bmM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5hPT5gKCR7YS5jaGlwSWR9LCAke2Eubm9kZUlkfSlgfSxfY2hhbm5lbEZ1bmM6e3R5cGU6T2JqZWN0LAp2YWx1ZTooKT0+YT0+YS5jaGFubmVsSWR9LF9hbGxSZWR1Y2VGdW5jOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+ZnVuY3Rpb24oYSl7aWYoYS5uYW1lKXJldHVybiBhPWEubmFtZS5yZXBsYWNlKC9sbC1yZWR1Y2UufHVzaW9uLnxsbC1yZWR1Y2V8dXNpb24vLCIiKSwxPGEubGVuZ3RoP2E6YSsiMCJ9fX0sX2NvbXB1dGVQb2RTdGF0c01hcHMoYSl7cmV0dXJuIGE/YS5wb2RTdGF0c1NlcXVlbmNlLnBvZFN0YXRzTWFwOltdfSxfY29tcHV0ZVJ1bkVudmlyb25tZW50KGEpe2lmKGEpcmV0dXJuIGEucnVuRW52aXJvbm1lbnR9LF9jb21wdXRlTWF4U3RlcElkKGEpe3JldHVybiBhLmxlbmd0aC0xfSxfY29tcHV0ZUVycm9yTWVzc2FnZShhKXtyZXR1cm4gMDw9YT8iIjoiV0FSTklORzogTm8gc3RlcCB0aW1lIG1lYXN1cmVkLiBUaGlzIG1pZ2h0IGhhcHBlbiBpZiB5b3VyIHByb2ZpbGUgZHVyYXRpb24gaXMgdG9vIHNob3J0LCB0cnkgaW5jcmVhc2UgcHJvZmlsZSBkdXJhdGlvbiB0byBjb3ZlciBhIGZ1bGwgc3RlcC4gSWYgeW91IGhhdmUgYW4gaW5mZXJlbmNlIGpvYiBvciBub3QgdXNlIFRwdUVzdGltYXRvciwgcGxlYXNlIHNraXAgdGhpcyB0b29sLiJ9LApfcG9wdWxhdGVMb3dGbG9wc0NvbXB1dGUoYSxjKXtpZihhJiZjKXt2YXIgZD1hLnBvZFN0YXRzUGVyQ29yZTtmb3IobGV0IGYgaW4gZCl7bGV0IGc9ZFtmXTtpZihnLmhhc093blByb3BlcnR5KCJsb3dGbG9wc0NvbXB1dGVVcyIpKWJyZWFrO2cubG93RmxvcHNDb21wdXRlVXM9Zy50b3RhbER1cmF0aW9uVXM7Zm9yKGxldCBsPTA7bDxjLmxlbmd0aDtsKyspMSE9bCYmKGdbY1tsXS5rZXldfHwoZ1tjW2xdLmtleV09MCksZy5sb3dGbG9wc0NvbXB1dGVVcy09Z1tjW2xdLmtleV0pfXJldHVybiBhfX0sX2NvbXB1dGVQb2RTdGF0c01hcChhLGMsZCl7aWYoISghYXx8MD5jfHxjPj1hLmxlbmd0aCkmJmQpcmV0dXJuIHRoaXMuX3BvcHVsYXRlTG93RmxvcHNDb21wdXRlKGFbY10sZCl9LF9jb21wdXRlU3RlcFN0YXRzKGEpe2lmKGEmJmEucG9kU3RhdHNQZXJDb3JlKXt2YXIgYz1hLnBvZFN0YXRzUGVyQ29yZTtyZXR1cm4gT2JqZWN0LmtleXMoYykubWFwKGQ9PmNbZF0pLnNvcnQoKGQsZik9PgpkLmNoaXBJZC1mLmNoaXBJZCl9fSxfY29tcHV0ZUNoYW5uZWxEYihhKXtpZihhJiZhLmNoYW5uZWxEYiYmISgwPj1hLmNoYW5uZWxEYi5sZW5ndGgpKXJldHVybiBhLmNoYW5uZWxEYi5zbGljZSgpLnNvcnQoKGMsZCk9PmQuZHVyYXRpb25Vcy1jLmR1cmF0aW9uVXMpfSxfY29tcHV0ZUFsbFJlZHVjZURiKGEpe2lmKGEmJmEuYWxsUmVkdWNlT3BEYiYmISgwPj1hLmFsbFJlZHVjZU9wRGIubGVuZ3RoKSlyZXR1cm4gYS5hbGxSZWR1Y2VPcERiLnNsaWNlKCkuc29ydCgoYyxkKT0+ZC5kdXJhdGlvblVzLWMuZHVyYXRpb25Vcyl9LF9kYXRhQ2hhbmdlZChhKXthJiYodGhpcy5jdXJTdGVwSWQ9MCl9LF9hY3RpdmVCYXJDaGFuZ2VkKGEpe2EmJih0aGlzLmFjdGl2ZURldGFpbHM9W2FdKX0sX2dldFN0ZXBOdW0oYSl7cmV0dXJuIGE/YS5zdGVwTnVtOjB9fSl9KShFbXx8KEVtPXt9KSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tYWpheC9pcm9uLXJlcXVlc3QuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1yZXF1ZXN0Iixob3N0QXR0cmlidXRlczp7aGlkZGVuOiEwfSxwcm9wZXJ0aWVzOnt4aHI6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3R9fSxyZXNwb25zZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fSxzdGF0dXM6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTowfSxzdGF0dXNUZXh0Ont0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITAsdmFsdWU6IiJ9LGNvbXBsZXRlczp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlQ29tcGxldGVzPWE7dGhpcy5yZWplY3RDb21wbGV0ZXM9Y30uYmluZCh0aGlzKSl9fSxwcm9ncmVzczp7dHlwZTpPYmplY3QsCm5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sYWJvcnRlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTohMX0sZXJyb3JlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTohMX0sdGltZWRPdXQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITAsdmFsdWU6ITF9fSxnZXQgc3VjY2VlZGVkKCl7aWYodGhpcy5lcnJvcmVkfHx0aGlzLmFib3J0ZWR8fHRoaXMudGltZWRPdXQpcmV0dXJuITE7dmFyIGE9dGhpcy54aHIuc3RhdHVzfHwwO3JldHVybiAwPT09YXx8MjAwPD1hJiYzMDA+YX0sc2VuZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnhocjtpZigwPGMucmVhZHlTdGF0ZSlyZXR1cm4gbnVsbDtjLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixmdW5jdGlvbihtKXt0aGlzLl9zZXRQcm9ncmVzcyh7bGVuZ3RoQ29tcHV0YWJsZTptLmxlbmd0aENvbXB1dGFibGUsbG9hZGVkOm0ubG9hZGVkLAp0b3RhbDptLnRvdGFsfSk7dGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcHJvZ3Jlc3MtY2hhbmdlZCIse3ZhbHVlOnRoaXMucHJvZ3Jlc3N9KX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24obSl7dGhpcy5fc2V0RXJyb3JlZCghMCk7dGhpcy5fdXBkYXRlU3RhdHVzKCk7dGhpcy5yZWplY3RDb21wbGV0ZXMoYS5yZWplY3RXaXRoUmVxdWVzdD97ZXJyb3I6bSxyZXF1ZXN0OnRoaXN9Om0pfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoInRpbWVvdXQiLGZ1bmN0aW9uKG0pe3RoaXMuX3NldFRpbWVkT3V0KCEwKTt0aGlzLl91cGRhdGVTdGF0dXMoKTt0aGlzLnJlamVjdENvbXBsZXRlcyhhLnJlamVjdFdpdGhSZXF1ZXN0P3tlcnJvcjptLHJlcXVlc3Q6dGhpc306bSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGZ1bmN0aW9uKCl7dGhpcy5fc2V0QWJvcnRlZCghMCk7dGhpcy5fdXBkYXRlU3RhdHVzKCk7dmFyIG09CkVycm9yKCJSZXF1ZXN0IGFib3J0ZWQuIik7dGhpcy5yZWplY3RDb21wbGV0ZXMoYS5yZWplY3RXaXRoUmVxdWVzdD97ZXJyb3I6bSxyZXF1ZXN0OnRoaXN9Om0pfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU3RhdHVzKCk7dGhpcy5fc2V0UmVzcG9uc2UodGhpcy5wYXJzZVJlc3BvbnNlKCkpO2lmKHRoaXMuc3VjY2VlZGVkKXRoaXMucmVzb2x2ZUNvbXBsZXRlcyh0aGlzKTtlbHNle3ZhciBtPUVycm9yKCJUaGUgcmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZTogIit0aGlzLnhoci5zdGF0dXMpO3RoaXMucmVqZWN0Q29tcGxldGVzKGEucmVqZWN0V2l0aFJlcXVlc3Q/e2Vycm9yOm0scmVxdWVzdDp0aGlzfTptKX19LmJpbmQodGhpcykpO3RoaXMudXJsPWEudXJsO3ZhciBkPSExIT09YS5hc3luYztjLm9wZW4oYS5tZXRob2R8fCJHRVQiLGEudXJsLGQpO3ZhciBmPXtqc29uOiJhcHBsaWNhdGlvbi9qc29uIiwKdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCIsYXJyYXlidWZmZXI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSJ9W2EuaGFuZGxlQXNdLGc9YS5oZWFkZXJzfHxPYmplY3QuY3JlYXRlKG51bGwpLGw9T2JqZWN0LmNyZWF0ZShudWxsKSxrO2ZvcihrIGluIGcpbFtrLnRvTG93ZXJDYXNlKCldPWdba107Zz1sO2YmJiFnLmFjY2VwdCYmKGcuYWNjZXB0PWYpO09iamVjdC5rZXlzKGcpLmZvckVhY2goZnVuY3Rpb24obSl7L1tBLVpdLy50ZXN0KG0pJiZQb2x5bWVyLkJhc2UuX2Vycm9yKCJIZWFkZXJzIG11c3QgYmUgbG93ZXIgY2FzZSwgZ290IixtKTtjLnNldFJlcXVlc3RIZWFkZXIobSxnW21dKX0sdGhpcyk7aWYoZCl7Yy50aW1lb3V0PWEudGltZW91dDtkPWEuaGFuZGxlQXM7aWYoYS5qc29uUHJlZml4fHwhZClkPSJ0ZXh0IjtjLnJlc3BvbnNlVHlwZT1jLl9yZXNwb25zZVR5cGU9ZDthLmpzb25QcmVmaXgmJihjLl9qc29uUHJlZml4PQphLmpzb25QcmVmaXgpfWMud2l0aENyZWRlbnRpYWxzPSEhYS53aXRoQ3JlZGVudGlhbHM7ZD10aGlzLl9lbmNvZGVCb2R5T2JqZWN0KGEuYm9keSxnWyJjb250ZW50LXR5cGUiXSk7Yy5zZW5kKGQpO3JldHVybiB0aGlzLmNvbXBsZXRlc30scGFyc2VSZXNwb25zZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMueGhyLGM9YS5yZXNwb25zZVR5cGV8fGEuX3Jlc3BvbnNlVHlwZSxkPSF0aGlzLnhoci5yZXNwb25zZVR5cGUsZj1hLl9qc29uUHJlZml4JiZhLl9qc29uUHJlZml4Lmxlbmd0aHx8MDt0cnl7c3dpdGNoKGMpe2Nhc2UgImpzb24iOmlmKGR8fHZvaWQgMD09PWEucmVzcG9uc2UpdHJ5e3JldHVybiBKU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtyZXR1cm4gY29uc29sZS53YXJuKCJGYWlsZWQgdG8gcGFyc2UgSlNPTiBzZW50IGZyb20gIithLnJlc3BvbnNlVVJMKSxudWxsfXJldHVybiBhLnJlc3BvbnNlO2Nhc2UgInhtbCI6cmV0dXJuIGEucmVzcG9uc2VYTUw7Y2FzZSAiYmxvYiI6Y2FzZSAiZG9jdW1lbnQiOmNhc2UgImFycmF5YnVmZmVyIjpyZXR1cm4gYS5yZXNwb25zZTsKZGVmYXVsdDppZihmKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dC5zdWJzdHJpbmcoZikpfWNhdGNoKGcpe3JldHVybiBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBwYXJzZSBKU09OIHNlbnQgZnJvbSAiK2EucmVzcG9uc2VVUkwpLG51bGx9cmV0dXJuIGEucmVzcG9uc2VUZXh0fX1jYXRjaChnKXt0aGlzLnJlamVjdENvbXBsZXRlcyhFcnJvcigiQ291bGQgbm90IHBhcnNlIHJlc3BvbnNlLiAiK2cubWVzc2FnZSkpfX0sYWJvcnQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXRBYm9ydGVkKCEwKTt0aGlzLnhoci5hYm9ydCgpfSxfZW5jb2RlQm9keU9iamVjdDpmdW5jdGlvbihhLGMpe2lmKCJzdHJpbmciPT10eXBlb2YgYSlyZXR1cm4gYTtzd2l0Y2goYyl7Y2FzZSAiYXBwbGljYXRpb24vanNvbiI6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpO2Nhc2UgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI6cmV0dXJuIHRoaXMuX3d3d0Zvcm1VcmxFbmNvZGUoYSl9cmV0dXJuIGF9LApfd3d3Rm9ybVVybEVuY29kZTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4iIjt2YXIgYz1bXTtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2MucHVzaCh0aGlzLl93d3dGb3JtVXJsRW5jb2RlUGllY2UoZCkrIlx4M2QiK3RoaXMuX3d3d0Zvcm1VcmxFbmNvZGVQaWVjZShhW2RdKSl9LHRoaXMpO3JldHVybiBjLmpvaW4oIlx4MjYiKX0sX3d3d0Zvcm1VcmxFbmNvZGVQaWVjZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWEmJmEudG9TdHJpbmc/ZW5jb2RlVVJJQ29tcG9uZW50KGEudG9TdHJpbmcoKS5yZXBsYWNlKC9ccj9cbi9nLCJcclxuIikpLnJlcGxhY2UoLyUyMC9nLCIrIik6IiJ9LF91cGRhdGVTdGF0dXM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTdGF0dXModGhpcy54aHIuc3RhdHVzKTt0aGlzLl9zZXRTdGF0dXNUZXh0KHZvaWQgMD09PXRoaXMueGhyLnN0YXR1c1RleHQ/IiI6dGhpcy54aHIuc3RhdHVzVGV4dCl9fSk7Cjwvc2NyaXB0PgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZ29vZ2xlLWNoYXJ0L2dvb2dsZS1jaGFydC1sb2FkZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGspe3JldHVybiBnb29nbGVbMD09PWsuaW5kZXhPZigibWQtIik/Yy5DSEFSVFM6Yy5WSVNdfXZhciBjPXtDSEFSVFM6ImNoYXJ0cyIsVklTOiJ2aXN1YWxpemF0aW9uIn0sZD17YXJlYTp7Y3RvcjoiQXJlYUNoYXJ0In0sYmFyOntjdG9yOiJCYXJDaGFydCJ9LCJtZC1iYXIiOntjdG9yOiJCYXIiLHBrZzoiYmFyIn0sYnViYmxlOntjdG9yOiJCdWJibGVDaGFydCJ9LGNhbGVuZGFyOntjdG9yOiJDYWxlbmRhciIscGtnOiJjYWxlbmRhciJ9LGNhbmRsZXN0aWNrOntjdG9yOiJDYW5kbGVzdGlja0NoYXJ0In0sY29sdW1uOntjdG9yOiJDb2x1bW5DaGFydCJ9LGNvbWJvOntjdG9yOiJDb21ib0NoYXJ0In0sZ2F1Z2U6e2N0b3I6IkdhdWdlIixwa2c6ImdhdWdlIn0sZ2VvOntjdG9yOiJHZW9DaGFydCJ9LGhpc3RvZ3JhbTp7Y3RvcjoiSGlzdG9ncmFtIn0sbGluZTp7Y3RvcjoiTGluZUNoYXJ0In0sIm1kLWxpbmUiOntjdG9yOiJMaW5lIixwa2c6ImxpbmUifSwKb3JnOntjdG9yOiJPcmdDaGFydCIscGtnOiJvcmdjaGFydCJ9LHBpZTp7Y3RvcjoiUGllQ2hhcnQifSxzYW5rZXk6e2N0b3I6IlNhbmtleSIscGtnOiJzYW5rZXkifSxzY2F0dGVyOntjdG9yOiJTY2F0dGVyQ2hhcnQifSwibWQtc2NhdHRlciI6e2N0b3I6IlNjYXR0ZXIiLHBrZzoic2NhdHRlciJ9LCJzdGVwcGVkLWFyZWEiOntjdG9yOiJTdGVwcGVkQXJlYUNoYXJ0In0sdGFibGU6e2N0b3I6IlRhYmxlIixwa2c6InRhYmxlIn0sdGltZWxpbmU6e2N0b3I6IlRpbWVsaW5lIixwa2c6InRpbWVsaW5lIn0sdHJlZW1hcDp7Y3RvcjoiVHJlZU1hcCIscGtnOiJ0cmVlbWFwIn0sd29yZHRyZWU6e2N0b3I6IldvcmRUcmVlIixuYW1lc3BhY2U6Yy5WSVMscGtnOiJ3b3JkdHJlZSJ9fSxmPXt9LGc9e30sbD17fTtQb2x5bWVyKHtpczoiZ29vZ2xlLWNoYXJ0LWxvYWRlciIscHJvcGVydGllczp7cGFja2FnZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sb2JzZXJ2ZXI6Il9sb2FkUGFja2FnZXMifSwKdHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9sb2FkUGFja2FnZUZvclR5cGUifX0sZ2V0IF9jb3JlUGFja2FnZSgpe3JldHVybiBnLmNvcmVjaGFydD9nLmNvcmVjaGFydDp0aGlzLl9sb2FkUGFja2FnZXMoWyJjb3JlY2hhcnQiXSkudGhlbihmdW5jdGlvbihrKXtyZXR1cm4ga1swXX0pfSxfbG9hZFBhY2thZ2VzRGVib3VuY2U6ZnVuY3Rpb24oKXt0aGlzLmRlYm91bmNlKCJsb2FkUGFja2FnZXMiLGZ1bmN0aW9uKCl7dmFyIGs9T2JqZWN0LmtleXMoZik7ay5sZW5ndGgmJihmPXt9LGdvb2dsZS5jaGFydHMubG9hZCgiY3VycmVudCIse3BhY2thZ2VzOmssbGFuZ3VhZ2U6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lmxhbmd8fCJlbiJ9KSxnb29nbGUuY2hhcnRzLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7ay5mb3JFYWNoKGZ1bmN0aW9uKG0pe3RoaXMuZmlyZSgibG9hZGVkIixtKTtsW21dKGdvb2dsZS52aXN1YWxpemF0aW9uKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCjEwMCl9LF9sb2FkUGFja2FnZXM6ZnVuY3Rpb24oayl7dmFyIG09W107ay5mb3JFYWNoKGZ1bmN0aW9uKHApe2dbcF18fChmW3BdPSEwLGdbcF09bmV3IFByb21pc2UoZnVuY3Rpb24ocSl7bFtwXT1xfSksdGhpcy5fbG9hZFBhY2thZ2VzRGVib3VuY2UoKSk7bS5wdXNoKGdbcF0pfS5iaW5kKHRoaXMpKTtyZXR1cm4gUHJvbWlzZS5hbGwobSl9LF9sb2FkUGFja2FnZUZvclR5cGU6ZnVuY3Rpb24oayl7dmFyIG09ZFtrXTtyZXR1cm4gbT90aGlzLl9sb2FkUGFja2FnZXMoW20ucGtnfHwiY29yZWNoYXJ0Il0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4oZ29vZ2xlW20ubmFtZXNwYWNlXXx8YShrKSlbbS5jdG9yXX0pOlByb21pc2UucmVqZWN0KCJUaGlzIGNoYXJ0IHR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQ6ICIrayl9LGNyZWF0ZTpmdW5jdGlvbihrLG0pe3JldHVybiB0aGlzLl9sb2FkUGFja2FnZUZvclR5cGUoaykudGhlbihmdW5jdGlvbihwKXtyZXR1cm4gbmV3IHAobSl9KX0sZmlyZU9uQ2hhcnRFdmVudDpmdW5jdGlvbihrLAptLHApe3JldHVybiB0aGlzLl9jb3JlUGFja2FnZS50aGVuKGZ1bmN0aW9uKHEpeyhwP3EuZXZlbnRzLmFkZE9uZVRpbWVMaXN0ZW5lcjpxLmV2ZW50cy5hZGRMaXN0ZW5lcikoayxtLGZ1bmN0aW9uKHIpe3RoaXMuZmlyZSgiZ29vZ2xlLWNoYXJ0LSIrbSx7Y2hhcnQ6ayxkYXRhOnJ9KX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfSxkYXRhVGFibGU6ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2NvcmVQYWNrYWdlLnRoZW4oZnVuY3Rpb24obSl7cmV0dXJuIG51bGw9PWs/bmV3IG0uRGF0YVRhYmxlOmsuZ2V0TnVtYmVyT2ZSb3dzP2s6ay5jb2xzP25ldyBtLkRhdGFUYWJsZShrKTowPGsubGVuZ3RoP20uYXJyYXlUb0RhdGFUYWJsZShrKTowPT09ay5sZW5ndGg/UHJvbWlzZS5yZWplY3QoIkRhdGEgd2FzIGVtcHR5LiIpOlByb21pc2UucmVqZWN0KCJEYXRhIGZvcm1hdCB3YXMgbm90IHJlY29nbml6ZWQuIil9KX0sZGF0YVZpZXc6ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2NvcmVQYWNrYWdlLnRoZW4oZnVuY3Rpb24obSl7cmV0dXJuIG5ldyBtLkRhdGFWaWV3KGspfSl9LApxdWVyeTpmdW5jdGlvbihrLG0pe3JldHVybiB0aGlzLl9jb3JlUGFja2FnZS50aGVuKGZ1bmN0aW9uKHApe3JldHVybiBuZXcgcC5RdWVyeShrLG0pfSl9fSl9KSgpOwo8L3NjcmlwdD4KCjxkb20tbW9kdWxlIGlkPSJnb29nbGUtY2hhcnQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3R5cGU9J2dhdWdlJ10pIHsKICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJnb29nbGUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJnb29nbGUtY2hhcnQtc3R5bGVzIj48L3N0eWxlPgogICAgPGdvb2dsZS1jaGFydC1sb2FkZXIgaWQ9ImxvYWRlciIgdHlwZT0iW1t0eXBlXV0iPjwvZ29vZ2xlLWNoYXJ0LWxvYWRlcj4KICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2Ij48L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZ29vZ2xlLWNoYXJ0L2dvb2dsZS1jaGFydC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJnb29nbGUtY2hhcnQiLHByb3BlcnRpZXM6e3R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJjb2x1bW4iLG9ic2VydmVyOiJfdHlwZUNoYW5nZWQifSxldmVudHM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LG9wdGlvbnM6e3R5cGU6T2JqZWN0fSxjb2xzOnt0eXBlOkFycmF5LG9ic2VydmVyOiJfcm93c09yQ29sdW1uc0NoYW5nZWQifSxyb3dzOnt0eXBlOkFycmF5LG9ic2VydmVyOiJfcm93c09yQ29sdW1uc0NoYW5nZWQifSxkYXRhOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2RhdGFDaGFuZ2VkIn0sdmlldzp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il92aWV3Q2hhbmdlZCJ9LHNlbGVjdGlvbjp7dHlwZTpBcnJheSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZXRTZWxlY3Rpb24ifSxkcmF3bjp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX2RyYXcoX2NoYXJ0LCBfZGF0YVZpZXcpIiwKIl9zdWJPcHRpb25DaGFuZ2VkKG9wdGlvbnMuKikiXSxsaXN0ZW5lcnM6eyJnb29nbGUtY2hhcnQtc2VsZWN0IjoiX3VwZGF0ZVNlbGVjdGlvbiIsImdvb2dsZS1jaGFydC1yZWFkeSI6Il9vbkNoYXJ0UmVhZHkifSxfY2hhcnQ6bnVsbCxfZGF0YVZpZXc6bnVsbCxfc2VsZWN0aW9uOm51bGwsX3R5cGVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy4kLmxvYWRlci5jcmVhdGUodGhpcy50eXBlLHRoaXMuJC5jaGFydGRpdikudGhlbihmdW5jdGlvbihhKXt2YXIgYz10aGlzLiQubG9hZGVyO09iamVjdC5rZXlzKHRoaXMuZXZlbnRzLmNvbmNhdChbInNlbGVjdCIsInJlYWR5Il0pLnJlZHVjZShmdW5jdGlvbihkLGYpe2RbZl09ITA7cmV0dXJuIGR9LHt9KSkuZm9yRWFjaChmdW5jdGlvbihkKXtjLmZpcmVPbkNoYXJ0RXZlbnQoYSxkKX0pO3RoaXMuX3NldERyYXduKCExKTt0aGlzLl9jaGFydD1hfS5iaW5kKHRoaXMpKX0sX3N1Yk9wdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zPQphLmJhc2U7dGhpcy5kZWJvdW5jZSgib3B0aW9uQ2hhbmdlUmVkcmF3IixmdW5jdGlvbigpe3RoaXMucmVkcmF3KCl9LDUpfSxfc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5kcmF3biYmdGhpcy5zZWxlY3Rpb24mJnRoaXMuc2VsZWN0aW9uIT09dGhpcy5fc2VsZWN0aW9uJiYodGhpcy5fY2hhcnQuc2V0U2VsZWN0aW9uJiZ0aGlzLl9jaGFydC5zZXRTZWxlY3Rpb24odGhpcy5zZWxlY3Rpb24pLHRoaXMuX3NlbGVjdGlvbj10aGlzLnNlbGVjdGlvbil9LF91cGRhdGVTZWxlY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbj10aGlzLl9zZWxlY3Rpb249dGhpcy5fY2hhcnQuZ2V0U2VsZWN0aW9uKCl9LF9vbkNoYXJ0UmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9zZXREcmF3bighMCk7dGhpcy5fc2VsZWN0aW9uPW51bGw7dGhpcy5fc2V0U2VsZWN0aW9uKCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9kYXRhVmlldyYmdGhpcy5fZHJhdyh0aGlzLl9jaGFydCwKdGhpcy5fZGF0YVZpZXcpfSxfZHJhdzpmdW5jdGlvbihhLGMpe2lmKG51bGwhPWEmJm51bGwhPWMpdHJ5e3RoaXMuX3NldERyYXduKCExKSxhLmRyYXcoYyx0aGlzLm9wdGlvbnN8fHt9KX1jYXRjaChkKXt0aGlzLiQuY2hhcnRkaXYuaW5uZXJIVE1MPWR9fSxnZXQgaW1hZ2VVUkkoKXtyZXR1cm4gdGhpcy5fY2hhcnQ/dGhpcy5fY2hhcnQuZ2V0SW1hZ2VVUkkoKTpudWxsfSxfdmlld0NoYW5nZWQ6ZnVuY3Rpb24oYSl7YSYmKHRoaXMuX2RhdGFWaWV3PWEpfSxfcm93c09yQ29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJvd3MsYz10aGlzLmNvbHM7YSYmYyYmdGhpcy4kLmxvYWRlci5kYXRhVGFibGUoKS50aGVuKGZ1bmN0aW9uKGQpe2MuZm9yRWFjaChmdW5jdGlvbihmKXtkLmFkZENvbHVtbihmKX0pO2QuYWRkUm93cyhhKTtyZXR1cm4gZH0uYmluZCh0aGlzKSkudGhlbih0aGlzLiQubG9hZGVyLmRhdGFWaWV3LmJpbmQodGhpcy4kLmxvYWRlcikpLnRoZW4oZnVuY3Rpb24oZCl7dGhpcy5fZGF0YVZpZXc9CmR9LmJpbmQodGhpcykpLmNhdGNoKGZ1bmN0aW9uKGQpe3RoaXMuJC5jaGFydGRpdi5pbm5lckhUTUw9ZH0uYmluZCh0aGlzKSl9LF9kYXRhQ2hhbmdlZDpmdW5jdGlvbihhKXtpZihhKXt2YXIgYz0hMTt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2M9InN0cmluZyI9PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU3RyaW5nfWE9Yz9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLXJlcXVlc3QiKS5zZW5kKHt1cmw6YSxoYW5kbGVBczoianNvbiJ9KS50aGVuKGZ1bmN0aW9uKGQpe3JldHVybiBkLnJlc3BvbnNlfSk6UHJvbWlzZS5yZXNvbHZlKGEpO2EudGhlbih0aGlzLiQubG9hZGVyLmRhdGFUYWJsZS5iaW5kKHRoaXMuJC5sb2FkZXIpKS50aGVuKHRoaXMuJC5sb2FkZXIuZGF0YVZpZXcuYmluZCh0aGlzLiQubG9hZGVyKSkudGhlbihmdW5jdGlvbihkKXt0aGlzLl9kYXRhVmlldz1kfS5iaW5kKHRoaXMpKX19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPSJodHRwczovL3d3dy5nc3RhdGljLmNvbS9jaGFydHMvbG9hZGVyLmpzIjtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGEpfX0pfSkoKTsKPC9zY3JpcHQ+CgoKPGRvbS1tb2R1bGUgaWQ9Imdvb2dsZS1jaGFydC1kZW1vIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIGNvZGUgewogICAgICAgIGNvbG9yOiAjMDA3MDAwOwogICAgICB9CiAgICAgIGdvb2dsZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGlkPSJkZW1vLWJvZHkiPgogICAgICA8cD4KICAgICAgICBXZWJzaXRlIHRyYWZmaWMgZGF0YSBieSBjb3VudHJ5IGZyb20gYW4gZXh0ZXJuYWwgSlNPTiByZXNvdXJjZSB3aGVyZSB0aGUKICAgICAgICBkYXRhIGlzIGluIHJhdyBEYXRhVGFibGUgZm9ybWF0LgogICAgICAKICAgICAgPGdvb2dsZS1jaGFydCB0eXBlPSJjb2x1bW4iIG9wdGlvbnM9InsmcXVvdDt0aXRsZSZxdW90OzogJnF1b3Q7VmlzaXRvcnMgYnkgQ291bnRyeSZxdW90OywgJnF1b3Q7bGVnZW5kJnF1b3Q7OiAmcXVvdDtub25lJnF1b3Q7fSIgZGF0YT0iW1tfZGF0YV1dIj4KICAgICAgPC9nb29nbGUtY2hhcnQ+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZ29vZ2xlLWNoYXJ0L2dvb2dsZS1jaGFydC1kZW1vLmh0bWwuanMKUG9seW1lcih7aXM6Imdvb2dsZS1jaGFydC1kZW1vIixwcm9wZXJ0aWVzOntfZGF0YTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVWaWV3In19fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXBsdWdpbi1kaWFsb2ciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19vcGVuXV0iPgogICAgICA8ZGl2IGlkPSJkYXNoYm9hcmQtYmFja2Ryb3AiPjwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgaWQ9ImRpYWxvZyIgbW9kYWwgb3BlbmVkPSJ7e19vcGVufX0iIHdpdGgtYmFja2Ryb3A9IltbX3VzZU5hdGl2ZUJhY2tkcm9wXV0iPgogICAgICA8aDIgaWQ9ImRpYWxvZy10aXRsZSI+W1tfdGl0bGVdXTwvaDI+CiAgICAgIDxkaXYgY2xhc3M9ImN1c3RvbS1tZXNzYWdlIj5bW19jdXN0b21NZXNzYWdlXV08L2Rpdj4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjZGlhbG9nLXRpdGxlIHsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTVweDsKICAgICAgfQoKICAgICAgLmN1c3RvbS1tZXNzYWdlIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtdGVuc29yYm9hcmQvcGx1Z2luLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wbHVnaW4tZGlhbG9nIixwcm9wZXJ0aWVzOntfdGl0bGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9jdXN0b21NZXNzYWdlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb3Blbjp7dHlwZTpCb29sZWFufSxfaGlkZGVuOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGlkZGVuKF9vcGVuKSIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfdXNlTmF0aXZlQmFja2Ryb3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9wZW5Ob1RlbnNvckZsb3dEaWFsb2coKXt0aGlzLm9wZW5EaWFsb2coIlRoaXMgcGx1Z2luIGlzIGRpc2FibGVkIHdpdGhvdXQgVGVuc29yRmxvdyIsJ1RvIGVuYWJsZSB0aGlzIHBsdWdpbiBpbiBUZW5zb3JCb2FyZCwgaW5zdGFsbCBUZW5zb3JGbG93IHdpdGggInBpcCBpbnN0YWxsIHRlbnNvcmZsb3ciIG9yIGVxdWl2YWxlbnQuJyl9LG9wZW5PbGRUZW5zb3JGbG93RGlhbG9nKGEpe3RoaXMub3BlbkRpYWxvZygiVGhpcyBwbHVnaW4gaXMgZGlzYWJsZWQgd2l0aG91dCBUZW5zb3JGbG93ICIrCmEsIlRvIGVuYWJsZSB0aGlzIHBsdWdpbiBpbiBUZW5zb3JCb2FyZCwgaW5zdGFsbCBUZW5zb3JGbG93ICIrYSsnIG9yIGdyZWF0ZXIgd2l0aCAicGlwIGluc3RhbGwgdGVuc29yZmxvdyIgb3IgZXF1aXZhbGVudC4nKX0sb3BlbkRpYWxvZyhhLGMpe3RoaXMuc2V0KCJfdGl0bGUiLGEpO3RoaXMuc2V0KCJfY3VzdG9tTWVzc2FnZSIsYyk7dGhpcy4kLmRpYWxvZy5vcGVuKCl9LGNsb3NlRGlhbG9nKCl7dGhpcy4kLmRpYWxvZy5jbG9zZSgpfSxfY29tcHV0ZUhpZGRlbihhKXtyZXR1cm4hYX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcHJvZmlsZS1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTdGF0ZShfdG9wTGV2ZWxTdGF0ZSwgJ0lOX0NPTEFCJyldXSI+CiAgICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTQwcHg7IG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsiPgogICAgICAgIDxoMz5Qcm9maWxpbmcgaXNu4oCZdCBzdXBwb3J0ZWQgaW4gQ29sYWIgeWV0LjwvaDM+CiAgICAgICAgPHA+CiAgICAgICAgICBQbGVhc2Ugc2VlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkxMyIgcmVsPSJub29wZW5lciIgdGFyZ2V0PSJfYmxhbmsiPkdpdEh1YiBpc3N1ZSAjMTkxMzwvYT4KICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgIAogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItdG9hc3QgaWQ9InRvYXN0IiBkdXJhdGlvbj0iMCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPgogICAgICA8cGFwZXItYnV0dG9uIG9uY2xpY2s9InRvYXN0LnRvZ2dsZSgpIiBjbGFzcz0ieWVsbG93LWJ1dHRvbiI+Q2xvc2Ugbm93ITwvcGFwZXItYnV0dG9uPgogICAgPC9wYXBlci10b2FzdD4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJjYXB0dXJlUHJvZmlsZURpYWxvZyIgbW9kYWw+CiAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUHJvZmlsZXIgU2VydmljZSBVUkwgb3IgVFBVIG5hbWUiIGFsd2F5cy1mbG9hdC1sYWJlbCBwbGFjZWhvbGRlcj0ibG9jYWxob3N0OjYwMDkiIHZhbHVlPSJ7e19wcm9maWxlclNlcnZpY2VBZGRyZXNzfX0iIGF1dG8tdmFsaWRhdGUgcmVxdWlyZWQ+PC9wYXBlci1pbnB1dD4KICAgICAgPGxhYmVsIGlkPSJwcm9maWxlci1hZGRyZXNzLXR5cGUtbGFiZWwiPkFkZHJlc3MgVHlwZTo8L2xhYmVsPgogICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7X3Byb2ZpbGVyU2VydmljZUFkZHJlc3NUeXBlfX0iIGFyaWEtbGFiZWxsZWRieT0icHJvZmlsZXItYWRkcmVzcy10eXBlLWxhYmVsIj4KICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImlwLWFkZHJlc3MiPklQIEFkZHJlc3M8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InRwdS1uYW1lIj5UUFUgTmFtZTwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlByb2ZpbGluZyBEdXJhdGlvbiAobWlsbGlzZWNvbmRzKSIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9IjYwMDAwMCIgYXV0by12YWxpZGF0ZSBwYXR0ZXJuPSJbMC05XSsiIGVycm9yLW1lc3NhZ2U9IklucHV0IGlzIG5vdCBhbiBpbnRlZ2VyIGJldHdlZW4gMSB0byA2MDAwMDAiIHJlcXVpcmVkIHZhbHVlPSJ7e19wcm9maWxlRHVyYXRpb259fSI+PC9wYXBlci1pbnB1dD4KCiAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iQXV0b21hdGljYWxseSByZXRyeSBOIHRpbWVzIHdoZW4gbm8gdHJhY2UgZXZlbnQgaXMgY29sbGVjdGVkIiBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG1heD0iMTAwIiBhdXRvLXZhbGlkYXRlIHBhdHRlcm49IlswLTldKyIgZXJyb3ItbWVzc2FnZT0iSW5wdXQgaXMgbm90IGFuIGludGVnZXIgYmV0d2VlbiAwIHRvIDEwMCIgcmVxdWlyZWQgdmFsdWU9Int7X3Byb2ZpbGVOdW1SZXRyeX19Ij48L3BhcGVyLWlucHV0PgoKICAgICAgPGRpdiBoaWRkZW49Int7IV9zaG91bGRTaG93VHB1T3B0aW9ucyhfcHJvZmlsZXJTZXJ2aWNlQWRkcmVzc1R5cGUpfX0iPgogICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19wcm9maWxlSW5jbHVkZURhdGFzZXRPcHN9fSI+VHJhY2UgZGF0YXNldCBvcHM8L3BhcGVyLWNoZWNrYm94PgogICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iU3Vic2V0IG9mIHdvcmtlciBUUFVzIHRvIHByb2ZpbGUgKG9wdGlvbmFsKSIgYWx3YXlzLWZsb2F0LWxhYmVsIHBsYWNlaG9sZGVyPSJMaXN0IG9mIElQcywgZS5nLiAxMC40LjEuMiwxMC40LjEuMyIgdmFsdWU9Int7X3Byb2ZpbGVXb3JrZXJMaXN0fX0iPjwvcGFwZXItaW5wdXQ+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGRpYWxvZy1jb25maXJtIHJhaXNlZCBvbi10YXA9Il9jYXB0dXJlUHJvZmlsZSIgZGlzYWJsZWQkPSJbW19zaG91bGREaXNhYmxlQ2FwdHVyZVByb2ZpbGVCdXR0b24oX3Byb2ZpbGVyU2VydmljZUFkZHJlc3MsIF9wcm9maWxlRHVyYXRpb24sIF9wcm9maWxlTnVtUmV0cnkpXV0iPgogICAgICAgICAgQ2FwdHVyZTwvcGFwZXItYnV0dG9uPgogICAgICAgIDxwYXBlci1idXR0b24gZGlhbG9nLWNvbmZpcm0+Q2xvc2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTdGF0ZShfdG9wTGV2ZWxTdGF0ZSwgJ0xPQURJTkcnKV1dIj4KICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIj4KICAgICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1tc2ciPltbcHJvZ3Jlc3MubXNnXV08L2Rpdj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgdmFsdWU9IltbcHJvZ3Jlc3MudmFsdWVdXSI+PC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1N0YXRlKF90b3BMZXZlbFN0YXRlLCAnREFUQV9OT1RfRk9VTkQnKV1dIj4KICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1NDBweDsgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOyI+CiAgICAgICAgPGgzPk5vIHByb2ZpbGUgZGF0YSB3YXMgZm91bmQuPC9oMz4KCiAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgb24tdGFwPSJfb3BlbkNhcHR1cmVQcm9maWxlRGlhbG9nIj5DYXB0dXJlIFByb2ZpbGU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8cGFwZXItc3Bpbm5lciBjbGFzcz0iY2FwdHVyZS1zcGlubmVyIiBhY3RpdmU9IltbX2NhcHR1cmluZ1Byb2ZpbGVdXSI+PC9wYXBlci1zcGlubmVyPgoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdSBoYXZlIGEgbW9kZWwgcnVubmluZyBvbiBDUFUsIEdQVSwgb3IgR29vZ2xlIENsb3VkIFRQVSwgeW91IG1heQogICAgICAgICAgYmUgYWJsZSB0byB1c2UgdGhlIGFib3ZlIGJ1dHRvbiB0byBjYXB0dXJlIGEgcHJvZmlsZS4KICAgICAgICAKCiAgICAgICAgPHA+CiAgICAgICAgICBJZiB5b3XigJlyZSBhIENQVSBvciBHUFUgdXNlciwgcGxlYXNlIHVzZSB0aGUgSVAgYWRkcmVzcyBvcHRpb24uIFlvdSBtYXkKICAgICAgICAgIHdhbnQgdG8gY2hlY2sgb3V0IHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9jb2xhYi5yZXNlYXJjaC5nb29nbGUuY29tL2dpdGh1Yi90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL2RvY3MvcjIvdGVuc29yYm9hcmRfcHJvZmlsaW5nX2tlcmFzLmlweW5iIiByZWw9Im5vb3BlbmVyIiB0YXJnZXQ9Il9ibGFuayI+dHV0b3JpYWw8L2E+CiAgICAgICAgICBvbiBob3cgdG8gc3RhcnQgYSBUZW5zb3JGbG93IHByb2ZpbGVyIHNlcnZlciBhbmQgcHJvZmlsZSBhIEtlcmFzIG1vZGVsCiAgICAgICAgICBvbiBhIEdQVS4KICAgICAgICAKCiAgICAgICAgPHA+CiAgICAgICAgICBJZiB5b3UncmUgYSBUUFUgdXNlciwgcGxlYXNlIHVzZSB0aGUgVFBVIG5hbWUgb3B0aW9uIGFuZCB5b3UgbWF5IHdhbnQKICAgICAgICAgIHRvIGNoZWNrIG91dCB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS90cHUvZG9jcy9jbG91ZC10cHUtdG9vbHMiIHJlbD0ibm9vcGVuZXIiIHRhcmdldD0iX2JsYW5rIj50dXRvcmlhbDwvYT4KICAgICAgICAgIG9uIGhvdyB0byBpbnRlcnByZXRpbmcgdGhlIHByb2ZpbGluZyByZXN1bHRzLgogICAgICAgIAoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdSB0aGluayBwcm9maWxpbmcgaXMgZG9uZSBwcm9wZXJseSwgcGxlYXNlIHNlZSB0aGUgcGFnZSBvZgogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3RwdS9kb2NzL3Ryb3VibGVzaG9vdGluZyIgcmVsPSJub29wZW5lciIgdGFyZ2V0PSJfYmxhbmsiPkdvb2dsZSBDbG91ZCBUUFUgVHJvdWJsZXNob290aW5nIGFuZCBGQVE8L2E+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1N0YXRlKF90b3BMZXZlbFN0YXRlLCAnQUNUSVZFJyldXSI+CiAgICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iYWxsY29udHJvbHMiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIG9uLXRhcD0iX29wZW5DYXB0dXJlUHJvZmlsZURpYWxvZyI+Q2FwdHVyZSBQcm9maWxlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXIgY2xhc3M9ImNhcHR1cmUtc3Bpbm5lciIgYWN0aXZlPSJbW19jYXB0dXJpbmdQcm9maWxlXV0iPjwvcGFwZXItc3Bpbm5lcj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICAgICAgUnVucyA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbX2RhdGFzZXRzLmxlbmd0aF1dKTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIG5vaW5rIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggaWQ9Imxpc3RfYm94X3J1biIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWREYXRhc2V0SW5kZXh9fSI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD0icnVuX2l0ZW1zIiBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2RhdGFzZXRzXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICAgICAgICBUb29scyA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbX2FjdGl2ZVRvb2xzTGlzdC5sZW5ndGhdXSk8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgbm8tYW5pbWF0aW9ucyBub2luayBob3Jpem9udGFsLWFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJsaXN0X2JveF90b29sIiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZFRvb2xJbmRleH19Ij4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlkPSJ0b29sX2l0ZW1zIiBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2FjdGl2ZVRvb2xzTGlzdF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzQWN0aXZlVG9vbHMoKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5Ob25lPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICAgICAgSG9zdHMgPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW19hY3RpdmVIb3N0c0xpc3QubGVuZ3RoXV0pPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IG5vLWFuaW1hdGlvbnMgbm9pbmsgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBpZD0ibGlzdF9ib3hfaG9zdCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWRIb3N0SW5kZXh9fSI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD0iaG9zdF9pdGVtcyIgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19hY3RpdmVIb3N0c0xpc3RdXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tfZ2V0SG9zdERpc3BsYXlOYW1lKGl0ZW0pXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIGRldGFpbHMtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnb3BfcHJvZmlsZScpXV0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICAgICAgPHRmLW9wLWRldGFpbHMgaGlkZGVuPSJbWyFfYWN0aXZlT3BEZXRhaWxzXV0iIG5vZGU9IltbX2FjdGl2ZU9wRGV0YWlsc11dIj48L3RmLW9wLWRldGFpbHM+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnbWVtb3J5X3ZpZXdlcicpXV0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICAgICAgPGJ1ZmZlci1kZXRhaWxzIGhpZGRlbj0iW1shX2FjdGl2ZUJ1ZmZlckRldGFpbHNdXSIgbm9kZT0iW1tfYWN0aXZlQnVmZmVyRGV0YWlsc11dIj48L2J1ZmZlci1kZXRhaWxzPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ3BvZF92aWV3ZXInKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDxkZXRhaWxzLWNhcmQgaGlkZGVuPSJbWyFfYWN0aXZlUG9kRGV0YWlsc11dIiBub2Rlcz0iW1tfYWN0aXZlUG9kRGV0YWlsc11dIj48L2RldGFpbHMtY2FyZD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDdXJyZW50VG9vbChfdG9vbEluU2NvcGUsICd0cmFjZV92aWV3ZXInKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgPGlmcmFtZSBpZD0idHZfaWZyYW1lIiBoZWlnaHQ9IjEwMCUiIHdpZHRoPSIxMDAlIiBzcmMkPSJbW190cmFjZURhdGFVcmxdXSI+CiAgICAgICAgICAgIDwvaWZyYW1lPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDdXJyZW50VG9vbChfdG9vbEluU2NvcGUsICdvcF9wcm9maWxlJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgIDx0Zi1vcC1wcm9maWxlIF9kYXRhPSJbW19vcFByb2ZpbGVEYXRhXV0iIGFjdGl2ZT0ie3tfYWN0aXZlT3BEZXRhaWxzfX0iPjwvdGYtb3AtcHJvZmlsZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnaW5wdXRfcGlwZWxpbmVfYW5hbHl6ZXInKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgPGlucHV0LXBpcGVsaW5lLWFuYWx5emVyIF9kYXRhPSJbW19pbnB1dFBpcGVsaW5lRGF0YV1dIj48L2lucHV0LXBpcGVsaW5lLWFuYWx5emVyPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDdXJyZW50VG9vbChfdG9vbEluU2NvcGUsICdvdmVydmlld19wYWdlJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgIDxvdmVydmlldy1wYWdlIF9kYXRhPSJbW19vdmVydmlld1BhZ2VEYXRhXV0iPjwvb3ZlcnZpZXctcGFnZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAncG9kX3ZpZXdlcicpXV0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICA8cG9kLXZpZXdlci1kYXNoYm9hcmQgZGF0YT0iW1tfcG9kVmlld2VyRGF0YV1dIiBhY3RpdmUtZGV0YWlscz0ie3tfYWN0aXZlUG9kRGV0YWlsc319Ij48L3BvZC12aWV3ZXItZGFzaGJvYXJkPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDdXJyZW50VG9vbChfdG9vbEluU2NvcGUsICdtZW1vcnlfdmlld2VyJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgIDxtZW1vcnktdmlld2VyLWRhc2hib2FyZCBfZGF0YT0iW1tfbWVtb3J5Vmlld2VyRGF0YV1dIiBhY3RpdmU9Int7X2FjdGl2ZUJ1ZmZlckRldGFpbHN9fSI+PC9tZW1vcnktdmlld2VyLWRhc2hib2FyZD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnZ29vZ2xlX2NoYXJ0X2RlbW8nKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgPGdvb2dsZS1jaGFydC1kZW1vIF9kYXRhPSJbW19nb29nbGVDaGFydERlbW9EYXRhXV0iPjwvZ29vZ2xlLWNoYXJ0LWRlbW8+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KCiAgICA8c3R5bGU+CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgaWZyYW1lIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgICAgI3Byb2dyZXNzLWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNDBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQogICAgICAjcHJvZ3Jlc3MtbXNnIHsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CiAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IDZweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogI2YzOTEzZTsKICAgICAgfQogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuZGV0YWlscy1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDsKICAgICAgfQogICAgICB0Zi1vcC1kZXRhaWxzLAogICAgICBidWZmZXItZGV0YWlscywKICAgICAgZGV0YWlscy1jYXJkIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICAgIC55ZWxsb3ctYnV0dG9uIHsKICAgICAgICBjb2xvcjogI2VlZmY0MTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgfQogICAgICAuY2FwdHVyZS1zcGlubmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLXByb2ZpbGUtZGFzaGJvYXJkL3RmLXByb2ZpbGUtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLXByb2ZpbGUtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUGsuUmVxdWVzdE1hbmFnZXJ9LF9pc0F0dGFjaGVkOkJvb2xlYW4sX2lzQXZhaWxhYmxlOkJvb2xlYW4sX2luaXRpYWxpemVkOkJvb2xlYW4sX2RhdGFOb3RGb3VuZDpCb29sZWFuLF9kYXRhc2V0czp7dHlwZTpBcnJheSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kYXRhc2V0c0NoYW5nZWQifSxfYWN0aXZlVG9vbHNMaXN0Ont0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0QWN0aXZlVG9vbHNMaXN0KHNlbGVjdGVkRGF0YXNldEluZGV4LCBfZGF0YXNldHMpIixvYnNlcnZlcjoiX2FjdGl2ZVRvb2xzQ2hhbmdlZCJ9LF9hY3RpdmVIb3N0c0xpc3Q6e3R5cGU6QXJyYXksb2JzZXJ2ZXI6Il9hY3RpdmVIb3N0c0NoYW5nZWQifSxfaW5Db2xhYjp7dHlwZTpCb29sZWFuLHZhbHVlOigpPT4hISh3aW5kb3cuVEVOU09SQk9BUkRfRU5WfHwKe30pLklOX0NPTEFCLHJlYWRPbmx5OiEwfSxfdG9wTGV2ZWxTdGF0ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVG9wTGV2ZWxTdGF0ZShfaW5Db2xhYiwgX2RhdGFOb3RGb3VuZCwgcHJvZ3Jlc3MpIixyZWFkT25seTohMH0scHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sc2VsZWN0ZWREYXRhc2V0SW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTowfSxzZWxlY3RlZFRvb2xJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOjB9LHNlbGVjdGVkSG9zdEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6MH0sdHJhY2VWaWV3ZXJCYXNlVXJsOnt0eXBlOlN0cmluZyx2YWx1ZToidHJhY2Vfdmlld2VyX2luZGV4Lmh0bWwifSxfcHJvZmlsZXJTZXJ2aWNlQWRkcmVzczpTdHJpbmcsX3Byb2ZpbGVyU2VydmljZUFkZHJlc3NUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiaXAtYWRkcmVzcyJ9LF9wcm9maWxlRHVyYXRpb246e3R5cGU6U3RyaW5nLAp2YWx1ZToiMTAwMCJ9LF9wcm9maWxlTnVtUmV0cnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIzIn0sX3Byb2ZpbGVXb3JrZXJMaXN0Ont0eXBlOlN0cmluZ30sX3Byb2ZpbGVJbmNsdWRlRGF0YXNldE9wczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfdHJhY2VEYXRhVXJsOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX29wUHJvZmlsZURhdGE6e3R5cGU6T2JqZWN0fSxfaW5wdXRQaXBlbGluZURhdGE6e3R5cGU6T2JqZWN0fSxfb3ZlcnZpZXdQYWdlRGF0YTp7dHlwZTpPYmplY3R9LF9tZW1vcnlWaWV3ZXJEYXRhOnt0eXBlOk9iamVjdH0sX3BvZFZpZXdlckRhdGE6e3R5cGU6T2JqZWN0fSxfZ29vZ2xlQ2hhcnREZW1vRGF0YTp7dHlwZTpPYmplY3R9LF9zZWxlY3RlZERhdGFzZXROYW1lOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsY29tcHV0ZWQ6Il9nZXRTZWxlY3RlZERhdGFzZXROYW1lKHNlbGVjdGVkRGF0YXNldEluZGV4LCBfZGF0YXNldHMpIn0sX3NlbGVjdGVkVG9vbE5hbWU6e3R5cGU6U3RyaW5nLApub3RpZnk6ITAsY29tcHV0ZWQ6Il9nZXRTZWxlY3RlZChzZWxlY3RlZFRvb2xJbmRleCwgX2FjdGl2ZVRvb2xzTGlzdCkifSxfc2VsZWN0ZWRIb3N0TmFtZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLGNvbXB1dGVkOiJfZ2V0U2VsZWN0ZWQoc2VsZWN0ZWRIb3N0SW5kZXgsIF9hY3RpdmVIb3N0c0xpc3QpIn0sX3Rvb2xJblNjb3BlOnt0eXBlOlN0cmluZ30sX2FjdGl2ZU9wRGV0YWlsczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pnt9fSxfYWN0aXZlQnVmZmVyRGV0YWlsczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pnt9fSxfYWN0aXZlUG9kRGV0YWlsczp7dHlwZTpBcnJheX0sX2NhcHR1cmluZ1Byb2ZpbGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LHJlbG9hZDpmdW5jdGlvbigpe30scmVhZHk6ZnVuY3Rpb24oKXt9LG9ic2VydmVyczpbIl9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQoX2lzQXR0YWNoZWQsIF9pc0F2YWlsYWJsZSkiLCJfbWF5YmVVcGRhdGVEYXRhKF9zZWxlY3RlZEhvc3ROYW1lKSIsCiJfbWF5YmVVcGRhdGVBY3RpdmVIb3N0cyhfc2VsZWN0ZWREYXRhc2V0TmFtZSwgX3NlbGVjdGVkVG9vbE5hbWUpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLCEwKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFBrLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYT0+eyJwcm9maWxlImluIGE/KHRoaXMuJC5pbml0aWFsRGlhbG9nLmNsb3NlRGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITApKToodGhpcy4kLmluaXRpYWxEaWFsb2cub3Blbk9sZFRlbnNvckZsb3dEaWFsb2coIjEuMTQiKSx0aGlzLnNldCgiX2lzQXZhaWxhYmxlIiwhMSkpfSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMSl9LF9vcGVuQ2FwdHVyZVByb2ZpbGVEaWFsb2c6ZnVuY3Rpb24oKXt0aGlzLiQuY2FwdHVyZVByb2ZpbGVEaWFsb2cub3BlbigpfSxfc2hvdWxkRGlzYWJsZUNhcHR1cmVQcm9maWxlQnV0dG9uOmZ1bmN0aW9uKGEsCmMsZCl7cmV0dXJuIWF8fCIiPT09Y3x8IiI9PT1kfSxfc2hvdWxkU2hvd1RwdU9wdGlvbnM6ZnVuY3Rpb24oYSl7cmV0dXJuInRwdS1uYW1lIj09YX0sX2NhcHR1cmVQcm9maWxlOmZ1bmN0aW9uKCl7dGhpcy5fY2FwdHVyaW5nUHJvZmlsZT0hMDtjb25zdCBhPVBrLmFkZFBhcmFtcyhQay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJvZmlsZSIsIi9jYXB0dXJlX3Byb2ZpbGUiKSx7c2VydmljZV9hZGRyOnRoaXMuX3Byb2ZpbGVyU2VydmljZUFkZHJlc3MudHJpbSgpLGlzX3RwdV9uYW1lOiJ0cHUtbmFtZSI9PXRoaXMuX3Byb2ZpbGVyU2VydmljZUFkZHJlc3NUeXBlLGR1cmF0aW9uOnRoaXMuX3Byb2ZpbGVEdXJhdGlvbix3b3JrZXJfbGlzdDp0aGlzLl9wcm9maWxlV29ya2VyTGlzdCxpbmNsdWRlX2RhdGFzZXRfb3BzOnRoaXMuX3Byb2ZpbGVJbmNsdWRlRGF0YXNldE9wcyxudW1fcmV0cnk6dGhpcy5fcHJvZmlsZU51bVJldHJ5fSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9Pgp7dGhpcy5fY2FwdHVyaW5nUHJvZmlsZT0hMTtudWxsIT1jLmVycm9yP3RoaXMuX3Nob3dUb2FzdCgiRmFpbGVkIHRvIGNhcHR1cmUgcHJvZmlsZTogIitjLmVycm9yKTp0aGlzLl9zaG93VG9hc3QoYy5yZXN1bHQpfSkuY2F0Y2goYz0+e3RoaXMuX2NhcHR1cmluZ1Byb2ZpbGU9ITE7dGhpcy5fc2hvd1RvYXN0KCJGYWlsZWQgdG8gY2FwdHVyZSBwcm9maWxlOiAiK2MpfSl9LF9zaG93VG9hc3QoYSl7dGhpcy4kLnRvYXN0LnRleHQ9YTt0aGlzLiQudG9hc3Qub3BlbigpfSxfbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuX2luaXRpYWxpemVkJiZhJiZjKXt0aGlzLl9pbml0aWFsaXplZD0hMDt2YXIgZD1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJvZmlsZSIsIi90b29scyIpO3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7dmFyIGY9dGhpcyxnPXRmLnByb2ZpbGUudXRpbC5nZXRUcmFja2VyKHRoaXMpO3RmLnByb2ZpbGUudXRpbC5ydW5UYXNrKCJMb2FkaW5nIGRhdGFzZXRzIiwKMjAsKCk9Pntjb25zb2xlLmxvZygic3RhcnQgY291bnRpbmciKTtyZXR1cm4gZi5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKX0sZykudGhlbihsPT50Zi5wcm9maWxlLnV0aWwucnVuVGFzaygiUHJvY2Vzc2luZyBkYXRhc2V0cyIsNzAsKCk9Pm5ldyBQcm9taXNlKGZ1bmN0aW9uKGspe2YuX3Byb2Nlc3NSdW5Ub1Rvb2wobCk7ayhudWxsKX0pLGcpKS50aGVuKCgpPT50Zi5wcm9maWxlLnV0aWwucnVuVGFzaygiRG9uZSIsMTAsKCk9Pm51bGwsZykpfX0sX3Byb2Nlc3NSdW5Ub1Rvb2w6ZnVuY3Rpb24oYSl7YT1fLm1hcChhLChjLGQpPT4oe25hbWU6ZCxhY3RpdmVUb29sczpjfSkpO2Euc29ydCgoYyxkKT0+MC1Pay5jb21wYXJlVGFnTmFtZXMoYy5uYW1lLGQubmFtZSkpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09YS5sZW5ndGgpO3RoaXMuc2V0KCJfZGF0YXNldHMiLGEpfSxfZ2V0U2VsZWN0ZWQ6ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1hKXJldHVybiBjJiYwPD1hJiZhPApjLmxlbmd0aD9jW2FdOm51bGx9LF9nZXRTZWxlY3RlZERhdGFzZXROYW1lOmZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YSlyZXR1cm4gYyYmMDw9YSYmYTxjLmxlbmd0aD9jW2FdLm5hbWU6IiJ9LF9nZXRBY3RpdmVUb29sc0xpc3Q6ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1hKXJldHVybiBjJiYwPD1hJiZhPGMubGVuZ3RoPyh0aGlzLnNlbGVjdGVkVG9vbEluZGV4PTAsY1thXS5hY3RpdmVUb29scyk6W119LF9tYXliZVVwZGF0ZURhdGE6ZnVuY3Rpb24oYSl7aWYobnVsbCE9YSl7dmFyIGM9dGhpcy5fc2VsZWN0ZWREYXRhc2V0TmFtZSxkPXRoaXMuX3NlbGVjdGVkVG9vbE5hbWU7aWYobnVsbCE9YyYmbnVsbCE9ZClpZih0aGlzLl90b29sSW5TY29wZT0idW5kZWZpbmVkIixkLnN0YXJ0c1dpdGgoInRyYWNlX3ZpZXdlciIpKXt2YXIgZj1Qay5hZGRQYXJhbXMoUGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByb2ZpbGUiLCIvZGF0YSIpLHt0YWc6ZCxydW46Yyxob3N0OmF9KSxnPWQuZW5kc1dpdGgoIkAiKTsKdGhpcy5fdHJhY2VEYXRhVXJsPXRoaXMudHJhY2VWaWV3ZXJCYXNlVXJsKyI/dHJhY2VfZGF0YV91cmxceDNkIitlbmNvZGVVUklDb21wb25lbnQoZikrIlx4MjZpc19zdHJlYW1pbmdceDNkIitnO3RoaXMuX3Rvb2xJblNjb3BlPSJ0cmFjZV92aWV3ZXIifWVsc2V7dGhpcy5zZXQoInByb2dyZXNzIix7dmFsdWU6MCxtc2c6IiJ9KTtsZXQgbD10aGlzLGs9dGYucHJvZmlsZS51dGlsLmdldFRyYWNrZXIodGhpcyk7dGYucHJvZmlsZS51dGlsLnJ1blRhc2soIlJlYWRpbmcgIitkKyIgdG9vbCBkYXRhIiwyMCwoKT0+bC5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChQay5hZGRQYXJhbXMoUGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByb2ZpbGUiLCIvZGF0YSIpLHt0YWc6ZCxob3N0OmEscnVuOmN9KSksaykuY2F0Y2goKCk9Pnt9KS50aGVuKG09PnRmLnByb2ZpbGUudXRpbC5ydW5UYXNrKCJEb25lIiw4MCwoKT0+e2wuX3VwZGF0ZVRvb2xEYXRhKGQsbSl9LGspKX19fSxfdXBkYXRlVG9vbERhdGE6ZnVuY3Rpb24oYSwKYyl7c3dpdGNoKGEpe2Nhc2UgIm9wX3Byb2ZpbGUiOnRoaXMuX29wUHJvZmlsZURhdGE9Yzt0aGlzLl90b29sSW5TY29wZT0ib3BfcHJvZmlsZSI7YnJlYWs7Y2FzZSAiaW5wdXRfcGlwZWxpbmVfYW5hbHl6ZXIiOnRoaXMuX2lucHV0UGlwZWxpbmVEYXRhPWM7dGhpcy5fdG9vbEluU2NvcGU9ImlucHV0X3BpcGVsaW5lX2FuYWx5emVyIjticmVhaztjYXNlICJvdmVydmlld19wYWdlIjp0aGlzLl9vdmVydmlld1BhZ2VEYXRhPWM7dGhpcy5fdG9vbEluU2NvcGU9Im92ZXJ2aWV3X3BhZ2UiO2JyZWFrO2Nhc2UgIm1lbW9yeV92aWV3ZXIiOnRoaXMuX21lbW9yeVZpZXdlckRhdGE9Yzt0aGlzLl90b29sSW5TY29wZT0ibWVtb3J5X3ZpZXdlciI7YnJlYWs7Y2FzZSAicG9kX3ZpZXdlciI6dGhpcy5fcG9kVmlld2VyRGF0YT1jO3RoaXMuX3Rvb2xJblNjb3BlPSJwb2Rfdmlld2VyIjticmVhaztjYXNlICJnb29nbGVfY2hhcnRfZGVtbyI6dGhpcy5fZ29vZ2xlQ2hhcnREZW1vRGF0YT1jLHRoaXMuX3Rvb2xJblNjb3BlPQoiZ29vZ2xlX2NoYXJ0X2RlbW8ifX0sX21heWJlVXBkYXRlQWN0aXZlSG9zdHM6ZnVuY3Rpb24oYSxjKXtpZihudWxsPT1hfHxudWxsPT1jKXJldHVybiBudWxsO3RoaXMuX2FjdGl2ZUhvc3RzTGlzdD1bXTthPVBrLmFkZFBhcmFtcyhQay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJvZmlsZSIsIi9ob3N0cyIpLHt0YWc6YyxydW46YX0pO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihkPT57dGhpcy5zZXQoIl9hY3RpdmVIb3N0c0xpc3QiLGQuc29ydCgoZixnKT0+T2suY29tcGFyZVRhZ05hbWVzKGYsZykpKX0pfSxfZGF0YXNldHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fZGF0YXNldHMmJih0aGlzLnNlbGVjdGVkRGF0YXNldEluZGV4PTApfSxfYWN0aXZlVG9vbHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aXZlVG9vbHNMaXN0JiZ0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXQoInNlbGVjdGVkVG9vbEluZGV4IiwtMSk7dGhpcy5zZXQoInNlbGVjdGVkVG9vbEluZGV4IiwKMCl9LmJpbmQodGhpcykpfSxfYWN0aXZlSG9zdHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aXZlSG9zdHNMaXN0JiZ0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXQoInNlbGVjdGVkSG9zdEluZGV4IiwtMSk7dGhpcy5zZXQoInNlbGVjdGVkSG9zdEluZGV4IiwwKX0uYmluZCh0aGlzKSl9LF9pc0N1cnJlbnRUb29sOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE9PWN9LF9oYXNBY3RpdmVUb29sczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmVUb29sc0xpc3QmJjA8dGhpcy5fYWN0aXZlVG9vbHNMaXN0Lmxlbmd0aD8hMDohMX0sX2dldEhvc3REaXNwbGF5TmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjoiIj09YT8iZGVmYXVsdCI6YS5zbGljZSgwLC0xKX0sX2NvbXB1dGVUb3BMZXZlbFN0YXRlOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gYT8iSU5fQ09MQUIiOmM/IkRBVEFfTk9UX0ZPVU5EIjohZHx8MTAwPmQudmFsdWU/IkxPQURJTkciOiJBQ1RJVkUifSwKX2lzU3RhdGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT09PWN9fSk7JGwucmVnaXN0ZXJEYXNoYm9hcmQoe3BsdWdpbjoicHJvZmlsZSIsZWxlbWVudE5hbWU6InRmLXByb2ZpbGUtZGFzaGJvYXJkIixpc1JlbG9hZERpc2FibGVkOiEwfSl9KSgpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItdmlkZW8iPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxpbWcgaWQ9InZpZGVvIiBzcmMkPSJbW19pbWFnZVVSTF1dIj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgaW1nIHsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci12aWRlby5odG1sLmpzCihmdW5jdGlvbigpe2NvbnN0IGE9UGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImJlaG9sZGVyIiwiL2JlaG9sZGVyLWZyYW1lIiksYz1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvcGluZyIpO1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci12aWRlbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSxwaW5nU2xlZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjFFM30seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MjUwMH0sX2ltYWdlVVJMOnt0eXBlOlN0cmluZyx2YWx1ZToiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCJ9LF94aHI6T2JqZWN0LF90aW1lcjpOdW1iZXIsX2lzRGVhZDpCb29sZWFufSxhdHRhY2hlZCgpe3RoaXMuc2V0KCJfaW1hZ2VVUkwiLGEpO3RoaXMuX3BpbmcoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpOwp0aGlzLnNldCgiX2ltYWdlVVJMIiwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCIpfSxfcGluZygpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixjLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vblBpbmdMb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9dGhpcy5fb25QaW5nLmJpbmQodGhpcywhMSx0aGlzLnBpbmdTbGVlcCk7dGhpcy5feGhyLm9udGltZW91dD10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25QaW5nTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgZD1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO3RoaXMuX29uUGluZygiYWxpdmUiPT1kLnN0YXR1cyx0aGlzLnBpbmdTbGVlcCl9ZWxzZSB0aGlzLl9vblBpbmcoITEsCnRoaXMucGluZ1NsZWVwKX0sX29uUGluZyhkLGYpe2QmJnRoaXMuX2lzRGVhZCYmdGhpcy5zZXQoIl9pbWFnZVVSTCIsYSsiP3RceDNkIisobmV3IERhdGUpLmdldFRpbWUoKSk7dGhpcy5faXNEZWFkPSFkO3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9waW5nKCksZil9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYodGhpcy5feGhyLnJlYWR5U3RhdGU8WE1MSHR0cFJlcXVlc3QuRE9ORSYmdGhpcy5feGhyLmFib3J0KCksdGhpcy5feGhyPW51bGwpfSxfZnBzQ2hhbmdlZChkLGYpezA9PWQ/dGhpcy5fY2xlYXIoKTowPT1mJiZ0aGlzLl9waW5nKCl9fSl9KSgpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWJlaG9sZGVyLWluZm8iPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2l0ZW1zXV0iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWluZm8iIHN0eWxlJD0iaGVpZ2h0OiBbW2l0ZW0uaGVpZ2h0XV1weCI+CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPltbaXRlbS5uYW1lXV08L2xpPgogICAgICAgICAgPGxpPnNoYXBlOiBbW2l0ZW0uc2hhcGVdXTwvbGk+CiAgICAgICAgICA8bGk+cmFuZ2U6IFsgW1tpdGVtLm1pbl1dLCBbW2l0ZW0ubWF4XV0gXTwvbGk+CiAgICAgICAgICA8bGk+bWVhbjogW1tpdGVtLm1lYW5dXTwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24taW5mbyB7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgICAgIH0KICAgICAgLnNlY3Rpb24taW5mbyB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYT1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvc2VjdGlvbi1pbmZvIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWluZm8iLHByb3BlcnRpZXM6e2Zwczp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsb2JzZXJ2ZXI6Il9mcHNDaGFuZ2VkIn0seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MUU0fSxfaXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7bmFtZToiTG9hZGluZy4uLiJ9XX0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcn0sYXR0YWNoZWQoKXt0aGlzLl9sb2FkKCl9LGRldGFjaGVkKCl7dGhpcy5fY2xlYXIoKX0sX2xvYWQoKXt0aGlzLl9jbGVhcigpO3RoaXMuX3hocj1uZXcgWE1MSHR0cFJlcXVlc3Q7dGhpcy5feGhyLm9wZW4oIkdFVCIsYSwhMCk7dGhpcy5feGhyLnRpbWVvdXQ9dGhpcy54aHJUaW1lb3V0O3RoaXMuX3hoci5vbmxvYWQ9dGhpcy5fb25Mb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9CnRoaXMuX3JldHJ5LmJpbmQodGhpcyx0aGlzLl9nZXRTbGVlcCgpKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX3JldHJ5LmJpbmQodGhpcywxKTt0aGlzLl94aHIuc2VuZChudWxsKX0sX29uTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgYz1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO2NvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYyksIkV4cGVjdGVkIHJlc3BvbnNlIHRvIGJlIGluIGFuIGFycmF5Iik7dGhpcy5faXRlbXM9Y310aGlzLl9yZXRyeSh0aGlzLl9nZXRTbGVlcCgpKX0sX3JldHJ5KGMpe3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2xvYWQuYmluZCh0aGlzKSxjKX0sX2dldFNsZWVwKCl7cmV0dXJuIDFFMy8oMD09PXRoaXMuZnBzPzE6dGhpcy5mcHMpfSxfY2xlYXIoKXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpO3RoaXMuX3hociYmCih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGMsZCl7MD09Yz90aGlzLl9jbGVhcigpOjA9PWQmJnRoaXMuX2xvYWQoKX19KX0pKCk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWJlaG9sZGVyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLXBsdWdpbi1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtcGx1Z2luLWRpYWxvZz4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHAgY2xhc3M9ImNvbnRyb2xzLWRpc2FibGVkLW1lc3NhZ2UiPgogICAgICAgICAgICAgIENvbnRyb2xzIGRpc2FibGVkOiBkaXJlY3RvcnkgaXMgbm90IHdyaXRlYWJsZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgICBCZWhvbGRlciByZXF1aXJlcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGxvZyBkaXJlY3RvcnkgaW4gb3JkZXIgdG8KICAgICAgICAgICAgICBjb21tdW5pY2F0ZSB2aXN1YWxpemF0aW9uIGNoYW5nZXMgdG8gdGhlIDxjb2RlPkJlaG9sZGVyPC9jb2RlPgogICAgICAgICAgICAgIGluc3RhbmNlIGluIHlvdXIgbW9kZWwuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzPlZhbHVlczwvaDM+CiAgICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgaWQ9InZhbHVlc1NlbGVjdG9yIiBzZWxlY3RlZD0ie3tfdmFsdWVzfX0iPgogICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InRyYWluYWJsZV92YXJpYWJsZXMiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8cHJlPnRmLnRyYWluYWJsZV92YXJpYWJsZXMoKTwvcHJlPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLWFycmF5cyIgbmFtZT0iYXJyYXlzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT5iLnVwZGF0ZShhcnJheXM9W05QX0FSUkFZU10pPC9wcmU+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tZnJhbWVzIiBuYW1lPSJmcmFtZXMiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8cHJlPmIudXBkYXRlKGZyYW1lPU5QX0FSUkFZKTwvcHJlPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X3Nob3dBbGx9fSIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPlNob3cgYWxsIGRhdGEgPGk+KGNhbiBiZSByZXNvdXJjZSBpbnRlbnNpdmUpPC9pPjwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3ZhbHVlc05vdEZyYW1lKF92YWx1ZXMpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGgzPk1vZGU8L2gzPgogICAgICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgaWQ9Im1vZGVTZWxlY3RvciIgc2VsZWN0ZWQ9Int7X21vZGV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJjdXJyZW50IiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICBjdXJyZW50IHZhbHVlcwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0idmFyaWFuY2UiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIHZhcmlhbmNlIG92ZXIgdHJhaW4gc3RlcHMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YXJpYW5jZVNlbGVjdGVkKF9tb2RlKV1dIj4KICAgICAgICAgICAgICA8aDQ+VmFyaWFuY2UgdGltZXN0ZXBzOiB7e193aW5kb3dTaXplfX08L2g0PgogICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9IndpbmRvd1NsaWRlciIgdmFsdWU9Int7X3dpbmRvd1NpemV9fSIgdHlwZT0ibnVtYmVyIiBzdGVwPSIxIiBtaW49IjIiIG1heD0iMjAiIHBpbj0idHJ1ZSIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGgzPkltYWdlIHNjYWxpbmc8L2gzPgogICAgICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgaWQ9InNjYWxpbmdTZWxlY3RvciIgc2VsZWN0ZWQ9Int7X3NjYWxpbmd9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLWxheWVyIiBuYW1lPSJsYXllciIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgcGVyIHNlY3Rpb24KICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBmb3I9Im9wdGlvbi1sYXllciIgcG9zaXRpb249InJpZ2h0Ij4KICAgICAgICAgICAgICAgIEJsYWNrIGlzIHRoZSBsb3dlc3QgdmFsdWUgaW4gdGhhdCBzZWN0aW9uLCB3aGl0ZSBpcyB0aGF0IGxhcmdlc3QKICAgICAgICAgICAgICAgIHZhbHVlIGluIHRoYXQgc2VjdGlvbi4KICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1uZXR3b3JrIiBuYW1lPSJuZXR3b3JrIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICBhbGwgc2VjdGlvbnMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBmb3I9Im9wdGlvbi1uZXR3b3JrIiBwb3NpdGlvbj0icmlnaHQiPgogICAgICAgICAgICAgICAgQmxhY2sgaXMgdGhlIHNtYWxsZXN0IHZhbHVlIGluIGFsbCBzZWN0aW9ucywgd2hpdGUgaXMgdGhlCiAgICAgICAgICAgICAgICBsYXJnZXN0IHZhbHVlIGluIGFsbCBzZWN0aW9ucy4KICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CgogICAgICAgICAgICA8ZGl2IGlkPSJjb2xvcm1hcC1zZWxlY3Rpb24iPgogICAgICAgICAgICAgIDxkaXYgaWQ9ImNvbG9ybWFwLXNlbGVjdGlvbi1sYWJlbCI+Q29sb3JtYXA6PC9kaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfY29sb3JtYXB9fSIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9IjAiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5tYWdtYTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+aW5mZXJubzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+cGxhc21hPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT52aXJpZGlzPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5ncmF5c2NhbGU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDM+VXBkYXRlcyBwZXIgc2Vjb25kOiB7e19GUFN9fTwvaDM+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJGUFNTbGlkZXIiIHZhbHVlPSJ7e19GUFN9fSIgdHlwZT0ibnVtYmVyIiBzdGVwPSIxIiBtaW49IjAiIG1heD0iMzAiIHBpbj0idHJ1ZSIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgaWQ9InJlY29yZF9idXR0b24iIG9uLXRhcD0iX3RvZ2dsZVJlY29yZCIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIFtbX3JlY29yZFRleHRdXQogICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHAgY2xhc3M9ImRpc2NsYWltZXIiPgogICAgICAgICAgICBOb3RlOiBCZWhvbGRlciBjdXJyZW50bHkgb25seSB3b3JrcyB3ZWxsIG9uIGxvY2FsIGZpbGUgc3lzdGVtcy4KICAgICAgICAgIAogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzX2FjdGl2ZV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBCZWhvbGRlciBkYXRhIHdhcyBmb3VuZC48L2gzPgoKICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdXIgc2NyaXB0IGlzbid0IHJ1bm5pbmcuPC9saT4KICAgICAgICAgICAgICA8bGk+WW91IGFyZW4ndCBjYWxsaW5nIDxjb2RlPmJlaG9sZGVyLnVwZGF0ZSgpPC9jb2RlPi48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gdXNlIEJlaG9sZGVyLCBpbXBvcnQgYW5kIGluc3RhbnRpYXRlIHRoZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVyPC9jb2RlPiBjbGFzcywgYW5kIGNhbGwgaXRzCiAgICAgICAgICAgICAgPGNvZGU+dXBkYXRlPC9jb2RlPiBtZXRob2Qgd2l0aCBhIDxjb2RlPlNlc3Npb248L2NvZGU+IGFyZ3VtZW50CiAgICAgICAgICAgICAgYWZ0ZXIgZXZlcnkgdHJhaW4gc3RlcDoKICAgICAgICAgICAgCgogICAgICAgICAgICA8cHJlPmZyb20gdGVuc29yYm9hcmQucGx1Z2lucy5iZWhvbGRlciBpbXBvcnQgQmVob2xkZXIKYmVob2xkZXIgPSBCZWhvbGRlcihMT0dfRElSRUNUT1JZKQoKIyBpbnNpZGUgdHJhaW4gbG9vcApiZWhvbGRlci51cGRhdGUoCiAgc2Vzc2lvbj1zZXNzLAogIGFycmF5cz1saXN0X29mX25wX2FycmF5cywgICMgb3B0aW9uYWwgYXJndW1lbnQKICBmcmFtZT10d29fZGltZW5zaW9uYWxfbnBfYXJyYXksICAjIG9wdGlvbmFsIGFyZ3VtZW50Cik8L3ByZT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgdXNpbmcgPGNvZGU+dGYudHJhaW4uTW9uaXRvcmVkU2Vzc2lvbjwvY29kZT4sIHlvdSBjYW4gdXNlCiAgICAgICAgICAgICAgPGNvZGU+QmVob2xkZXJIb29rPC9jb2RlPjoKICAgICAgICAgICAgCgogICAgICAgICAgICA8cHJlPmZyb20gdGVuc29yYm9hcmQucGx1Z2lucy5iZWhvbGRlciBpbXBvcnQgQmVob2xkZXJIb29rCmJlaG9sZGVyX2hvb2sgPSBCZWhvbGRlckhvb2soTE9HX0RJUkVDVE9SWSkKd2l0aCBNb25pdG9yZWRTZXNzaW9uKC4uLiwgaG9va3M9W2JlaG9sZGVyX2hvb2tdKSBhcyBzZXNzOgogIHNlc3MucnVuKHRyYWluX29wKTwvcHJlPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIGV2ZXJ5dGhpbmcgaXMgc2V0IHVwIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvdGVuc29yYm9hcmQvcGx1Z2lucy9iZWhvbGRlci9SRUFETUUubWQiPnRoZSBSRUFETUU8L2E+CiAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHAgY2xhc3M9ImRpc2NsYWltZXIiPgogICAgICAgICAgICAgIE5vdGU6IEJlaG9sZGVyIGN1cnJlbnRseSBvbmx5IHdvcmtzIHdlbGwgb24gbG9jYWwgZmlsZSBzeXN0ZW1zLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNfYWN0aXZlXV0iPgogICAgICAgICAgPHRmLWJlaG9sZGVyLXZpZGVvIGlkPSJ2aWRlbyIgZnBzPSJbW19GUFNdXSI+PC90Zi1iZWhvbGRlci12aWRlbz4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3ZhbHVlc05vdEZyYW1lKF92YWx1ZXMpXV0iPgogICAgICAgICAgICA8dGYtYmVob2xkZXItaW5mbyBpZD0iaW5mbyIgZnBzPSJbW19GUFNdXSI+IDwvdGYtYmVob2xkZXItaW5mbz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAuY2VudGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBwYWRkaW5nOiA1cHg7CgogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLXJhZGlvLWNvbnRhaW5lcjogewogICAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgfQoKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgZmxleC1ncm93OiAyOwogICAgICB9CgogICAgICBwcmUgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uI3JlY29yZF9idXR0b24gewogICAgICAgIGNvbG9yOiAjZDMyZjJmOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24jcmVjb3JkX2J1dHRvbi5pcy1yZWNvcmRpbmcgewogICAgICAgIGJhY2tncm91bmQ6ICNkMzJmMmY7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uLmJlaG9sZGVyLWRhc2hib2FyZDpsYXN0LWNoaWxkIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KCiAgICAgICNjb2xvcm1hcC1zZWxlY3Rpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICAjY29sb3JtYXAtc2VsZWN0aW9uLWxhYmVsIHsKICAgICAgICBtYXJnaW4tdG9wOiAxM3B4OwogICAgICB9CgogICAgICAjY29sb3JtYXAtc2VsZWN0aW9uIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KCiAgICAgIGg0IHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDVweCAwOwogICAgICB9CgogICAgICBwLmRpc2NsYWltZXIgewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQoKICAgICAgcC5jb250cm9scy1kaXNhYmxlZC1tZXNzYWdlIHsKICAgICAgICBjb2xvcjogI2MwMDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1iZWhvbGRlci1kYXNoYm9hcmQvdGYtYmVob2xkZXItZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLlJlcXVlc3RNYW5hZ2VyKDEwLDApfSxfaXNBdmFpbGFibGU6Qm9vbGVhbixfdmFsdWVzOnt0eXBlOlN0cmluZyx2YWx1ZToidHJhaW5hYmxlX3ZhcmlhYmxlcyIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJ2YXJpYW5jZSIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3NjYWxpbmc6e3R5cGU6U3RyaW5nLHZhbHVlOiJsYXllciIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3dpbmRvd1NpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjE1LG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9wcmV2aW91c0ZQUzp7dHlwZTpOdW1iZXIsdmFsdWU6MzB9LF9GUFM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LApfcmVjb3JkVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YXJ0IHJlY29yZGluZyJ9LF9pc1JlY29yZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zaG93QWxsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbG9ybWFwOnt0eXBlOlN0cmluZyx2YWx1ZToibWFnbWEiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9pc19hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfY29udHJvbHNfZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifX0sX3ZhbHVlc05vdEZyYW1lKGEpe3JldHVybiJmcmFtZXMiIT09YX0sX3ZhcmlhbmNlU2VsZWN0ZWQoYSl7cmV0dXJuInZhcmlhbmNlIj09PWF9LF9jb25maWdDaGFuZ2VkKCl7aWYodGhpcy5faXNfYWN0aXZlJiYhdGhpcy5fY29udHJvbHNfZGlzYWJsZWQpe3ZhciBhPQpbdGhpcy5fdmFsdWVzLHRoaXMuX21vZGUsdGhpcy5fc2NhbGluZyx0aGlzLl93aW5kb3dTaXplLHRoaXMuX0ZQUyx0aGlzLl9pc1JlY29yZGluZyx0aGlzLl9zaG93QWxsLHRoaXMuX2NvbG9ybWFwXSxjO2ZvcihjIG9mIGEpaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgY3x8IiI9PT1jKXJldHVybjthPVBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9jaGFuZ2UtY29uZmlnIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhLHt2YWx1ZXM6dGhpcy5fdmFsdWVzLG1vZGU6dGhpcy5fbW9kZSxzY2FsaW5nOnRoaXMuX3NjYWxpbmcsd2luZG93X3NpemU6dGhpcy5fd2luZG93U2l6ZSxGUFM6dGhpcy5fRlBTLGlzX3JlY29yZGluZzp0aGlzLl9pc1JlY29yZGluZyxzaG93X2FsbDp0aGlzLl9zaG93QWxsLGNvbG9ybWFwOnRoaXMuX2NvbG9ybWFwfSl9fSxfdG9nZ2xlUmVjb3JkKCl7InN0YXJ0IHJlY29yZGluZyI9PXRoaXMuX3JlY29yZFRleHQ/KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsCiJzdG9wIHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCEwKSk6KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsInN0YXJ0IHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCExKSk7dGhpcy4kLnJlY29yZF9idXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgiaXMtcmVjb3JkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChQay5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGE9PnsiYmVob2xkZXIiaW4gYT8odGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKSx0aGlzLnNldCgiX2lzQXZhaWxhYmxlIiwhMCkpOih0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuTm9UZW5zb3JGbG93RGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITEpKX0pfSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2lzQXZhaWxhYmxlKXtjb25zdCBhPVBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsCiIvaXMtYWN0aXZlIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9Pnt0aGlzLnNldCgiX2lzX2FjdGl2ZSIsYy5pc19hY3RpdmUpO3RoaXMuc2V0KCJfY29udHJvbHNfZGlzYWJsZWQiLCFjLmlzX2NvbmZpZ193cml0YWJsZSl9KX19fSk7JGwucmVnaXN0ZXJEYXNoYm9hcmQoe3BsdWdpbjoiYmVob2xkZXIiLGVsZW1lbnROYW1lOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHNob3VsZFJlbW92ZURvbTohMH0pfSkoKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0iYXYiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9ImFkZC10by1xdWV1ZSI+PHBhdGggZD0iTTIxIDNIM2MtMS4xMSAwLTIgLjg5LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg1djJoOHYtMmg1YzEuMSAwIDEuOTktLjkgMS45OS0yTDIzIDVjMC0xLjExLS45LTItMi0yem0wIDE0SDNWNWgxOHYxMnptLTUtN3YyaC0zdjNoLTJ2LTNIOHYtMmgzVjdoMnYzaDN6IiAvPjwvZz4KPGcgaWQ9ImFpcnBsYXkiPjxwYXRoIGQ9Ik02IDIyaDEybC02LTZ6TTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg0di0ySDNWNWgxOHYxMmgtNHYyaDRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iYWxidW0iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE0LjVjLTIuNDkgMC00LjUtMi4wMS00LjUtNC41UzkuNTEgNy41IDEyIDcuNXM0LjUgMi4wMSA0LjUgNC41LTIuMDEgNC41LTQuNSA0LjV6bTAtNS41Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9ImFydC10cmFjayI+PHBhdGggZD0iTTIyIDEzaC04di0yaDh2MnptMC02aC04djJoOFY3em0tOCAxMGg4di0yaC04djJ6bS0yLTh2NmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY5YzAtMS4xLjktMiAyLTJoNmMxLjEgMCAyIC45IDIgMnptLTEuNSA2bC0yLjI1LTMtMS43NSAyLjI2LTEuMjUtMS41MUwzLjUgMTVoN3oiIC8+PC9nPgo8ZyBpZD0iYXYtdGltZXIiPjxwYXRoIGQ9Ik0xMSAxN2MwIC41NS40NSAxIDEgMXMxLS40NSAxLTEtLjQ1LTEtMS0xLTEgLjQ1LTEgMXptMC0xNHY0aDJWNS4wOGMzLjM5LjQ5IDYgMy4zOSA2IDYuOTIgMCAzLjg3LTMuMTMgNy03IDdzLTctMy4xMy03LTdjMC0xLjY4LjU5LTMuMjIgMS41OC00LjQyTDEyIDEzbDEuNDEtMS40MS02LjgtNi44di4wMkM0LjQyIDYuNDUgMyA5LjA1IDMgMTJjMCA0Ljk3IDQuMDIgOSA5IDkgNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTloLTF6bTcgOWMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMSAuNDUgMSAxIDEgMS0uNDUgMS0xek02IDEyYzAgLjU1LjQ1IDEgMSAxczEtLjQ1IDEtMS0uNDUtMS0xLTEtMSAuNDUtMSAxeiIgLz48L2c+CjxnIGlkPSJicmFuZGluZy13YXRlcm1hcmsiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNmgtOXYtNmg5djZ6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtdG8tYWN0aW9uIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZIM3YtM2gxOHYzeiIgLz48L2c+CjxnIGlkPSJjbG9zZWQtY2FwdGlvbiI+PHBhdGggZD0iTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bS04IDdIOS41di0uNWgtMnYzaDJWMTNIMTF2MWMwIC41NS0uNDUgMS0xIDFIN2MtLjU1IDAtMS0uNDUtMS0xdi00YzAtLjU1LjQ1LTEgMS0xaDNjLjU1IDAgMSAuNDUgMSAxdjF6bTcgMGgtMS41di0uNWgtMnYzaDJWMTNIMTh2MWMwIC41NS0uNDUgMS0xIDFoLTNjLS41NSAwLTEtLjQ1LTEtMXYtNGMwLS41NS40NS0xIDEtMWgzYy41NSAwIDEgLjQ1IDEgMXYxeiIgLz48L2c+CjxnIGlkPSJlcXVhbGl6ZXIiPjxwYXRoIGQ9Ik0xMCAyMGg0VjRoLTR2MTZ6bS02IDBoNHYtOEg0djh6TTE2IDl2MTFoNFY5aC00eiIgLz48L2c+CjxnIGlkPSJleHBsaWNpdCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNCA2aC00djJoNHYyaC00djJoNHYySDlWN2g2djJ6IiAvPjwvZz4KPGcgaWQ9ImZhc3QtZm9yd2FyZCI+PHBhdGggZD0iTTQgMThsOC41LTZMNCA2djEyem05LTEydjEybDguNS02TDEzIDZ6IiAvPjwvZz4KPGcgaWQ9ImZhc3QtcmV3aW5kIj48cGF0aCBkPSJNMTEgMThWNmwtOC41IDYgOC41IDZ6bS41LTZsOC41IDZWNmwtOC41IDZ6IiAvPjwvZz4KPGcgaWQ9ImZlYXR1cmVkLXBsYXktbGlzdCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOSA4SDNWOWg5djJ6bTAtNEgzVjVoOXYyeiIgLz48L2c+CjxnIGlkPSJmZWF0dXJlZC12aWRlbyI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOSA5SDNWNWg5djd6IiAvPjwvZz4KPGcgaWQ9ImZpYmVyLWR2ciI+PHBhdGggZD0iTTE3LjUgMTAuNWgydjFoLTJ6bS0xMyAwaDJ2M2gtMnpNMjEgM0gzYy0xLjExIDAtMiAuODktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE4YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xMS0uODktMi0yLTJ6TTggMTMuNWMwIC44NS0uNjUgMS41LTEuNSAxLjVIM1Y5aDMuNWMuODUgMCAxLjUuNjUgMS41IDEuNXYzem00LjYyIDEuNWgtMS41TDkuMzcgOWgxLjVsMSAzLjQzIDEtMy40M2gxLjVsLTEuNzUgNnpNMjEgMTEuNWMwIC42LS40IDEuMTUtLjkgMS40TDIxIDE1aC0xLjVsLS44NS0ySDE3LjV2MkgxNlY5aDMuNWMuODUgMCAxLjUuNjUgMS41IDEuNXYxeiIgLz48L2c+CjxnIGlkPSJmaWJlci1tYW51YWwtcmVjb3JkIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4IiAvPjwvZz4KPGcgaWQ9ImZpYmVyLW5ldyI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yek04LjUgMTVINy4zbC0yLjU1LTMuNVYxNUgzLjVWOWgxLjI1bDIuNSAzLjVWOUg4LjV2NnptNS00Ljc0SDExdjEuMTJoMi41djEuMjZIMTF2MS4xMWgyLjVWMTVoLTRWOWg0djEuMjZ6bTcgMy43NGMwIC41NS0uNDUgMS0xIDFoLTRjLS41NSAwLTEtLjQ1LTEtMVY5aDEuMjV2NC41MWgxLjEzVjkuOTloMS4yNXYzLjUxaDEuMTJWOWgxLjI1djV6IiAvPjwvZz4KPGcgaWQ9ImZpYmVyLXBpbiI+PHBhdGggZD0iTTUuNSAxMC41aDJ2MWgtMnpNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6TTkgMTEuNWMwIC44NS0uNjUgMS41LTEuNSAxLjVoLTJ2Mkg0VjloMy41Yy44NSAwIDEuNS42NSAxLjUgMS41djF6bTMuNSAzLjVIMTFWOWgxLjV2NnptNy41IDBoLTEuMmwtMi41NS0zLjVWMTVIMTVWOWgxLjI1bDIuNSAzLjVWOUgyMHY2eiIgLz48L2c+CjxnIGlkPSJmaWJlci1zbWFydC1yZWNvcmQiPjxnPjxjaXJjbGUgY3g9IjkiIGN5PSIxMiIgcj0iOCIgLz48cGF0aCBkPSJNMTcgNC4yNnYyLjA5YzIuMzMuODIgNCAzLjA0IDQgNS42NXMtMS42NyA0LjgzLTQgNS42NXYyLjA5YzMuNDUtLjg5IDYtNC4wMSA2LTcuNzRzLTIuNTUtNi44NS02LTcuNzR6IiAvPjwvZz48L2c+CjxnIGlkPSJmb3J3YXJkLTEwIj48cGF0aCBkPSJNNCAxM2MwIDQuNCAzLjYgOCA4IDhzOC0zLjYgOC04aC0yYzAgMy4zLTIuNyA2LTYgNnMtNi0yLjctNi02IDIuNy02IDYtNnY0bDUtNS01LTV2NGMtNC40IDAtOCAzLjYtOCA4em02LjggM0gxMHYtMy4zTDkgMTN2LS43bDEuOC0uNmguMVYxNnptNC4zLTEuOGMwIC4zIDAgLjYtLjEuOGwtLjMuNnMtLjMuMy0uNS4zLS40LjEtLjYuMS0uNCAwLS42LS4xLS4zLS4yLS41LS4zLS4yLS4zLS4zLS42LS4xLS41LS4xLS44di0uN2MwLS4zIDAtLjYuMS0uOGwuMy0uNnMuMy0uMy41LS4zLjQtLjEuNi0uMS40IDAgLjYuMS4zLjIuNS4zLjIuMy4zLjYuMS41LjEuOHYuN3ptLS44LS44di0uNXMtLjEtLjItLjEtLjMtLjEtLjEtLjItLjItLjItLjEtLjMtLjEtLjIgMC0uMy4xbC0uMi4ycy0uMS4yLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLS4xbC4yLS4ycy4xLS4yLjEtLjN2LTEuNXoiIC8+PC9nPgo8ZyBpZD0iZm9yd2FyZC0zMCI+PHBhdGggZD0iTTkuNiAxMy41aC40Yy4yIDAgLjQtLjEuNS0uMnMuMi0uMi4yLS40di0uMnMtLjEtLjEtLjEtLjItLjEtLjEtLjItLjFoLS41cy0uMS4xLS4yLjEtLjEuMS0uMS4ydi4yaC0xYzAtLjIgMC0uMy4xLS41cy4yLS4zLjMtLjQuMy0uMi40LS4yLjQtLjEuNS0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjItLjEuMy0uMS4yLS4yLjItLjIuMS0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQtLjEuNXMtLjIuMy0uMy40LS4zLjItLjUuMi0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjQtLjEtLjZoLjh2LjJzLjEuMS4xLjIuMS4xLjIuMWguNXMuMS0uMS4yLS4xLjEtLjEuMS0uMnYtLjVzLS4xLS4xLS4xLS4yLS4xLS4xLS4yLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNi0uMS44bC0uMy42cy0uMy4zLS41LjMtLjQuMS0uNi4xLS40IDAtLjYtLjEtLjMtLjItLjUtLjMtLjItLjMtLjMtLjYtLjEtLjUtLjEtLjh2LS43YzAtLjMgMC0uNi4xLS44bC4zLS42cy4zLS4zLjUtLjMuNC0uMS42LS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjktLjh2LS41cy0uMS0uMi0uMS0uMy0uMS0uMS0uMi0uMi0uMi0uMS0uMy0uMS0uMiAwLS4zLjFsLS4yLjJzLS4xLjItLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMtLjFsLjItLjJzLjEtLjIuMS0uM3YtMS41ek00IDEzYzAgNC40IDMuNiA4IDggOHM4LTMuNiA4LThoLTJjMCAzLjMtMi43IDYtNiA2cy02LTIuNy02LTYgMi43LTYgNi02djRsNS01LTUtNXY0Yy00LjQgMC04IDMuNi04IDh6IiAvPjwvZz4KPGcgaWQ9ImZvcndhcmQtNSI+PHBhdGggZD0iTTQgMTNjMCA0LjQgMy42IDggOCA4czgtMy42IDgtOGgtMmMwIDMuMy0yLjcgNi02IDZzLTYtMi43LTYtNiAyLjctNiA2LTZ2NGw1LTUtNS01djRjLTQuNCAwLTggMy42LTggOHptNi43LjlsLjItMi4yaDIuNHYuN2gtMS43bC0uMS45cy4xIDAgLjEtLjEuMSAwIC4xLS4xLjEgMCAuMiAwaC4yYy4yIDAgLjQgMCAuNS4xcy4zLjIuNC4zLjIuMy4zLjUuMS40LjEuNmMwIC4yIDAgLjQtLjEuNXMtLjEuMy0uMy41LS4zLjItLjUuMy0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjMtLjEtLjVoLjhjMCAuMi4xLjMuMi40cy4yLjEuNC4xYy4xIDAgLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0uNmwtLjEtLjItLjItLjJzLS4yLS4xLS4zLS4xaC0uMnMtLjEgMC0uMi4xLS4xIDAtLjEuMS0uMS4xLS4xLjFoLS42eiIgLz48L2c+CjxnIGlkPSJnYW1lcyI+PHBhdGggZD0iTTE1IDcuNVYySDl2NS41bDMgMyAzLTN6TTcuNSA5SDJ2Nmg1LjVsMy0zLTMtM3pNOSAxNi41VjIyaDZ2LTUuNWwtMy0zLTMgM3pNMTYuNSA5bC0zIDMgMyAzSDIyVjloLTUuNXoiIC8+PC9nPgo8ZyBpZD0iaGQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOCAxMkg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptMi02aDRjLjU1IDAgMSAuNDUgMSAxdjRjMCAuNTUtLjQ1IDEtMSAxaC00Vjl6bTEuNSA0LjVoMnYtM2gtMnYzeiIgLz48L2c+CjxnIGlkPSJoZWFyaW5nIj48cGF0aCBkPSJNMTcgMjBjLS4yOSAwLS41Ni0uMDYtLjc2LS4xNS0uNzEtLjM3LTEuMjEtLjg4LTEuNzEtMi4zOC0uNTEtMS41Ni0xLjQ3LTIuMjktMi4zOS0zLS43OS0uNjEtMS42MS0xLjI0LTIuMzItMi41M0M5LjI5IDEwLjk4IDkgOS45MyA5IDljMC0yLjggMi4yLTUgNS01czUgMi4yIDUgNWgyYzAtMy45My0zLjA3LTctNy03UzcgNS4wNyA3IDljMCAxLjI2LjM4IDIuNjUgMS4wNyAzLjkuOTEgMS42NSAxLjk4IDIuNDggMi44NSAzLjE1LjgxLjYyIDEuMzkgMS4wNyAxLjcxIDIuMDUuNiAxLjgyIDEuMzcgMi44NCAyLjczIDMuNTUuNTEuMjMgMS4wNy4zNSAxLjY0LjM1IDIuMjEgMCA0LTEuNzkgNC00aC0yYzAgMS4xLS45IDItMiAyek03LjY0IDIuNjRMNi4yMiAxLjIyQzQuMjMgMy4yMSAzIDUuOTYgMyA5czEuMjMgNS43OSAzLjIyIDcuNzhsMS40MS0xLjQxQzYuMDEgMTMuNzQgNSAxMS40OSA1IDlzMS4wMS00Ljc0IDIuNjQtNi4zNnpNMTEuNSA5YzAgMS4zOCAxLjEyIDIuNSAyLjUgMi41czIuNS0xLjEyIDIuNS0yLjUtMS4xMi0yLjUtMi41LTIuNS0yLjUgMS4xMi0yLjUgMi41eiIgLz48L2c+CjxnIGlkPSJoaWdoLXF1YWxpdHkiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tOCAxMUg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptNy0xYzAgLjU1LS40NSAxLTEgMWgtLjc1djEuNWgtMS41VjE1SDE0Yy0uNTUgMC0xLS40NS0xLTF2LTRjMC0uNTUuNDUtMSAxLTFoM2MuNTUgMCAxIC40NSAxIDF2NHptLTMuNS0uNWgydi0zaC0ydjN6IiAvPjwvZz4KPGcgaWQ9ImxpYnJhcnktYWRkIj48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMSA5aC00djRoLTJ2LTRIOVY5aDRWNWgydjRoNHYyeiIgLz48L2c+CjxnIGlkPSJsaWJyYXJ5LWJvb2tzIj48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMSA5SDlWOWgxMHYyem0tNCA0SDl2LTJoNnYyem00LThIOVY1aDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImxpYnJhcnktbXVzaWMiPjxwYXRoIGQ9Ik0yMCAySDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTIgNWgtM3Y1LjVjMCAxLjM4LTEuMTIgMi41LTIuNSAyLjVTMTAgMTMuODggMTAgMTIuNXMxLjEyLTIuNSAyLjUtMi41Yy41NyAwIDEuMDguMTkgMS41LjUxVjVoNHYyek00IDZIMnYxNGMwIDEuMS45IDIgMiAyaDE0di0ySDRWNnoiIC8+PC9nPgo8ZyBpZD0ibG9vcCI+PHBhdGggZD0iTTEyIDRWMUw4IDVsNCA0VjZjMy4zMSAwIDYgMi42OSA2IDYgMCAxLjAxLS4yNSAxLjk3LS43IDIuOGwxLjQ2IDEuNDZDMTkuNTQgMTUuMDMgMjAgMTMuNTcgMjAgMTJjMC00LjQyLTMuNTgtOC04LTh6bTAgMTRjLTMuMzEgMC02LTIuNjktNi02IDAtMS4wMS4yNS0xLjk3LjctMi44TDUuMjQgNy43NEM0LjQ2IDguOTcgNCAxMC40MyA0IDEyYzAgNC40MiAzLjU4IDggOCA4djNsNC00LTQtNHYzeiIgLz48L2c+CjxnIGlkPSJtaWMiPjxwYXRoIGQ9Ik0xMiAxNGMxLjY2IDAgMi45OS0xLjM0IDIuOTktM0wxNSA1YzAtMS42Ni0xLjM0LTMtMy0zUzkgMy4zNCA5IDV2NmMwIDEuNjYgMS4zNCAzIDMgM3ptNS4zLTNjMCAzLTIuNTQgNS4xLTUuMyA1LjFTNi43IDE0IDYuNyAxMUg1YzAgMy40MSAyLjcyIDYuMjMgNiA2LjcyVjIxaDJ2LTMuMjhjMy4yOC0uNDggNi0zLjMgNi02LjcyaC0xLjd6IiAvPjwvZz4KPGcgaWQ9Im1pYy1ub25lIj48cGF0aCBkPSJNMTIgMTRjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNWMwLTEuNjYtMS4zNC0zLTMtM1M5IDMuMzQgOSA1djZjMCAxLjY2IDEuMzQgMyAzIDN6bS0xLjItOS4xYzAtLjY2LjU0LTEuMiAxLjItMS4yLjY2IDAgMS4yLjU0IDEuMiAxLjJsLS4wMSA2LjJjMCAuNjYtLjUzIDEuMi0xLjE5IDEuMi0uNjYgMC0xLjItLjU0LTEuMi0xLjJWNC45em02LjUgNi4xYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNCA2LjcgMTFINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMWgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIgLz48L2c+CjxnIGlkPSJtaWMtb2ZmIj48cGF0aCBkPSJNMTkgMTFoLTEuN2MwIC43NC0uMTYgMS40My0uNDMgMi4wNWwxLjIzIDEuMjNjLjU2LS45OC45LTIuMDkuOS0zLjI4em0tNC4wMi4xN2MwLS4wNi4wMi0uMTEuMDItLjE3VjVjMC0xLjY2LTEuMzQtMy0zLTNTOSAzLjM0IDkgNXYuMThsNS45OCA1Ljk5ek00LjI3IDNMMyA0LjI3bDYuMDEgNi4wMVYxMWMwIDEuNjYgMS4zMyAzIDIuOTkgMyAuMjIgMCAuNDQtLjAzLjY1LS4wOGwxLjY2IDEuNjZjLS43MS4zMy0xLjUuNTItMi4zMS41Mi0yLjc2IDAtNS4zLTIuMS01LjMtNS4xSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjFoMnYtMy4yOGMuOTEtLjEzIDEuNzctLjQ1IDIuNTQtLjlMMTkuNzMgMjEgMjEgMTkuNzMgNC4yNyAzeiIgLz48L2c+CjxnIGlkPSJtb3ZpZSI+PHBhdGggZD0iTTE4IDRsMiA0aC0zbC0yLTRoLTJsMiA0aC0zbC0yLTRIOGwyIDRIN0w1IDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGgtNHoiIC8+PC9nPgo8ZyBpZD0ibXVzaWMtdmlkZW8iPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkgzVjVoMTh2MTR6TTggMTVjMC0xLjY2IDEuMzQtMyAzLTMgLjM1IDAgLjY5LjA3IDEgLjE4VjZoNXYyaC0zdjcuMDNjLS4wMiAxLjY0LTEuMzUgMi45Ny0zIDIuOTctMS42NiAwLTMtMS4zNC0zLTN6IiAvPjwvZz4KPGcgaWQ9Im5ldy1yZWxlYXNlcyI+PHBhdGggZD0iTTIzIDEybC0yLjQ0LTIuNzguMzQtMy42OC0zLjYxLS44Mi0xLjg5LTMuMThMMTIgMyA4LjYgMS41NCA2LjcxIDQuNzJsLTMuNjEuODEuMzQgMy42OEwxIDEybDIuNDQgMi43OC0uMzQgMy42OSAzLjYxLjgyIDEuODkgMy4xOEwxMiAyMWwzLjQgMS40NiAxLjg5LTMuMTggMy42MS0uODItLjM0LTMuNjhMMjMgMTJ6bS0xMCA1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJub3QtaW50ZXJlc3RlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04IDAtMS44NS42My0zLjU1IDEuNjktNC45TDE2LjkgMTguMzFDMTUuNTUgMTkuMzcgMTMuODUgMjAgMTIgMjB6bTYuMzEtMy4xTDcuMSA1LjY5QzguNDUgNC42MyAxMC4xNSA0IDEyIDRjNC40MiAwIDggMy41OCA4IDggMCAxLjg1LS42MyAzLjU1LTEuNjkgNC45eiIgLz48L2c+CjxnIGlkPSJub3RlIj48cGF0aCBkPSJNMjIgMTBsLTYtNkg0Yy0xLjEgMC0yIC45LTIgMnYxMi4wMWMwIDEuMS45IDEuOTkgMiAxLjk5bDE2LS4wMWMxLjEgMCAyLS44OSAyLTEuOTl2LTh6bS03LTQuNWw1LjUgNS41SDE1VjUuNXoiIC8+PC9nPgo8ZyBpZD0icGF1c2UiPjxwYXRoIGQ9Ik02IDE5aDRWNUg2djE0em04LTE0djE0aDRWNWgtNHoiIC8+PC9nPgo8ZyBpZD0icGF1c2UtY2lyY2xlLWZpbGxlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0xIDE0SDlWOGgydjh6bTQgMGgtMlY4aDJ2OHoiIC8+PC9nPgo8ZyBpZD0icGF1c2UtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik05IDE2aDJWOEg5djh6bTMtMTRDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0xLTRoMlY4aC0ydjh6IiAvPjwvZz4KPGcgaWQ9InBsYXktYXJyb3ciPjxwYXRoIGQ9Ik04IDV2MTRsMTEtN3oiIC8+PC9nPgo8ZyBpZD0icGxheS1jaXJjbGUtZmlsbGVkIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptLTIgMTQuNXYtOWw2IDQuNS02IDQuNXoiIC8+PC9nPgo8ZyBpZD0icGxheS1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTEwIDE2LjVsNi00LjUtNi00LjV2OXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9InBsYXlsaXN0LWFkZCI+PHBhdGggZD0iTTE0IDEwSDJ2MmgxMnYtMnptMC00SDJ2MmgxMlY2em00IDh2LTRoLTJ2NGgtNHYyaDR2NGgydi00aDR2LTJoLTR6TTIgMTZoOHYtMkgydjJ6IiAvPjwvZz4KPGcgaWQ9InBsYXlsaXN0LWFkZC1jaGVjayI+PHBhdGggZD0iTTE0IDEwSDJ2MmgxMnYtMnptMC00SDJ2MmgxMlY2ek0yIDE2aDh2LTJIMnYyem0xOS41LTQuNUwyMyAxM2wtNi45OSA3LTQuNTEtNC41TDEzIDE0bDMuMDEgMyA1LjQ5LTUuNXoiIC8+PC9nPgo8ZyBpZD0icGxheWxpc3QtcGxheSI+PHBhdGggZD0iTTE5IDlIMnYyaDE3Vjl6bTAtNEgydjJoMTdWNXpNMiAxNWgxM3YtMkgydjJ6bTE1LTJ2Nmw1LTMtNS0zeiIgLz48L2c+CjxnIGlkPSJxdWV1ZSI+PHBhdGggZD0iTTQgNkgydjE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2em0xNi00SDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTEgOWgtNHY0aC0ydi00SDlWOWg0VjVoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0icXVldWUtbXVzaWMiPjxwYXRoIGQ9Ik0xNSA2SDN2MmgxMlY2em0wIDRIM3YyaDEydi0yek0zIDE2aDh2LTJIM3Yyek0xNyA2djguMThjLS4zMS0uMTEtLjY1LS4xOC0xLS4xOC0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTNWOGgzVjZoLTV6IiAvPjwvZz4KPGcgaWQ9InF1ZXVlLXBsYXktbmV4dCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xMSAwLTIgLjg5LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg1djJoOHYtMmgydi0ySDNWNWgxOHY4aDJWNWMwLTEuMTEtLjktMi0yLTJ6bS04IDdWN2gtMnYzSDh2MmgzdjNoMnYtM2gzdi0yaC0zem0xMSA4bC00LjUgNC41TDE4IDIxbDMtMy0zLTMgMS41LTEuNUwyNCAxOHoiIC8+PC9nPgo8ZyBpZD0icmFkaW8iPjxwYXRoIGQ9Ik0zLjI0IDYuMTVDMi41MSA2LjQzIDIgNy4xNyAyIDh2MTJjMCAxLjEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjkgMi0yVjhjMC0xLjExLS44OS0yLTItMkg4LjNsOC4yNi0zLjM0TDE1Ljg4IDEgMy4yNCA2LjE1ek03IDIwYy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMTMtOGgtMnYtMmgtMnYySDRWOGgxNnY0eiIgLz48L2c+CjxnIGlkPSJyZWNlbnQtYWN0b3JzIj48cGF0aCBkPSJNMjEgNXYxNGgyVjVoLTJ6bS00IDE0aDJWNWgtMnYxNHpNMTQgNUgyYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoMTJjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xek04IDcuNzVjMS4yNCAwIDIuMjUgMS4wMSAyLjI1IDIuMjVTOS4yNCAxMi4yNSA4IDEyLjI1IDUuNzUgMTEuMjQgNS43NSAxMCA2Ljc2IDcuNzUgOCA3Ljc1ek0xMi41IDE3aC05di0uNzVjMC0xLjUgMy0yLjI1IDQuNS0yLjI1czQuNS43NSA0LjUgMi4yNVYxN3oiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLWZyb20tcXVldWUiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMTEgMC0yIC44OS0yIDJ2MTJjMCAxLjEuODkgMiAyIDJoNXYyaDh2LTJoNWMxLjEgMCAxLjk5LS45IDEuOTktMkwyMyA1YzAtMS4xMS0uOS0yLTItMnptMCAxNEgzVjVoMTh2MTJ6bS01LTd2Mkg4di0yaDh6IiAvPjwvZz4KPGcgaWQ9InJlcGVhdCI+PHBhdGggZD0iTTcgN2gxMHYzbDQtNC00LTR2M0g1djZoMlY3em0xMCAxMEg3di0zbC00IDQgNCA0di0zaDEydi02aC0ydjR6IiAvPjwvZz4KPGcgaWQ9InJlcGVhdC1vbmUiPjxwYXRoIGQ9Ik03IDdoMTB2M2w0LTQtNC00djNINXY2aDJWN3ptMTAgMTBIN3YtM2wtNCA0IDQgNHYtM2gxMnYtNmgtMnY0em0tNC0yVjloLTFsLTIgMXYxaDEuNXY0SDEzeiIgLz48L2c+CjxnIGlkPSJyZXBsYXkiPjxwYXRoIGQ9Ik0xMiA1VjFMNyA2bDUgNVY3YzMuMzEgMCA2IDIuNjkgNiA2cy0yLjY5IDYtNiA2LTYtMi42OS02LTZINGMwIDQuNDIgMy41OCA4IDggOHM4LTMuNTggOC04LTMuNTgtOC04LTh6IiAvPjwvZz4KPGcgaWQ9InJlcGxheS0xMCI+PHBhdGggZD0iTTEyIDVWMUw3IDZsNSA1VjdjMy4zIDAgNiAyLjcgNiA2cy0yLjcgNi02IDYtNi0yLjctNi02SDRjMCA0LjQgMy42IDggOCA4czgtMy42IDgtOC0zLjYtOC04LTh6bS0xLjEgMTFIMTB2LTMuM0w5IDEzdi0uN2wxLjgtLjZoLjFWMTZ6bTQuMy0xLjhjMCAuMyAwIC42LS4xLjhsLS4zLjZzLS4zLjMtLjUuMy0uNC4xLS42LjEtLjQgMC0uNi0uMS0uMy0uMi0uNS0uMy0uMi0uMy0uMy0uNi0uMS0uNS0uMS0uOHYtLjdjMC0uMyAwLS42LjEtLjhsLjMtLjZzLjMtLjMuNS0uMy40LS4xLjYtLjEuNCAwIC42LjFjLjIuMS4zLjIuNS4zcy4yLjMuMy42LjEuNS4xLjh2Ljd6bS0uOS0uOHYtLjVzLS4xLS4yLS4xLS4zLS4xLS4xLS4yLS4yLS4yLS4xLS4zLS4xLS4yIDAtLjMuMWwtLjIuMnMtLjEuMi0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0xLjV6IiAvPjwvZz4KPGcgaWQ9InJlcGxheS0zMCI+PHBhdGggZD0iTTEyIDVWMUw3IDZsNSA1VjdjMy4zIDAgNiAyLjcgNiA2cy0yLjcgNi02IDYtNi0yLjctNi02SDRjMCA0LjQgMy42IDggOCA4czgtMy42IDgtOC0zLjYtOC04LTh6bS0yLjQgOC41aC40Yy4yIDAgLjQtLjEuNS0uMnMuMi0uMi4yLS40di0uMnMtLjEtLjEtLjEtLjItLjEtLjEtLjItLjFoLS41cy0uMS4xLS4yLjEtLjEuMS0uMS4ydi4yaC0xYzAtLjIgMC0uMy4xLS41cy4yLS4zLjMtLjQuMy0uMi40LS4yLjQtLjEuNS0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjItLjEuMy0uMS4yLS4yLjItLjIuMS0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQtLjEuNXMtLjIuMy0uMy40LS4zLjItLjUuMi0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjQtLjEtLjZoLjh2LjJzLjEuMS4xLjIuMS4xLjIuMWguNXMuMS0uMS4yLS4xLjEtLjEuMS0uMnYtLjVzLS4xLS4xLS4xLS4yLS4xLS4xLS4yLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNi0uMS44bC0uMy42cy0uMy4zLS41LjMtLjQuMS0uNi4xLS40IDAtLjYtLjEtLjMtLjItLjUtLjMtLjItLjMtLjMtLjYtLjEtLjUtLjEtLjh2LS43YzAtLjMgMC0uNi4xLS44bC4zLS42cy4zLS4zLjUtLjMuNC0uMS42LS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjgtLjh2LS41YzAtLjEtLjEtLjItLjEtLjNzLS4xLS4xLS4yLS4yLS4yLS4xLS4zLS4xLS4yIDAtLjMuMWwtLjIuMnMtLjEuMi0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0xLjV6IiAvPjwvZz4KPGcgaWQ9InJlcGxheS01Ij48cGF0aCBkPSJNMTIgNVYxTDcgNmw1IDVWN2MzLjMgMCA2IDIuNyA2IDZzLTIuNyA2LTYgNi02LTIuNy02LTZINGMwIDQuNCAzLjYgOCA4IDhzOC0zLjYgOC04LTMuNi04LTgtOHptLTEuMyA4LjlsLjItMi4yaDIuNHYuN2gtMS43bC0uMS45cy4xIDAgLjEtLjEuMSAwIC4xLS4xLjEgMCAuMiAwaC4yYy4yIDAgLjQgMCAuNS4xcy4zLjIuNC4zLjIuMy4zLjUuMS40LjEuNmMwIC4yIDAgLjQtLjEuNXMtLjEuMy0uMy41LS4zLjItLjQuMy0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjMtLjEtLjVoLjhjMCAuMi4xLjMuMi40cy4yLjEuNC4xYy4xIDAgLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0uNmwtLjEtLjItLjItLjJzLS4yLS4xLS4zLS4xaC0uMnMtLjEgMC0uMi4xLS4xIDAtLjEuMS0uMS4xLS4xLjFoLS43eiIgLz48L2c+CjxnIGlkPSJzaHVmZmxlIj48cGF0aCBkPSJNMTAuNTkgOS4xN0w1LjQxIDQgNCA1LjQxbDUuMTcgNS4xNyAxLjQyLTEuNDF6TTE0LjUgNGwyLjA0IDIuMDRMNCAxOC41OSA1LjQxIDIwIDE3Ljk2IDcuNDYgMjAgOS41VjRoLTUuNXptLjMzIDkuNDFsLTEuNDEgMS40MSAzLjEzIDMuMTNMMTQuNSAyMEgyMHYtNS41bC0yLjA0IDIuMDQtMy4xMy0zLjEzeiIgLz48L2c+CjxnIGlkPSJza2lwLW5leHQiPjxwYXRoIGQ9Ik02IDE4bDguNS02TDYgNnYxMnpNMTYgNnYxMmgyVjZoLTJ6IiAvPjwvZz4KPGcgaWQ9InNraXAtcHJldmlvdXMiPjxwYXRoIGQ9Ik02IDZoMnYxMkg2em0zLjUgNmw4LjUgNlY2eiIgLz48L2c+CjxnIGlkPSJzbG93LW1vdGlvbi12aWRlbyI+PHBhdGggZD0iTTEzLjA1IDkuNzlMMTAgNy41djlsMy4wNS0yLjI5TDE2IDEyem0wIDBMMTAgNy41djlsMy4wNS0yLjI5TDE2IDEyem0wIDBMMTAgNy41djlsMy4wNS0yLjI5TDE2IDEyek0xMSA0LjA3VjIuMDVjLTIuMDEuMi0zLjg0IDEtNS4zMiAyLjIxTDcuMSA1LjY5YzEuMTEtLjg2IDIuNDQtMS40NCAzLjktMS42MnpNNS42OSA3LjFMNC4yNiA1LjY4QzMuMDUgNy4xNiAyLjI1IDguOTkgMi4wNSAxMWgyLjAyYy4xOC0xLjQ2Ljc2LTIuNzkgMS42Mi0zLjl6TTQuMDcgMTNIMi4wNWMuMiAyLjAxIDEgMy44NCAyLjIxIDUuMzJsMS40My0xLjQzYy0uODYtMS4xLTEuNDQtMi40My0xLjYyLTMuODl6bTEuNjEgNi43NEM3LjE2IDIwLjk1IDkgMjEuNzUgMTEgMjEuOTV2LTIuMDJjLTEuNDYtLjE4LTIuNzktLjc2LTMuOS0xLjYybC0xLjQyIDEuNDN6TTIyIDEyYzAgNS4xNi0zLjkyIDkuNDItOC45NSA5Ljk1di0yLjAyQzE2Ljk3IDE5LjQxIDIwIDE2LjA1IDIwIDEycy0zLjAzLTcuNDEtNi45NS03LjkzVjIuMDVDMTguMDggMi41OCAyMiA2Ljg0IDIyIDEyeiIgLz48L2c+CjxnIGlkPSJzbm9vemUiPjxwYXRoIGQ9Ik03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptLTMtOWgzLjYzTDkgMTUuMlYxN2g2di0yaC0zLjYzTDE1IDEwLjhWOUg5djJ6IiAvPjwvZz4KPGcgaWQ9InNvcnQtYnktYWxwaGEiPjxwYXRoIGQ9Ik0xNC45NCA0LjY2aC00LjcybDIuMzYtMi4zNnptLTQuNjkgMTQuNzFoNC42NmwtMi4zMyAyLjMzek02LjEgNi4yN0wxLjYgMTcuNzNoMS44NGwuOTItMi40NWg1LjExbC45MiAyLjQ1aDEuODRMNy43NCA2LjI3SDYuMXptLTEuMTMgNy4zN2wxLjk0LTUuMTggMS45NCA1LjE4SDQuOTd6bTEwLjc2IDIuNWg2LjEydjEuNTloLTguNTN2LTEuMjlsNS45Mi04LjU2aC01Ljg4di0xLjZoOC4zdjEuMjZsLTUuOTMgOC42eiIgLz48L2c+CjxnIGlkPSJzdG9wIj48cGF0aCBkPSJNNiA2aDEydjEySDZ6IiAvPjwvZz4KPGcgaWQ9InN1YnNjcmlwdGlvbnMiPjxwYXRoIGQ9Ik0yMCA4SDRWNmgxNnYyem0tMi02SDZ2MmgxMlYyem00IDEwdjhjMCAxLjEtLjkgMi0yIDJINGMtMS4xIDAtMi0uOS0yLTJ2LThjMC0xLjEuOS0yIDItMmgxNmMxLjEgMCAyIC45IDIgMnptLTYgNGwtNi0zLjI3djYuNTNMMTYgMTZ6IiAvPjwvZz4KPGcgaWQ9InN1YnRpdGxlcyI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yek00IDEyaDR2Mkg0di0yem0xMCA2SDR2LTJoMTB2MnptNiAwaC00di0yaDR2MnptMC00SDEwdi0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InN1cnJvdW5kLXNvdW5kIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6TTcuNzYgMTYuMjRsLTEuNDEgMS40MUM0Ljc4IDE2LjEgNCAxNC4wNSA0IDEyYzAtMi4wNS43OC00LjEgMi4zNC01LjY2bDEuNDEgMS40MUM2LjU5IDguOTMgNiAxMC40NiA2IDEycy41OSAzLjA3IDEuNzYgNC4yNHpNMTIgMTZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTQgNCAxLjc5IDQgNC0xLjc5IDQtNCA0em01LjY2IDEuNjZsLTEuNDEtMS40MUMxNy40MSAxNS4wNyAxOCAxMy41NCAxOCAxMnMtLjU5LTMuMDctMS43Ni00LjI0bDEuNDEtMS40MUMxOS4yMiA3LjkgMjAgOS45NSAyMCAxMmMwIDIuMDUtLjc4IDQuMS0yLjM0IDUuNjZ6TTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0idmlkZW8tY2FsbCI+PHBhdGggZD0iTTE3IDEwLjVWN2MwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDEyYy41NSAwIDEtLjQ1IDEtMXYtMy41bDQgNHYtMTFsLTQgNHpNMTQgMTNoLTN2M0g5di0zSDZ2LTJoM1Y4aDJ2M2gzdjJ6IiAvPjwvZz4KPGcgaWQ9InZpZGVvLWxhYmVsIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTNIM1Y1aDE4djExeiIgLz48L2c+CjxnIGlkPSJ2aWRlby1saWJyYXJ5Ij48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tOCAxMi41di05bDYgNC41LTYgNC41eiIgLz48L2c+CjxnIGlkPSJ2aWRlb2NhbSI+PHBhdGggZD0iTTE3IDEwLjVWN2MwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDEyYy41NSAwIDEtLjQ1IDEtMXYtMy41bDQgNHYtMTFsLTQgNHoiIC8+PC9nPgo8ZyBpZD0idmlkZW9jYW0tb2ZmIj48cGF0aCBkPSJNMjEgNi41bC00IDRWN2MwLS41NS0uNDUtMS0xLTFIOS44MkwyMSAxNy4xOFY2LjV6TTMuMjcgMkwyIDMuMjcgNC43MyA2SDRjLS41NSAwLTEgLjQ1LTEgMXYxMGMwIC41NS40NSAxIDEgMWgxMmMuMjEgMCAuMzktLjA4LjU0LS4xOEwxOS43MyAyMSAyMSAxOS43MyAzLjI3IDJ6IiAvPjwvZz4KPGcgaWQ9InZvbHVtZS1kb3duIj48cGF0aCBkPSJNMTguNSAxMmMwLTEuNzctMS4wMi0zLjI5LTIuNS00LjAzdjguMDVjMS40OC0uNzMgMi41LTIuMjUgMi41LTQuMDJ6TTUgOXY2aDRsNSA1VjRMOSA5SDV6IiAvPjwvZz4KPGcgaWQ9InZvbHVtZS1tdXRlIj48cGF0aCBkPSJNNyA5djZoNGw1IDVWNGwtNSA1SDd6IiAvPjwvZz4KPGcgaWQ9InZvbHVtZS1vZmYiPjxwYXRoIGQ9Ik0xNi41IDEyYzAtMS43Ny0xLjAyLTMuMjktMi41LTQuMDN2Mi4yMWwyLjQ1IDIuNDVjLjAzLS4yLjA1LS40MS4wNS0uNjN6bTIuNSAwYzAgLjk0LS4yIDEuODItLjU0IDIuNjRsMS41MSAxLjUxQzIwLjYzIDE0LjkxIDIxIDEzLjUgMjEgMTJjMC00LjI4LTIuOTktNy44Ni03LTguNzd2Mi4wNmMyLjg5Ljg2IDUgMy41NCA1IDYuNzF6TTQuMjcgM0wzIDQuMjcgNy43MyA5SDN2Nmg0bDUgNXYtNi43M2w0LjI1IDQuMjVjLS42Ny41Mi0xLjQyLjkzLTIuMjUgMS4xOHYyLjA2YzEuMzgtLjMxIDIuNjMtLjk1IDMuNjktMS44MUwxOS43MyAyMSAyMSAxOS43M2wtOS05TDQuMjcgM3pNMTIgNEw5LjkxIDYuMDkgMTIgOC4xOFY0eiIgLz48L2c+CjxnIGlkPSJ2b2x1bWUtdXAiPjxwYXRoIGQ9Ik0zIDl2Nmg0bDUgNVY0TDcgOUgzem0xMy41IDNjMC0xLjc3LTEuMDItMy4yOS0yLjUtNC4wM3Y4LjA1YzEuNDgtLjczIDIuNS0yLjI1IDIuNS00LjAyek0xNCAzLjIzdjIuMDZjMi44OS44NiA1IDMuNTQgNSA2Ljcxcy0yLjExIDUuODUtNSA2LjcxdjIuMDZjNC4wMS0uOTEgNy00LjQ5IDctOC43N3MtMi45OS03Ljg2LTctOC43N3oiIC8+PC9nPgo8ZyBpZD0id2ViIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tNSAxNEg0di00aDExdjR6bTAtNUg0VjloMTF2NHptNSA1aC00VjloNHY5eiIgLz48L2c+CjxnIGlkPSJ3ZWItYXNzZXQiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptMCAxNEg1VjhoMTR2MTB6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxpcm9uLWljb25zZXQtc3ZnIG5hbWU9ImNvbW11bmljYXRpb24iIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9ImJ1c2luZXNzIj48cGF0aCBkPSJNMTIgN1YzSDJ2MThoMjBWN0gxMnpNNiAxOUg0di0yaDJ2MnptMC00SDR2LTJoMnYyem0wLTRINFY5aDJ2MnptMC00SDRWNWgydjJ6bTQgMTJIOHYtMmgydjJ6bTAtNEg4di0yaDJ2MnptMC00SDhWOWgydjJ6bTAtNEg4VjVoMnYyem0xMCAxMmgtOHYtMmgydi0yaC0ydi0yaDJ2LTJoLTJWOWg4djEwem0tMi04aC0ydjJoMnYtMnptMCA0aC0ydjJoMnYtMnoiIC8+PC9nPgo8ZyBpZD0iY2FsbCI+PHBhdGggZD0iTTYuNjIgMTAuNzljMS40NCAyLjgzIDMuNzYgNS4xNCA2LjU5IDYuNTlsMi4yLTIuMmMuMjctLjI3LjY3LS4zNiAxLjAyLS4yNCAxLjEyLjM3IDIuMzMuNTcgMy41Ny41Ny41NSAwIDEgLjQ1IDEgMVYyMGMwIC41NS0uNDUgMS0xIDEtOS4zOSAwLTE3LTcuNjEtMTctMTcgMC0uNTUuNDUtMSAxLTFoMy41Yy41NSAwIDEgLjQ1IDEgMSAwIDEuMjUuMiAyLjQ1LjU3IDMuNTcuMTEuMzUuMDMuNzQtLjI1IDEuMDJsLTIuMiAyLjJ6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtZW5kIj48cGF0aCBkPSJNMTIgOWMtMS42IDAtMy4xNS4yNS00LjYuNzJ2My4xYzAgLjM5LS4yMy43NC0uNTYuOS0uOTguNDktMS44NyAxLjEyLTIuNjYgMS44NS0uMTguMTgtLjQzLjI4LS43LjI4LS4yOCAwLS41My0uMTEtLjcxLS4yOUwuMjkgMTMuMDhjLS4xOC0uMTctLjI5LS40Mi0uMjktLjcgMC0uMjguMTEtLjUzLjI5LS43MUMzLjM0IDguNzggNy40NiA3IDEyIDdzOC42NiAxLjc4IDExLjcxIDQuNjdjLjE4LjE4LjI5LjQzLjI5LjcxIDAgLjI4LS4xMS41My0uMjkuNzFsLTIuNDggMi40OGMtLjE4LjE4LS40My4yOS0uNzEuMjktLjI3IDAtLjUyLS4xMS0uNy0uMjgtLjc5LS43NC0xLjY5LTEuMzYtMi42Ny0xLjg1LS4zMy0uMTYtLjU2LS41LS41Ni0uOXYtMy4xQzE1LjE1IDkuMjUgMTMuNiA5IDEyIDl6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtbWFkZSI+PHBhdGggZD0iTTkgNXYyaDYuNTlMNCAxOC41OSA1LjQxIDIwIDE3IDguNDFWMTVoMlY1eiIgLz48L2c+CjxnIGlkPSJjYWxsLW1lcmdlIj48cGF0aCBkPSJNMTcgMjAuNDFMMTguNDEgMTkgMTUgMTUuNTkgMTMuNTkgMTcgMTcgMjAuNDF6TTcuNSA4SDExdjUuNTlMNS41OSAxOSA3IDIwLjQxbDYtNlY4aDMuNUwxMiAzLjUgNy41IDh6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtbWlzc2VkIj48cGF0aCBkPSJNMTkuNTkgN0wxMiAxNC41OSA2LjQxIDlIMTFWN0gzdjhoMnYtNC41OWw3IDcgOS05eiIgLz48L2c+CjxnIGlkPSJjYWxsLW1pc3NlZC1vdXRnb2luZyI+PHBhdGggZD0iTTMgOC40MWw5IDkgNy03VjE1aDJWN2gtOHYyaDQuNTlMMTIgMTQuNTkgNC40MSA3IDMgOC40MXoiIC8+PC9nPgo8ZyBpZD0iY2FsbC1yZWNlaXZlZCI+PHBhdGggZD0iTTIwIDUuNDFMMTguNTkgNCA3IDE1LjU5VjlINXYxMGgxMHYtMkg4LjQxeiIgLz48L2c+CjxnIGlkPSJjYWxsLXNwbGl0Ij48cGF0aCBkPSJNMTQgNGwyLjI5IDIuMjktMi44OCAyLjg4IDEuNDIgMS40MiAyLjg4LTIuODhMMjAgMTBWNHptLTQgMEg0djZsMi4yOS0yLjI5IDQuNzEgNC43VjIwaDJ2LTguNDFsLTUuMjktNS4zeiIgLz48L2c+CjxnIGlkPSJjaGF0Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgOWgxMnYySDZWOXptOCA1SDZ2LTJoOHYyem00LTZINlY2aDEydjJ6IiAvPjwvZz4KPGcgaWQ9ImNoYXQtYnViYmxlIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxOGw0LTRoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iY2hhdC1idWJibGUtb3V0bGluZSI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MThsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bTAgMTRINmwtMiAyVjRoMTZ2MTJ6IiAvPjwvZz4KPGcgaWQ9ImNsZWFyLWFsbCI+PHBhdGggZD0iTTUgMTNoMTR2LTJINXYyem0tMiA0aDE0di0ySDN2MnpNNyA3djJoMTRWN0g3eiIgLz48L2c+CjxnIGlkPSJjb21tZW50Ij48cGF0aCBkPSJNMjEuOTkgNGMwLTEuMS0uODktMi0xLjk5LTJINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNGw0IDQtLjAxLTE4ek0xOCAxNEg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyeiIgLz48L2c+CjxnIGlkPSJjb250YWN0LW1haWwiPjxwYXRoIGQ9Ik0yMSA4VjdsLTMgMi0zLTJ2MWwzIDIgMy0yem0xLTVIMkMuOSAzIDAgMy45IDAgNXYxNGMwIDEuMS45IDIgMiAyaDIwYzEuMSAwIDEuOTktLjkgMS45OS0yTDI0IDVjMC0xLjEtLjktMi0yLTJ6TTggNmMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJIMnYtMWMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MXptOC02aC04VjZoOHY2eiIgLz48L2c+CjxnIGlkPSJjb250YWN0LXBob25lIj48cGF0aCBkPSJNMjIgM0gyQy45IDMgMCAzLjkgMCA1djE0YzAgMS4xLjkgMiAyIDJoMjBjMS4xIDAgMS45OS0uOSAxLjk5LTJMMjQgNWMwLTEuMS0uOS0yLTItMnpNOCA2YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkgydi0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxem0zLjg1LTRoMS42NEwyMSAxNmwtMS45OSAxLjk5Yy0xLjMxLS45OC0yLjI4LTIuMzgtMi43My0zLjk5LS4xOC0uNjQtLjI4LTEuMzEtLjI4LTJzLjEtMS4zNi4yOC0yYy40NS0xLjYyIDEuNDItMy4wMSAyLjczLTMuOTlMMjEgOGwtMS41MSAyaC0xLjY0Yy0uMjIuNjMtLjM1IDEuMy0uMzUgMnMuMTMgMS4zNy4zNSAyeiIgLz48L2c+CjxnIGlkPSJjb250YWN0cyI+PHBhdGggZD0iTTIwIDBINHYyaDE2VjB6TTQgMjRoMTZ2LTJINHYyek0yMCA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTggMi43NWMxLjI0IDAgMi4yNSAxLjAxIDIuMjUgMi4yNXMtMS4wMSAyLjI1LTIuMjUgMi4yNVM5Ljc1IDEwLjI0IDkuNzUgOSAxMC43NiA2Ljc1IDEyIDYuNzV6TTE3IDE3SDd2LTEuNWMwLTEuNjcgMy4zMy0yLjUgNS0yLjVzNSAuODMgNSAyLjVWMTd6IiAvPjwvZz4KPGcgaWQ9ImRpYWxlci1zaXAiPjxwYXRoIGQ9Ik0xNyAzaC0xdjVoMVYzem0tMiAyaC0yVjRoMlYzaC0zdjNoMnYxaC0ydjFoM1Y1em0zLTJ2NWgxVjZoMlYzaC0zem0yIDJoLTFWNGgxdjF6bTAgMTAuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDEuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU5bDIuMi0yLjIxYy4yNy0uMjYuMzUtLjY1LjI0LTFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9ImRpYWxwYWQiPjxwYXRoIGQ9Ik0xMiAxOWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6TTYgMWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyLThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem0tNiA4Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMC02Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAtNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImVtYWlsIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9ImZvcnVtIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6IiAvPjwvZz4KPGcgaWQ9ImltcG9ydC1jb250YWN0cyI+PHBhdGggZD0iTTIxIDVjLTEuMTEtLjM1LTIuMzMtLjUtMy41LS41LTEuOTUgMC00LjA1LjQtNS41IDEuNS0xLjQ1LTEuMS0zLjU1LTEuNS01LjUtMS41UzIuNDUgNC45IDEgNnYxNC42NWMwIC4yNS4yNS41LjUuNS4xIDAgLjE1LS4wNS4yNS0uMDVDMy4xIDIwLjQ1IDUuMDUgMjAgNi41IDIwYzEuOTUgMCA0LjA1LjQgNS41IDEuNSAxLjM1LS44NSAzLjgtMS41IDUuNS0xLjUgMS42NSAwIDMuMzUuMyA0Ljc1IDEuMDUuMS4wNS4xNS4wNS4yNS4wNS4yNSAwIC41LS4yNS41LS41VjZjLS42LS40NS0xLjI1LS43NS0yLTF6bTAgMTMuNWMtMS4xLS4zNS0yLjMtLjUtMy41LS41LTEuNyAwLTQuMTUuNjUtNS41IDEuNVY4YzEuMzUtLjg1IDMuOC0xLjUgNS41LTEuNSAxLjIgMCAyLjQuMTUgMy41LjV2MTEuNXoiIC8+PC9nPgo8ZyBpZD0iaW1wb3J0LWV4cG9ydCI+PHBhdGggZD0iTTkgM0w1IDYuOTloM1YxNGgyVjYuOTloM0w5IDN6bTcgMTQuMDFWMTBoLTJ2Ny4wMWgtM0wxNSAyMWw0LTMuOTloLTN6IiAvPjwvZz4KPGcgaWQ9ImludmVydC1jb2xvcnMtb2ZmIj48cGF0aCBkPSJNMjAuNjUgMjAuODdsLTIuMzUtMi4zNS02LjMtNi4yOS0zLjU2LTMuNTctMS40Mi0xLjQxTDQuMjcgNC41IDMgNS43N2wyLjc4IDIuNzhjLTIuNTUgMy4xNC0yLjM2IDcuNzYuNTYgMTAuNjlDNy45IDIwLjggOS45NSAyMS41OCAxMiAyMS41OGMxLjc5IDAgMy41Ny0uNTkgNS4wMy0xLjc4bDIuNyAyLjdMMjEgMjEuMjNsLS4zNS0uMzZ6TTEyIDE5LjU5Yy0xLjYgMC0zLjExLS42Mi00LjI0LTEuNzZDNi42MiAxNi42OSA2IDE1LjE5IDYgMTMuNTljMC0xLjMyLjQzLTIuNTcgMS4yMS0zLjZMMTIgMTQuNzd2NC44MnpNMTIgNS4xdjQuNThsNy4yNSA3LjI2YzEuMzctMi45Ni44NC02LjU3LTEuNi05LjAxTDEyIDIuMjdsLTMuNyAzLjcgMS40MSAxLjQxTDEyIDUuMXoiIC8+PC9nPgo8ZyBpZD0ibGl2ZS1oZWxwIj48cGF0aCBkPSJNMTkgMkg1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoNGwzIDMgMy0zaDRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTYgMTZoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDExLjkgMTMgMTIuNSAxMyAxNGgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz48L2c+CjxnIGlkPSJsb2NhdGlvbi1vZmYiPjxwYXRoIGQ9Ik0xMiA2LjVjMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjUgMCAuNzQtLjMzIDEuMzktLjgzIDEuODVsMy42MyAzLjYzYy45OC0xLjg2IDEuNy0zLjggMS43LTUuNDggMC0zLjg3LTMuMTMtNy03LTctMS45OCAwLTMuNzYuODMtNS4wNCAyLjE1bDMuMTkgMy4xOWMuNDYtLjUyIDEuMTEtLjg0IDEuODUtLjg0em00LjM3IDkuNmwtNC42My00LjYzLS4xMS0uMTFMMy4yNyAzIDIgNC4yN2wzLjE4IDMuMThDNS4wNyA3Ljk1IDUgOC40NyA1IDljMCA1LjI1IDcgMTMgNyAxM3MxLjY3LTEuODUgMy4zOC00LjM1TDE4LjczIDIxIDIwIDE5LjczbC0zLjYzLTMuNjN6IiAvPjwvZz4KPGcgaWQ9ImxvY2F0aW9uLW9uIj48cGF0aCBkPSJNMTIgMkM4LjEzIDIgNSA1LjEzIDUgOWMwIDUuMjUgNyAxMyA3IDEzczctNy43NSA3LTEzYzAtMy44Ny0zLjEzLTctNy03em0wIDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6IiAvPjwvZz4KPGcgaWQ9Im1haWwtb3V0bGluZSI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNEg0VjhsOCA1IDgtNXYxMHptLTgtN0w0IDZoMTZsLTggNXoiIC8+PC9nPgo8ZyBpZD0ibWVzc2FnZSI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMiAxMkg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyeiIgLz48L2c+CjxnIGlkPSJuby1zaW0iPjxwYXRoIGQ9Ik0xOC45OSA1YzAtMS4xLS44OS0yLTEuOTktMmgtN0w3LjY2IDUuMzQgMTkgMTYuNjggMTguOTkgNXpNMy42NSAzLjg4TDIuMzggNS4xNSA1IDcuNzdWMTljMCAxLjEuOSAyIDIgMmgxMC4wMWMuMzUgMCAuNjctLjEuOTYtLjI2bDEuODggMS44OCAxLjI3LTEuMjdMMy42NSAzLjg4eiIgLz48L2c+CjxnIGlkPSJwaG9uZSI+PHBhdGggZD0iTTYuNjIgMTAuNzljMS40NCAyLjgzIDMuNzYgNS4xNCA2LjU5IDYuNTlsMi4yLTIuMmMuMjctLjI3LjY3LS4zNiAxLjAyLS4yNCAxLjEyLjM3IDIuMzMuNTcgMy41Ny41Ny41NSAwIDEgLjQ1IDEgMVYyMGMwIC41NS0uNDUgMS0xIDEtOS4zOSAwLTE3LTcuNjEtMTctMTcgMC0uNTUuNDUtMSAxLTFoMy41Yy41NSAwIDEgLjQ1IDEgMSAwIDEuMjUuMiAyLjQ1LjU3IDMuNTcuMTEuMzUuMDMuNzQtLjI1IDEuMDJsLTIuMiAyLjJ6IiAvPjwvZz4KPGcgaWQ9InBob25lbGluay1lcmFzZSI+PHBhdGggZD0iTTEzIDguMmwtMS0xLTQgNC00LTQtMSAxIDQgNC00IDQgMSAxIDQtNCA0IDQgMS0xLTQtNCA0LTR6TTE5IDFIOWMtMS4xIDAtMiAuOS0yIDJ2M2gyVjRoMTB2MTZIOXYtMkg3djNjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJwaG9uZWxpbmstbG9jayI+PHBhdGggZD0iTTE5IDFIOWMtMS4xIDAtMiAuOS0yIDJ2M2gyVjRoMTB2MTZIOXYtMkg3djNjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0tOC4yIDEwVjkuNUMxMC44IDguMSA5LjQgNyA4IDdTNS4yIDguMSA1LjIgOS41VjExYy0uNiAwLTEuMi42LTEuMiAxLjJ2My41YzAgLjcuNiAxLjMgMS4yIDEuM2g1LjVjLjcgMCAxLjMtLjYgMS4zLTEuMnYtMy41YzAtLjctLjYtMS4zLTEuMi0xLjN6bS0xLjMgMGgtM1Y5LjVjMC0uOC43LTEuMyAxLjUtMS4zczEuNS41IDEuNSAxLjNWMTF6IiAvPjwvZz4KPGcgaWQ9InBob25lbGluay1yaW5nIj48cGF0aCBkPSJNMjAuMSA3LjdsLTEgMWMxLjggMS44IDEuOCA0LjYgMCA2LjVsMSAxYzIuNS0yLjMgMi41LTYuMSAwLTguNXpNMTggOS44bC0xIDFjLjUuNy41IDEuNiAwIDIuM2wxIDFjMS4yLTEuMiAxLjItMyAwLTQuM3pNMTQgMUg0Yy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTlINFY0aDEwdjE2eiIgLz48L2c+CjxnIGlkPSJwaG9uZWxpbmstc2V0dXAiPjxwYXRoIGQ9Ik0xMS44IDEyLjV2LTFsMS4xLS44Yy4xLS4xLjEtLjIuMS0uM2wtMS0xLjdjLS4xLS4xLS4yLS4yLS4zLS4xbC0xLjMuNGMtLjMtLjItLjYtLjQtLjktLjVsLS4yLTEuM2MwLS4xLS4xLS4yLS4zLS4ySDdjLS4xIDAtLjIuMS0uMy4ybC0uMiAxLjNjLS4zLjEtLjYuMy0uOS41bC0xLjMtLjVjLS4xIDAtLjIgMC0uMy4xbC0xIDEuN2MtLjEuMSAwIC4yLjEuM2wxLjEuOHYxbC0xLjEuOGMtLjEuMi0uMS4zLS4xLjRsMSAxLjdjLjEuMS4yLjIuMy4xbDEuNC0uNGMuMy4yLjYuNC45LjVsLjIgMS4zYy0uMS4xLjEuMi4yLjJoMmMuMSAwIC4yLS4xLjMtLjJsLjItMS4zYy4zLS4xLjYtLjMuOS0uNWwxLjMuNWMuMSAwIC4yIDAgLjMtLjFsMS0xLjdjLjEtLjEgMC0uMi0uMS0uM2wtMS4xLS45ek04IDE0Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNMTkgMUg5Yy0xLjEgMC0yIC45LTIgMnYzaDJWNGgxMHYxNkg5di0ySDd2M2MwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InBvcnRhYmxlLXdpZmktb2ZmIj48cGF0aCBkPSJNMTcuNTYgMTQuMjRjLjI4LS42OS40NC0xLjQ1LjQ0LTIuMjQgMC0zLjMxLTIuNjktNi02LTYtLjc5IDAtMS41NS4xNi0yLjI0LjQ0bDEuNjIgMS42MmMuMi0uMDMuNDEtLjA2LjYyLS4wNiAyLjIxIDAgNCAxLjc5IDQgNCAwIC4yMS0uMDIuNDItLjA1LjYzbDEuNjEgMS42MXpNMTIgNGM0LjQyIDAgOCAzLjU4IDggOCAwIDEuMzUtLjM1IDIuNjItLjk1IDMuNzRsMS40NyAxLjQ3QzIxLjQ2IDE1LjY5IDIyIDEzLjkxIDIyIDEyYzAtNS41Mi00LjQ4LTEwLTEwLTEwLTEuOTEgMC0zLjY5LjU1LTUuMjEgMS40N2wxLjQ2IDEuNDZDOS4zNyA0LjM0IDEwLjY1IDQgMTIgNHpNMy4yNyAyLjVMMiAzLjc3bDIuMSAyLjFDMi43OSA3LjU3IDIgOS42OSAyIDEyYzAgMy43IDIuMDEgNi45MiA0Ljk5IDguNjVsMS0xLjczQzUuNjEgMTcuNTMgNCAxNC45NiA0IDEyYzAtMS43Ni41Ny0zLjM4IDEuNTMtNC42OWwxLjQzIDEuNDRDNi4zNiA5LjY4IDYgMTAuOCA2IDEyYzAgMi4yMiAxLjIxIDQuMTUgMyA1LjE5bDEtMS43NGMtMS4xOS0uNy0yLTEuOTctMi0zLjQ1IDAtLjY1LjE3LTEuMjUuNDQtMS43OWwxLjU4IDEuNThMMTAgMTJjMCAxLjEuOSAyIDIgMmwuMjEtLjAyLjAxLjAxIDcuNTEgNy41MUwyMSAyMC4yMyA0LjI3IDMuNWwtMS0xeiIgLz48L2c+CjxnIGlkPSJwcmVzZW50LXRvLWFsbCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xMSAwLTIgLjg5LTIgMnYxNGMwIDEuMTEuODkgMiAyIDJoMThjMS4xMSAwIDItLjg5IDItMlY1YzAtMS4xMS0uODktMi0yLTJ6bTAgMTYuMDJIM1Y0Ljk4aDE4djE0LjA0ek0xMCAxMkg4bDQtNCA0IDRoLTJ2NGgtNHYtNHoiIC8+PC9nPgo8ZyBpZD0icmluZy12b2x1bWUiPjxwYXRoIGQ9Ik0yMy43MSAxNi42N0MyMC42NiAxMy43OCAxNi41NCAxMiAxMiAxMiA3LjQ2IDEyIDMuMzQgMTMuNzguMjkgMTYuNjdjLS4xOC4xOC0uMjkuNDMtLjI5LjcxIDAgLjI4LjExLjUzLjI5LjcxbDIuNDggMi40OGMuMTguMTguNDMuMjkuNzEuMjkuMjcgMCAuNTItLjExLjctLjI4Ljc5LS43NCAxLjY5LTEuMzYgMi42Ni0xLjg1LjMzLS4xNi41Ni0uNS41Ni0uOXYtMy4xYzEuNDUtLjQ4IDMtLjczIDQuNi0uNzNzMy4xNS4yNSA0LjYuNzJ2My4xYzAgLjM5LjIzLjc0LjU2LjkuOTguNDkgMS44NyAxLjEyIDIuNjYgMS44NS4xOC4xOC40My4yOC43LjI4LjI4IDAgLjUzLS4xMS43MS0uMjlsMi40OC0yLjQ4Yy4xOC0uMTguMjktLjQzLjI5LS43MSAwLS4yNy0uMTEtLjUyLS4yOS0uN3pNMjEuMTYgNi4yNmwtMS40MS0xLjQxLTMuNTYgMy41NSAxLjQxIDEuNDFzMy40NS0zLjUyIDMuNTYtMy41NXpNMTMgMmgtMnY1aDJWMnpNNi40IDkuODFMNy44MSA4LjQgNC4yNiA0Ljg0IDIuODQgNi4yNmMuMTEuMDMgMy41NiAzLjU1IDMuNTYgMy41NXoiIC8+PC9nPgo8ZyBpZD0icnNzLWZlZWQiPjxjaXJjbGUgY3g9IjYuMTgiIGN5PSIxNy44MiIgcj0iMi4xOCIgLz48cGF0aCBkPSJNNCA0LjQ0djIuODNjNy4wMyAwIDEyLjczIDUuNyAxMi43MyAxMi43M2gyLjgzYzAtOC41OS02Ljk3LTE1LjU2LTE1LjU2LTE1LjU2em0wIDUuNjZ2Mi44M2MzLjkgMCA3LjA3IDMuMTcgNy4wNyA3LjA3aDIuODNjMC01LjQ3LTQuNDMtOS45LTkuOS05Ljl6IiAvPjwvZz4KPGcgaWQ9InNjcmVlbi1zaGFyZSI+PHBhdGggZD0iTTIwIDE4YzEuMSAwIDEuOTktLjkgMS45OS0yTDIyIDZjMC0xLjExLS45LTItMi0ySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTBjMCAxLjEuODkgMiAyIDJIMHYyaDI0di0yaC00em0tNy0zLjUzdi0yLjE5Yy0yLjc4IDAtNC42MS44NS02IDIuNzIuNTYtMi42NyAyLjExLTUuMzMgNi01Ljg3VjdsNCAzLjczLTQgMy43NHoiIC8+PC9nPgo8ZyBpZD0ic3BlYWtlci1waG9uZSI+PHBhdGggZD0iTTcgNy4wN0w4LjQzIDguNWMuOTEtLjkxIDIuMTgtMS40OCAzLjU3LTEuNDhzMi42Ni41NyAzLjU3IDEuNDhMMTcgNy4wN0MxNS43MiA1Ljc5IDEzLjk1IDUgMTIgNXMtMy43Mi43OS01IDIuMDd6TTEyIDFDOC45OCAxIDYuMjQgMi4yMyA0LjI1IDQuMjFsMS40MSAxLjQxQzcuMjggNCA5LjUzIDMgMTIgM3M0LjcyIDEgNi4zNCAyLjYybDEuNDEtMS40MUMxNy43NiAyLjIzIDE1LjAyIDEgMTIgMXptMi44NiA5LjAxTDkuMTQgMTBDOC41MSAxMCA4IDEwLjUxIDggMTEuMTR2OS43MWMwIC42My41MSAxLjE0IDEuMTQgMS4xNGg1LjcxYy42MyAwIDEuMTQtLjUxIDEuMTQtMS4xNHYtOS43MWMuMDEtLjYzLS41LTEuMTMtMS4xMy0xLjEzek0xNSAyMEg5di04aDZ2OHoiIC8+PC9nPgo8ZyBpZD0ic3RheS1jdXJyZW50LWxhbmRzY2FwZSI+PHBhdGggZD0iTTEuMDEgN0wxIDE3YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMkgzYy0xLjEgMC0xLjk5LjktMS45OSAyek0xOSA3djEwSDVWN2gxNHoiIC8+PC9nPgo8ZyBpZD0ic3RheS1jdXJyZW50LXBvcnRyYWl0Ij48cGF0aCBkPSJNMTcgMS4wMUw3IDFjLTEuMSAwLTEuOTkuOS0xLjk5IDJ2MThjMCAxLjEuODkgMiAxLjk5IDJoMTBjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0xLjk5LTItMS45OXpNMTcgMTlIN1Y1aDEwdjE0eiIgLz48L2c+CjxnIGlkPSJzdGF5LXByaW1hcnktbGFuZHNjYXBlIj48cGF0aCBkPSJNMS4wMSA3TDEgMTdjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0ySDNjLTEuMSAwLTEuOTkuOS0xLjk5IDJ6TTE5IDd2MTBINVY3aDE0eiIgLz48L2c+CjxnIGlkPSJzdGF5LXByaW1hcnktcG9ydHJhaXQiPjxwYXRoIGQ9Ik0xNyAxLjAxTDcgMWMtMS4xIDAtMS45OS45LTEuOTkgMnYxOGMwIDEuMS44OSAyIDEuOTkgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InN0b3Atc2NyZWVuLXNoYXJlIj48cGF0aCBkPSJNMjEuMjIgMTguMDJsMiAySDI0di0yaC0yLjc4em0uNzctMmwuMDEtMTBjMC0xLjExLS45LTItMi0ySDcuMjJsNS4yMyA1LjIzYy4xOC0uMDQuMzYtLjA3LjU1LS4xVjcuMDJsNCAzLjczLTEuNTggMS40NyA1LjU0IDUuNTRjLjYxLS4zMyAxLjAzLS45OSAxLjAzLTEuNzR6TTIuMzkgMS43M0wxLjExIDNsMS41NCAxLjU0Yy0uNC4zNi0uNjUuODktLjY1IDEuNDh2MTBjMCAxLjEuODkgMiAyIDJIMHYyaDE4LjEzbDIuNzEgMi43MSAxLjI3LTEuMjdMMi4zOSAxLjczek03IDE1LjAyYy4zMS0xLjQ4LjkyLTIuOTUgMi4wNy00LjA2bDEuNTkgMS41OWMtMS41NC4zOC0yLjcgMS4xOC0zLjY2IDIuNDd6IiAvPjwvZz4KPGcgaWQ9InN3YXAtY2FsbHMiPjxwYXRoIGQ9Ik0xOCA0bC00IDRoM3Y3YzAgMS4xLS45IDItMiAycy0yLS45LTItMlY4YzAtMi4yMS0xLjc5LTQtNC00UzUgNS43OSA1IDh2N0gybDQgNCA0LTRIN1Y4YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJ2N2MwIDIuMjEgMS43OSA0IDQgNHM0LTEuNzkgNC00VjhoM2wtNC00eiIgLz48L2c+CjxnIGlkPSJ0ZXh0c21zIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTkgMTFIN1Y5aDJ2MnptNCAwaC0yVjloMnYyem00IDBoLTJWOWgydjJ6IiAvPjwvZz4KPGcgaWQ9InZvaWNlbWFpbCI+PHBhdGggZD0iTTE4LjUgNkMxNS40NiA2IDEzIDguNDYgMTMgMTEuNWMwIDEuMzMuNDcgMi41NSAxLjI2IDMuNUg5Ljc0Yy43OS0uOTUgMS4yNi0yLjE3IDEuMjYtMy41QzExIDguNDYgOC41NCA2IDUuNSA2UzAgOC40NiAwIDExLjUgMi40NiAxNyA1LjUgMTdoMTNjMy4wNCAwIDUuNS0yLjQ2IDUuNS01LjVTMjEuNTQgNiAxOC41IDZ6bS0xMyA5QzMuNTcgMTUgMiAxMy40MyAyIDExLjVTMy41NyA4IDUuNSA4IDkgOS41NyA5IDExLjUgNy40MyAxNSA1LjUgMTV6bTEzIDBjLTEuOTMgMC0zLjUtMS41Ny0zLjUtMy41UzE2LjU3IDggMTguNSA4IDIyIDkuNTcgMjIgMTEuNSAyMC40MyAxNSAxOC41IDE1eiIgLz48L2c+CjxnIGlkPSJ2cG4ta2V5Ij48cGF0aCBkPSJNMTIuNjUgMTBDMTEuODMgNy42NyA5LjYxIDYgNyA2Yy0zLjMxIDAtNiAyLjY5LTYgNnMyLjY5IDYgNiA2YzIuNjEgMCA0LjgzLTEuNjcgNS42NS00SDE3djRoNHYtNGgydi00SDEyLjY1ek03IDE0Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnoiIC8+PC9nPgo8L2RlZnM+PC9zdmc+CjwvaXJvbi1pY29uc2V0LXN2Zz4KCgoKCjxpcm9uLWljb25zZXQtc3ZnIG5hbWU9ImVkaXRvciIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXR0YWNoLWZpbGUiPjxwYXRoIGQ9Ik0xNi41IDZ2MTEuNWMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNFY1YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjV2MTAuNWMwIC41NS0uNDUgMS0xIDFzLTEtLjQ1LTEtMVY2SDEwdjkuNWMwIDEuMzggMS4xMiAyLjUgMi41IDIuNXMyLjUtMS4xMiAyLjUtMi41VjVjMC0yLjIxLTEuNzktNC00LTRTNyAyLjc5IDcgNXYxMi41YzAgMy4wNCAyLjQ2IDUuNSA1LjUgNS41czUuNS0yLjQ2IDUuNS01LjVWNmgtMS41eiIgLz48L2c+CjxnIGlkPSJhdHRhY2gtbW9uZXkiPjxwYXRoIGQ9Ik0xMS44IDEwLjljLTIuMjctLjU5LTMtMS4yLTMtMi4xNSAwLTEuMDkgMS4wMS0xLjg1IDIuNy0xLjg1IDEuNzggMCAyLjQ0Ljg1IDIuNSAyLjFoMi4yMWMtLjA3LTEuNzItMS4xMi0zLjMtMy4yMS0zLjgxVjNoLTN2Mi4xNmMtMS45NC40Mi0zLjUgMS42OC0zLjUgMy42MSAwIDIuMzEgMS45MSAzLjQ2IDQuNyA0LjEzIDIuNS42IDMgMS40OCAzIDIuNDEgMCAuNjktLjQ5IDEuNzktMi43IDEuNzktMi4wNiAwLTIuODctLjkyLTIuOTgtMi4xaC0yLjJjLjEyIDIuMTkgMS43NiAzLjQyIDMuNjggMy44M1YyMWgzdi0yLjE1YzEuOTUtLjM3IDMuNS0xLjUgMy41LTMuNTUgMC0yLjg0LTIuNDMtMy44MS00LjctNC40eiIgLz48L2c+CjxnIGlkPSJib3JkZXItYWxsIj48cGF0aCBkPSJNMyAzdjE4aDE4VjNIM3ptOCAxNkg1di02aDZ2NnptMC04SDVWNWg2djZ6bTggOGgtNnYtNmg2djZ6bTAtOGgtNlY1aDZ2NnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWJvdHRvbSI+PHBhdGggZD0iTTkgMTFIN3YyaDJ2LTJ6bTQgNGgtMnYyaDJ2LTJ6TTkgM0g3djJoMlYzem00IDhoLTJ2Mmgydi0yek01IDNIM3YyaDJWM3ptOCA0aC0ydjJoMlY3em00IDRoLTJ2Mmgydi0yem0tNC04aC0ydjJoMlYzem00IDBoLTJ2MmgyVjN6bTIgMTBoMnYtMmgtMnYyem0wIDRoMnYtMmgtMnYyek01IDdIM3YyaDJWN3ptMTQtNHYyaDJWM2gtMnptMCA2aDJWN2gtMnYyek01IDExSDN2Mmgydi0yek0zIDIxaDE4di0ySDN2MnptMi02SDN2Mmgydi0yeiIgLz48L2c+CjxnIGlkPSJib3JkZXItY2xlYXIiPjxwYXRoIGQ9Ik03IDVoMlYzSDd2MnptMCA4aDJ2LTJIN3Yyem0wIDhoMnYtMkg3djJ6bTQtNGgydi0yaC0ydjJ6bTAgNGgydi0yaC0ydjJ6bS04IDBoMnYtMkgzdjJ6bTAtNGgydi0ySDN2MnptMC00aDJ2LTJIM3Yyem0wLTRoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTggOGgydi0yaC0ydjJ6bTggNGgydi0yaC0ydjJ6bTAtNGgydi0yaC0ydjJ6bTAgOGgydi0yaC0ydjJ6bTAtMTJoMlY3aC0ydjJ6bS04IDBoMlY3aC0ydjJ6bTgtNnYyaDJWM2gtMnptLTggMmgyVjNoLTJ2MnptNCAxNmgydi0yaC0ydjJ6bTAtOGgydi0yaC0ydjJ6bTAtOGgyVjNoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWNvbG9yIj48cGF0aCBkPSJNMTcuNzUgN0wxNCAzLjI1bC0xMCAxMFYxN2gzLjc1bDEwLTEwem0yLjk2LTIuOTZjLjM5LS4zOS4zOS0xLjAyIDAtMS40MUwxOC4zNy4yOWMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBMMTUgMi4yNSAxOC43NSA2bDEuOTYtMS45NnoiIC8+PHBhdGggZmlsbC1vcGFjaXR5PSIuMzYiIGQ9Ik0wIDIwaDI0djRIMHoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWhvcml6b250YWwiPjxwYXRoIGQ9Ik0zIDIxaDJ2LTJIM3Yyek01IDdIM3YyaDJWN3pNMyAxN2gydi0ySDN2MnptNCA0aDJ2LTJIN3Yyek01IDNIM3YyaDJWM3ptNCAwSDd2MmgyVjN6bTggMGgtMnYyaDJWM3ptLTQgNGgtMnYyaDJWN3ptMC00aC0ydjJoMlYzem02IDE0aDJ2LTJoLTJ2MnptLTggNGgydi0yaC0ydjJ6bS04LThoMTh2LTJIM3Yyek0xOSAzdjJoMlYzaC0yem0wIDZoMlY3aC0ydjJ6bS04IDhoMnYtMmgtMnYyem00IDRoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJib3JkZXItaW5uZXIiPjxwYXRoIGQ9Ik0zIDIxaDJ2LTJIM3Yyem00IDBoMnYtMkg3djJ6TTUgN0gzdjJoMlY3ek0zIDE3aDJ2LTJIM3Yyek05IDNIN3YyaDJWM3pNNSAzSDN2MmgyVjN6bTEyIDBoLTJ2MmgyVjN6bTIgNmgyVjdoLTJ2MnptMC02djJoMlYzaC0yem0tNCAxOGgydi0yaC0ydjJ6TTEzIDNoLTJ2OEgzdjJoOHY4aDJ2LThoOHYtMmgtOFYzem02IDE4aDJ2LTJoLTJ2MnptMC00aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWxlZnQiPjxwYXRoIGQ9Ik0xMSAyMWgydi0yaC0ydjJ6bTAtNGgydi0yaC0ydjJ6bTAtMTJoMlYzaC0ydjJ6bTAgNGgyVjdoLTJ2MnptMCA0aDJ2LTJoLTJ2MnptLTQgOGgydi0ySDd2MnpNNyA1aDJWM0g3djJ6bTAgOGgydi0ySDd2MnptLTQgOGgyVjNIM3YxOHpNMTkgOWgyVjdoLTJ2MnptLTQgMTJoMnYtMmgtMnYyem00LTRoMnYtMmgtMnYyem0wLTE0djJoMlYzaC0yem0wIDEwaDJ2LTJoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQtOGgydi0yaC0ydjJ6bTAtOGgyVjNoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLW91dGVyIj48cGF0aCBkPSJNMTMgN2gtMnYyaDJWN3ptMCA0aC0ydjJoMnYtMnptNCAwaC0ydjJoMnYtMnpNMyAzdjE4aDE4VjNIM3ptMTYgMTZINVY1aDE0djE0em0tNi00aC0ydjJoMnYtMnptLTQtNEg3djJoMnYtMnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLXJpZ2h0Ij48cGF0aCBkPSJNNyAyMWgydi0ySDd2MnpNMyA1aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem0wIDhoMnYtMkg3djJ6bS00IDhoMnYtMkgzdjJ6bTggMGgydi0yaC0ydjJ6bS04LThoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTggOGgydi0yaC0ydjJ6bTQtNGgydi0yaC0ydjJ6bTQtMTB2MThoMlYzaC0yem0tNCAxOGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6bS00IDhoMnYtMmgtMnYyem0wLThoMlYzaC0ydjJ6bTAgNGgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLXN0eWxlIj48cGF0aCBkPSJNMTUgMjFoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek03IDIxaDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem04LTRoMnYtMmgtMnYyem0wLTRoMnYtMmgtMnYyek0zIDN2MThoMlY1aDE2VjNIM3ptMTYgNmgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLXRvcCI+PHBhdGggZD0iTTcgMjFoMnYtMkg3djJ6bTAtOGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTgtNGgydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMnYtMkgzdjJ6bTAtNGgyVjdIM3Yyem04IDhoMnYtMmgtMnYyem04LThoMlY3aC0ydjJ6bTAgNGgydi0yaC0ydjJ6TTMgM3YyaDE4VjNIM3ptMTYgMTRoMnYtMmgtMnYyem0tNCA0aDJ2LTJoLTJ2MnpNMTEgOWgyVjdoLTJ2MnptOCAxMmgydi0yaC0ydjJ6bS00LThoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJib3JkZXItdmVydGljYWwiPjxwYXRoIGQ9Ik0zIDloMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMTZoMnYtMkg3djJ6bTAtOGgydi0ySDd2MnptLTQgMGgydi0ySDN2MnptMCA4aDJ2LTJIM3Yyem0wLTRoMnYtMkgzdjJ6TTcgNWgyVjNIN3Yyem0xMiAxMmgydi0yaC0ydjJ6bS04IDRoMlYzaC0ydjE4em04IDBoMnYtMmgtMnYyem0wLThoMnYtMmgtMnYyem0wLTEwdjJoMlYzaC0yem0wIDZoMlY3aC0ydjJ6bS00LTRoMlYzaC0ydjJ6bTAgMTZoMnYtMmgtMnYyem0wLThoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJidWJibGUtY2hhcnQiPjxjaXJjbGUgY3g9IjcuMiIgY3k9IjE0LjQiIHI9IjMuMiIgLz48Y2lyY2xlIGN4PSIxNC44IiBjeT0iMTgiIHI9IjIiIC8+PGNpcmNsZSBjeD0iMTUuMiIgY3k9IjguOCIgcj0iNC44IiAvPjwvZz4KPGcgaWQ9ImRyYWctaGFuZGxlIj48cGF0aCBkPSJNMjAgOUg0djJoMTZWOXpNNCAxNWgxNnYtMkg0djJ6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1hbGlnbi1jZW50ZXIiPjxwYXRoIGQ9Ik03IDE1djJoMTB2LTJIN3ptLTQgNmgxOHYtMkgzdjJ6bTAtOGgxOHYtMkgzdjJ6bTQtNnYyaDEwVjdIN3pNMyAzdjJoMThWM0gzeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtYWxpZ24tanVzdGlmeSI+PHBhdGggZD0iTTMgMjFoMTh2LTJIM3Yyem0wLTRoMTh2LTJIM3Yyem0wLTRoMTh2LTJIM3Yyem0wLTRoMThWN0gzdjJ6bTAtNnYyaDE4VjNIM3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWFsaWduLWxlZnQiPjxwYXRoIGQ9Ik0xNSAxNUgzdjJoMTJ2LTJ6bTAtOEgzdjJoMTJWN3pNMyAxM2gxOHYtMkgzdjJ6bTAgOGgxOHYtMkgzdjJ6TTMgM3YyaDE4VjNIM3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWFsaWduLXJpZ2h0Ij48cGF0aCBkPSJNMyAyMWgxOHYtMkgzdjJ6bTYtNGgxMnYtMkg5djJ6bS02LTRoMTh2LTJIM3Yyem02LTRoMTJWN0g5djJ6TTMgM3YyaDE4VjNIM3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWJvbGQiPjxwYXRoIGQ9Ik0xNS42IDEwLjc5Yy45Ny0uNjcgMS42NS0xLjc3IDEuNjUtMi43OSAwLTIuMjYtMS43NS00LTQtNEg3djE0aDcuMDRjMi4wOSAwIDMuNzEtMS43IDMuNzEtMy43OSAwLTEuNTItLjg2LTIuODItMi4xNS0zLjQyek0xMCA2LjVoM2MuODMgMCAxLjUuNjcgMS41IDEuNXMtLjY3IDEuNS0xLjUgMS41aC0zdi0zem0zLjUgOUgxMHYtM2gzLjVjLjgzIDAgMS41LjY3IDEuNSAxLjVzLS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWNsZWFyIj48cGF0aCBkPSJNMy4yNyA1TDIgNi4yN2w2Ljk3IDYuOTdMNi41IDE5aDNsMS41Ny0zLjY2TDE2LjczIDIxIDE4IDE5LjczIDMuNTUgNS4yNyAzLjI3IDV6TTYgNXYuMThMOC44MiA4aDIuNGwtLjcyIDEuNjggMi4xIDIuMUwxNC4yMSA4SDIwVjVINnoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWNvbG9yLWZpbGwiPjxwYXRoIGQ9Ik0xNi41NiA4Ljk0TDcuNjIgMCA2LjIxIDEuNDFsMi4zOCAyLjM4LTUuMTUgNS4xNWMtLjU5LjU5LS41OSAxLjU0IDAgMi4xMmw1LjUgNS41Yy4yOS4yOS42OC40NCAxLjA2LjQ0cy43Ny0uMTUgMS4wNi0uNDRsNS41LTUuNWMuNTktLjU4LjU5LTEuNTMgMC0yLjEyek01LjIxIDEwTDEwIDUuMjEgMTQuNzkgMTBINS4yMXpNMTkgMTEuNXMtMiAyLjE3LTIgMy41YzAgMS4xLjkgMiAyIDJzMi0uOSAyLTJjMC0xLjMzLTItMy41LTItMy41eiIgLz48cGF0aCBmaWxsLW9wYWNpdHk9Ii4zNiIgZD0iTTAgMjBoMjR2NEgweiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtY29sb3ItcmVzZXQiPjxwYXRoIGQ9Ik0xOCAxNGMwLTQtNi0xMC44LTYtMTAuOHMtMS4zMyAxLjUxLTIuNzMgMy41Mmw4LjU5IDguNTljLjA5LS40Mi4xNC0uODYuMTQtMS4zMXptLS44OCAzLjEyTDEyLjUgMTIuNSA1LjI3IDUuMjcgNCA2LjU1bDMuMzIgMy4zMkM2LjU1IDExLjMyIDYgMTIuNzkgNiAxNGMwIDMuMzEgMi42OSA2IDYgNiAxLjUyIDAgMi45LS41NyAzLjk2LTEuNWwyLjYzIDIuNjMgMS4yNy0xLjI3LTIuNzQtMi43NHoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWNvbG9yLXRleHQiPjxwYXRoIGZpbGwtb3BhY2l0eT0iLjM2IiBkPSJNMCAyMGgyNHY0SDB6IiAvPjxwYXRoIGQ9Ik0xMSAzTDUuNSAxN2gyLjI1bDEuMTItM2g2LjI1bDEuMTIgM2gyLjI1TDEzIDNoLTJ6bS0xLjM4IDlMMTIgNS42NyAxNC4zOCAxMkg5LjYyeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtaW5kZW50LWRlY3JlYXNlIj48cGF0aCBkPSJNMTEgMTdoMTB2LTJIMTF2MnptLTgtNWw0IDRWOGwtNCA0em0wIDloMTh2LTJIM3Yyek0zIDN2MmgxOFYzSDN6bTggNmgxMFY3SDExdjJ6bTAgNGgxMHYtMkgxMXYyeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtaW5kZW50LWluY3JlYXNlIj48cGF0aCBkPSJNMyAyMWgxOHYtMkgzdjJ6TTMgOHY4bDQtNC00LTR6bTggOWgxMHYtMkgxMXYyek0zIDN2MmgxOFYzSDN6bTggNmgxMFY3SDExdjJ6bTAgNGgxMHYtMkgxMXYyeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtaXRhbGljIj48cGF0aCBkPSJNMTAgNHYzaDIuMjFsLTMuNDIgOEg2djNoOHYtM2gtMi4yMWwzLjQyLThIMThWNHoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWxpbmUtc3BhY2luZyI+PHBhdGggZD0iTTYgN2gyLjVMNSAzLjUgMS41IDdINHYxMEgxLjVMNSAyMC41IDguNSAxN0g2Vjd6bTQtMnYyaDEyVjVIMTB6bTAgMTRoMTJ2LTJIMTB2MnptMC02aDEydi0ySDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1saXN0LWJ1bGxldGVkIj48cGF0aCBkPSJNNCAxMC41Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXptMC02Yy0uODMgMC0xLjUuNjctMS41IDEuNVMzLjE3IDcuNSA0IDcuNSA1LjUgNi44MyA1LjUgNiA0LjgzIDQuNSA0IDQuNXptMCAxMmMtLjgzIDAtMS41LjY4LTEuNSAxLjVzLjY4IDEuNSAxLjUgMS41IDEuNS0uNjggMS41LTEuNS0uNjctMS41LTEuNS0xLjV6TTcgMTloMTR2LTJIN3Yyem0wLTZoMTR2LTJIN3Yyem0wLTh2MmgxNFY1SDd6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1saXN0LW51bWJlcmVkIj48cGF0aCBkPSJNMiAxN2gydi41SDN2MWgxdi41SDJ2MWgzdi00SDJ2MXptMS05aDFWNEgydjFoMXYzem0tMSAzaDEuOEwyIDEzLjF2LjloM3YtMUgzLjJMNSAxMC45VjEwSDJ2MXptNS02djJoMTRWNUg3em0wIDE0aDE0di0ySDd2MnptMC02aDE0di0ySDd2MnoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LXBhaW50Ij48cGF0aCBkPSJNMTggNFYzYzAtLjU1LS40NS0xLTEtMUg1Yy0uNTUgMC0xIC40NS0xIDF2NGMwIC41NS40NSAxIDEgMWgxMmMuNTUgMCAxLS40NSAxLTFWNmgxdjRIOXYxMWMwIC41NS40NSAxIDEgMWgyYy41NSAwIDEtLjQ1IDEtMXYtOWg4VjRoLTN6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1xdW90ZSI+PHBhdGggZD0iTTYgMTdoM2wyLTRWN0g1djZoM3ptOCAwaDNsMi00VjdoLTZ2NmgzeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtc2hhcGVzIj48cGF0aCBkPSJNMjMgN1YxaC02djJIN1YxSDF2NmgydjEwSDF2Nmg2di0yaDEwdjJoNnYtNmgtMlY3aDJ6TTMgM2gydjJIM1Yzem0yIDE4SDN2LTJoMnYyem0xMi0ySDd2LTJINVY3aDJWNWgxMHYyaDJ2MTBoLTJ2MnptNCAyaC0ydi0yaDJ2MnpNMTkgNVYzaDJ2MmgtMnptLTUuMjcgOWgtMy40OWwtLjczIDJINy44OWwzLjQtOWgxLjRsMy40MSA5aC0xLjYzbC0uNzQtMnptLTMuMDQtMS4yNmgyLjYxTDEyIDguOTFsLTEuMzEgMy44M3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LXNpemUiPjxwYXRoIGQ9Ik05IDR2M2g1djEyaDNWN2g1VjRIOXptLTYgOGgzdjdoM3YtN2gzVjlIM3YzeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtc3RyaWtldGhyb3VnaCI+PHBhdGggZD0iTTEwIDE5aDR2LTNoLTR2M3pNNSA0djNoNXYzaDRWN2g1VjRINXpNMyAxNGgxOHYtMkgzdjJ6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC10ZXh0ZGlyZWN0aW9uLWwtdG8tciI+PHBhdGggZD0iTTkgMTB2NWgyVjRoMnYxMWgyVjRoMlYySDlDNi43OSAyIDUgMy43OSA1IDZzMS43OSA0IDQgNHptMTIgOGwtNC00djNINXYyaDEydjNsNC00eiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtdGV4dGRpcmVjdGlvbi1yLXRvLWwiPjxwYXRoIGQ9Ik0xMCAxMHY1aDJWNGgydjExaDJWNGgyVjJoLThDNy43OSAyIDYgMy43OSA2IDZzMS43OSA0IDQgNHptLTIgN3YtM2wtNCA0IDQgNHYtM2gxMnYtMkg4eiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtdW5kZXJsaW5lZCI+PHBhdGggZD0iTTEyIDE3YzMuMzEgMCA2LTIuNjkgNi02VjNoLTIuNXY4YzAgMS45My0xLjU3IDMuNS0zLjUgMy41UzguNSAxMi45MyA4LjUgMTFWM0g2djhjMCAzLjMxIDIuNjkgNiA2IDZ6bS03IDJ2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJmdW5jdGlvbnMiPjxwYXRoIGQ9Ik0xOCA0SDZ2Mmw2LjUgNkw2IDE4djJoMTJ2LTNoLTdsNS01LTUtNWg3eiIgLz48L2c+CjxnIGlkPSJoaWdobGlnaHQiPjxwYXRoIGQ9Ik02IDE0bDMgM3Y1aDZ2LTVsMy0zVjlINnptNS0xMmgydjNoLTJ6TTMuNSA1Ljg3NUw0LjkxNCA0LjQ2bDIuMTIgMi4xMjJMNS42MiA3Ljk5N3ptMTMuNDYuNzFsMi4xMjMtMi4xMiAxLjQxNCAxLjQxNEwxOC4zNzUgOHoiIC8+PC9nPgo8ZyBpZD0iaW5zZXJ0LWNoYXJ0Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPjwvZz4KPGcgaWQ9Imluc2VydC1jb21tZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0bDQgNFY0YzAtMS4xLS45LTItMi0yem0tMiAxMkg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyeiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtZHJpdmUtZmlsZSI+PHBhdGggZD0iTTYgMmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNkg2em03IDdWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0iaW5zZXJ0LWVtb3RpY29uIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0zLjUtOWMuODMgMCAxLjUtLjY3IDEuNS0xLjVTMTYuMzMgOCAxNS41IDggMTQgOC42NyAxNCA5LjVzLjY3IDEuNSAxLjUgMS41em0tNyAwYy44MyAwIDEuNS0uNjcgMS41LTEuNVM5LjMzIDggOC41IDggNyA4LjY3IDcgOS41IDcuNjcgMTEgOC41IDExem0zLjUgNi41YzIuMzMgMCA0LjMxLTEuNDYgNS4xMS0zLjVINi44OWMuOCAyLjA0IDIuNzggMy41IDUuMTEgMy41eiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtaW52aXRhdGlvbiI+PHBhdGggZD0iTTE3IDEyaC01djVoNXYtNXpNMTYgMXYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yaC0xVjFoLTJ6bTMgMThINVY4aDE0djExeiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtbGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtcGhvdG8iPjxwYXRoIGQ9Ik0yMSAxOVY1YzAtMS4xLS45LTItMi0ySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ6TTguNSAxMy41bDIuNSAzLjAxTDE0LjUgMTJsNC41IDZINWwzLjUtNC41eiIgLz48L2c+CjxnIGlkPSJsaW5lYXItc2NhbGUiPjxwYXRoIGQ9Ik0xOS41IDkuNWMtMS4wMyAwLTEuOS42Mi0yLjI5IDEuNWgtMi45MmMtLjM5LS44OC0xLjI2LTEuNS0yLjI5LTEuNXMtMS45LjYyLTIuMjkgMS41SDYuNzljLS4zOS0uODgtMS4yNi0xLjUtMi4yOS0xLjVDMy4xMiA5LjUgMiAxMC42MiAyIDEyczEuMTIgMi41IDIuNSAyLjVjMS4wMyAwIDEuOS0uNjIgMi4yOS0xLjVoMi45MmMuMzkuODggMS4yNiAxLjUgMi4yOSAxLjVzMS45LS42MiAyLjI5LTEuNWgyLjkyYy4zOS44OCAxLjI2IDEuNSAyLjI5IDEuNSAxLjM4IDAgMi41LTEuMTIgMi41LTIuNXMtMS4xMi0yLjUtMi41LTIuNXoiIC8+PC9nPgo8ZyBpZD0ibWVyZ2UtdHlwZSI+PHBhdGggZD0iTTE3IDIwLjQxTDE4LjQxIDE5IDE1IDE1LjU5IDEzLjU5IDE3IDE3IDIwLjQxek03LjUgOEgxMXY1LjU5TDUuNTkgMTkgNyAyMC40MWw2LTZWOGgzLjVMMTIgMy41IDcuNSA4eiIgLz48L2c+CjxnIGlkPSJtb2RlLWNvbW1lbnQiPjxwYXRoIGQ9Ik0yMS45OSA0YzAtMS4xLS44OS0yLTEuOTktMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0bDQgNC0uMDEtMTh6IiAvPjwvZz4KPGcgaWQ9Im1vZGUtZWRpdCI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiIC8+PC9nPgo8ZyBpZD0ibW9uZXRpemF0aW9uLW9uIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMS40MSAxNi4wOVYyMGgtMi42N3YtMS45M2MtMS43MS0uMzYtMy4xNi0xLjQ2LTMuMjctMy40aDEuOTZjLjEgMS4wNS44MiAxLjg3IDIuNjUgMS44NyAxLjk2IDAgMi40LS45OCAyLjQtMS41OSAwLS44My0uNDQtMS42MS0yLjY3LTIuMTQtMi40OC0uNi00LjE4LTEuNjItNC4xOC0zLjY3IDAtMS43MiAxLjM5LTIuODQgMy4xMS0zLjIxVjRoMi42N3YxLjk1YzEuODYuNDUgMi43OSAxLjg2IDIuODUgMy4zOUgxNC4zYy0uMDUtMS4xMS0uNjQtMS44Ny0yLjIyLTEuODctMS41IDAtMi40LjY4LTIuNCAxLjY0IDAgLjg0LjY1IDEuMzkgMi42NyAxLjkxczQuMTggMS4zOSA0LjE4IDMuOTFjLS4wMSAxLjgzLTEuMzggMi44My0zLjEyIDMuMTZ6IiAvPjwvZz4KPGcgaWQ9Im1vbmV5LW9mZiI+PHBhdGggZD0iTTEyLjUgNi45YzEuNzggMCAyLjQ0Ljg1IDIuNSAyLjFoMi4yMWMtLjA3LTEuNzItMS4xMi0zLjMtMy4yMS0zLjgxVjNoLTN2Mi4xNmMtLjUzLjEyLTEuMDMuMy0xLjQ4LjU0bDEuNDcgMS40N2MuNDEtLjE3LjkxLS4yNyAxLjUxLS4yN3pNNS4zMyA0LjA2TDQuMDYgNS4zMyA3LjUgOC43N2MwIDIuMDggMS41NiAzLjIxIDMuOTEgMy45MWwzLjUxIDMuNTFjLS4zNC40OC0xLjA1LjkxLTIuNDIuOTEtMi4wNiAwLTIuODctLjkyLTIuOTgtMi4xaC0yLjJjLjEyIDIuMTkgMS43NiAzLjQyIDMuNjggMy44M1YyMWgzdi0yLjE1Yy45Ni0uMTggMS44Mi0uNTUgMi40NS0xLjEybDIuMjIgMi4yMiAxLjI3LTEuMjdMNS4zMyA0LjA2eiIgLz48L2c+CjxnIGlkPSJtdWx0aWxpbmUtY2hhcnQiPjxwYXRoIGQ9Ik0yMiA2LjkybC0xLjQxLTEuNDEtMi44NSAzLjIxQzE1LjY4IDYuNCAxMi44MyA1IDkuNjEgNSA2LjcyIDUgNC4wNyA2LjE2IDIgOGwxLjQyIDEuNDJDNS4xMiA3LjkzIDcuMjcgNyA5LjYxIDdjMi43NCAwIDUuMDkgMS4yNiA2Ljc3IDMuMjRsLTIuODggMy4yNC00LTRMMiAxNi45OWwxLjUgMS41IDYtNi4wMSA0IDQgNC4wNS00LjU1Yy43NSAxLjM1IDEuMjUgMi45IDEuNDQgNC41NUgyMWMtLjIyLTIuMy0uOTUtNC4zOS0yLjA0LTYuMTRMMjIgNi45MnoiIC8+PC9nPgo8ZyBpZD0icGllLWNoYXJ0Ij48cGF0aCBkPSJNMTEgMnYyMGMtNS4wNy0uNS05LTQuNzktOS0xMHMzLjkzLTkuNSA5LTEwem0yLjAzIDB2OC45OUgyMmMtLjQ3LTQuNzQtNC4yNC04LjUyLTguOTctOC45OXptMCAxMS4wMVYyMmM0Ljc0LS40NyA4LjUtNC4yNSA4Ljk3LTguOTloLTguOTd6IiAvPjwvZz4KPGcgaWQ9InBpZS1jaGFydC1vdXRsaW5lZCI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem0xIDIuMDdjMy42MS40NSA2LjQ4IDMuMzMgNi45MyA2LjkzSDEzVjQuMDd6TTQgMTJjMC00LjA2IDMuMDctNy40NCA3LTcuOTN2MTUuODdjLTMuOTMtLjUtNy0zLjg4LTctNy45NHptOSA3LjkzVjEzaDYuOTNjLS40NSAzLjYxLTMuMzIgNi40OC02LjkzIDYuOTN6IiAvPjwvZz4KPGcgaWQ9InB1Ymxpc2giPjxwYXRoIGQ9Ik01IDR2MmgxNFY0SDV6bTAgMTBoNHY2aDZ2LTZoNGwtNy03LTcgN3oiIC8+PC9nPgo8ZyBpZD0ic2hvcnQtdGV4dCI+PHBhdGggZD0iTTQgOWgxNnYySDR6bTAgNGgxMHYySDR6IiAvPjwvZz4KPGcgaWQ9InNob3ctY2hhcnQiPjxwYXRoIGQ9Ik0zLjUgMTguNDlsNi02LjAxIDQgNEwyMiA2LjkybC0xLjQxLTEuNDEtNy4wOSA3Ljk3LTQtNEwyIDE2Ljk5eiIgLz48L2c+CjxnIGlkPSJzcGFjZS1iYXIiPjxwYXRoIGQ9Ik0xOCA5djRINlY5SDR2NmgxNlY5eiIgLz48L2c+CjxnIGlkPSJzdHJpa2V0aHJvdWdoLXMiPjxwYXRoIGQ9Ik03LjI0IDguNzVjLS4yNi0uNDgtLjM5LTEuMDMtLjM5LTEuNjcgMC0uNjEuMTMtMS4xNi40LTEuNjcuMjYtLjUuNjMtLjkzIDEuMTEtMS4yOS40OC0uMzUgMS4wNS0uNjMgMS43LS44My42Ni0uMTkgMS4zOS0uMjkgMi4xOC0uMjkuODEgMCAxLjU0LjExIDIuMjEuMzQuNjYuMjIgMS4yMy41NCAxLjY5Ljk0LjQ3LjQuODMuODggMS4wOCAxLjQzLjI1LjU1LjM4IDEuMTUuMzggMS44MWgtMy4wMWMwLS4zMS0uMDUtLjU5LS4xNS0uODUtLjA5LS4yNy0uMjQtLjQ5LS40NC0uNjgtLjItLjE5LS40NS0uMzMtLjc1LS40NC0uMy0uMS0uNjYtLjE2LTEuMDYtLjE2LS4zOSAwLS43NC4wNC0xLjAzLjEzLS4yOS4wOS0uNTMuMjEtLjcyLjM2LS4xOS4xNi0uMzQuMzQtLjQ0LjU1LS4xLjIxLS4xNS40My0uMTUuNjYgMCAuNDguMjUuODguNzQgMS4yMS4zOC4yNS43Ny40OCAxLjQxLjdINy4zOWMtLjA1LS4wOC0uMTEtLjE3LS4xNS0uMjV6TTIxIDEydi0ySDN2Mmg5LjYyYy4xOC4wNy40LjE0LjU1LjIuMzcuMTcuNjYuMzQuODcuNTEuMjEuMTcuMzUuMzYuNDMuNTcuMDcuMi4xMS40My4xMS42OSAwIC4yMy0uMDUuNDUtLjE0LjY2LS4wOS4yLS4yMy4zOC0uNDIuNTMtLjE5LjE1LS40Mi4yNi0uNzEuMzUtLjI5LjA4LS42My4xMy0xLjAxLjEzLS40MyAwLS44My0uMDQtMS4xOC0uMTNzLS42Ni0uMjMtLjkxLS40MmMtLjI1LS4xOS0uNDUtLjQ0LS41OS0uNzUtLjE0LS4zMS0uMjUtLjc2LS4yNS0xLjIxSDYuNGMwIC41NS4wOCAxLjEzLjI0IDEuNTguMTYuNDUuMzcuODUuNjUgMS4yMS4yOC4zNS42LjY2Ljk4LjkyLjM3LjI2Ljc4LjQ4IDEuMjIuNjUuNDQuMTcuOS4zIDEuMzguMzkuNDguMDguOTYuMTMgMS40NC4xMy44IDAgMS41My0uMDkgMi4xOC0uMjhzMS4yMS0uNDUgMS42Ny0uNzljLjQ2LS4zNC44Mi0uNzcgMS4wNy0xLjI3cy4zOC0xLjA3LjM4LTEuNzFjMC0uNi0uMS0xLjE0LS4zMS0xLjYxLS4wNS0uMTEtLjExLS4yMy0uMTctLjMzSDIxeiIgLz48L2c+CjxnIGlkPSJ0ZXh0LWZpZWxkcyI+PHBhdGggZD0iTTIuNSA0djNoNXYxMmgzVjdoNVY0aC0xM3ptMTkgNWgtOXYzaDN2N2gzdi03aDNWOXoiIC8+PC9nPgo8ZyBpZD0idGl0bGUiPjxwYXRoIGQ9Ik01IDR2M2g1LjV2MTJoM1Y3SDE5VjR6IiAvPjwvZz4KPGcgaWQ9InZlcnRpY2FsLWFsaWduLWJvdHRvbSI+PHBhdGggZD0iTTE2IDEzaC0zVjNoLTJ2MTBIOGw0IDQgNC00ek00IDE5djJoMTZ2LTJINHoiIC8+PC9nPgo8ZyBpZD0idmVydGljYWwtYWxpZ24tY2VudGVyIj48cGF0aCBkPSJNOCAxOWgzdjRoMnYtNGgzbC00LTQtNCA0em04LTE0aC0zVjFoLTJ2NEg4bDQgNCA0LTR6TTQgMTF2MmgxNnYtMkg0eiIgLz48L2c+CjxnIGlkPSJ2ZXJ0aWNhbC1hbGlnbi10b3AiPjxwYXRoIGQ9Ik04IDExaDN2MTBoMlYxMWgzbC00LTQtNCA0ek00IDN2MmgxNlYzSDR6IiAvPjwvZz4KPGcgaWQ9IndyYXAtdGV4dCI+PHBhdGggZD0iTTQgMTloNnYtMkg0djJ6TTIwIDVINHYyaDE2VjV6bS0zIDZINHYyaDEzLjI1YzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMkgxNXYtMmwtMyAzIDMgM3YtMmgyYzIuMjEgMCA0LTEuNzkgNC00cy0xLjc5LTQtNC00eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJoYXJkd2FyZSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2FzdCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2M2gyVjVoMTh2MTRoLTd2Mmg3YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTEgMTh2M2gzYzAtMS42Ni0xLjM0LTMtMy0zem0wLTR2MmMyLjc2IDAgNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0wLTR2MmM0Ljk3IDAgOSA0LjAzIDkgOWgyYzAtNi4wOC00LjkzLTExLTExLTExeiIgLz48L2c+CjxnIGlkPSJjYXN0LWNvbm5lY3RlZCI+PHBhdGggZD0iTTEgMTh2M2gzYzAtMS42Ni0xLjM0LTMtMy0zem0wLTR2MmMyLjc2IDAgNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xOC03SDV2MS42M2MzLjk2IDEuMjggNy4wOSA0LjQxIDguMzcgOC4zN0gxOVY3ek0xIDEwdjJjNC45NyAwIDkgNC4wMyA5IDloMmMwLTYuMDgtNC45My0xMS0xMS0xMXptMjAtN0gzYy0xLjEgMC0yIC45LTIgMnYzaDJWNWgxOHYxNGgtN3YyaDdjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iY29tcHV0ZXIiPjxwYXRoIGQ9Ik0yMCAxOGMxLjEgMCAxLjk5LS45IDEuOTktMkwyMiA2YzAtMS4xLS45LTItMi0ySDRjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJIMHYyaDI0di0yaC00ek00IDZoMTZ2MTBINFY2eiIgLz48L2c+CjxnIGlkPSJkZXNrdG9wLW1hYyI+PHBhdGggZD0iTTIxIDJIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg3bC0yIDN2MWg4di0xbC0yLTNoN2MxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0wIDEySDNWNGgxOHYxMHoiIC8+PC9nPgo8ZyBpZD0iZGVza3RvcC13aW5kb3dzIj48cGF0aCBkPSJNMjEgMkgzYy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDd2Mkg4djJoOHYtMmgtMnYtMmg3YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bTAgMTRIM1Y0aDE4djEyeiIgLz48L2c+CjxnIGlkPSJkZXZlbG9wZXItYm9hcmQiPjxwYXRoIGQ9Ik0yMiA5VjdoLTJWNWMwLTEuMS0uOS0yLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi0yaDJ2LTJoLTJ2LTJoMnYtMmgtMlY5aDJ6bS00IDEwSDRWNWgxNHYxNHpNNiAxM2g1djRINnptNi02aDR2M2gtNHpNNiA3aDV2NUg2em02IDRoNHY2aC00eiIgLz48L2c+CjxnIGlkPSJkZXZpY2UtaHViIj48cGF0aCBkPSJNMTcgMTZsLTQtNFY4LjgyQzE0LjE2IDguNCAxNSA3LjMgMTUgNmMwLTEuNjYtMS4zNC0zLTMtM1M5IDQuMzQgOSA2YzAgMS4zLjg0IDIuNCAyIDIuODJWMTJsLTQgNEgzdjVoNXYtMy4wNWw0LTQuMiA0IDQuMlYyMWg1di01aC00eiIgLz48L2c+CjxnIGlkPSJkZXZpY2VzLW90aGVyIj48cGF0aCBkPSJNMyA2aDE4VjRIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg0di0ySDNWNnptMTAgNkg5djEuNzhjLS42MS41NS0xIDEuMzMtMSAyLjIycy4zOSAxLjY3IDEgMi4yMlYyMGg0di0xLjc4Yy42MS0uNTUgMS0xLjM0IDEtMi4yMnMtLjM5LTEuNjctMS0yLjIyVjEyem0tMiA1LjVjLS44MyAwLTEuNS0uNjctMS41LTEuNXMuNjctMS41IDEuNS0xLjUgMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41ek0yMiA4aC02Yy0uNSAwLTEgLjUtMSAxdjEwYzAgLjUuNSAxIDEgMWg2Yy41IDAgMS0uNSAxLTFWOWMwLS41LS41LTEtMS0xem0tMSAxMGgtNHYtOGg0djh6IiAvPjwvZz4KPGcgaWQ9ImRvY2siPjxwYXRoIGQ9Ik04IDIzaDh2LTJIOHYyem04LTIxLjk5TDggMWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE1SDhWNWg4djEweiIgLz48L2c+CjxnIGlkPSJnYW1lcGFkIj48cGF0aCBkPSJNMTUgNy41VjJIOXY1LjVsMyAzIDMtM3pNNy41IDlIMnY2aDUuNWwzLTMtMy0zek05IDE2LjVWMjJoNnYtNS41bC0zLTMtMyAzek0xNi41IDlsLTMgMyAzIDNIMjJWOWgtNS41eiIgLz48L2c+CjxnIGlkPSJoZWFkc2V0Ij48cGF0aCBkPSJNMTIgMWMtNC45NyAwLTkgNC4wMy05IDl2N2MwIDEuNjYgMS4zNCAzIDMgM2gzdi04SDV2LTJjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgN3YyaC00djhoM2MxLjY2IDAgMy0xLjM0IDMtM3YtN2MwLTQuOTctNC4wMy05LTktOXoiIC8+PC9nPgo8ZyBpZD0iaGVhZHNldC1taWMiPjxwYXRoIGQ9Ik0xMiAxYy00Ljk3IDAtOSA0LjAzLTkgOXY3YzAgMS42NiAxLjM0IDMgMyAzaDN2LThINXYtMmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3djJoLTR2OGg0djFoLTd2Mmg2YzEuNjYgMCAzLTEuMzQgMy0zVjEwYzAtNC45Ny00LjAzLTktOS05eiIgLz48L2c+CjxnIGlkPSJrZXlib2FyZCI+PHBhdGggZD0iTTIwIDVINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE3YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptLTkgM2gydjJoLTJWOHptMCAzaDJ2MmgtMnYtMnpNOCA4aDJ2Mkg4Vjh6bTAgM2gydjJIOHYtMnptLTEgMkg1di0yaDJ2MnptMC0zSDVWOGgydjJ6bTkgN0g4di0yaDh2MnptMC00aC0ydi0yaDJ2MnptMC0zaC0yVjhoMnYyem0zIDNoLTJ2LTJoMnYyem0wLTNoLTJWOGgydjJ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLWFycm93LWRvd24iPjxwYXRoIGQ9Ik03LjQxIDcuODRMMTIgMTIuNDJsNC41OS00LjU4TDE4IDkuMjVsLTYgNi02LTZ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLWFycm93LWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSAxNi4wOWwtNC41OC00LjU5IDQuNTgtNC41OUwxNCA1LjVsLTYgNiA2IDZ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLWFycm93LXJpZ2h0Ij48cGF0aCBkPSJNOC41OSAxNi4zNGw0LjU4LTQuNTktNC41OC00LjU5TDEwIDUuNzVsNiA2LTYgNnoiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtYXJyb3ctdXAiPjxwYXRoIGQ9Ik03LjQxIDE1LjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNGwtNi02LTYgNnoiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtYmFja3NwYWNlIj48cGF0aCBkPSJNMjEgMTFINi44M2wzLjU4LTMuNTlMOSA2bC02IDYgNiA2IDEuNDEtMS40MUw2LjgzIDEzSDIxeiIgLz48L2c+CjxnIGlkPSJrZXlib2FyZC1jYXBzbG9jayI+PHBhdGggZD0iTTEyIDguNDFMMTYuNTkgMTMgMTggMTEuNTlsLTYtNi02IDZMNy40MSAxMyAxMiA4LjQxek02IDE4aDEydi0ySDZ2MnoiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtaGlkZSI+PHBhdGggZD0iTTIwIDNINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE1YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTkgM2gydjJoLTJWNnptMCAzaDJ2MmgtMlY5ek04IDZoMnYySDhWNnptMCAzaDJ2Mkg4Vjl6bS0xIDJINVY5aDJ2MnptMC0zSDVWNmgydjJ6bTkgN0g4di0yaDh2MnptMC00aC0yVjloMnYyem0wLTNoLTJWNmgydjJ6bTMgM2gtMlY5aDJ2MnptMC0zaC0yVjZoMnYyem0tNyAxNWw0LTRIOGw0IDR6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLXJldHVybiI+PHBhdGggZD0iTTE5IDd2NEg1LjgzbDMuNTgtMy41OUw4IDZsLTYgNiA2IDYgMS40MS0xLjQxTDUuODMgMTNIMjFWN3oiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtdGFiIj48cGF0aCBkPSJNMTEuNTkgNy40MUwxNS4xNyAxMUgxdjJoMTQuMTdsLTMuNTkgMy41OUwxMyAxOGw2LTYtNi02LTEuNDEgMS40MXpNMjAgNnYxMmgyVjZoLTJ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLXZvaWNlIj48cGF0aCBkPSJNMTIgMTVjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNmMwLTEuNjYtMS4zNC0zLTMtM1M5IDQuMzQgOSA2djZjMCAxLjY2IDEuMzQgMyAzIDN6bTUuMy0zYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNSA2LjcgMTJINWMwIDMuNDIgMi43MiA2LjIzIDYgNi43MlYyMmgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIgLz48L2c+CjxnIGlkPSJsYXB0b3AiPjxwYXRoIGQ9Ik0yMCAxOGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0ySDRjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJIMHYyaDI0di0yaC00ek00IDZoMTZ2MTBINFY2eiIgLz48L2c+CjxnIGlkPSJsYXB0b3AtY2hyb21lYm9vayI+PHBhdGggZD0iTTIyIDE4VjNIMnYxNUgwdjJoMjR2LTJoLTJ6bS04IDBoLTR2LTFoNHYxem02LTNINFY1aDE2djEweiIgLz48L2c+CjxnIGlkPSJsYXB0b3AtbWFjIj48cGF0aCBkPSJNMjAgMThjMS4xIDAgMS45OS0uOSAxLjk5LTJMMjIgNWMwLTEuMS0uOS0yLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAySDBjMCAxLjEuOSAyIDIgMmgyMGMxLjEgMCAyLS45IDItMmgtNHpNNCA1aDE2djExSDRWNXptOCAxNGMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiIgLz48L2c+CjxnIGlkPSJsYXB0b3Atd2luZG93cyI+PHBhdGggZD0iTTIwIDE4di0xYzEuMSAwIDEuOTktLjkgMS45OS0yTDIyIDVjMC0xLjEtLjktMi0yLTJINGMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMnYxSDB2MmgyNHYtMmgtNHpNNCA1aDE2djEwSDRWNXoiIC8+PC9nPgo8ZyBpZD0ibWVtb3J5Ij48cGF0aCBkPSJNMTUgOUg5djZoNlY5em0tMiA0aC0ydi0yaDJ2MnptOC0yVjloLTJWN2MwLTEuMS0uOS0yLTItMmgtMlYzaC0ydjJoLTJWM0g5djJIN2MtMS4xIDAtMiAuOS0yIDJ2MkgzdjJoMnYySDN2MmgydjJjMCAxLjEuOSAyIDIgMmgydjJoMnYtMmgydjJoMnYtMmgyYzEuMSAwIDItLjkgMi0ydi0yaDJ2LTJoLTJ2LTJoMnptLTQgNkg3VjdoMTB2MTB6IiAvPjwvZz4KPGcgaWQ9Im1vdXNlIj48cGF0aCBkPSJNMTMgMS4wN1Y5aDdjMC00LjA4LTMuMDUtNy40NC03LTcuOTN6TTQgMTVjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOHYtNEg0djR6bTctMTMuOTNDNy4wNSAxLjU2IDQgNC45MiA0IDloN1YxLjA3eiIgLz48L2c+CjxnIGlkPSJwaG9uZS1hbmRyb2lkIj48cGF0aCBkPSJNMTYgMUg4QzYuMzQgMSA1IDIuMzQgNSA0djE2YzAgMS42NiAxLjM0IDMgMyAzaDhjMS42NiAwIDMtMS4zNCAzLTNWNGMwLTEuNjYtMS4zNC0zLTMtM3ptLTIgMjBoLTR2LTFoNHYxem0zLjI1LTNINi43NVY0aDEwLjV2MTR6IiAvPjwvZz4KPGcgaWQ9InBob25lLWlwaG9uZSI+PHBhdGggZD0iTTE1LjUgMWgtOEM2LjEyIDEgNSAyLjEyIDUgMy41djE3QzUgMjEuODggNi4xMiAyMyA3LjUgMjNoOGMxLjM4IDAgMi41LTEuMTIgMi41LTIuNXYtMTdDMTggMi4xMiAxNi44OCAxIDE1LjUgMXptLTQgMjFjLS44MyAwLTEuNS0uNjctMS41LTEuNXMuNjctMS41IDEuNS0xLjUgMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41em00LjUtNEg3VjRoOXYxNHoiIC8+PC9nPgo8ZyBpZD0icGhvbmVsaW5rIj48cGF0aCBkPSJNNCA2aDE4VjRINGMtMS4xIDAtMiAuOS0yIDJ2MTFIMHYzaDE0di0zSDRWNnptMTkgMmgtNmMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xVjljMC0uNTUtLjQ1LTEtMS0xem0tMSA5aC00di03aDR2N3oiIC8+PC9nPgo8ZyBpZD0icGhvbmVsaW5rLW9mZiI+PHBhdGggZD0iTTIyIDZWNEg2LjgybDIgMkgyMnpNMS45MiAxLjY1TC42NSAyLjkybDEuODIgMS44MkMyLjE4IDUuMDggMiA1LjUyIDIgNnYxMUgwdjNoMTcuNzNsMi4zNSAyLjM1IDEuMjctMS4yN0wzLjg5IDMuNjIgMS45MiAxLjY1ek00IDYuMjdMMTQuNzMgMTdINFY2LjI3ek0yMyA4aC02Yy0uNTUgMC0xIC40NS0xIDF2NC4xOGwyIDJWMTBoNHY3aC0yLjE4bDMgM0gyM2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9InBvd2VyLWlucHV0Ij48cGF0aCBkPSJNMiA5djJoMTlWOUgyem0wIDZoNXYtMkgydjJ6bTcgMGg1di0ySDl2MnptNyAwaDV2LTJoLTV2MnoiIC8+PC9nPgo8ZyBpZD0icm91dGVyIj48cGF0aCBkPSJNMjAuMiA1LjlsLjgtLjhDMTkuNiAzLjcgMTcuOCAzIDE2IDNzLTMuNi43LTUgMi4xbC44LjhDMTMgNC44IDE0LjUgNC4yIDE2IDQuMnMzIC42IDQuMiAxLjd6bS0uOS44Yy0uOS0uOS0yLjEtMS40LTMuMy0xLjRzLTIuNC41LTMuMyAxLjRsLjguOGMuNy0uNyAxLjYtMSAyLjUtMSAuOSAwIDEuOC4zIDIuNSAxbC44LS44ek0xOSAxM2gtMlY5aC0ydjRINWMtMS4xIDAtMiAuOS0yIDJ2NGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi00YzAtMS4xLS45LTItMi0yek04IDE4SDZ2LTJoMnYyem0zLjUgMGgtMnYtMmgydjJ6bTMuNSAwaC0ydi0yaDJ2MnoiIC8+PC9nPgo8ZyBpZD0ic2Nhbm5lciI+PHBhdGggZD0iTTE5LjggMTAuN0w0LjIgNWwtLjcgMS45TDE3LjYgMTJINWMtMS4xIDAtMiAuOS0yIDJ2NGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi01LjVjMC0uOC0uNS0xLjYtMS4yLTEuOHpNNyAxN0g1di0yaDJ2MnptMTIgMEg5di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InNlY3VyaXR5Ij48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bTAgMTAuOTloN2MtLjUzIDQuMTItMy4yOCA3Ljc5LTcgOC45NFYxMkg1VjYuM2w3LTMuMTF2OC44eiIgLz48L2c+CjxnIGlkPSJzaW0tY2FyZCI+PHBhdGggZD0iTTE5Ljk5IDRjMC0xLjEtLjg5LTItMS45OS0yaC04TDQgOHYxMmMwIDEuMS45IDIgMiAyaDEyLjAxYzEuMSAwIDEuOTktLjkgMS45OS0ybC0uMDEtMTZ6TTkgMTlIN3YtMmgydjJ6bTggMGgtMnYtMmgydjJ6bS04LTRIN3YtNGgydjR6bTQgNGgtMnYtNGgydjR6bTAtNmgtMnYtMmgydjJ6bTQgMmgtMnYtNGgydjR6IiAvPjwvZz4KPGcgaWQ9InNtYXJ0cGhvbmUiPjxwYXRoIGQ9Ik0xNyAxLjAxTDcgMWMtMS4xIDAtMiAuOS0yIDJ2MThjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InNwZWFrZXIiPjxwYXRoIGQ9Ik0xNyAySDdjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMS45OSAyIDEuOTlMMTcgMjJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTUgMmMxLjEgMCAyIC45IDIgMnMtLjkgMi0yIDJjLTEuMTEgMC0yLS45LTItMnMuODktMiAyLTJ6bTAgMTZjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLWdyb3VwIj48cGF0aCBkPSJNMTguMiAxSDkuOEM4LjgxIDEgOCAxLjgxIDggMi44djE0LjRjMCAuOTkuODEgMS43OSAxLjggMS43OWw4LjQuMDFjLjk5IDAgMS44LS44MSAxLjgtMS44VjIuOGMwLS45OS0uODEtMS44LTEuOC0xLjh6TTE0IDNjMS4xIDAgMiAuODkgMiAycy0uOSAyLTIgMi0yLS44OS0yLTIgLjktMiAyLTJ6bTAgMTMuNWMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNCA0IDEuNzkgNCA0LTEuNzkgNC00IDR6IiAvPjxjaXJjbGUgY3g9IjE0IiBjeT0iMTIuNSIgcj0iMi41IiAvPjxwYXRoIGQ9Ik02IDVINHYxNmMwIDEuMS44OSAyIDIgMmgxMHYtMkg2VjV6IiAvPjwvZz4KPGcgaWQ9InRhYmxldCI+PHBhdGggZD0iTTIxIDRIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAxLjk5LS45IDEuOTktMkwyMyA2YzAtMS4xLS45LTItMi0yem0tMiAxNEg1VjZoMTR2MTJ6IiAvPjwvZz4KPGcgaWQ9InRhYmxldC1hbmRyb2lkIj48cGF0aCBkPSJNMTggMEg2QzQuMzQgMCAzIDEuMzQgMyAzdjE4YzAgMS42NiAxLjM0IDMgMyAzaDEyYzEuNjYgMCAzLTEuMzQgMy0zVjNjMC0xLjY2LTEuMzQtMy0zLTN6bS00IDIyaC00di0xaDR2MXptNS4yNS0zSDQuNzVWM2gxNC41djE2eiIgLz48L2c+CjxnIGlkPSJ0YWJsZXQtbWFjIj48cGF0aCBkPSJNMTguNSAwaC0xNEMzLjEyIDAgMiAxLjEyIDIgMi41djE5QzIgMjIuODggMy4xMiAyNCA0LjUgMjRoMTRjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjV2LTE5QzIxIDEuMTIgMTkuODggMCAxOC41IDB6bS03IDIzYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXptNy41LTRINFYzaDE1djE2eiIgLz48L2c+CjxnIGlkPSJ0b3lzIj48cGF0aCBkPSJNMTIgMTJjMC0zIDIuNS01LjUgNS41LTUuNVMyMyA5IDIzIDEySDEyem0wIDBjMCAzLTIuNSA1LjUtNS41IDUuNVMxIDE1IDEgMTJoMTF6bTAgMGMtMyAwLTUuNS0yLjUtNS41LTUuNVM5IDEgMTIgMXYxMXptMCAwYzMgMCA1LjUgMi41IDUuNSA1LjVTMTUgMjMgMTIgMjNWMTJ6IiAvPjwvZz4KPGcgaWQ9InR2Ij48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDV2Mmg4di0yaDVjMS4xIDAgMS45OS0uOSAxLjk5LTJMMjMgNWMwLTEuMS0uOS0yLTItMnptMCAxNEgzVjVoMTh2MTJ6IiAvPjwvZz4KPGcgaWQ9InZpZGVvZ2FtZS1hc3NldCI+PHBhdGggZD0iTTIxIDZIM2MtMS4xIDAtMiAuOS0yIDJ2OGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS0xMCA3SDh2M0g2di0zSDN2LTJoM1Y4aDJ2M2gzdjJ6bTQuNSAyYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXptNC0zYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTguNjcgOSAxOS41IDlzMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41eiIgLz48L2c+CjxnIGlkPSJ3YXRjaCI+PHBhdGggZD0iTTIwIDEyYzAtMi41NC0xLjE5LTQuODEtMy4wNC02LjI3TDE2IDBIOGwtLjk1IDUuNzNDNS4xOSA3LjE5IDQgOS40NSA0IDEyczEuMTkgNC44MSAzLjA1IDYuMjdMOCAyNGg4bC45Ni01LjczQzE4LjgxIDE2LjgxIDIwIDE0LjU0IDIwIDEyek02IDEyYzAtMy4zMSAyLjY5LTYgNi02czYgMi42OSA2IDYtMi42OSA2LTYgNi02LTIuNjktNi02eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLXBhZ2VzIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKDpub3Qoc2xvdCk6bm90KC5pcm9uLXNlbGVjdGVkKSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L2lyb24tcGFnZXMvaXJvbi1wYWdlcy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLXBhZ2VzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbGlua10pIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudGFiLWNvbnRlbnQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50OwogICAgICB9CgogICAgICA6aG9zdCg6bm90KC5pcm9uLXNlbGVjdGVkKSkgPiAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDAuODsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQtdW5zZWxlY3RlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdGFiLWluaywgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50ID4gOjpzbG90dGVkKGEpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItdGFicy9wYXBlci10YWIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFiIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e2xpbms6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFiIn0sbGlzdGVuZXJzOntkb3duOiJfdXBkYXRlTm9pbmsiLHRhcDoiX29uVGFwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVOb2luaygpfSxnZXQgX3BhcmVudE5vaW5rKCl7dmFyIGE9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTtyZXR1cm4hIWEmJiEhYS5ub2lua30sX3VwZGF0ZU5vaW5rOmZ1bmN0aW9uKCl7dGhpcy5ub2luaz0hIXRoaXMubm9pbmt8fCEhdGhpcy5fcGFyZW50Tm9pbmt9LF9vblRhcDpmdW5jdGlvbihhKXtpZih0aGlzLmxpbmspe3ZhciBjPXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigiYSIpOwpjJiZhLnRhcmdldCE9PWMmJmMuY2xpY2soKX19fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJwYXBlci10YWJzIiBzaXplPSIyNCI+Cjxzdmc+PGRlZnM+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRhYnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoKICAgICAgICAvKiBOT1RFOiBCb3RoIHZhbHVlcyBhcmUgbmVlZGVkLCBzaW5jZSBzb21lIHBob25lcyByZXF1aXJlIHRoZSB2YWx1ZSB0byBiZSBgdHJhbnNwYXJlbnRgLiAqLwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOwogICAgICB9CgogICAgICAjdGFic0NvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLW1vei1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIC1tcy1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250ZW50OwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudDpub3QoLnNjcm9sbGFibGUpLAogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgbWluLXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyID4gOjpzbG90dGVkKCopIHsKICAgICAgICAvKiBJRSAtIHByZXZlbnQgdGFicyBmcm9tIGNvbXByZXNzaW5nIHdoZW4gdGhleSBzaG91bGQgc2Nyb2xsLiAqLwogICAgICAgIC1tcy1mbGV4OiAxIDAgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMCBhdXRvOwogICAgICAgIGZsZXg6IDEgMCBhdXRvOwogICAgICB9CgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAubm90LXZpc2libGUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yLCB2YXIoLS1wYXBlci15ZWxsb3ctYTEwMCkpOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXI7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuYWxpZ24tYm90dG9tIHsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmV4cGFuZCB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xNXM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuY29udHJhY3QgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wLCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCA+IDo6c2xvdHRlZCg6bm90KCNzZWxlY3Rpb25CYXIpKSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tbGVmdCIgY2xhc3MkPSJbW19jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3MoX2xlZnRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vbkxlZnRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogICAgPGRpdiBpZD0idGFic0NvbnRhaW5lciIgb24tdHJhY2s9Il9zY3JvbGwiIG9uLWRvd249Il9kb3duIj4KICAgICAgPGRpdiBpZD0idGFic0NvbnRlbnQiIGNsYXNzJD0iW1tfY29tcHV0ZVRhYnNDb250ZW50Q2xhc3Moc2Nyb2xsYWJsZSwgZml0Q29udGFpbmVyKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzZWxlY3Rpb25CYXIiIGNsYXNzJD0iW1tfY29tcHV0ZVNlbGVjdGlvbkJhckNsYXNzKG5vQmFyLCBhbGlnbkJvdHRvbSldXSIgb24tdHJhbnNpdGlvbmVuZD0iX29uQmFyVHJhbnNpdGlvbkVuZCI+PC9kaXY+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tcmlnaHQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9yaWdodEhpZGRlbiwgc2Nyb2xsYWJsZSwgaGlkZVNjcm9sbEJ1dHRvbnMpXV0iIG9uLXVwPSJfb25TY3JvbGxCdXR0b25VcCIgb24tZG93bj0iX29uUmlnaHRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9wYXBlci10YWJzL3BhcGVyLXRhYnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLHByb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxub0Jhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub1NsaWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZml0Q29udGFpbmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVEcmFnOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGVTY3JvbGxCdXR0b25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsaWduQm90dG9tOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci10YWIifSxhdXRvc2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9zZWxlY3REZWxheTp7dHlwZTpOdW1iZXIsCnZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGw7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT0Kdm9pZCAwO3RoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihhKXtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKGE/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7YS5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbihhKXthLnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sCl9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiFjfHxkPyJoaWRkZW4iOmE/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE/InNjcm9sbGFibGUiKyhjPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT8iaGlkZGVuIjpjPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKTt0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0sMTApfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMuX3RhYkNoYW5nZWQoYS5kZXRhaWwuaXRlbSx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9YS5kZXRhaWwuaXRlbTsKdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoInRhYi1jaGFuZ2VkIixmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9bnVsbH0sMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX2FjdGl2YXRlSGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zY2hlZHVsZUFjdGl2YXRpb246ZnVuY3Rpb24oYSxjKXt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09YTt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5hc3luYyh0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLGMpfSxfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtOwp0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMDthLmZpcmUodGhpcy5hY3RpdmF0ZUV2ZW50LG51bGwse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pfSxfY2FuY2VsUGVuZGluZ0FjdGl2YXRpb246ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCksdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKGEpe2EudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSwKZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKGEsYyl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoYyYmLWMuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKX0sMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24oYSl7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YTthPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09YTt0aGlzLl9yaWdodEhpZGRlbj1hPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sCl9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpO3RoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbihhLGMpe2lmKGEpe3ZhciBkPXRoaXMuJC50YWJzQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKZj1kLndpZHRoLGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtkPWcubGVmdC1kLmxlZnQ7dGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChnLndpZHRoLGYpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQoZCxmKX07aWYodGhpcy5ub1NsaWRlfHxudWxsPT1jKXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7ZWxzZXt2YXIgbD1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2M9dGhpcy5pdGVtcy5pbmRleE9mKGMpO2E9dGhpcy5pdGVtcy5pbmRleE9mKGEpO3RoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LmFkZCgiZXhwYW5kIik7YT1jPGE7dGhpcy5faXNSVEwmJihhPSFhKTthP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGcubGVmdCtnLndpZHRoLQpsLmxlZnQsZiktNSx0aGlzLl9sZWZ0KTp0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudChsLmxlZnQrbC53aWR0aC1nLmxlZnQsZiktNSx0aGlzLl9jYWxjUGVyY2VudChkLGYpKzUpO3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKGcud2lkdGgsZCl9fWVsc2UgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIoMCwwKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbihhLGMpe2MtPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7MD5jP3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWM6KGMrPWEtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgsMDxjJiYodGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YykpfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24oYSwKYyl7cmV0dXJuIDEwMCphL2N9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbihhLGMpe2E9YXx8MDtjPWN8fDA7dGhpcy5fd2lkdGg9YTt0aGlzLl9sZWZ0PWM7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitjKyIlKSBzY2FsZVgoIithLzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdDthLmNvbnRhaW5zKCJleHBhbmQiKT8oYS5yZW1vdmUoImV4cGFuZCIpLGEuYWRkKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCkpOmEuY29udGFpbnMoImNvbnRyYWN0IikmJmEucmVtb3ZlKCJjb250cmFjdCIpfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaW5mZXJlbmNlLXBhbmVsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaWQ9ImxpbnRlci1wYXBlci1idXR0b24tc3R5bGUiPgogICAgICAvKioKICAgICAgICogVGhpcyBzdHlsZSBwcmVzZXJ2ZXMgdGhlIHN0eWxpbmcgcHJldmlvdXMgdG8KICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9wYXBlci1idXR0b24vcHVsbC8xMTUKICAgICAgICogVGhpcyBjaGFuZ2UgY2FuIGJyZWFrIHRoZSBsYXlvdXQgb2YgcGFwZXItYnV0dG9uIGNvbnRlbnQuCiAgICAgICAqIFJlbW92ZSB0aGlzIHN0eWxlIHRvIGFwcGx5IHRoZSBjaGFuZ2UuCiAgICAgICAqLwogICAgICBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgICAgdGYtb3B0aW9uLXNlbGVjdG9yIC5tb2RlbC10eXBlLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KICAgICAgLmZsZXgtaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAzMnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIH0KICAgICAgLmhlbHAtaWNvbiB7CiAgICAgICAgd2lkdGg6IDE1cHg7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY29sb3I6ICM3NTc1NzU7CiAgICAgIH0KICAgICAgLnRvb2x0aXAgewogICAgICAgIHdpZHRoOiA1MDBweDsKICAgICAgfQogICAgICAuaW5wdXQtaW4tcm93IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgIH0KICAgICAgLmZsZXgtZ3JvdyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5tb2RlbC10eXBlLWxhYmVsIHsKICAgICAgICBwYWRkaW5nLXRvcDogMTBweDsKICAgICAgfQogICAgICAuYWRkLW1vZGVsLWJ1dHRvbi1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBtYXJnaW4tdG9wOiAzMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICAgIC5wcmVkaWN0LWNoZWNrYm94IHsKICAgICAgICBtYXJnaW4tdG9wOiA0M3B4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogI2Y1N2MwMDsKICAgICAgfQogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvcjogIzNjNDA0MzsKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yOiAjM2M0MDQzOwogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtY29sb3I6ICMzYzQwNDM7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1pbmstY29sb3I6ICMzYzQwNDM7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+U2V0IHVwIHlvdXIgZGF0YSBhbmQgbW9kZWw8L2Rpdj4KICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9IkluZmVyZW5jZSBhZGRyZXNzIiBwbGFjZWhvbGRlcj0iW1tpbmZlcmVuY2VBZGRyZXNzMV1dIiB2YWx1ZT0ie3tpbmZlcmVuY2VBZGRyZXNzMX19Ij4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8ZGl2IGNsYXNzPSJmbGV4LWhvbGRlciI+CiAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9Ik1vZGVsIG5hbWUiIHBsYWNlaG9sZGVyPSJbW21vZGVsTmFtZTFdXSIgdmFsdWU9Int7bW9kZWxOYW1lMX19IiBjbGFzcz0iaW5wdXQtaW4tcm93Ij4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgdmVyc2lvbiAob3B0aW9uYWwpIiBwbGFjZWhvbGRlcj0iW1ttb2RlbFZlcnNpb24xXV0iIHZhbHVlPSJ7e21vZGVsVmVyc2lvbjF9fSIgY2xhc3M9ImlucHV0LWluLXJvdyI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9Ik1vZGVsIHNpZ25hdHVyZSAob3B0aW9uYWwpIiBwbGFjZWhvbGRlcj0iW1ttb2RlbFNpZ25hdHVyZTFdXSIgdmFsdWU9Int7bW9kZWxTaWduYXR1cmUxfX0iIGNsYXNzPSJpbnB1dC1pbi1yb3ciPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgPC9kaXY+CiAgICA8ZGl2IGhpZGRlbiQ9Int7aGlkZU1vZGVsUGFuZTJ9fSI+CiAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9IkluZmVyZW5jZSBhZGRyZXNzIiBwbGFjZWhvbGRlcj0iW1tpbmZlcmVuY2VBZGRyZXNzMl1dIiB2YWx1ZT0ie3tpbmZlcmVuY2VBZGRyZXNzMn19Ij4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPGRpdiBjbGFzcz0iZmxleC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9Ik1vZGVsIG5hbWUiIHBsYWNlaG9sZGVyPSJbW21vZGVsTmFtZTJdXSIgdmFsdWU9Int7bW9kZWxOYW1lMn19IiBjbGFzcz0iaW5wdXQtaW4tcm93Ij4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9Ik1vZGVsIHZlcnNpb24gKG9wdGlvbmFsKSIgcGxhY2Vob2xkZXI9IltbbW9kZWxWZXJzaW9uMl1dIiB2YWx1ZT0ie3ttb2RlbFZlcnNpb24yfX0iIGNsYXNzPSJpbnB1dC1pbi1yb3ciPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgc2lnbmF0dXJlIChvcHRpb25hbCkiIHBsYWNlaG9sZGVyPSJbW21vZGVsU2lnbmF0dXJlMl1dIiB2YWx1ZT0ie3ttb2RlbFNpZ25hdHVyZTJ9fSIgY2xhc3M9ImlucHV0LWluLXJvdyI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImFkZC1tb2RlbC1idXR0b24taG9sZGVyIiBoaWRkZW4kPSJ7eyFoaWRlTW9kZWxQYW5lMn19Ij4KICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9ImFkZE1vZGVsQ2xpY2tlZF8iIGNsYXNzPSJtYWluLWJ1dHRvbiI+CiAgICAgICAgQWRkIGFub3RoZXIgbW9kZWwgZm9yIGNvbXBhcmlzb24KICAgICAgPC9wYXBlci1idXR0b24+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPGRpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RlbC10eXBlLWxhYmVsIj5Nb2RlbCBUeXBlPC9kaXY+CiAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e21vZGVsVHlwZX19Ij4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY2xhc3NpZmljYXRpb24iPkNsYXNzaWZpY2F0aW9uPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InJlZ3Jlc3Npb24iPlJlZ3Jlc3Npb248L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICA8L2Rpdj4KICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7dXNlUHJlZGljdEFwaX19IiBjbGFzcz0icHJlZGljdC1jaGVja2JveCI+CiAgICAgICAgVXNlcyBQcmVkaWN0IEFQSQogICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJmbGV4LWhvbGRlciI+CiAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9IklucHV0IHRlbnNvciBuYW1lIiBwbGFjZWhvbGRlcj0iW1twcmVkaWN0SW5wdXRUZW5zb3JdXSIgdmFsdWU9Int7cHJlZGljdElucHV0VGVuc29yfX0iIGNsYXNzPSJpbnB1dC1pbi1yb3ciIGhpZGRlbiQ9Iltbc2hvdWxkRGlzYWJsZVByZWRpY3RUZW5zb3JDb250cm9sc18odXNlUHJlZGljdEFwaSldXSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9Ik91dHB1dCB0ZW5zb3IgbmFtZSIgcGxhY2Vob2xkZXI9IltbcHJlZGljdE91dHB1dFRlbnNvcl1dIiB2YWx1ZT0ie3twcmVkaWN0T3V0cHV0VGVuc29yfX0iIGNsYXNzPSJpbnB1dC1pbi1yb3ciIGhpZGRlbiQ9Iltbc2hvdWxkRGlzYWJsZVByZWRpY3RUZW5zb3JDb250cm9sc18odXNlUHJlZGljdEFwaSldXSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iUGF0aCB0byBleGFtcGxlcyIgdmFsdWU9Int7ZXhhbXBsZXNQYXRofX0iIGNsYXNzPSJmbGV4LWdyb3ciPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tzZXF1ZW5jZUV4YW1wbGVzfX0iIGNsYXNzPSJjaGVja2JveCI+CiAgICAgICAgU2VxdWVuY2VFeGFtcGxlcwogICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJmbGV4LWhvbGRlciI+CiAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBjbGFzcz0iaW5wdXQtaW4tcm93IGZsZXgtZ3JvdyIgbGFiZWw9Ik1heGltdW0gbnVtYmVyIG9mIGV4YW1wbGVzIHRvIGxvYWQiIHBsYWNlaG9sZGVyPSJbW21heEV4YW1wbGVzXV0iIHZhbHVlPSJ7e21heEV4YW1wbGVzfX0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8cGFwZXItaW5wdXQgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgY2xhc3M9ImlucHV0LWluLXJvdyBmbGV4LWdyb3ciIGxhYmVsPSJTYW1wbGluZyByYXRpbyAoMC4yID0gc2FtcGxlIH4yMCUgb2YgZXhhbXBsZXMpIiBwbGFjZWhvbGRlcj0iW1tzYW1wbGluZ09kZHNdXSIgdmFsdWU9Int7c2FtcGxpbmdPZGRzfX0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgPC9kaXY+CiAgICA8cGFwZXItaW5wdXQgYWx3YXlzLWZsb2F0LWxhYmVsIGxhYmVsPSJQYXRoIHRvIGxhYmVsIGRpY3Rpb25hcnkgKG9wdGlvbmFsKSIgcGxhY2Vob2xkZXI9IltbbGFiZWxWb2NhYlBhdGhdXSIgdmFsdWU9Int7bGFiZWxWb2NhYlBhdGh9fSIgZGlzYWJsZWQ9Iltbc2hvdWxkRGlzYWJsZUNsYXNzaWZpY2F0aW9uQ29udHJvbHNfKG1vZGVsVHlwZSldXSI+CiAgICA8L3BhcGVyLWlucHV0PgogICAgPGRpdiBjbGFzcz0iZmxleC1ob2xkZXIiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscCIgY2xhc3M9ImhlbHAtaWNvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPGRpdj5NYXBzIHByZWRpY3RlZCBjbGFzcyBpbmRpY2VzIHRvIGxhYmVscyBmcm9tIHRleHQgZmlsZTwvZGl2PgogICAgICA8cGFwZXItdG9vbHRpcCBjbGFzcz0idG9vbHRpcCIgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0iYm90dG9tIiBvZmZzZXQ9IjAiPgogICAgICAgIEFuIG9wdGlvbmFsIHRleHQgZmlsZSBmb3IgdXNlIHdpdGggdGhlIHJlc3VsdHMgb2YgYSBjbGFzc2lmaWNhdGlvbgogICAgICAgIG1vZGVsLiBDbGFzc2lmaWNhdGlvbiBtb2RlbHMgcmV0dXJuIHByZWRpY3RlZCBjbGFzc2VzIGFzIGluZGljZXMuIElmIGEKICAgICAgICB2b2NhYiBmaWxlIGlzIHByb3ZpZGVkLCBlYWNoIHByZWRpY3RlZCBjbGFzcyBpbmRleCB3aWxsIGJlIG1hcHBlZCB0byBhCiAgICAgICAgbGFiZWwgZnJvbSB0aGlzIGZpbGUgZm9yIHVzZSBpbiB0aGUgZGlzcGxheS4gRWFjaCBsaW5lIGluIHRoZSBmaWxlCiAgICAgICAgY29ycmVzcG9uZHMgdG8gYSBsYWJlbCwgd2l0aCB0aGUgZmlyc3QgbGluZSBjb3JyZXNwb25kaW5nIHRvIGNsYXNzIGluZGV4CiAgICAgICAgMC4KICAgICAgPC9wYXBlci10b29sdGlwPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJmbGV4LWhvbGRlciI+CiAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBsYWJlbD0iTWF4IGNsYXNzZXMgdG8gZGlzcGxheSIgcGxhY2Vob2xkZXI9IltbbWF4Q2xhc3Nlc1RvRGlzcGxheV1dIiB2YWx1ZT0ie3ttYXhDbGFzc2VzVG9EaXNwbGF5fX0iIGNsYXNzPSJpbnB1dC1pbi1yb3ciIGRpc2FibGVkPSJbW3Nob3VsZERpc2FibGVNdWx0aUNsYXNzQ29udHJvbHNfKG11bHRpQ2xhc3MpXV0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8cGFwZXItY2hlY2tib3ggZGlzYWJsZWQ9Iltbc2hvdWxkRGlzYWJsZUNsYXNzaWZpY2F0aW9uQ29udHJvbHNfKG1vZGVsVHlwZSldXSIgY2hlY2tlZD0ie3ttdWx0aUNsYXNzfX0iIGNsYXNzPSJjaGVja2JveCI+CiAgICAgICAgTXVsdGktY2xhc3MgY2xhc3NpZmljYXRpb24gbW9kZWwKICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkL3RmLWluZmVyZW5jZS1wYW5lbC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1pbmZlcmVuY2UtcGFuZWwiLHByb3BlcnRpZXM6e2V4YW1wbGVzUGF0aDp7dHlwZTpTdHJpbmcsdmFsdWU6VmwuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoImV4YW1wbGVzUGF0aCIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJleGFtcGxlc1BhdGhDaGFuZ2VkXyIsbm90aWZ5OiEwfSxoaWRlTW9kZWxQYW5lMjp7dHlwZTpCb29sZWFuLHZhbHVlOlZsLmdldEJvb2xlYW5Jbml0aWFsaXplcigiaGlkZU1vZGVsUGFuZTIiLHtkZWZhdWx0VmFsdWU6ITB9KSxvYnNlcnZlcjoiaGlkZU1vZGVsUGFuZTJDaGFuZ2VkXyJ9LG1vZGVsTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxtb2RlbE5hbWUxOnt0eXBlOlN0cmluZyx2YWx1ZTpWbC5nZXRTdHJpbmdJbml0aWFsaXplcigibW9kZWxOYW1lMSIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJtb2RlbE5hbWUxQ2hhbmdlZF8iLG5vdGlmeTohMH0sbW9kZWxOYW1lMjp7dHlwZTpTdHJpbmcsCnZhbHVlOlZsLmdldFN0cmluZ0luaXRpYWxpemVyKCJtb2RlbE5hbWUyIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Im1vZGVsTmFtZTJDaGFuZ2VkXyIsbm90aWZ5OiEwfSxpbmZlcmVuY2VBZGRyZXNzOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LGluZmVyZW5jZUFkZHJlc3MxOnt0eXBlOlN0cmluZyx2YWx1ZTpWbC5nZXRTdHJpbmdJbml0aWFsaXplcigiaW5mZXJlbmNlQWRkcmVzczEiLHtkZWZhdWx0VmFsdWU6IiJ9KSxvYnNlcnZlcjoiaW5mZXJlbmNlQWRkcmVzczFDaGFuZ2VkXyIsbm90aWZ5OiEwfSxpbmZlcmVuY2VBZGRyZXNzMjp7dHlwZTpTdHJpbmcsdmFsdWU6VmwuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoImluZmVyZW5jZUFkZHJlc3MyIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6ImluZmVyZW5jZUFkZHJlc3MyQ2hhbmdlZF8iLG5vdGlmeTohMH0sbW9kZWxUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpWbC5nZXRTdHJpbmdJbml0aWFsaXplcigibW9kZWxUeXBlIiwKe2RlZmF1bHRWYWx1ZToiY2xhc3NpZmljYXRpb24ifSksb2JzZXJ2ZXI6Im1vZGVsVHlwZUNoYW5nZWRfIixub3RpZnk6ITB9LG1vZGVsVmVyc2lvbjp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxtb2RlbFZlcnNpb24xOnt0eXBlOlN0cmluZyx2YWx1ZTpWbC5nZXRTdHJpbmdJbml0aWFsaXplcigibW9kZWxWZXJzaW9uMSIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJtb2RlbFZlcnNpb24xQ2hhbmdlZF8iLG5vdGlmeTohMH0sbW9kZWxWZXJzaW9uMjp7dHlwZTpTdHJpbmcsdmFsdWU6VmwuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoIm1vZGVsVmVyc2lvbjIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxvYnNlcnZlcjoibW9kZWxWZXJzaW9uMkNoYW5nZWRfIixub3RpZnk6ITB9LG1vZGVsU2lnbmF0dXJlOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LG1vZGVsU2lnbmF0dXJlMTp7dHlwZTpTdHJpbmcsdmFsdWU6VmwuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoIm1vZGVsU2lnbmF0dXJlMSIsCntkZWZhdWx0VmFsdWU6IiJ9KSxvYnNlcnZlcjoibW9kZWxTaWduYXR1cmUxQ2hhbmdlZF8iLG5vdGlmeTohMH0sbW9kZWxTaWduYXR1cmUyOnt0eXBlOlN0cmluZyx2YWx1ZTpWbC5nZXRTdHJpbmdJbml0aWFsaXplcigibW9kZWxTaWduYXR1cmUyIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Im1vZGVsU2lnbmF0dXJlMkNoYW5nZWRfIixub3RpZnk6ITB9LG1heEV4YW1wbGVzOnt0eXBlOk51bWJlcix2YWx1ZTpWbC5nZXRTdHJpbmdJbml0aWFsaXplcigibWF4RXhhbXBsZXMiLHtkZWZhdWx0VmFsdWU6IjEwMDAifSksb2JzZXJ2ZXI6Im1heEV4YW1wbGVzQ2hhbmdlZF8iLG5vdGlmeTohMH0sbGFiZWxWb2NhYlBhdGg6e3R5cGU6U3RyaW5nLHZhbHVlOlZsLmdldFN0cmluZ0luaXRpYWxpemVyKCJsYWJlbFZvY2FiUGF0aCIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJsYWJlbFZvY2FiUGF0aENoYW5nZWRfIixub3RpZnk6ITB9LG11bHRpQ2xhc3M6e3R5cGU6Qm9vbGVhbiwKbm90aWZ5OiEwLHZhbHVlOlZsLmdldEJvb2xlYW5Jbml0aWFsaXplcigibXVsdGlDbGFzcyIse2RlZmF1bHRWYWx1ZTohMX0pLG9ic2VydmVyOiJtdWx0aUNsYXNzQ2hhbmdlZF8ifSxzZXF1ZW5jZUV4YW1wbGVzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOlZsLmdldEJvb2xlYW5Jbml0aWFsaXplcigic2VxdWVuY2VFeGFtcGxlcyIse2RlZmF1bHRWYWx1ZTohMX0pLG9ic2VydmVyOiJzZXF1ZW5jZUV4YW1wbGVzQ2hhbmdlZF8ifSxtYXhDbGFzc2VzVG9EaXNwbGF5Ont0eXBlOk51bWJlcix2YWx1ZTpWbC5nZXRTdHJpbmdJbml0aWFsaXplcigibWF4Q2xhc3Nlc1RvRGlzcGxheSIse2RlZmF1bHRWYWx1ZToiNSJ9KSxvYnNlcnZlcjoibWF4Q2xhc3Nlc1RvRGlzcGxheUNoYW5nZWRfIixub3RpZnk6ITB9LHNhbXBsaW5nT2Rkczp7dHlwZTpOdW1iZXIsdmFsdWU6VmwuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInNhbXBsaW5nT2RkcyIse2RlZmF1bHRWYWx1ZToiMSJ9KSxvYnNlcnZlcjoic2FtcGxpbmdPZGRzQ2hhbmdlZF8iLApub3RpZnk6ITB9LHVzZVByZWRpY3RBcGk6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6VmwuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJ1c2VQcmVkaWN0QXBpIix7ZGVmYXVsdFZhbHVlOiExfSksb2JzZXJ2ZXI6InVzZVByZWRpY3RBcGlDaGFuZ2VkXyJ9LHByZWRpY3RJbnB1dFRlbnNvcjp7dHlwZTpTdHJpbmcsdmFsdWU6VmwuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInByZWRpY3RJbnB1dFRlbnNvciIse2RlZmF1bHRWYWx1ZToiZXhhbXBsZXMifSksb2JzZXJ2ZXI6InByZWRpY3RJbnB1dFRlbnNvckNoYW5nZWRfIixub3RpZnk6ITB9LHByZWRpY3RPdXRwdXRUZW5zb3I6e3R5cGU6U3RyaW5nLHZhbHVlOlZsLmdldFN0cmluZ0luaXRpYWxpemVyKCJwcmVkaWN0T3V0cHV0VGVuc29yIix7ZGVmYXVsdFZhbHVlOiJwcm9iYWJpbGl0aWVzIn0pLG9ic2VydmVyOiJwcmVkaWN0T3V0cHV0VGVuc29yQ2hhbmdlZF8iLG5vdGlmeTohMH19LG9ic2VydmVyczpbInVwZGF0ZU1vZGVsTmFtZShtb2RlbE5hbWUxLCBtb2RlbE5hbWUyKSIsCiJ1cGRhdGVJbmZlcmVuY2VBZGRyZXNzKGluZmVyZW5jZUFkZHJlc3MxLCBpbmZlcmVuY2VBZGRyZXNzMikiLCJ1cGRhdGVNb2RlbFZlcnNpb24obW9kZWxWZXJzaW9uMSwgbW9kZWxWZXJzaW9uMikiLCJ1cGRhdGVNb2RlbFNpZ25hdHVyZShtb2RlbFNpZ25hdHVyZTEsIG1vZGVsU2lnbmF0dXJlMikiXSx1cGRhdGVNb2RlbE5hbWU6ZnVuY3Rpb24oYSxjKXt0aGlzLm1vZGVsTmFtZT1hKyIsIitjO3RoaXMubW9kZWxOYW1lPXRoaXMubW9kZWxOYW1lLnJlcGxhY2UoLyheLCl8KCwkKS9nLCIiKX0sdXBkYXRlSW5mZXJlbmNlQWRkcmVzczpmdW5jdGlvbihhLGMpe3RoaXMuaW5mZXJlbmNlQWRkcmVzcz1hKyIsIitjO3RoaXMuaW5mZXJlbmNlQWRkcmVzcz10aGlzLmluZmVyZW5jZUFkZHJlc3MucmVwbGFjZSgvKF4sKXwoLCQpL2csIiIpfSx1cGRhdGVNb2RlbFZlcnNpb246ZnVuY3Rpb24oYSxjKXt0aGlzLm1vZGVsVmVyc2lvbj1hKyIsIitjfSx1cGRhdGVNb2RlbFNpZ25hdHVyZTpmdW5jdGlvbihhLApjKXt0aGlzLm1vZGVsU2lnbmF0dXJlPWErIiwiK2N9LGFkZE1vZGVsQ2xpY2tlZF86ZnVuY3Rpb24oKXt0aGlzLmhpZGVNb2RlbFBhbmUyPSF0aGlzLmhpZGVNb2RlbFBhbmUyfSxleGFtcGxlc1BhdGhDaGFuZ2VkXzpWbC5nZXRTdHJpbmdPYnNlcnZlcigiZXhhbXBsZXNQYXRoIix7ZGVmYXVsdFZhbHVlOiIifSksbW9kZWxOYW1lMUNoYW5nZWRfOlZsLmdldFN0cmluZ09ic2VydmVyKCJtb2RlbE5hbWUxIix7ZGVmYXVsdFZhbHVlOiIifSksbW9kZWxOYW1lMkNoYW5nZWRfOlZsLmdldFN0cmluZ09ic2VydmVyKCJtb2RlbE5hbWUyIix7ZGVmYXVsdFZhbHVlOiIifSksaW5mZXJlbmNlQWRkcmVzczFDaGFuZ2VkXzpWbC5nZXRTdHJpbmdPYnNlcnZlcigiaW5mZXJlbmNlQWRkcmVzczEiLHtkZWZhdWx0VmFsdWU6IiJ9KSxpbmZlcmVuY2VBZGRyZXNzMkNoYW5nZWRfOlZsLmdldFN0cmluZ09ic2VydmVyKCJpbmZlcmVuY2VBZGRyZXNzMiIse2RlZmF1bHRWYWx1ZToiIn0pLG1vZGVsVHlwZUNoYW5nZWRfOlZsLmdldFN0cmluZ09ic2VydmVyKCJtb2RlbFR5cGUiLAp7ZGVmYXVsdFZhbHVlOiJjbGFzc2lmaWNhdGlvbiJ9KSxtb2RlbFZlcnNpb24xQ2hhbmdlZF86VmwuZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1vZGVsVmVyc2lvbjEiLHtkZWZhdWx0VmFsdWU6IiJ9KSxtb2RlbFZlcnNpb24yQ2hhbmdlZF86VmwuZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1vZGVsVmVyc2lvbjIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxtb2RlbFNpZ25hdHVyZTFDaGFuZ2VkXzpWbC5nZXRTdHJpbmdPYnNlcnZlcigibW9kZWxTaWduYXR1cmUxIix7ZGVmYXVsdFZhbHVlOiIifSksbW9kZWxTaWduYXR1cmUyQ2hhbmdlZF86VmwuZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1vZGVsU2lnbmF0dXJlMiIse2RlZmF1bHRWYWx1ZToiIn0pLG1heEV4YW1wbGVzQ2hhbmdlZF86VmwuZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1heEV4YW1wbGVzIix7ZGVmYXVsdFZhbHVlOiIxMDAwIn0pLGxhYmVsVm9jYWJQYXRoQ2hhbmdlZF86VmwuZ2V0U3RyaW5nT2JzZXJ2ZXIoImxhYmVsVm9jYWJQYXRoIix7ZGVmYXVsdFZhbHVlOiIifSksCm1heENsYXNzZXNUb0Rpc3BsYXlDaGFuZ2VkXzpWbC5nZXRTdHJpbmdPYnNlcnZlcigibWF4Q2xhc3Nlc1RvRGlzcGxheSIse2RlZmF1bHRWYWx1ZToiNSJ9KSxzYW1wbGluZ09kZHNDaGFuZ2VkXzpWbC5nZXRTdHJpbmdPYnNlcnZlcigic2FtcGxpbmdPZGRzIix7ZGVmYXVsdFZhbHVlOiIxIn0pLG11bHRpQ2xhc3NDaGFuZ2VkXzpWbC5nZXRCb29sZWFuT2JzZXJ2ZXIoIm11bHRpQ2xhc3MiLHtkZWZhdWx0VmFsdWU6ITF9KSxzZXF1ZW5jZUV4YW1wbGVzQ2hhbmdlZF86VmwuZ2V0Qm9vbGVhbk9ic2VydmVyKCJzZXF1ZW5jZUV4YW1wbGVzIix7ZGVmYXVsdFZhbHVlOiExfSksaGlkZU1vZGVsUGFuZTJDaGFuZ2VkXzpWbC5nZXRCb29sZWFuT2JzZXJ2ZXIoImhpZGVNb2RlbFBhbmUyIix7ZGVmYXVsdFZhbHVlOiEwfSksdXNlUHJlZGljdEFwaUNoYW5nZWRfOlZsLmdldEJvb2xlYW5PYnNlcnZlcigidXNlUHJlZGljdEFwaSIse2RlZmF1bHRWYWx1ZTohMX0pLHByZWRpY3RPdXRwdXRUZW5zb3JDaGFuZ2VkXzpWbC5nZXRTdHJpbmdPYnNlcnZlcigicHJlZGljdE91dHB1dFRlbnNvciIsCntkZWZhdWx0VmFsdWU6InByb2JhYmlsaXRpZXMifSkscHJlZGljdElucHV0VGVuc29yQ2hhbmdlZF86VmwuZ2V0U3RyaW5nT2JzZXJ2ZXIoInByZWRpY3RJbnB1dFRlbnNvciIse2RlZmF1bHRWYWx1ZToiZXhhbXBsZXMifSksc2hvdWxkRGlzYWJsZUNsYXNzaWZpY2F0aW9uQ29udHJvbHNfOmZ1bmN0aW9uKGEpe3JldHVybiJyZWdyZXNzaW9uIj09YX0sc2hvdWxkRGlzYWJsZU11bHRpQ2xhc3NDb250cm9sc186ZnVuY3Rpb24oYSl7cmV0dXJuIWF9LHNob3VsZERpc2FibGVQcmVkaWN0VGVuc29yQ29udHJvbHNfOmZ1bmN0aW9uKGEpe3JldHVybiFhfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZ6LWJhci1jaGFydCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0idG9vbHRpcCI+CiAgICAgIDx0YWJsZT4KICAgICAgICA8dGhlYWQ+CiAgICAgICAgICA8dHIgaWQ9InRvb2x0aXAtdGFibGUtaGVhZGVyLXJvdyI+PC90cj4KICAgICAgICA8L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KICAgICAgZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICAgIHRkIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjRlbTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBjdXJzb3I6IG5vbmU7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgfQogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgIH0KICAgICAgLmNsb3Nlc3QgLnN3YXRjaCB7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgd2hpdGU7CiAgICAgIH0KICAgICAgdGggewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3Z6LWJhci1jaGFydC92ei1iYXItY2hhcnQuanMKdmFyIEZtOwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidnotYmFyLWNoYXJ0Iixwcm9wZXJ0aWVzOntkYXRhOk9iamVjdCxsaW5lczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZShkMy5zY2hlbWVDYXRlZ29yeTEwKX19LGxpbmVzQ29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0sdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpmdW5jdGlvbihjKXtyZXR1cm4gYy5rZXl9fSx7dGl0bGU6IlgiLGV2YWx1YXRlOmZ1bmN0aW9uKGMpe3JldHVybiBjLnZhbHVlLnh9fSx7dGl0bGU6IlkiLGV2YWx1YXRlOmZ1bmN0aW9uKGMpe3JldHVybiBjLnZhbHVlLnl9fV19fSxfYXR0YWNoZWQ6Qm9vbGVhbiwKX2NoYXJ0Ok9iamVjdH0sb2JzZXJ2ZXJzOlsiX21ha2VDaGFydChkYXRhLCBsaW5lcywgY29sb3JTY2FsZSwgbGluZXNDb2xvclNjYWxlLCB0b29sdGlwQ29sdW1ucywgX2F0dGFjaGVkKSJdLHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5yZWRyYXcoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMH0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQudG9vbHRpcCwhMCk7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCEwKX0sX21ha2VDaGFydDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dmFyIGM9ZDMuc2VsZWN0KHRoaXMuJC50b29sdGlwKTtjPW5ldyBhKHRoaXMuZGF0YSx0aGlzLmxpbmVzLHRoaXMuY29sb3JTY2FsZSx0aGlzLmxpbmVzQ29sb3JTY2FsZSxjLHRoaXMudG9vbHRpcENvbHVtbnMpOwp2YXIgZD1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0ZGl2KTtjLnJlbmRlclRvKGQpO3RoaXMuX2NoYXJ0PWN9fSk7Y2xhc3MgYXtjb25zdHJ1Y3RvcihjLGQsZixnLGwsayl7Zi5kb21haW4oXy5zb3J0QnkoXy5rZXlzKGMpKSk7dGhpcy5kYXRhPWM7dGhpcy5saW5lcz1kO3RoaXMuY29sb3JTY2FsZT1mO3RoaXMubGluZXNDb2xvclNjYWxlPWc7dGhpcy50b29sdGlwPWw7dGhpcy5vdXRlcj10aGlzLnBsb3Q9bnVsbDt0aGlzLmJ1aWxkQ2hhcnQoYyxkLGYsZyk7dGhpcy5zZXR1cFRvb2x0aXBzKGspfWJ1aWxkQ2hhcnQoYyxkLGYpe3RoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpO3ZhciBnPW5ldyBQbG90dGFibGUuU2NhbGVzLkNhdGVnb3J5O2NvbnN0IGw9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyLGs9bmV3IFBsb3R0YWJsZS5BeGVzLkNhdGVnb3J5KGcsImJvdHRvbSIpLG09bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMobCwibGVmdCIpLHA9bmV3IFBsb3R0YWJsZS5QbG90cy5DbHVzdGVyZWRCYXI7CnAueChmdW5jdGlvbihyKXtyZXR1cm4gci54fSxnKTtwLnkoZnVuY3Rpb24ocil7cmV0dXJuIHIueX0sbCk7Xy5rZXlzKGMpLmZvckVhY2gocj0+cC5hZGREYXRhc2V0KChuZXcgUGxvdHRhYmxlLkRhdGFzZXQoY1tyXSkpLm1ldGFkYXRhKHIpKSk7cC5hdHRyKCJmaWxsIixmdW5jdGlvbihyLHQsdil7cmV0dXJuIGYuc2NhbGUodi5tZXRhZGF0YSgpKX0pO3RoaXMucGxvdD1wO2NvbnN0IHE9Xy5rZXlzKGQpO2lmKDA8cS5sZW5ndGgpe2NvbnN0IHI9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO3IueChmdW5jdGlvbih0KXtyZXR1cm4gdC54fSxnKTtyLnkoZnVuY3Rpb24odCl7cmV0dXJuIHQueX0sbCk7cS5mb3JFYWNoKHQ9PnIuYWRkRGF0YXNldCgobmV3IFBsb3R0YWJsZS5EYXRhc2V0KGRbdF0pKS5tZXRhZGF0YSh0KSkpO3IuYXR0cigic3Ryb2tlIiwodCx2LEEpPT50aGlzLmxpbmVzQ29sb3JTY2FsZS5zY2FsZShBLm1ldGFkYXRhKCkpKTtnPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbcCwKcl0pO3RoaXMub3V0ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbbSxnXSxbbnVsbCxrXV0pfWVsc2UgdGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1ttLHBdLFtudWxsLGtdXSl9c2V0dXBUb29sdGlwcyhjKXt2YXIgZD10aGlzLnRvb2x0aXAuc2VsZWN0KCJ0aGVhZCB0ciIpO2Quc2VsZWN0QWxsKCJ0aCIpLmRhdGEoYykuZW50ZXIoKS5hcHBlbmQoInRoIikudGV4dChnPT5nLnRpdGxlKTtkLmluc2VydCgidGgiLCI6Zmlyc3QtY2hpbGQiKTtjb25zdCBmPXRoaXMucGxvdDtkPW5ldyBibS5Qb2ludGVySW50ZXJhY3Rpb247ZC5hdHRhY2hUbyhmKTtkLm9uUG9pbnRlck1vdmUoZz0+eyhnPWYuZW50aXR5TmVhcmVzdChnKSkmJnRoaXMuZHJhd1Rvb2x0aXBzKGcsYyl9KTtkLm9uUG9pbnRlckV4aXQoKCk9Pnt0aGlzLnRvb2x0aXAuc3R5bGUoIm9wYWNpdHkiLDApfSl9ZHJhd1Rvb2x0aXBzKGMsZCl7Y29uc3QgZj1jLmRhdHVtLngsZz1jLmRhdGFzZXQubWV0YWRhdGEoKTsKdmFyIGw9Xy5tYXBWYWx1ZXModGhpcy5kYXRhLHA9Pl8uZmlsdGVyKHAscT0+cS54PT1mKSk7bD1fLnBpY2tCeShsLHA9PjA8cC5sZW5ndGgpO2w9Xy5tYXBWYWx1ZXMobCxwPT5wWzBdKTtsPWQzLmVudHJpZXMobCk7Y29uc3Qgaz10aGlzLnRvb2x0aXAuc2VsZWN0KCJ0Ym9keSIpLmh0bWwoIiIpLnNlbGVjdEFsbCgidHIiKS5kYXRhKGwpLmVudGVyKCkuYXBwZW5kKCJ0ciIpO2suc3R5bGUoIndoaXRlLXNwYWNlIiwibm93cmFwIik7ay5jbGFzc2VkKCJjbG9zZXN0IixwPT5wLmtleT09Zyk7Y29uc3QgbT10aGlzLmNvbG9yU2NhbGU7ay5hcHBlbmQoInRkIikuYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJzd2F0Y2giLCEwKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIscD0+bS5zY2FsZShwLmtleSkpO18uZWFjaChkLHA9PntrLmFwcGVuZCgidGQiKS50ZXh0KHE9PnAuZXZhbHVhdGUocSkpfSk7dGhpcy50b29sdGlwLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitjLnBvc2l0aW9uLngrCiJweCwiK2MucG9zaXRpb24ueSsicHgpIik7dGhpcy50b29sdGlwLnN0eWxlKCJvcGFjaXR5IiwxKX1yZW5kZXJUbyhjKXt0aGlzLnRhcmdldFNWRz1jO3RoaXMub3V0ZXIucmVuZGVyVG8oYyl9cmVkcmF3KCl7dGhpcy5vdXRlci5yZWRyYXcoKX1kZXN0cm95KCl7dGhpcy5vdXRlci5kZXN0cm95KCl9fX0pKEZtfHwoRm09e30pKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY29uZnVzaW9uLW1hdHJpeCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB0YWJsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIHRkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQogICAgICB0aCwKICAgICAgdGQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgfQogICAgICAuZmxleCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KICAgICAgLnByZWQtbGFiZWwgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICB9CiAgICAgIC50b3RhbC1sYWJlbCB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLnRvdGFsLWNlbGwgewogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICB9CiAgICAgIC5hY3R1YWwtbGFiZWwgewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgfQogICAgICAubi1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CiAgICAgIH0KICAgICAgLnZhbHVlLWNlbGwgewogICAgICAgIGNvbG9yOiAjMjAyMTI0OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JleTsKICAgICAgfQogICAgICAucGFyZW50aGV0aWNhbCB7CiAgICAgICAgcGFkZGluZy1yaWdodDogNXB4OwogICAgICAgIHdpZHRoOiA1MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0iaG9sZGVyIj48L2Rpdj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaW50ZXJhY3RpdmUtaW5mZXJlbmNlLWRhc2hib2FyZC90Zi1jb25mdXNpb24tbWF0cml4Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWNvbmZ1c2lvbi1tYXRyaXgiLHByb3BlcnRpZXM6e2NvdW50czpPYmplY3QsYWxsSXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxsYWJlbDpTdHJpbmcsYmFja2dyb3VuZDp7dHlwZTpPYmplY3QsdmFsdWU6ZDMuY29sb3IoImdyYXkiKX19LG9ic2VydmVyczpbImRyYXdNYXRyaXgoY291bnRzLCBhbGxJdGVtcykiXSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5ob2xkZXIsITApfSxkcmF3TWF0cml4OmZ1bmN0aW9uKGEsYyl7dGhpcy4kLmhvbGRlci5pbm5lckhUTUw9IiI7aWYoYSl7dmFyIGQ9YztpZihudWxsPT1kfHwwPT1kLmxlbmd0aCl7Yz1uZXcgU2V0O3ZhciBmPU9iamVjdC5rZXlzKGEpO2Zvcih2YXIgZz0wO2c8Zi5sZW5ndGg7ZysrKXtjLmFkZChmW2ddKTt2YXIgbD1PYmplY3Qua2V5cyhhW2ZbZ11dKTtmb3IobGV0IHE9MDtxPGwubGVuZ3RoO3ErKyljLmFkZChsW3FdKX1kPUFycmF5LmZyb20oYy52YWx1ZXMoKSl9ZD0KZC5zb3J0KCk7Mj09ZC5sZW5ndGgmJiJObyI9PWRbMF0mJiJZZXMiPT1kWzFdJiYoZD1kLnJldmVyc2UoKSk7dmFyIGs9QXJyYXkoZC5sZW5ndGgpO18uZmlsbChrLDApO3ZhciBtPVtdO2ZvcihjPTA7YzxkLmxlbmd0aDtjKyspZj1BcnJheShkLmxlbmd0aCksXy5maWxsKGYsMCksbS5wdXNoKGYpO2ZvcihjPTA7YzxkLmxlbmd0aDtjKyspZm9yKGY9MDtmPGQubGVuZ3RoO2YrKylnPWRbY10sbD1kW2ZdLGcgaW4gYSYmbCBpbiBhW2ddJiYobVtjXVtmXT1hW2ddW2xdKTthPVtdO3ZhciBwPTA7Zm9yKGM9MDtjPG0ubGVuZ3RoO2MrKylmb3IoZj1tW2NdLnJlZHVjZSgocSxyKT0+cStyLDApLGEucHVzaChbMF0uY29uY2F0KG1bY10pLmNvbmNhdChbZl0pKSxmPTA7ZjxtLmxlbmd0aDtmKyspa1tmXSs9bVtjXVtmXSxwKz1tW2NdW2ZdO2M9dGhpcy5nZXRJbmRpY2VzKG0ubGVuZ3RoKzIpO2w9ZDMuc2VsZWN0KHRoaXMuJC5ob2xkZXIpLmFwcGVuZCgidGFibGUiKTtmPWwuYXBwZW5kKCJ0aGVhZCIpOwpnPWwuYXBwZW5kKCJ0Ym9keSIpO2w9bC5hcHBlbmQoInRmb290Iik7Zi5hcHBlbmQoInRyIikuc2VsZWN0QWxsKCJ0aCIpLmRhdGEoYykuZW50ZXIoKS5hcHBlbmQoInRoIikudGV4dChxPT4wPT1xP3RoaXMubGFiZWw6cTw9bS5sZW5ndGg/IlByZWRpY3RlZCAiK2RbcS0xXToiVG90YWwiKS5hdHRyKCJjbGFzcyIscT0+MD09cT8ibi1sYWJlbCI6cTw9bS5sZW5ndGg/InByZWQtbGFiZWwiOiJ0b3RhbC1sYWJlbCIpO2E9Zy5zZWxlY3RBbGwoInRyIikuZGF0YShhKS5lbnRlcigpLmFwcGVuZCgidHIiKS5zZWxlY3RBbGwoInRkIikuZGF0YSgocSxyKT0+cS5tYXAoKHQsdik9PjA9PXY/e3ZhbHVlOiJBY3R1YWwgIitkW3JdfTp7dmFsdWU6dCxyb3c6cn0pKS5lbnRlcigpLmFwcGVuZCgidGQiKS5hdHRyKCJjbGFzcyIsKHEscik9PjA9PXI/ImFjdHVhbC1sYWJlbCI6cjw9bS5sZW5ndGg/InZhbHVlLWNlbGwiOiJ0b3RhbC1jZWxsIikuc3R5bGUoImJhY2tncm91bmQiLChxLHIpPT57aWYoMD09CnJ8fHI+bS5sZW5ndGgpcmV0dXJuIiNGRkZGRkYiO3I9dGhpcy5iYWNrZ3JvdW5kO3Iub3BhY2l0eT1xLnZhbHVlL3A7cmV0dXJuIHIrIiJ9KS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoImZsZXgiLCEwKTthLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgicGFyZW50aGV0aWNhbCIsKHEscik9PiEhcikudGV4dChxPT4icm93ImluIHE/IigiK3EudmFsdWUrIikiOiIiKTthLmFwcGVuZCgiZGl2IikudGV4dCgocSxyKT0+MDxyP2QzLmZvcm1hdCgiLC4xJSIpKHEudmFsdWUvcCk6cS52YWx1ZSk7YT1sLmFwcGVuZCgidHIiKS5zZWxlY3RBbGwoInRkIikuZGF0YShjKS5lbnRlcigpLmFwcGVuZCgidGQiKTthLmNsYXNzZWQoInRvdGFsLWxhYmVsIiwocSxyKT0+MD09cik7YS5jbGFzc2VkKCJ0b3RhbC1jZWxsIiwocSxyKT0+MCE9cik7YT1hLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgiZmxleCIsITApO2EuYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJwYXJlbnRoZXRpY2FsIiwocSxyKT0+ISFyKS50ZXh0KHE9PgowPT1xPyJUb3RhbCI6cTw9bS5sZW5ndGg/IigiK2tbcS0xXSsiKSI6IiIpO2EuYXBwZW5kKCJkaXYiKS50ZXh0KHE9PjA9PXE/IiI6cTw9bS5sZW5ndGg/ZDMuZm9ybWF0KCIsLjElIikoa1txLTFdL3ApOiIiKX19LGdldEluZGljZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5LmFwcGx5KG51bGwse2xlbmd0aDphfSkubWFwKE51bWJlci5jYWxsLE51bWJlcil9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWluZmVyZW5jZS12aWV3ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5ydW5zLWhvbGRlciB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICB9CiAgICAgIC5yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICB9CiAgICAgIC5oZWFkZXIgewogICAgICAgIGNvbG9yOiAjODA4NjhiOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBwYWRkaW5nOiA0cHggMDsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2RhZGNlMDsKICAgICAgICBib3JkZXItdG9wOiBzb2xpZCAxcHggI2RhZGNlMDsKICAgICAgfQogICAgICAuZGFyay1yb3ctb25lIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjY2JmMGY4OwogICAgICB9CiAgICAgIC5kYXJrLXJvdy10d28gewogICAgICAgIGJhY2tncm91bmQ6ICNmZmYzZTA7CiAgICAgIH0KICAgICAgLndoaXRlLXJvdyB7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KICAgICAgLm1hcmtlciB7CiAgICAgICAgZmxleDogMC41OwogICAgICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgICB9CiAgICAgIC5tYXJrZXIubWFyay1vbmUgewogICAgICAgIGJhY2tncm91bmQ6ICMwMDdiODM7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxcHg7CiAgICAgIH0KICAgICAgLm1hcmtlci5tYXJrLXR3byB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmOTgwMDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFweDsKICAgICAgfQogICAgICAucnVuIHsKICAgICAgICBmbGV4OiAxMDsKICAgICAgfQogICAgICAubXVsdGktbW9kZWwgewogICAgICAgIGZsZXg6IDEwOwogICAgICB9CiAgICAgIC5vbmUtbW9kZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNob3ctbGFiZWwgewogICAgICAgIGZsZXg6IDIwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAubm8tbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNjb3JlIHsKICAgICAgICBmbGV4OiAxMDsKICAgICAgfQogICAgICAuYXJyb3cgewogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KICAgICAgLmRlbHRhIHsKICAgICAgICBmbGV4OiAxMDsKICAgICAgfQogICAgICAudGV4dCB7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CiAgICAgIC5ncmVlbiB7CiAgICAgICAgY29sb3I6IGdyZWVuOwogICAgICB9CiAgICAgIC5yZWQgewogICAgICAgIGNvbG9yOiByZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJyb3cgaGVhZGVyIj4KICAgICAgPGRpdiBjbGFzcz0ibWFya2VyIj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0icnVuIj5SdW48L2Rpdj4KICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0TW9kZWxIZWFkZXJDbGFzcyhpbmZlcmVuY2VzKV1dIj5Nb2RlbDwvZGl2PgogICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRMYWJlbEhlYWRlckNsYXNzKG1vZGVsVHlwZSldXSI+TGFiZWw8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2NvcmUiPltbZ2V0U2NvcmVMYWJlbChtb2RlbFR5cGUpXV08L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iYXJyb3ciPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZWx0YSI+RGVsdGE8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0icnVucy1ob2xkZXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2luZmVyZW5jZXNdXSIgYXM9Im1vZGVsc0luZmVyZW5jZSIgaW5kZXgtYXM9InJ1bmluZGV4Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJyb3dzLWZvci1ydW4iPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1ttb2RlbHNJbmZlcmVuY2VdXSIgYXM9ImluZmVyZW5jZSIgaW5kZXgtYXM9Im1vZGVsaW5kZXgiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldEluZmVyZW5jZUxpc3QoaW5mZXJlbmNlLCBtYXhFbnRyaWVzUGVyUnVuKV1dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRSb3dDbGFzcyhydW5pbmRleCwgaW5mZXJlbmNlcywgbW9kZWxpbmRleCldXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRNYXJrZXJDbGFzcyhydW5pbmRleCwgaW5mZXJlbmNlcywgbW9kZWxpbmRleCldXSI+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJydW4gdGV4dCI+W1tnZXRSdW5OdW1iZXIocnVuaW5kZXgpXV08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldE1vZGVsQ2xhc3MoaW5mZXJlbmNlcyldXSI+CiAgICAgICAgICAgICAgICAgIDxkaXY+W1tnZXRNb2RlbE5hbWUobW9kZWxOYW1lcywgbW9kZWxpbmRleCldXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRMYWJlbENsYXNzKG1vZGVsVHlwZSldXSI+CiAgICAgICAgICAgICAgICAgIDxkaXY+W1tnZXRMYWJlbChpdGVtKV1dPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNjb3JlIHRleHQiPltbZ2V0UHJpbnRhYmxlU2NvcmUoaXRlbS5zY29yZSldXTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXJyb3ciPgogICAgICAgICAgICAgICAgICA8aXJvbi1pY29uIGljb249IltbZ2V0SWNvbihydW5pbmRleCwgaW5kZXgsIG1vZGVsaW5kZXgpXV0iIGNsYXNzJD0iW1tnZXRJY29uQ2xhc3MocnVuaW5kZXgsIGluZGV4LCBtb2RlbGluZGV4KV1dIj4KICAgICAgICAgICAgICAgICAgPC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlbHRhIHRleHQiPgogICAgICAgICAgICAgICAgICBbW2dldFByaW50YWJsZURlbHRhKHJ1bmluZGV4LCBpbmRleCwgbW9kZWxpbmRleCldXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWludGVyYWN0aXZlLWluZmVyZW5jZS1kYXNoYm9hcmQvdGYtaW5mZXJlbmNlLXZpZXdlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1pbmZlcmVuY2Utdmlld2VyIixwcm9wZXJ0aWVzOntpbmZlcmVuY2VzOkFycmF5LG1vZGVsVHlwZTpTdHJpbmcsbW9kZWxOYW1lczpBcnJheSxtYXhFbnRyaWVzUGVyUnVuOnt0eXBlOk51bWJlcix2YWx1ZTo1fX0sZ2V0TGFiZWw6ZnVuY3Rpb24oYSl7bGV0IGM9YS5sYWJlbDthLnZvY2FiTGFiZWwmJihjKz0iICgiK2Eudm9jYWJMYWJlbCsiKSIpO3JldHVybiBjfSxnZXRMYWJlbENsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiJjbGFzc2lmaWNhdGlvbiI9PWE/InNob3ctbGFiZWwgdGV4dCI6Im5vLWxhYmVsIn0sZ2V0TGFiZWxIZWFkZXJDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4iY2xhc3NpZmljYXRpb24iPT1hPyJzaG93LWxhYmVsIjoibm8tbGFiZWwifSxnZXRNb2RlbENsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYxPGFbMF0ubGVuZ3RoPyJtdWx0aS1tb2RlbCB0ZXh0Ijoib25lLW1vZGVsIn0sZ2V0TW9kZWxIZWFkZXJDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCjE8YVswXS5sZW5ndGg/Im11bHRpLW1vZGVsIjoib25lLW1vZGVsIn0sZ2V0U2NvcmVMYWJlbDpmdW5jdGlvbihhKXtyZXR1cm4iY2xhc3NpZmljYXRpb24iPT1hPyJTY29yZSI6IlZhbHVlIn0sZ2V0SWNvbkNsYXNzOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5nZXRJY29uRGVjaXNpb24oYSxjLGQsImdyZWVuIiwicmVkIil9LGdldEljb246ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmdldEljb25EZWNpc2lvbihhLGMsZCwiaWNvbnM6YXJyb3ctdXB3YXJkIiwiaWNvbnM6YXJyb3ctZG93bndhcmQiKX0sZ2V0SWNvbkRlY2lzaW9uOmZ1bmN0aW9uKGEsYyxkLGYsZyl7aWYoMD09YSlyZXR1cm4iIjtjb25zdCBsPXRoaXMuaW5mZXJlbmNlc1thXVtkXVtjXS5sYWJlbDtjPXRoaXMuaW5mZXJlbmNlc1thXVtkXVtjXS5zY29yZTthPXRoaXMuaW5mZXJlbmNlc1thLTFdW2RdO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYVtkXS5sYWJlbD09bCl7aWYoYVtkXS5zY29yZT5jKXJldHVybiBnOwppZihhW2RdLnNjb3JlPGMpYnJlYWs7cmV0dXJuIiJ9cmV0dXJuIGZ9LGdldFJ1bk51bWJlcjpmdW5jdGlvbihhKXtyZXR1cm4gYSsxfSxnZXRNb2RlbE5hbWU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYVtjXX0sZ2V0TWFya2VyQ2xhc3M6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiJtYXJrZXIiKyhhPT1jLmxlbmd0aC0xPzA9PWQ/IiBtYXJrLW9uZSI6IiBtYXJrLXR3byI6IiIpfSxnZXRSb3dDbGFzczpmdW5jdGlvbihhLGMsZCl7bGV0IGY9InJvdyAiO3JldHVybiBmPWE9PWMubGVuZ3RoLTE/ZisoMD09ZD8iZGFyay1yb3ctb25lIjoiZGFyay1yb3ctdHdvIik6Zisid2hpdGUtcm93In0sZ2V0SW5mZXJlbmNlOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxnZXRQcmludGFibGVTY29yZTpmdW5jdGlvbihhKXtyZXR1cm4gYS50b0ZpeGVkKDMpfSxnZXRQcmludGFibGVEZWx0YTpmdW5jdGlvbihhLGMsZCl7aWYoMD09YSlyZXR1cm4iIjtjb25zdCBmPXRoaXMuaW5mZXJlbmNlc1thXVtkXVtjXS5sYWJlbDsKYz10aGlzLmluZmVyZW5jZXNbYV1bZF1bY10uc2NvcmU7YT10aGlzLmluZmVyZW5jZXNbYS0xXVtkXTtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKGFbZF0ubGFiZWw9PWYpcmV0dXJuKGMtYVtkXS5zY29yZSkudG9GaXhlZCg2KTtyZXR1cm4iIn0sZ2V0SW5mZXJlbmNlTGlzdDpmdW5jdGlvbihhLGMpe3JldHVybiBhLnNsaWNlKDAsYyl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1kaXZlL2xpYi9ib3VuZGVkLW9iamVjdC5qcwovKgoKIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuCgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiovCnZhciBHbTsoZnVuY3Rpb24oYSl7YVthLkJvdHRvbT0wXT0iQm90dG9tIjthW2EuTGVmdD0xXT0iTGVmdCI7YVthLlJpZ2h0PTJdPSJSaWdodCI7YVthLlRvcD0zXT0iVG9wIn0pKEdtfHwoR209e30pKTsKY2xhc3MgSG17c2hvdWxkQmVWaXNpYmxlKGEsYyxkLGYpe2lmKHZvaWQgMCE9PXRoaXMubWluU2NhbGUpcmV0dXJuIHRoaXMuc2NhbGVEb3dufHxjPj10aGlzLm1pblNjYWxlO2lmKCF0aGlzLmJvdW5kaW5nQm94KXJldHVybiEwO2NvbnN0IGc9dGhpcy5ib3VuZGluZ0JveDtpZihnLmxlZnQ+ZC54K2YucmlnaHR8fGcucmlnaHQ8ZC54K2YubGVmdHx8Zy5ib3R0b20+ZC55K2YudG9wfHxnLnRvcDxkLnkrZi5ib3R0b20pcmV0dXJuITE7Zj10aGlzLmVsZW1lbnRNYXJnaW58fHtib3R0b206MCxsZWZ0OjAscmlnaHQ6MCx0b3A6MH07ZD12b2lkIDA9PT10aGlzLndpZHRoP2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgrZi5sZWZ0K2YucmlnaHQ6dGhpcy53aWR0aDthPXZvaWQgMD09PXRoaXMuaGVpZ2h0P2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0K2YudG9wK2YuYm90dG9tOnRoaXMuaGVpZ2h0O2Y9aXNGaW5pdGUoZy50b3ApJiZpc0Zpbml0ZShnLmJvdHRvbSk/CmcudG9wLWcuYm90dG9tOkluZmluaXR5O3JldHVybihpc0Zpbml0ZShnLmxlZnQpJiZpc0Zpbml0ZShnLnJpZ2h0KT9nLnJpZ2h0LWcubGVmdDpJbmZpbml0eSkqYz49ZCYmZipjPj1hfX07Cjwvc2NyaXB0PgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1kaXZlL2xpYi9zb3J0aW5nLmpzCmZ1bmN0aW9uIEltKGEsYyl7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hfHxudWxsIT09YyYmdm9pZCAwIT09Yz9udWxsPT09YXx8dm9pZCAwPT09YT8tMTpudWxsPT09Y3x8dm9pZCAwPT09Yz8xOiJudW1iZXIiPT09dHlwZW9mIGEmJiJudW1iZXIiPT09dHlwZW9mIGM/aXNOYU4oYSkmJmlzTmFOKGMpPzA6aXNOYU4oYSk/LTE6aXNOYU4oYyk/MTphLWM6InN0cmluZyIhPT10eXBlb2YgYT8tMToic3RyaW5nIiE9PXR5cGVvZiBjPzE6YS5sb2NhbGVDb21wYXJlKGMpOmE9PT1jPzA6dm9pZCAwPT09YT8tMToxfQpmdW5jdGlvbiBKbShhLGMpe3JldHVybiBudWxsIT09YSYmdm9pZCAwIT09YXx8bnVsbCE9PWMmJnZvaWQgMCE9PWM/bnVsbD09PWF8fHZvaWQgMD09PWE/LTE6bnVsbD09PWN8fHZvaWQgMD09PWM/MToibnVtYmVyIj09PXR5cGVvZiBhJiYibnVtYmVyIj09PXR5cGVvZiBjP2lzTmFOKGEpJiZpc05hTihjKT8wOmlzTmFOKGEpPy0xOmlzTmFOKGMpPzE6Yy1hOiJzdHJpbmciIT09dHlwZW9mIGE/LTE6InN0cmluZyIhPT10eXBlb2YgYz8xOi1hLmxvY2FsZUNvbXBhcmUoYyk6YT09PWM/MDp2b2lkIDA9PT1hPy0xOjF9CmZ1bmN0aW9uIEttKGEsYyl7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hfHxudWxsIT09YyYmdm9pZCAwIT09Yz9udWxsPT09YXx8dm9pZCAwPT09YT8tMTpudWxsPT09Y3x8dm9pZCAwPT09Yz8xOiJzdHJpbmciPT09dHlwZW9mIGEmJiJzdHJpbmciPT09dHlwZW9mIGM/YS5sb2NhbGVDb21wYXJlKGMpOiJudW1iZXIiIT09dHlwZW9mIGE/LTE6Im51bWJlciIhPT10eXBlb2YgYz8xOmlzTmFOKGEpJiZpc05hTihjKT8wOmlzTmFOKGEpPy0xOmlzTmFOKGMpPzE6YS1jOmE9PT1jPzA6dm9pZCAwPT09YT8tMToxfTsKPC9zY3JpcHQ+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZmFjZXRzLWRpdmUvbGliL2dyaWQuanMKY29uc3QgTG09KGEsYyxkLGYpPT57YT1NYXRoLmZsb29yKDFFLTYrZC5taW5XaWR0aC9mLml0ZW1Bc3BlY3RSYXRpbyk7cmV0dXJuIDE8YT9jJWEvKGEtMSk6MH0sTW09KGEsYyxkLGYpPT57YT1NYXRoLmZsb29yKDFFLTYrZC5taW5XaWR0aC9mLml0ZW1Bc3BlY3RSYXRpbyk7ZD1NYXRoLmNlaWwoZC5pdGVtcy5sZW5ndGgvYSk7cmV0dXJuIDE8ZD9NYXRoLmZsb29yKGMvYSkvKGQtMSk6MH0sTm09KGEsYyk9Pntjb25zdCBkPSJyaWdodCI9PT1jPzE6Im1pZGRsZSI9PT1jPy41OjAsZj0idG9wIj09PWE/MToibWlkZGxlIj09PWE/LjU6MDtyZXR1cm4oZyxsLGssbSk9Pntjb25zdCBwPWsuaW5uZXJXaWR0aC1tLml0ZW1Bc3BlY3RSYXRpbyxxPWsuaW5uZXJIZWlnaHQtMTtyZXR1cm57eDpMbShnLGwsayxtKS9wKihrLm1pbldpZHRoLW0uaXRlbUFzcGVjdFJhdGlvKStkKihrLmlubmVyV2lkdGgtay5taW5XaWR0aCkvcCx5Ok1tKGcsbCxrLG0pL3EqKGsubWluSGVpZ2h0LTEpK2YqKGsuaW5uZXJIZWlnaHQtCmsubWluSGVpZ2h0KS9xfX19LE9tPU5tKCJib3R0b20iLCJsZWZ0Iik7dmFyIFBtOyhmdW5jdGlvbihhKXthW2EuVGlnaHQ9MF09IlRpZ2h0IjthW2EuVW5pZm9ybT0xXT0iVW5pZm9ybSJ9KShQbXx8KFBtPXt9KSk7CmNsYXNzIFFte2NvbnN0cnVjdG9yKGEpe3RoaXMuaXRlbXM9YTt0aGlzLmNlbGxNYXJnaW49dGhpcy5pdGVtQXNwZWN0UmF0aW89MTt0aGlzLmNlbGxQYWRkaW5nPXtib3R0b206MCxsZWZ0OjAscmlnaHQ6MCx0b3A6MH07dGhpcy50YXJnZXRHcmlkQXNwZWN0UmF0aW89MTt0aGlzLm1pbkNlbGxBc3BlY3RSYXRpbz0wO3RoaXMubWF4Q2VsbEFzcGVjdFJhdGlvPUluZmluaXR5O3RoaXMudmVydGljYWxGYWNldD0oKT0+bnVsbDt0aGlzLmhvcml6b250YWxGYWNldD0oKT0+bnVsbDt0aGlzLnZlcnRpY2FsS2V5Q29tcGFyZT1KbTt0aGlzLmhvcml6b250YWxLZXlDb21wYXJlPUltO3RoaXMudmVydGljYWxLZXlzPVtdO3RoaXMudmVydGljYWxLZXlzSGFzaD17fTt0aGlzLmhvcml6b250YWxLZXlzPVtdO3RoaXMuaG9yaXpvbnRhbEtleXNIYXNoPXt9O3RoaXMuY2VsbHM9e307dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmxvbmdlc3RDZWxsTGVuZ3RoPTA7dGhpcy5pdGVtUG9zaXRpb25TZXR0ZXI9CihjLGQsZik9PntjLng9ZDtjLnk9Zn07dGhpcy5jb21wdXRlSXRlbVBvc2l0aW9uPU9tO3RoaXMuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQ9dGhpcy52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQ9UG0uVGlnaHQ7dGhpcy5jZWxsSXRlbUNvbXBhcmF0b3I9bnVsbH1jbGVhcigpe3RoaXMudmVydGljYWxLZXlzPVtdO3RoaXMudmVydGljYWxLZXlzSGFzaD17fTt0aGlzLmhvcml6b250YWxLZXlzPVtdO3RoaXMuaG9yaXpvbnRhbEtleXNIYXNoPXt9O3RoaXMuY2VsbHM9e307dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmxvbmdlc3RDZWxsTGVuZ3RoPTB9YXJyYW5nZSgpe3RoaXMuZmFjZXRJdGVtc0ludG9DZWxscygpO3ZhciBhPXRoaXMuY29tcHV0ZU9wdGltYWxDZWxsQXNwZWN0UmF0aW8odGhpcy50YXJnZXRHcmlkQXNwZWN0UmF0aW8pLGM9TWF0aC5taW4odGhpcy5tYXhDZWxsQXNwZWN0UmF0aW8sTWF0aC5tYXgodGhpcy5taW5DZWxsQXNwZWN0UmF0aW8sYSkpO2E9W107Y29uc3QgZD0KW107Zm9yKHZhciBmPTA7Zjx0aGlzLnZlcnRpY2FsS2V5cy5sZW5ndGg7ZisrKWZvcih2YXIgZz0wO2c8dGhpcy5ob3Jpem9udGFsS2V5cy5sZW5ndGg7ZysrKXt2YXIgbD10aGlzLmdldE9yQ3JlYXRlQ2VsbCh0aGlzLnZlcnRpY2FsS2V5c1tmXSx0aGlzLmhvcml6b250YWxLZXlzW2ddKTtbbC5taW5XaWR0aCxsLm1pbkhlaWdodF09dGhpcy5jb21wdXRlQ2VsbERpbWVuc2lvbnMoYyxsLml0ZW1zLmxlbmd0aCk7YVtmXT1NYXRoLm1heChhW2ZdfHwwLGwubWluSGVpZ2h0KTtkW2ddPU1hdGgubWF4KGRbZ118fDAsbC5taW5XaWR0aCl9Zm9yKGM9MDtjPHRoaXMudmVydGljYWxLZXlzLmxlbmd0aDtjKyspZm9yKGY9MDtmPHRoaXMuaG9yaXpvbnRhbEtleXMubGVuZ3RoO2YrKylnPXRoaXMuZ2V0Q2VsbCh0aGlzLnZlcnRpY2FsS2V5c1tjXSx0aGlzLmhvcml6b250YWxLZXlzW2ZdKSxjPHRoaXMudmVydGljYWxLZXlzLmxlbmd0aC0xJiYoZy5zaWJsaW5ncy5hYm92ZT10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbYysKMV0sdGhpcy5ob3Jpem9udGFsS2V5c1tmXSkpLDA8YyYmKGcuc2libGluZ3MuYmVsb3c9dGhpcy5nZXRDZWxsKHRoaXMudmVydGljYWxLZXlzW2MtMV0sdGhpcy5ob3Jpem9udGFsS2V5c1tmXSkpLDA8ZiYmKGcuc2libGluZ3MubGVmdD10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbY10sdGhpcy5ob3Jpem9udGFsS2V5c1tmLTFdKSksZjx0aGlzLmhvcml6b250YWxLZXlzLmxlbmd0aC0xJiYoZy5zaWJsaW5ncy5yaWdodD10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbY10sdGhpcy5ob3Jpem9udGFsS2V5c1tmKzFdKSk7aWYodGhpcy52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQ9PT1QbS5Vbmlmb3JtKWZvcihjPU1hdGgubWF4KC4uLmEpLGY9MDtmPGEubGVuZ3RoO2YrKylhW2ZdPWM7aWYodGhpcy5ob3Jpem9udGFsR3JpZEFsaWdubWVudD09PVBtLlVuaWZvcm0pZm9yKGM9TWF0aC5tYXgoLi4uZCksZj0wO2Y8ZC5sZW5ndGg7ZisrKWRbZl09Yztmb3IoYz0wO2M8dGhpcy52ZXJ0aWNhbEtleXMubGVuZ3RoO2MrKylmb3IoZj0KMDtmPHRoaXMuaG9yaXpvbnRhbEtleXMubGVuZ3RoO2YrKylnPXRoaXMuZ2V0Q2VsbCh0aGlzLnZlcnRpY2FsS2V5c1tjXSx0aGlzLmhvcml6b250YWxLZXlzW2ZdKSxnLmhlaWdodD1hW2NdLGcud2lkdGg9ZFtmXSxnLmlubmVySGVpZ2h0PWcuaGVpZ2h0LXRoaXMuY2VsbFBhZGRpbmcudG9wLXRoaXMuY2VsbFBhZGRpbmcuYm90dG9tLGcuaW5uZXJXaWR0aD1nLndpZHRoLXRoaXMuY2VsbFBhZGRpbmcubGVmdC10aGlzLmNlbGxQYWRkaW5nLnJpZ2h0O2M9dGhpcy5jZWxsTWFyZ2luKnRoaXMuaXRlbUFzcGVjdFJhdGlvO2ZvcihmPTA7Zjx0aGlzLnZlcnRpY2FsS2V5cy5sZW5ndGg7ZisrKWZvcihnPTA7Zzx0aGlzLmhvcml6b250YWxLZXlzLmxlbmd0aDtnKyspbD10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbZl0sdGhpcy5ob3Jpem9udGFsS2V5c1tnXSksbC55PWY/dGhpcy5nZXRDZWxsKHRoaXMudmVydGljYWxLZXlzW2YtMV0sdGhpcy5ob3Jpem9udGFsS2V5c1tnXSkueSsKYVtmLTFdK2M6MCxsLmNvbnRlbnRZPWwueSt0aGlzLmNlbGxQYWRkaW5nLmJvdHRvbSxsLng9Zz90aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbZl0sdGhpcy5ob3Jpem9udGFsS2V5c1tnLTFdKS54K2RbZy0xXStjOjAsbC5jb250ZW50WD1sLngrdGhpcy5jZWxsUGFkZGluZy5sZWZ0O3RoaXMuZWFjaENlbGwoaz0+e3RoaXMud2lkdGg9TWF0aC5tYXgodGhpcy53aWR0aCxrLngray53aWR0aCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgodGhpcy5oZWlnaHQsay55K2suaGVpZ2h0KX0pO3RoaXMucG9zaXRpb25JdGVtcygpfXBvc2l0aW9uSXRlbXMoKXt0aGlzLmVhY2hDZWxsKGE9Pntjb25zdCBjPU1hdGgubWF4KDAsYS5pbm5lcldpZHRoLXRoaXMuaXRlbUFzcGVjdFJhdGlvKSxkPU1hdGgubWF4KDAsYS5pbm5lckhlaWdodC0xKSxmPWEuaXRlbXMuc2xpY2UoMCk7dGhpcy5jZWxsSXRlbUNvbXBhcmF0b3ImJmYuc29ydCh0aGlzLmNlbGxJdGVtQ29tcGFyYXRvcik7Zm9yKGxldCBnPQowO2c8Zi5sZW5ndGg7ZysrKXtjb25zdCBsPXRoaXMuY29tcHV0ZUl0ZW1Qb3NpdGlvbihmW2ddLGcsYSx0aGlzKTt0aGlzLml0ZW1Qb3NpdGlvblNldHRlcihmW2ddLGEuY29udGVudFgrKCFsfHxpc05hTihsLngpPzA6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGwueCkpKSpjLGEuY29udGVudFkrKCFsfHxpc05hTihsLnkpPzA6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGwueSkpKSpkKX19KX1mYWNldEl0ZW1zSW50b0NlbGxzKCl7dGhpcy5jbGVhcigpO3RoaXMuZWFjaEl0ZW0oYT0+e2NvbnN0IGM9dGhpcy5nZXRPckNyZWF0ZUNlbGwodGhpcy52ZXJ0aWNhbEZhY2V0KGEpLHRoaXMuaG9yaXpvbnRhbEZhY2V0KGEpKTtjLml0ZW1zLnB1c2goYSk7dGhpcy5sb25nZXN0Q2VsbExlbmd0aD1NYXRoLm1heCh0aGlzLmxvbmdlc3RDZWxsTGVuZ3RoLGMuaXRlbXMubGVuZ3RoKX0pO2Zvcihjb25zdCBhIGluIHRoaXMudmVydGljYWxLZXlzSGFzaCl0aGlzLnZlcnRpY2FsS2V5cy5wdXNoKHRoaXMudmVydGljYWxLZXlzSGFzaFthXSk7CnRoaXMudmVydGljYWxLZXlzLnNvcnQodGhpcy52ZXJ0aWNhbEtleUNvbXBhcmUpO2Zvcihjb25zdCBhIGluIHRoaXMuaG9yaXpvbnRhbEtleXNIYXNoKXRoaXMuaG9yaXpvbnRhbEtleXMucHVzaCh0aGlzLmhvcml6b250YWxLZXlzSGFzaFthXSk7dGhpcy5ob3Jpem9udGFsS2V5cy5zb3J0KHRoaXMuaG9yaXpvbnRhbEtleUNvbXBhcmUpfWVhY2hJdGVtKGEpe2lmKHRoaXMuaXRlbXMpZm9yKGxldCBjPTA7Yzx0aGlzLml0ZW1zLmxlbmd0aDtjKyspYS5jYWxsKHRoaXMsdGhpcy5pdGVtc1tjXSl9ZWFjaENlbGwoYSl7Zm9yKGNvbnN0IGMgaW4gdGhpcy5jZWxscylhLmNhbGwodGhpcyx0aGlzLmNlbGxzW2NdKX1nZXRDb21wb3VuZEtleShhLGMpe3JldHVybiB0eXBlb2YgYSsiXHUwMDFmIithKyJcdTAwMWUiK3R5cGVvZiBjKyJcdTAwMWYiK2N9Z2V0Q2VsbChhLGMpe2E9dGhpcy5nZXRDb21wb3VuZEtleShhLGMpO3JldHVybiBhIGluIHRoaXMuY2VsbHM/dGhpcy5jZWxsc1thXTpudWxsfWdldENlbGxzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2VsbHMpLm1hcChhPT4KdGhpcy5jZWxsc1thXSl9Z2V0T3JDcmVhdGVDZWxsKGEsYyl7bGV0IGQ9dGhpcy5nZXRDZWxsKGEsYyk7aWYoZClyZXR1cm4gZDt0aGlzLmFkZFZlcnRpY2FsS2V5KGEpO3RoaXMuYWRkSG9yaXpvbnRhbEtleShjKTtjb25zdCBmPXRoaXMuZ2V0Q29tcG91bmRLZXkoYSxjKTtkPXt2ZXJ0aWNhbEtleTphLGhvcml6b250YWxLZXk6Yyxjb21wb3VuZEtleTpmLGl0ZW1zOltdLHNpYmxpbmdzOnt9fTtyZXR1cm4gdGhpcy5jZWxsc1tmXT1kfWdldFJvdyhhKXtjb25zdCBjPVtdO2ZvcihsZXQgZD0wO2Q8dGhpcy5ob3Jpem9udGFsS2V5cy5sZW5ndGg7ZCsrKXtjb25zdCBmPXRoaXMuZ2V0Q2VsbChhLHRoaXMuaG9yaXpvbnRhbEtleXNbZF0pO2YmJmMucHVzaChmKX1yZXR1cm4gY31nZXRDb2x1bW4oYSl7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPHRoaXMudmVydGljYWxLZXlzLmxlbmd0aDtkKyspe2NvbnN0IGY9dGhpcy5nZXRDZWxsKHRoaXMudmVydGljYWxLZXlzW2RdLGEpO2YmJmMucHVzaChmKX1yZXR1cm4gY31hZGRWZXJ0aWNhbEtleShhKXtjb25zdCBjPQp0eXBlb2YgYSsiXHUwMDFmIithO2MgaW4gdGhpcy52ZXJ0aWNhbEtleXNIYXNofHwodGhpcy52ZXJ0aWNhbEtleXNIYXNoW2NdPWEpfWFkZEhvcml6b250YWxLZXkoYSl7Y29uc3QgYz10eXBlb2YgYSsiXHUwMDFmIithO2MgaW4gdGhpcy5ob3Jpem9udGFsS2V5c0hhc2h8fCh0aGlzLmhvcml6b250YWxLZXlzSGFzaFtjXT1hKX1jb21wdXRlT3B0aW1hbENlbGxBc3BlY3RSYXRpbyhhKXt2YXIgYz10aGlzLnZlcnRpY2FsS2V5cy5sZW5ndGgsZD10aGlzLmhvcml6b250YWxLZXlzLmxlbmd0aDtpZighY3x8IWQpcmV0dXJuIDE7bGV0IGY9Yy9kLGc9ZixsPUluZmluaXR5LGs9MCxtPUluZmluaXR5O2M9TWF0aC5taW4oMjAsTWF0aC5tYXgoYyxkLHRoaXMubG9uZ2VzdENlbGxMZW5ndGgpKTtmb3IoZD0wO2Q8Yzspe2QrKztjb25zdCBwPXRoaXMuY29tcHV0ZUdyaWRBc3BlY3RSYXRpbyhmKSxxPU1hdGguYWJzKDEtcC9hKTtxPGwmJihnPWYsbD1xKTtpZiguMDAxPnEpYnJlYWs7cD5hPyhtPQpmLGYtPShtLWspLzIpOihrPWYsZj1pc0Zpbml0ZShtKT9mKyhtLWspLzI6MipmKX1yZXR1cm4gZ31jb21wdXRlR3JpZEFzcGVjdFJhdGlvKGEpe2NvbnN0IGM9dGhpcy52ZXJ0aWNhbEtleXMubGVuZ3RoLGQ9dGhpcy5ob3Jpem9udGFsS2V5cy5sZW5ndGg7bGV0IGY9LUluZmluaXR5LGc9LUluZmluaXR5LGw9LUluZmluaXR5LGs9LUluZmluaXR5O2NvbnN0IG09W107Zm9yKGxldCBwPTA7cDxjO3ArKyl7bVtwXT1bXTtmb3IobGV0IHE9MDtxPGQ7cSsrKXtjb25zdCByPW1bcF1bcV09e3dpZHRoOnE/bVtwXVtxLTFdLndpZHRoOjAsaGVpZ2h0OnA/bVtwLTFdW3FdLmhlaWdodDowfSx0PXRoaXMuZ2V0Q2VsbCh0aGlzLnZlcnRpY2FsS2V5c1twXSx0aGlzLmhvcml6b250YWxLZXlzW3FdKTtpZighdHx8IXQuaXRlbXN8fCF0Lml0ZW1zLmxlbmd0aCljb250aW51ZTtjb25zdCBbdixBXT10aGlzLmNvbXB1dGVDZWxsRGltZW5zaW9ucyhhLHQuaXRlbXMubGVuZ3RoKTtyLndpZHRoKz12O3IuaGVpZ2h0Kz0KQTtmPU1hdGgubWF4KGYsci53aWR0aCk7Zz1NYXRoLm1heChnLEEpO2w9TWF0aC5tYXgobCx2KTtrPU1hdGgubWF4KGssci5oZWlnaHQpfX10aGlzLnZlcnRpY2FsR3JpZEFsaWdubWVudD09PVBtLlVuaWZvcm0mJihrPWcqYyk7dGhpcy5ob3Jpem9udGFsR3JpZEFsaWdubWVudD09PVBtLlVuaWZvcm0mJihmPWwqZCk7YT10aGlzLmNlbGxNYXJnaW4qdGhpcy5pdGVtQXNwZWN0UmF0aW87cmV0dXJuKGYrYSooZC0xKSkvKGsrYSooYy0xKSl9Y29tcHV0ZUNlbGxEaW1lbnNpb25zKGEsYyl7Y29uc3QgZD1bdGhpcy5pdGVtQXNwZWN0UmF0aW8qKHRoaXMuY2VsbFBhZGRpbmcubGVmdCt0aGlzLmNlbGxQYWRkaW5nLnJpZ2h0KSx0aGlzLml0ZW1Bc3BlY3RSYXRpbyoodGhpcy5jZWxsUGFkZGluZy50b3ArdGhpcy5jZWxsUGFkZGluZy5ib3R0b20pXTtpZighYylyZXR1cm4gZDthPU1hdGgubWluKGMsTWF0aC5jZWlsKE1hdGguc3FydChhKmMpL3RoaXMuaXRlbUFzcGVjdFJhdGlvKSk7ZFswXSs9CnRoaXMuaXRlbUFzcGVjdFJhdGlvKmE7ZFsxXSs9TWF0aC5jZWlsKGMvYSk7cmV0dXJuIGR9fTsKPC9zY3JpcHQ+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZmFjZXRzLWRpdmUvbGliL2F4aXMuanMKY2xhc3MgUm0gZXh0ZW5kcyBIbXtjb25zdHJ1Y3RvcihhLGMpe3N1cGVyKCk7dGhpcy5zaWRlPWE7dGhpcy5jZWxsPWM7c3dpdGNoKGEpe2Nhc2UgR20uTGVmdDp0aGlzLm1pblNjYWxlPTMwL2MuaW5uZXJIZWlnaHQ7Zm9yKGE9Yy5zaWJsaW5ncy5sZWZ0OyEoIWF8fGEuaXRlbXMubGVuZ3RofHxhLnNpYmxpbmdzLmFib3ZlJiZhLnNpYmxpbmdzLmFib3ZlLml0ZW1zLmxlbmd0aCk7KWE9YS5zaWJsaW5ncy5sZWZ0O2EmJih0aGlzLm1pblNjYWxlPU1hdGgubWF4KHRoaXMubWluU2NhbGUsMzkuMi8oYy5jb250ZW50WC0oYS5jb250ZW50WCthLmlubmVyV2lkdGgpKSkpO2JyZWFrO2Nhc2UgR20uQm90dG9tOnRoaXMubWluU2NhbGU9MzAvYy5pbm5lcldpZHRoO2ZvcihhPWMuc2libGluZ3MuYmVsb3c7ISghYXx8YS5pdGVtcy5sZW5ndGh8fGEuc2libGluZ3MucmlnaHQmJmEuc2libGluZ3MucmlnaHQuaXRlbXMubGVuZ3RoKTspYT1hLnNpYmxpbmdzLmJlbG93O2EmJih0aGlzLm1pblNjYWxlPQpNYXRoLm1heCh0aGlzLm1pblNjYWxlLDM5LjIvKGMuY29udGVudFktKGEuY29udGVudFkrYS5pbm5lckhlaWdodCkpKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiQXhlcyBmb3Igc3BlY2lmaWVkIHNpZGUgYXJlIG5vdCBpbXBsZW1lbnRlZC4iKTt9fXN0cm9rZVdpZHRoKGEpe3JldHVybiAxLjIvYX1wYXRoKGEpe2NvbnN0IGM9NC9hLGQ9Ni9hO3JldHVybiB0aGlzLnNpZGU9PT1HbS5MZWZ0P2BNICR7dGhpcy5jZWxsLmNvbnRlbnRYLWMtZH0sJHt0aGlzLmNlbGwuY29udGVudFkrLjYvYX0gaCAke2R9IHYgJHt0aGlzLmNlbGwuaW5uZXJIZWlnaHQtMS4yL2F9IGggLSR7ZH1gOnRoaXMuc2lkZT09PUdtLkJvdHRvbT9gTSAke3RoaXMuY2VsbC5jb250ZW50WCsuNi9hfSwke3RoaXMuY2VsbC5jb250ZW50WS1jLWR9IHYgJHtkfSBoICR7dGhpcy5jZWxsLmlubmVyV2lkdGgtMS4yL2F9IHYgLSR7ZH1gOiIifWtleSgpe3JldHVybmAke3RoaXMuY2VsbC5jb21wb3VuZEtleX0tJHt0aGlzLnNpZGV9YH19CjsKPC9zY3JpcHQ+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1kaXZlL2xpYi9kYXRhLWV4YW1wbGUuanMKPC9zY3JpcHQ+CgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9mYWNldHMtZGl2ZS9saWIvbGFiZWwuanMKPC9zY3JpcHQ+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZmFjZXRzLWRpdmUvbGliL2xheW91dC5qcwpjbGFzcyBTbXtjb25zdHJ1Y3Rvcigpe3RoaXMuZ3JpZD17Ym90dG9tOjAsbGVmdDowLHJpZ2h0OjAsdG9wOjB9O3RoaXMudmlld3BvcnQ9e2hlaWdodDowLHdpZHRoOjB9O3RoaXMucGFkZGluZz17Ym90dG9tOjAsbGVmdDowLHJpZ2h0OjAsdG9wOjB9fWNvbXB1dGVTY2FsZSgpe2NvbnN0IGE9dGhpcy52aWV3cG9ydC53aWR0aC10aGlzLnBhZGRpbmcubGVmdC10aGlzLnBhZGRpbmcucmlnaHQsYz10aGlzLnZpZXdwb3J0LmhlaWdodC10aGlzLnBhZGRpbmcudG9wLXRoaXMucGFkZGluZy5ib3R0b207aWYoaXNOYU4oYSl8fDA+PWF8fGlzTmFOKGMpfHwwPj1jKXJldHVybiBOYU47Y29uc3QgZD10aGlzLmdyaWQucmlnaHQtdGhpcy5ncmlkLmxlZnQsZj10aGlzLmdyaWQudG9wLXRoaXMuZ3JpZC5ib3R0b207cmV0dXJuIGlzTmFOKGQpfHwwPj1kfHxpc05hTihmKXx8MD49Zj9OYU46YS9jPmQvZj9jL2Y6YS9kfWNvbXB1dGVDYW1lcmEoKXtjb25zdCBhPXRoaXMuY29tcHV0ZVNjYWxlKCk7CmlmKGlzTmFOKGEpfHwwPj1hKXJldHVybntwb3NpdGlvbjp7eDpOYU4seTpOYU59LGZydXN0dW06e2JvdHRvbTpOYU4sbGVmdDpOYU4scmlnaHQ6TmFOLHRvcDpOYU59fTtjb25zdCBjPXRoaXMudmlld3BvcnQud2lkdGgvYSxkPXRoaXMudmlld3BvcnQuaGVpZ2h0L2E7cmV0dXJue3Bvc2l0aW9uOnt4OnRoaXMuZ3JpZC5sZWZ0LShjLSh0aGlzLnBhZGRpbmcubGVmdCt0aGlzLnBhZGRpbmcucmlnaHQpL2EtKHRoaXMuZ3JpZC5yaWdodC10aGlzLmdyaWQubGVmdCkpLzItdGhpcy5wYWRkaW5nLmxlZnQvYSx5OnRoaXMuZ3JpZC50b3ArKGQtKHRoaXMucGFkZGluZy50b3ArdGhpcy5wYWRkaW5nLmJvdHRvbSkvYS0odGhpcy5ncmlkLnRvcC10aGlzLmdyaWQuYm90dG9tKSkvMit0aGlzLnBhZGRpbmcudG9wL2F9LGZydXN0dW06e2JvdHRvbTotZCxsZWZ0OjAscmlnaHQ6Yyx0b3A6MH19fXJlZHVjZVBhZGRpbmdUb0ZpdFdpZHRoKGEpe2lmKDIwMD5hKXRoaXMucGFkZGluZy5sZWZ0PTAsdGhpcy5wYWRkaW5nLnJpZ2h0PQowO2Vsc2UgaWYodGhpcy5wYWRkaW5nLmxlZnQrdGhpcy5wYWRkaW5nLnJpZ2h0KzIwMD5hKXtjb25zdCBjPXRoaXMucGFkZGluZy5sZWZ0K3RoaXMucGFkZGluZy5yaWdodDthLT0yMDA7dGhpcy5wYWRkaW5nLmxlZnQ9dGhpcy5wYWRkaW5nLmxlZnQvYyphfHwwO3RoaXMucGFkZGluZy5yaWdodD10aGlzLnBhZGRpbmcucmlnaHQvYyphfHwwfX1yZWR1Y2VQYWRkaW5nVG9GaXRIZWlnaHQoYSl7aWYoMjAwPmEpdGhpcy5wYWRkaW5nLnRvcD0wLHRoaXMucGFkZGluZy5ib3R0b209MDtlbHNlIGlmKHRoaXMucGFkZGluZy50b3ArdGhpcy5wYWRkaW5nLmJvdHRvbSsyMDA+YSl7Y29uc3QgYz10aGlzLnBhZGRpbmcudG9wK3RoaXMucGFkZGluZy5ib3R0b207YS09MjAwO3RoaXMucGFkZGluZy50b3A9dGhpcy5wYWRkaW5nLnRvcC9jKmF8fDA7dGhpcy5wYWRkaW5nLmJvdHRvbT10aGlzLnBhZGRpbmcuYm90dG9tL2MqYXx8MH19fTsKPC9zY3JpcHQ+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1kaXZlL2xpYi90ZXh0LmpzCnZhciBUbTsoZnVuY3Rpb24oYSl7YVthLkxlZnQ9MF09IkxlZnQiO2FbYS5SaWdodD0xXT0iUmlnaHQiO2FbYS5DZW50ZXI9Ml09IkNlbnRlciJ9KShUbXx8KFRtPXt9KSk7dmFyIFVtOyhmdW5jdGlvbihhKXthW2EuVG9wPTBdPSJUb3AiO2FbYS5Cb3R0b209MV09IkJvdHRvbSI7YVthLk1pZGRsZT0yXT0iTWlkZGxlIn0pKFVtfHwoVW09e30pKTtjb25zdCBWbT17eDowLHk6MCxnbHlwaEFzcGVjdFJhdGlvOi42LGxpbmVIZWlnaHQ6MS4xLGhvcml6b250YWxBbGlnbjpUbS5DZW50ZXIsdmVydGljYWxBbGlnbjpVbS5NaWRkbGV9OwpjbGFzcyBXbXtjb25zdHJ1Y3RvcihhKXt0aGlzLnNldHRpbmdzPU9iamVjdC5hc3NpZ24oe30sVm0sYSl9Zml0KGEpe2E9YS50cmltKCk7Y29uc3Qge21heDpjLHNlZ21lbnRzOmR9PXRoaXMuc3BsaXQoYSkse2N1dG9mZjpmLHdpZHRoOmcsaGVpZ2h0Omx9PXRoaXMuY29tcHV0ZUN1dG9mZihkLGEubGVuZ3RoLGMpO2E9Zyp0aGlzLnNldHRpbmdzLmdseXBoQXNwZWN0UmF0aW87YT1hL2w+dGhpcy5zZXR0aW5ncy53aWR0aC90aGlzLnNldHRpbmdzLmhlaWdodD90aGlzLnNldHRpbmdzLndpZHRoL2E6dGhpcy5zZXR0aW5ncy5oZWlnaHQvbDtjb25zdCBrPXRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbEFsaWduPT09VG0uTGVmdD8wOnRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbEFsaWduPT09VG0uUmlnaHQ/MTouNSxtPU1hdGgubWF4KDAsdGhpcy5zZXR0aW5ncy5oZWlnaHQtbCphKSoodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbEFsaWduPT09VW0uVG9wPzA6dGhpcy5zZXR0aW5ncy52ZXJ0aWNhbEFsaWduPT09ClVtLkJvdHRvbT8xOi41KSxwPXRoaXMud3JhcExpbmVzKGQsZikscT1bXTtmb3IobGV0IHI9MDtyPHAubGVuZ3RoO3IrKyl7Y29uc3Qge3N0YXJ0UG9zOnQsZW5kUG9zOnZ9PXBbcl07bGV0IEE9IiI7Zm9yKGxldCB5PXQ7eTx2O3krKylBKz1kW3ldLnRleHQ7cS5wdXNoKHt0ZXh0OkEseDp0aGlzLnNldHRpbmdzLngraypNYXRoLm1heCgwLHRoaXMuc2V0dGluZ3Mud2lkdGgtQS5sZW5ndGgqdGhpcy5zZXR0aW5ncy5nbHlwaEFzcGVjdFJhdGlvKmEpLHk6dGhpcy5zZXR0aW5ncy55K20rcip0aGlzLnNldHRpbmdzLmxpbmVIZWlnaHQqYX0pfXJldHVybntsaW5lczpxLGZvbnRTaXplOmF9fXNwbGl0KGEpe2NvbnN0IGM9W107bGV0IGQ9MSxmPS9ccy8udGVzdChhLmNoYXJBdCgwKSksZz0wLGw9MDtmb3IoO2Q8PWEubGVuZ3RoOyl7Y29uc3Qgaz1hLmNoYXJBdChkKSxtPS9ccy8udGVzdChrKTtrLmxlbmd0aCYmZj09PW18fChsPU1hdGgubWF4KGwsZC1nKSxjLnB1c2goe3RleHQ6YS5zdWJzdHJpbmcoZywKZCksd2hpdGVzcGFjZTpmfSksZz1kKTtmPW07ZCsrfXJldHVybnttYXg6bCxzZWdtZW50czpjfX1jb21wdXRlVGV4dFJlY3QoYSxjKXtsZXQgZD0wLGY9MCxnPTAsbD0xO2ZvcihsZXQgaz0wO2s8YS5sZW5ndGg7aysrKXtjb25zdCB7dGV4dDptLHdoaXRlc3BhY2U6cH09YVtrXSxxPW0ubGVuZ3RoO2lmKCFwfHxkKXA/ZCtxPD1jP2QrPXE6KGY9ZD0wLGwrPXRoaXMuc2V0dGluZ3MubGluZUhlaWdodCk6ZCtxPD1jP2Y9ZCs9cTooZj9kPWY9cTooZz1NYXRoLm1heChnLHEpLGQ9Zj0wKSxsKz10aGlzLnNldHRpbmdzLmxpbmVIZWlnaHQpLGc9TWF0aC5tYXgoZyxmKX1yZXR1cm57d2lkdGg6ZyxoZWlnaHQ6bH19Y29tcHV0ZUN1dG9mZihhLGMsZCl7Y29uc3QgZj10aGlzLnNldHRpbmdzLndpZHRoL3RoaXMuc2V0dGluZ3MuaGVpZ2h0O2xldCBnPWQrKGMtZCkvMixsPWcsaz1udWxsLG09SW5maW5pdHk7Y29uc3QgcD1NYXRoLm1pbigyMCwoYS5sZW5ndGgrMSkvMik7bGV0IHE9MDtmb3IoO3E8CnA7KXtxKys7Y29uc3Qgcj10aGlzLmNvbXB1dGVUZXh0UmVjdChhLGcpLHQ9ci53aWR0aC9yLmhlaWdodCp0aGlzLnNldHRpbmdzLmdseXBoQXNwZWN0UmF0aW8sdj1NYXRoLmFicygxLXQvZik7djxtJiYobD1nLGs9cixtPXYpO2lmKC4wMT52KWJyZWFrO3Q+Zj9jPWc6ZD1nO2c9ZCsoYy1kKS8yfXJldHVybntjdXRvZmY6bCx3aWR0aDprLndpZHRoLGhlaWdodDprLmhlaWdodH19d3JhcExpbmVzKGEsYyl7Y29uc3QgZD1bXTtsZXQgZj0wLGc9MCxsPTAsaz0wO2ZvcihsZXQgbT0wO208YS5sZW5ndGg7bSsrKXtjb25zdCB7dGV4dDpwLHdoaXRlc3BhY2U6cX09YVttXSxyPXAubGVuZ3RoO3EmJiFsP2Y9Zz1tKzE6cT9sK3I8PWM/bCs9cjooZC5wdXNoKHtzdGFydFBvczpmLGVuZFBvczpnLHRleHRMZW5ndGg6a30pLGw9az0wLGY9Zz1tKzEpOmwrcjw9Yz8oaz1sKz1yLGc9bSsxKTprPyhkLnB1c2goe3N0YXJ0UG9zOmYsZW5kUG9zOmcsdGV4dExlbmd0aDprfSksbD1rPXIsZj1tLGc9bSsKMSk6KGQucHVzaCh7c3RhcnRQb3M6bSxlbmRQb3M6bSsxLHRleHRMZW5ndGg6cn0pLGw9az0wLGY9Zz1tKzEpfWc+ZiYmZC5wdXNoKHtzdGFydFBvczpmLGVuZFBvczpnLHRleHRMZW5ndGg6a30pO3JldHVybiBkfX07Cjwvc2NyaXB0PgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWltcG9ydHMvdGhyZWUuanMKKGZ1bmN0aW9uKGEsYyl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPT10eXBlb2YgbW9kdWxlP2MoZXhwb3J0cyk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLGMpOihhPWF8fHNlbGYsYyhhLlRIUkVFPXt9KSl9KSh0aGlzLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoKXt9ZnVuY3Rpb24gZChiLGUpe3RoaXMueD1ifHwwO3RoaXMueT1lfHwwfWZ1bmN0aW9uIGYoYixlLGgsbil7dGhpcy5feD1ifHwwO3RoaXMuX3k9ZXx8MDt0aGlzLl96PWh8fDA7dGhpcy5fdz12b2lkIDAhPT1uP246MX1mdW5jdGlvbiBnKGIsZSxoKXt0aGlzLng9Ynx8MDt0aGlzLnk9ZXx8MDt0aGlzLno9aHx8MH1mdW5jdGlvbiBsKCl7dGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdOzA8YXJndW1lbnRzLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4iKX0KZnVuY3Rpb24gayhiLGUsaCxuLHUsdyx6LEUsSCxJKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpLbisrfSk7dGhpcy51dWlkPW9iLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLmltYWdlPXZvaWQgMCE9PWI/YjprLkRFRkFVTFRfSU1BR0U7dGhpcy5taXBtYXBzPVtdO3RoaXMubWFwcGluZz12b2lkIDAhPT1lP2U6ay5ERUZBVUxUX01BUFBJTkc7dGhpcy53cmFwUz12b2lkIDAhPT1oP2g6MTAwMTt0aGlzLndyYXBUPXZvaWQgMCE9PW4/bjoxMDAxO3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXU/dToxMDA2O3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PXc/dzoxMDA4O3RoaXMuYW5pc290cm9weT12b2lkIDAhPT1IP0g6MTt0aGlzLmZvcm1hdD12b2lkIDAhPT16P3o6MTAyMzt0aGlzLnR5cGU9dm9pZCAwIT09RT9FOjEwMDk7dGhpcy5vZmZzZXQ9bmV3IGQoMCwwKTt0aGlzLnJlcGVhdD1uZXcgZCgxLDEpO3RoaXMuY2VudGVyPW5ldyBkKDAsMCk7CnRoaXMucm90YXRpb249MDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITA7dGhpcy5tYXRyaXg9bmV3IGw7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITA7dGhpcy5wcmVtdWx0aXBseUFscGhhPSExO3RoaXMuZmxpcFk9ITA7dGhpcy51bnBhY2tBbGlnbm1lbnQ9NDt0aGlzLmVuY29kaW5nPXZvaWQgMCE9PUk/STozRTM7dGhpcy52ZXJzaW9uPTA7dGhpcy5vblVwZGF0ZT1udWxsfWZ1bmN0aW9uIG0oYixlLGgsbil7dGhpcy54PWJ8fDA7dGhpcy55PWV8fDA7dGhpcy56PWh8fDA7dGhpcy53PXZvaWQgMCE9PW4/bjoxfWZ1bmN0aW9uIHAoYixlLGgpe3RoaXMud2lkdGg9Yjt0aGlzLmhlaWdodD1lO3RoaXMuc2Npc3Nvcj1uZXcgbSgwLDAsYixlKTt0aGlzLnNjaXNzb3JUZXN0PSExO3RoaXMudmlld3BvcnQ9bmV3IG0oMCwwLGIsZSk7aD1ofHx7fTt0aGlzLnRleHR1cmU9bmV3IGsodm9pZCAwLHZvaWQgMCxoLndyYXBTLGgud3JhcFQsaC5tYWdGaWx0ZXIsaC5taW5GaWx0ZXIsaC5mb3JtYXQsaC50eXBlLApoLmFuaXNvdHJvcHksaC5lbmNvZGluZyk7dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz12b2lkIDAhPT1oLmdlbmVyYXRlTWlwbWFwcz9oLmdlbmVyYXRlTWlwbWFwczohMTt0aGlzLnRleHR1cmUubWluRmlsdGVyPXZvaWQgMCE9PWgubWluRmlsdGVyP2gubWluRmlsdGVyOjEwMDY7dGhpcy5kZXB0aEJ1ZmZlcj12b2lkIDAhPT1oLmRlcHRoQnVmZmVyP2guZGVwdGhCdWZmZXI6ITA7dGhpcy5zdGVuY2lsQnVmZmVyPXZvaWQgMCE9PWguc3RlbmNpbEJ1ZmZlcj9oLnN0ZW5jaWxCdWZmZXI6ITA7dGhpcy5kZXB0aFRleHR1cmU9dm9pZCAwIT09aC5kZXB0aFRleHR1cmU/aC5kZXB0aFRleHR1cmU6bnVsbH1mdW5jdGlvbiBxKGIsZSxoKXtwLmNhbGwodGhpcyxiLGUsaCk7dGhpcy5zYW1wbGVzPTR9ZnVuY3Rpb24gcihiLGUsaCl7cC5jYWxsKHRoaXMsYixlLGgpfWZ1bmN0aW9uIHQoYixlLGgsbix1LHcseixFLEgsSSxPLFEpe2suY2FsbCh0aGlzLG51bGwsdyx6LEUsSCxJLG4sdSwKTyxRKTt0aGlzLmltYWdlPXtkYXRhOmIsd2lkdGg6ZSxoZWlnaHQ6aH07dGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09SD9IOjEwMDM7dGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09ST9JOjEwMDM7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMTt0aGlzLnVucGFja0FsaWdubWVudD0xfWZ1bmN0aW9uIHYoYixlKXt0aGlzLm1pbj12b2lkIDAhPT1iP2I6bmV3IGcoSW5maW5pdHksSW5maW5pdHksSW5maW5pdHkpO3RoaXMubWF4PXZvaWQgMCE9PWU/ZTpuZXcgZygtSW5maW5pdHksLUluZmluaXR5LC1JbmZpbml0eSl9ZnVuY3Rpb24gQShiLGUpe3RoaXMuY2VudGVyPXZvaWQgMCE9PWI/YjpuZXcgZzt0aGlzLnJhZGl1cz12b2lkIDAhPT1lP2U6MH1mdW5jdGlvbiB5KGIsZSl7dGhpcy5ub3JtYWw9dm9pZCAwIT09Yj9iOm5ldyBnKDEsMCwwKTt0aGlzLmNvbnN0YW50PXZvaWQgMCE9PWU/ZTowfWZ1bmN0aW9uIHgoYixlLGgsbix1LHcpe3RoaXMucGxhbmVzPVt2b2lkIDAhPT1iPwpiOm5ldyB5LHZvaWQgMCE9PWU/ZTpuZXcgeSx2b2lkIDAhPT1oP2g6bmV3IHksdm9pZCAwIT09bj9uOm5ldyB5LHZvaWQgMCE9PXU/dTpuZXcgeSx2b2lkIDAhPT13P3c6bmV3IHldfWZ1bmN0aW9uIEMoKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXTswPGFyZ3VtZW50cy5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9ZnVuY3Rpb24gRihiKXt2YXIgZT17fSxoO2ZvcihoIGluIGIpe2VbaF09e307Zm9yKHZhciBuIGluIGJbaF0pe3ZhciB1PWJbaF1bbl07ZVtoXVtuXT11JiYodS5pc0NvbG9yfHx1LmlzTWF0cml4M3x8dS5pc01hdHJpeDR8fHUuaXNWZWN0b3IyfHx1LmlzVmVjdG9yM3x8dS5pc1ZlY3RvcjR8fHUuaXNUZXh0dXJlKT91LmNsb25lKCk6QXJyYXkuaXNBcnJheSh1KT91LnNsaWNlKCk6dX19cmV0dXJuIGV9CmZ1bmN0aW9uIEQoYil7Zm9yKHZhciBlPXt9LGg9MDtoPGIubGVuZ3RoO2grKyl7dmFyIG49RihiW2hdKSx1O2Zvcih1IGluIG4pZVt1XT1uW3VdfXJldHVybiBlfWZ1bmN0aW9uIEIoYixlLGgpe3JldHVybiB2b2lkIDA9PT1lJiZ2b2lkIDA9PT1oP3RoaXMuc2V0KGIpOnRoaXMuc2V0UkdCKGIsZSxoKX1mdW5jdGlvbiBHKCl7ZnVuY3Rpb24gYih1LHcpeyExIT09aCYmKG4odSx3KSxlLnJlcXVlc3RBbmltYXRpb25GcmFtZShiKSl9dmFyIGU9bnVsbCxoPSExLG49bnVsbDtyZXR1cm57c3RhcnQ6ZnVuY3Rpb24oKXshMCE9PWgmJm51bGwhPT1uJiYoZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYiksaD0hMCl9LHN0b3A6ZnVuY3Rpb24oKXtoPSExfSxzZXRBbmltYXRpb25Mb29wOmZ1bmN0aW9uKHUpe249dX0sc2V0Q29udGV4dDpmdW5jdGlvbih1KXtlPXV9fX1mdW5jdGlvbiBLKGIpe2Z1bmN0aW9uIGUodSx3KXt2YXIgej11LmFycmF5LEU9dS5keW5hbWljPzM1MDQ4OjM1MDQ0LEg9Yi5jcmVhdGVCdWZmZXIoKTsKYi5iaW5kQnVmZmVyKHcsSCk7Yi5idWZmZXJEYXRhKHcseixFKTt1Lm9uVXBsb2FkQ2FsbGJhY2soKTt3PTUxMjY7eiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT93PTUxMjY6eiBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuIik6eiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5P3c9NTEyMzp6IGluc3RhbmNlb2YgSW50MTZBcnJheT93PTUxMjI6eiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3c9NTEyNTp6IGluc3RhbmNlb2YgSW50MzJBcnJheT93PTUxMjQ6eiBpbnN0YW5jZW9mIEludDhBcnJheT93PTUxMjA6eiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih3PTUxMjEpO3JldHVybntidWZmZXI6SCx0eXBlOncsYnl0ZXNQZXJFbGVtZW50OnouQllURVNfUEVSX0VMRU1FTlQsdmVyc2lvbjp1LnZlcnNpb259fWZ1bmN0aW9uIGgodSx3LHope3ZhciBFPQp3LmFycmF5LEg9dy51cGRhdGVSYW5nZTtiLmJpbmRCdWZmZXIoeix1KTshMT09PXcuZHluYW1pYz9iLmJ1ZmZlckRhdGEoeixFLDM1MDQ0KTotMT09PUguY291bnQ/Yi5idWZmZXJTdWJEYXRhKHosMCxFKTowPT09SC5jb3VudD9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LiIpOihiLmJ1ZmZlclN1YkRhdGEoeixILm9mZnNldCpFLkJZVEVTX1BFUl9FTEVNRU5ULEUuc3ViYXJyYXkoSC5vZmZzZXQsSC5vZmZzZXQrSC5jb3VudCkpLEguY291bnQ9LTEpfXZhciBuPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24odSl7dS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodT11LmRhdGEpO3JldHVybiBuLmdldCh1KX0sCnJlbW92ZTpmdW5jdGlvbih1KXt1LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJih1PXUuZGF0YSk7dmFyIHc9bi5nZXQodSk7dyYmKGIuZGVsZXRlQnVmZmVyKHcuYnVmZmVyKSxuLmRlbGV0ZSh1KSl9LHVwZGF0ZTpmdW5jdGlvbih1LHcpe3UuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHU9dS5kYXRhKTt2YXIgej1uLmdldCh1KTt2b2lkIDA9PT16P24uc2V0KHUsZSh1LHcpKTp6LnZlcnNpb248dS52ZXJzaW9uJiYoaCh6LmJ1ZmZlcix1LHcpLHoudmVyc2lvbj11LnZlcnNpb24pfX19ZnVuY3Rpb24gTChiLGUsaCxuLHUsdyl7dGhpcy5hPWI7dGhpcy5iPWU7dGhpcy5jPWg7dGhpcy5ub3JtYWw9biYmbi5pc1ZlY3RvcjM/bjpuZXcgZzt0aGlzLnZlcnRleE5vcm1hbHM9QXJyYXkuaXNBcnJheShuKT9uOltdO3RoaXMuY29sb3I9dSYmdS5pc0NvbG9yP3U6bmV3IEI7dGhpcy52ZXJ0ZXhDb2xvcnM9QXJyYXkuaXNBcnJheSh1KT91OltdO3RoaXMubWF0ZXJpYWxJbmRleD0Kdm9pZCAwIT09dz93OjB9ZnVuY3Rpb24gSihiLGUsaCxuKXt0aGlzLl94PWJ8fDA7dGhpcy5feT1lfHwwO3RoaXMuX3o9aHx8MDt0aGlzLl9vcmRlcj1ufHxKLkRlZmF1bHRPcmRlcn1mdW5jdGlvbiBQKCl7dGhpcy5tYXNrPTF9ZnVuY3Rpb24gUygpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkxuKyt9KTt0aGlzLnV1aWQ9b2IuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iT2JqZWN0M0QiO3RoaXMucGFyZW50PW51bGw7dGhpcy5jaGlsZHJlbj1bXTt0aGlzLnVwPVMuRGVmYXVsdFVwLmNsb25lKCk7dmFyIGI9bmV3IGcsZT1uZXcgSixoPW5ldyBmLG49bmV3IGcoMSwxLDEpO2Uub25DaGFuZ2UoZnVuY3Rpb24oKXtoLnNldEZyb21FdWxlcihlLCExKX0pO2gub25DaGFuZ2UoZnVuY3Rpb24oKXtlLnNldEZyb21RdWF0ZXJuaW9uKGgsdm9pZCAwLCExKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsdmFsdWU6Yn0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmh9LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBDfSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBsfX0pO3RoaXMubWF0cml4PW5ldyBDO3RoaXMubWF0cml4V29ybGQ9bmV3IEM7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPVMuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExO3RoaXMubGF5ZXJzPW5ldyBQO3RoaXMudmlzaWJsZT0hMDt0aGlzLnJlY2VpdmVTaGFkb3c9dGhpcy5jYXN0U2hhZG93PSExO3RoaXMuZnJ1c3R1bUN1bGxlZD0hMDt0aGlzLnJlbmRlck9yZGVyPTA7dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiBOKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsCiJpZCIse3ZhbHVlOk1uKz0yfSk7dGhpcy51dWlkPW9iLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9Ikdlb21ldHJ5Ijt0aGlzLnZlcnRpY2VzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMuZmFjZXM9W107dGhpcy5mYWNlVmVydGV4VXZzPVtbXV07dGhpcy5tb3JwaFRhcmdldHM9W107dGhpcy5tb3JwaE5vcm1hbHM9W107dGhpcy5za2luV2VpZ2h0cz1bXTt0aGlzLnNraW5JbmRpY2VzPVtdO3RoaXMubGluZURpc3RhbmNlcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9dGhpcy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZT10aGlzLmNvbG9yc05lZWRVcGRhdGU9dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT10aGlzLnV2c05lZWRVcGRhdGU9dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9dGhpcy5lbGVtZW50c05lZWRVcGRhdGU9ITF9ZnVuY3Rpb24gVChiLGUsaCl7aWYoQXJyYXkuaXNBcnJheShiKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpOwp0aGlzLm5hbWU9IiI7dGhpcy5hcnJheT1iO3RoaXMuaXRlbVNpemU9ZTt0aGlzLmNvdW50PXZvaWQgMCE9PWI/Yi5sZW5ndGgvZTowO3RoaXMubm9ybWFsaXplZD0hMD09PWg7dGhpcy5keW5hbWljPSExO3RoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfTt0aGlzLnZlcnNpb249MH1mdW5jdGlvbiBZKGIsZSxoKXtULmNhbGwodGhpcyxuZXcgSW50OEFycmF5KGIpLGUsaCl9ZnVuY3Rpb24gYWEoYixlLGgpe1QuY2FsbCh0aGlzLG5ldyBVaW50OEFycmF5KGIpLGUsaCl9ZnVuY3Rpb24gaGEoYixlLGgpe1QuY2FsbCh0aGlzLG5ldyBVaW50OENsYW1wZWRBcnJheShiKSxlLGgpfWZ1bmN0aW9uIFgoYixlLGgpe1QuY2FsbCh0aGlzLG5ldyBJbnQxNkFycmF5KGIpLGUsaCl9ZnVuY3Rpb24gY2EoYixlLGgpe1QuY2FsbCh0aGlzLG5ldyBVaW50MTZBcnJheShiKSxlLGgpfWZ1bmN0aW9uIGVhKGIsZSxoKXtULmNhbGwodGhpcyxuZXcgSW50MzJBcnJheShiKSxlLGgpfWZ1bmN0aW9uIGthKGIsCmUsaCl7VC5jYWxsKHRoaXMsbmV3IFVpbnQzMkFycmF5KGIpLGUsaCl9ZnVuY3Rpb24gYmEoYixlLGgpe1QuY2FsbCh0aGlzLG5ldyBGbG9hdDMyQXJyYXkoYiksZSxoKX1mdW5jdGlvbiBsYShiLGUsaCl7VC5jYWxsKHRoaXMsbmV3IEZsb2F0NjRBcnJheShiKSxlLGgpfWZ1bmN0aW9uIHdhKCl7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLm5vcm1hbHM9W107dGhpcy5jb2xvcnM9W107dGhpcy51dnM9W107dGhpcy51dnMyPVtdO3RoaXMuZ3JvdXBzPVtdO3RoaXMubW9ycGhUYXJnZXRzPXt9O3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9dGhpcy51dnNOZWVkVXBkYXRlPXRoaXMuY29sb3JzTmVlZFVwZGF0ZT10aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPSExfWZ1bmN0aW9uIENhKGIpe2lmKDA9PT1iLmxlbmd0aClyZXR1cm4tSW5maW5pdHk7CmZvcih2YXIgZT1iWzBdLGg9MSxuPWIubGVuZ3RoO2g8bjsrK2gpYltoXT5lJiYoZT1iW2hdKTtyZXR1cm4gZX1mdW5jdGlvbiB4YSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk5uKz0yfSk7dGhpcy51dWlkPW9iLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLmluZGV4PW51bGw7dGhpcy5hdHRyaWJ1dGVzPXt9O3RoaXMubW9ycGhBdHRyaWJ1dGVzPXt9O3RoaXMuZ3JvdXBzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OkluZmluaXR5fTt0aGlzLnVzZXJEYXRhPXt9fWZ1bmN0aW9uIHphKGIsZSxoLG4sdSx3KXtOLmNhbGwodGhpcyk7dGhpcy50eXBlPSJCb3hHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDpiLGhlaWdodDplLGRlcHRoOmgsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnUsCmRlcHRoU2VnbWVudHM6d307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEZhKGIsZSxoLG4sdSx3KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gRmEoYixlLGgsbix1LHcpe2Z1bmN0aW9uIHooVyxaLGZhLHFhLHJhLGlhLHRhLG5hLHZhLEJhLHNhKXt2YXIgRGE9aWEvdmEsSGE9dGEvQmEsS2E9aWEvMixOYT10YS8yLExhPW5hLzI7dGE9dmErMTt2YXIgZmI9QmErMSxjYj1pYT0wLEphLGhiLFVhPW5ldyBnO2ZvcihoYj0wO2hiPGZiO2hiKyspe3ZhciBIYj1oYipIYS1OYTtmb3IoSmE9MDtKYTx0YTtKYSsrKVVhW1ddPShKYSpEYS1LYSkqcWEsVWFbWl09SGIqcmEsVWFbZmFdPUxhLEkucHVzaChVYS54LFVhLnksVWEueiksVWFbV109MCxVYVtaXT0wLFVhW2ZhXT0wPG5hPzE6LTEsTy5wdXNoKFVhLngsVWEueSxVYS56KSxRLnB1c2goSmEvdmEpLFEucHVzaCgxLWhiL0JhKSxpYSs9MX1mb3IoaGI9MDtoYjxCYTtoYisrKWZvcihKYT0wO0phPHZhO0phKyspVz1SK0phKwp0YSooaGIrMSksWj1SKyhKYSsxKSt0YSooaGIrMSksZmE9UisoSmErMSkrdGEqaGIsSC5wdXNoKFIrSmErdGEqaGIsVyxmYSksSC5wdXNoKFcsWixmYSksY2IrPTY7RS5hZGRHcm91cChVLGNiLHNhKTtVKz1jYjtSKz1pYX14YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQm94QnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YixoZWlnaHQ6ZSxkZXB0aDpoLHdpZHRoU2VnbWVudHM6bixoZWlnaHRTZWdtZW50czp1LGRlcHRoU2VnbWVudHM6d307dmFyIEU9dGhpcztiPWJ8fDE7ZT1lfHwxO2g9aHx8MTtuPU1hdGguZmxvb3Iobil8fDE7dT1NYXRoLmZsb29yKHUpfHwxO3c9TWF0aC5mbG9vcih3KXx8MTt2YXIgSD1bXSxJPVtdLE89W10sUT1bXSxSPTAsVT0wO3ooInoiLCJ5IiwieCIsLTEsLTEsaCxlLGIsdyx1LDApO3ooInoiLCJ5IiwieCIsMSwtMSxoLGUsLWIsdyx1LDEpO3ooIngiLCJ6IiwieSIsMSwxLGIsaCxlLG4sdywyKTt6KCJ4IiwieiIsInkiLDEsLTEsYiwKaCwtZSxuLHcsMyk7eigieCIsInkiLCJ6IiwxLC0xLGIsZSxoLG4sdSw0KTt6KCJ4IiwieSIsInoiLC0xLC0xLGIsZSwtaCxuLHUsNSk7dGhpcy5zZXRJbmRleChIKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShJLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoTywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoUSwyKSl9ZnVuY3Rpb24gU2EoYixlLGgsbil7Ti5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGxhbmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDpiLGhlaWdodDplLHdpZHRoU2VnbWVudHM6aCxoZWlnaHRTZWdtZW50czpufTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgRWEoYixlLGgsbikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEVhKGIsZSxoLG4pe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQbGFuZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmIsaGVpZ2h0OmUsCndpZHRoU2VnbWVudHM6aCxoZWlnaHRTZWdtZW50czpufTtiPWJ8fDE7ZT1lfHwxO3ZhciB1PWIvMix3PWUvMjtoPU1hdGguZmxvb3IoaCl8fDE7bj1NYXRoLmZsb29yKG4pfHwxO3ZhciB6PWgrMSxFPW4rMSxIPWIvaCxJPWUvbixPPVtdLFE9W10sUj1bXSxVPVtdO2ZvcihiPTA7YjxFO2IrKyl7dmFyIFc9YipJLXc7Zm9yKGU9MDtlPHo7ZSsrKVEucHVzaChlKkgtdSwtVywwKSxSLnB1c2goMCwwLDEpLFUucHVzaChlL2gpLFUucHVzaCgxLWIvbil9Zm9yKGI9MDtiPG47YisrKWZvcihlPTA7ZTxoO2UrKyl1PWUreiooYisxKSx3PWUrMSt6KihiKzEpLEU9ZSsxK3oqYixPLnB1c2goZSt6KmIsdSxFKSxPLnB1c2godSx3LEUpO3RoaXMuc2V0SW5kZXgoTyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoUSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGJhKFIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKFUsMikpfWZ1bmN0aW9uIEdhKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsCiJpZCIse3ZhbHVlOk9uKyt9KTt0aGlzLnV1aWQ9b2IuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iTWF0ZXJpYWwiO3RoaXMubGlnaHRzPXRoaXMuZm9nPSEwO3RoaXMuYmxlbmRpbmc9MTt0aGlzLnNpZGU9MDt0aGlzLnZlcnRleFRhbmdlbnRzPXRoaXMuZmxhdFNoYWRpbmc9ITE7dGhpcy52ZXJ0ZXhDb2xvcnM9MDt0aGlzLm9wYWNpdHk9MTt0aGlzLnRyYW5zcGFyZW50PSExO3RoaXMuYmxlbmRTcmM9MjA0O3RoaXMuYmxlbmREc3Q9MjA1O3RoaXMuYmxlbmRFcXVhdGlvbj0xMDA7dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmRTcmNBbHBoYT1udWxsO3RoaXMuZGVwdGhGdW5jPTM7dGhpcy5kZXB0aFdyaXRlPXRoaXMuZGVwdGhUZXN0PSEwO3RoaXMuY2xpcHBpbmdQbGFuZXM9bnVsbDt0aGlzLmNsaXBTaGFkb3dzPXRoaXMuY2xpcEludGVyc2VjdGlvbj0hMTt0aGlzLnNoYWRvd1NpZGU9bnVsbDt0aGlzLmNvbG9yV3JpdGU9CiEwO3RoaXMucHJlY2lzaW9uPW51bGw7dGhpcy5wb2x5Z29uT2Zmc2V0PSExO3RoaXMucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wO3RoaXMuZGl0aGVyaW5nPSExO3RoaXMuYWxwaGFUZXN0PTA7dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITE7dGhpcy52aXNpYmxlPSEwO3RoaXMudXNlckRhdGE9e307dGhpcy5uZWVkc1VwZGF0ZT0hMH1mdW5jdGlvbiBkYihiKXtHYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2hhZGVyTWF0ZXJpYWwiO3RoaXMuZGVmaW5lcz17fTt0aGlzLnVuaWZvcm1zPXt9O3RoaXMudmVydGV4U2hhZGVyPSJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iO3RoaXMuZnJhZ21lbnRTaGFkZXI9InZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XG59IjsKdGhpcy5saW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9dGhpcy5jbGlwcGluZz10aGlzLmxpZ2h0cz10aGlzLmZvZz0hMTt0aGlzLmV4dGVuc2lvbnM9e2Rlcml2YXRpdmVzOiExLGZyYWdEZXB0aDohMSxkcmF3QnVmZmVyczohMSxzaGFkZXJUZXh0dXJlTE9EOiExfTt0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM9e2NvbG9yOlsxLDEsMV0sdXY6WzAsMF0sdXYyOlswLDBdfTt0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWU9dm9pZCAwO3RoaXMudW5pZm9ybXNOZWVkVXBkYXRlPSExO3ZvaWQgMCE9PWImJih2b2lkIDAhPT1iLmF0dHJpYnV0ZXMmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNoYWRlck1hdGVyaWFsOiBhdHRyaWJ1dGVzIHNob3VsZCBub3cgYmUgZGVmaW5lZCBpbiBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpLHRoaXMuc2V0VmFsdWVzKGIpKX0KZnVuY3Rpb24geGIoYixlKXt0aGlzLm9yaWdpbj12b2lkIDAhPT1iP2I6bmV3IGc7dGhpcy5kaXJlY3Rpb249dm9pZCAwIT09ZT9lOm5ldyBnfWZ1bmN0aW9uIENiKGIsZSxoKXt0aGlzLmE9dm9pZCAwIT09Yj9iOm5ldyBnO3RoaXMuYj12b2lkIDAhPT1lP2U6bmV3IGc7dGhpcy5jPXZvaWQgMCE9PWg/aDpuZXcgZ31mdW5jdGlvbiB5YihiKXtHYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEIoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9dGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0KMTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gdGIoYixlKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoIjt0aGlzLmdlb21ldHJ5PXZvaWQgMCE9PWI/YjpuZXcgeGE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1lP2U6bmV3IHliKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSk7dGhpcy5kcmF3TW9kZT0wO3RoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9ZnVuY3Rpb24gQ2MoYixlLGgsbil7ZnVuY3Rpb24gdShRLFIpe2UuYnVmZmVycy5jb2xvci5zZXRDbGVhcihRLnIsUS5nLFEuYixSLG4pfXZhciB3PW5ldyBCKDApLHo9MCxFLEgsST1udWxsLE89MDtyZXR1cm57Z2V0Q2xlYXJDb2xvcjpmdW5jdGlvbigpe3JldHVybiB3fSxzZXRDbGVhckNvbG9yOmZ1bmN0aW9uKFEsUil7dy5zZXQoUSk7Cno9dm9pZCAwIT09Uj9SOjE7dSh3LHopfSxnZXRDbGVhckFscGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHp9LHNldENsZWFyQWxwaGE6ZnVuY3Rpb24oUSl7ej1RO3Uodyx6KX0scmVuZGVyOmZ1bmN0aW9uKFEsUixVLFcpe1I9Ui5iYWNrZ3JvdW5kO1U9Yi52cjsoVT1VLmdldFNlc3Npb24mJlUuZ2V0U2Vzc2lvbigpKSYmImFkZGl0aXZlIj09PVUuZW52aXJvbm1lbnRCbGVuZE1vZGUmJihSPW51bGwpO251bGw9PT1SPyh1KHcseiksST1udWxsLE89MCk6UiYmUi5pc0NvbG9yJiYodShSLDEpLFc9ITAsST1udWxsLE89MCk7KGIuYXV0b0NsZWFyfHxXKSYmYi5jbGVhcihiLmF1dG9DbGVhckNvbG9yLGIuYXV0b0NsZWFyRGVwdGgsYi5hdXRvQ2xlYXJTdGVuY2lsKTtpZihSJiYoUi5pc0N1YmVUZXh0dXJlfHxSLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKSl7dm9pZCAwPT09SCYmKEg9bmV3IHRiKG5ldyBGYSgxLDEsMSksbmV3IGRiKHt0eXBlOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3JtczpGKGlkLmN1YmUudW5pZm9ybXMpLAp2ZXJ0ZXhTaGFkZXI6aWQuY3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6aWQuY3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOjEsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEguZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxILmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSgidXYiKSxILm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKFosZmEscWEpe3RoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKHFhLm1hdHJpeFdvcmxkKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KEgubWF0ZXJpYWwsIm1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaWZvcm1zLnRDdWJlLnZhbHVlfX0pLGgudXBkYXRlKEgpKTtXPVIuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/Ui50ZXh0dXJlOlI7SC5tYXRlcmlhbC51bmlmb3Jtcy50Q3ViZS52YWx1ZT1XO0gubWF0ZXJpYWwudW5pZm9ybXMudEZsaXAudmFsdWU9Ui5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT8KMTotMTtpZihJIT09Unx8TyE9PVcudmVyc2lvbilILm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLEk9UixPPVcudmVyc2lvbjtRLnVuc2hpZnQoSCxILmdlb21ldHJ5LEgubWF0ZXJpYWwsMCwwLG51bGwpfWVsc2UgaWYoUiYmUi5pc1RleHR1cmUpe3ZvaWQgMD09PUUmJihFPW5ldyB0YihuZXcgRWEoMiwyKSxuZXcgZGIoe3R5cGU6IkJhY2tncm91bmRNYXRlcmlhbCIsdW5pZm9ybXM6RihpZC5iYWNrZ3JvdW5kLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6aWQuYmFja2dyb3VuZC52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6aWQuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEUuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLGgudXBkYXRlKEUpKTsKRS5tYXRlcmlhbC51bmlmb3Jtcy50MkQudmFsdWU9UjshMD09PVIubWF0cml4QXV0b1VwZGF0ZSYmUi51cGRhdGVNYXRyaXgoKTtFLm1hdGVyaWFsLnVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoUi5tYXRyaXgpO2lmKEkhPT1SfHxPIT09Ui52ZXJzaW9uKUUubWF0ZXJpYWwubmVlZHNVcGRhdGU9ITAsST1SLE89Ui52ZXJzaW9uO1EudW5zaGlmdChFLEUuZ2VvbWV0cnksRS5tYXRlcmlhbCwwLDAsbnVsbCl9fX19ZnVuY3Rpb24gWmIoYixlLGgsbil7dmFyIHU7dGhpcy5zZXRNb2RlPWZ1bmN0aW9uKHcpe3U9d307dGhpcy5yZW5kZXI9ZnVuY3Rpb24odyx6KXtiLmRyYXdBcnJheXModSx3LHopO2gudXBkYXRlKHosdSl9O3RoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uKHcseixFKXtpZihuLmlzV2ViR0wyKXZhciBIPWI7ZWxzZSBpZihIPWUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksbnVsbD09PUgpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpOwpyZXR1cm59SFtuLmlzV2ViR0wyPyJkcmF3QXJyYXlzSW5zdGFuY2VkIjoiZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFIl0odSx6LEUsdy5tYXhJbnN0YW5jZWRDb3VudCk7aC51cGRhdGUoRSx1LHcubWF4SW5zdGFuY2VkQ291bnQpfX1mdW5jdGlvbiBoZChiLGUsaCl7ZnVuY3Rpb24gbihpYSl7aWYoImhpZ2hwIj09PWlhKXtpZigwPGIuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM4KS5wcmVjaXNpb24mJjA8Yi5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzgpLnByZWNpc2lvbilyZXR1cm4iaGlnaHAiO2lhPSJtZWRpdW1wIn1yZXR1cm4ibWVkaXVtcCI9PT1pYSYmMDxiLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzNykucHJlY2lzaW9uJiYwPGIuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM3KS5wcmVjaXNpb24/Im1lZGl1bXAiOiJsb3dwIn12YXIgdSx3PSJ1bmRlZmluZWQiIT09dHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQmJgpiIGluc3RhbmNlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCx6PXZvaWQgMCE9PWgucHJlY2lzaW9uP2gucHJlY2lzaW9uOiJoaWdocCIsRT1uKHopO0UhPT16JiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiIseiwibm90IHN1cHBvcnRlZCwgdXNpbmciLEUsImluc3RlYWQuIiksej1FKTtoPSEwPT09aC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyO0U9Yi5nZXRQYXJhbWV0ZXIoMzQ5MzApO3ZhciBIPWIuZ2V0UGFyYW1ldGVyKDM1NjYwKSxJPWIuZ2V0UGFyYW1ldGVyKDMzNzkpLE89Yi5nZXRQYXJhbWV0ZXIoMzQwNzYpLFE9Yi5nZXRQYXJhbWV0ZXIoMzQ5MjEpLFI9Yi5nZXRQYXJhbWV0ZXIoMzYzNDcpLFU9Yi5nZXRQYXJhbWV0ZXIoMzYzNDgpLFc9Yi5nZXRQYXJhbWV0ZXIoMzYzNDkpLFo9MDxILGZhPXd8fCEhZS5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IikscWE9WiYmZmEscmE9dz9iLmdldFBhcmFtZXRlcigzNjE4Myk6MDtyZXR1cm57aXNXZWJHTDI6dyxnZXRNYXhBbmlzb3Ryb3B5OmZ1bmN0aW9uKCl7aWYodm9pZCAwIT09CnUpcmV0dXJuIHU7dmFyIGlhPWUuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtyZXR1cm4gdT1udWxsIT09aWE/Yi5nZXRQYXJhbWV0ZXIoaWEuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKTowfSxnZXRNYXhQcmVjaXNpb246bixwcmVjaXNpb246eixsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmgsbWF4VGV4dHVyZXM6RSxtYXhWZXJ0ZXhUZXh0dXJlczpILG1heFRleHR1cmVTaXplOkksbWF4Q3ViZW1hcFNpemU6TyxtYXhBdHRyaWJ1dGVzOlEsbWF4VmVydGV4VW5pZm9ybXM6UixtYXhWYXJ5aW5nczpVLG1heEZyYWdtZW50VW5pZm9ybXM6Vyx2ZXJ0ZXhUZXh0dXJlczpaLGZsb2F0RnJhZ21lbnRUZXh0dXJlczpmYSxmbG9hdFZlcnRleFRleHR1cmVzOnFhLG1heFNhbXBsZXM6cmF9fWZ1bmN0aW9uICRiKCl7ZnVuY3Rpb24gYigpe0kudmFsdWUhPT1uJiYoSS52YWx1ZT1uLEkubmVlZHNVcGRhdGU9MDx1KTtoLm51bVBsYW5lcz11O2gubnVtSW50ZXJzZWN0aW9uPQowfWZ1bmN0aW9uIGUoTyxRLFIsVSl7dmFyIFc9bnVsbCE9PU8/Ty5sZW5ndGg6MCxaPW51bGw7aWYoMCE9PVcpe1o9SS52YWx1ZTtpZighMCE9PVV8fG51bGw9PT1aKXtVPVIrNCpXO1E9US5tYXRyaXhXb3JsZEludmVyc2U7SC5nZXROb3JtYWxNYXRyaXgoUSk7aWYobnVsbD09PVp8fFoubGVuZ3RoPFUpWj1uZXcgRmxvYXQzMkFycmF5KFUpO2ZvcihVPTA7VSE9PVc7KytVLFIrPTQpRS5jb3B5KE9bVV0pLmFwcGx5TWF0cml4NChRLEgpLEUubm9ybWFsLnRvQXJyYXkoWixSKSxaW1IrM109RS5jb25zdGFudH1JLnZhbHVlPVo7SS5uZWVkc1VwZGF0ZT0hMH1oLm51bVBsYW5lcz1XO3JldHVybiBafXZhciBoPXRoaXMsbj1udWxsLHU9MCx3PSExLHo9ITEsRT1uZXcgeSxIPW5ldyBsLEk9e3ZhbHVlOm51bGwsbmVlZHNVcGRhdGU6ITF9O3RoaXMudW5pZm9ybT1JO3RoaXMubnVtSW50ZXJzZWN0aW9uPXRoaXMubnVtUGxhbmVzPTA7dGhpcy5pbml0PWZ1bmN0aW9uKE8sUSxSKXt2YXIgVT0KMCE9PU8ubGVuZ3RofHxRfHwwIT09dXx8dzt3PVE7bj1lKE8sUiwwKTt1PU8ubGVuZ3RoO3JldHVybiBVfTt0aGlzLmJlZ2luU2hhZG93cz1mdW5jdGlvbigpe3o9ITA7ZShudWxsKX07dGhpcy5lbmRTaGFkb3dzPWZ1bmN0aW9uKCl7ej0hMTtiKCl9O3RoaXMuc2V0U3RhdGU9ZnVuY3Rpb24oTyxRLFIsVSxXLFope2lmKCF3fHxudWxsPT09T3x8MD09PU8ubGVuZ3RofHx6JiYhUil6P2UobnVsbCk6YigpO2Vsc2V7Uj16PzA6dTt2YXIgZmE9NCpSLHFhPVcuY2xpcHBpbmdTdGF0ZXx8bnVsbDtJLnZhbHVlPXFhO3FhPWUoTyxVLGZhLFopO2ZvcihPPTA7TyE9PWZhOysrTylxYVtPXT1uW09dO1cuY2xpcHBpbmdTdGF0ZT1xYTt0aGlzLm51bUludGVyc2VjdGlvbj1RP3RoaXMubnVtUGxhbmVzOjA7dGhpcy5udW1QbGFuZXMrPVJ9fX1mdW5jdGlvbiBmYyhiKXt2YXIgZT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGgpe2lmKHZvaWQgMCE9PWVbaF0pcmV0dXJuIGVbaF07c3dpdGNoKGgpe2Nhc2UgIldFQkdMX2RlcHRoX3RleHR1cmUiOnZhciBuPQpiLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxiLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8Yi5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7YnJlYWs7Y2FzZSAiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIjpuPWIuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8Yi5nZXRFeHRlbnNpb24oIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8Yi5nZXRFeHRlbnNpb24oIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTticmVhaztjYXNlICJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyI6bj1iLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8Yi5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHxiLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIik7CmJyZWFrO2Nhc2UgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6bj1iLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fGIuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7YnJlYWs7ZGVmYXVsdDpuPWIuZ2V0RXh0ZW5zaW9uKGgpfW51bGw9PT1uJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIraCsiIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLiIpO3JldHVybiBlW2hdPW59fX1mdW5jdGlvbiBBYShiLGUsaCl7ZnVuY3Rpb24gbih6KXt2YXIgRT16LnRhcmdldDt6PXVbRS5pZF07bnVsbCE9PXouaW5kZXgmJmUucmVtb3ZlKHouaW5kZXgpO2Zvcih2YXIgSCBpbiB6LmF0dHJpYnV0ZXMpZS5yZW1vdmUoei5hdHRyaWJ1dGVzW0hdKTtFLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG4pO2RlbGV0ZSB1W0UuaWRdO2lmKEg9d1t6LmlkXSllLnJlbW92ZShIKSxkZWxldGUgd1t6LmlkXTsKaC5tZW1vcnkuZ2VvbWV0cmllcy0tfXZhciB1PXt9LHc9e307cmV0dXJue2dldDpmdW5jdGlvbih6LEUpe3ZhciBIPXVbRS5pZF07aWYoSClyZXR1cm4gSDtFLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG4pO0UuaXNCdWZmZXJHZW9tZXRyeT9IPUU6RS5pc0dlb21ldHJ5JiYodm9pZCAwPT09RS5fYnVmZmVyR2VvbWV0cnkmJihFLl9idWZmZXJHZW9tZXRyeT0obmV3IHhhKS5zZXRGcm9tT2JqZWN0KHopKSxIPUUuX2J1ZmZlckdlb21ldHJ5KTt1W0UuaWRdPUg7aC5tZW1vcnkuZ2VvbWV0cmllcysrO3JldHVybiBIfSx1cGRhdGU6ZnVuY3Rpb24oeil7dmFyIEU9ei5pbmRleCxIPXouYXR0cmlidXRlcztudWxsIT09RSYmZS51cGRhdGUoRSwzNDk2Myk7Zm9yKHZhciBJIGluIEgpZS51cGRhdGUoSFtJXSwzNDk2Mik7ej16Lm1vcnBoQXR0cmlidXRlcztmb3IoSSBpbiB6KXtFPXpbSV07SD0wO2Zvcih2YXIgTz1FLmxlbmd0aDtIPE87SCsrKWUudXBkYXRlKEVbSF0sMzQ5NjIpfX0sCmdldFdpcmVmcmFtZUF0dHJpYnV0ZTpmdW5jdGlvbih6KXt2YXIgRT13W3ouaWRdO2lmKEUpcmV0dXJuIEU7RT1bXTt2YXIgSD16LmluZGV4LEk9ei5hdHRyaWJ1dGVzO2lmKG51bGwhPT1IKXtIPUguYXJyYXk7ST0wO2Zvcih2YXIgTz1ILmxlbmd0aDtJPE87SSs9Myl7dmFyIFE9SFtJKzBdLFI9SFtJKzFdLFU9SFtJKzJdO0UucHVzaChRLFIsUixVLFUsUSl9fWVsc2UgZm9yKEg9SS5wb3NpdGlvbi5hcnJheSxJPTAsTz1ILmxlbmd0aC8zLTE7STxPO0krPTMpUT1JKzAsUj1JKzEsVT1JKzIsRS5wdXNoKFEsUixSLFUsVSxRKTtFPW5ldyAoNjU1MzU8Q2EoRSk/a2E6Y2EpKEUsMSk7ZS51cGRhdGUoRSwzNDk2Myk7cmV0dXJuIHdbei5pZF09RX19fWZ1bmN0aW9uIE1iKGIsZSxoLG4pe3ZhciB1LHcsejt0aGlzLnNldE1vZGU9ZnVuY3Rpb24oRSl7dT1FfTt0aGlzLnNldEluZGV4PWZ1bmN0aW9uKEUpe3c9RS50eXBlO3o9RS5ieXRlc1BlckVsZW1lbnR9O3RoaXMucmVuZGVyPWZ1bmN0aW9uKEUsCkgpe2IuZHJhd0VsZW1lbnRzKHUsSCx3LEUqeik7aC51cGRhdGUoSCx1KX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24oRSxILEkpe2lmKG4uaXNXZWJHTDIpdmFyIE89YjtlbHNlIGlmKE89ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxudWxsPT09Tyl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpO3JldHVybn1PW24uaXNXZWJHTDI/ImRyYXdFbGVtZW50c0luc3RhbmNlZCI6ImRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFIl0odSxJLHcsSCp6LEUubWF4SW5zdGFuY2VkQ291bnQpO2gudXBkYXRlKEksdSxFLm1heEluc3RhbmNlZENvdW50KX19ZnVuY3Rpb24gamMoKXt2YXIgYj17ZnJhbWU6MCxjYWxsczowLHRyaWFuZ2xlczowLHBvaW50czowLApsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmIscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24oKXtiLmZyYW1lKys7Yi5jYWxscz0wO2IudHJpYW5nbGVzPTA7Yi5wb2ludHM9MDtiLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbihlLGgsbil7bj1ufHwxO2IuY2FsbHMrKztzd2l0Y2goaCl7Y2FzZSA0OmIudHJpYW5nbGVzKz1lLzMqbjticmVhaztjYXNlIDU6Y2FzZSA2OmIudHJpYW5nbGVzKz1uKihlLTIpO2JyZWFrO2Nhc2UgMTpiLmxpbmVzKz1lLzIqbjticmVhaztjYXNlIDM6Yi5saW5lcys9biooZS0xKTticmVhaztjYXNlIDI6Yi5saW5lcys9biplO2JyZWFrO2Nhc2UgMDpiLnBvaW50cys9biplO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLGgpfX19fWZ1bmN0aW9uIHRkKGIsZSl7cmV0dXJuIE1hdGguYWJzKGVbMV0pLU1hdGguYWJzKGJbMV0pfQpmdW5jdGlvbiBOZChiKXt2YXIgZT17fSxoPW5ldyBGbG9hdDMyQXJyYXkoOCk7cmV0dXJue3VwZGF0ZTpmdW5jdGlvbihuLHUsdyx6KXt2YXIgRT1uLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxIPUUubGVuZ3RoO249ZVt1LmlkXTtpZih2b2lkIDA9PT1uKXtuPVtdO2Zvcih2YXIgST0wO0k8SDtJKyspbltJXT1bSSwwXTtlW3UuaWRdPW59dmFyIE89dy5tb3JwaFRhcmdldHMmJnUubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO3c9dy5tb3JwaE5vcm1hbHMmJnUubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtmb3IoST0wO0k8SDtJKyspe3ZhciBRPW5bSV07MCE9PVFbMV0mJihPJiZ1LnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0kpLHcmJnUucmVtb3ZlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSSkpfWZvcihJPTA7STxIO0krKylRPW5bSV0sUVswXT1JLFFbMV09RVtJXTtuLnNvcnQodGQpO2ZvcihJPTA7OD5JO0krKyl7aWYoUT1uW0ldKWlmKEU9UVswXSxIPVFbMV0pe08mJnUuYWRkQXR0cmlidXRlKCJtb3JwaFRhcmdldCIrCkksT1tFXSk7dyYmdS5hZGRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIitJLHdbRV0pO2hbSV09SDtjb250aW51ZX1oW0ldPTB9ei5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGIsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsaCl9fX1mdW5jdGlvbiAkZyhiLGUpe3ZhciBoPXt9O3JldHVybnt1cGRhdGU6ZnVuY3Rpb24obil7dmFyIHU9ZS5yZW5kZXIuZnJhbWUsdz1uLmdlb21ldHJ5LHo9Yi5nZXQobix3KTtoW3ouaWRdIT09dSYmKHcuaXNHZW9tZXRyeSYmei51cGRhdGVGcm9tT2JqZWN0KG4pLGIudXBkYXRlKHopLGhbei5pZF09dSk7cmV0dXJuIHp9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtoPXt9fX19ZnVuY3Rpb24gdWQoYixlLGgsbix1LHcseixFLEgsSSl7Yj12b2lkIDAhPT1iP2I6W107ay5jYWxsKHRoaXMsYix2b2lkIDAhPT1lP2U6MzAxLGgsbix1LHcsdm9pZCAwIT09ej96OjEwMjIsRSxILEkpO3RoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gS2UoYixlLGgsbil7ay5jYWxsKHRoaXMsbnVsbCk7CnRoaXMuaW1hZ2U9e2RhdGE6Yix3aWR0aDplLGhlaWdodDpoLGRlcHRoOm59O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gTGUoYixlLGgsbil7ay5jYWxsKHRoaXMsbnVsbCk7dGhpcy5pbWFnZT17ZGF0YTpiLHdpZHRoOmUsaGVpZ2h0OmgsZGVwdGg6bn07dGhpcy5taW5GaWx0ZXI9dGhpcy5tYWdGaWx0ZXI9MTAwMzt0aGlzLndyYXBSPTEwMDE7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBNZShiLGUsaCl7dmFyIG49YlswXTtpZigwPj1ufHwwPG4pcmV0dXJuIGI7dmFyIHU9ZSpoLHc9U2tbdV07dm9pZCAwPT09dyYmKHc9bmV3IEZsb2F0MzJBcnJheSh1KSxTa1t1XT13KTtpZigwIT09ZSlmb3Iobi50b0FycmF5KHcsMCksbj0xLHU9MDtuIT09ZTsrK24pdSs9aCxiW25dLnRvQXJyYXkodyx1KTtyZXR1cm4gd31mdW5jdGlvbiBhYyhiLAplKXtpZihiLmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaD0wLG49Yi5sZW5ndGg7aDxuO2grKylpZihiW2hdIT09ZVtoXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBrYyhiLGUpe2Zvcih2YXIgaD0wLG49ZS5sZW5ndGg7aDxuO2grKyliW2hdPWVbaF19ZnVuY3Rpb24gVGsoYixlKXt2YXIgaD1Va1tlXTt2b2lkIDA9PT1oJiYoaD1uZXcgSW50MzJBcnJheShlKSxVa1tlXT1oKTtmb3IodmFyIG49MDtuIT09ZTsrK24paFtuXT1iLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gaH1mdW5jdGlvbiBQbihiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aFswXSE9PWUmJihiLnVuaWZvcm0xZih0aGlzLmFkZHIsZSksaFswXT1lKX1mdW5jdGlvbiBRbihiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aFswXSE9PWUmJihiLnVuaWZvcm0xaSh0aGlzLmFkZHIsZSksaFswXT1lKX1mdW5jdGlvbiBSbihiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KXtpZihoWzBdIT09CmUueHx8aFsxXSE9PWUueSliLnVuaWZvcm0yZih0aGlzLmFkZHIsZS54LGUueSksaFswXT1lLngsaFsxXT1lLnl9ZWxzZSBhYyhoLGUpfHwoYi51bmlmb3JtMmZ2KHRoaXMuYWRkcixlKSxrYyhoLGUpKX1mdW5jdGlvbiBTbihiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KXtpZihoWzBdIT09ZS54fHxoWzFdIT09ZS55fHxoWzJdIT09ZS56KWIudW5pZm9ybTNmKHRoaXMuYWRkcixlLngsZS55LGUueiksaFswXT1lLngsaFsxXT1lLnksaFsyXT1lLnp9ZWxzZSBpZih2b2lkIDAhPT1lLnIpe2lmKGhbMF0hPT1lLnJ8fGhbMV0hPT1lLmd8fGhbMl0hPT1lLmIpYi51bmlmb3JtM2YodGhpcy5hZGRyLGUucixlLmcsZS5iKSxoWzBdPWUucixoWzFdPWUuZyxoWzJdPWUuYn1lbHNlIGFjKGgsZSl8fChiLnVuaWZvcm0zZnYodGhpcy5hZGRyLGUpLGtjKGgsZSkpfWZ1bmN0aW9uIFRuKGIsZSl7dmFyIGg9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1lLngpe2lmKGhbMF0hPT1lLnh8fApoWzFdIT09ZS55fHxoWzJdIT09ZS56fHxoWzNdIT09ZS53KWIudW5pZm9ybTRmKHRoaXMuYWRkcixlLngsZS55LGUueixlLncpLGhbMF09ZS54LGhbMV09ZS55LGhbMl09ZS56LGhbM109ZS53fWVsc2UgYWMoaCxlKXx8KGIudW5pZm9ybTRmdih0aGlzLmFkZHIsZSksa2MoaCxlKSl9ZnVuY3Rpb24gVW4oYixlKXt2YXIgaD10aGlzLmNhY2hlLG49ZS5lbGVtZW50czt2b2lkIDA9PT1uP2FjKGgsZSl8fChiLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGUpLGtjKGgsZSkpOmFjKGgsbil8fChWay5zZXQobiksYi51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxWayksa2MoaCxuKSl9ZnVuY3Rpb24gVm4oYixlKXt2YXIgaD10aGlzLmNhY2hlLG49ZS5lbGVtZW50czt2b2lkIDA9PT1uP2FjKGgsZSl8fChiLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGUpLGtjKGgsZSkpOmFjKGgsbil8fChXay5zZXQobiksYi51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSwKV2spLGtjKGgsbikpfWZ1bmN0aW9uIFduKGIsZSl7dmFyIGg9dGhpcy5jYWNoZSxuPWUuZWxlbWVudHM7dm9pZCAwPT09bj9hYyhoLGUpfHwoYi51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxlKSxrYyhoLGUpKTphYyhoLG4pfHwoWGsuc2V0KG4pLGIudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsWGspLGtjKGgsbikpfWZ1bmN0aW9uIFhuKGIsZSxoKXt2YXIgbj10aGlzLmNhY2hlLHU9aC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PXUmJihiLnVuaWZvcm0xaSh0aGlzLmFkZHIsdSksblswXT11KTtoLnNhZmVTZXRUZXh0dXJlMkQoZXx8WWssdSl9ZnVuY3Rpb24gWW4oYixlLGgpe3ZhciBuPXRoaXMuY2FjaGUsdT1oLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09dSYmKGIudW5pZm9ybTFpKHRoaXMuYWRkcix1KSxuWzBdPXUpO2guc2V0VGV4dHVyZTJEQXJyYXkoZXx8Wm4sdSl9ZnVuY3Rpb24gJG4oYixlLGgpe3ZhciBuPXRoaXMuY2FjaGUsdT1oLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKblswXSE9PXUmJihiLnVuaWZvcm0xaSh0aGlzLmFkZHIsdSksblswXT11KTtoLnNldFRleHR1cmUzRChlfHxhbyx1KX1mdW5jdGlvbiBibyhiLGUsaCl7dmFyIG49dGhpcy5jYWNoZSx1PWguYWxsb2NhdGVUZXh0dXJlVW5pdCgpO25bMF0hPT11JiYoYi51bmlmb3JtMWkodGhpcy5hZGRyLHUpLG5bMF09dSk7aC5zYWZlU2V0VGV4dHVyZUN1YmUoZXx8WmssdSl9ZnVuY3Rpb24gJGsoYixlKXt2YXIgaD10aGlzLmNhY2hlO2FjKGgsZSl8fChiLnVuaWZvcm0yaXYodGhpcy5hZGRyLGUpLGtjKGgsZSkpfWZ1bmN0aW9uIGFsKGIsZSl7dmFyIGg9dGhpcy5jYWNoZTthYyhoLGUpfHwoYi51bmlmb3JtM2l2KHRoaXMuYWRkcixlKSxrYyhoLGUpKX1mdW5jdGlvbiBibChiLGUpe3ZhciBoPXRoaXMuY2FjaGU7YWMoaCxlKXx8KGIudW5pZm9ybTRpdih0aGlzLmFkZHIsZSksa2MoaCxlKSl9ZnVuY3Rpb24gY28oYil7c3dpdGNoKGIpe2Nhc2UgNTEyNjpyZXR1cm4gUG47Y2FzZSAzNTY2NDpyZXR1cm4gUm47CmNhc2UgMzU2NjU6cmV0dXJuIFNuO2Nhc2UgMzU2NjY6cmV0dXJuIFRuO2Nhc2UgMzU2NzQ6cmV0dXJuIFVuO2Nhc2UgMzU2NzU6cmV0dXJuIFZuO2Nhc2UgMzU2NzY6cmV0dXJuIFduO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpyZXR1cm4gWG47Y2FzZSAzNTY3OTpyZXR1cm4gJG47Y2FzZSAzNTY4MDpyZXR1cm4gYm87Y2FzZSAzNjI4OTpyZXR1cm4gWW47Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIFFuO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gJGs7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBhbDtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIGJsfX1mdW5jdGlvbiBlbyhiLGUpe3ZhciBoPXRoaXMuY2FjaGU7YWMoaCxlKXx8KGIudW5pZm9ybTFmdih0aGlzLmFkZHIsZSksa2MoaCxlKSl9ZnVuY3Rpb24gZm8oYixlKXt2YXIgaD10aGlzLmNhY2hlO2FjKGgsZSl8fChiLnVuaWZvcm0xaXYodGhpcy5hZGRyLGUpLGtjKGgsZSkpfWZ1bmN0aW9uIGdvKGIsZSl7dmFyIGg9CnRoaXMuY2FjaGU7ZT1NZShlLHRoaXMuc2l6ZSwyKTthYyhoLGUpfHwoYi51bmlmb3JtMmZ2KHRoaXMuYWRkcixlKSx0aGlzLnVwZGF0ZUNhY2hlKGUpKX1mdW5jdGlvbiBobyhiLGUpe3ZhciBoPXRoaXMuY2FjaGU7ZT1NZShlLHRoaXMuc2l6ZSwzKTthYyhoLGUpfHwoYi51bmlmb3JtM2Z2KHRoaXMuYWRkcixlKSx0aGlzLnVwZGF0ZUNhY2hlKGUpKX1mdW5jdGlvbiBpbyhiLGUpe3ZhciBoPXRoaXMuY2FjaGU7ZT1NZShlLHRoaXMuc2l6ZSw0KTthYyhoLGUpfHwoYi51bmlmb3JtNGZ2KHRoaXMuYWRkcixlKSx0aGlzLnVwZGF0ZUNhY2hlKGUpKX1mdW5jdGlvbiBqbyhiLGUpe3ZhciBoPXRoaXMuY2FjaGU7ZT1NZShlLHRoaXMuc2l6ZSw0KTthYyhoLGUpfHwoYi51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxlKSx0aGlzLnVwZGF0ZUNhY2hlKGUpKX1mdW5jdGlvbiBrbyhiLGUpe3ZhciBoPXRoaXMuY2FjaGU7ZT1NZShlLHRoaXMuc2l6ZSw5KTthYyhoLGUpfHwoYi51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwKITEsZSksdGhpcy51cGRhdGVDYWNoZShlKSl9ZnVuY3Rpb24gbG8oYixlKXt2YXIgaD10aGlzLmNhY2hlO2U9TWUoZSx0aGlzLnNpemUsMTYpO2FjKGgsZSl8fChiLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLGUpLHRoaXMudXBkYXRlQ2FjaGUoZSkpfWZ1bmN0aW9uIG1vKGIsZSxoKXt2YXIgbj10aGlzLmNhY2hlLHU9ZS5sZW5ndGgsdz1UayhoLHUpOyExPT09YWMobix3KSYmKGIudW5pZm9ybTFpdih0aGlzLmFkZHIsdyksa2Mobix3KSk7Zm9yKGI9MDtiIT09dTsrK2IpaC5zYWZlU2V0VGV4dHVyZTJEKGVbYl18fFlrLHdbYl0pfWZ1bmN0aW9uIG5vKGIsZSxoKXt2YXIgbj10aGlzLmNhY2hlLHU9ZS5sZW5ndGgsdz1UayhoLHUpOyExPT09YWMobix3KSYmKGIudW5pZm9ybTFpdih0aGlzLmFkZHIsdyksa2Mobix3KSk7Zm9yKGI9MDtiIT09dTsrK2IpaC5zYWZlU2V0VGV4dHVyZUN1YmUoZVtiXXx8Wmssd1tiXSl9ZnVuY3Rpb24gb28oYil7c3dpdGNoKGIpe2Nhc2UgNTEyNjpyZXR1cm4gZW87CmNhc2UgMzU2NjQ6cmV0dXJuIGdvO2Nhc2UgMzU2NjU6cmV0dXJuIGhvO2Nhc2UgMzU2NjY6cmV0dXJuIGlvO2Nhc2UgMzU2NzQ6cmV0dXJuIGpvO2Nhc2UgMzU2NzU6cmV0dXJuIGtvO2Nhc2UgMzU2NzY6cmV0dXJuIGxvO2Nhc2UgMzU2Nzg6cmV0dXJuIG1vO2Nhc2UgMzU2ODA6cmV0dXJuIG5vO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBmbztjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuICRrO2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gYWw7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiBibH19ZnVuY3Rpb24gcG8oYixlLGgpe3RoaXMuaWQ9Yjt0aGlzLmFkZHI9aDt0aGlzLmNhY2hlPVtdO3RoaXMuc2V0VmFsdWU9Y28oZS50eXBlKX1mdW5jdGlvbiBjbChiLGUsaCl7dGhpcy5pZD1iO3RoaXMuYWRkcj1oO3RoaXMuY2FjaGU9W107dGhpcy5zaXplPWUuc2l6ZTt0aGlzLnNldFZhbHVlPW9vKGUudHlwZSl9ZnVuY3Rpb24gZGwoYil7dGhpcy5pZD1iO3RoaXMuc2VxPQpbXTt0aGlzLm1hcD17fX1mdW5jdGlvbiBlbChiLGUpe2Iuc2VxLnB1c2goZSk7Yi5tYXBbZS5pZF09ZX1mdW5jdGlvbiBxbyhiLGUsaCl7dmFyIG49Yi5uYW1lLHU9bi5sZW5ndGg7Zm9yKHJpLmxhc3RJbmRleD0wOzspe3ZhciB3PXJpLmV4ZWMobiksej1yaS5sYXN0SW5kZXgsRT13WzFdLEg9d1szXTsiXSI9PT13WzJdJiYoRXw9MCk7aWYodm9pZCAwPT09SHx8IlsiPT09SCYmeisyPT09dSl7ZWwoaCx2b2lkIDA9PT1IP25ldyBwbyhFLGIsZSk6bmV3IGNsKEUsYixlKSk7YnJlYWt9ZWxzZSB3PWgubWFwW0VdLHZvaWQgMD09PXcmJih3PW5ldyBkbChFKSxlbChoLHcpKSxoPXd9fWZ1bmN0aW9uIE9kKGIsZSl7dGhpcy5zZXE9W107dGhpcy5tYXA9e307Zm9yKHZhciBoPWIuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLDM1NzE4KSxuPTA7bjxoOysrbil7dmFyIHU9Yi5nZXRBY3RpdmVVbmlmb3JtKGUsbik7cW8odSxiLmdldFVuaWZvcm1Mb2NhdGlvbihlLHUubmFtZSksdGhpcyl9fWZ1bmN0aW9uIHJvKGIpe2I9CmIuc3BsaXQoIlxuIik7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspYltlXT1lKzErIjogIitiW2VdO3JldHVybiBiLmpvaW4oIlxuIil9ZnVuY3Rpb24gZmwoYixlLGgsbil7dmFyIHU9Yi5jcmVhdGVTaGFkZXIoZSk7Yi5zaGFkZXJTb3VyY2UodSxoKTtiLmNvbXBpbGVTaGFkZXIodSk7ITA9PT1uJiYoITE9PT1iLmdldFNoYWRlclBhcmFtZXRlcih1LDM1NzEzKSYmY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTaGFkZXI6IFNoYWRlciBjb3VsZG4ndCBjb21waWxlLiIpLCIiIT09Yi5nZXRTaGFkZXJJbmZvTG9nKHUpJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMU2hhZGVyOiBnbC5nZXRTaGFkZXJJbmZvTG9nKCkiLDM1NjMzPT09ZT8idmVydGV4IjoiZnJhZ21lbnQiLGIuZ2V0U2hhZGVySW5mb0xvZyh1KSxybyhoKSkpO3JldHVybiB1fWZ1bmN0aW9uIGdsKGIpe3N3aXRjaChiKXtjYXNlIDNFMzpyZXR1cm5bIkxpbmVhciIsIiggdmFsdWUgKSJdO2Nhc2UgMzAwMTpyZXR1cm5bInNSR0IiLAoiKCB2YWx1ZSApIl07Y2FzZSAzMDAyOnJldHVyblsiUkdCRSIsIiggdmFsdWUgKSJdO2Nhc2UgMzAwNDpyZXR1cm5bIlJHQk0iLCIoIHZhbHVlLCA3LjAgKSJdO2Nhc2UgMzAwNTpyZXR1cm5bIlJHQk0iLCIoIHZhbHVlLCAxNi4wICkiXTtjYXNlIDMwMDY6cmV0dXJuWyJSR0JEIiwiKCB2YWx1ZSwgMjU2LjAgKSJdO2Nhc2UgMzAwNzpyZXR1cm5bIkdhbW1hIiwiKCB2YWx1ZSwgZmxvYXQoIEdBTU1BX0ZBQ1RPUiApICkiXTtkZWZhdWx0OnRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNvZGluZzogIitiKTt9fWZ1bmN0aW9uIGFoKGIsZSl7ZT1nbChlKTtyZXR1cm4idmVjNCAiK2IrIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICIrZVswXSsiVG9MaW5lYXIiK2VbMV0rIjsgfSJ9ZnVuY3Rpb24gc28oYixlKXtlPWdsKGUpO3JldHVybiJ2ZWM0ICIrYisiKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gTGluZWFyVG8iK2VbMF0rZVsxXSsiOyB9In1mdW5jdGlvbiB0byhiLGUpe3N3aXRjaChlKXtjYXNlIDE6ZT0KIkxpbmVhciI7YnJlYWs7Y2FzZSAyOmU9IlJlaW5oYXJkIjticmVhaztjYXNlIDM6ZT0iVW5jaGFydGVkMiI7YnJlYWs7Y2FzZSA0OmU9Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA1OmU9IkFDRVNGaWxtaWMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAiK2UpO31yZXR1cm4idmVjMyAiK2IrIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrZSsiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifWZ1bmN0aW9uIHVvKGIsZSxoKXtiPWJ8fHt9O3JldHVybltiLmRlcml2YXRpdmVzfHxlLmVudk1hcEN1YmVVVnx8ZS5idW1wTWFwfHxlLm5vcm1hbE1hcCYmIWUub2JqZWN0U3BhY2VOb3JtYWxNYXB8fGUuZmxhdFNoYWRpbmc/IiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogZW5hYmxlIjoiIiwoYi5mcmFnRGVwdGh8fGUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcikmJmguZ2V0KCJFWFRfZnJhZ19kZXB0aCIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlIjoKIiIsYi5kcmF3QnVmZmVycyYmaC5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwoYi5zaGFkZXJUZXh0dXJlTE9EfHxlLmVudk1hcCkmJmguZ2V0KCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIik/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcihPZikuam9pbigiXG4iKX1mdW5jdGlvbiB2byhiKXt2YXIgZT1bXSxoO2ZvcihoIGluIGIpe3ZhciBuPWJbaF07ITEhPT1uJiZlLnB1c2goIiNkZWZpbmUgIitoKyIgIituKX1yZXR1cm4gZS5qb2luKCJcbiIpfWZ1bmN0aW9uIHdvKGIsZSl7Zm9yKHZhciBoPXt9LG49Yi5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsMzU3MjEpLHU9MDt1PG47dSsrKXt2YXIgdz1iLmdldEFjdGl2ZUF0dHJpYihlLHUpLm5hbWU7aFt3XT1iLmdldEF0dHJpYkxvY2F0aW9uKGUsdyl9cmV0dXJuIGh9ZnVuY3Rpb24gT2YoYil7cmV0dXJuIiIhPT0KYn1mdW5jdGlvbiBobChiLGUpe3JldHVybiBiLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csZS5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLGUubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyxlLm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csZS5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csZS5udW1IZW1pTGlnaHRzKX1mdW5jdGlvbiBpbChiLGUpe3JldHVybiBiLnJlcGxhY2UoL05VTV9DTElQUElOR19QTEFORVMvZyxlLm51bUNsaXBwaW5nUGxhbmVzKS5yZXBsYWNlKC9VTklPTl9DTElQUElOR19QTEFORVMvZyxlLm51bUNsaXBwaW5nUGxhbmVzLWUubnVtQ2xpcEludGVyc2VjdGlvbil9ZnVuY3Rpb24gc2koYil7cmV0dXJuIGIucmVwbGFjZSgvXlsgXHRdKiNpbmNsdWRlICs8KFtcd1xkLi9dKyk+L2dtLGZ1bmN0aW9uKGUsaCl7ZT16YltoXTtpZih2b2lkIDA9PT0KZSl0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIFx4M2MiK2grIlx4M2UiKTtyZXR1cm4gc2koZSl9KX1mdW5jdGlvbiBqbChiKXtyZXR1cm4gYi5yZXBsYWNlKC8jcHJhZ21hIHVucm9sbF9sb29wW1xzXSs/Zm9yIFwoIGludCBpID0gKFxkKyk7IGkgPCAoXGQrKTsgaSBcK1wrIFwpIFx7KFtcc1xTXSs/KSg/PVx9KVx9L2csZnVuY3Rpb24oZSxoLG4sdSl7ZT0iIjtmb3IoaD1wYXJzZUludChoKTtoPHBhcnNlSW50KG4pO2grKyllKz11LnJlcGxhY2UoL1xbIGkgXF0vZywiWyAiK2grIiBdIik7cmV0dXJuIGV9KX1mdW5jdGlvbiB4byhiLGUsaCxuLHUsdyx6LEUpe3ZhciBIPWIuY29udGV4dCxJPW4uZGVmaW5lcyxPPXUudmVydGV4U2hhZGVyLFE9dS5mcmFnbWVudFNoYWRlcixSPSJTSEFET1dNQVBfVFlQRV9CQVNJQyI7MT09PXcuc2hhZG93TWFwVHlwZT9SPSJTSEFET1dNQVBfVFlQRV9QQ0YiOjI9PT13LnNoYWRvd01hcFR5cGUmJihSPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCIpOwp2YXIgVT0iRU5WTUFQX1RZUEVfQ1VCRSIsVz0iRU5WTUFQX01PREVfUkVGTEVDVElPTiIsWj0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjtpZih3LmVudk1hcCl7c3dpdGNoKG4uZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAxOmNhc2UgMzAyOlU9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgMzA2OmNhc2UgMzA3OlU9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrO2Nhc2UgMzAzOmNhc2UgMzA0OlU9IkVOVk1BUF9UWVBFX0VRVUlSRUMiO2JyZWFrO2Nhc2UgMzA1OlU9IkVOVk1BUF9UWVBFX1NQSEVSRSJ9c3dpdGNoKG4uZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAyOmNhc2UgMzA0Olc9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXN3aXRjaChuLmNvbWJpbmUpe2Nhc2UgMDpaPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTpaPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6Wj0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9fXZhciBmYT0wPGIuZ2FtbWFGYWN0b3I/CmIuZ2FtbWFGYWN0b3I6MSxxYT16LmlzV2ViR0wyPyIiOnVvKG4uZXh0ZW5zaW9ucyx3LGUpLHJhPXZvKEkpLGlhPUguY3JlYXRlUHJvZ3JhbSgpO24uaXNSYXdTaGFkZXJNYXRlcmlhbD8oST1bcmFdLmZpbHRlcihPZikuam9pbigiXG4iKSwwPEkubGVuZ3RoJiYoSSs9IlxuIiksZT1bcWEscmFdLmZpbHRlcihPZikuam9pbigiXG4iKSwwPGUubGVuZ3RoJiYoZSs9IlxuIikpOihJPVsicHJlY2lzaW9uICIrdy5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit3LnByZWNpc2lvbisiIGludDsiLCIjZGVmaW5lIFNIQURFUl9OQU1FICIrdS5uYW1lLHJhLHcuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBWRVJURVhfVEVYVFVSRVMiOiIiLCIjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAiK2ZhLCIjZGVmaW5lIE1BWF9CT05FUyAiK3cubWF4Qm9uZXMsdy51c2VGb2cmJncuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHcudXNlRm9nJiZ3LmZvZ0V4cD8iI2RlZmluZSBGT0dfRVhQMiI6CiIiLHcubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lICIrVzoiIix3LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdy5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHcuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix3LmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHcubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHcubm9ybWFsTWFwJiZ3Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdy5kaXNwbGFjZW1lbnRNYXAmJncuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix3LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdy5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6CiIiLHcubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLHcuYWxwaGFNYXA/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIix3LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIix3LnZlcnRleENvbG9ycz8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLHcuZmxhdFNoYWRpbmc/IiNkZWZpbmUgRkxBVF9TSEFERUQiOiIiLHcuc2tpbm5pbmc/IiNkZWZpbmUgVVNFX1NLSU5OSU5HIjoiIix3LnVzZVZlcnRleFRleHR1cmU/IiNkZWZpbmUgQk9ORV9URVhUVVJFIjoiIix3Lm1vcnBoVGFyZ2V0cz8iI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTIjoiIix3Lm1vcnBoTm9ybWFscyYmITE9PT13LmZsYXRTaGFkaW5nPyIjZGVmaW5lIFVTRV9NT1JQSE5PUk1BTFMiOiIiLHcuZG91YmxlU2lkZWQ/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIix3LmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIix3LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6CiIiLHcuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK1I6IiIsdy5zaXplQXR0ZW51YXRpb24/IiNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTiI6IiIsdy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsdy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiYoei5pc1dlYkdMMnx8ZS5nZXQoIkVYVF9mcmFnX2RlcHRoIikpPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7IiwidW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsiLCJhdHRyaWJ1dGUgdmVjMyBub3JtYWw7IiwiYXR0cmlidXRlIHZlYzIgdXY7IiwiI2lmZGVmIFVTRV9UQU5HRU5UIiwKIlx0YXR0cmlidXRlIHZlYzQgdGFuZ2VudDsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX0NPTE9SIiwiXHRhdHRyaWJ1dGUgdmVjMyBjb2xvcjsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX01PUlBIVEFSR0VUUyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQwOyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQzOyIsIlx0I2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOyIsIlx0I2Vsc2UiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDU7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsiLAoiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NzsiLCJcdCNlbmRpZiIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfU0tJTk5JTkciLCJcdGF0dHJpYnV0ZSB2ZWM0IHNraW5JbmRleDsiLCJcdGF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7IiwiI2VuZGlmIiwiXG4iXS5maWx0ZXIoT2YpLmpvaW4oIlxuIiksZT1bcWEsInByZWNpc2lvbiAiK3cucHJlY2lzaW9uKyIgZmxvYXQ7IiwicHJlY2lzaW9uICIrdy5wcmVjaXNpb24rIiBpbnQ7IiwiI2RlZmluZSBTSEFERVJfTkFNRSAiK3UubmFtZSxyYSx3LmFscGhhVGVzdD8iI2RlZmluZSBBTFBIQVRFU1QgIit3LmFscGhhVGVzdCsody5hbHBoYVRlc3QlMT8iIjoiLjAiKToiIiwiI2RlZmluZSBHQU1NQV9GQUNUT1IgIitmYSx3LnVzZUZvZyYmdy5mb2c/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsdy51c2VGb2cmJncuZm9nRXhwPyIjZGVmaW5lIEZPR19FWFAyIjoiIix3Lm1hcD8iI2RlZmluZSBVU0VfTUFQIjoiIix3Lm1hdGNhcD8iI2RlZmluZSBVU0VfTUFUQ0FQIjoKIiIsdy5lbnZNYXA/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsdy5lbnZNYXA/IiNkZWZpbmUgIitVOiIiLHcuZW52TWFwPyIjZGVmaW5lICIrVzoiIix3LmVudk1hcD8iI2RlZmluZSAiK1o6IiIsdy5saWdodE1hcD8iI2RlZmluZSBVU0VfTElHSFRNQVAiOiIiLHcuYW9NYXA/IiNkZWZpbmUgVVNFX0FPTUFQIjoiIix3LmVtaXNzaXZlTWFwPyIjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCI6IiIsdy5idW1wTWFwPyIjZGVmaW5lIFVTRV9CVU1QTUFQIjoiIix3Lm5vcm1hbE1hcD8iI2RlZmluZSBVU0VfTk9STUFMTUFQIjoiIix3Lm5vcm1hbE1hcCYmdy5vYmplY3RTcGFjZU5vcm1hbE1hcD8iI2RlZmluZSBPQkpFQ1RTUEFDRV9OT1JNQUxNQVAiOiIiLHcuc3BlY3VsYXJNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQIjoiIix3LnJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIjoiIix3Lm1ldGFsbmVzc01hcD8iI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQIjoiIix3LmFscGhhTWFwPwoiI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHcudmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLHcudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdy5ncmFkaWVudE1hcD8iI2RlZmluZSBVU0VfR1JBRElFTlRNQVAiOiIiLHcuZmxhdFNoYWRpbmc/IiNkZWZpbmUgRkxBVF9TSEFERUQiOiIiLHcuZG91YmxlU2lkZWQ/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIix3LmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIix3LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6IiIsdy5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lICIrUjoiIix3LnByZW11bHRpcGxpZWRBbHBoYT8iI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBIjoiIix3LnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPyIjZGVmaW5lIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMiOiIiLHcubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOgoiIix3LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJih6LmlzV2ViR0wyfHxlLmdldCgiRVhUX2ZyYWdfZGVwdGgiKSk/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCI6IiIsdy5lbnZNYXAmJih6LmlzV2ViR0wyfHxlLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpKT8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwwIT09dy50b25lTWFwcGluZz8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLDAhPT13LnRvbmVNYXBwaW5nP3piLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PXcudG9uZU1hcHBpbmc/dG8oInRvbmVNYXBwaW5nIix3LnRvbmVNYXBwaW5nKToiIix3LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHcub3V0cHV0RW5jb2Rpbmd8fHcubWFwRW5jb2Rpbmd8fHcubWF0Y2FwRW5jb2Rpbmd8fHcuZW52TWFwRW5jb2Rpbmd8fHcuZW1pc3NpdmVNYXBFbmNvZGluZz8KemIuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IiIsdy5tYXBFbmNvZGluZz9haCgibWFwVGV4ZWxUb0xpbmVhciIsdy5tYXBFbmNvZGluZyk6IiIsdy5tYXRjYXBFbmNvZGluZz9haCgibWF0Y2FwVGV4ZWxUb0xpbmVhciIsdy5tYXRjYXBFbmNvZGluZyk6IiIsdy5lbnZNYXBFbmNvZGluZz9haCgiZW52TWFwVGV4ZWxUb0xpbmVhciIsdy5lbnZNYXBFbmNvZGluZyk6IiIsdy5lbWlzc2l2ZU1hcEVuY29kaW5nP2FoKCJlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIiLHcuZW1pc3NpdmVNYXBFbmNvZGluZyk6IiIsdy5vdXRwdXRFbmNvZGluZz9zbygibGluZWFyVG9PdXRwdXRUZXhlbCIsdy5vdXRwdXRFbmNvZGluZyk6IiIsdy5kZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK24uZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcihPZikuam9pbigiXG4iKSk7Tz1zaShPKTtPPWhsKE8sdyk7Tz1pbChPLHcpO1E9c2koUSk7UT1obChRLHcpO1E9aWwoUSx3KTtPPWpsKE8pOwpRPWpsKFEpO3ouaXNXZWJHTDImJiFuLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJih6PSExLFI9L15ccyojdmVyc2lvblxzKzMwMFxzK2VzXHMqXG4vLG4uaXNTaGFkZXJNYXRlcmlhbCYmbnVsbCE9PU8ubWF0Y2goUikmJm51bGwhPT1RLm1hdGNoKFIpJiYoej0hMCxPPU8ucmVwbGFjZShSLCIiKSxRPVEucmVwbGFjZShSLCIiKSksST0iI3ZlcnNpb24gMzAwIGVzXG5cbiNkZWZpbmUgYXR0cmlidXRlIGluXG4jZGVmaW5lIHZhcnlpbmcgb3V0XG4jZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlXG4iK0ksZT1bIiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIHZhcnlpbmcgaW4iLHo/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLHo/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlXG4jZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2pcbiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2RcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWRcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkXG4jZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrCiJcbiIrZSk7UT1lK1E7Tz1mbChILDM1NjMzLEkrTyxiLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKTtRPWZsKEgsMzU2MzIsUSxiLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKTtILmF0dGFjaFNoYWRlcihpYSxPKTtILmF0dGFjaFNoYWRlcihpYSxRKTt2b2lkIDAhPT1uLmluZGV4MEF0dHJpYnV0ZU5hbWU/SC5iaW5kQXR0cmliTG9jYXRpb24oaWEsMCxuLmluZGV4MEF0dHJpYnV0ZU5hbWUpOiEwPT09dy5tb3JwaFRhcmdldHMmJkguYmluZEF0dHJpYkxvY2F0aW9uKGlhLDAsInBvc2l0aW9uIik7SC5saW5rUHJvZ3JhbShpYSk7aWYoYi5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycyl7Yj1ILmdldFByb2dyYW1JbmZvTG9nKGlhKS50cmltKCk7dz1ILmdldFNoYWRlckluZm9Mb2coTykudHJpbSgpO3o9SC5nZXRTaGFkZXJJbmZvTG9nKFEpLnRyaW0oKTtVPVI9ITA7aWYoITE9PT1ILmdldFByb2dyYW1QYXJhbWV0ZXIoaWEsMzU3MTQpKVI9ITEsY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICIsCkguZ2V0RXJyb3IoKSwiMzU3MTUiLEguZ2V0UHJvZ3JhbVBhcmFtZXRlcihpYSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIixiLHcseik7ZWxzZSBpZigiIiE9PWIpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCkiLGIpO2Vsc2UgaWYoIiI9PT13fHwiIj09PXopVT0hMTtVJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6UixtYXRlcmlhbDpuLHByb2dyYW1Mb2c6Yix2ZXJ0ZXhTaGFkZXI6e2xvZzp3LHByZWZpeDpJfSxmcmFnbWVudFNoYWRlcjp7bG9nOnoscHJlZml4OmV9fSl9SC5kZWxldGVTaGFkZXIoTyk7SC5kZWxldGVTaGFkZXIoUSk7dmFyIHRhO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT10YSYmKHRhPW5ldyBPZChILGlhLEUpKTtyZXR1cm4gdGF9O3ZhciBuYTt0aGlzLmdldEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT1uYSYmKG5hPXdvKEgsaWEpKTtyZXR1cm4gbmF9O3RoaXMuZGVzdHJveT0KZnVuY3Rpb24oKXtILmRlbGV0ZVByb2dyYW0oaWEpO3RoaXMucHJvZ3JhbT12b2lkIDB9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3VuaWZvcm1zOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogLnVuaWZvcm1zIGlzIG5vdyAuZ2V0VW5pZm9ybXMoKS4iKTtyZXR1cm4gdGhpcy5nZXRVbmlmb3JtcygpfX0sYXR0cmlidXRlczp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IC5hdHRyaWJ1dGVzIGlzIG5vdyAuZ2V0QXR0cmlidXRlcygpLiIpO3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKX19fSk7dGhpcy5uYW1lPXUubmFtZTt0aGlzLmlkPXlvKys7dGhpcy5jb2RlPWg7dGhpcy51c2VkVGltZXM9MTt0aGlzLnByb2dyYW09aWE7dGhpcy52ZXJ0ZXhTaGFkZXI9Tzt0aGlzLmZyYWdtZW50U2hhZGVyPVE7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gem8oYixlLGgsbil7ZnVuY3Rpb24gdShJKXtJPQpJLnNrZWxldG9uLmJvbmVzO2lmKGguZmxvYXRWZXJ0ZXhUZXh0dXJlcylyZXR1cm4gMTAyNDt2YXIgTz1NYXRoLm1pbihNYXRoLmZsb29yKChoLm1heFZlcnRleFVuaWZvcm1zLTIwKS80KSxJLmxlbmd0aCk7cmV0dXJuIE88SS5sZW5ndGg/KGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICIrSS5sZW5ndGgrIiBib25lcy4gVGhpcyBHUFUgc3VwcG9ydHMgIitPKyIuIiksMCk6T31mdW5jdGlvbiB3KEksTyl7aWYoSSlJLmlzVGV4dHVyZT9RPUkuZW5jb2Rpbmc6SS5pc1dlYkdMUmVuZGVyVGFyZ2V0JiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksUT1JLnRleHR1cmUuZW5jb2RpbmcpO2Vsc2UgdmFyIFE9M0UzOzNFMz09PVEmJk8mJihRPTMwMDcpOwpyZXR1cm4gUX12YXIgej1bXSxFPXtNZXNoRGVwdGhNYXRlcmlhbDoiZGVwdGgiLE1lc2hEaXN0YW5jZU1hdGVyaWFsOiJkaXN0YW5jZVJHQkEiLE1lc2hOb3JtYWxNYXRlcmlhbDoibm9ybWFsIixNZXNoQmFzaWNNYXRlcmlhbDoiYmFzaWMiLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ImxhbWJlcnQiLE1lc2hQaG9uZ01hdGVyaWFsOiJwaG9uZyIsTWVzaFRvb25NYXRlcmlhbDoicGhvbmciLE1lc2hTdGFuZGFyZE1hdGVyaWFsOiJwaHlzaWNhbCIsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoTWF0Y2FwTWF0ZXJpYWw6Im1hdGNhcCIsTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9LEg9InByZWNpc2lvbiBzdXBwb3J0c1ZlcnRleFRleHR1cmVzIG1hcCBtYXBFbmNvZGluZyBtYXRjYXAgbWF0Y2FwRW5jb2RpbmcgZW52TWFwIGVudk1hcE1vZGUgZW52TWFwRW5jb2RpbmcgbGlnaHRNYXAgYW9NYXAgZW1pc3NpdmVNYXAgZW1pc3NpdmVNYXBFbmNvZGluZyBidW1wTWFwIG5vcm1hbE1hcCBvYmplY3RTcGFjZU5vcm1hbE1hcCBkaXNwbGFjZW1lbnRNYXAgc3BlY3VsYXJNYXAgcm91Z2huZXNzTWFwIG1ldGFsbmVzc01hcCBncmFkaWVudE1hcCBhbHBoYU1hcCBjb21iaW5lIHZlcnRleENvbG9ycyB2ZXJ0ZXhUYW5nZW50cyBmb2cgdXNlRm9nIGZvZ0V4cCBmbGF0U2hhZGluZyBzaXplQXR0ZW51YXRpb24gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciBza2lubmluZyBtYXhCb25lcyB1c2VWZXJ0ZXhUZXh0dXJlIG1vcnBoVGFyZ2V0cyBtb3JwaE5vcm1hbHMgbWF4TW9ycGhUYXJnZXRzIG1heE1vcnBoTm9ybWFscyBwcmVtdWx0aXBsaWVkQWxwaGEgbnVtRGlyTGlnaHRzIG51bVBvaW50TGlnaHRzIG51bVNwb3RMaWdodHMgbnVtSGVtaUxpZ2h0cyBudW1SZWN0QXJlYUxpZ2h0cyBzaGFkb3dNYXBFbmFibGVkIHNoYWRvd01hcFR5cGUgdG9uZU1hcHBpbmcgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMgYWxwaGFUZXN0IGRvdWJsZVNpZGVkIGZsaXBTaWRlZCBudW1DbGlwcGluZ1BsYW5lcyBudW1DbGlwSW50ZXJzZWN0aW9uIGRlcHRoUGFja2luZyBkaXRoZXJpbmciLnNwbGl0KCIgIik7CnRoaXMuZ2V0UGFyYW1ldGVycz1mdW5jdGlvbihJLE8sUSxSLFUsVyxaKXt2YXIgZmE9RVtJLnR5cGVdLHFhPVouaXNTa2lubmVkTWVzaD91KFopOjAscmE9aC5wcmVjaXNpb247bnVsbCE9PUkucHJlY2lzaW9uJiYocmE9aC5nZXRNYXhQcmVjaXNpb24oSS5wcmVjaXNpb24pLHJhIT09SS5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixJLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLHJhLCJpbnN0ZWFkLiIpKTt2YXIgaWE9Yi5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57c2hhZGVySUQ6ZmEscHJlY2lzaW9uOnJhLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6aC52ZXJ0ZXhUZXh0dXJlcyxvdXRwdXRFbmNvZGluZzp3KGlhP2lhLnRleHR1cmU6bnVsbCxiLmdhbW1hT3V0cHV0KSxtYXA6ISFJLm1hcCxtYXBFbmNvZGluZzp3KEkubWFwLGIuZ2FtbWFJbnB1dCksbWF0Y2FwOiEhSS5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6dyhJLm1hdGNhcCwKYi5nYW1tYUlucHV0KSxlbnZNYXA6ISFJLmVudk1hcCxlbnZNYXBNb2RlOkkuZW52TWFwJiZJLmVudk1hcC5tYXBwaW5nLGVudk1hcEVuY29kaW5nOncoSS5lbnZNYXAsYi5nYW1tYUlucHV0KSxlbnZNYXBDdWJlVVY6ISFJLmVudk1hcCYmKDMwNj09PUkuZW52TWFwLm1hcHBpbmd8fDMwNz09PUkuZW52TWFwLm1hcHBpbmcpLGxpZ2h0TWFwOiEhSS5saWdodE1hcCxhb01hcDohIUkuYW9NYXAsZW1pc3NpdmVNYXA6ISFJLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6dyhJLmVtaXNzaXZlTWFwLGIuZ2FtbWFJbnB1dCksYnVtcE1hcDohIUkuYnVtcE1hcCxub3JtYWxNYXA6ISFJLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09SS5ub3JtYWxNYXBUeXBlLGRpc3BsYWNlbWVudE1hcDohIUkuZGlzcGxhY2VtZW50TWFwLHJvdWdobmVzc01hcDohIUkucm91Z2huZXNzTWFwLG1ldGFsbmVzc01hcDohIUkubWV0YWxuZXNzTWFwLHNwZWN1bGFyTWFwOiEhSS5zcGVjdWxhck1hcCwKYWxwaGFNYXA6ISFJLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhSS5ncmFkaWVudE1hcCxjb21iaW5lOkkuY29tYmluZSx2ZXJ0ZXhUYW5nZW50czpJLm5vcm1hbE1hcCYmSS52ZXJ0ZXhUYW5nZW50cyx2ZXJ0ZXhDb2xvcnM6SS52ZXJ0ZXhDb2xvcnMsZm9nOiEhUix1c2VGb2c6SS5mb2csZm9nRXhwOlImJlIuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOkkuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOkkuc2l6ZUF0dGVudWF0aW9uLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6aC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLHNraW5uaW5nOkkuc2tpbm5pbmcmJjA8cWEsbWF4Qm9uZXM6cWEsdXNlVmVydGV4VGV4dHVyZTpoLmZsb2F0VmVydGV4VGV4dHVyZXMsbW9ycGhUYXJnZXRzOkkubW9ycGhUYXJnZXRzLG1vcnBoTm9ybWFsczpJLm1vcnBoTm9ybWFscyxtYXhNb3JwaFRhcmdldHM6Yi5tYXhNb3JwaFRhcmdldHMsbWF4TW9ycGhOb3JtYWxzOmIubWF4TW9ycGhOb3JtYWxzLG51bURpckxpZ2h0czpPLmRpcmVjdGlvbmFsLmxlbmd0aCwKbnVtUG9pbnRMaWdodHM6Ty5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpPLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOk8ucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6Ty5oZW1pLmxlbmd0aCxudW1DbGlwcGluZ1BsYW5lczpVLG51bUNsaXBJbnRlcnNlY3Rpb246VyxkaXRoZXJpbmc6SS5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDpiLnNoYWRvd01hcC5lbmFibGVkJiZaLnJlY2VpdmVTaGFkb3cmJjA8US5sZW5ndGgsc2hhZG93TWFwVHlwZTpiLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOmIudG9uZU1hcHBpbmcscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6Yi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6SS5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OkkuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1JLnNpZGUsZmxpcFNpZGVkOjE9PT1JLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PUkuZGVwdGhQYWNraW5nPwpJLmRlcHRoUGFja2luZzohMX19O3RoaXMuZ2V0UHJvZ3JhbUNvZGU9ZnVuY3Rpb24oSSxPKXt2YXIgUT1bXTtPLnNoYWRlcklEP1EucHVzaChPLnNoYWRlcklEKTooUS5wdXNoKEkuZnJhZ21lbnRTaGFkZXIpLFEucHVzaChJLnZlcnRleFNoYWRlcikpO2lmKHZvaWQgMCE9PUkuZGVmaW5lcylmb3IodmFyIFIgaW4gSS5kZWZpbmVzKVEucHVzaChSKSxRLnB1c2goSS5kZWZpbmVzW1JdKTtmb3IoUj0wO1I8SC5sZW5ndGg7UisrKVEucHVzaChPW0hbUl1dKTtRLnB1c2goSS5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSk7US5wdXNoKGIuZ2FtbWFPdXRwdXQpO1EucHVzaChiLmdhbW1hRmFjdG9yKTtyZXR1cm4gUS5qb2luKCl9O3RoaXMuYWNxdWlyZVByb2dyYW09ZnVuY3Rpb24oSSxPLFEsUil7Zm9yKHZhciBVLFc9MCxaPXoubGVuZ3RoO1c8WjtXKyspe3ZhciBmYT16W1ddO2lmKGZhLmNvZGU9PT1SKXtVPWZhOysrVS51c2VkVGltZXM7YnJlYWt9fXZvaWQgMD09PVUmJihVPW5ldyB4byhiLAplLFIsSSxPLFEsaCxuKSx6LnB1c2goVSkpO3JldHVybiBVfTt0aGlzLnJlbGVhc2VQcm9ncmFtPWZ1bmN0aW9uKEkpezA9PT0tLUkudXNlZFRpbWVzJiYoelt6LmluZGV4T2YoSSldPXpbei5sZW5ndGgtMV0sei5wb3AoKSxJLmRlc3Ryb3koKSl9O3RoaXMucHJvZ3JhbXM9en1mdW5jdGlvbiBBbygpe3ZhciBiPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7dmFyIGg9Yi5nZXQoZSk7dm9pZCAwPT09aCYmKGg9e30sYi5zZXQoZSxoKSk7cmV0dXJuIGh9LHJlbW92ZTpmdW5jdGlvbihlKXtiLmRlbGV0ZShlKX0sdXBkYXRlOmZ1bmN0aW9uKGUsaCxuKXtiLmdldChlKVtoXT1ufSxkaXNwb3NlOmZ1bmN0aW9uKCl7Yj1uZXcgV2Vha01hcH19fWZ1bmN0aW9uIEJvKGIsZSl7cmV0dXJuIGIuZ3JvdXBPcmRlciE9PWUuZ3JvdXBPcmRlcj9iLmdyb3VwT3JkZXItZS5ncm91cE9yZGVyOmIucmVuZGVyT3JkZXIhPT1lLnJlbmRlck9yZGVyP2IucmVuZGVyT3JkZXItZS5yZW5kZXJPcmRlcjoKYi5wcm9ncmFtIT09ZS5wcm9ncmFtP2IucHJvZ3JhbS5pZC1lLnByb2dyYW0uaWQ6Yi5tYXRlcmlhbC5pZCE9PWUubWF0ZXJpYWwuaWQ/Yi5tYXRlcmlhbC5pZC1lLm1hdGVyaWFsLmlkOmIueiE9PWUuej9iLnotZS56OmIuaWQtZS5pZH1mdW5jdGlvbiBDbyhiLGUpe3JldHVybiBiLmdyb3VwT3JkZXIhPT1lLmdyb3VwT3JkZXI/Yi5ncm91cE9yZGVyLWUuZ3JvdXBPcmRlcjpiLnJlbmRlck9yZGVyIT09ZS5yZW5kZXJPcmRlcj9iLnJlbmRlck9yZGVyLWUucmVuZGVyT3JkZXI6Yi56IT09ZS56P2Uuei1iLno6Yi5pZC1lLmlkfWZ1bmN0aW9uIGtsKCl7ZnVuY3Rpb24gYih6LEUsSCxJLE8sUSl7dmFyIFI9ZVtoXTt2b2lkIDA9PT1SPyhSPXtpZDp6LmlkLG9iamVjdDp6LGdlb21ldHJ5OkUsbWF0ZXJpYWw6SCxwcm9ncmFtOkgucHJvZ3JhbXx8dyxncm91cE9yZGVyOkkscmVuZGVyT3JkZXI6ei5yZW5kZXJPcmRlcix6Ok8sZ3JvdXA6UX0sZVtoXT1SKTooUi5pZD16LmlkLFIub2JqZWN0PQp6LFIuZ2VvbWV0cnk9RSxSLm1hdGVyaWFsPUgsUi5wcm9ncmFtPUgucHJvZ3JhbXx8dyxSLmdyb3VwT3JkZXI9SSxSLnJlbmRlck9yZGVyPXoucmVuZGVyT3JkZXIsUi56PU8sUi5ncm91cD1RKTtoKys7cmV0dXJuIFJ9dmFyIGU9W10saD0wLG49W10sdT1bXSx3PXtpZDotMX07cmV0dXJue29wYXF1ZTpuLHRyYW5zcGFyZW50OnUsaW5pdDpmdW5jdGlvbigpe2g9MDtuLmxlbmd0aD0wO3UubGVuZ3RoPTB9LHB1c2g6ZnVuY3Rpb24oeixFLEgsSSxPLFEpe3o9Yih6LEUsSCxJLE8sUSk7KCEwPT09SC50cmFuc3BhcmVudD91Om4pLnB1c2goeil9LHVuc2hpZnQ6ZnVuY3Rpb24oeixFLEgsSSxPLFEpe3o9Yih6LEUsSCxJLE8sUSk7KCEwPT09SC50cmFuc3BhcmVudD91Om4pLnVuc2hpZnQoeil9LHNvcnQ6ZnVuY3Rpb24oKXsxPG4ubGVuZ3RoJiZuLnNvcnQoQm8pOzE8dS5sZW5ndGgmJnUuc29ydChDbyl9fX1mdW5jdGlvbiBEbygpe2Z1bmN0aW9uIGIoaCl7aD1oLnRhcmdldDtoLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLApiKTtkZWxldGUgZVtoLmlkXX12YXIgZT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGgsbil7dmFyIHU9ZVtoLmlkXTtpZih2b2lkIDA9PT11KXt2YXIgdz1uZXcga2w7ZVtoLmlkXT17fTtlW2guaWRdW24uaWRdPXc7aC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixiKX1lbHNlIHc9dVtuLmlkXSx2b2lkIDA9PT13JiYodz1uZXcga2wsdVtuLmlkXT13KTtyZXR1cm4gd30sZGlzcG9zZTpmdW5jdGlvbigpe2U9e319fX1mdW5jdGlvbiBFbygpe3ZhciBiPXt9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09YltlLmlkXSlyZXR1cm4gYltlLmlkXTtzd2l0Y2goZS50eXBlKXtjYXNlICJEaXJlY3Rpb25hbExpZ2h0Ijp2YXIgaD17ZGlyZWN0aW9uOm5ldyBnLGNvbG9yOm5ldyBCLHNoYWRvdzohMSxzaGFkb3dCaWFzOjAsc2hhZG93UmFkaXVzOjEsc2hhZG93TWFwU2l6ZTpuZXcgZH07YnJlYWs7Y2FzZSAiU3BvdExpZ2h0IjpoPXtwb3NpdGlvbjpuZXcgZyxkaXJlY3Rpb246bmV3IGcsCmNvbG9yOm5ldyBCLGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MCxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGR9O2JyZWFrO2Nhc2UgIlBvaW50TGlnaHQiOmg9e3Bvc2l0aW9uOm5ldyBnLGNvbG9yOm5ldyBCLGRpc3RhbmNlOjAsZGVjYXk6MCxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGQsc2hhZG93Q2FtZXJhTmVhcjoxLHNoYWRvd0NhbWVyYUZhcjoxRTN9O2JyZWFrO2Nhc2UgIkhlbWlzcGhlcmVMaWdodCI6aD17ZGlyZWN0aW9uOm5ldyBnLHNreUNvbG9yOm5ldyBCLGdyb3VuZENvbG9yOm5ldyBCfTticmVhaztjYXNlICJSZWN0QXJlYUxpZ2h0IjpoPXtjb2xvcjpuZXcgQixwb3NpdGlvbjpuZXcgZyxoYWxmV2lkdGg6bmV3IGcsaGFsZkhlaWdodDpuZXcgZ319cmV0dXJuIGJbZS5pZF09aH19fWZ1bmN0aW9uIEZvKCl7Zm9yKHZhciBiPQpuZXcgRW8sZT17aWQ6R28rKyxoYXNoOntzdGF0ZUlEOi0xLGRpcmVjdGlvbmFsTGVuZ3RoOi0xLHBvaW50TGVuZ3RoOi0xLHNwb3RMZW5ndGg6LTEscmVjdEFyZWFMZW5ndGg6LTEsaGVtaUxlbmd0aDotMSxzaGFkb3dzTGVuZ3RoOi0xfSxhbWJpZW50OlswLDAsMF0scHJvYmU6W10sZGlyZWN0aW9uYWw6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXA6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6W10sc3BvdDpbXSxzcG90U2hhZG93TWFwOltdLHNwb3RTaGFkb3dNYXRyaXg6W10scmVjdEFyZWE6W10scG9pbnQ6W10scG9pbnRTaGFkb3dNYXA6W10scG9pbnRTaGFkb3dNYXRyaXg6W10saGVtaTpbXX0saD0wOzk+aDtoKyspZS5wcm9iZS5wdXNoKG5ldyBnKTt2YXIgbj1uZXcgZyx1PW5ldyBDLHc9bmV3IEM7cmV0dXJue3NldHVwOmZ1bmN0aW9uKHosRSxIKXtmb3IodmFyIEk9MCxPPTAsUT0wLFI9MDs5PlI7UisrKWUucHJvYmVbUl0uc2V0KDAsMCwwKTt2YXIgVT0wLFc9MCxaPTAsZmE9CjAscWE9MDtIPUgubWF0cml4V29ybGRJbnZlcnNlO1I9MDtmb3IodmFyIHJhPXoubGVuZ3RoO1I8cmE7UisrKXt2YXIgaWE9eltSXSx0YT1pYS5jb2xvcixuYT1pYS5pbnRlbnNpdHksdmE9aWEuZGlzdGFuY2UsQmE9aWEuc2hhZG93JiZpYS5zaGFkb3cubWFwP2lhLnNoYWRvdy5tYXAudGV4dHVyZTpudWxsO2lmKGlhLmlzQW1iaWVudExpZ2h0KUkrPXRhLnIqbmEsTys9dGEuZypuYSxRKz10YS5iKm5hO2Vsc2UgaWYoaWEuaXNMaWdodFByb2JlKWZvcihCYT0wOzk+QmE7QmErKyllLnByb2JlW0JhXS5hZGRTY2FsZWRWZWN0b3IoaWEuc2guY29lZmZpY2llbnRzW0JhXSxuYSk7ZWxzZSBpZihpYS5pc0RpcmVjdGlvbmFsTGlnaHQpe3ZhciBzYT1iLmdldChpYSk7c2EuY29sb3IuY29weShpYS5jb2xvcikubXVsdGlwbHlTY2FsYXIoaWEuaW50ZW5zaXR5KTtzYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGlhLm1hdHJpeFdvcmxkKTtuLnNldEZyb21NYXRyaXhQb3NpdGlvbihpYS50YXJnZXQubWF0cml4V29ybGQpOwpzYS5kaXJlY3Rpb24uc3ViKG4pO3NhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oSCk7aWYoc2Euc2hhZG93PWlhLmNhc3RTaGFkb3cpbmE9aWEuc2hhZG93LHNhLnNoYWRvd0JpYXM9bmEuYmlhcyxzYS5zaGFkb3dSYWRpdXM9bmEucmFkaXVzLHNhLnNoYWRvd01hcFNpemU9bmEubWFwU2l6ZTtlLmRpcmVjdGlvbmFsU2hhZG93TWFwW1VdPUJhO2UuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbVV09aWEuc2hhZG93Lm1hdHJpeDtlLmRpcmVjdGlvbmFsW1VdPXNhO1UrK31lbHNlIGlmKGlhLmlzU3BvdExpZ2h0KXtzYT1iLmdldChpYSk7c2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGlhLm1hdHJpeFdvcmxkKTtzYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoSCk7c2EuY29sb3IuY29weSh0YSkubXVsdGlwbHlTY2FsYXIobmEpO3NhLmRpc3RhbmNlPXZhO3NhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oaWEubWF0cml4V29ybGQpO24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGlhLnRhcmdldC5tYXRyaXhXb3JsZCk7CnNhLmRpcmVjdGlvbi5zdWIobik7c2EuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihIKTtzYS5jb25lQ29zPU1hdGguY29zKGlhLmFuZ2xlKTtzYS5wZW51bWJyYUNvcz1NYXRoLmNvcyhpYS5hbmdsZSooMS1pYS5wZW51bWJyYSkpO3NhLmRlY2F5PWlhLmRlY2F5O2lmKHNhLnNoYWRvdz1pYS5jYXN0U2hhZG93KW5hPWlhLnNoYWRvdyxzYS5zaGFkb3dCaWFzPW5hLmJpYXMsc2Euc2hhZG93UmFkaXVzPW5hLnJhZGl1cyxzYS5zaGFkb3dNYXBTaXplPW5hLm1hcFNpemU7ZS5zcG90U2hhZG93TWFwW1pdPUJhO2Uuc3BvdFNoYWRvd01hdHJpeFtaXT1pYS5zaGFkb3cubWF0cml4O2Uuc3BvdFtaXT1zYTtaKyt9ZWxzZSBpZihpYS5pc1JlY3RBcmVhTGlnaHQpc2E9Yi5nZXQoaWEpLHNhLmNvbG9yLmNvcHkodGEpLm11bHRpcGx5U2NhbGFyKG5hKSxzYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oaWEubWF0cml4V29ybGQpLHNhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChIKSwKdy5pZGVudGl0eSgpLHUuY29weShpYS5tYXRyaXhXb3JsZCksdS5wcmVtdWx0aXBseShIKSx3LmV4dHJhY3RSb3RhdGlvbih1KSxzYS5oYWxmV2lkdGguc2V0KC41KmlhLndpZHRoLDAsMCksc2EuaGFsZkhlaWdodC5zZXQoMCwuNSppYS5oZWlnaHQsMCksc2EuaGFsZldpZHRoLmFwcGx5TWF0cml4NCh3KSxzYS5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCh3KSxlLnJlY3RBcmVhW2ZhXT1zYSxmYSsrO2Vsc2UgaWYoaWEuaXNQb2ludExpZ2h0KXtzYT1iLmdldChpYSk7c2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGlhLm1hdHJpeFdvcmxkKTtzYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoSCk7c2EuY29sb3IuY29weShpYS5jb2xvcikubXVsdGlwbHlTY2FsYXIoaWEuaW50ZW5zaXR5KTtzYS5kaXN0YW5jZT1pYS5kaXN0YW5jZTtzYS5kZWNheT1pYS5kZWNheTtpZihzYS5zaGFkb3c9aWEuY2FzdFNoYWRvdyluYT1pYS5zaGFkb3csc2Euc2hhZG93Qmlhcz1uYS5iaWFzLHNhLnNoYWRvd1JhZGl1cz0KbmEucmFkaXVzLHNhLnNoYWRvd01hcFNpemU9bmEubWFwU2l6ZSxzYS5zaGFkb3dDYW1lcmFOZWFyPW5hLmNhbWVyYS5uZWFyLHNhLnNoYWRvd0NhbWVyYUZhcj1uYS5jYW1lcmEuZmFyO2UucG9pbnRTaGFkb3dNYXBbV109QmE7ZS5wb2ludFNoYWRvd01hdHJpeFtXXT1pYS5zaGFkb3cubWF0cml4O2UucG9pbnRbV109c2E7VysrfWVsc2UgaWEuaXNIZW1pc3BoZXJlTGlnaHQmJihzYT1iLmdldChpYSksc2EuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihpYS5tYXRyaXhXb3JsZCksc2EuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihIKSxzYS5kaXJlY3Rpb24ubm9ybWFsaXplKCksc2Euc2t5Q29sb3IuY29weShpYS5jb2xvcikubXVsdGlwbHlTY2FsYXIobmEpLHNhLmdyb3VuZENvbG9yLmNvcHkoaWEuZ3JvdW5kQ29sb3IpLm11bHRpcGx5U2NhbGFyKG5hKSxlLmhlbWlbcWFdPXNhLHFhKyspfWUuYW1iaWVudFswXT1JO2UuYW1iaWVudFsxXT1PO2UuYW1iaWVudFsyXT0KUTtlLmRpcmVjdGlvbmFsLmxlbmd0aD1VO2Uuc3BvdC5sZW5ndGg9WjtlLnJlY3RBcmVhLmxlbmd0aD1mYTtlLnBvaW50Lmxlbmd0aD1XO2UuaGVtaS5sZW5ndGg9cWE7ZS5oYXNoLnN0YXRlSUQ9ZS5pZDtlLmhhc2guZGlyZWN0aW9uYWxMZW5ndGg9VTtlLmhhc2gucG9pbnRMZW5ndGg9VztlLmhhc2guc3BvdExlbmd0aD1aO2UuaGFzaC5yZWN0QXJlYUxlbmd0aD1mYTtlLmhhc2guaGVtaUxlbmd0aD1xYTtlLmhhc2guc2hhZG93c0xlbmd0aD1FLmxlbmd0aH0sc3RhdGU6ZX19ZnVuY3Rpb24gbGwoKXt2YXIgYj1uZXcgRm8sZT1bXSxoPVtdO3JldHVybntpbml0OmZ1bmN0aW9uKCl7ZS5sZW5ndGg9MDtoLmxlbmd0aD0wfSxzdGF0ZTp7bGlnaHRzQXJyYXk6ZSxzaGFkb3dzQXJyYXk6aCxsaWdodHM6Yn0sc2V0dXBMaWdodHM6ZnVuY3Rpb24obil7Yi5zZXR1cChlLGgsbil9LHB1c2hMaWdodDpmdW5jdGlvbihuKXtlLnB1c2gobil9LHB1c2hTaGFkb3c6ZnVuY3Rpb24obil7aC5wdXNoKG4pfX19CmZ1bmN0aW9uIEhvKCl7ZnVuY3Rpb24gYihoKXtoPWgudGFyZ2V0O2gucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYik7ZGVsZXRlIGVbaC5pZF19dmFyIGU9e307cmV0dXJue2dldDpmdW5jdGlvbihoLG4pe2lmKHZvaWQgMD09PWVbaC5pZF0pe3ZhciB1PW5ldyBsbDtlW2guaWRdPXt9O2VbaC5pZF1bbi5pZF09dTtoLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGIpfWVsc2Ugdm9pZCAwPT09ZVtoLmlkXVtuLmlkXT8odT1uZXcgbGwsZVtoLmlkXVtuLmlkXT11KTp1PWVbaC5pZF1bbi5pZF07cmV0dXJuIHV9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPXt9fX19ZnVuY3Rpb24gUGQoYil7R2EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIjt0aGlzLmRlcHRoUGFja2luZz0zMjAwO3RoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5kaXNwbGFjZW1lbnRNYXA9dGhpcy5hbHBoYU1hcD10aGlzLm1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9CjE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLmxpZ2h0cz10aGlzLmZvZz0hMTt0aGlzLnNldFZhbHVlcyhiKX1mdW5jdGlvbiBRZChiKXtHYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaERpc3RhbmNlTWF0ZXJpYWwiO3RoaXMucmVmZXJlbmNlUG9zaXRpb249bmV3IGc7dGhpcy5uZWFyRGlzdGFuY2U9MTt0aGlzLmZhckRpc3RhbmNlPTFFMzt0aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuZGlzcGxhY2VtZW50TWFwPXRoaXMuYWxwaGFNYXA9dGhpcy5tYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy5saWdodHM9dGhpcy5mb2c9ITE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gbWwoYixlLGgpe2Z1bmN0aW9uIG4odmEsQmEsc2EsRGEsSGEsS2Epe3ZhciBOYT12YS5nZW9tZXRyeTt2YXIgTGE9UTt2YXIgZmI9CnZhLmN1c3RvbURlcHRoTWF0ZXJpYWw7c2EmJihMYT1SLGZiPXZhLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwpO2ZiP0xhPWZiOihmYj0hMSxCYS5tb3JwaFRhcmdldHMmJihOYSYmTmEuaXNCdWZmZXJHZW9tZXRyeT9mYj1OYS5tb3JwaEF0dHJpYnV0ZXMmJk5hLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiYmMDxOYS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoOk5hJiZOYS5pc0dlb21ldHJ5JiYoZmI9TmEubW9ycGhUYXJnZXRzJiYwPE5hLm1vcnBoVGFyZ2V0cy5sZW5ndGgpKSx2YS5pc1NraW5uZWRNZXNoJiYhMT09PUJhLnNraW5uaW5nJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMU2hhZG93TWFwOiBUSFJFRS5Ta2lubmVkTWVzaCB3aXRoIG1hdGVyaWFsLnNraW5uaW5nIHNldCB0byBmYWxzZToiLHZhKSx2YT12YS5pc1NraW5uZWRNZXNoJiZCYS5za2lubmluZyxOYT0wLGZiJiYoTmF8PTEpLHZhJiYoTmF8PTIpLExhPUxhW05hXSk7Yi5sb2NhbENsaXBwaW5nRW5hYmxlZCYmCiEwPT09QmEuY2xpcFNoYWRvd3MmJjAhPT1CYS5jbGlwcGluZ1BsYW5lcy5sZW5ndGgmJihOYT1MYS51dWlkLGZiPUJhLnV1aWQsdmE9VVtOYV0sdm9pZCAwPT09dmEmJih2YT17fSxVW05hXT12YSksTmE9dmFbZmJdLHZvaWQgMD09PU5hJiYoTmE9TGEuY2xvbmUoKSx2YVtmYl09TmEpLExhPU5hKTtMYS52aXNpYmxlPUJhLnZpc2libGU7TGEud2lyZWZyYW1lPUJhLndpcmVmcmFtZTtMYS5zaWRlPW51bGwhPUJhLnNoYWRvd1NpZGU/QmEuc2hhZG93U2lkZTpXW0JhLnNpZGVdO0xhLmNsaXBTaGFkb3dzPUJhLmNsaXBTaGFkb3dzO0xhLmNsaXBwaW5nUGxhbmVzPUJhLmNsaXBwaW5nUGxhbmVzO0xhLmNsaXBJbnRlcnNlY3Rpb249QmEuY2xpcEludGVyc2VjdGlvbjtMYS53aXJlZnJhbWVMaW5ld2lkdGg9QmEud2lyZWZyYW1lTGluZXdpZHRoO0xhLmxpbmV3aWR0aD1CYS5saW5ld2lkdGg7c2EmJkxhLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwmJihMYS5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KERhKSwKTGEubmVhckRpc3RhbmNlPUhhLExhLmZhckRpc3RhbmNlPUthKTtyZXR1cm4gTGF9ZnVuY3Rpb24gdSh2YSxCYSxzYSxEYSl7aWYoITEhPT12YS52aXNpYmxlKXtpZih2YS5sYXllcnMudGVzdChCYS5sYXllcnMpJiYodmEuaXNNZXNofHx2YS5pc0xpbmV8fHZhLmlzUG9pbnRzKSYmdmEuY2FzdFNoYWRvdyYmKCF2YS5mcnVzdHVtQ3VsbGVkfHx3LmludGVyc2VjdHNPYmplY3QodmEpKSl7dmEubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoc2EubWF0cml4V29ybGRJbnZlcnNlLHZhLm1hdHJpeFdvcmxkKTt2YXIgSGE9ZS51cGRhdGUodmEpLEthPXZhLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoS2EpKWZvcih2YXIgTmE9SGEuZ3JvdXBzLExhPTAsZmI9TmEubGVuZ3RoO0xhPGZiO0xhKyspe3ZhciBjYj1OYVtMYV0sSmE9S2FbY2IubWF0ZXJpYWxJbmRleF07SmEmJkphLnZpc2libGUmJihKYT1uKHZhLEphLERhLE8sc2EubmVhcixzYS5mYXIpLGIucmVuZGVyQnVmZmVyRGlyZWN0KHNhLApudWxsLEhhLEphLHZhLGNiKSl9ZWxzZSBLYS52aXNpYmxlJiYoSmE9bih2YSxLYSxEYSxPLHNhLm5lYXIsc2EuZmFyKSxiLnJlbmRlckJ1ZmZlckRpcmVjdChzYSxudWxsLEhhLEphLHZhLG51bGwpKX12YT12YS5jaGlsZHJlbjtIYT0wO2ZvcihLYT12YS5sZW5ndGg7SGE8S2E7SGErKyl1KHZhW0hhXSxCYSxzYSxEYSl9fXZhciB3PW5ldyB4LHo9bmV3IEMsRT1uZXcgZCxIPW5ldyBkKGgsaCksST1uZXcgZyxPPW5ldyBnLFE9QXJyYXkoNCksUj1BcnJheSg0KSxVPXt9LFc9ezA6MSwxOjAsMjoyfSxaPVtuZXcgZygxLDAsMCksbmV3IGcoLTEsMCwwKSxuZXcgZygwLDAsMSksbmV3IGcoMCwwLC0xKSxuZXcgZygwLDEsMCksbmV3IGcoMCwtMSwwKV0sZmE9W25ldyBnKDAsMSwwKSxuZXcgZygwLDEsMCksbmV3IGcoMCwxLDApLG5ldyBnKDAsMSwwKSxuZXcgZygwLDAsMSksbmV3IGcoMCwwLC0xKV0scWE9W25ldyBtLG5ldyBtLG5ldyBtLG5ldyBtLG5ldyBtLG5ldyBtXTtmb3IoaD0wOzQhPT0KaDsrK2gpe3ZhciByYT0wIT09KGgmMSksaWE9MCE9PShoJjIpLHRhPW5ldyBQZCh7ZGVwdGhQYWNraW5nOjMyMDEsbW9ycGhUYXJnZXRzOnJhLHNraW5uaW5nOmlhfSk7UVtoXT10YTtyYT1uZXcgUWQoe21vcnBoVGFyZ2V0czpyYSxza2lubmluZzppYX0pO1JbaF09cmF9dmFyIG5hPXRoaXM7dGhpcy5lbmFibGVkPSExO3RoaXMuYXV0b1VwZGF0ZT0hMDt0aGlzLm5lZWRzVXBkYXRlPSExO3RoaXMudHlwZT0xO3RoaXMucmVuZGVyPWZ1bmN0aW9uKHZhLEJhLHNhKXtpZighMSE9PW5hLmVuYWJsZWQmJighMSE9PW5hLmF1dG9VcGRhdGV8fCExIT09bmEubmVlZHNVcGRhdGUpJiYwIT09dmEubGVuZ3RoKXt2YXIgRGE9Yi5nZXRSZW5kZXJUYXJnZXQoKSxIYT1iLnN0YXRlO0hhLnNldEJsZW5kaW5nKDApO0hhLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoMSwxLDEsMSk7SGEuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKTtIYS5zZXRTY2lzc29yVGVzdCghMSk7Zm9yKHZhciBLYSxOYT0wLExhPQp2YS5sZW5ndGg7TmE8TGE7TmErKyl7dmFyIGZiPXZhW05hXTtLYT1mYi5zaGFkb3c7dmFyIGNiPWZiJiZmYi5pc1BvaW50TGlnaHQ7aWYodm9pZCAwPT09S2EpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLGZiLCJoYXMgbm8gc2hhZG93LiIpO2Vsc2V7dmFyIEphPUthLmNhbWVyYTtFLmNvcHkoS2EubWFwU2l6ZSk7RS5taW4oSCk7aWYoY2Ipe3ZhciBoYj1FLngsVWE9RS55O3FhWzBdLnNldCgyKmhiLFVhLGhiLFVhKTtxYVsxXS5zZXQoMCxVYSxoYixVYSk7cWFbMl0uc2V0KDMqaGIsVWEsaGIsVWEpO3FhWzNdLnNldChoYixVYSxoYixVYSk7cWFbNF0uc2V0KDMqaGIsMCxoYixVYSk7cWFbNV0uc2V0KGhiLDAsaGIsVWEpO0UueCo9NDtFLnkqPTJ9bnVsbD09PUthLm1hcCYmKEthLm1hcD1uZXcgcChFLngsRS55LHttaW5GaWx0ZXI6MTAwMyxtYWdGaWx0ZXI6MTAwMyxmb3JtYXQ6MTAyM30pLEthLm1hcC50ZXh0dXJlLm5hbWU9ZmIubmFtZSsiLnNoYWRvd01hcCIsCkphLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSk7S2EuaXNTcG90TGlnaHRTaGFkb3cmJkthLnVwZGF0ZShmYik7aGI9S2EubWFwO1VhPUthLm1hdHJpeDtPLnNldEZyb21NYXRyaXhQb3NpdGlvbihmYi5tYXRyaXhXb3JsZCk7SmEucG9zaXRpb24uY29weShPKTtjYj8oS2E9NixVYS5tYWtlVHJhbnNsYXRpb24oLU8ueCwtTy55LC1PLnopKTooS2E9MSxJLnNldEZyb21NYXRyaXhQb3NpdGlvbihmYi50YXJnZXQubWF0cml4V29ybGQpLEphLmxvb2tBdChJKSxKYS51cGRhdGVNYXRyaXhXb3JsZCgpLFVhLnNldCguNSwwLDAsLjUsMCwuNSwwLC41LDAsMCwuNSwuNSwwLDAsMCwxKSxVYS5tdWx0aXBseShKYS5wcm9qZWN0aW9uTWF0cml4KSxVYS5tdWx0aXBseShKYS5tYXRyaXhXb3JsZEludmVyc2UpKTtiLnNldFJlbmRlclRhcmdldChoYik7Yi5jbGVhcigpO2ZvcihmYj0wO2ZiPEthO2ZiKyspY2ImJihJLmNvcHkoSmEucG9zaXRpb24pLEkuYWRkKFpbZmJdKSxKYS51cC5jb3B5KGZhW2ZiXSksCkphLmxvb2tBdChJKSxKYS51cGRhdGVNYXRyaXhXb3JsZCgpLEhhLnZpZXdwb3J0KHFhW2ZiXSkpLHoubXVsdGlwbHlNYXRyaWNlcyhKYS5wcm9qZWN0aW9uTWF0cml4LEphLm1hdHJpeFdvcmxkSW52ZXJzZSksdy5zZXRGcm9tTWF0cml4KHopLHUoQmEsc2EsSmEsY2IpfX1uYS5uZWVkc1VwZGF0ZT0hMTtiLnNldFJlbmRlclRhcmdldChEYSl9fX1mdW5jdGlvbiBJbyhiLGUsaCxuKXtmdW5jdGlvbiB1KG1hLElhLE9hKXt2YXIgdWI9bmV3IFVpbnQ4QXJyYXkoNCksYWI9Yi5jcmVhdGVUZXh0dXJlKCk7Yi5iaW5kVGV4dHVyZShtYSxhYik7Yi50ZXhQYXJhbWV0ZXJpKG1hLDEwMjQxLDk3MjgpO2IudGV4UGFyYW1ldGVyaShtYSwxMDI0MCw5NzI4KTtmb3IobWE9MDttYTxPYTttYSsrKWIudGV4SW1hZ2UyRChJYSttYSwwLDY0MDgsMSwxLDAsNjQwOCw1MTIxLHViKTtyZXR1cm4gYWJ9ZnVuY3Rpb24gdyhtYSxJYSl7cWFbbWFdPTE7MD09PXJhW21hXSYmKGIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobWEpLApyYVttYV09MSk7aWFbbWFdIT09SWEmJigobi5pc1dlYkdMMj9iOmUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW24uaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShtYSxJYSksaWFbbWFdPUlhKX1mdW5jdGlvbiB6KG1hKXshMCE9PXRhW21hXSYmKGIuZW5hYmxlKG1hKSx0YVttYV09ITApfWZ1bmN0aW9uIEUobWEpeyExIT09dGFbbWFdJiYoYi5kaXNhYmxlKG1hKSx0YVttYV09ITEpfWZ1bmN0aW9uIEgobWEsSWEsT2EsdWIsYWIsS2IsbGIsUWEpe2lmKDA9PT1tYSlCYSYmKEUoMzA0MiksQmE9ITEpO2Vsc2UgaWYoQmF8fCh6KDMwNDIpLEJhPSEwKSw1IT09bWEpe2lmKG1hIT09c2F8fFFhIT09Y2Ipe2lmKDEwMCE9PURhfHwxMDAhPT1OYSliLmJsZW5kRXF1YXRpb24oMzI3NzQpLE5hPURhPTEwMDtpZihRYSlzd2l0Y2gobWEpe2Nhc2UgMTpiLmJsZW5kRnVuY1NlcGFyYXRlKDEsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6Yi5ibGVuZEZ1bmMoMSwKMSk7YnJlYWs7Y2FzZSAzOmIuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDpiLmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsbWEpfWVsc2Ugc3dpdGNoKG1hKXtjYXNlIDE6Yi5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6Yi5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzpiLmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OmIuYmxlbmRGdW5jKDAsNzY4KTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsbWEpfWZiPUxhPUthPUhhPW51bGw7c2E9bWE7Y2I9UWF9fWVsc2V7YWI9YWJ8fElhO0tiPUtifHxPYTtsYj1sYnx8dWI7aWYoSWEhPT1EYXx8YWIhPT1OYSliLmJsZW5kRXF1YXRpb25TZXBhcmF0ZShoLmNvbnZlcnQoSWEpLApoLmNvbnZlcnQoYWIpKSxEYT1JYSxOYT1hYjtpZihPYSE9PUhhfHx1YiE9PUthfHxLYiE9PUxhfHxsYiE9PWZiKWIuYmxlbmRGdW5jU2VwYXJhdGUoaC5jb252ZXJ0KE9hKSxoLmNvbnZlcnQodWIpLGguY29udmVydChLYiksaC5jb252ZXJ0KGxiKSksSGE9T2EsS2E9dWIsTGE9S2IsZmI9bGI7c2E9bWE7Y2I9bnVsbH19ZnVuY3Rpb24gSShtYSl7SmEhPT1tYSYmKG1hP2IuZnJvbnRGYWNlKDIzMDQpOmIuZnJvbnRGYWNlKDIzMDUpLEphPW1hKX1mdW5jdGlvbiBPKG1hKXswIT09bWE/KHooMjg4NCksbWEhPT1oYiYmKDE9PT1tYT9iLmN1bGxGYWNlKDEwMjkpOjI9PT1tYT9iLmN1bGxGYWNlKDEwMjgpOmIuY3VsbEZhY2UoMTAzMikpKTpFKDI4ODQpO2hiPW1hfWZ1bmN0aW9uIFEobWEsSWEsT2Epe2lmKG1hKXtpZih6KDMyODIzKSxIYiE9PUlhfHxxYiE9PU9hKWIucG9seWdvbk9mZnNldChJYSxPYSksSGI9SWEscWI9T2F9ZWxzZSBFKDMyODIzKX1mdW5jdGlvbiBSKG1hKXt2b2lkIDA9PT0KbWEmJihtYT0zMzk4NCtqYS0xKTt5YSE9PW1hJiYoYi5hY3RpdmVUZXh0dXJlKG1hKSx5YT1tYSl9dmFyIFU9bmV3IGZ1bmN0aW9uKCl7dmFyIG1hPSExLElhPW5ldyBtLE9hPW51bGwsdWI9bmV3IG0oMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24oYWIpe09hPT09YWJ8fG1hfHwoYi5jb2xvck1hc2soYWIsYWIsYWIsYWIpLE9hPWFiKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKGFiKXttYT1hYn0sc2V0Q2xlYXI6ZnVuY3Rpb24oYWIsS2IsbGIsUWEsbmIpeyEwPT09bmImJihhYio9UWEsS2IqPVFhLGxiKj1RYSk7SWEuc2V0KGFiLEtiLGxiLFFhKTshMT09PXViLmVxdWFscyhJYSkmJihiLmNsZWFyQ29sb3IoYWIsS2IsbGIsUWEpLHViLmNvcHkoSWEpKX0scmVzZXQ6ZnVuY3Rpb24oKXttYT0hMTtPYT1udWxsO3ViLnNldCgtMSwwLDAsMCl9fX0sVz1uZXcgZnVuY3Rpb24oKXt2YXIgbWE9ITEsSWE9bnVsbCxPYT1udWxsLHViPW51bGw7cmV0dXJue3NldFRlc3Q6ZnVuY3Rpb24oYWIpe2FiPwp6KDI5MjkpOkUoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oYWIpe0lhPT09YWJ8fG1hfHwoYi5kZXB0aE1hc2soYWIpLElhPWFiKX0sc2V0RnVuYzpmdW5jdGlvbihhYil7aWYoT2EhPT1hYil7aWYoYWIpc3dpdGNoKGFiKXtjYXNlIDA6Yi5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6Yi5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6Yi5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6Yi5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6Yi5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6Yi5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6Yi5kZXB0aEZ1bmMoNTE2KTticmVhaztjYXNlIDc6Yi5kZXB0aEZ1bmMoNTE3KTticmVhaztkZWZhdWx0OmIuZGVwdGhGdW5jKDUxNSl9ZWxzZSBiLmRlcHRoRnVuYyg1MTUpO09hPWFifX0sc2V0TG9ja2VkOmZ1bmN0aW9uKGFiKXttYT1hYn0sc2V0Q2xlYXI6ZnVuY3Rpb24oYWIpe3ViIT09YWImJihiLmNsZWFyRGVwdGgoYWIpLHViPQphYil9LHJlc2V0OmZ1bmN0aW9uKCl7bWE9ITE7dWI9T2E9SWE9bnVsbH19fSxaPW5ldyBmdW5jdGlvbigpe3ZhciBtYT0hMSxJYT1udWxsLE9hPW51bGwsdWI9bnVsbCxhYj1udWxsLEtiPW51bGwsbGI9bnVsbCxRYT1udWxsLG5iPW51bGw7cmV0dXJue3NldFRlc3Q6ZnVuY3Rpb24ocGIpe3BiP3ooMjk2MCk6RSgyOTYwKX0sc2V0TWFzazpmdW5jdGlvbihwYil7SWE9PT1wYnx8bWF8fChiLnN0ZW5jaWxNYXNrKHBiKSxJYT1wYil9LHNldEZ1bmM6ZnVuY3Rpb24ocGIsdmIsQWIpe2lmKE9hIT09cGJ8fHViIT09dmJ8fGFiIT09QWIpYi5zdGVuY2lsRnVuYyhwYix2YixBYiksT2E9cGIsdWI9dmIsYWI9QWJ9LHNldE9wOmZ1bmN0aW9uKHBiLHZiLEFiKXtpZihLYiE9PXBifHxsYiE9PXZifHxRYSE9PUFiKWIuc3RlbmNpbE9wKHBiLHZiLEFiKSxLYj1wYixsYj12YixRYT1BYn0sc2V0TG9ja2VkOmZ1bmN0aW9uKHBiKXttYT1wYn0sc2V0Q2xlYXI6ZnVuY3Rpb24ocGIpe25iIT09cGImJihiLmNsZWFyU3RlbmNpbChwYiksCm5iPXBiKX0scmVzZXQ6ZnVuY3Rpb24oKXttYT0hMTtuYj1RYT1sYj1LYj1hYj11Yj1PYT1JYT1udWxsfX19LGZhPWIuZ2V0UGFyYW1ldGVyKDM0OTIxKSxxYT1uZXcgVWludDhBcnJheShmYSkscmE9bmV3IFVpbnQ4QXJyYXkoZmEpLGlhPW5ldyBVaW50OEFycmF5KGZhKSx0YT17fSxuYT1udWxsLHZhPW51bGwsQmE9bnVsbCxzYT1udWxsLERhPW51bGwsSGE9bnVsbCxLYT1udWxsLE5hPW51bGwsTGE9bnVsbCxmYj1udWxsLGNiPSExLEphPW51bGwsaGI9bnVsbCxVYT1udWxsLEhiPW51bGwscWI9bnVsbCxqYT1iLmdldFBhcmFtZXRlcigzNTY2MSkscGE9ITE7ZmE9MDtmYT1iLmdldFBhcmFtZXRlcig3OTM4KTstMSE9PWZhLmluZGV4T2YoIldlYkdMIik/KGZhPXBhcnNlRmxvYXQoL15XZWJHTCAoWzAtOV0pLy5leGVjKGZhKVsxXSkscGE9MTw9ZmEpOi0xIT09ZmEuaW5kZXhPZigiT3BlbkdMIEVTIikmJihmYT1wYXJzZUZsb2F0KC9eT3BlbkdMIEVTIChbMC05XSkvLmV4ZWMoZmEpWzFdKSwKcGE9Mjw9ZmEpO3ZhciB5YT1udWxsLFZhPXt9LFphPW5ldyBtLFRhPW5ldyBtLGliPXt9O2liWzM1NTNdPXUoMzU1MywzNTUzLDEpO2liWzM0MDY3XT11KDM0MDY3LDM0MDY5LDYpO1Uuc2V0Q2xlYXIoMCwwLDAsMSk7Vy5zZXRDbGVhcigxKTtaLnNldENsZWFyKDApO3ooMjkyOSk7Vy5zZXRGdW5jKDMpO0koITEpO08oMSk7eigyODg0KTtIKDApO3JldHVybntidWZmZXJzOntjb2xvcjpVLGRlcHRoOlcsc3RlbmNpbDpafSxpbml0QXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIgbWE9MCxJYT1xYS5sZW5ndGg7bWE8SWE7bWErKylxYVttYV09MH0sZW5hYmxlQXR0cmlidXRlOmZ1bmN0aW9uKG1hKXt3KG1hLDApfSxlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yOncsZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXM6ZnVuY3Rpb24oKXtmb3IodmFyIG1hPTAsSWE9cmEubGVuZ3RoO21hIT09SWE7KyttYSlyYVttYV0hPT1xYVttYV0mJihiLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShtYSksCnJhW21hXT0wKX0sZW5hYmxlOnosZGlzYWJsZTpFLGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czpmdW5jdGlvbigpe2lmKG51bGw9PT1uYSYmKG5hPVtdLGUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpfHxlLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSkpZm9yKHZhciBtYT1iLmdldFBhcmFtZXRlcigzNDQ2NyksSWE9MDtJYTxtYS5sZW5ndGg7SWErKyluYS5wdXNoKG1hW0lhXSk7cmV0dXJuIG5hfSx1c2VQcm9ncmFtOmZ1bmN0aW9uKG1hKXtyZXR1cm4gdmEhPT1tYT8oYi51c2VQcm9ncmFtKG1hKSx2YT1tYSwhMCk6ITF9LHNldEJsZW5kaW5nOkgsc2V0TWF0ZXJpYWw6ZnVuY3Rpb24obWEsSWEpezI9PT1tYS5zaWRlP0UoMjg4NCk6eigyODg0KTt2YXIgT2E9MT09PW1hLnNpZGU7SWEmJihPYT0KIU9hKTtJKE9hKTsxPT09bWEuYmxlbmRpbmcmJiExPT09bWEudHJhbnNwYXJlbnQ/SCgwKTpIKG1hLmJsZW5kaW5nLG1hLmJsZW5kRXF1YXRpb24sbWEuYmxlbmRTcmMsbWEuYmxlbmREc3QsbWEuYmxlbmRFcXVhdGlvbkFscGhhLG1hLmJsZW5kU3JjQWxwaGEsbWEuYmxlbmREc3RBbHBoYSxtYS5wcmVtdWx0aXBsaWVkQWxwaGEpO1cuc2V0RnVuYyhtYS5kZXB0aEZ1bmMpO1cuc2V0VGVzdChtYS5kZXB0aFRlc3QpO1cuc2V0TWFzayhtYS5kZXB0aFdyaXRlKTtVLnNldE1hc2sobWEuY29sb3JXcml0ZSk7UShtYS5wb2x5Z29uT2Zmc2V0LG1hLnBvbHlnb25PZmZzZXRGYWN0b3IsbWEucG9seWdvbk9mZnNldFVuaXRzKX0sc2V0RmxpcFNpZGVkOkksc2V0Q3VsbEZhY2U6TyxzZXRMaW5lV2lkdGg6ZnVuY3Rpb24obWEpe21hIT09VWEmJihwYSYmYi5saW5lV2lkdGgobWEpLFVhPW1hKX0sc2V0UG9seWdvbk9mZnNldDpRLHNldFNjaXNzb3JUZXN0OmZ1bmN0aW9uKG1hKXttYT96KDMwODkpOgpFKDMwODkpfSxhY3RpdmVUZXh0dXJlOlIsYmluZFRleHR1cmU6ZnVuY3Rpb24obWEsSWEpe251bGw9PT15YSYmUigpO3ZhciBPYT1WYVt5YV07dm9pZCAwPT09T2EmJihPYT17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LFZhW3lhXT1PYSk7aWYoT2EudHlwZSE9PW1hfHxPYS50ZXh0dXJlIT09SWEpYi5iaW5kVGV4dHVyZShtYSxJYXx8aWJbbWFdKSxPYS50eXBlPW1hLE9hLnRleHR1cmU9SWF9LGNvbXByZXNzZWRUZXhJbWFnZTJEOmZ1bmN0aW9uKCl7dHJ5e2IuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkoYixhcmd1bWVudHMpfWNhdGNoKG1hKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsbWEpfX0sdGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXtiLnRleEltYWdlMkQuYXBwbHkoYixhcmd1bWVudHMpfWNhdGNoKG1hKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsbWEpfX0sdGV4SW1hZ2UzRDpmdW5jdGlvbigpe3RyeXtiLnRleEltYWdlM0QuYXBwbHkoYiwKYXJndW1lbnRzKX1jYXRjaChtYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLG1hKX19LHNjaXNzb3I6ZnVuY3Rpb24obWEpeyExPT09WmEuZXF1YWxzKG1hKSYmKGIuc2Npc3NvcihtYS54LG1hLnksbWEueixtYS53KSxaYS5jb3B5KG1hKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKG1hKXshMT09PVRhLmVxdWFscyhtYSkmJihiLnZpZXdwb3J0KG1hLngsbWEueSxtYS56LG1hLncpLFRhLmNvcHkobWEpKX0scmVzZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIG1hPTA7bWE8cmEubGVuZ3RoO21hKyspMT09PXJhW21hXSYmKGIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1hKSxyYVttYV09MCk7dGE9e307eWE9bmE9bnVsbDtWYT17fTtoYj1KYT1zYT12YT1udWxsO1UucmVzZXQoKTtXLnJlc2V0KCk7Wi5yZXNldCgpfX19ZnVuY3Rpb24gSm8oYixlLGgsbix1LHcseil7ZnVuY3Rpb24gRShqYSxwYSl7cmV0dXJuIGhiP25ldyBPZmZzY3JlZW5DYW52YXMoamEscGEpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJjYW52YXMiKX1mdW5jdGlvbiBIKGphLHBhLHlhLFZhKXt2YXIgWmE9MTtpZihqYS53aWR0aD5WYXx8amEuaGVpZ2h0PlZhKVphPVZhL01hdGgubWF4KGphLndpZHRoLGphLmhlaWdodCk7aWYoMT5aYXx8ITA9PT1wYSl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmamEgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmamEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPT10eXBlb2YgSW1hZ2VCaXRtYXAmJmphIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApcmV0dXJuIFZhPXBhP29iLmZsb29yUG93ZXJPZlR3bzpNYXRoLmZsb29yLHBhPVZhKFphKmphLndpZHRoKSxaYT1WYShaYSpqYS5oZWlnaHQpLHZvaWQgMD09PUphJiYoSmE9RShwYSxaYSkpLHlhPXlhP0UocGEsWmEpOkphLHlhLndpZHRoPXBhLHlhLmhlaWdodD1aYSx5YS5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZShqYSwKMCwwLHBhLFphKSxjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaGFzIGJlZW4gcmVzaXplZCBmcm9tICgiK2phLndpZHRoKyJ4IitqYS5oZWlnaHQrIikgdG8gKCIrcGErIngiK1phKyIpLiIpLHlhOyJkYXRhImluIGphJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCIramEud2lkdGgrIngiK2phLmhlaWdodCsiKS4iKX1yZXR1cm4gamF9ZnVuY3Rpb24gSShqYSl7cmV0dXJuIG9iLmlzUG93ZXJPZlR3byhqYS53aWR0aCkmJm9iLmlzUG93ZXJPZlR3byhqYS5oZWlnaHQpfWZ1bmN0aW9uIE8oamEpe3JldHVybiB1LmlzV2ViR0wyPyExOjEwMDEhPT1qYS53cmFwU3x8MTAwMSE9PWphLndyYXBUfHwxMDAzIT09amEubWluRmlsdGVyJiYxMDA2IT09amEubWluRmlsdGVyfWZ1bmN0aW9uIFEoamEscGEpe3JldHVybiBqYS5nZW5lcmF0ZU1pcG1hcHMmJnBhJiYxMDAzIT09amEubWluRmlsdGVyJiYKMTAwNiE9PWphLm1pbkZpbHRlcn1mdW5jdGlvbiBSKGphLHBhLHlhLFZhKXtiLmdlbmVyYXRlTWlwbWFwKGphKTtuLmdldChwYSkuX19tYXhNaXBMZXZlbD1NYXRoLmxvZyhNYXRoLm1heCh5YSxWYSkpKk1hdGguTE9HMkV9ZnVuY3Rpb24gVShqYSxwYSl7aWYoIXUuaXNXZWJHTDIpcmV0dXJuIGphO3ZhciB5YT1qYTs2NDAzPT09amEmJig1MTI2PT09cGEmJih5YT0zMzMyNiksNTEzMT09PXBhJiYoeWE9MzMzMjUpLDUxMjE9PT1wYSYmKHlhPTMzMzIxKSk7NjQwNz09PWphJiYoNTEyNj09PXBhJiYoeWE9MzQ4MzcpLDUxMzE9PT1wYSYmKHlhPTM0ODQzKSw1MTIxPT09cGEmJih5YT0zMjg0OSkpOzY0MDg9PT1qYSYmKDUxMjY9PT1wYSYmKHlhPTM0ODM2KSw1MTMxPT09cGEmJih5YT0zNDg0MiksNTEyMT09PXBhJiYoeWE9MzI4NTYpKTszMzMyNT09PXlhfHwzMzMyNj09PXlhfHwzNDg0Mj09PXlhfHwzNDgzNj09PXlhP2UuZ2V0KCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0Iik6KDM0ODQzPT09CnlhfHwzNDgzNz09PXlhKSYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBGbG9hdGluZyBwb2ludCB0ZXh0dXJlcyB3aXRoIFJHQiBmb3JtYXQgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBSR0JBIGluc3RlYWQuIik7cmV0dXJuIHlhfWZ1bmN0aW9uIFcoamEpe3JldHVybiAxMDAzPT09amF8fDEwMDQ9PT1qYXx8MTAwNT09PWphPzk3Mjg6OTcyOX1mdW5jdGlvbiBaKGphKXtqYT1qYS50YXJnZXQ7amEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsWik7cWEoamEpO2phLmlzVmlkZW9UZXh0dXJlJiZkZWxldGUgY2JbamEuaWRdO3oubWVtb3J5LnRleHR1cmVzLS19ZnVuY3Rpb24gZmEoamEpe2phPWphLnRhcmdldDtqYS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixmYSk7cmEoamEpO3oubWVtb3J5LnRleHR1cmVzLS19ZnVuY3Rpb24gcWEoamEpe3ZhciBwYT1uLmdldChqYSk7dm9pZCAwIT09cGEuX193ZWJnbEluaXQmJihiLmRlbGV0ZVRleHR1cmUocGEuX193ZWJnbFRleHR1cmUpLApuLnJlbW92ZShqYSkpfWZ1bmN0aW9uIHJhKGphKXt2YXIgcGE9bi5nZXQoamEpLHlhPW4uZ2V0KGphLnRleHR1cmUpO2lmKGphKXt2b2lkIDAhPT15YS5fX3dlYmdsVGV4dHVyZSYmYi5kZWxldGVUZXh0dXJlKHlhLl9fd2ViZ2xUZXh0dXJlKTtqYS5kZXB0aFRleHR1cmUmJmphLmRlcHRoVGV4dHVyZS5kaXNwb3NlKCk7aWYoamEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUpZm9yKHlhPTA7Nj55YTt5YSsrKWIuZGVsZXRlRnJhbWVidWZmZXIocGEuX193ZWJnbEZyYW1lYnVmZmVyW3lhXSkscGEuX193ZWJnbERlcHRoYnVmZmVyJiZiLmRlbGV0ZVJlbmRlcmJ1ZmZlcihwYS5fX3dlYmdsRGVwdGhidWZmZXJbeWFdKTtlbHNlIGIuZGVsZXRlRnJhbWVidWZmZXIocGEuX193ZWJnbEZyYW1lYnVmZmVyKSxwYS5fX3dlYmdsRGVwdGhidWZmZXImJmIuZGVsZXRlUmVuZGVyYnVmZmVyKHBhLl9fd2ViZ2xEZXB0aGJ1ZmZlcik7bi5yZW1vdmUoamEudGV4dHVyZSk7bi5yZW1vdmUoamEpfX1mdW5jdGlvbiBpYShqYSwKcGEpe3ZhciB5YT1uLmdldChqYSk7amEuaXNWaWRlb1RleHR1cmUmJmZiKGphKTtpZigwPGphLnZlcnNpb24mJnlhLl9fdmVyc2lvbiE9PWphLnZlcnNpb24pe3ZhciBWYT1qYS5pbWFnZTtpZih2b2lkIDA9PT1WYSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpO2Vsc2UgaWYoITE9PT1WYS5jb21wbGV0ZSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIGluY29tcGxldGUiKTtlbHNle3NhKHlhLGphLHBhKTtyZXR1cm59fWguYWN0aXZlVGV4dHVyZSgzMzk4NCtwYSk7aC5iaW5kVGV4dHVyZSgzNTUzLHlhLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiB0YShqYSxwYSl7dmFyIHlhPW4uZ2V0KGphKTtpZig2PT09amEuaW1hZ2UubGVuZ3RoKWlmKDA8amEudmVyc2lvbiYmeWEuX192ZXJzaW9uIT09CmphLnZlcnNpb24pe0JhKHlhLGphKTtoLmFjdGl2ZVRleHR1cmUoMzM5ODQrcGEpO2guYmluZFRleHR1cmUoMzQwNjcseWEuX193ZWJnbFRleHR1cmUpO2IucGl4ZWxTdG9yZWkoMzc0NDAsamEuZmxpcFkpO3BhPWphJiZqYS5pc0NvbXByZXNzZWRUZXh0dXJlO2Zvcih2YXIgVmE9amEuaW1hZ2VbMF0mJmphLmltYWdlWzBdLmlzRGF0YVRleHR1cmUsWmE9W10sVGE9MDs2PlRhO1RhKyspWmFbVGFdPXBhfHxWYT9WYT9qYS5pbWFnZVtUYV0uaW1hZ2U6amEuaW1hZ2VbVGFdOkgoamEuaW1hZ2VbVGFdLCExLCEwLHUubWF4Q3ViZW1hcFNpemUpO3ZhciBpYj1aYVswXSxtYT1JKGliKXx8dS5pc1dlYkdMMixJYT13LmNvbnZlcnQoamEuZm9ybWF0KSxPYT13LmNvbnZlcnQoamEudHlwZSksdWI9VShJYSxPYSk7dmEoMzQwNjcsamEsbWEpO2ZvcihUYT0wOzY+VGE7VGErKylpZihwYSlmb3IodmFyIGFiLEtiPVphW1RhXS5taXBtYXBzLGxiPTAsUWE9S2IubGVuZ3RoO2xiPFFhO2xiKyspYWI9S2JbbGJdLAoxMDIzIT09amEuZm9ybWF0JiYxMDIyIT09amEuZm9ybWF0Py0xPGguZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihJYSk/aC5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OStUYSxsYix1YixhYi53aWR0aCxhYi5oZWlnaHQsMCxhYi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6aC50ZXhJbWFnZTJEKDM0MDY5K1RhLGxiLHViLGFiLndpZHRoLGFiLmhlaWdodCwwLElhLE9hLGFiLmRhdGEpO2Vsc2UgVmE/aC50ZXhJbWFnZTJEKDM0MDY5K1RhLDAsdWIsWmFbVGFdLndpZHRoLFphW1RhXS5oZWlnaHQsMCxJYSxPYSxaYVtUYV0uZGF0YSk6aC50ZXhJbWFnZTJEKDM0MDY5K1RhLDAsdWIsSWEsT2EsWmFbVGFdKTt5YS5fX21heE1pcExldmVsPXBhP0tiLmxlbmd0aC0xOjA7UShqYSxtYSkmJlIoMzQwNjcsCmphLGliLndpZHRoLGliLmhlaWdodCk7eWEuX192ZXJzaW9uPWphLnZlcnNpb247aWYoamEub25VcGRhdGUpamEub25VcGRhdGUoamEpfWVsc2UgaC5hY3RpdmVUZXh0dXJlKDMzOTg0K3BhKSxoLmJpbmRUZXh0dXJlKDM0MDY3LHlhLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiBuYShqYSxwYSl7aC5hY3RpdmVUZXh0dXJlKDMzOTg0K3BhKTtoLmJpbmRUZXh0dXJlKDM0MDY3LG4uZ2V0KGphKS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gdmEoamEscGEseWEpe3lhPyhiLnRleFBhcmFtZXRlcmkoamEsMTAyNDIsdy5jb252ZXJ0KHBhLndyYXBTKSksYi50ZXhQYXJhbWV0ZXJpKGphLDEwMjQzLHcuY29udmVydChwYS53cmFwVCkpLDMyODc5IT09amEmJjM1ODY2IT09amF8fGIudGV4UGFyYW1ldGVyaShqYSwzMjg4Mix3LmNvbnZlcnQocGEud3JhcFIpKSxiLnRleFBhcmFtZXRlcmkoamEsMTAyNDAsdy5jb252ZXJ0KHBhLm1hZ0ZpbHRlcikpLGIudGV4UGFyYW1ldGVyaShqYSwxMDI0MSwKdy5jb252ZXJ0KHBhLm1pbkZpbHRlcikpKTooYi50ZXhQYXJhbWV0ZXJpKGphLDEwMjQyLDMzMDcxKSxiLnRleFBhcmFtZXRlcmkoamEsMTAyNDMsMzMwNzEpLDMyODc5IT09amEmJjM1ODY2IT09amF8fGIudGV4UGFyYW1ldGVyaShqYSwzMjg4MiwzMzA3MSksMTAwMT09PXBhLndyYXBTJiYxMDAxPT09cGEud3JhcFR8fGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLndyYXBTIGFuZCBUZXh0dXJlLndyYXBUIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuQ2xhbXBUb0VkZ2VXcmFwcGluZy4iKSxiLnRleFBhcmFtZXRlcmkoamEsMTAyNDAsVyhwYS5tYWdGaWx0ZXIpKSxiLnRleFBhcmFtZXRlcmkoamEsMTAyNDEsVyhwYS5taW5GaWx0ZXIpKSwxMDAzIT09cGEubWluRmlsdGVyJiYxMDA2IT09cGEubWluRmlsdGVyJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4iKSk7CiEoeWE9ZS5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpKXx8MTAxNT09PXBhLnR5cGUmJm51bGw9PT1lLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIil8fDEwMTY9PT1wYS50eXBlJiZudWxsPT09KHUuaXNXZWJHTDJ8fGUuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpKXx8ISgxPHBhLmFuaXNvdHJvcHl8fG4uZ2V0KHBhKS5fX2N1cnJlbnRBbmlzb3Ryb3B5KXx8KGIudGV4UGFyYW1ldGVyZihqYSx5YS5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxNYXRoLm1pbihwYS5hbmlzb3Ryb3B5LHUuZ2V0TWF4QW5pc290cm9weSgpKSksbi5nZXQocGEpLl9fY3VycmVudEFuaXNvdHJvcHk9cGEuYW5pc290cm9weSl9ZnVuY3Rpb24gQmEoamEscGEpe3ZvaWQgMD09PWphLl9fd2ViZ2xJbml0JiYoamEuX193ZWJnbEluaXQ9ITAscGEuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsWiksamEuX193ZWJnbFRleHR1cmU9Yi5jcmVhdGVUZXh0dXJlKCksCnoubWVtb3J5LnRleHR1cmVzKyspfWZ1bmN0aW9uIHNhKGphLHBhLHlhKXt2YXIgVmE9MzU1MztwYS5pc0RhdGFUZXh0dXJlMkRBcnJheSYmKFZhPTM1ODY2KTtwYS5pc0RhdGFUZXh0dXJlM0QmJihWYT0zMjg3OSk7QmEoamEscGEpO2guYWN0aXZlVGV4dHVyZSgzMzk4NCt5YSk7aC5iaW5kVGV4dHVyZShWYSxqYS5fX3dlYmdsVGV4dHVyZSk7Yi5waXhlbFN0b3JlaSgzNzQ0MCxwYS5mbGlwWSk7Yi5waXhlbFN0b3JlaSgzNzQ0MSxwYS5wcmVtdWx0aXBseUFscGhhKTtiLnBpeGVsU3RvcmVpKDMzMTcscGEudW5wYWNrQWxpZ25tZW50KTt5YT1PKHBhKSYmITE9PT1JKHBhLmltYWdlKTt5YT1IKHBhLmltYWdlLHlhLCExLHUubWF4VGV4dHVyZVNpemUpO3ZhciBaYT1JKHlhKXx8dS5pc1dlYkdMMixUYT13LmNvbnZlcnQocGEuZm9ybWF0KSxpYj13LmNvbnZlcnQocGEudHlwZSksbWE9VShUYSxpYik7dmEoVmEscGEsWmEpO3ZhciBJYT1wYS5taXBtYXBzO2lmKHBhLmlzRGVwdGhUZXh0dXJlKXttYT0KNjQwMjtpZigxMDE1PT09cGEudHlwZSl7aWYoIXUuaXNXZWJHTDIpdGhyb3cgRXJyb3IoIkZsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAiKTttYT0zNjAxMn1lbHNlIHUuaXNXZWJHTDImJihtYT0zMzE4OSk7MTAyNj09PXBhLmZvcm1hdCYmNjQwMj09PW1hJiYxMDEyIT09cGEudHlwZSYmMTAxNCE9PXBhLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4iKSxwYS50eXBlPTEwMTIsaWI9dy5jb252ZXJ0KHBhLnR5cGUpKTsxMDI3PT09cGEuZm9ybWF0JiYobWE9MzQwNDEsMTAyMCE9PXBhLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIikscGEudHlwZT0xMDIwLGliPQp3LmNvbnZlcnQocGEudHlwZSkpKTtoLnRleEltYWdlMkQoMzU1MywwLG1hLHlhLndpZHRoLHlhLmhlaWdodCwwLFRhLGliLG51bGwpfWVsc2UgaWYocGEuaXNEYXRhVGV4dHVyZSlpZigwPElhLmxlbmd0aCYmWmEpe2Zvcih2YXIgT2E9MCx1Yj1JYS5sZW5ndGg7T2E8dWI7T2ErKylWYT1JYVtPYV0saC50ZXhJbWFnZTJEKDM1NTMsT2EsbWEsVmEud2lkdGgsVmEuaGVpZ2h0LDAsVGEsaWIsVmEuZGF0YSk7cGEuZ2VuZXJhdGVNaXBtYXBzPSExO2phLl9fbWF4TWlwTGV2ZWw9SWEubGVuZ3RoLTF9ZWxzZSBoLnRleEltYWdlMkQoMzU1MywwLG1hLHlhLndpZHRoLHlhLmhlaWdodCwwLFRhLGliLHlhLmRhdGEpLGphLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKHBhLmlzQ29tcHJlc3NlZFRleHR1cmUpe09hPTA7Zm9yKHViPUlhLmxlbmd0aDtPYTx1YjtPYSsrKVZhPUlhW09hXSwxMDIzIT09cGEuZm9ybWF0JiYxMDIyIT09cGEuZm9ybWF0Py0xPGguZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihUYSk/CmguY29tcHJlc3NlZFRleEltYWdlMkQoMzU1MyxPYSxtYSxWYS53aWR0aCxWYS5oZWlnaHQsMCxWYS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTpoLnRleEltYWdlMkQoMzU1MyxPYSxtYSxWYS53aWR0aCxWYS5oZWlnaHQsMCxUYSxpYixWYS5kYXRhKTtqYS5fX21heE1pcExldmVsPUlhLmxlbmd0aC0xfWVsc2UgaWYocGEuaXNEYXRhVGV4dHVyZTJEQXJyYXkpaC50ZXhJbWFnZTNEKDM1ODY2LDAsbWEseWEud2lkdGgseWEuaGVpZ2h0LHlhLmRlcHRoLDAsVGEsaWIseWEuZGF0YSksamEuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYocGEuaXNEYXRhVGV4dHVyZTNEKWgudGV4SW1hZ2UzRCgzMjg3OSwwLG1hLHlhLndpZHRoLHlhLmhlaWdodCx5YS5kZXB0aCwwLFRhLGliLHlhLmRhdGEpLGphLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKDA8CklhLmxlbmd0aCYmWmEpe09hPTA7Zm9yKHViPUlhLmxlbmd0aDtPYTx1YjtPYSsrKVZhPUlhW09hXSxoLnRleEltYWdlMkQoMzU1MyxPYSxtYSxUYSxpYixWYSk7cGEuZ2VuZXJhdGVNaXBtYXBzPSExO2phLl9fbWF4TWlwTGV2ZWw9SWEubGVuZ3RoLTF9ZWxzZSBoLnRleEltYWdlMkQoMzU1MywwLG1hLFRhLGliLHlhKSxqYS5fX21heE1pcExldmVsPTA7UShwYSxaYSkmJlIoMzU1MyxwYSx5YS53aWR0aCx5YS5oZWlnaHQpO2phLl9fdmVyc2lvbj1wYS52ZXJzaW9uO2lmKHBhLm9uVXBkYXRlKXBhLm9uVXBkYXRlKHBhKX1mdW5jdGlvbiBEYShqYSxwYSx5YSxWYSl7dmFyIFphPXcuY29udmVydChwYS50ZXh0dXJlLmZvcm1hdCksVGE9dy5jb252ZXJ0KHBhLnRleHR1cmUudHlwZSksaWI9VShaYSxUYSk7aC50ZXhJbWFnZTJEKFZhLDAsaWIscGEud2lkdGgscGEuaGVpZ2h0LDAsWmEsVGEsbnVsbCk7Yi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsamEpO2IuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsCnlhLFZhLG4uZ2V0KHBhLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLDApO2IuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIEhhKGphLHBhLHlhKXtiLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsamEpO2lmKHBhLmRlcHRoQnVmZmVyJiYhcGEuc3RlbmNpbEJ1ZmZlcil5YT8oeWE9TGEocGEpLGIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHlhLDMzMTg5LHBhLndpZHRoLHBhLmhlaWdodCkpOmIucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSwzMzE4OSxwYS53aWR0aCxwYS5oZWlnaHQpLGIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsamEpO2Vsc2UgaWYocGEuZGVwdGhCdWZmZXImJnBhLnN0ZW5jaWxCdWZmZXIpeWE/KHlhPUxhKHBhKSxiLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSx5YSwzNDA0MSxwYS53aWR0aCxwYS5oZWlnaHQpKTpiLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzQwNDEsCnBhLndpZHRoLHBhLmhlaWdodCksYi5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzMzMwNiwzNjE2MSxqYSk7ZWxzZXtqYT13LmNvbnZlcnQocGEudGV4dHVyZS5mb3JtYXQpO3ZhciBWYT13LmNvbnZlcnQocGEudGV4dHVyZS50eXBlKTtqYT1VKGphLFZhKTt5YT8oeWE9TGEocGEpLGIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHlhLGphLHBhLndpZHRoLHBhLmhlaWdodCkpOmIucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxqYSxwYS53aWR0aCxwYS5oZWlnaHQpfWIuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX1mdW5jdGlvbiBLYShqYSxwYSl7aWYocGEmJnBhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKXRocm93IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7Yi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsamEpO2lmKCFwYS5kZXB0aFRleHR1cmV8fCFwYS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpdGhyb3cgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsKbi5nZXQocGEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSYmcGEuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09cGEud2lkdGgmJnBhLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9PT1wYS5oZWlnaHR8fChwYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9cGEud2lkdGgscGEuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1wYS5oZWlnaHQscGEuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKTtpYShwYS5kZXB0aFRleHR1cmUsMCk7amE9bi5nZXQocGEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZigxMDI2PT09cGEuZGVwdGhUZXh0dXJlLmZvcm1hdCliLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDk2LDM1NTMsamEsMCk7ZWxzZSBpZigxMDI3PT09cGEuZGVwdGhUZXh0dXJlLmZvcm1hdCliLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsamEsMCk7ZWxzZSB0aHJvdyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iik7Cn1mdW5jdGlvbiBOYShqYSl7dmFyIHBhPW4uZ2V0KGphKSx5YT0hMD09PWphLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlO2lmKGphLmRlcHRoVGV4dHVyZSl7aWYoeWEpdGhyb3cgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7S2EocGEuX193ZWJnbEZyYW1lYnVmZmVyLGphKX1lbHNlIGlmKHlhKWZvcihwYS5fX3dlYmdsRGVwdGhidWZmZXI9W10seWE9MDs2PnlhO3lhKyspYi5iaW5kRnJhbWVidWZmZXIoMzYxNjAscGEuX193ZWJnbEZyYW1lYnVmZmVyW3lhXSkscGEuX193ZWJnbERlcHRoYnVmZmVyW3lhXT1iLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLEhhKHBhLl9fd2ViZ2xEZXB0aGJ1ZmZlclt5YV0samEpO2Vsc2UgYi5iaW5kRnJhbWVidWZmZXIoMzYxNjAscGEuX193ZWJnbEZyYW1lYnVmZmVyKSxwYS5fX3dlYmdsRGVwdGhidWZmZXI9Yi5jcmVhdGVSZW5kZXJidWZmZXIoKSxIYShwYS5fX3dlYmdsRGVwdGhidWZmZXIsCmphKTtiLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBMYShqYSl7cmV0dXJuIHUuaXNXZWJHTDImJmphLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9NYXRoLm1pbih1Lm1heFNhbXBsZXMsamEuc2FtcGxlcyk6MH1mdW5jdGlvbiBmYihqYSl7dmFyIHBhPWphLmlkLHlhPXoucmVuZGVyLmZyYW1lO2NiW3BhXSE9PXlhJiYoY2JbcGFdPXlhLGphLnVwZGF0ZSgpKX12YXIgY2I9e30sSmEsaGI9InVuZGVmaW5lZCIhPT10eXBlb2YgT2Zmc2NyZWVuQ2FudmFzLFVhPTAsSGI9ITEscWI9ITE7dGhpcy5hbGxvY2F0ZVRleHR1cmVVbml0PWZ1bmN0aW9uKCl7dmFyIGphPVVhO2phPj11Lm1heFRleHR1cmVzJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IFRyeWluZyB0byB1c2UgIitqYSsiIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAiK3UubWF4VGV4dHVyZXMpO1VhKz0xO3JldHVybiBqYX07dGhpcy5yZXNldFRleHR1cmVVbml0cz0KZnVuY3Rpb24oKXtVYT0wfTt0aGlzLnNldFRleHR1cmUyRD1pYTt0aGlzLnNldFRleHR1cmUyREFycmF5PWZ1bmN0aW9uKGphLHBhKXt2YXIgeWE9bi5nZXQoamEpOzA8amEudmVyc2lvbiYmeWEuX192ZXJzaW9uIT09amEudmVyc2lvbj9zYSh5YSxqYSxwYSk6KGguYWN0aXZlVGV4dHVyZSgzMzk4NCtwYSksaC5iaW5kVGV4dHVyZSgzNTg2Nix5YS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmUzRD1mdW5jdGlvbihqYSxwYSl7dmFyIHlhPW4uZ2V0KGphKTswPGphLnZlcnNpb24mJnlhLl9fdmVyc2lvbiE9PWphLnZlcnNpb24/c2EoeWEsamEscGEpOihoLmFjdGl2ZVRleHR1cmUoMzM5ODQrcGEpLGguYmluZFRleHR1cmUoMzI4NzkseWEuX193ZWJnbFRleHR1cmUpKX07dGhpcy5zZXRUZXh0dXJlQ3ViZT10YTt0aGlzLnNldFRleHR1cmVDdWJlRHluYW1pYz1uYTt0aGlzLnNldHVwUmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKGphKXt2YXIgcGE9bi5nZXQoamEpLHlhPW4uZ2V0KGphLnRleHR1cmUpOwpqYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixmYSk7eWEuX193ZWJnbFRleHR1cmU9Yi5jcmVhdGVUZXh0dXJlKCk7ei5tZW1vcnkudGV4dHVyZXMrKzt2YXIgVmE9ITA9PT1qYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSxaYT0hMD09PWphLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCxUYT1JKGphKXx8dS5pc1dlYkdMMjtpZihWYSlmb3IocGEuX193ZWJnbEZyYW1lYnVmZmVyPVtdLFphPTA7Nj5aYTtaYSsrKXBhLl9fd2ViZ2xGcmFtZWJ1ZmZlcltaYV09Yi5jcmVhdGVGcmFtZWJ1ZmZlcigpO2Vsc2UgaWYocGEuX193ZWJnbEZyYW1lYnVmZmVyPWIuY3JlYXRlRnJhbWVidWZmZXIoKSxaYSlpZih1LmlzV2ViR0wyKXtwYS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI9Yi5jcmVhdGVGcmFtZWJ1ZmZlcigpO3BhLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcj1iLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO2IuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxwYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpOwpaYT13LmNvbnZlcnQoamEudGV4dHVyZS5mb3JtYXQpO3ZhciBpYj13LmNvbnZlcnQoamEudGV4dHVyZS50eXBlKTtaYT1VKFphLGliKTtpYj1MYShqYSk7Yi5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoMzYxNjEsaWIsWmEsamEud2lkdGgsamEuaGVpZ2h0KTtiLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxwYS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpO2IuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwNjQsMzYxNjEscGEuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyKTtiLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbnVsbCk7amEuZGVwdGhCdWZmZXImJihwYS5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXI9Yi5jcmVhdGVSZW5kZXJidWZmZXIoKSxIYShwYS5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsamEsITApKTtiLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCBjYW4gb25seSBiZSB1c2VkIHdpdGggV2ViR0wyLiIpOwppZihWYSl7aC5iaW5kVGV4dHVyZSgzNDA2Nyx5YS5fX3dlYmdsVGV4dHVyZSk7dmEoMzQwNjcsamEudGV4dHVyZSxUYSk7Zm9yKFphPTA7Nj5aYTtaYSsrKURhKHBhLl9fd2ViZ2xGcmFtZWJ1ZmZlcltaYV0samEsMzYwNjQsMzQwNjkrWmEpO1EoamEudGV4dHVyZSxUYSkmJlIoMzQwNjcsamEudGV4dHVyZSxqYS53aWR0aCxqYS5oZWlnaHQpO2guYmluZFRleHR1cmUoMzQwNjcsbnVsbCl9ZWxzZSBoLmJpbmRUZXh0dXJlKDM1NTMseWEuX193ZWJnbFRleHR1cmUpLHZhKDM1NTMsamEudGV4dHVyZSxUYSksRGEocGEuX193ZWJnbEZyYW1lYnVmZmVyLGphLDM2MDY0LDM1NTMpLFEoamEudGV4dHVyZSxUYSkmJlIoMzU1MyxqYS50ZXh0dXJlLGphLndpZHRoLGphLmhlaWdodCksaC5iaW5kVGV4dHVyZSgzNTUzLG51bGwpO2phLmRlcHRoQnVmZmVyJiZOYShqYSl9O3RoaXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwPWZ1bmN0aW9uKGphKXt2YXIgcGE9amEudGV4dHVyZSx5YT1JKGphKXx8CnUuaXNXZWJHTDI7aWYoUShwYSx5YSkpe3lhPWphLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPzM0MDY3OjM1NTM7dmFyIFZhPW4uZ2V0KHBhKS5fX3dlYmdsVGV4dHVyZTtoLmJpbmRUZXh0dXJlKHlhLFZhKTtSKHlhLHBhLGphLndpZHRoLGphLmhlaWdodCk7aC5iaW5kVGV4dHVyZSh5YSxudWxsKX19O3RoaXMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oamEpe2lmKGphLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldClpZih1LmlzV2ViR0wyKXt2YXIgcGE9bi5nZXQoamEpO2IuYmluZEZyYW1lYnVmZmVyKDM2MDA4LHBhLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7Yi5iaW5kRnJhbWVidWZmZXIoMzYwMDkscGEuX193ZWJnbEZyYW1lYnVmZmVyKTtwYT1qYS53aWR0aDt2YXIgeWE9amEuaGVpZ2h0LFZhPTE2Mzg0O2phLmRlcHRoQnVmZmVyJiYoVmF8PTI1Nik7amEuc3RlbmNpbEJ1ZmZlciYmKFZhfD0xMDI0KTtiLmJsaXRGcmFtZWJ1ZmZlcigwLAowLHBhLHlhLDAsMCxwYSx5YSxWYSw5NzI4KX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCBjYW4gb25seSBiZSB1c2VkIHdpdGggV2ViR0wyLiIpfTt0aGlzLnNhZmVTZXRUZXh0dXJlMkQ9ZnVuY3Rpb24oamEscGEpe2phJiZqYS5pc1dlYkdMUmVuZGVyVGFyZ2V0JiYoITE9PT1IYiYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlcy5zYWZlU2V0VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIpLEhiPSEwKSxqYT1qYS50ZXh0dXJlKTtpYShqYSxwYSl9O3RoaXMuc2FmZVNldFRleHR1cmVDdWJlPWZ1bmN0aW9uKGphLHBhKXtqYSYmamEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUmJighMT09PXFiJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlQ3ViZTogZG9uJ3QgdXNlIGN1YmUgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIpLApxYj0hMCksamE9amEudGV4dHVyZSk7amEmJmphLmlzQ3ViZVRleHR1cmV8fEFycmF5LmlzQXJyYXkoamEuaW1hZ2UpJiY2PT09amEuaW1hZ2UubGVuZ3RoP3RhKGphLHBhKTpuYShqYSxwYSl9fWZ1bmN0aW9uIG5sKGIsZSxoKXtyZXR1cm57Y29udmVydDpmdW5jdGlvbihuKXtpZigxRTM9PT1uKXJldHVybiAxMDQ5NztpZigxMDAxPT09bilyZXR1cm4gMzMwNzE7aWYoMTAwMj09PW4pcmV0dXJuIDMzNjQ4O2lmKDEwMDM9PT1uKXJldHVybiA5NzI4O2lmKDEwMDQ9PT1uKXJldHVybiA5OTg0O2lmKDEwMDU9PT1uKXJldHVybiA5OTg2O2lmKDEwMDY9PT1uKXJldHVybiA5NzI5O2lmKDEwMDc9PT1uKXJldHVybiA5OTg1O2lmKDEwMDg9PT1uKXJldHVybiA5OTg3O2lmKDEwMDk9PT1uKXJldHVybiA1MTIxO2lmKDEwMTc9PT1uKXJldHVybiAzMjgxOTtpZigxMDE4PT09bilyZXR1cm4gMzI4MjA7aWYoMTAxOT09PW4pcmV0dXJuIDMzNjM1O2lmKDEwMTA9PT1uKXJldHVybiA1MTIwO2lmKDEwMTE9PT0KbilyZXR1cm4gNTEyMjtpZigxMDEyPT09bilyZXR1cm4gNTEyMztpZigxMDEzPT09bilyZXR1cm4gNTEyNDtpZigxMDE0PT09bilyZXR1cm4gNTEyNTtpZigxMDE1PT09bilyZXR1cm4gNTEyNjtpZigxMDE2PT09bil7aWYoaC5pc1dlYkdMMilyZXR1cm4gNTEzMTt2YXIgdT1lLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpO2lmKG51bGwhPT11KXJldHVybiB1LkhBTEZfRkxPQVRfT0VTfWlmKDEwMjE9PT1uKXJldHVybiA2NDA2O2lmKDEwMjI9PT1uKXJldHVybiA2NDA3O2lmKDEwMjM9PT1uKXJldHVybiA2NDA4O2lmKDEwMjQ9PT1uKXJldHVybiA2NDA5O2lmKDEwMjU9PT1uKXJldHVybiA2NDEwO2lmKDEwMjY9PT1uKXJldHVybiA2NDAyO2lmKDEwMjc9PT1uKXJldHVybiAzNDA0MTtpZigxMDI4PT09bilyZXR1cm4gNjQwMztpZigxMDA9PT1uKXJldHVybiAzMjc3NDtpZigxMDE9PT1uKXJldHVybiAzMjc3ODtpZigxMDI9PT1uKXJldHVybiAzMjc3OTtpZigyMDA9PT1uKXJldHVybiAwOwppZigyMDE9PT1uKXJldHVybiAxO2lmKDIwMj09PW4pcmV0dXJuIDc2ODtpZigyMDM9PT1uKXJldHVybiA3Njk7aWYoMjA0PT09bilyZXR1cm4gNzcwO2lmKDIwNT09PW4pcmV0dXJuIDc3MTtpZigyMDY9PT1uKXJldHVybiA3NzI7aWYoMjA3PT09bilyZXR1cm4gNzczO2lmKDIwOD09PW4pcmV0dXJuIDc3NDtpZigyMDk9PT1uKXJldHVybiA3NzU7aWYoMjEwPT09bilyZXR1cm4gNzc2O2lmKDMzNzc2PT09bnx8MzM3Nzc9PT1ufHwzMzc3OD09PW58fDMzNzc5PT09bilpZih1PWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpLG51bGwhPT11KXtpZigzMzc3Nj09PW4pcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDtpZigzMzc3Nz09PW4pcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7aWYoMzM3Nzg9PT1uKXJldHVybiB1LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO2lmKDMzNzc5PT09bilyZXR1cm4gdS5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVH1pZigzNTg0MD09PQpufHwzNTg0MT09PW58fDM1ODQyPT09bnx8MzU4NDM9PT1uKWlmKHU9ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpLG51bGwhPT11KXtpZigzNTg0MD09PW4pcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0MT09PW4pcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztpZigzNTg0Mj09PW4pcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUc7aWYoMzU4NDM9PT1uKXJldHVybiB1LkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HfWlmKDM2MTk2PT09biYmKHU9ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxIiksbnVsbCE9PXUpKXJldHVybiB1LkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w7aWYoMzc4MDg9PT1ufHwzNzgwOT09PW58fDM3ODEwPT09bnx8Mzc4MTE9PT1ufHwzNzgxMj09PW58fDM3ODEzPT09bnx8Mzc4MTQ9PT1ufHwzNzgxNT09PW58fDM3ODE2PT09Cm58fDM3ODE3PT09bnx8Mzc4MTg9PT1ufHwzNzgxOT09PW58fDM3ODIwPT09bnx8Mzc4MjE9PT1uKWlmKHU9ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjIiksbnVsbCE9PXUpcmV0dXJuIG47aWYoMTAzPT09bnx8MTA0PT09bil7aWYoaC5pc1dlYkdMMil7aWYoMTAzPT09bilyZXR1cm4gMzI3NzU7aWYoMTA0PT09bilyZXR1cm4gMzI3NzZ9dT1lLmdldCgiRVhUX2JsZW5kX21pbm1heCIpO2lmKG51bGwhPT11KXtpZigxMDM9PT1uKXJldHVybiB1Lk1JTl9FWFQ7aWYoMTA0PT09bilyZXR1cm4gdS5NQVhfRVhUfX1pZigxMDIwPT09bil7aWYoaC5pc1dlYkdMMilyZXR1cm4gMzQwNDI7dT1lLmdldCgiV0VCR0xfZGVwdGhfdGV4dHVyZSIpO2lmKG51bGwhPT11KXJldHVybiB1LlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMfXJldHVybiAwfX19ZnVuY3Rpb24gTmUoKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJHcm91cCJ9ZnVuY3Rpb24gamQoKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPQoiQ2FtZXJhIjt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZT1uZXcgQzt0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IEM7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgQ31mdW5jdGlvbiBjYyhiLGUsaCxuKXtqZC5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiO3RoaXMuZm92PXZvaWQgMCE9PWI/Yjo1MDt0aGlzLnpvb209MTt0aGlzLm5lYXI9dm9pZCAwIT09aD9oOi4xO3RoaXMuZmFyPXZvaWQgMCE9PW4/bjoyRTM7dGhpcy5mb2N1cz0xMDt0aGlzLmFzcGVjdD12b2lkIDAhPT1lP2U6MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmZpbG1HYXVnZT0zNTt0aGlzLmZpbG1PZmZzZXQ9MDt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBQZihiKXtjYy5jYWxsKHRoaXMpO3RoaXMuY2FtZXJhcz1ifHxbXX1mdW5jdGlvbiBvbChiLGUsaCl7cGwuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpO3FsLnNldEZyb21NYXRyaXhQb3NpdGlvbihoLm1hdHJpeFdvcmxkKTsKdmFyIG49cGwuZGlzdGFuY2VUbyhxbCksdT1lLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsdz1oLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsej11WzE0XS8odVsxMF0tMSk7aD11WzE0XS8odVsxMF0rMSk7dmFyIEU9KHVbOV0rMSkvdVs1XSxIPSh1WzldLTEpL3VbNV0sST0odVs4XS0xKS91WzBdLE89KHdbOF0rMSkvd1swXTt1PXoqSTt3PXoqTztPPW4vKC1JK08pO0k9TyotSTtlLm1hdHJpeFdvcmxkLmRlY29tcG9zZShiLnBvc2l0aW9uLGIucXVhdGVybmlvbixiLnNjYWxlKTtiLnRyYW5zbGF0ZVgoSSk7Yi50cmFuc2xhdGVaKE8pO2IubWF0cml4V29ybGQuY29tcG9zZShiLnBvc2l0aW9uLGIucXVhdGVybmlvbixiLnNjYWxlKTtiLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKGIubWF0cml4V29ybGQpO2U9eitPO3o9aCtPO2IucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUodS1JLHcrKG4tSSksRSpoL3oqZSxIKmgveiplLGUseil9ZnVuY3Rpb24gcmwoYil7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09CnomJiEwPT09ei5pc1ByZXNlbnRpbmd9ZnVuY3Rpb24gaCgpe2lmKGUoKSl7dmFyIHNhPXouZ2V0RXllUGFyYW1ldGVycygibGVmdCIpLERhPXNhLnJlbmRlcldpZHRoKlI7c2E9c2EucmVuZGVySGVpZ2h0KlI7bmE9Yi5nZXRQaXhlbFJhdGlvKCk7Yi5nZXRTaXplKHRhKTtiLnNldERyYXdpbmdCdWZmZXJTaXplKDIqRGEsc2EsMSk7QmEuc3RhcnQoKX1lbHNlIHcuZW5hYmxlZCYmYi5zZXREcmF3aW5nQnVmZmVyU2l6ZSh0YS53aWR0aCx0YS5oZWlnaHQsbmEpLEJhLnN0b3AoKX1mdW5jdGlvbiBuKHNhKXtmb3IodmFyIERhPW5hdmlnYXRvci5nZXRHYW1lcGFkcyYmbmF2aWdhdG9yLmdldEdhbWVwYWRzKCksSGE9MCxLYT0wLE5hPURhLmxlbmd0aDtIYTxOYTtIYSsrKXt2YXIgTGE9RGFbSGFdO2lmKExhJiYoIkRheWRyZWFtIENvbnRyb2xsZXIiPT09TGEuaWR8fCJHZWFyIFZSIENvbnRyb2xsZXIiPT09TGEuaWR8fCJPY3VsdXMgR28gQ29udHJvbGxlciI9PT1MYS5pZHx8Ik9wZW5WUiBHYW1lcGFkIj09PQpMYS5pZHx8TGEuaWQuc3RhcnRzV2l0aCgiT2N1bHVzIFRvdWNoIil8fExhLmlkLnN0YXJ0c1dpdGgoIlNwYXRpYWwgQ29udHJvbGxlciIpKSl7aWYoS2E9PT1zYSlyZXR1cm4gTGE7S2ErK319fWZ1bmN0aW9uIHUoKXtmb3IodmFyIHNhPTA7c2E8SS5sZW5ndGg7c2ErKyl7dmFyIERhPUlbc2FdLEhhPW4oc2EpO2lmKHZvaWQgMCE9PUhhJiZ2b2lkIDAhPT1IYS5wb3NlKXtpZihudWxsPT09SGEucG9zZSlicmVhazt2YXIgS2E9SGEucG9zZTshMT09PUthLmhhc1Bvc2l0aW9uJiZEYS5wb3NpdGlvbi5zZXQoLjIsLS42LC0uMDUpO251bGwhPT1LYS5wb3NpdGlvbiYmRGEucG9zaXRpb24uZnJvbUFycmF5KEthLnBvc2l0aW9uKTtudWxsIT09S2Eub3JpZW50YXRpb24mJkRhLnF1YXRlcm5pb24uZnJvbUFycmF5KEthLm9yaWVudGF0aW9uKTtEYS5tYXRyaXguY29tcG9zZShEYS5wb3NpdGlvbixEYS5xdWF0ZXJuaW9uLERhLnNjYWxlKTtEYS5tYXRyaXgucHJlbXVsdGlwbHkoTyk7RGEubWF0cml4LmRlY29tcG9zZShEYS5wb3NpdGlvbiwKRGEucXVhdGVybmlvbixEYS5zY2FsZSk7RGEubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMDtEYS52aXNpYmxlPSEwO0thPSJEYXlkcmVhbSBDb250cm9sbGVyIj09PUhhLmlkPzA6MTt2YVtzYV0hPT1IYS5idXR0b25zW0thXS5wcmVzc2VkJiYodmFbc2FdPUhhLmJ1dHRvbnNbS2FdLnByZXNzZWQsITA9PT12YVtzYV0/RGEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0c3RhcnQifSk6KERhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdGVuZCJ9KSxEYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3QifSkpKX1lbHNlIERhLnZpc2libGU9ITF9fXZhciB3PXRoaXMsej1udWxsLEU9bnVsbCxIPW51bGwsST1bXSxPPW5ldyBDLFE9bmV3IEMsUj0xLFU9InN0YWdlIjsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJiJWUkZyYW1lRGF0YSJpbiB3aW5kb3cmJihFPW5ldyB3aW5kb3cuVlJGcmFtZURhdGEsd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInZyZGlzcGxheXByZXNlbnRjaGFuZ2UiLApoLCExKSk7dmFyIFc9bmV3IEMsWj1uZXcgZixmYT1uZXcgZyxxYT1uZXcgY2M7cWEuYm91bmRzPW5ldyBtKDAsMCwuNSwxKTtxYS5sYXllcnMuZW5hYmxlKDEpO3ZhciByYT1uZXcgY2M7cmEuYm91bmRzPW5ldyBtKC41LDAsLjUsMSk7cmEubGF5ZXJzLmVuYWJsZSgyKTt2YXIgaWE9bmV3IFBmKFtxYSxyYV0pO2lhLmxheWVycy5lbmFibGUoMSk7aWEubGF5ZXJzLmVuYWJsZSgyKTt2YXIgdGE9bmV3IGQsbmEsdmE9W107dGhpcy5lbmFibGVkPSExO3RoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihzYSl7dmFyIERhPUlbc2FdO3ZvaWQgMD09PURhJiYoRGE9bmV3IE5lLERhLm1hdHJpeEF1dG9VcGRhdGU9ITEsRGEudmlzaWJsZT0hMSxJW3NhXT1EYSk7cmV0dXJuIERhfTt0aGlzLmdldERldmljZT1mdW5jdGlvbigpe3JldHVybiB6fTt0aGlzLnNldERldmljZT1mdW5jdGlvbihzYSl7dm9pZCAwIT09c2EmJih6PXNhKTtCYS5zZXRDb250ZXh0KHNhKX07dGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yPQpmdW5jdGlvbihzYSl7Uj1zYX07dGhpcy5zZXRGcmFtZU9mUmVmZXJlbmNlVHlwZT1mdW5jdGlvbihzYSl7VT1zYX07dGhpcy5zZXRQb3NlVGFyZ2V0PWZ1bmN0aW9uKHNhKXt2b2lkIDAhPT1zYSYmKEg9c2EpfTt0aGlzLmdldENhbWVyYT1mdW5jdGlvbihzYSl7dmFyIERhPSJzdGFnZSI9PT1VPzEuNjowO2lmKCExPT09ZSgpKXJldHVybiBzYS5wb3NpdGlvbi5zZXQoMCxEYSwwKSxzYS5yb3RhdGlvbi5zZXQoMCwwLDApLHNhO3ouZGVwdGhOZWFyPXNhLm5lYXI7ei5kZXB0aEZhcj1zYS5mYXI7ei5nZXRGcmFtZURhdGEoRSk7aWYoInN0YWdlIj09PVUpe3ZhciBIYT16LnN0YWdlUGFyYW1ldGVycztIYT9PLmZyb21BcnJheShIYS5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk6Ty5tYWtlVHJhbnNsYXRpb24oMCxEYSwwKX1EYT1FLnBvc2U7SGE9bnVsbCE9PUg/SDpzYTtIYS5tYXRyaXguY29weShPKTtIYS5tYXRyaXguZGVjb21wb3NlKEhhLnBvc2l0aW9uLEhhLnF1YXRlcm5pb24sCkhhLnNjYWxlKTtudWxsIT09RGEub3JpZW50YXRpb24mJihaLmZyb21BcnJheShEYS5vcmllbnRhdGlvbiksSGEucXVhdGVybmlvbi5tdWx0aXBseShaKSk7bnVsbCE9PURhLnBvc2l0aW9uJiYoWi5zZXRGcm9tUm90YXRpb25NYXRyaXgoTyksZmEuZnJvbUFycmF5KERhLnBvc2l0aW9uKSxmYS5hcHBseVF1YXRlcm5pb24oWiksSGEucG9zaXRpb24uYWRkKGZhKSk7SGEudXBkYXRlTWF0cml4V29ybGQoKTtxYS5uZWFyPXNhLm5lYXI7cmEubmVhcj1zYS5uZWFyO3FhLmZhcj1zYS5mYXI7cmEuZmFyPXNhLmZhcjtxYS5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KEUubGVmdFZpZXdNYXRyaXgpO3JhLm1hdHJpeFdvcmxkSW52ZXJzZS5mcm9tQXJyYXkoRS5yaWdodFZpZXdNYXRyaXgpO1EuZ2V0SW52ZXJzZShPKTsic3RhZ2UiPT09VSYmKHFhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShRKSxyYS5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoUSkpO3NhPUhhLnBhcmVudDsKbnVsbCE9PXNhJiYoVy5nZXRJbnZlcnNlKHNhLm1hdHJpeFdvcmxkKSxxYS5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoVykscmEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KFcpKTtxYS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKHFhLm1hdHJpeFdvcmxkSW52ZXJzZSk7cmEubWF0cml4V29ybGQuZ2V0SW52ZXJzZShyYS5tYXRyaXhXb3JsZEludmVyc2UpO3FhLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KEUubGVmdFByb2plY3Rpb25NYXRyaXgpO3JhLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KEUucmlnaHRQcm9qZWN0aW9uTWF0cml4KTtvbChpYSxxYSxyYSk7c2E9ei5nZXRMYXllcnMoKTtzYS5sZW5ndGgmJihzYT1zYVswXSxudWxsIT09c2EubGVmdEJvdW5kcyYmND09PXNhLmxlZnRCb3VuZHMubGVuZ3RoJiZxYS5ib3VuZHMuZnJvbUFycmF5KHNhLmxlZnRCb3VuZHMpLG51bGwhPT1zYS5yaWdodEJvdW5kcyYmND09PXNhLnJpZ2h0Qm91bmRzLmxlbmd0aCYmCnJhLmJvdW5kcy5mcm9tQXJyYXkoc2EucmlnaHRCb3VuZHMpKTt1KCk7cmV0dXJuIGlhfTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7cmV0dXJuIE99O3RoaXMuaXNQcmVzZW50aW5nPWU7dmFyIEJhPW5ldyBHO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihzYSl7QmEuc2V0QW5pbWF0aW9uTG9vcChzYSk7ZSgpJiZCYS5zdGFydCgpfTt0aGlzLnN1Ym1pdEZyYW1lPWZ1bmN0aW9uKCl7ZSgpJiZ6LnN1Ym1pdEZyYW1lKCl9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpeyJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZyZGlzcGxheXByZXNlbnRjaGFuZ2UiLGgpfX1mdW5jdGlvbiBLbyhiKXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT1FJiZudWxsIT09SX1mdW5jdGlvbiBoKGlhKXt2YXIgdGE9UltVLmluZGV4T2YoaWEuaW5wdXRTb3VyY2UpXTt0YSYmdGEuZGlzcGF0Y2hFdmVudCh7dHlwZTppYS50eXBlfSl9CmZ1bmN0aW9uIG4oKXtiLnNldEZyYW1lYnVmZmVyKG51bGwpO2Iuc2V0UmVuZGVyVGFyZ2V0KGIuZ2V0UmVuZGVyVGFyZ2V0KCkpO3JhLnN0b3AoKX1mdW5jdGlvbiB1KGlhLHRhKXtudWxsPT09dGE/aWEubWF0cml4V29ybGQuY29weShpYS5tYXRyaXgpOmlhLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGEubWF0cml4V29ybGQsaWEubWF0cml4KTtpYS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZShpYS5tYXRyaXhXb3JsZCl9dmFyIHc9Yi5jb250ZXh0LHo9bnVsbCxFPW51bGwsSD0xLEk9bnVsbCxPPSJzdGFnZSIsUT1udWxsLFI9W10sVT1bXSxXPW5ldyBjYztXLmxheWVycy5lbmFibGUoMSk7Vy52aWV3cG9ydD1uZXcgbTt2YXIgWj1uZXcgY2M7Wi5sYXllcnMuZW5hYmxlKDIpO1oudmlld3BvcnQ9bmV3IG07dmFyIGZhPW5ldyBQZihbVyxaXSk7ZmEubGF5ZXJzLmVuYWJsZSgxKTtmYS5sYXllcnMuZW5hYmxlKDIpO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9CmZ1bmN0aW9uKGlhKXt2YXIgdGE9UltpYV07dm9pZCAwPT09dGEmJih0YT1uZXcgTmUsdGEubWF0cml4QXV0b1VwZGF0ZT0hMSx0YS52aXNpYmxlPSExLFJbaWFdPXRhKTtyZXR1cm4gdGF9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHp9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKGlhKXt2b2lkIDAhPT1pYSYmKHo9aWEpO2lhIGluc3RhbmNlb2YgWFJEZXZpY2UmJncuc2V0Q29tcGF0aWJsZVhSRGV2aWNlKGlhKX07dGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yPWZ1bmN0aW9uKGlhKXtIPWlhfTt0aGlzLnNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlPWZ1bmN0aW9uKGlhKXtPPWlhfTt0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oaWEpe0U9aWE7bnVsbCE9PUUmJihFLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdCIsaCksRS5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RzdGFydCIsaCksRS5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RlbmQiLGgpLEUuYWRkRXZlbnRMaXN0ZW5lcigiZW5kIiwKbiksRS5iYXNlTGF5ZXI9bmV3IFhSV2ViR0xMYXllcihFLHcse2ZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6SH0pLEUucmVxdWVzdEZyYW1lT2ZSZWZlcmVuY2UoTykudGhlbihmdW5jdGlvbih0YSl7ST10YTtiLnNldEZyYW1lYnVmZmVyKEUuYmFzZUxheWVyLmZyYW1lYnVmZmVyKTtyYS5zZXRDb250ZXh0KEUpO3JhLnN0YXJ0KCl9KSxVPUUuZ2V0SW5wdXRTb3VyY2VzKCksRS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLGZ1bmN0aW9uKCl7VT1FLmdldElucHV0U291cmNlcygpO2NvbnNvbGUubG9nKFUpO2Zvcih2YXIgdGE9MDt0YTxSLmxlbmd0aDt0YSsrKVJbdGFdLnVzZXJEYXRhLmlucHV0U291cmNlPVVbdGFdfSkpfTt0aGlzLmdldENhbWVyYT1mdW5jdGlvbihpYSl7aWYoZSgpKXt2YXIgdGE9aWEucGFyZW50LG5hPWZhLmNhbWVyYXM7dShmYSx0YSk7Zm9yKHZhciB2YT0wO3ZhPG5hLmxlbmd0aDt2YSsrKXUobmFbdmFdLHRhKTtpYS5tYXRyaXhXb3JsZC5jb3B5KGZhLm1hdHJpeFdvcmxkKTsKaWE9aWEuY2hpbGRyZW47dmE9MDtmb3IodGE9aWEubGVuZ3RoO3ZhPHRhO3ZhKyspaWFbdmFdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtvbChmYSxXLFopO3JldHVybiBmYX1yZXR1cm4gaWF9O3RoaXMuaXNQcmVzZW50aW5nPWU7dmFyIHFhPW51bGwscmE9bmV3IEc7cmEuc2V0QW5pbWF0aW9uTG9vcChmdW5jdGlvbihpYSx0YSl7UT10YS5nZXREZXZpY2VQb3NlKEkpO2lmKG51bGwhPT1RKWZvcih2YXIgbmE9RS5iYXNlTGF5ZXIsdmE9dGEudmlld3MsQmE9MDtCYTx2YS5sZW5ndGg7QmErKyl7dmFyIHNhPXZhW0JhXSxEYT1uYS5nZXRWaWV3cG9ydChzYSksSGE9US5nZXRWaWV3TWF0cml4KHNhKSxLYT1mYS5jYW1lcmFzW0JhXTtLYS5tYXRyaXguZnJvbUFycmF5KEhhKS5nZXRJbnZlcnNlKEthLm1hdHJpeCk7S2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoc2EucHJvamVjdGlvbk1hdHJpeCk7S2Eudmlld3BvcnQuc2V0KERhLngsRGEueSxEYS53aWR0aCxEYS5oZWlnaHQpOzA9PT0KQmEmJmZhLm1hdHJpeC5jb3B5KEthLm1hdHJpeCl9Zm9yKEJhPTA7QmE8Ui5sZW5ndGg7QmErKyl7bmE9UltCYV07aWYodmE9VVtCYV0paWYodmE9dGEuZ2V0SW5wdXRQb3NlKHZhLEkpLG51bGwhPT12YSl7InRhcmdldFJheSJpbiB2YT9uYS5tYXRyaXguZWxlbWVudHM9dmEudGFyZ2V0UmF5LnRyYW5zZm9ybU1hdHJpeDoicG9pbnRlck1hdHJpeCJpbiB2YSYmKG5hLm1hdHJpeC5lbGVtZW50cz12YS5wb2ludGVyTWF0cml4KTtuYS5tYXRyaXguZGVjb21wb3NlKG5hLnBvc2l0aW9uLG5hLnJvdGF0aW9uLG5hLnNjYWxlKTtuYS52aXNpYmxlPSEwO2NvbnRpbnVlfW5hLnZpc2libGU9ITF9cWEmJnFhKGlhKX0pO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihpYSl7cWE9aWF9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe307dGhpcy5nZXRTdGFuZGluZ01hdHJpeD1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBnZXRTdGFuZGluZ01hdHJpeCgpIGlzIG5vIGxvbmdlciBuZWVkZWQuIik7CnJldHVybiBuZXcgQ307dGhpcy5zdWJtaXRGcmFtZT1mdW5jdGlvbigpe319ZnVuY3Rpb24gdGkoYil7dmFyIGU7ZnVuY3Rpb24gaCgpe3JldHVybiBudWxsPT09T2E/UmI6MX1mdW5jdGlvbiBuKCl7VmI9bmV3IGZjKFlhKTt1Yz1uZXcgaGQoWWEsVmIsYik7dWMuaXNXZWJHTDJ8fChWYi5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxWYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IiksVmIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksVmIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLFZiLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksVmIuZ2V0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksVmIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpO1ZiLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7a2Q9bmV3IG5sKFlhLFZiLHVjKTtCYj1uZXcgSW8oWWEsVmIsa2QsdWMpO0JiLnNjaXNzb3IodmIuY29weSh2ZCkubXVsdGlwbHlTY2FsYXIoUmIpKTsKQmIudmlld3BvcnQocGIuY29weSh3ZCkubXVsdGlwbHlTY2FsYXIoUmIpKTtSZD1uZXcgamMoWWEpO3ZjPW5ldyBBbztQYz1uZXcgSm8oWWEsVmIsQmIsdmMsdWMsa2QsUmQpO2JoPW5ldyBLKFlhKTt1aT1uZXcgQWEoWWEsYmgsUmQpO09lPW5ldyAkZyh1aSxSZCk7c2w9bmV3IE5kKFlhKTtnZT1uZXcgem8oaWIsVmIsdWMsUGMpO2NoPW5ldyBEbztQZT1uZXcgSG87U2Q9bmV3IENjKGliLEJiLE9lLHBhKTt0bD1uZXcgWmIoWWEsVmIsUmQsdWMpO3VsPW5ldyBNYihZYSxWYixSZCx1Yyk7UmQucHJvZ3JhbXM9Z2UucHJvZ3JhbXM7aWIuY29udGV4dD1ZYTtpYi5jYXBhYmlsaXRpZXM9dWM7aWIuZXh0ZW5zaW9ucz1WYjtpYi5wcm9wZXJ0aWVzPXZjO2liLnJlbmRlckxpc3RzPWNoO2liLnN0YXRlPUJiO2liLmluZm89UmR9ZnVuY3Rpb24gdShWKXtWLnByZXZlbnREZWZhdWx0KCk7Y29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4iKTttYT0hMH1mdW5jdGlvbiB3KCl7Y29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuIik7Cm1hPSExO24oKX1mdW5jdGlvbiB6KFYpe1Y9Vi50YXJnZXQ7Vi5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIix6KTtFKFYpfWZ1bmN0aW9uIEUoVil7SChWKTt2Yy5yZW1vdmUoVil9ZnVuY3Rpb24gSChWKXt2YXIgZGE9dmMuZ2V0KFYpLnByb2dyYW07Vi5wcm9ncmFtPXZvaWQgMDt2b2lkIDAhPT1kYSYmZ2UucmVsZWFzZVByb2dyYW0oZGEpfWZ1bmN0aW9uIEkoVixkYSl7Vi5yZW5kZXIoZnVuY3Rpb24ob2Epe2liLnJlbmRlckJ1ZmZlckltbWVkaWF0ZShvYSxkYSl9KX1mdW5jdGlvbiBPKFYsZGEsb2Epe2lmKG9hJiZvYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiYhdWMuaXNXZWJHTDImJm51bGw9PT1WYi5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSljb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7CmVsc2V7QmIuaW5pdEF0dHJpYnV0ZXMoKTt2YXIgTWE9b2EuYXR0cmlidXRlcztkYT1kYS5nZXRBdHRyaWJ1dGVzKCk7Vj1WLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKHZhciBXYSBpbiBkYSl7dmFyIFJhPWRhW1dhXTtpZigwPD1SYSl7dmFyIFhhPU1hW1dhXTtpZih2b2lkIDAhPT1YYSl7dmFyICRhPVhhLm5vcm1hbGl6ZWQsRmI9WGEuaXRlbVNpemUscmI9YmguZ2V0KFhhKTtpZih2b2lkIDAhPT1yYil7dmFyIGdiPXJiLmJ1ZmZlcixsZD1yYi50eXBlO3JiPXJiLmJ5dGVzUGVyRWxlbWVudDtpZihYYS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXt2YXIgUWM9WGEuZGF0YSxUZD1RYy5zdHJpZGU7WGE9WGEub2Zmc2V0O1FjJiZRYy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPyhCYi5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKFJhLFFjLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PW9hLm1heEluc3RhbmNlZENvdW50JiYob2EubWF4SW5zdGFuY2VkQ291bnQ9ClFjLm1lc2hQZXJBdHRyaWJ1dGUqUWMuY291bnQpKTpCYi5lbmFibGVBdHRyaWJ1dGUoUmEpO1lhLmJpbmRCdWZmZXIoMzQ5NjIsZ2IpO1lhLnZlcnRleEF0dHJpYlBvaW50ZXIoUmEsRmIsbGQsJGEsVGQqcmIsWGEqcmIpfWVsc2UgWGEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/KEJiLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoUmEsWGEubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09b2EubWF4SW5zdGFuY2VkQ291bnQmJihvYS5tYXhJbnN0YW5jZWRDb3VudD1YYS5tZXNoUGVyQXR0cmlidXRlKlhhLmNvdW50KSk6QmIuZW5hYmxlQXR0cmlidXRlKFJhKSxZYS5iaW5kQnVmZmVyKDM0OTYyLGdiKSxZYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKFJhLEZiLGxkLCRhLDAsMCl9fWVsc2UgaWYodm9pZCAwIT09ViYmKCRhPVZbV2FdLHZvaWQgMCE9PSRhKSlzd2l0Y2goJGEubGVuZ3RoKXtjYXNlIDI6WWEudmVydGV4QXR0cmliMmZ2KFJhLCRhKTticmVhaztjYXNlIDM6WWEudmVydGV4QXR0cmliM2Z2KFJhLAokYSk7YnJlYWs7Y2FzZSA0OllhLnZlcnRleEF0dHJpYjRmdihSYSwkYSk7YnJlYWs7ZGVmYXVsdDpZYS52ZXJ0ZXhBdHRyaWIxZnYoUmEsJGEpfX19QmIuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKX19ZnVuY3Rpb24gUShWLGRhLG9hLE1hKXtpZighMSE9PVYudmlzaWJsZSl7aWYoVi5sYXllcnMudGVzdChkYS5sYXllcnMpKWlmKFYuaXNHcm91cClvYT1WLnJlbmRlck9yZGVyO2Vsc2UgaWYoVi5pc0xpZ2h0KVRhLnB1c2hMaWdodChWKSxWLmNhc3RTaGFkb3cmJlRhLnB1c2hTaGFkb3coVik7ZWxzZSBpZihWLmlzU3ByaXRlKXtpZighVi5mcnVzdHVtQ3VsbGVkfHx2aS5pbnRlcnNlY3RzU3ByaXRlKFYpKXtNYSYmVWQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFYubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChRZik7dmFyIFdhPU9lLnVwZGF0ZShWKSxSYT1WLm1hdGVyaWFsO1JhLnZpc2libGUmJlphLnB1c2goVixXYSxSYSxvYSxVZC56LG51bGwpfX1lbHNlIGlmKFYuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QpTWEmJgpVZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVi5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KFFmKSxaYS5wdXNoKFYsbnVsbCxWLm1hdGVyaWFsLG9hLFVkLnosbnVsbCk7ZWxzZSBpZihWLmlzTWVzaHx8Vi5pc0xpbmV8fFYuaXNQb2ludHMpaWYoVi5pc1NraW5uZWRNZXNoJiZWLnNrZWxldG9uLnVwZGF0ZSgpLCFWLmZydXN0dW1DdWxsZWR8fHZpLmludGVyc2VjdHNPYmplY3QoVikpaWYoTWEmJlVkLnNldEZyb21NYXRyaXhQb3NpdGlvbihWLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoUWYpLFdhPU9lLnVwZGF0ZShWKSxSYT1WLm1hdGVyaWFsLEFycmF5LmlzQXJyYXkoUmEpKWZvcih2YXIgWGE9V2EuZ3JvdXBzLCRhPTAsRmI9WGEubGVuZ3RoOyRhPEZiOyRhKyspe3ZhciByYj1YYVskYV0sZ2I9UmFbcmIubWF0ZXJpYWxJbmRleF07Z2ImJmdiLnZpc2libGUmJlphLnB1c2goVixXYSxnYixvYSxVZC56LHJiKX1lbHNlIFJhLnZpc2libGUmJlphLnB1c2goVixXYSxSYSxvYSxVZC56LApudWxsKTtWPVYuY2hpbGRyZW47JGE9MDtmb3IoRmI9Vi5sZW5ndGg7JGE8RmI7JGErKylRKFZbJGFdLGRhLG9hLE1hKX19ZnVuY3Rpb24gUihWLGRhLG9hLE1hKXtmb3IodmFyIFdhPTAsUmE9Vi5sZW5ndGg7V2E8UmE7V2ErKyl7dmFyIFhhPVZbV2FdLCRhPVhhLm9iamVjdCxGYj1YYS5nZW9tZXRyeSxyYj12b2lkIDA9PT1NYT9YYS5tYXRlcmlhbDpNYTtYYT1YYS5ncm91cDtpZihvYS5pc0FycmF5Q2FtZXJhKXtuYj1vYTtmb3IodmFyIGdiPW9hLmNhbWVyYXMsbGQ9MCxRYz1nYi5sZW5ndGg7bGQ8UWM7bGQrKyl7dmFyIFRkPWdiW2xkXTtpZigkYS5sYXllcnMudGVzdChUZC5sYXllcnMpKXtpZigidmlld3BvcnQiaW4gVGQpQmIudmlld3BvcnQocGIuY29weShUZC52aWV3cG9ydCkpO2Vsc2V7dmFyIGRoPVRkLmJvdW5kcztCYi52aWV3cG9ydChwYi5zZXQoZGgueCpPYixkaC55KldiLGRoLnoqT2IsZGgudypXYikubXVsdGlwbHlTY2FsYXIoUmIpKX1UYS5zZXR1cExpZ2h0cyhUZCk7ClUoJGEsZGEsVGQsRmIscmIsWGEpfX19ZWxzZSBuYj1udWxsLFUoJGEsZGEsb2EsRmIscmIsWGEpfX1mdW5jdGlvbiBVKFYsZGEsb2EsTWEsV2EsUmEpe1Yub25CZWZvcmVSZW5kZXIoaWIsZGEsb2EsTWEsV2EsUmEpO1RhPVBlLmdldChkYSxuYnx8b2EpO1YubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMob2EubWF0cml4V29ybGRJbnZlcnNlLFYubWF0cml4V29ybGQpO1Yubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeChWLm1vZGVsVmlld01hdHJpeCk7Vi5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdD8oQmIuc2V0TWF0ZXJpYWwoV2EpLE1hPVoob2EsZGEuZm9nLFdhLFYpLEtiPWU9bnVsbCxsYj0hMSxJKFYsTWEpKTppYi5yZW5kZXJCdWZmZXJEaXJlY3Qob2EsZGEuZm9nLE1hLFdhLFYsUmEpO1RhPVBlLmdldChkYSxuYnx8b2EpfWZ1bmN0aW9uIFcoVixkYSxvYSl7dmFyIE1hPXZjLmdldChWKSxXYT1UYS5zdGF0ZS5saWdodHMsUmE9TWEubGlnaHRzSGFzaCxYYT1XYS5zdGF0ZS5oYXNoOwpvYT1nZS5nZXRQYXJhbWV0ZXJzKFYsV2Euc3RhdGUsVGEuc3RhdGUuc2hhZG93c0FycmF5LGRhLFJjLm51bVBsYW5lcyxSYy5udW1JbnRlcnNlY3Rpb24sb2EpO3ZhciAkYT1nZS5nZXRQcm9ncmFtQ29kZShWLG9hKSxGYj1NYS5wcm9ncmFtLHJiPSEwO2lmKHZvaWQgMD09PUZiKVYuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIseik7ZWxzZSBpZihGYi5jb2RlIT09JGEpSChWKTtlbHNle2lmKFJhLnN0YXRlSUQhPT1YYS5zdGF0ZUlEfHxSYS5kaXJlY3Rpb25hbExlbmd0aCE9PVhhLmRpcmVjdGlvbmFsTGVuZ3RofHxSYS5wb2ludExlbmd0aCE9PVhhLnBvaW50TGVuZ3RofHxSYS5zcG90TGVuZ3RoIT09WGEuc3BvdExlbmd0aHx8UmEucmVjdEFyZWFMZW5ndGghPT1YYS5yZWN0QXJlYUxlbmd0aHx8UmEuaGVtaUxlbmd0aCE9PVhhLmhlbWlMZW5ndGh8fFJhLnNoYWRvd3NMZW5ndGghPT1YYS5zaGFkb3dzTGVuZ3RoKVJhLnN0YXRlSUQ9WGEuc3RhdGVJRCxSYS5kaXJlY3Rpb25hbExlbmd0aD0KWGEuZGlyZWN0aW9uYWxMZW5ndGgsUmEucG9pbnRMZW5ndGg9WGEucG9pbnRMZW5ndGgsUmEuc3BvdExlbmd0aD1YYS5zcG90TGVuZ3RoLFJhLnJlY3RBcmVhTGVuZ3RoPVhhLnJlY3RBcmVhTGVuZ3RoLFJhLmhlbWlMZW5ndGg9WGEuaGVtaUxlbmd0aCxSYS5zaGFkb3dzTGVuZ3RoPVhhLnNoYWRvd3NMZW5ndGg7ZWxzZSBpZih2b2lkIDAhPT1vYS5zaGFkZXJJRClyZXR1cm47cmI9ITF9cmImJihvYS5zaGFkZXJJRD8oJGE9aWRbb2Euc2hhZGVySURdLE1hLnNoYWRlcj17bmFtZTpWLnR5cGUsdW5pZm9ybXM6RigkYS51bmlmb3JtcyksdmVydGV4U2hhZGVyOiRhLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjokYS5mcmFnbWVudFNoYWRlcn0pOk1hLnNoYWRlcj17bmFtZTpWLnR5cGUsdW5pZm9ybXM6Vi51bmlmb3Jtcyx2ZXJ0ZXhTaGFkZXI6Vi52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6Vi5mcmFnbWVudFNoYWRlcn0sJGE9Z2UuZ2V0UHJvZ3JhbUNvZGUoVixvYSksRmI9CmdlLmFjcXVpcmVQcm9ncmFtKFYsTWEuc2hhZGVyLG9hLCRhKSxNYS5wcm9ncmFtPUZiLFYucHJvZ3JhbT1GYik7b2E9RmIuZ2V0QXR0cmlidXRlcygpO2lmKFYubW9ycGhUYXJnZXRzKWZvcigkYT1WLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cz0wOyRhPGliLm1heE1vcnBoVGFyZ2V0czskYSsrKTA8PW9hWyJtb3JwaFRhcmdldCIrJGFdJiZWLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cysrO2lmKFYubW9ycGhOb3JtYWxzKWZvcigkYT1WLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscz0wOyRhPGliLm1heE1vcnBoTm9ybWFsczskYSsrKTA8PW9hWyJtb3JwaE5vcm1hbCIrJGFdJiZWLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscysrO29hPU1hLnNoYWRlci51bmlmb3JtcztpZighVi5pc1NoYWRlck1hdGVyaWFsJiYhVi5pc1Jhd1NoYWRlck1hdGVyaWFsfHwhMD09PVYuY2xpcHBpbmcpTWEubnVtQ2xpcHBpbmdQbGFuZXM9UmMubnVtUGxhbmVzLE1hLm51bUludGVyc2VjdGlvbj1SYy5udW1JbnRlcnNlY3Rpb24sCm9hLmNsaXBwaW5nUGxhbmVzPVJjLnVuaWZvcm07TWEuZm9nPWRhO3ZvaWQgMD09PVJhJiYoTWEubGlnaHRzSGFzaD1SYT17fSk7UmEuc3RhdGVJRD1YYS5zdGF0ZUlEO1JhLmRpcmVjdGlvbmFsTGVuZ3RoPVhhLmRpcmVjdGlvbmFsTGVuZ3RoO1JhLnBvaW50TGVuZ3RoPVhhLnBvaW50TGVuZ3RoO1JhLnNwb3RMZW5ndGg9WGEuc3BvdExlbmd0aDtSYS5yZWN0QXJlYUxlbmd0aD1YYS5yZWN0QXJlYUxlbmd0aDtSYS5oZW1pTGVuZ3RoPVhhLmhlbWlMZW5ndGg7UmEuc2hhZG93c0xlbmd0aD1YYS5zaGFkb3dzTGVuZ3RoO1YubGlnaHRzJiYob2EuYW1iaWVudExpZ2h0Q29sb3IudmFsdWU9V2Euc3RhdGUuYW1iaWVudCxvYS5saWdodFByb2JlLnZhbHVlPVdhLnN0YXRlLnByb2JlLG9hLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlPVdhLnN0YXRlLmRpcmVjdGlvbmFsLG9hLnNwb3RMaWdodHMudmFsdWU9V2Euc3RhdGUuc3BvdCxvYS5yZWN0QXJlYUxpZ2h0cy52YWx1ZT1XYS5zdGF0ZS5yZWN0QXJlYSwKb2EucG9pbnRMaWdodHMudmFsdWU9V2Euc3RhdGUucG9pbnQsb2EuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZT1XYS5zdGF0ZS5oZW1pLG9hLmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlPVdhLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwLG9hLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlPVdhLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LG9hLnNwb3RTaGFkb3dNYXAudmFsdWU9V2Euc3RhdGUuc3BvdFNoYWRvd01hcCxvYS5zcG90U2hhZG93TWF0cml4LnZhbHVlPVdhLnN0YXRlLnNwb3RTaGFkb3dNYXRyaXgsb2EucG9pbnRTaGFkb3dNYXAudmFsdWU9V2Euc3RhdGUucG9pbnRTaGFkb3dNYXAsb2EucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9V2Euc3RhdGUucG9pbnRTaGFkb3dNYXRyaXgpO1Y9TWEucHJvZ3JhbS5nZXRVbmlmb3JtcygpO1Y9T2Quc2VxV2l0aFZhbHVlKFYuc2VxLG9hKTtNYS51bmlmb3Jtc0xpc3Q9Vn1mdW5jdGlvbiBaKFYsZGEsb2EsTWEpe1BjLnJlc2V0VGV4dHVyZVVuaXRzKCk7CnZhciBXYT12Yy5nZXQob2EpLFJhPVdhLmxpZ2h0c0hhc2gsWGE9VGEuc3RhdGUubGlnaHRzLnN0YXRlLmhhc2g7ZWgmJih3aXx8ViE9PVFhKSYmUmMuc2V0U3RhdGUob2EuY2xpcHBpbmdQbGFuZXMsb2EuY2xpcEludGVyc2VjdGlvbixvYS5jbGlwU2hhZG93cyxWLFdhLFY9PT1RYSYmb2EuaWQ9PT1hYik7ITE9PT1vYS5uZWVkc1VwZGF0ZSYmKHZvaWQgMD09PVdhLnByb2dyYW0/b2EubmVlZHNVcGRhdGU9ITA6b2EuZm9nJiZXYS5mb2chPT1kYT9vYS5uZWVkc1VwZGF0ZT0hMDohb2EubGlnaHRzfHxSYS5zdGF0ZUlEPT09WGEuc3RhdGVJRCYmUmEuZGlyZWN0aW9uYWxMZW5ndGg9PT1YYS5kaXJlY3Rpb25hbExlbmd0aCYmUmEucG9pbnRMZW5ndGg9PT1YYS5wb2ludExlbmd0aCYmUmEuc3BvdExlbmd0aD09PVhhLnNwb3RMZW5ndGgmJlJhLnJlY3RBcmVhTGVuZ3RoPT09WGEucmVjdEFyZWFMZW5ndGgmJlJhLmhlbWlMZW5ndGg9PT1YYS5oZW1pTGVuZ3RoJiZSYS5zaGFkb3dzTGVuZ3RoPT09ClhhLnNoYWRvd3NMZW5ndGg/dm9pZCAwPT09V2EubnVtQ2xpcHBpbmdQbGFuZXN8fFdhLm51bUNsaXBwaW5nUGxhbmVzPT09UmMubnVtUGxhbmVzJiZXYS5udW1JbnRlcnNlY3Rpb249PT1SYy5udW1JbnRlcnNlY3Rpb258fChvYS5uZWVkc1VwZGF0ZT0hMCk6b2EubmVlZHNVcGRhdGU9ITApO29hLm5lZWRzVXBkYXRlJiYoVyhvYSxkYSxNYSksb2EubmVlZHNVcGRhdGU9ITEpO3ZhciAkYT0hMTtYYT1SYT0hMTt2YXIgRmI9V2EucHJvZ3JhbSxyYj1GYi5nZXRVbmlmb3JtcygpLGdiPVdhLnNoYWRlci51bmlmb3JtcztCYi51c2VQcm9ncmFtKEZiLnByb2dyYW0pJiYoWGE9UmE9JGE9ITApO29hLmlkIT09YWImJihhYj1vYS5pZCxSYT0hMCk7aWYoJGF8fFFhIT09Vil7cmIuc2V0VmFsdWUoWWEsInByb2plY3Rpb25NYXRyaXgiLFYucHJvamVjdGlvbk1hdHJpeCk7dWMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmcmIuc2V0VmFsdWUoWWEsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKFYuZmFyKwoxKS9NYXRoLkxOMikpO1FhIT09ViYmKFFhPVYsWGE9UmE9ITApO2lmKG9hLmlzU2hhZGVyTWF0ZXJpYWx8fG9hLmlzTWVzaFBob25nTWF0ZXJpYWx8fG9hLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fG9hLmVudk1hcCkkYT1yYi5tYXAuY2FtZXJhUG9zaXRpb24sdm9pZCAwIT09JGEmJiRhLnNldFZhbHVlKFlhLFVkLnNldEZyb21NYXRyaXhQb3NpdGlvbihWLm1hdHJpeFdvcmxkKSk7KG9hLmlzTWVzaFBob25nTWF0ZXJpYWx8fG9hLmlzTWVzaExhbWJlcnRNYXRlcmlhbHx8b2EuaXNNZXNoQmFzaWNNYXRlcmlhbHx8b2EuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8b2EuaXNTaGFkZXJNYXRlcmlhbHx8b2Euc2tpbm5pbmcpJiZyYi5zZXRWYWx1ZShZYSwidmlld01hdHJpeCIsVi5tYXRyaXhXb3JsZEludmVyc2UpfWlmKG9hLnNraW5uaW5nJiYocmIuc2V0T3B0aW9uYWwoWWEsTWEsImJpbmRNYXRyaXgiKSxyYi5zZXRPcHRpb25hbChZYSxNYSwiYmluZE1hdHJpeEludmVyc2UiKSxWPU1hLnNrZWxldG9uKSlpZigkYT0KVi5ib25lcyx1Yy5mbG9hdFZlcnRleFRleHR1cmVzKXtpZih2b2lkIDA9PT1WLmJvbmVUZXh0dXJlKXskYT1NYXRoLnNxcnQoNCokYS5sZW5ndGgpOyRhPW9iLmNlaWxQb3dlck9mVHdvKCRhKTskYT1NYXRoLm1heCgkYSw0KTt2YXIgbGQ9bmV3IEZsb2F0MzJBcnJheSgkYSokYSo0KTtsZC5zZXQoVi5ib25lTWF0cmljZXMpO3ZhciBRYz1uZXcgdChsZCwkYSwkYSwxMDIzLDEwMTUpO1FjLm5lZWRzVXBkYXRlPSEwO1YuYm9uZU1hdHJpY2VzPWxkO1YuYm9uZVRleHR1cmU9UWM7Vi5ib25lVGV4dHVyZVNpemU9JGF9cmIuc2V0VmFsdWUoWWEsImJvbmVUZXh0dXJlIixWLmJvbmVUZXh0dXJlLFBjKTtyYi5zZXRWYWx1ZShZYSwiYm9uZVRleHR1cmVTaXplIixWLmJvbmVUZXh0dXJlU2l6ZSl9ZWxzZSByYi5zZXRPcHRpb25hbChZYSxWLCJib25lTWF0cmljZXMiKTtSYSYmKHJiLnNldFZhbHVlKFlhLCJ0b25lTWFwcGluZ0V4cG9zdXJlIixpYi50b25lTWFwcGluZ0V4cG9zdXJlKSxyYi5zZXRWYWx1ZShZYSwKInRvbmVNYXBwaW5nV2hpdGVQb2ludCIsaWIudG9uZU1hcHBpbmdXaGl0ZVBvaW50KSxvYS5saWdodHMmJmNiKGdiLFhhKSxkYSYmb2EuZm9nJiZuYShnYixkYSksb2EuaXNNZXNoQmFzaWNNYXRlcmlhbD9mYShnYixvYSk6b2EuaXNNZXNoTGFtYmVydE1hdGVyaWFsPyhmYShnYixvYSksdmEoZ2Isb2EpKTpvYS5pc01lc2hQaG9uZ01hdGVyaWFsPyhmYShnYixvYSksb2EuaXNNZXNoVG9vbk1hdGVyaWFsP3NhKGdiLG9hKTpCYShnYixvYSkpOm9hLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/KGZhKGdiLG9hKSxvYS5pc01lc2hQaHlzaWNhbE1hdGVyaWFsP0hhKGdiLG9hKTpEYShnYixvYSkpOm9hLmlzTWVzaE1hdGNhcE1hdGVyaWFsPyhmYShnYixvYSksS2EoZ2Isb2EpKTpvYS5pc01lc2hEZXB0aE1hdGVyaWFsPyhmYShnYixvYSksTmEoZ2Isb2EpKTpvYS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhmYShnYixvYSksTGEoZ2Isb2EpKTpvYS5pc01lc2hOb3JtYWxNYXRlcmlhbD8oZmEoZ2IsCm9hKSxmYihnYixvYSkpOm9hLmlzTGluZUJhc2ljTWF0ZXJpYWw/KHFhKGdiLG9hKSxvYS5pc0xpbmVEYXNoZWRNYXRlcmlhbCYmcmEoZ2Isb2EpKTpvYS5pc1BvaW50c01hdGVyaWFsP2lhKGdiLG9hKTpvYS5pc1Nwcml0ZU1hdGVyaWFsP3RhKGdiLG9hKTpvYS5pc1NoYWRvd01hdGVyaWFsJiYoZ2IuY29sb3IudmFsdWUuY29weShvYS5jb2xvciksZ2Iub3BhY2l0eS52YWx1ZT1vYS5vcGFjaXR5KSx2b2lkIDAhPT1nYi5sdGNfMSYmKGdiLmx0Y18xLnZhbHVlPWJiLkxUQ18xKSx2b2lkIDAhPT1nYi5sdGNfMiYmKGdiLmx0Y18yLnZhbHVlPWJiLkxUQ18yKSxPZC51cGxvYWQoWWEsV2EudW5pZm9ybXNMaXN0LGdiLFBjKSk7b2EuaXNTaGFkZXJNYXRlcmlhbCYmITA9PT1vYS51bmlmb3Jtc05lZWRVcGRhdGUmJihPZC51cGxvYWQoWWEsV2EudW5pZm9ybXNMaXN0LGdiLFBjKSxvYS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpO29hLmlzU3ByaXRlTWF0ZXJpYWwmJnJiLnNldFZhbHVlKFlhLAoiY2VudGVyIixNYS5jZW50ZXIpO3JiLnNldFZhbHVlKFlhLCJtb2RlbFZpZXdNYXRyaXgiLE1hLm1vZGVsVmlld01hdHJpeCk7cmIuc2V0VmFsdWUoWWEsIm5vcm1hbE1hdHJpeCIsTWEubm9ybWFsTWF0cml4KTtyYi5zZXRWYWx1ZShZYSwibW9kZWxNYXRyaXgiLE1hLm1hdHJpeFdvcmxkKTtyZXR1cm4gRmJ9ZnVuY3Rpb24gZmEoVixkYSl7Vi5vcGFjaXR5LnZhbHVlPWRhLm9wYWNpdHk7ZGEuY29sb3ImJlYuZGlmZnVzZS52YWx1ZS5jb3B5KGRhLmNvbG9yKTtkYS5lbWlzc2l2ZSYmVi5lbWlzc2l2ZS52YWx1ZS5jb3B5KGRhLmVtaXNzaXZlKS5tdWx0aXBseVNjYWxhcihkYS5lbWlzc2l2ZUludGVuc2l0eSk7ZGEubWFwJiYoVi5tYXAudmFsdWU9ZGEubWFwKTtkYS5hbHBoYU1hcCYmKFYuYWxwaGFNYXAudmFsdWU9ZGEuYWxwaGFNYXApO2RhLnNwZWN1bGFyTWFwJiYoVi5zcGVjdWxhck1hcC52YWx1ZT1kYS5zcGVjdWxhck1hcCk7ZGEuZW52TWFwJiYoVi5lbnZNYXAudmFsdWU9ZGEuZW52TWFwLApWLmZsaXBFbnZNYXAudmFsdWU9ZGEuZW52TWFwLmlzQ3ViZVRleHR1cmU/LTE6MSxWLnJlZmxlY3Rpdml0eS52YWx1ZT1kYS5yZWZsZWN0aXZpdHksVi5yZWZyYWN0aW9uUmF0aW8udmFsdWU9ZGEucmVmcmFjdGlvblJhdGlvLFYubWF4TWlwTGV2ZWwudmFsdWU9dmMuZ2V0KGRhLmVudk1hcCkuX19tYXhNaXBMZXZlbCk7ZGEubGlnaHRNYXAmJihWLmxpZ2h0TWFwLnZhbHVlPWRhLmxpZ2h0TWFwLFYubGlnaHRNYXBJbnRlbnNpdHkudmFsdWU9ZGEubGlnaHRNYXBJbnRlbnNpdHkpO2RhLmFvTWFwJiYoVi5hb01hcC52YWx1ZT1kYS5hb01hcCxWLmFvTWFwSW50ZW5zaXR5LnZhbHVlPWRhLmFvTWFwSW50ZW5zaXR5KTtpZihkYS5tYXApdmFyIG9hPWRhLm1hcDtlbHNlIGRhLnNwZWN1bGFyTWFwP29hPWRhLnNwZWN1bGFyTWFwOmRhLmRpc3BsYWNlbWVudE1hcD9vYT1kYS5kaXNwbGFjZW1lbnRNYXA6ZGEubm9ybWFsTWFwP29hPWRhLm5vcm1hbE1hcDpkYS5idW1wTWFwP29hPWRhLmJ1bXBNYXA6CmRhLnJvdWdobmVzc01hcD9vYT1kYS5yb3VnaG5lc3NNYXA6ZGEubWV0YWxuZXNzTWFwP29hPWRhLm1ldGFsbmVzc01hcDpkYS5hbHBoYU1hcD9vYT1kYS5hbHBoYU1hcDpkYS5lbWlzc2l2ZU1hcCYmKG9hPWRhLmVtaXNzaXZlTWFwKTt2b2lkIDAhPT1vYSYmKG9hLmlzV2ViR0xSZW5kZXJUYXJnZXQmJihvYT1vYS50ZXh0dXJlKSwhMD09PW9hLm1hdHJpeEF1dG9VcGRhdGUmJm9hLnVwZGF0ZU1hdHJpeCgpLFYudXZUcmFuc2Zvcm0udmFsdWUuY29weShvYS5tYXRyaXgpKX1mdW5jdGlvbiBxYShWLGRhKXtWLmRpZmZ1c2UudmFsdWUuY29weShkYS5jb2xvcik7Vi5vcGFjaXR5LnZhbHVlPWRhLm9wYWNpdHl9ZnVuY3Rpb24gcmEoVixkYSl7Vi5kYXNoU2l6ZS52YWx1ZT1kYS5kYXNoU2l6ZTtWLnRvdGFsU2l6ZS52YWx1ZT1kYS5kYXNoU2l6ZStkYS5nYXBTaXplO1Yuc2NhbGUudmFsdWU9ZGEuc2NhbGV9ZnVuY3Rpb24gaWEoVixkYSl7Vi5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpOwpWLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eTtWLnNpemUudmFsdWU9ZGEuc2l6ZSpSYjtWLnNjYWxlLnZhbHVlPS41KldiO1YubWFwLnZhbHVlPWRhLm1hcDtudWxsIT09ZGEubWFwJiYoITA9PT1kYS5tYXAubWF0cml4QXV0b1VwZGF0ZSYmZGEubWFwLnVwZGF0ZU1hdHJpeCgpLFYudXZUcmFuc2Zvcm0udmFsdWUuY29weShkYS5tYXAubWF0cml4KSl9ZnVuY3Rpb24gdGEoVixkYSl7Vi5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO1Yub3BhY2l0eS52YWx1ZT1kYS5vcGFjaXR5O1Yucm90YXRpb24udmFsdWU9ZGEucm90YXRpb247Vi5tYXAudmFsdWU9ZGEubWFwO251bGwhPT1kYS5tYXAmJighMD09PWRhLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZkYS5tYXAudXBkYXRlTWF0cml4KCksVi51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGRhLm1hcC5tYXRyaXgpKX1mdW5jdGlvbiBuYShWLGRhKXtWLmZvZ0NvbG9yLnZhbHVlLmNvcHkoZGEuY29sb3IpO2RhLmlzRm9nPyhWLmZvZ05lYXIudmFsdWU9CmRhLm5lYXIsVi5mb2dGYXIudmFsdWU9ZGEuZmFyKTpkYS5pc0ZvZ0V4cDImJihWLmZvZ0RlbnNpdHkudmFsdWU9ZGEuZGVuc2l0eSl9ZnVuY3Rpb24gdmEoVixkYSl7ZGEuZW1pc3NpdmVNYXAmJihWLmVtaXNzaXZlTWFwLnZhbHVlPWRhLmVtaXNzaXZlTWFwKX1mdW5jdGlvbiBCYShWLGRhKXtWLnNwZWN1bGFyLnZhbHVlLmNvcHkoZGEuc3BlY3VsYXIpO1Yuc2hpbmluZXNzLnZhbHVlPU1hdGgubWF4KGRhLnNoaW5pbmVzcywxRS00KTtkYS5lbWlzc2l2ZU1hcCYmKFYuZW1pc3NpdmVNYXAudmFsdWU9ZGEuZW1pc3NpdmVNYXApO2RhLmJ1bXBNYXAmJihWLmJ1bXBNYXAudmFsdWU9ZGEuYnVtcE1hcCxWLmJ1bXBTY2FsZS52YWx1ZT1kYS5idW1wU2NhbGUsMT09PWRhLnNpZGUmJihWLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtkYS5ub3JtYWxNYXAmJihWLm5vcm1hbE1hcC52YWx1ZT1kYS5ub3JtYWxNYXAsVi5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwxPT09ZGEuc2lkZSYmClYubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFYuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxWLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFYuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBzYShWLGRhKXtCYShWLGRhKTtkYS5ncmFkaWVudE1hcCYmKFYuZ3JhZGllbnRNYXAudmFsdWU9ZGEuZ3JhZGllbnRNYXApfWZ1bmN0aW9uIERhKFYsZGEpe1Yucm91Z2huZXNzLnZhbHVlPWRhLnJvdWdobmVzcztWLm1ldGFsbmVzcy52YWx1ZT1kYS5tZXRhbG5lc3M7ZGEucm91Z2huZXNzTWFwJiYoVi5yb3VnaG5lc3NNYXAudmFsdWU9ZGEucm91Z2huZXNzTWFwKTtkYS5tZXRhbG5lc3NNYXAmJihWLm1ldGFsbmVzc01hcC52YWx1ZT1kYS5tZXRhbG5lc3NNYXApO2RhLmVtaXNzaXZlTWFwJiYoVi5lbWlzc2l2ZU1hcC52YWx1ZT1kYS5lbWlzc2l2ZU1hcCk7CmRhLmJ1bXBNYXAmJihWLmJ1bXBNYXAudmFsdWU9ZGEuYnVtcE1hcCxWLmJ1bXBTY2FsZS52YWx1ZT1kYS5idW1wU2NhbGUsMT09PWRhLnNpZGUmJihWLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtkYS5ub3JtYWxNYXAmJihWLm5vcm1hbE1hcC52YWx1ZT1kYS5ub3JtYWxNYXAsVi5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwxPT09ZGEuc2lkZSYmVi5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSk7ZGEuZGlzcGxhY2VtZW50TWFwJiYoVi5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZGEuZGlzcGxhY2VtZW50TWFwLFYuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZGEuZGlzcGxhY2VtZW50U2NhbGUsVi5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWRhLmRpc3BsYWNlbWVudEJpYXMpO2RhLmVudk1hcCYmKFYuZW52TWFwSW50ZW5zaXR5LnZhbHVlPWRhLmVudk1hcEludGVuc2l0eSl9ZnVuY3Rpb24gSGEoVixkYSl7RGEoVixkYSk7Vi5yZWZsZWN0aXZpdHkudmFsdWU9ZGEucmVmbGVjdGl2aXR5OwpWLmNsZWFyQ29hdC52YWx1ZT1kYS5jbGVhckNvYXQ7Vi5jbGVhckNvYXRSb3VnaG5lc3MudmFsdWU9ZGEuY2xlYXJDb2F0Um91Z2huZXNzfWZ1bmN0aW9uIEthKFYsZGEpe2RhLm1hdGNhcCYmKFYubWF0Y2FwLnZhbHVlPWRhLm1hdGNhcCk7ZGEuYnVtcE1hcCYmKFYuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFYuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFYuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFYubm9ybWFsTWFwLnZhbHVlPWRhLm5vcm1hbE1hcCxWLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZGEubm9ybWFsU2NhbGUpLDE9PT1kYS5zaWRlJiZWLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtkYS5kaXNwbGFjZW1lbnRNYXAmJihWLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVi5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxWLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9CmRhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIE5hKFYsZGEpe2RhLmRpc3BsYWNlbWVudE1hcCYmKFYuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxWLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFYuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBMYShWLGRhKXtkYS5kaXNwbGFjZW1lbnRNYXAmJihWLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVi5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxWLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZGEuZGlzcGxhY2VtZW50Qmlhcyk7Vi5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5jb3B5KGRhLnJlZmVyZW5jZVBvc2l0aW9uKTtWLm5lYXJEaXN0YW5jZS52YWx1ZT1kYS5uZWFyRGlzdGFuY2U7Vi5mYXJEaXN0YW5jZS52YWx1ZT1kYS5mYXJEaXN0YW5jZX1mdW5jdGlvbiBmYihWLApkYSl7ZGEuYnVtcE1hcCYmKFYuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFYuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFYuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFYubm9ybWFsTWFwLnZhbHVlPWRhLm5vcm1hbE1hcCxWLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZGEubm9ybWFsU2NhbGUpLDE9PT1kYS5zaWRlJiZWLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtkYS5kaXNwbGFjZW1lbnRNYXAmJihWLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVi5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxWLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZGEuZGlzcGxhY2VtZW50Qmlhcyl9ZnVuY3Rpb24gY2IoVixkYSl7Vi5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZT1kYTtWLmxpZ2h0UHJvYmUubmVlZHNVcGRhdGU9ZGE7Vi5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZT0KZGE7Vi5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZT1kYTtWLnNwb3RMaWdodHMubmVlZHNVcGRhdGU9ZGE7Vi5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZT1kYTtWLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGU9ZGF9Y29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXIiLCIxMDQiKTtiPWJ8fHt9O3ZhciBKYT12b2lkIDAhPT1iLmNhbnZhcz9iLmNhbnZhczpkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSxoYj12b2lkIDAhPT1iLmNvbnRleHQ/Yi5jb250ZXh0Om51bGwsVWE9dm9pZCAwIT09Yi5hbHBoYT9iLmFscGhhOiExLEhiPXZvaWQgMCE9PWIuZGVwdGg/Yi5kZXB0aDohMCxxYj12b2lkIDAhPT1iLnN0ZW5jaWw/Yi5zdGVuY2lsOiEwLGphPXZvaWQgMCE9PWIuYW50aWFsaWFzP2IuYW50aWFsaWFzOiExLHBhPXZvaWQgMCE9PWIucHJlbXVsdGlwbGllZEFscGhhP2IucHJlbXVsdGlwbGllZEFscGhhOgohMCx5YT12b2lkIDAhPT1iLnByZXNlcnZlRHJhd2luZ0J1ZmZlcj9iLnByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMSxWYT12b2lkIDAhPT1iLnBvd2VyUHJlZmVyZW5jZT9iLnBvd2VyUHJlZmVyZW5jZToiZGVmYXVsdCIsWmE9bnVsbCxUYT1udWxsO3RoaXMuZG9tRWxlbWVudD1KYTt0aGlzLmNvbnRleHQ9bnVsbDt0aGlzLmRlYnVnPXtjaGVja1NoYWRlckVycm9yczohMX07dGhpcy5zb3J0T2JqZWN0cz10aGlzLmF1dG9DbGVhclN0ZW5jaWw9dGhpcy5hdXRvQ2xlYXJEZXB0aD10aGlzLmF1dG9DbGVhckNvbG9yPXRoaXMuYXV0b0NsZWFyPSEwO3RoaXMuY2xpcHBpbmdQbGFuZXM9W107dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZD0hMTt0aGlzLmdhbW1hRmFjdG9yPTI7dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz10aGlzLmdhbW1hT3V0cHV0PXRoaXMuZ2FtbWFJbnB1dD0hMTt0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludD10aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmU9dGhpcy50b25lTWFwcGluZz0KMTt0aGlzLm1heE1vcnBoVGFyZ2V0cz04O3RoaXMubWF4TW9ycGhOb3JtYWxzPTQ7dmFyIGliPXRoaXMsbWE9ITEsSWE9bnVsbCxPYT1udWxsLHViPW51bGwsYWI9LTE7dmFyIEtiPWU9bnVsbDt2YXIgbGI9ITE7dmFyIFFhPW51bGwsbmI9bnVsbCxwYj1uZXcgbSx2Yj1uZXcgbSxBYj1udWxsLE9iPUphLndpZHRoLFdiPUphLmhlaWdodCxSYj0xLHdkPW5ldyBtKDAsMCxPYixXYiksdmQ9bmV3IG0oMCwwLE9iLFdiKSx4aT0hMSx2aT1uZXcgeCxSYz1uZXcgJGIsZWg9ITEsd2k9ITEsUWY9bmV3IEMsVWQ9bmV3IGc7dHJ5e1VhPXthbHBoYTpVYSxkZXB0aDpIYixzdGVuY2lsOnFiLGFudGlhbGlhczpqYSxwcmVtdWx0aXBsaWVkQWxwaGE6cGEscHJlc2VydmVEcmF3aW5nQnVmZmVyOnlhLHBvd2VyUHJlZmVyZW5jZTpWYX07SmEuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsdSwhMSk7SmEuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0cmVzdG9yZWQiLHcsITEpOwp2YXIgWWE9aGJ8fEphLmdldENvbnRleHQoIndlYmdsIixVYSl8fEphLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsVWEpO2lmKG51bGw9PT1ZYSl7aWYobnVsbCE9PUphLmdldENvbnRleHQoIndlYmdsIikpdGhyb3cgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik7dGhyb3cgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuIik7fXZvaWQgMD09PVlhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCYmKFlhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdD1mdW5jdGlvbigpe3JldHVybntyYW5nZU1pbjoxLHJhbmdlTWF4OjEscHJlY2lzaW9uOjF9fSl9Y2F0Y2goVil7dGhyb3cgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIitWLm1lc3NhZ2UpLFY7fXZhciBWYix1YyxCYixSZCx2YyxQYyxiaCx1aSxPZSxnZSxjaCxQZSxTZCxzbCx0bCx1bCxrZDtuKCk7dmFyIHhkPSJ1bmRlZmluZWQiIT09CnR5cGVvZiBuYXZpZ2F0b3ImJiJ4ciJpbiBuYXZpZ2F0b3I/bmV3IEtvKGliKTpuZXcgcmwoaWIpO3RoaXMudnI9eGQ7dmFyIHZsPW5ldyBtbChpYixPZSx1Yy5tYXhUZXh0dXJlU2l6ZSk7dGhpcy5zaGFkb3dNYXA9dmw7dGhpcy5nZXRDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIFlhfTt0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmdldENvbnRleHRBdHRyaWJ1dGVzKCl9O3RoaXMuZm9yY2VDb250ZXh0TG9zcz1mdW5jdGlvbigpe3ZhciBWPVZiLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7ViYmVi5sb3NlQ29udGV4dCgpfTt0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmU9ZnVuY3Rpb24oKXt2YXIgVj1WYi5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpO1YmJlYucmVzdG9yZUNvbnRleHQoKX07dGhpcy5nZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKCl7cmV0dXJuIFJifTt0aGlzLnNldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXt2YXIgVj13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzsKdm9pZCAwIT09ViYmKFJiPVYsdGhpcy5zZXRTaXplKE9iLFdiLCExKSl9O3RoaXMuZ2V0U2l6ZT1mdW5jdGlvbihWKXt2b2lkIDA9PT1WJiYoY29uc29sZS53YXJuKCJXZWJHTFJlbmRlcmVyOiAuZ2V0c2l6ZSgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjIgYXMgYW4gYXJndW1lbnQiKSxWPW5ldyBkKTtyZXR1cm4gVi5zZXQoT2IsV2IpfTt0aGlzLnNldFNpemU9ZnVuY3Rpb24oVixkYSxvYSl7eGQuaXNQcmVzZW50aW5nKCk/Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDYW4ndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4iKTooT2I9VixXYj1kYSxKYS53aWR0aD1WKlJiLEphLmhlaWdodD1kYSpSYiwhMSE9PW9hJiYoSmEuc3R5bGUud2lkdGg9VisicHgiLEphLnN0eWxlLmhlaWdodD1kYSsicHgiKSx0aGlzLnNldFZpZXdwb3J0KFYsZGEpKX07dGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbihWKXt2b2lkIDA9PT1WJiYoY29uc29sZS53YXJuKCJXZWJHTFJlbmRlcmVyOiAuZ2V0ZHJhd2luZ0J1ZmZlclNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50IiksClY9bmV3IGQpO3JldHVybiBWLnNldChPYipSYixXYipSYil9O3RoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24oVixkYSxvYSl7T2I9VjtXYj1kYTtSYj1vYTtKYS53aWR0aD1WKm9hO0phLmhlaWdodD1kYSpvYTt0aGlzLnNldFZpZXdwb3J0KFYsZGEpfTt0aGlzLmdldEN1cnJlbnRWaWV3cG9ydD1mdW5jdGlvbihWKXt2b2lkIDA9PT1WJiYoY29uc29sZS53YXJuKCJXZWJHTFJlbmRlcmVyOiAuZ2V0Q3VycmVudFZpZXdwb3J0KCkgbm93IHJlcXVpcmVzIGEgVmVjdG9yNCBhcyBhbiBhcmd1bWVudCIpLFY9bmV3IG0pO3JldHVybiBWLmNvcHkocGIpfTt0aGlzLmdldFZpZXdwb3J0PWZ1bmN0aW9uKFYpe3JldHVybiBWLmNvcHkod2QpfTt0aGlzLnNldFZpZXdwb3J0PWZ1bmN0aW9uKFYsZGEpeygwKS5pc1ZlY3RvcjQ/d2Quc2V0KCgwKS54LCgwKS55LCgwKS56LCgwKS53KTp3ZC5zZXQoMCwwLFYsZGEpO0JiLnZpZXdwb3J0KHBiLmNvcHkod2QpLm11bHRpcGx5U2NhbGFyKFJiKSl9Owp0aGlzLmdldFNjaXNzb3I9ZnVuY3Rpb24oVil7cmV0dXJuIFYuY29weSh2ZCl9O3RoaXMuc2V0U2Npc3Nvcj1mdW5jdGlvbihWLGRhLG9hLE1hKXtWLmlzVmVjdG9yND92ZC5zZXQoVi54LFYueSxWLnosVi53KTp2ZC5zZXQoVixkYSxvYSxNYSk7QmIuc2Npc3Nvcih2Yi5jb3B5KHZkKS5tdWx0aXBseVNjYWxhcihSYikpfTt0aGlzLmdldFNjaXNzb3JUZXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHhpfTt0aGlzLnNldFNjaXNzb3JUZXN0PWZ1bmN0aW9uKFYpe0JiLnNldFNjaXNzb3JUZXN0KHhpPVYpfTt0aGlzLmdldENsZWFyQ29sb3I9ZnVuY3Rpb24oKXtyZXR1cm4gU2QuZ2V0Q2xlYXJDb2xvcigpfTt0aGlzLnNldENsZWFyQ29sb3I9ZnVuY3Rpb24oKXtTZC5zZXRDbGVhckNvbG9yLmFwcGx5KFNkLGFyZ3VtZW50cyl9O3RoaXMuZ2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe3JldHVybiBTZC5nZXRDbGVhckFscGhhKCl9O3RoaXMuc2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe1NkLnNldENsZWFyQWxwaGEuYXBwbHkoU2QsCmFyZ3VtZW50cyl9O3RoaXMuY2xlYXI9ZnVuY3Rpb24oVixkYSxvYSl7dmFyIE1hPTA7aWYodm9pZCAwPT09Vnx8VilNYXw9MTYzODQ7aWYodm9pZCAwPT09ZGF8fGRhKU1hfD0yNTY7aWYodm9pZCAwPT09b2F8fG9hKU1hfD0xMDI0O1lhLmNsZWFyKE1hKX07dGhpcy5jbGVhckNvbG9yPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMCwhMSwhMSl9O3RoaXMuY2xlYXJEZXB0aD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITAsITEpfTt0aGlzLmNsZWFyU3RlbmNpbD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITEsITApfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXtKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0Iix1LCExKTtKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsdywhMSk7Y2guZGlzcG9zZSgpO1BlLmRpc3Bvc2UoKTt2Yy5kaXNwb3NlKCk7T2UuZGlzcG9zZSgpO3hkLmRpc3Bvc2UoKTtmaC5zdG9wKCl9O3RoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlPQpmdW5jdGlvbihWLGRhKXtCYi5pbml0QXR0cmlidXRlcygpO3ZhciBvYT12Yy5nZXQoVik7Vi5oYXNQb3NpdGlvbnMmJiFvYS5wb3NpdGlvbiYmKG9hLnBvc2l0aW9uPVlhLmNyZWF0ZUJ1ZmZlcigpKTtWLmhhc05vcm1hbHMmJiFvYS5ub3JtYWwmJihvYS5ub3JtYWw9WWEuY3JlYXRlQnVmZmVyKCkpO1YuaGFzVXZzJiYhb2EudXYmJihvYS51dj1ZYS5jcmVhdGVCdWZmZXIoKSk7Vi5oYXNDb2xvcnMmJiFvYS5jb2xvciYmKG9hLmNvbG9yPVlhLmNyZWF0ZUJ1ZmZlcigpKTtkYT1kYS5nZXRBdHRyaWJ1dGVzKCk7Vi5oYXNQb3NpdGlvbnMmJihZYS5iaW5kQnVmZmVyKDM0OTYyLG9hLnBvc2l0aW9uKSxZYS5idWZmZXJEYXRhKDM0OTYyLFYucG9zaXRpb25BcnJheSwzNTA0OCksQmIuZW5hYmxlQXR0cmlidXRlKGRhLnBvc2l0aW9uKSxZYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLnBvc2l0aW9uLDMsNTEyNiwhMSwwLDApKTtWLmhhc05vcm1hbHMmJihZYS5iaW5kQnVmZmVyKDM0OTYyLG9hLm5vcm1hbCksCllhLmJ1ZmZlckRhdGEoMzQ5NjIsVi5ub3JtYWxBcnJheSwzNTA0OCksQmIuZW5hYmxlQXR0cmlidXRlKGRhLm5vcm1hbCksWWEudmVydGV4QXR0cmliUG9pbnRlcihkYS5ub3JtYWwsMyw1MTI2LCExLDAsMCkpO1YuaGFzVXZzJiYoWWEuYmluZEJ1ZmZlcigzNDk2MixvYS51diksWWEuYnVmZmVyRGF0YSgzNDk2MixWLnV2QXJyYXksMzUwNDgpLEJiLmVuYWJsZUF0dHJpYnV0ZShkYS51diksWWEudmVydGV4QXR0cmliUG9pbnRlcihkYS51diwyLDUxMjYsITEsMCwwKSk7Vi5oYXNDb2xvcnMmJihZYS5iaW5kQnVmZmVyKDM0OTYyLG9hLmNvbG9yKSxZYS5idWZmZXJEYXRhKDM0OTYyLFYuY29sb3JBcnJheSwzNTA0OCksQmIuZW5hYmxlQXR0cmlidXRlKGRhLmNvbG9yKSxZYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLmNvbG9yLDMsNTEyNiwhMSwwLDApKTtCYi5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1lhLmRyYXdBcnJheXMoNCwwLFYuY291bnQpO1YuY291bnQ9MH07dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3Q9CmZ1bmN0aW9uKFYsZGEsb2EsTWEsV2EsUmEpe0JiLnNldE1hdGVyaWFsKE1hLFdhLmlzTWVzaCYmMD5XYS5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpKTt2YXIgWGE9WihWLGRhLE1hLFdhKSwkYT0hMTtpZihlIT09b2EuaWR8fEtiIT09WGEuaWR8fGxiIT09KCEwPT09TWEud2lyZWZyYW1lKSllPW9hLmlkLEtiPVhhLmlkLGxiPSEwPT09TWEud2lyZWZyYW1lLCRhPSEwO1dhLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKHNsLnVwZGF0ZShXYSxvYSxNYSxYYSksJGE9ITApO3ZhciBGYj1vYS5pbmRleCxyYj1vYS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2RhPTE7ITA9PT1NYS53aXJlZnJhbWUmJihGYj11aS5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUob2EpLGRhPTIpO1Y9dGw7aWYobnVsbCE9PUZiKXt2YXIgZ2I9YmguZ2V0KEZiKTtWPXVsO1Yuc2V0SW5kZXgoZ2IpfSRhJiYoTyhNYSxYYSxvYSksbnVsbCE9PUZiJiZZYS5iaW5kQnVmZmVyKDM0OTYzLGdiLmJ1ZmZlcikpO2diPUluZmluaXR5OwpudWxsIT09RmI/Z2I9RmIuY291bnQ6dm9pZCAwIT09cmImJihnYj1yYi5jb3VudCk7cmI9b2EuZHJhd1JhbmdlLnN0YXJ0KmRhO1hhPW51bGwhPT1SYT9SYS5zdGFydCpkYTowO0ZiPU1hdGgubWF4KHJiLFhhKTtSYT1NYXRoLm1heCgwLE1hdGgubWluKGdiLHJiK29hLmRyYXdSYW5nZS5jb3VudCpkYSxYYSsobnVsbCE9PVJhP1JhLmNvdW50KmRhOkluZmluaXR5KSktMS1GYisxKTtpZigwIT09UmEpe2lmKFdhLmlzTWVzaClpZighMD09PU1hLndpcmVmcmFtZSlCYi5zZXRMaW5lV2lkdGgoTWEud2lyZWZyYW1lTGluZXdpZHRoKmgoKSksVi5zZXRNb2RlKDEpO2Vsc2Ugc3dpdGNoKFdhLmRyYXdNb2RlKXtjYXNlIDA6Vi5zZXRNb2RlKDQpO2JyZWFrO2Nhc2UgMTpWLnNldE1vZGUoNSk7YnJlYWs7Y2FzZSAyOlYuc2V0TW9kZSg2KX1lbHNlIFdhLmlzTGluZT8oTWE9TWEubGluZXdpZHRoLHZvaWQgMD09PU1hJiYoTWE9MSksQmIuc2V0TGluZVdpZHRoKE1hKmgoKSksV2EuaXNMaW5lU2VnbWVudHM/ClYuc2V0TW9kZSgxKTpXYS5pc0xpbmVMb29wP1Yuc2V0TW9kZSgyKTpWLnNldE1vZGUoMykpOldhLmlzUG9pbnRzP1Yuc2V0TW9kZSgwKTpXYS5pc1Nwcml0ZSYmVi5zZXRNb2RlKDQpO29hJiZvYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PzA8b2EubWF4SW5zdGFuY2VkQ291bnQmJlYucmVuZGVySW5zdGFuY2VzKG9hLEZiLFJhKTpWLnJlbmRlcihGYixSYSl9fTt0aGlzLmNvbXBpbGU9ZnVuY3Rpb24oVixkYSl7VGE9UGUuZ2V0KFYsZGEpO1RhLmluaXQoKTtWLnRyYXZlcnNlKGZ1bmN0aW9uKG9hKXtvYS5pc0xpZ2h0JiYoVGEucHVzaExpZ2h0KG9hKSxvYS5jYXN0U2hhZG93JiZUYS5wdXNoU2hhZG93KG9hKSl9KTtUYS5zZXR1cExpZ2h0cyhkYSk7Vi50cmF2ZXJzZShmdW5jdGlvbihvYSl7aWYob2EubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheShvYS5tYXRlcmlhbCkpZm9yKHZhciBNYT0wO01hPG9hLm1hdGVyaWFsLmxlbmd0aDtNYSsrKVcob2EubWF0ZXJpYWxbTWFdLFYuZm9nLApvYSk7ZWxzZSBXKG9hLm1hdGVyaWFsLFYuZm9nLG9hKX0pfTt2YXIgeWk9bnVsbCxmaD1uZXcgRztmaC5zZXRBbmltYXRpb25Mb29wKGZ1bmN0aW9uKFYpe3hkLmlzUHJlc2VudGluZygpfHx5aSYmeWkoVil9KTsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJmZoLnNldENvbnRleHQod2luZG93KTt0aGlzLnNldEFuaW1hdGlvbkxvb3A9ZnVuY3Rpb24oVil7eWk9Vjt4ZC5zZXRBbmltYXRpb25Mb29wKFYpO2ZoLnN0YXJ0KCl9O3RoaXMucmVuZGVyPWZ1bmN0aW9uKFYsZGEsb2EsTWEpe2lmKHZvaWQgMCE9PW9hKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyKCk6IHRoZSByZW5kZXJUYXJnZXQgYXJndW1lbnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5zZXRSZW5kZXJUYXJnZXQoKSBpbnN0ZWFkLiIpO3ZhciBXYT1vYX1pZih2b2lkIDAhPT1NYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcigpOiB0aGUgZm9yY2VDbGVhciBhcmd1bWVudCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmNsZWFyKCkgaW5zdGVhZC4iKTsKdmFyIFJhPU1hfWRhJiZkYS5pc0NhbWVyYT9tYXx8KEtiPWU9bnVsbCxsYj0hMSxhYj0tMSxRYT1udWxsLCEwPT09Vi5hdXRvVXBkYXRlJiZWLnVwZGF0ZU1hdHJpeFdvcmxkKCksbnVsbD09PWRhLnBhcmVudCYmZGEudXBkYXRlTWF0cml4V29ybGQoKSx4ZC5lbmFibGVkJiYoZGE9eGQuZ2V0Q2FtZXJhKGRhKSksVGE9UGUuZ2V0KFYsZGEpLFRhLmluaXQoKSxWLm9uQmVmb3JlUmVuZGVyKGliLFYsZGEsV2F8fE9hKSxRZi5tdWx0aXBseU1hdHJpY2VzKGRhLnByb2plY3Rpb25NYXRyaXgsZGEubWF0cml4V29ybGRJbnZlcnNlKSx2aS5zZXRGcm9tTWF0cml4KFFmKSx3aT10aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkLGVoPVJjLmluaXQodGhpcy5jbGlwcGluZ1BsYW5lcyx3aSxkYSksWmE9Y2guZ2V0KFYsZGEpLFphLmluaXQoKSxRKFYsZGEsMCxpYi5zb3J0T2JqZWN0cyksITA9PT1pYi5zb3J0T2JqZWN0cyYmWmEuc29ydCgpLGVoJiZSYy5iZWdpblNoYWRvd3MoKSx2bC5yZW5kZXIoVGEuc3RhdGUuc2hhZG93c0FycmF5LApWLGRhKSxUYS5zZXR1cExpZ2h0cyhkYSksZWgmJlJjLmVuZFNoYWRvd3MoKSx0aGlzLmluZm8uYXV0b1Jlc2V0JiZ0aGlzLmluZm8ucmVzZXQoKSx2b2lkIDAhPT1XYSYmdGhpcy5zZXRSZW5kZXJUYXJnZXQoV2EpLFNkLnJlbmRlcihaYSxWLGRhLFJhKSxvYT1aYS5vcGFxdWUsTWE9WmEudHJhbnNwYXJlbnQsVi5vdmVycmlkZU1hdGVyaWFsPyhXYT1WLm92ZXJyaWRlTWF0ZXJpYWwsb2EubGVuZ3RoJiZSKG9hLFYsZGEsV2EpLE1hLmxlbmd0aCYmUihNYSxWLGRhLFdhKSk6KG9hLmxlbmd0aCYmUihvYSxWLGRhKSxNYS5sZW5ndGgmJlIoTWEsVixkYSkpLG51bGwhPT1PYSYmKFBjLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcChPYSksUGMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoT2EpKSxCYi5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApLEJiLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayghMCksQmIuYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSxCYi5zZXRQb2x5Z29uT2Zmc2V0KCExKSwKeGQuZW5hYmxlZCYmeGQuc3VibWl0RnJhbWUoKSxUYT1aYT1udWxsKTpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1lcmEuIil9O3RoaXMuc2V0RnJhbWVidWZmZXI9ZnVuY3Rpb24oVil7SWE9Vn07dGhpcy5nZXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gT2F9O3RoaXMuc2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKFYsZGEpeyhPYT1WKSYmdm9pZCAwPT09dmMuZ2V0KFYpLl9fd2ViZ2xGcmFtZWJ1ZmZlciYmUGMuc2V0dXBSZW5kZXJUYXJnZXQoVik7dmFyIG9hPUlhLE1hPSExO1Y/KG9hPXZjLmdldChWKS5fX3dlYmdsRnJhbWVidWZmZXIsVi5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT8ob2E9b2FbZGF8fDBdLE1hPSEwKTpvYT1WLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD92Yy5nZXQoVikuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyOm9hLHBiLmNvcHkoVi52aWV3cG9ydCksCnZiLmNvcHkoVi5zY2lzc29yKSxBYj1WLnNjaXNzb3JUZXN0KToocGIuY29weSh3ZCkubXVsdGlwbHlTY2FsYXIoUmIpLHZiLmNvcHkodmQpLm11bHRpcGx5U2NhbGFyKFJiKSxBYj14aSk7dWIhPT1vYSYmKFlhLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxvYSksdWI9b2EpO0JiLnZpZXdwb3J0KHBiKTtCYi5zY2lzc29yKHZiKTtCYi5zZXRTY2lzc29yVGVzdChBYik7TWEmJihWPXZjLmdldChWLnRleHR1cmUpLFlhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0LDM0MDY5KyhkYXx8MCksVi5fX3dlYmdsVGV4dHVyZSwwKSl9O3RoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbihWLGRhLG9hLE1hLFdhLFJhKXtpZihWJiZWLmlzV2ViR0xSZW5kZXJUYXJnZXQpe3ZhciBYYT12Yy5nZXQoVikuX193ZWJnbEZyYW1lYnVmZmVyO2lmKFhhKXt2YXIgJGE9ITE7WGEhPT11YiYmKFlhLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxYYSksJGE9ITApO3RyeXt2YXIgRmI9Vi50ZXh0dXJlLApyYj1GYi5mb3JtYXQsZ2I9RmIudHlwZTsxMDIzIT09cmImJmtkLmNvbnZlcnQocmIpIT09WWEuZ2V0UGFyYW1ldGVyKDM1NzM5KT9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKToxMDA5PT09Z2J8fGtkLmNvbnZlcnQoZ2IpPT09WWEuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8MTAxNT09PWdiJiYodWMuaXNXZWJHTDJ8fFZiLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKXx8VmIuZ2V0KCJXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQiKSl8fDEwMTY9PT1nYiYmKHVjLmlzV2ViR0wyP1ZiLmdldCgiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpOlZiLmdldCgiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IikpPzM2MDUzPT09WWEuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cygzNjE2MCk/MDw9ZGEmJmRhPD1WLndpZHRoLU1hJiYKMDw9b2EmJm9hPD1WLmhlaWdodC1XYSYmWWEucmVhZFBpeGVscyhkYSxvYSxNYSxXYSxrZC5jb252ZXJ0KHJiKSxrZC5jb252ZXJ0KGdiKSxSYSk6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKX1maW5hbGx5eyRhJiZZYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsdWIpfX19ZWxzZSBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIil9O3RoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlPQpmdW5jdGlvbihWLGRhLG9hKXt2YXIgTWE9ZGEuaW1hZ2Uud2lkdGgsV2E9ZGEuaW1hZ2UuaGVpZ2h0LFJhPWtkLmNvbnZlcnQoZGEuZm9ybWF0KTtQYy5zZXRUZXh0dXJlMkQoZGEsMCk7WWEuY29weVRleEltYWdlMkQoMzU1MyxvYXx8MCxSYSxWLngsVi55LE1hLFdhLDApfTt0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKFYsZGEsb2EsTWEpe3ZhciBXYT1kYS5pbWFnZS53aWR0aCxSYT1kYS5pbWFnZS5oZWlnaHQsWGE9a2QuY29udmVydChvYS5mb3JtYXQpLCRhPWtkLmNvbnZlcnQob2EudHlwZSk7UGMuc2V0VGV4dHVyZTJEKG9hLDApO2RhLmlzRGF0YVRleHR1cmU/WWEudGV4U3ViSW1hZ2UyRCgzNTUzLE1hfHwwLFYueCxWLnksV2EsUmEsWGEsJGEsZGEuaW1hZ2UuZGF0YSk6WWEudGV4U3ViSW1hZ2UyRCgzNTUzLE1hfHwwLFYueCxWLnksWGEsJGEsZGEuaW1hZ2UpfX1mdW5jdGlvbiBnaChiLGUpe3RoaXMubmFtZT0iIjt0aGlzLmNvbG9yPW5ldyBCKGIpO3RoaXMuZGVuc2l0eT0Kdm9pZCAwIT09ZT9lOjIuNUUtNH1mdW5jdGlvbiBoaChiLGUsaCl7dGhpcy5uYW1lPSIiO3RoaXMuY29sb3I9bmV3IEIoYik7dGhpcy5uZWFyPXZvaWQgMCE9PWU/ZToxO3RoaXMuZmFyPXZvaWQgMCE9PWg/aDoxRTN9ZnVuY3Rpb24gaWgoKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTY2VuZSI7dGhpcy5vdmVycmlkZU1hdGVyaWFsPXRoaXMuZm9nPXRoaXMuYmFja2dyb3VuZD1udWxsO3RoaXMuYXV0b1VwZGF0ZT0hMH1mdW5jdGlvbiBoZShiLGUpe3RoaXMuYXJyYXk9Yjt0aGlzLnN0cmlkZT1lO3RoaXMuY291bnQ9dm9pZCAwIT09Yj9iLmxlbmd0aC9lOjA7dGhpcy5keW5hbWljPSExO3RoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfTt0aGlzLnZlcnNpb249MH1mdW5jdGlvbiBSZihiLGUsaCxuKXt0aGlzLmRhdGE9Yjt0aGlzLml0ZW1TaXplPWU7dGhpcy5vZmZzZXQ9aDt0aGlzLm5vcm1hbGl6ZWQ9ITA9PT1ufWZ1bmN0aW9uIFZkKGIpe0dhLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iU3ByaXRlTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEIoMTY3NzcyMTUpO3RoaXMubWFwPW51bGw7dGhpcy5yb3RhdGlvbj0wO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPSExO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gU2YoYil7Uy5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3ByaXRlIjtpZih2b2lkIDA9PT1RZSl7UWU9bmV3IHhhO3ZhciBlPW5ldyBoZShuZXcgRmxvYXQzMkFycmF5KFstLjUsLS41LDAsMCwwLC41LC0uNSwwLDEsMCwuNSwuNSwwLDEsMSwtLjUsLjUsMCwwLDFdKSw1KTtRZS5zZXRJbmRleChbMCwxLDIsMCwyLDNdKTtRZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUmYoZSwzLDAsITEpKTtRZS5hZGRBdHRyaWJ1dGUoInV2IixuZXcgUmYoZSwyLDMsITEpKX10aGlzLmdlb21ldHJ5PVFlO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09Yj9iOm5ldyBWZDt0aGlzLmNlbnRlcj1uZXcgZCguNSwKLjUpfWZ1bmN0aW9uIFRmKCl7Uy5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTE9EIjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtsZXZlbHM6e2VudW1lcmFibGU6ITAsdmFsdWU6W119fSl9ZnVuY3Rpb24gVWYoYixlKXtiJiZiLmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIik7dGIuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJTa2lubmVkTWVzaCI7dGhpcy5iaW5kTW9kZT0iYXR0YWNoZWQiO3RoaXMuYmluZE1hdHJpeD1uZXcgQzt0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyBDfWZ1bmN0aW9uIGpoKGIsZSl7Yj1ifHxbXTt0aGlzLmJvbmVzPWIuc2xpY2UoMCk7dGhpcy5ib25lTWF0cmljZXM9bmV3IEZsb2F0MzJBcnJheSgxNip0aGlzLmJvbmVzLmxlbmd0aCk7aWYodm9pZCAwPT09ZSl0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7CmVsc2UgaWYodGhpcy5ib25lcy5sZW5ndGg9PT1lLmxlbmd0aCl0aGlzLmJvbmVJbnZlcnNlcz1lLnNsaWNlKDApO2Vsc2UgZm9yKGNvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b24gYm9uZUludmVyc2VzIGlzIHRoZSB3cm9uZyBsZW5ndGguIiksdGhpcy5ib25lSW52ZXJzZXM9W10sYj0wLGU9dGhpcy5ib25lcy5sZW5ndGg7YjxlO2IrKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBDKX1mdW5jdGlvbiB6aSgpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJvbmUifWZ1bmN0aW9uIExiKGIpe0dhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lQmFzaWNNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgQigxNjc3NzIxNSk7dGhpcy5saW5ld2lkdGg9MTt0aGlzLmxpbmVqb2luPXRoaXMubGluZWNhcD0icm91bmQiO3RoaXMubGlnaHRzPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIGxjKGIsZSxoKXsxPT09aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTGluZTogcGFyYW1ldGVyIFRIUkVFLkxpbmVQaWVjZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIFRIUkVFLkxpbmVTZWdtZW50cyBpbnN0ZWFkLiIpOwpTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lIjt0aGlzLmdlb21ldHJ5PXZvaWQgMCE9PWI/YjpuZXcgeGE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1lP2U6bmV3IExiKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSl9ZnVuY3Rpb24gUGIoYixlKXtsYy5jYWxsKHRoaXMsYixlKTt0aGlzLnR5cGU9IkxpbmVTZWdtZW50cyJ9ZnVuY3Rpb24ga2goYixlKXtsYy5jYWxsKHRoaXMsYixlKTt0aGlzLnR5cGU9IkxpbmVMb29wIn1mdW5jdGlvbiBTYyhiKXtHYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUG9pbnRzTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEIoMTY3NzcyMTUpO3RoaXMubWFwPW51bGw7dGhpcy5zaXplPTE7dGhpcy5zaXplQXR0ZW51YXRpb249ITA7dGhpcy5saWdodHM9dGhpcy5tb3JwaFRhcmdldHM9ITE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gUmUoYixlKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2ludHMiO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09CmI/YjpuZXcgeGE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1lP2U6bmV3IFNjKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSl9ZnVuY3Rpb24gQWkoYixlLGgsbix1LHcseixFLEgpe2suY2FsbCh0aGlzLGIsZSxoLG4sdSx3LHosRSxIKTt0aGlzLmZvcm1hdD12b2lkIDAhPT16P3o6MTAyMjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT13P3c6MTAwNjt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT11P3U6MTAwNjt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBTZShiLGUsaCxuLHUsdyx6LEUsSCxJLE8sUSl7ay5jYWxsKHRoaXMsbnVsbCx3LHosRSxILEksbix1LE8sUSk7dGhpcy5pbWFnZT17d2lkdGg6ZSxoZWlnaHQ6aH07dGhpcy5taXBtYXBzPWI7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9dGhpcy5mbGlwWT0hMX1mdW5jdGlvbiBWZihiLGUsaCxuLHUsdyx6LEUsSCl7ay5jYWxsKHRoaXMsYixlLGgsbix1LHcseixFLEgpO3RoaXMubmVlZHNVcGRhdGU9ITB9ZnVuY3Rpb24gV2YoYiwKZSxoLG4sdSx3LHosRSxILEkpe0k9dm9pZCAwIT09ST9JOjEwMjY7aWYoMTAyNiE9PUkmJjEwMjchPT1JKXRocm93IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3ZvaWQgMD09PWgmJjEwMjY9PT1JJiYoaD0xMDEyKTt2b2lkIDA9PT1oJiYxMDI3PT09SSYmKGg9MTAyMCk7ay5jYWxsKHRoaXMsbnVsbCxuLHUsdyx6LEUsSSxoLEgpO3RoaXMuaW1hZ2U9e3dpZHRoOmIsaGVpZ2h0OmV9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXo/ejoxMDAzO3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PUU/RToxMDAzO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPXRoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gVGUoYil7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IldpcmVmcmFtZUdlb21ldHJ5Ijt2YXIgZT1bXSxoLG4sdSx3PVswLDBdLHo9e30sRT1bImEiLCJiIiwiYyJdO2lmKGImJmIuaXNHZW9tZXRyeSl7dmFyIEg9CmIuZmFjZXM7dmFyIEk9MDtmb3Iobj1ILmxlbmd0aDtJPG47SSsrKXt2YXIgTz1IW0ldO2ZvcihoPTA7Mz5oO2grKyl7dmFyIFE9T1tFW2hdXTt2YXIgUj1PW0VbKGgrMSklM11dO3dbMF09TWF0aC5taW4oUSxSKTt3WzFdPU1hdGgubWF4KFEsUik7UT13WzBdKyIsIit3WzFdO3ZvaWQgMD09PXpbUV0mJih6W1FdPXtpbmRleDE6d1swXSxpbmRleDI6d1sxXX0pfX1mb3IoUSBpbiB6KUk9eltRXSxFPWIudmVydGljZXNbSS5pbmRleDFdLGUucHVzaChFLngsRS55LEUueiksRT1iLnZlcnRpY2VzW0kuaW5kZXgyXSxlLnB1c2goRS54LEUueSxFLnopfWVsc2UgaWYoYiYmYi5pc0J1ZmZlckdlb21ldHJ5KWlmKEU9bmV3IGcsbnVsbCE9PWIuaW5kZXgpe0g9Yi5hdHRyaWJ1dGVzLnBvc2l0aW9uO089Yi5pbmRleDt2YXIgVT1iLmdyb3VwczswPT09VS5sZW5ndGgmJihVPVt7c3RhcnQ6MCxjb3VudDpPLmNvdW50LG1hdGVyaWFsSW5kZXg6MH1dKTtiPTA7Zm9yKHU9VS5sZW5ndGg7Yjx1OysrYilmb3IoST0KVVtiXSxoPUkuc3RhcnQsbj1JLmNvdW50LEk9aCxuPWgrbjtJPG47SSs9Mylmb3IoaD0wOzM+aDtoKyspUT1PLmdldFgoSStoKSxSPU8uZ2V0WChJKyhoKzEpJTMpLHdbMF09TWF0aC5taW4oUSxSKSx3WzFdPU1hdGgubWF4KFEsUiksUT13WzBdKyIsIit3WzFdLHZvaWQgMD09PXpbUV0mJih6W1FdPXtpbmRleDE6d1swXSxpbmRleDI6d1sxXX0pO2ZvcihRIGluIHopST16W1FdLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShILEkuaW5kZXgxKSxlLnB1c2goRS54LEUueSxFLnopLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShILEkuaW5kZXgyKSxlLnB1c2goRS54LEUueSxFLnopfWVsc2UgZm9yKEg9Yi5hdHRyaWJ1dGVzLnBvc2l0aW9uLEk9MCxuPUguY291bnQvMztJPG47SSsrKWZvcihoPTA7Mz5oO2grKyl6PTMqSStoLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShILHopLGUucHVzaChFLngsRS55LEUueiksej0zKkkrKGgrMSklMyxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoSCx6KSxlLnB1c2goRS54LApFLnksRS56KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShlLDMpKX1mdW5jdGlvbiBYZihiLGUsaCl7Ti5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGFyYW1ldHJpY0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2Z1bmM6YixzbGljZXM6ZSxzdGFja3M6aH07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFVlKGIsZSxoKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gVWUoYixlLGgpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17ZnVuYzpiLHNsaWNlczplLHN0YWNrczpofTt2YXIgbj1bXSx1PVtdLHc9W10sej1bXSxFPW5ldyBnLEg9bmV3IGcsST1uZXcgZyxPPW5ldyBnLFE9bmV3IGcsUixVOzM+Yi5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlBhcmFtZXRyaWNHZW9tZXRyeTogRnVuY3Rpb24gbXVzdCBub3cgbW9kaWZ5IGEgVmVjdG9yMyBhcyB0aGlyZCBwYXJhbWV0ZXIuIik7CnZhciBXPWUrMTtmb3IoUj0wO1I8PWg7UisrKXt2YXIgWj1SL2g7Zm9yKFU9MDtVPD1lO1UrKyl7dmFyIGZhPVUvZTtiKGZhLFosSCk7dS5wdXNoKEgueCxILnksSC56KTswPD1mYS0xRS01PyhiKGZhLTFFLTUsWixJKSxPLnN1YlZlY3RvcnMoSCxJKSk6KGIoZmErMUUtNSxaLEkpLE8uc3ViVmVjdG9ycyhJLEgpKTswPD1aLTFFLTU/KGIoZmEsWi0xRS01LEkpLFEuc3ViVmVjdG9ycyhILEkpKTooYihmYSxaKzFFLTUsSSksUS5zdWJWZWN0b3JzKEksSCkpO0UuY3Jvc3NWZWN0b3JzKE8sUSkubm9ybWFsaXplKCk7dy5wdXNoKEUueCxFLnksRS56KTt6LnB1c2goZmEsWil9fWZvcihSPTA7UjxoO1IrKylmb3IoVT0wO1U8ZTtVKyspYj1SKlcrVSsxLEU9KFIrMSkqVytVKzEsSD0oUisxKSpXK1Usbi5wdXNoKFIqVytVLGIsSCksbi5wdXNoKGIsRSxIKTt0aGlzLnNldEluZGV4KG4pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKHUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLApuZXcgYmEodywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoeiwyKSl9ZnVuY3Rpb24gWWYoYixlLGgsbil7Ti5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUG9seWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3ZlcnRpY2VzOmIsaW5kaWNlczplLHJhZGl1czpoLGRldGFpbDpufTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgemMoYixlLGgsbikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIHpjKGIsZSxoLG4pe2Z1bmN0aW9uIHUoVyxaLGZhLHFhKXtxYT1NYXRoLnBvdygyLHFhKTt2YXIgcmE9W10saWEsdGE7Zm9yKGlhPTA7aWE8PXFhO2lhKyspe3JhW2lhXT1bXTt2YXIgbmE9Vy5jbG9uZSgpLmxlcnAoZmEsaWEvcWEpLHZhPVouY2xvbmUoKS5sZXJwKGZhLGlhL3FhKSxCYT1xYS1pYTtmb3IodGE9MDt0YTw9QmE7dGErKylyYVtpYV1bdGFdPTA9PT10YSYmaWE9PT1xYT9uYTpuYS5jbG9uZSgpLmxlcnAodmEsdGEvQmEpfWZvcihpYT0wO2lhPHFhO2lhKyspZm9yKHRhPQowO3RhPDIqKHFhLWlhKS0xO3RhKyspVz1NYXRoLmZsb29yKHRhLzIpLDA9PT10YSUyPyh6KHJhW2lhXVtXKzFdKSx6KHJhW2lhKzFdW1ddKSx6KHJhW2lhXVtXXSkpOih6KHJhW2lhXVtXKzFdKSx6KHJhW2lhKzFdW1crMV0pLHoocmFbaWErMV1bV10pKX1mdW5jdGlvbiB3KCl7Zm9yKHZhciBXPTA7VzxVLmxlbmd0aDtXKz02KXt2YXIgWj1VW1crMF0sZmE9VVtXKzJdLHFhPVVbVys0XSxyYT1NYXRoLm1pbihaLGZhLHFhKTsuOTxNYXRoLm1heChaLGZhLHFhKSYmLjE+cmEmJiguMj5aJiYoVVtXKzBdKz0xKSwuMj5mYSYmKFVbVysyXSs9MSksLjI+cWEmJihVW1crNF0rPTEpKX19ZnVuY3Rpb24geihXKXtSLnB1c2goVy54LFcueSxXLnopfWZ1bmN0aW9uIEUoVyxaKXtXKj0zO1oueD1iW1crMF07Wi55PWJbVysxXTtaLno9YltXKzJdfWZ1bmN0aW9uIEgoKXtmb3IodmFyIFc9bmV3IGcsWj1uZXcgZyxmYT1uZXcgZyxxYT1uZXcgZyxyYT1uZXcgZCxpYT1uZXcgZCx0YT1uZXcgZCxuYT0KMCx2YT0wO25hPFIubGVuZ3RoO25hKz05LHZhKz02KXtXLnNldChSW25hKzBdLFJbbmErMV0sUltuYSsyXSk7Wi5zZXQoUltuYSszXSxSW25hKzRdLFJbbmErNV0pO2ZhLnNldChSW25hKzZdLFJbbmErN10sUltuYSs4XSk7cmEuc2V0KFVbdmErMF0sVVt2YSsxXSk7aWEuc2V0KFVbdmErMl0sVVt2YSszXSk7dGEuc2V0KFVbdmErNF0sVVt2YSs1XSk7cWEuY29weShXKS5hZGQoWikuYWRkKGZhKS5kaXZpZGVTY2FsYXIoMyk7dmFyIEJhPU8ocWEpO0kocmEsdmErMCxXLEJhKTtJKGlhLHZhKzIsWixCYSk7SSh0YSx2YSs0LGZhLEJhKX19ZnVuY3Rpb24gSShXLFosZmEscWEpezA+cWEmJjE9PT1XLngmJihVW1pdPVcueC0xKTswPT09ZmEueCYmMD09PWZhLnomJihVW1pdPXFhLzIvTWF0aC5QSSsuNSl9ZnVuY3Rpb24gTyhXKXtyZXR1cm4gTWF0aC5hdGFuMihXLnosLVcueCl9ZnVuY3Rpb24gUShXKXtyZXR1cm4gTWF0aC5hdGFuMigtVy55LE1hdGguc3FydChXLngqVy54K1cueipXLnopKX0KeGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczpiLGluZGljZXM6ZSxyYWRpdXM6aCxkZXRhaWw6bn07aD1ofHwxO249bnx8MDt2YXIgUj1bXSxVPVtdOyhmdW5jdGlvbihXKXtmb3IodmFyIFo9bmV3IGcsZmE9bmV3IGcscWE9bmV3IGcscmE9MDtyYTxlLmxlbmd0aDtyYSs9MylFKGVbcmErMF0sWiksRShlW3JhKzFdLGZhKSxFKGVbcmErMl0scWEpLHUoWixmYSxxYSxXKX0pKG4pOyhmdW5jdGlvbihXKXtmb3IodmFyIFo9bmV3IGcsZmE9MDtmYTxSLmxlbmd0aDtmYSs9MylaLng9UltmYSswXSxaLnk9UltmYSsxXSxaLno9UltmYSsyXSxaLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKFcpLFJbZmErMF09Wi54LFJbZmErMV09Wi55LFJbZmErMl09Wi56fSkoaCk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBXPW5ldyBnLFo9MDtaPFIubGVuZ3RoO1orPTMpe1cueD1SW1orMF07Vy55PVJbWisxXTtXLno9ClJbWisyXTt2YXIgZmE9TyhXKS8yL01hdGguUEkrLjUscWE9UShXKS9NYXRoLlBJKy41O1UucHVzaChmYSwxLXFhKX1IKCk7dygpfSkoKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShSLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoUi5zbGljZSgpLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShVLDIpKTswPT09bj90aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk6dGhpcy5ub3JtYWxpemVOb3JtYWxzKCl9ZnVuY3Rpb24gWmYoYixlKXtOLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUZXRyYWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgVmUoYixlKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gVmUoYixlKXt6Yy5jYWxsKHRoaXMsWzEsMSwxLC0xLC0xLDEsLTEsMSwtMSwxLC0xLC0xXSxbMiwxLDAsMCwzLDIsMSwzLDAsMiwKMywxXSxiLGUpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YixkZXRhaWw6ZX19ZnVuY3Rpb24gJGYoYixlKXtOLmNhbGwodGhpcyk7dGhpcy50eXBlPSJPY3RhaGVkcm9uR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsZGV0YWlsOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBpZShiLGUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBpZShiLGUpe3pjLmNhbGwodGhpcyxbMSwwLDAsLTEsMCwwLDAsMSwwLDAsLTEsMCwwLDAsMSwwLDAsLTFdLFswLDIsNCwwLDQsMywwLDMsNSwwLDUsMiwxLDIsNSwxLDUsMywxLDMsNCwxLDQsMl0sYixlKTt0aGlzLnR5cGU9Ik9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YixkZXRhaWw6ZX19ZnVuY3Rpb24gYWcoYixlKXtOLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6YixkZXRhaWw6ZX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFdlKGIsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFdlKGIsZSl7dmFyIGg9KDErTWF0aC5zcXJ0KDUpKS8yO3pjLmNhbGwodGhpcyxbLTEsaCwwLDEsaCwwLC0xLC1oLDAsMSwtaCwwLDAsLTEsaCwwLDEsaCwwLC0xLC1oLDAsMSwtaCxoLDAsLTEsaCwwLDEsLWgsMCwtMSwtaCwwLDFdLFswLDExLDUsMCw1LDEsMCwxLDcsMCw3LDEwLDAsMTAsMTEsMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdLGIsZSk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfX1mdW5jdGlvbiBiZyhiLGUpe04uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6YixkZXRhaWw6ZX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFhlKGIsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFhlKGIsZSl7dmFyIGg9KDErTWF0aC5zcXJ0KDUpKS8yLG49MS9oO3pjLmNhbGwodGhpcyxbLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtbiwtaCwwLC1uLGgsMCxuLC1oLDAsbixoLC1uLC1oLDAsLW4saCwwLG4sLWgsMCxuLGgsMCwtaCwwLC1uLGgsMCwtbiwtaCwwLG4saCwwLG5dLFszLDExLDcsMyw3LDE1LDMsMTUsMTMsNywxOSwxNyw3LDE3LDYsNyw2LDE1LDE3LDQsOCwxNyw4LDEwLDE3LDEwLDYsOCwwLDE2LDgsMTYsMiw4LDIsMTAsMCwxMiwxLDAsMSwxOCwwLDE4LDE2LDYsMTAsMiw2LDIsMTMsNiwxMywxNSwyLDE2LDE4LDIsMTgsMywyLDMsMTMsMTgsMSw5LDE4LDksMTEsMTgsMTEsMyw0LDE0LDEyLDQsMTIsMCw0LDAsOCwxMSw5LDUsMTEsNSwxOSwxMSwKMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV0sYixlKTt0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfX1mdW5jdGlvbiBjZyhiLGUsaCxuLHUsdyl7Ti5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVHViZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3BhdGg6Yix0dWJ1bGFyU2VnbWVudHM6ZSxyYWRpdXM6aCxyYWRpYWxTZWdtZW50czpuLGNsb3NlZDp1fTt2b2lkIDAhPT13JiZjb25zb2xlLndhcm4oIlRIUkVFLlR1YmVHZW9tZXRyeTogdGFwZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKTtiPW5ldyBqZShiLGUsaCxuLHUpO3RoaXMudGFuZ2VudHM9Yi50YW5nZW50czt0aGlzLm5vcm1hbHM9Yi5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPWIuYmlub3JtYWxzO3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KGIpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIGplKGIsCmUsaCxuLHUpe2Z1bmN0aW9uIHcoaWEpe1I9Yi5nZXRQb2ludEF0KGlhL2UsUik7dmFyIHRhPUgubm9ybWFsc1tpYV07aWE9SC5iaW5vcm1hbHNbaWFdO2ZvcihXPTA7Vzw9bjtXKyspe3ZhciBuYT1XL24qTWF0aC5QSSoyLHZhPU1hdGguc2luKG5hKTtuYT0tTWF0aC5jb3MobmEpO08ueD1uYSp0YS54K3ZhKmlhLng7Ty55PW5hKnRhLnkrdmEqaWEueTtPLno9bmEqdGEueit2YSppYS56O08ubm9ybWFsaXplKCk7ZmEucHVzaChPLngsTy55LE8ueik7SS54PVIueCtoKk8ueDtJLnk9Ui55K2gqTy55O0kuej1SLnoraCpPLno7Wi5wdXNoKEkueCxJLnksSS56KX19ZnVuY3Rpb24geigpe2ZvcihXPTE7Vzw9ZTtXKyspZm9yKFU9MTtVPD1uO1UrKyl7dmFyIGlhPShuKzEpKlcrKFUtMSksdGE9KG4rMSkqVytVLG5hPShuKzEpKihXLTEpK1U7cmEucHVzaCgobisxKSooVy0xKSsoVS0xKSxpYSxuYSk7cmEucHVzaChpYSx0YSxuYSl9fWZ1bmN0aW9uIEUoKXtmb3IoVT0wO1U8PWU7VSsrKWZvcihXPQowO1c8PW47VysrKVEueD1VL2UsUS55PVcvbixxYS5wdXNoKFEueCxRLnkpfXhhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUdWJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cGF0aDpiLHR1YnVsYXJTZWdtZW50czplLHJhZGl1czpoLHJhZGlhbFNlZ21lbnRzOm4sY2xvc2VkOnV9O2U9ZXx8NjQ7aD1ofHwxO249bnx8ODt1PXV8fCExO3ZhciBIPWIuY29tcHV0ZUZyZW5ldEZyYW1lcyhlLHUpO3RoaXMudGFuZ2VudHM9SC50YW5nZW50czt0aGlzLm5vcm1hbHM9SC5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPUguYmlub3JtYWxzO3ZhciBJPW5ldyBnLE89bmV3IGcsUT1uZXcgZCxSPW5ldyBnLFUsVyxaPVtdLGZhPVtdLHFhPVtdLHJhPVtdOyhmdW5jdGlvbigpe2ZvcihVPTA7VTxlO1UrKyl3KFUpO3coITE9PT11P2U6MCk7RSgpO3ooKX0pKCk7dGhpcy5zZXRJbmRleChyYSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsCm5ldyBiYShmYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEocWEsMikpfWZ1bmN0aW9uIGRnKGIsZSxoLG4sdSx3LHope04uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLHR1YmU6ZSx0dWJ1bGFyU2VnbWVudHM6aCxyYWRpYWxTZWdtZW50czpuLHA6dSxxOnd9O3ZvaWQgMCE9PXomJmNvbnNvbGUud2FybigiVEhSRUUuVG9ydXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2NhbGUoIHgsIHksIHogKSBpbnN0ZWFkLiIpO3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBZZShiLGUsaCxuLHUsdykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFllKGIsZSxoLG4sdSx3KXtmdW5jdGlvbiB6KHZhLEJhLHNhLERhLEhhKXt2YXIgS2E9TWF0aC5zaW4odmEpO0JhPXNhL0JhKnZhO3NhPU1hdGguY29zKEJhKTtIYS54PURhKigyK3NhKSouNSpNYXRoLmNvcyh2YSk7CkhhLnk9RGEqKDIrc2EpKkthKi41O0hhLno9RGEqTWF0aC5zaW4oQmEpKi41fXhhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6Yix0dWJlOmUsdHVidWxhclNlZ21lbnRzOmgscmFkaWFsU2VnbWVudHM6bixwOnUscTp3fTtiPWJ8fDE7ZT1lfHwuNDtoPU1hdGguZmxvb3IoaCl8fDY0O249TWF0aC5mbG9vcihuKXx8ODt1PXV8fDI7dz13fHwzO3ZhciBFPVtdLEg9W10sST1bXSxPPVtdLFEsUj1uZXcgZyxVPW5ldyBnLFc9bmV3IGcsWj1uZXcgZyxmYT1uZXcgZyxxYT1uZXcgZyxyYT1uZXcgZztmb3IoUT0wO1E8PWg7KytRKXt2YXIgaWE9US9oKnUqTWF0aC5QSSoyO3ooaWEsdSx3LGIsVyk7eihpYSsuMDEsdSx3LGIsWik7cWEuc3ViVmVjdG9ycyhaLFcpO3JhLmFkZFZlY3RvcnMoWixXKTtmYS5jcm9zc1ZlY3RvcnMocWEscmEpO3JhLmNyb3NzVmVjdG9ycyhmYSxxYSk7ZmEubm9ybWFsaXplKCk7cmEubm9ybWFsaXplKCk7CmZvcihpYT0wO2lhPD1uOysraWEpe3ZhciB0YT1pYS9uKk1hdGguUEkqMixuYT0tZSpNYXRoLmNvcyh0YSk7dGE9ZSpNYXRoLnNpbih0YSk7Ui54PVcueCsobmEqcmEueCt0YSpmYS54KTtSLnk9Vy55KyhuYSpyYS55K3RhKmZhLnkpO1Iuej1XLnorKG5hKnJhLnordGEqZmEueik7SC5wdXNoKFIueCxSLnksUi56KTtVLnN1YlZlY3RvcnMoUixXKS5ub3JtYWxpemUoKTtJLnB1c2goVS54LFUueSxVLnopO08ucHVzaChRL2gpO08ucHVzaChpYS9uKX19Zm9yKGlhPTE7aWE8PWg7aWErKylmb3IoUT0xO1E8PW47USsrKWI9KG4rMSkqaWErKFEtMSksZT0obisxKSppYStRLHU9KG4rMSkqKGlhLTEpK1EsRS5wdXNoKChuKzEpKihpYS0xKSsoUS0xKSxiLHUpLEUucHVzaChiLGUsdSk7dGhpcy5zZXRJbmRleChFKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShILDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoSSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IiwKbmV3IGJhKE8sMikpfWZ1bmN0aW9uIGVnKGIsZSxoLG4sdSl7Ti5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6Yix0dWJlOmUscmFkaWFsU2VnbWVudHM6aCx0dWJ1bGFyU2VnbWVudHM6bixhcmM6dX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFplKGIsZSxoLG4sdSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFplKGIsZSxoLG4sdSl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsdHViZTplLHJhZGlhbFNlZ21lbnRzOmgsdHVidWxhclNlZ21lbnRzOm4sYXJjOnV9O2I9Ynx8MTtlPWV8fC40O2g9TWF0aC5mbG9vcihoKXx8ODtuPU1hdGguZmxvb3Iobil8fDY7dT11fHwyKk1hdGguUEk7dmFyIHc9W10sej1bXSxFPVtdLEg9W10sST1uZXcgZyxPPW5ldyBnLFE9bmV3IGcsUixVO2ZvcihSPTA7Ujw9aDtSKyspZm9yKFU9CjA7VTw9bjtVKyspe3ZhciBXPVUvbip1LFo9Ui9oKk1hdGguUEkqMjtPLng9KGIrZSpNYXRoLmNvcyhaKSkqTWF0aC5jb3MoVyk7Ty55PShiK2UqTWF0aC5jb3MoWikpKk1hdGguc2luKFcpO08uej1lKk1hdGguc2luKFopO3oucHVzaChPLngsTy55LE8ueik7SS54PWIqTWF0aC5jb3MoVyk7SS55PWIqTWF0aC5zaW4oVyk7US5zdWJWZWN0b3JzKE8sSSkubm9ybWFsaXplKCk7RS5wdXNoKFEueCxRLnksUS56KTtILnB1c2goVS9uKTtILnB1c2goUi9oKX1mb3IoUj0xO1I8PWg7UisrKWZvcihVPTE7VTw9bjtVKyspYj0obisxKSooUi0xKStVLTEsZT0obisxKSooUi0xKStVLHU9KG4rMSkqUitVLHcucHVzaCgobisxKSpSK1UtMSxiLHUpLHcucHVzaChiLGUsdSk7dGhpcy5zZXRJbmRleCh3KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh6LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoRSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoSCwKMikpfWZ1bmN0aW9uIHdsKGIsZSxoLG4sdSl7aWYodT09PTA8TG8oYixlLGgsbikpZm9yKHU9ZTt1PGg7dSs9bil2YXIgdz14bCh1LGJbdV0sYlt1KzFdLHcpO2Vsc2UgZm9yKHU9aC1uO3U+PWU7dS09bil3PXhsKHUsYlt1XSxiW3UrMV0sdyk7dyYma2Uodyx3Lm5leHQpJiYoZmcodyksdz13Lm5leHQpO3JldHVybiB3fWZ1bmN0aW9uIGdnKGIsZSl7aWYoIWIpcmV0dXJuIGI7ZXx8KGU9Yik7ZG97dmFyIGg9ITE7aWYoYi5zdGVpbmVyfHwha2UoYixiLm5leHQpJiYwIT09d2MoYi5wcmV2LGIsYi5uZXh0KSliPWIubmV4dDtlbHNle2ZnKGIpO2I9ZT1iLnByZXY7aWYoYj09PWIubmV4dClicmVhaztoPSEwfX13aGlsZShofHxiIT09ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gaGcoYixlLGgsbix1LHcseil7aWYoYil7IXomJncmJk1vKGIsbix1LHcpO2Zvcih2YXIgRT1iLEgsSTtiLnByZXYhPT1iLm5leHQ7KWlmKEg9Yi5wcmV2LEk9Yi5uZXh0LHc/Tm8oYixuLHUsdyk6T28oYikpZS5wdXNoKEguaS8KaCksZS5wdXNoKGIuaS9oKSxlLnB1c2goSS5pL2gpLGZnKGIpLEU9Yj1JLm5leHQ7ZWxzZSBpZihiPUksYj09PUUpe3o/MT09PXo/KGI9UG8oYixlLGgpLGhnKGIsZSxoLG4sdSx3LDIpKToyPT09eiYmUW8oYixlLGgsbix1LHcpOmhnKGdnKGIpLGUsaCxuLHUsdywxKTticmVha319fWZ1bmN0aW9uIE9vKGIpe3ZhciBlPWIucHJldixoPWIubmV4dDtpZigwPD13YyhlLGIsaCkpcmV0dXJuITE7Zm9yKHZhciBuPWIubmV4dC5uZXh0O24hPT1iLnByZXY7KXtpZihsaChlLngsZS55LGIueCxiLnksaC54LGgueSxuLngsbi55KSYmMDw9d2Mobi5wcmV2LG4sbi5uZXh0KSlyZXR1cm4hMTtuPW4ubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBObyhiLGUsaCxuKXt2YXIgdT1iLnByZXYsdz1iLm5leHQ7aWYoMDw9d2ModSxiLHcpKXJldHVybiExO3ZhciB6PXUueD5iLng/dS54PncueD91Lng6dy54OmIueD53Lng/Yi54OncueCxFPXUueT5iLnk/dS55PncueT91Lnk6dy55OmIueT53Lnk/Yi55OncueSwKSD1CaSh1Lng8Yi54P3UueDx3Lng/dS54OncueDpiLng8dy54P2IueDp3LngsdS55PGIueT91Lnk8dy55P3UueTp3Lnk6Yi55PHcueT9iLnk6dy55LGUsaCxuKTtlPUJpKHosRSxlLGgsbik7Zm9yKGg9Yi5uZXh0WjtoJiZoLno8PWU7KXtpZihoIT09Yi5wcmV2JiZoIT09Yi5uZXh0JiZsaCh1LngsdS55LGIueCxiLnksdy54LHcueSxoLngsaC55KSYmMDw9d2MoaC5wcmV2LGgsaC5uZXh0KSlyZXR1cm4hMTtoPWgubmV4dFp9Zm9yKGg9Yi5wcmV2WjtoJiZoLno+PUg7KXtpZihoIT09Yi5wcmV2JiZoIT09Yi5uZXh0JiZsaCh1LngsdS55LGIueCxiLnksdy54LHcueSxoLngsaC55KSYmMDw9d2MoaC5wcmV2LGgsaC5uZXh0KSlyZXR1cm4hMTtoPWgucHJldlp9cmV0dXJuITB9ZnVuY3Rpb24gUG8oYixlLGgpe3ZhciBuPWI7ZG97dmFyIHU9bi5wcmV2LHc9bi5uZXh0Lm5leHQ7IWtlKHUsdykmJnlsKHUsbixuLm5leHQsdykmJmlnKHUsdykmJmlnKHcsdSkmJihlLnB1c2godS5pL2gpLGUucHVzaChuLmkvCmgpLGUucHVzaCh3LmkvaCksZmcobiksZmcobi5uZXh0KSxuPWI9dyk7bj1uLm5leHR9d2hpbGUobiE9PWIpO3JldHVybiBufWZ1bmN0aW9uIFFvKGIsZSxoLG4sdSx3KXt2YXIgej1iO2Rve2Zvcih2YXIgRT16Lm5leHQubmV4dDtFIT09ei5wcmV2Oyl7aWYoei5pIT09RS5pJiZSbyh6LEUpKXtiPXpsKHosRSk7ej1nZyh6LHoubmV4dCk7Yj1nZyhiLGIubmV4dCk7aGcoeixlLGgsbix1LHcpO2hnKGIsZSxoLG4sdSx3KTtyZXR1cm59RT1FLm5leHR9ej16Lm5leHR9d2hpbGUoeiE9PWIpfWZ1bmN0aW9uIFNvKGIsZSxoLG4pe3ZhciB1PVtdLHc7dmFyIHo9MDtmb3Iodz1lLmxlbmd0aDt6PHc7eisrKXt2YXIgRT1lW3pdKm47dmFyIEg9ejx3LTE/ZVt6KzFdKm46Yi5sZW5ndGg7RT13bChiLEUsSCxuLCExKTtFPT09RS5uZXh0JiYoRS5zdGVpbmVyPSEwKTt1LnB1c2goVG8oRSkpfXUuc29ydChVbyk7Zm9yKHo9MDt6PHUubGVuZ3RoO3orKylWbyh1W3pdLGgpLGg9Z2coaCxoLm5leHQpOwpyZXR1cm4gaH1mdW5jdGlvbiBVbyhiLGUpe3JldHVybiBiLngtZS54fWZ1bmN0aW9uIFZvKGIsZSl7aWYoZT1XbyhiLGUpKWI9emwoZSxiKSxnZyhiLGIubmV4dCl9ZnVuY3Rpb24gV28oYixlKXt2YXIgaD1lLG49Yi54LHU9Yi55LHc9LUluZmluaXR5O2Rve2lmKHU8PWgueSYmdT49aC5uZXh0LnkmJmgubmV4dC55IT09aC55KXt2YXIgej1oLngrKHUtaC55KSooaC5uZXh0LngtaC54KS8oaC5uZXh0LnktaC55KTtpZih6PD1uJiZ6Pncpe3c9ejtpZih6PT09bil7aWYodT09PWgueSlyZXR1cm4gaDtpZih1PT09aC5uZXh0LnkpcmV0dXJuIGgubmV4dH12YXIgRT1oLng8aC5uZXh0Lng/aDpoLm5leHR9fWg9aC5uZXh0fXdoaWxlKGghPT1lKTtpZighRSlyZXR1cm4gbnVsbDtpZihuPT09dylyZXR1cm4gRS5wcmV2O2U9RTt6PUUueDt2YXIgSD1FLnksST1JbmZpbml0eTtmb3IoaD1FLm5leHQ7aCE9PWU7KXtpZihuPj1oLngmJmgueD49eiYmbiE9PWgueCYmbGgodTxIP246dyx1LHosSCwKdTxIP3c6bix1LGgueCxoLnkpKXt2YXIgTz1NYXRoLmFicyh1LWgueSkvKG4taC54KTsoTzxJfHxPPT09SSYmaC54PkUueCkmJmlnKGgsYikmJihFPWgsST1PKX1oPWgubmV4dH1yZXR1cm4gRX1mdW5jdGlvbiBNbyhiLGUsaCxuKXt2YXIgdT1iO2RvIG51bGw9PT11LnomJih1Lno9QmkodS54LHUueSxlLGgsbikpLHUucHJldlo9dS5wcmV2LHU9dS5uZXh0Wj11Lm5leHQ7d2hpbGUodSE9PWIpO3UucHJldloubmV4dFo9bnVsbDt1LnByZXZaPW51bGw7WG8odSl9ZnVuY3Rpb24gWG8oYil7dmFyIGUsaCxuLHUsdz0xO2Rve3ZhciB6PWI7dmFyIEU9Yj1udWxsO2ZvcihoPTA7ejspe2grKzt2YXIgSD16O2ZvcihlPW49MDtlPHcmJihuKyssSD1ILm5leHRaLEgpO2UrKyk7Zm9yKHU9dzswPG58fDA8dSYmSDspMCE9PW4mJigwPT09dXx8IUh8fHouejw9SC56KT8oZT16LHo9ei5uZXh0WixuLS0pOihlPUgsSD1ILm5leHRaLHUtLSksRT9FLm5leHRaPWU6Yj1lLGUucHJldlo9RSxFPWU7ej1IfUUubmV4dFo9Cm51bGw7dyo9Mn13aGlsZSgxPGgpO3JldHVybiBifWZ1bmN0aW9uIEJpKGIsZSxoLG4sdSl7Yj0zMjc2NyooYi1oKSp1O2U9MzI3NjcqKGUtbikqdTtiPShifGI8PDgpJjE2NzExOTM1O2I9KGJ8Yjw8NCkmMjUyNjQ1MTM1O2I9KGJ8Yjw8MikmODU4OTkzNDU5O2U9KGV8ZTw8OCkmMTY3MTE5MzU7ZT0oZXxlPDw0KSYyNTI2NDUxMzU7ZT0oZXxlPDwyKSY4NTg5OTM0NTk7cmV0dXJuKGJ8Yjw8MSkmMTQzMTY1NTc2NXwoKGV8ZTw8MSkmMTQzMTY1NTc2NSk8PDF9ZnVuY3Rpb24gVG8oYil7dmFyIGU9YixoPWI7ZG8gZS54PGgueCYmKGg9ZSksZT1lLm5leHQ7d2hpbGUoZSE9PWIpO3JldHVybiBofWZ1bmN0aW9uIGxoKGIsZSxoLG4sdSx3LHosRSl7cmV0dXJuIDA8PSh1LXopKihlLUUpLShiLXopKih3LUUpJiYwPD0oYi16KSoobi1FKS0oaC16KSooZS1FKSYmMDw9KGgteikqKHctRSktKHUteikqKG4tRSl9ZnVuY3Rpb24gUm8oYixlKXtyZXR1cm4gYi5uZXh0LmkhPT1lLmkmJmIucHJldi5pIT09CmUuaSYmIVlvKGIsZSkmJmlnKGIsZSkmJmlnKGUsYikmJlpvKGIsZSl9ZnVuY3Rpb24gd2MoYixlLGgpe3JldHVybihlLnktYi55KSooaC54LWUueCktKGUueC1iLngpKihoLnktZS55KX1mdW5jdGlvbiBrZShiLGUpe3JldHVybiBiLng9PT1lLngmJmIueT09PWUueX1mdW5jdGlvbiB5bChiLGUsaCxuKXtyZXR1cm4ga2UoYixlKSYma2UoaCxuKXx8a2UoYixuKSYma2UoaCxlKT8hMDowPHdjKGIsZSxoKSE9PTA8d2MoYixlLG4pJiYwPHdjKGgsbixiKSE9PTA8d2MoaCxuLGUpfWZ1bmN0aW9uIFlvKGIsZSl7dmFyIGg9Yjtkb3tpZihoLmkhPT1iLmkmJmgubmV4dC5pIT09Yi5pJiZoLmkhPT1lLmkmJmgubmV4dC5pIT09ZS5pJiZ5bChoLGgubmV4dCxiLGUpKXJldHVybiEwO2g9aC5uZXh0fXdoaWxlKGghPT1iKTtyZXR1cm4hMX1mdW5jdGlvbiBpZyhiLGUpe3JldHVybiAwPndjKGIucHJldixiLGIubmV4dCk/MDw9d2MoYixlLGIubmV4dCkmJjA8PXdjKGIsYi5wcmV2LGUpOjA+d2MoYiwKZSxiLnByZXYpfHwwPndjKGIsYi5uZXh0LGUpfWZ1bmN0aW9uIFpvKGIsZSl7dmFyIGg9YixuPSExLHU9KGIueCtlLngpLzI7ZT0oYi55K2UueSkvMjtkbyBoLnk+ZSE9PWgubmV4dC55PmUmJmgubmV4dC55IT09aC55JiZ1PChoLm5leHQueC1oLngpKihlLWgueSkvKGgubmV4dC55LWgueSkraC54JiYobj0hbiksaD1oLm5leHQ7d2hpbGUoaCE9PWIpO3JldHVybiBufWZ1bmN0aW9uIHpsKGIsZSl7dmFyIGg9bmV3IENpKGIuaSxiLngsYi55KSxuPW5ldyBDaShlLmksZS54LGUueSksdT1iLm5leHQsdz1lLnByZXY7Yi5uZXh0PWU7ZS5wcmV2PWI7aC5uZXh0PXU7dS5wcmV2PWg7bi5uZXh0PWg7aC5wcmV2PW47dy5uZXh0PW47bi5wcmV2PXc7cmV0dXJuIG59ZnVuY3Rpb24geGwoYixlLGgsbil7Yj1uZXcgQ2koYixlLGgpO24/KGIubmV4dD1uLm5leHQsYi5wcmV2PW4sbi5uZXh0LnByZXY9YixuLm5leHQ9Yik6KGIucHJldj1iLGIubmV4dD1iKTtyZXR1cm4gYn1mdW5jdGlvbiBmZyhiKXtiLm5leHQucHJldj0KYi5wcmV2O2IucHJldi5uZXh0PWIubmV4dDtiLnByZXZaJiYoYi5wcmV2Wi5uZXh0Wj1iLm5leHRaKTtiLm5leHRaJiYoYi5uZXh0Wi5wcmV2Wj1iLnByZXZaKX1mdW5jdGlvbiBDaShiLGUsaCl7dGhpcy5pPWI7dGhpcy54PWU7dGhpcy55PWg7dGhpcy5uZXh0Wj10aGlzLnByZXZaPXRoaXMuej10aGlzLm5leHQ9dGhpcy5wcmV2PW51bGw7dGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIExvKGIsZSxoLG4pe2Zvcih2YXIgdT0wLHc9aC1uO2U8aDtlKz1uKXUrPShiW3ddLWJbZV0pKihiW2UrMV0rYlt3KzFdKSx3PWU7cmV0dXJuIHV9ZnVuY3Rpb24gQWwoYil7dmFyIGU9Yi5sZW5ndGg7MjxlJiZiW2UtMV0uZXF1YWxzKGJbMF0pJiZiLnBvcCgpfWZ1bmN0aW9uIEJsKGIsZSl7Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspYi5wdXNoKGVbaF0ueCksYi5wdXNoKGVbaF0ueSl9ZnVuY3Rpb24gbGUoYixlKXtOLmNhbGwodGhpcyk7dGhpcy50eXBlPSJFeHRydWRlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz0Ke3NoYXBlczpiLG9wdGlvbnM6ZX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IG1kKGIsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIG1kKGIsZSl7ZnVuY3Rpb24gaChIKXtmdW5jdGlvbiBJKFFhLG5iLHBiKXtuYnx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKTtyZXR1cm4gbmIuY2xvbmUoKS5tdWx0aXBseVNjYWxhcihwYikuYWRkKFFhKX1mdW5jdGlvbiBPKFFhLG5iLHBiKXt2YXIgdmI9UWEueC1uYi54O3ZhciBBYj1RYS55LW5iLnk7dmFyIE9iPXBiLngtUWEueDt2YXIgV2I9cGIueS1RYS55LFJiPXZiKnZiK0FiKkFiO2lmKE1hdGguYWJzKHZiKldiLUFiKk9iKT5OdW1iZXIuRVBTSUxPTil7dmFyIHdkPU1hdGguc3FydChSYiksdmQ9TWF0aC5zcXJ0KE9iKk9iK1diKldiKTtSYj1uYi54LUFiL3dkO25iPW5iLnkrdmIvd2Q7V2I9KChwYi54LVdiL3ZkLVJiKSpXYi0ocGIueStPYi92ZC1uYikqT2IpLwoodmIqV2ItQWIqT2IpO09iPVJiK3ZiKldiLVFhLng7dmI9bmIrQWIqV2ItUWEueTtBYj1PYipPYit2Yip2YjtpZigyPj1BYilyZXR1cm4gbmV3IGQoT2IsdmIpO0FiPU1hdGguc3FydChBYi8yKX1lbHNlIFFhPSExLHZiPk51bWJlci5FUFNJTE9OP09iPk51bWJlci5FUFNJTE9OJiYoUWE9ITApOnZiPC1OdW1iZXIuRVBTSUxPTj9PYjwtTnVtYmVyLkVQU0lMT04mJihRYT0hMCk6TWF0aC5zaWduKEFiKT09PU1hdGguc2lnbihXYikmJihRYT0hMCksUWE/KE9iPS1BYixBYj1NYXRoLnNxcnQoUmIpKTooT2I9dmIsdmI9QWIsQWI9TWF0aC5zcXJ0KFJiLzIpKTtyZXR1cm4gbmV3IGQoT2IvQWIsdmIvQWIpfWZ1bmN0aW9uIFEoUWEsbmIpe2ZvcihtYT1RYS5sZW5ndGg7MDw9LS1tYTspe3ZhciBwYj1tYTt2YXIgdmI9bWEtMTswPnZiJiYodmI9UWEubGVuZ3RoLTEpO3ZhciBBYixPYj1pYSsyKkRhO2ZvcihBYj0wO0FiPE9iO0FiKyspe3ZhciBXYj1aYSpBYixSYj1aYSooQWIrMSk7VyhuYisKcGIrV2IsbmIrdmIrV2IsbmIrdmIrUmIsbmIrcGIrUmIpfX19ZnVuY3Rpb24gUihRYSxuYixwYil7cWEucHVzaChRYSk7cWEucHVzaChuYik7cWEucHVzaChwYil9ZnVuY3Rpb24gVShRYSxuYixwYil7WihRYSk7WihuYik7WihwYik7UWE9dS5sZW5ndGgvMztRYT1LYS5nZW5lcmF0ZVRvcFVWKG4sdSxRYS0zLFFhLTIsUWEtMSk7ZmEoUWFbMF0pO2ZhKFFhWzFdKTtmYShRYVsyXSl9ZnVuY3Rpb24gVyhRYSxuYixwYix2Yil7WihRYSk7WihuYik7Wih2Yik7WihuYik7WihwYik7Wih2Yik7UWE9dS5sZW5ndGgvMztRYT1LYS5nZW5lcmF0ZVNpZGVXYWxsVVYobix1LFFhLTYsUWEtMyxRYS0yLFFhLTEpO2ZhKFFhWzBdKTtmYShRYVsxXSk7ZmEoUWFbM10pO2ZhKFFhWzFdKTtmYShRYVsyXSk7ZmEoUWFbM10pfWZ1bmN0aW9uIFooUWEpe3UucHVzaChxYVszKlFhXSk7dS5wdXNoKHFhWzMqUWErMV0pO3UucHVzaChxYVszKlFhKzJdKX1mdW5jdGlvbiBmYShRYSl7dy5wdXNoKFFhLngpO3cucHVzaChRYS55KX0KdmFyIHFhPVtdLHJhPXZvaWQgMCE9PWUuY3VydmVTZWdtZW50cz9lLmN1cnZlU2VnbWVudHM6MTIsaWE9dm9pZCAwIT09ZS5zdGVwcz9lLnN0ZXBzOjEsdGE9dm9pZCAwIT09ZS5kZXB0aD9lLmRlcHRoOjEwMCxuYT12b2lkIDAhPT1lLmJldmVsRW5hYmxlZD9lLmJldmVsRW5hYmxlZDohMCx2YT12b2lkIDAhPT1lLmJldmVsVGhpY2tuZXNzP2UuYmV2ZWxUaGlja25lc3M6NixCYT12b2lkIDAhPT1lLmJldmVsU2l6ZT9lLmJldmVsU2l6ZTp2YS0yLHNhPXZvaWQgMCE9PWUuYmV2ZWxPZmZzZXQ/ZS5iZXZlbE9mZnNldDowLERhPXZvaWQgMCE9PWUuYmV2ZWxTZWdtZW50cz9lLmJldmVsU2VnbWVudHM6MyxIYT1lLmV4dHJ1ZGVQYXRoLEthPXZvaWQgMCE9PWUuVVZHZW5lcmF0b3I/ZS5VVkdlbmVyYXRvcjokbzt2b2lkIDAhPT1lLmFtb3VudCYmKGNvbnNvbGUud2FybigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBhbW91bnQgaGFzIGJlZW4gcmVuYW1lZCB0byBkZXB0aC4iKSx0YT0KZS5hbW91bnQpO3ZhciBOYT0hMTtpZihIYSl7dmFyIExhPUhhLmdldFNwYWNlZFBvaW50cyhpYSk7TmE9ITA7bmE9ITE7dmFyIGZiPUhhLmNvbXB1dGVGcmVuZXRGcmFtZXMoaWEsITEpO3ZhciBjYj1uZXcgZzt2YXIgSmE9bmV3IGc7dmFyIGhiPW5ldyBnfW5hfHwoc2E9QmE9dmE9RGE9MCk7dmFyIFVhO3JhPUguZXh0cmFjdFBvaW50cyhyYSk7SD1yYS5zaGFwZTt2YXIgSGI9cmEuaG9sZXM7aWYoIXlkLmlzQ2xvY2tXaXNlKEgpKXtIPUgucmV2ZXJzZSgpO3ZhciBxYj0wO2ZvcihVYT1IYi5sZW5ndGg7cWI8VWE7cWIrKyl7dmFyIGphPUhiW3FiXTt5ZC5pc0Nsb2NrV2lzZShqYSkmJihIYltxYl09amEucmV2ZXJzZSgpKX19dmFyIHBhPXlkLnRyaWFuZ3VsYXRlU2hhcGUoSCxIYikseWE9SDtxYj0wO2ZvcihVYT1IYi5sZW5ndGg7cWI8VWE7cWIrKylqYT1IYltxYl0sSD1ILmNvbmNhdChqYSk7dmFyIFZhLFphPUgubGVuZ3RoLFRhLGliPXBhLmxlbmd0aDtyYT1bXTt2YXIgbWE9MDt2YXIgSWE9CnlhLmxlbmd0aDt2YXIgT2E9SWEtMTtmb3IoVmE9bWErMTttYTxJYTttYSsrLE9hKyssVmErKylPYT09PUlhJiYoT2E9MCksVmE9PT1JYSYmKFZhPTApLHJhW21hXT1PKHlhW21hXSx5YVtPYV0seWFbVmFdKTtIYT1bXTt2YXIgdWI9cmEuY29uY2F0KCk7cWI9MDtmb3IoVWE9SGIubGVuZ3RoO3FiPFVhO3FiKyspe2phPUhiW3FiXTt2YXIgYWI9W107bWE9MDtJYT1qYS5sZW5ndGg7T2E9SWEtMTtmb3IoVmE9bWErMTttYTxJYTttYSsrLE9hKyssVmErKylPYT09PUlhJiYoT2E9MCksVmE9PT1JYSYmKFZhPTApLGFiW21hXT1PKGphW21hXSxqYVtPYV0samFbVmFdKTtIYS5wdXNoKGFiKTt1Yj11Yi5jb25jYXQoYWIpfWZvcihPYT0wO09hPERhO09hKyspe0lhPU9hL0RhO3ZhciBLYj12YSpNYXRoLmNvcyhJYSpNYXRoLlBJLzIpO1ZhPUJhKk1hdGguc2luKElhKk1hdGguUEkvMikrc2E7bWE9MDtmb3IoSWE9eWEubGVuZ3RoO21hPElhO21hKyspe3ZhciBsYj1JKHlhW21hXSxyYVttYV0sVmEpOwpSKGxiLngsbGIueSwtS2IpfXFiPTA7Zm9yKFVhPUhiLmxlbmd0aDtxYjxVYTtxYisrKWZvcihqYT1IYltxYl0sYWI9SGFbcWJdLG1hPTAsSWE9amEubGVuZ3RoO21hPElhO21hKyspbGI9SShqYVttYV0sYWJbbWFdLFZhKSxSKGxiLngsbGIueSwtS2IpfVZhPUJhK3NhO2ZvcihtYT0wO21hPFphO21hKyspbGI9bmE/SShIW21hXSx1YlttYV0sVmEpOkhbbWFdLE5hPyhKYS5jb3B5KGZiLm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGxiLngpLGNiLmNvcHkoZmIuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihsYi55KSxoYi5jb3B5KExhWzBdKS5hZGQoSmEpLmFkZChjYiksUihoYi54LGhiLnksaGIueikpOlIobGIueCxsYi55LDApO2ZvcihJYT0xO0lhPD1pYTtJYSsrKWZvcihtYT0wO21hPFphO21hKyspbGI9bmE/SShIW21hXSx1YlttYV0sVmEpOkhbbWFdLE5hPyhKYS5jb3B5KGZiLm5vcm1hbHNbSWFdKS5tdWx0aXBseVNjYWxhcihsYi54KSxjYi5jb3B5KGZiLmJpbm9ybWFsc1tJYV0pLm11bHRpcGx5U2NhbGFyKGxiLnkpLApoYi5jb3B5KExhW0lhXSkuYWRkKEphKS5hZGQoY2IpLFIoaGIueCxoYi55LGhiLnopKTpSKGxiLngsbGIueSx0YS9pYSpJYSk7Zm9yKE9hPURhLTE7MDw9T2E7T2EtLSl7SWE9T2EvRGE7S2I9dmEqTWF0aC5jb3MoSWEqTWF0aC5QSS8yKTtWYT1CYSpNYXRoLnNpbihJYSpNYXRoLlBJLzIpK3NhO21hPTA7Zm9yKElhPXlhLmxlbmd0aDttYTxJYTttYSsrKWxiPUkoeWFbbWFdLHJhW21hXSxWYSksUihsYi54LGxiLnksdGErS2IpO3FiPTA7Zm9yKFVhPUhiLmxlbmd0aDtxYjxVYTtxYisrKWZvcihqYT1IYltxYl0sYWI9SGFbcWJdLG1hPTAsSWE9amEubGVuZ3RoO21hPElhO21hKyspbGI9SShqYVttYV0sYWJbbWFdLFZhKSxOYT9SKGxiLngsbGIueStMYVtpYS0xXS55LExhW2lhLTFdLngrS2IpOlIobGIueCxsYi55LHRhK0tiKX0oZnVuY3Rpb24oKXt2YXIgUWE9dS5sZW5ndGgvMztpZihuYSl7dmFyIG5iPTAqWmE7Zm9yKG1hPTA7bWE8aWI7bWErKylUYT1wYVttYV0sVShUYVsyXStuYiwKVGFbMV0rbmIsVGFbMF0rbmIpO25iPVphKihpYSsyKkRhKTtmb3IobWE9MDttYTxpYjttYSsrKVRhPXBhW21hXSxVKFRhWzBdK25iLFRhWzFdK25iLFRhWzJdK25iKX1lbHNle2ZvcihtYT0wO21hPGliO21hKyspVGE9cGFbbWFdLFUoVGFbMl0sVGFbMV0sVGFbMF0pO2ZvcihtYT0wO21hPGliO21hKyspVGE9cGFbbWFdLFUoVGFbMF0rWmEqaWEsVGFbMV0rWmEqaWEsVGFbMl0rWmEqaWEpfW4uYWRkR3JvdXAoUWEsdS5sZW5ndGgvMy1RYSwwKX0pKCk7KGZ1bmN0aW9uKCl7dmFyIFFhPXUubGVuZ3RoLzMsbmI9MDtRKHlhLG5iKTtuYis9eWEubGVuZ3RoO3FiPTA7Zm9yKFVhPUhiLmxlbmd0aDtxYjxVYTtxYisrKWphPUhiW3FiXSxRKGphLG5iKSxuYis9amEubGVuZ3RoO24uYWRkR3JvdXAoUWEsdS5sZW5ndGgvMy1RYSwxKX0pKCl9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YixvcHRpb25zOmV9O2I9CkFycmF5LmlzQXJyYXkoYik/YjpbYl07Zm9yKHZhciBuPXRoaXMsdT1bXSx3PVtdLHo9MCxFPWIubGVuZ3RoO3o8RTt6KyspaChiW3pdKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh1LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYSh3LDIpKTt0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9ZnVuY3Rpb24gQ2woYixlLGgpe2guc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYikpZm9yKHZhciBuPTAsdT1iLmxlbmd0aDtuPHU7bisrKWguc2hhcGVzLnB1c2goYltuXS51dWlkKTtlbHNlIGguc2hhcGVzLnB1c2goYi51dWlkKTt2b2lkIDAhPT1lLmV4dHJ1ZGVQYXRoJiYoaC5vcHRpb25zLmV4dHJ1ZGVQYXRoPWUuZXh0cnVkZVBhdGgudG9KU09OKCkpO3JldHVybiBofWZ1bmN0aW9uIGpnKGIsZSl7Ti5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV4dEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3RleHQ6YixwYXJhbWV0ZXJzOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyAkZShiLAplKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gJGUoYixlKXtlPWV8fHt9O3ZhciBoPWUuZm9udDtpZighaHx8IWguaXNGb250KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LiIpLG5ldyBOO2I9aC5nZW5lcmF0ZVNoYXBlcyhiLGUuc2l6ZSk7ZS5kZXB0aD12b2lkIDAhPT1lLmhlaWdodD9lLmhlaWdodDo1MDt2b2lkIDA9PT1lLmJldmVsVGhpY2tuZXNzJiYoZS5iZXZlbFRoaWNrbmVzcz0xMCk7dm9pZCAwPT09ZS5iZXZlbFNpemUmJihlLmJldmVsU2l6ZT04KTt2b2lkIDA9PT1lLmJldmVsRW5hYmxlZCYmKGUuYmV2ZWxFbmFibGVkPSExKTttZC5jYWxsKHRoaXMsYixlKTt0aGlzLnR5cGU9IlRleHRCdWZmZXJHZW9tZXRyeSJ9ZnVuY3Rpb24ga2coYixlLGgsbix1LHcseil7Ti5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz0Ke3JhZGl1czpiLHdpZHRoU2VnbWVudHM6ZSxoZWlnaHRTZWdtZW50czpoLHBoaVN0YXJ0Om4scGhpTGVuZ3RoOnUsdGhldGFTdGFydDp3LHRoZXRhTGVuZ3RoOnp9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBXZChiLGUsaCxuLHUsdyx6KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gV2QoYixlLGgsbix1LHcseil7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNwaGVyZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLHdpZHRoU2VnbWVudHM6ZSxoZWlnaHRTZWdtZW50czpoLHBoaVN0YXJ0Om4scGhpTGVuZ3RoOnUsdGhldGFTdGFydDp3LHRoZXRhTGVuZ3RoOnp9O2I9Ynx8MTtlPU1hdGgubWF4KDMsTWF0aC5mbG9vcihlKXx8OCk7aD1NYXRoLm1heCgyLE1hdGguZmxvb3IoaCl8fDYpO249dm9pZCAwIT09bj9uOjA7dT12b2lkIDAhPT11P3U6MipNYXRoLlBJO3c9dm9pZCAwIT09dz93OjA7ej12b2lkIDAhPT16P3o6TWF0aC5QSTt2YXIgRT0Kdyt6LEgsSSxPPTAsUT1bXSxSPW5ldyBnLFU9bmV3IGcsVz1bXSxaPVtdLGZhPVtdLHFhPVtdO2ZvcihJPTA7STw9aDtJKyspe3ZhciByYT1bXSxpYT1JL2gsdGE9MD09ST8uNS9lOkk9PWg/LS41L2U6MDtmb3IoSD0wO0g8PWU7SCsrKXt2YXIgbmE9SC9lO1IueD0tYipNYXRoLmNvcyhuK25hKnUpKk1hdGguc2luKHcraWEqeik7Ui55PWIqTWF0aC5jb3ModytpYSp6KTtSLno9YipNYXRoLnNpbihuK25hKnUpKk1hdGguc2luKHcraWEqeik7Wi5wdXNoKFIueCxSLnksUi56KTtVLmNvcHkoUikubm9ybWFsaXplKCk7ZmEucHVzaChVLngsVS55LFUueik7cWEucHVzaChuYSt0YSwxLWlhKTtyYS5wdXNoKE8rKyl9US5wdXNoKHJhKX1mb3IoST0wO0k8aDtJKyspZm9yKEg9MDtIPGU7SCsrKWI9UVtJXVtIKzFdLG49UVtJXVtIXSx1PVFbSSsxXVtIXSx6PVFbSSsxXVtIKzFdLCgwIT09SXx8MDx3KSYmVy5wdXNoKGIsbix6KSwoSSE9PWgtMXx8RTxNYXRoLlBJKSYmVy5wdXNoKG4sdSx6KTt0aGlzLnNldEluZGV4KFcpOwp0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShaLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoZmEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKHFhLDIpKX1mdW5jdGlvbiBsZyhiLGUsaCxuLHUsdyl7Ti5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmIsb3V0ZXJSYWRpdXM6ZSx0aGV0YVNlZ21lbnRzOmgscGhpU2VnbWVudHM6bix0aGV0YVN0YXJ0OnUsdGhldGFMZW5ndGg6d307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IGFmKGIsZSxoLG4sdSx3KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gYWYoYixlLGgsbix1LHcpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJSaW5nQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17aW5uZXJSYWRpdXM6YixvdXRlclJhZGl1czplLHRoZXRhU2VnbWVudHM6aCxwaGlTZWdtZW50czpuLHRoZXRhU3RhcnQ6dSwKdGhldGFMZW5ndGg6d307Yj1ifHwuNTtlPWV8fDE7dT12b2lkIDAhPT11P3U6MDt3PXZvaWQgMCE9PXc/dzoyKk1hdGguUEk7aD12b2lkIDAhPT1oP01hdGgubWF4KDMsaCk6ODtuPXZvaWQgMCE9PW4/TWF0aC5tYXgoMSxuKToxO3ZhciB6PVtdLEU9W10sSD1bXSxJPVtdLE89YixRPShlLWIpL24sUj1uZXcgZyxVPW5ldyBkLFcsWjtmb3IoVz0wO1c8PW47VysrKXtmb3IoWj0wO1o8PWg7WisrKWI9dStaL2gqdyxSLng9TypNYXRoLmNvcyhiKSxSLnk9TypNYXRoLnNpbihiKSxFLnB1c2goUi54LFIueSxSLnopLEgucHVzaCgwLDAsMSksVS54PShSLngvZSsxKS8yLFUueT0oUi55L2UrMSkvMixJLnB1c2goVS54LFUueSk7Tys9UX1mb3IoVz0wO1c8bjtXKyspZm9yKGU9VyooaCsxKSxaPTA7WjxoO1orKyliPVorZSx1PWIraCsxLHc9YitoKzIsTz1iKzEsei5wdXNoKGIsdSxPKSx6LnB1c2godSx3LE8pO3RoaXMuc2V0SW5kZXgoeik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoRSwKMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBiYShILDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShJLDIpKX1mdW5jdGlvbiBtZyhiLGUsaCxuKXtOLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMYXRoZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3BvaW50czpiLHNlZ21lbnRzOmUscGhpU3RhcnQ6aCxwaGlMZW5ndGg6bn07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IGJmKGIsZSxoLG4pKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBiZihiLGUsaCxuKXt4YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGF0aGVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6YixzZWdtZW50czplLHBoaVN0YXJ0OmgscGhpTGVuZ3RoOm59O2U9TWF0aC5mbG9vcihlKXx8MTI7aD1ofHwwO249bnx8MipNYXRoLlBJO249b2IuY2xhbXAobiwwLDIqTWF0aC5QSSk7dmFyIHU9W10sdz1bXSx6PVtdLEU9MS9lLEg9bmV3IGcsST1uZXcgZCxPOwpmb3IoTz0wO088PWU7TysrKXt2YXIgUT1oK08qRSpuO3ZhciBSPU1hdGguc2luKFEpLFU9TWF0aC5jb3MoUSk7Zm9yKFE9MDtRPD1iLmxlbmd0aC0xO1ErKylILng9YltRXS54KlIsSC55PWJbUV0ueSxILno9YltRXS54KlUsdy5wdXNoKEgueCxILnksSC56KSxJLng9Ty9lLEkueT1RLyhiLmxlbmd0aC0xKSx6LnB1c2goSS54LEkueSl9Zm9yKE89MDtPPGU7TysrKWZvcihRPTA7UTxiLmxlbmd0aC0xO1ErKyloPVErTypiLmxlbmd0aCxFPWgrYi5sZW5ndGgsSD1oK2IubGVuZ3RoKzEsST1oKzEsdS5wdXNoKGgsRSxJKSx1LnB1c2goRSxILEkpO3RoaXMuc2V0SW5kZXgodSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEodywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoeiwyKSk7dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2lmKG49PT0yKk1hdGguUEkpZm9yKG49dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbC5hcnJheSx1PW5ldyBnLHc9bmV3IGcsej0KbmV3IGcsaD1lKmIubGVuZ3RoKjMsUT1PPTA7TzxiLmxlbmd0aDtPKyssUSs9Myl1Lng9bltRKzBdLHUueT1uW1ErMV0sdS56PW5bUSsyXSx3Lng9bltoK1ErMF0sdy55PW5baCtRKzFdLHcuej1uW2grUSsyXSx6LmFkZFZlY3RvcnModSx3KS5ub3JtYWxpemUoKSxuW1ErMF09bltoK1ErMF09ei54LG5bUSsxXT1uW2grUSsxXT16LnksbltRKzJdPW5baCtRKzJdPXouen1mdW5jdGlvbiBtZShiLGUpe04uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlR2VvbWV0cnkiOyJvYmplY3QiPT09dHlwZW9mIGUmJihjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuIiksZT1lLmN1cnZlU2VnbWVudHMpO3RoaXMucGFyYW1ldGVycz17c2hhcGVzOmIsY3VydmVTZWdtZW50czplfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgbmUoYixlKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gbmUoYixlKXtmdW5jdGlvbiBoKE8pe3ZhciBRLApSPXUubGVuZ3RoLzM7Tz1PLmV4dHJhY3RQb2ludHMoZSk7dmFyIFU9Ty5zaGFwZSxXPU8uaG9sZXM7ITE9PT15ZC5pc0Nsb2NrV2lzZShVKSYmKFU9VS5yZXZlcnNlKCkpO089MDtmb3IoUT1XLmxlbmd0aDtPPFE7TysrKXt2YXIgWj1XW09dOyEwPT09eWQuaXNDbG9ja1dpc2UoWikmJihXW09dPVoucmV2ZXJzZSgpKX12YXIgZmE9eWQudHJpYW5ndWxhdGVTaGFwZShVLFcpO089MDtmb3IoUT1XLmxlbmd0aDtPPFE7TysrKVo9V1tPXSxVPVUuY29uY2F0KFopO089MDtmb3IoUT1VLmxlbmd0aDtPPFE7TysrKVo9VVtPXSx1LnB1c2goWi54LFoueSwwKSx3LnB1c2goMCwwLDEpLHoucHVzaChaLngsWi55KTtPPTA7Zm9yKFE9ZmEubGVuZ3RoO088UTtPKyspVT1mYVtPXSxuLnB1c2goVVswXStSLFVbMV0rUixVWzJdK1IpLEgrPTN9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17c2hhcGVzOmIsY3VydmVTZWdtZW50czplfTsKZT1lfHwxMjt2YXIgbj1bXSx1PVtdLHc9W10sej1bXSxFPTAsSD0wO2lmKCExPT09QXJyYXkuaXNBcnJheShiKSloKGIpO2Vsc2UgZm9yKHZhciBJPTA7STxiLmxlbmd0aDtJKyspaChiW0ldKSx0aGlzLmFkZEdyb3VwKEUsSCxJKSxFKz1ILEg9MDt0aGlzLnNldEluZGV4KG4pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKHUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBiYSh3LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYSh6LDIpKX1mdW5jdGlvbiBEbChiLGUpe2Uuc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYikpZm9yKHZhciBoPTAsbj1iLmxlbmd0aDtoPG47aCsrKWUuc2hhcGVzLnB1c2goYltoXS51dWlkKTtlbHNlIGUuc2hhcGVzLnB1c2goYi51dWlkKTtyZXR1cm4gZX1mdW5jdGlvbiBjZihiLGUpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJFZGdlc0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3RocmVzaG9sZEFuZ2xlOmV9Owp2YXIgaD1bXTtlPU1hdGguY29zKG9iLkRFRzJSQUQqKHZvaWQgMCE9PWU/ZToxKSk7dmFyIG49WzAsMF0sdT17fSx3PVsiYSIsImIiLCJjIl07aWYoYi5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgej1uZXcgTjt6LmZyb21CdWZmZXJHZW9tZXRyeShiKX1lbHNlIHo9Yi5jbG9uZSgpO3oubWVyZ2VWZXJ0aWNlcygpO3ouY29tcHV0ZUZhY2VOb3JtYWxzKCk7Yj16LnZlcnRpY2VzO3o9ei5mYWNlcztmb3IodmFyIEU9MCxIPXoubGVuZ3RoO0U8SDtFKyspZm9yKHZhciBJPXpbRV0sTz0wOzM+TztPKyspe3ZhciBRPUlbd1tPXV07dmFyIFI9SVt3WyhPKzEpJTNdXTtuWzBdPU1hdGgubWluKFEsUik7blsxXT1NYXRoLm1heChRLFIpO1E9blswXSsiLCIrblsxXTt2b2lkIDA9PT11W1FdP3VbUV09e2luZGV4MTpuWzBdLGluZGV4MjpuWzFdLGZhY2UxOkUsZmFjZTI6dm9pZCAwfTp1W1FdLmZhY2UyPUV9Zm9yKFEgaW4gdSlpZihuPXVbUV0sdm9pZCAwPT09bi5mYWNlMnx8eltuLmZhY2UxXS5ub3JtYWwuZG90KHpbbi5mYWNlMl0ubm9ybWFsKTw9CmUpdz1iW24uaW5kZXgxXSxoLnB1c2gody54LHcueSx3LnopLHc9YltuLmluZGV4Ml0saC5wdXNoKHcueCx3Lnksdy56KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShoLDMpKX1mdW5jdGlvbiBvZShiLGUsaCxuLHUsdyx6LEUpe04uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmIscmFkaXVzQm90dG9tOmUsaGVpZ2h0OmgscmFkaWFsU2VnbWVudHM6bixoZWlnaHRTZWdtZW50czp1LG9wZW5FbmRlZDp3LHRoZXRhU3RhcnQ6eix0aGV0YUxlbmd0aDpFfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgemQoYixlLGgsbix1LHcseixFKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gemQoYixlLGgsbix1LHcseixFKXtmdW5jdGlvbiBIKHJhKXt2YXIgaWEsdGE9bmV3IGQsbmE9bmV3IGcsdmE9MCxCYT0hMD09PXJhP2I6ZSxzYT0hMD09PXJhPzE6LTE7dmFyIERhPVc7Zm9yKGlhPQoxO2lhPD1uO2lhKyspUS5wdXNoKDAsZmEqc2EsMCksUi5wdXNoKDAsc2EsMCksVS5wdXNoKC41LC41KSxXKys7dmFyIEhhPVc7Zm9yKGlhPTA7aWE8PW47aWErKyl7dmFyIEthPWlhL24qRSt6LE5hPU1hdGguY29zKEthKTtLYT1NYXRoLnNpbihLYSk7bmEueD1CYSpLYTtuYS55PWZhKnNhO25hLno9QmEqTmE7US5wdXNoKG5hLngsbmEueSxuYS56KTtSLnB1c2goMCxzYSwwKTt0YS54PS41Kk5hKy41O3RhLnk9LjUqS2Eqc2ErLjU7VS5wdXNoKHRhLngsdGEueSk7VysrfWZvcihpYT0wO2lhPG47aWErKyl0YT1EYStpYSxuYT1IYStpYSwhMD09PXJhP08ucHVzaChuYSxuYSsxLHRhKTpPLnB1c2gobmErMSxuYSx0YSksdmErPTM7SS5hZGRHcm91cChxYSx2YSwhMD09PXJhPzE6Mik7cWErPXZhfXhhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1c1RvcDpiLHJhZGl1c0JvdHRvbTplLGhlaWdodDpoLHJhZGlhbFNlZ21lbnRzOm4sCmhlaWdodFNlZ21lbnRzOnUsb3BlbkVuZGVkOncsdGhldGFTdGFydDp6LHRoZXRhTGVuZ3RoOkV9O3ZhciBJPXRoaXM7Yj12b2lkIDAhPT1iP2I6MTtlPXZvaWQgMCE9PWU/ZToxO2g9aHx8MTtuPU1hdGguZmxvb3Iobil8fDg7dT1NYXRoLmZsb29yKHUpfHwxO3c9dm9pZCAwIT09dz93OiExO3o9dm9pZCAwIT09ej96OjA7RT12b2lkIDAhPT1FP0U6MipNYXRoLlBJO3ZhciBPPVtdLFE9W10sUj1bXSxVPVtdLFc9MCxaPVtdLGZhPWgvMixxYT0wOyhmdW5jdGlvbigpe3ZhciByYSxpYSx0YT1uZXcgZyxuYT1uZXcgZyx2YT0wLEJhPShlLWIpL2g7Zm9yKGlhPTA7aWE8PXU7aWErKyl7dmFyIHNhPVtdLERhPWlhL3UsSGE9RGEqKGUtYikrYjtmb3IocmE9MDtyYTw9bjtyYSsrKXt2YXIgS2E9cmEvbixOYT1LYSpFK3osTGE9TWF0aC5zaW4oTmEpO05hPU1hdGguY29zKE5hKTtuYS54PUhhKkxhO25hLnk9LURhKmgrZmE7bmEuej1IYSpOYTtRLnB1c2gobmEueCxuYS55LG5hLnopO3RhLnNldChMYSwKQmEsTmEpLm5vcm1hbGl6ZSgpO1IucHVzaCh0YS54LHRhLnksdGEueik7VS5wdXNoKEthLDEtRGEpO3NhLnB1c2goVysrKX1aLnB1c2goc2EpfWZvcihyYT0wO3JhPG47cmErKylmb3IoaWE9MDtpYTx1O2lhKyspdGE9WltpYSsxXVtyYV0sbmE9WltpYSsxXVtyYSsxXSxCYT1aW2lhXVtyYSsxXSxPLnB1c2goWltpYV1bcmFdLHRhLEJhKSxPLnB1c2godGEsbmEsQmEpLHZhKz02O0kuYWRkR3JvdXAocWEsdmEsMCk7cWErPXZhfSkoKTshMT09PXcmJigwPGImJkgoITApLDA8ZSYmSCghMSkpO3RoaXMuc2V0SW5kZXgoTyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoUSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGJhKFIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKFUsMikpfWZ1bmN0aW9uIG5nKGIsZSxoLG4sdSx3LHope29lLmNhbGwodGhpcywwLGIsZSxoLG4sdSx3LHopO3RoaXMudHlwZT0iQ29uZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6YixoZWlnaHQ6ZSxyYWRpYWxTZWdtZW50czpoLGhlaWdodFNlZ21lbnRzOm4sb3BlbkVuZGVkOnUsdGhldGFTdGFydDp3LHRoZXRhTGVuZ3RoOnp9fWZ1bmN0aW9uIG9nKGIsZSxoLG4sdSx3LHope3pkLmNhbGwodGhpcywwLGIsZSxoLG4sdSx3LHopO3RoaXMudHlwZT0iQ29uZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOmgsaGVpZ2h0U2VnbWVudHM6bixvcGVuRW5kZWQ6dSx0aGV0YVN0YXJ0OncsdGhldGFMZW5ndGg6en19ZnVuY3Rpb24gcGcoYixlLGgsbil7Ti5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsc2VnbWVudHM6ZSx0aGV0YVN0YXJ0OmgsdGhldGFMZW5ndGg6bn07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IGRmKGIsZSxoLG4pKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBkZihiLGUsaCxuKXt4YS5jYWxsKHRoaXMpOwp0aGlzLnR5cGU9IkNpcmNsZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLHNlZ21lbnRzOmUsdGhldGFTdGFydDpoLHRoZXRhTGVuZ3RoOm59O2I9Ynx8MTtlPXZvaWQgMCE9PWU/TWF0aC5tYXgoMyxlKTo4O2g9dm9pZCAwIT09aD9oOjA7bj12b2lkIDAhPT1uP246MipNYXRoLlBJO3ZhciB1PVtdLHc9W10sej1bXSxFPVtdLEgsST1uZXcgZyxPPW5ldyBkO3cucHVzaCgwLDAsMCk7ei5wdXNoKDAsMCwxKTtFLnB1c2goLjUsLjUpO3ZhciBRPTA7Zm9yKEg9MztRPD1lO1ErKyxIKz0zKXt2YXIgUj1oK1EvZSpuO0kueD1iKk1hdGguY29zKFIpO0kueT1iKk1hdGguc2luKFIpO3cucHVzaChJLngsSS55LEkueik7ei5wdXNoKDAsMCwxKTtPLng9KHdbSF0vYisxKS8yO08ueT0od1tIKzFdL2IrMSkvMjtFLnB1c2goTy54LE8ueSl9Zm9yKEg9MTtIPD1lO0grKyl1LnB1c2goSCxIKzEsMCk7dGhpcy5zZXRJbmRleCh1KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLApuZXcgYmEodywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGJhKHosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKEUsMikpfWZ1bmN0aW9uIHBlKGIpe0dhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTaGFkb3dNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgQigwKTt0aGlzLnRyYW5zcGFyZW50PSEwO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIGVmKGIpe2RiLmNhbGwodGhpcyxiKTt0aGlzLnR5cGU9IlJhd1NoYWRlck1hdGVyaWFsIn1mdW5jdGlvbiBuZChiKXtHYS5jYWxsKHRoaXMpO3RoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiJ9O3RoaXMudHlwZT0iTWVzaFN0YW5kYXJkTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEIoMTY3NzcyMTUpO3RoaXMubWV0YWxuZXNzPXRoaXMucm91Z2huZXNzPS41O3RoaXMubGlnaHRNYXA9dGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9CjE7dGhpcy5lbWlzc2l2ZT1uZXcgQigwKTt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTE7dGhpcy5idW1wTWFwPXRoaXMuZW1pc3NpdmVNYXA9bnVsbDt0aGlzLmJ1bXBTY2FsZT0xO3RoaXMubm9ybWFsTWFwPW51bGw7dGhpcy5ub3JtYWxNYXBUeXBlPTA7dGhpcy5ub3JtYWxTY2FsZT1uZXcgZCgxLDEpO3RoaXMuZGlzcGxhY2VtZW50TWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMuZW52TWFwPXRoaXMuYWxwaGFNYXA9dGhpcy5tZXRhbG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXA9bnVsbDt0aGlzLmVudk1hcEludGVuc2l0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCI7dGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0KITE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gcWUoYil7bmQuY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1BIWVNJQ0FMOiIifTt0aGlzLnR5cGU9Ik1lc2hQaHlzaWNhbE1hdGVyaWFsIjt0aGlzLnJlZmxlY3Rpdml0eT0uNTt0aGlzLmNsZWFyQ29hdFJvdWdobmVzcz10aGlzLmNsZWFyQ29hdD0wO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIFRjKGIpe0dhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoUGhvbmdNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgQigxNjc3NzIxNSk7dGhpcy5zcGVjdWxhcj1uZXcgQigxMTE4NDgxKTt0aGlzLnNoaW5pbmVzcz0zMDt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPW51bGw7dGhpcy5saWdodE1hcEludGVuc2l0eT0xO3RoaXMuYW9NYXA9bnVsbDt0aGlzLmFvTWFwSW50ZW5zaXR5PTE7dGhpcy5lbWlzc2l2ZT1uZXcgQigwKTt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTE7dGhpcy5idW1wTWFwPXRoaXMuZW1pc3NpdmVNYXA9bnVsbDt0aGlzLmJ1bXBTY2FsZT0KMTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGQoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCI7dGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhiKX1mdW5jdGlvbiByZShiKXtUYy5jYWxsKHRoaXMpO3RoaXMuZGVmaW5lcz17VE9PTjoiIn07dGhpcy50eXBlPSJNZXNoVG9vbk1hdGVyaWFsIjsKdGhpcy5ncmFkaWVudE1hcD1udWxsO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIHNlKGIpe0dhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoTm9ybWFsTWF0ZXJpYWwiO3RoaXMuYnVtcE1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBkKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIHRlKGIpe0dhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoTGFtYmVydE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBCKDE2Nzc3MjE1KTsKdGhpcy5saWdodE1hcD10aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEIoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuZW52TWFwPXRoaXMuYWxwaGFNYXA9dGhpcy5zcGVjdWxhck1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5jb21iaW5lPTA7dGhpcy5yZWZsZWN0aXZpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gdWUoYil7R2EuY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e01BVENBUDoiIn07dGhpcy50eXBlPSJNZXNoTWF0Y2FwTWF0ZXJpYWwiOwp0aGlzLmNvbG9yPW5ldyBCKDE2Nzc3MjE1KTt0aGlzLmJ1bXBNYXA9dGhpcy5tYXA9dGhpcy5tYXRjYXA9bnVsbDt0aGlzLmJ1bXBTY2FsZT0xO3RoaXMubm9ybWFsTWFwPW51bGw7dGhpcy5ub3JtYWxNYXBUeXBlPTA7dGhpcy5ub3JtYWxTY2FsZT1uZXcgZCgxLDEpO3RoaXMuZGlzcGxhY2VtZW50TWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMuYWxwaGFNYXA9bnVsbDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIHZlKGIpe0xiLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lRGFzaGVkTWF0ZXJpYWwiO3RoaXMuc2NhbGU9MTt0aGlzLmRhc2hTaXplPTM7dGhpcy5nYXBTaXplPTE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gRGMoYixlLGgsbil7dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM9Yjt0aGlzLl9jYWNoZWRJbmRleD0KMDt0aGlzLnJlc3VsdEJ1ZmZlcj12b2lkIDAhPT1uP246bmV3IGUuY29uc3RydWN0b3IoaCk7dGhpcy5zYW1wbGVWYWx1ZXM9ZTt0aGlzLnZhbHVlU2l6ZT1ofWZ1bmN0aW9uIG1oKGIsZSxoLG4pe0RjLmNhbGwodGhpcyxiLGUsaCxuKTt0aGlzLl9vZmZzZXROZXh0PXRoaXMuX3dlaWdodE5leHQ9dGhpcy5fb2Zmc2V0UHJldj10aGlzLl93ZWlnaHRQcmV2PS0wfWZ1bmN0aW9uIHFnKGIsZSxoLG4pe0RjLmNhbGwodGhpcyxiLGUsaCxuKX1mdW5jdGlvbiBuaChiLGUsaCxuKXtEYy5jYWxsKHRoaXMsYixlLGgsbil9ZnVuY3Rpb24gbWMoYixlLGgsbil7aWYodm9pZCAwPT09Yil0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQiKTtpZih2b2lkIDA9PT1lfHwwPT09ZS5sZW5ndGgpdGhyb3cgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAiK2IpO3RoaXMubmFtZT1iO3RoaXMudGltZXM9CmdjLmNvbnZlcnRBcnJheShlLHRoaXMuVGltZUJ1ZmZlclR5cGUpO3RoaXMudmFsdWVzPWdjLmNvbnZlcnRBcnJheShoLHRoaXMuVmFsdWVCdWZmZXJUeXBlKTt0aGlzLnNldEludGVycG9sYXRpb24obnx8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gb2goYixlLGgpe21jLmNhbGwodGhpcyxiLGUsaCl9ZnVuY3Rpb24gcGgoYixlLGgsbil7bWMuY2FsbCh0aGlzLGIsZSxoLG4pfWZ1bmN0aW9uIGZmKGIsZSxoLG4pe21jLmNhbGwodGhpcyxiLGUsaCxuKX1mdW5jdGlvbiBxaChiLGUsaCxuKXtEYy5jYWxsKHRoaXMsYixlLGgsbil9ZnVuY3Rpb24gcmcoYixlLGgsbil7bWMuY2FsbCh0aGlzLGIsZSxoLG4pfWZ1bmN0aW9uIHJoKGIsZSxoLG4pe21jLmNhbGwodGhpcyxiLGUsaCxuKX1mdW5jdGlvbiBnZihiLGUsaCxuKXttYy5jYWxsKHRoaXMsYixlLGgsbil9ZnVuY3Rpb24gSWMoYixlLGgpe3RoaXMubmFtZT1iO3RoaXMudHJhY2tzPWg7dGhpcy5kdXJhdGlvbj12b2lkIDAhPT0KZT9lOi0xO3RoaXMudXVpZD1vYi5nZW5lcmF0ZVVVSUQoKTswPnRoaXMuZHVyYXRpb24mJnRoaXMucmVzZXREdXJhdGlvbigpfWZ1bmN0aW9uIGFwKGIpe3N3aXRjaChiLnRvTG93ZXJDYXNlKCkpe2Nhc2UgInNjYWxhciI6Y2FzZSAiZG91YmxlIjpjYXNlICJmbG9hdCI6Y2FzZSAibnVtYmVyIjpjYXNlICJpbnRlZ2VyIjpyZXR1cm4gZmY7Y2FzZSAidmVjdG9yIjpjYXNlICJ2ZWN0b3IyIjpjYXNlICJ2ZWN0b3IzIjpjYXNlICJ2ZWN0b3I0IjpyZXR1cm4gZ2Y7Y2FzZSAiY29sb3IiOnJldHVybiBwaDtjYXNlICJxdWF0ZXJuaW9uIjpyZXR1cm4gcmc7Y2FzZSAiYm9vbCI6Y2FzZSAiYm9vbGVhbiI6cmV0dXJuIG9oO2Nhc2UgInN0cmluZyI6cmV0dXJuIHJofXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIitiKTt9ZnVuY3Rpb24gYnAoYil7aWYodm9pZCAwPT09Yi50eXBlKXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZSIpOwp2YXIgZT1hcChiLnR5cGUpO2lmKHZvaWQgMD09PWIudGltZXMpe3ZhciBoPVtdLG49W107Z2MuZmxhdHRlbkpTT04oYi5rZXlzLGgsbiwidmFsdWUiKTtiLnRpbWVzPWg7Yi52YWx1ZXM9bn1yZXR1cm4gdm9pZCAwIT09ZS5wYXJzZT9lLnBhcnNlKGIpOm5ldyBlKGIubmFtZSxiLnRpbWVzLGIudmFsdWVzLGIuaW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gRGkoYixlLGgpe3ZhciBuPXRoaXMsdT0hMSx3PTAsej0wLEU9dm9pZCAwO3RoaXMub25TdGFydD12b2lkIDA7dGhpcy5vbkxvYWQ9Yjt0aGlzLm9uUHJvZ3Jlc3M9ZTt0aGlzLm9uRXJyb3I9aDt0aGlzLml0ZW1TdGFydD1mdW5jdGlvbihIKXt6Kys7aWYoITE9PT11JiZ2b2lkIDAhPT1uLm9uU3RhcnQpbi5vblN0YXJ0KEgsdyx6KTt1PSEwfTt0aGlzLml0ZW1FbmQ9ZnVuY3Rpb24oSCl7dysrO2lmKHZvaWQgMCE9PW4ub25Qcm9ncmVzcyluLm9uUHJvZ3Jlc3MoSCx3LHopO2lmKHc9PT16JiYodT0hMSx2b2lkIDAhPT1uLm9uTG9hZCkpbi5vbkxvYWQoKX07CnRoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKEgpe2lmKHZvaWQgMCE9PW4ub25FcnJvciluLm9uRXJyb3IoSCl9O3RoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbihIKXtyZXR1cm4gRT9FKEgpOkh9O3RoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24oSCl7RT1IO3JldHVybiB0aGlzfX1mdW5jdGlvbiBVYyhiKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09Yj9iOkFjfWZ1bmN0aW9uIEVsKGIpe3RoaXMubWFuYWdlcj12b2lkIDAhPT1iP2I6QWN9ZnVuY3Rpb24gRmwoYil7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PWI/YjpBYzt0aGlzLl9wYXJzZXI9bnVsbH1mdW5jdGlvbiBFaShiKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09Yj9iOkFjO3RoaXMuX3BhcnNlcj1udWxsfWZ1bmN0aW9uIHNnKGIpe3RoaXMubWFuYWdlcj12b2lkIDAhPT1iP2I6QWN9ZnVuY3Rpb24gRmkoYil7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PWI/YjpBY31mdW5jdGlvbiBzaChiKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09Yj9iOkFjfQpmdW5jdGlvbiBlYigpe3RoaXMudHlwZT0iQ3VydmUiO3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPTIwMH1mdW5jdGlvbiBFYyhiLGUsaCxuLHUsdyx6LEUpe2ViLmNhbGwodGhpcyk7dGhpcy50eXBlPSJFbGxpcHNlQ3VydmUiO3RoaXMuYVg9Ynx8MDt0aGlzLmFZPWV8fDA7dGhpcy54UmFkaXVzPWh8fDE7dGhpcy55UmFkaXVzPW58fDE7dGhpcy5hU3RhcnRBbmdsZT11fHwwO3RoaXMuYUVuZEFuZ2xlPXd8fDIqTWF0aC5QSTt0aGlzLmFDbG9ja3dpc2U9enx8ITE7dGhpcy5hUm90YXRpb249RXx8MH1mdW5jdGlvbiBoZihiLGUsaCxuLHUsdyl7RWMuY2FsbCh0aGlzLGIsZSxoLGgsbix1LHcpO3RoaXMudHlwZT0iQXJjQ3VydmUifWZ1bmN0aW9uIEdpKCl7ZnVuY3Rpb24gYih3LHosRSxIKXtlPXc7aD1FO249LTMqdyszKnotMipFLUg7dT0yKnctMip6K0UrSH12YXIgZT0wLGg9MCxuPTAsdT0wO3JldHVybntpbml0Q2F0bXVsbFJvbTpmdW5jdGlvbih3LHosRSxILEkpe2IoeixFLEkqKEUtCncpLEkqKEgteikpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24odyx6LEUsSCxJLE8sUSl7Yih6LEUsKCh6LXcpL0ktKEUtdykvKEkrTykrKEUteikvTykqTywoKEUteikvTy0oSC16KS8oTytRKSsoSC1FKS9RKSpPKX0sY2FsYzpmdW5jdGlvbih3KXt2YXIgej13Knc7cmV0dXJuIGUraCp3K24qeit1Knoqd319fWZ1bmN0aW9uIHJjKGIsZSxoLG4pe2ViLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIjt0aGlzLnBvaW50cz1ifHxbXTt0aGlzLmNsb3NlZD1lfHwhMTt0aGlzLmN1cnZlVHlwZT1ofHwiY2VudHJpcGV0YWwiO3RoaXMudGVuc2lvbj1ufHwuNX1mdW5jdGlvbiBHbChiLGUsaCxuLHUpe2U9LjUqKG4tZSk7dT0uNSoodS1oKTt2YXIgdz1iKmI7cmV0dXJuKDIqaC0yKm4rZSt1KSpiKncrKC0zKmgrMypuLTIqZS11KSp3K2UqYitofWZ1bmN0aW9uIGNwKGIsZSl7Yj0xLWI7cmV0dXJuIGIqYiplfWZ1bmN0aW9uIGRwKGIsZSl7cmV0dXJuIDIqCigxLWIpKmIqZX1mdW5jdGlvbiBlcChiLGUpe3JldHVybiBiKmIqZX1mdW5jdGlvbiB0ZyhiLGUsaCxuKXtyZXR1cm4gY3AoYixlKStkcChiLGgpK2VwKGIsbil9ZnVuY3Rpb24gZnAoYixlKXtiPTEtYjtyZXR1cm4gYipiKmIqZX1mdW5jdGlvbiBncChiLGUpe3ZhciBoPTEtYjtyZXR1cm4gMypoKmgqYiplfWZ1bmN0aW9uIGhwKGIsZSl7cmV0dXJuIDMqKDEtYikqYipiKmV9ZnVuY3Rpb24gaXAoYixlKXtyZXR1cm4gYipiKmIqZX1mdW5jdGlvbiB1ZyhiLGUsaCxuLHUpe3JldHVybiBmcChiLGUpK2dwKGIsaCkraHAoYixuKStpcChiLHUpfWZ1bmN0aW9uIFZjKGIsZSxoLG4pe2ViLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlIjt0aGlzLnYwPWJ8fG5ldyBkO3RoaXMudjE9ZXx8bmV3IGQ7dGhpcy52Mj1ofHxuZXcgZDt0aGlzLnYzPW58fG5ldyBkfWZ1bmN0aW9uIG9kKGIsZSxoLG4pe2ViLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyI7CnRoaXMudjA9Ynx8bmV3IGc7dGhpcy52MT1lfHxuZXcgZzt0aGlzLnYyPWh8fG5ldyBnO3RoaXMudjM9bnx8bmV3IGd9ZnVuY3Rpb24gQmMoYixlKXtlYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZUN1cnZlIjt0aGlzLnYxPWJ8fG5ldyBkO3RoaXMudjI9ZXx8bmV3IGR9ZnVuY3Rpb24gV2MoYixlKXtlYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZUN1cnZlMyI7dGhpcy52MT1ifHxuZXcgZzt0aGlzLnYyPWV8fG5ldyBnfWZ1bmN0aW9uIFhjKGIsZSxoKXtlYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUiO3RoaXMudjA9Ynx8bmV3IGQ7dGhpcy52MT1lfHxuZXcgZDt0aGlzLnYyPWh8fG5ldyBkfWZ1bmN0aW9uIHBkKGIsZSxoKXtlYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUzIjt0aGlzLnYwPWJ8fG5ldyBnO3RoaXMudjE9ZXx8bmV3IGc7dGhpcy52Mj1ofHxuZXcgZ31mdW5jdGlvbiBZYyhiKXtlYi5jYWxsKHRoaXMpOwp0aGlzLnR5cGU9IlNwbGluZUN1cnZlIjt0aGlzLnBvaW50cz1ifHxbXX1mdW5jdGlvbiBBZCgpe2ViLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdXJ2ZVBhdGgiO3RoaXMuY3VydmVzPVtdO3RoaXMuYXV0b0Nsb3NlPSExfWZ1bmN0aW9uIFpjKGIpe0FkLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQYXRoIjt0aGlzLmN1cnJlbnRQb2ludD1uZXcgZDtiJiZ0aGlzLnNldEZyb21Qb2ludHMoYil9ZnVuY3Rpb24gWGQoYil7WmMuY2FsbCh0aGlzLGIpO3RoaXMudXVpZD1vYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLnR5cGU9IlNoYXBlIjt0aGlzLmhvbGVzPVtdfWZ1bmN0aW9uIFNiKGIsZSl7Uy5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGlnaHQiO3RoaXMuY29sb3I9bmV3IEIoYik7dGhpcy5pbnRlbnNpdHk9dm9pZCAwIT09ZT9lOjE7dGhpcy5yZWNlaXZlU2hhZG93PXZvaWQgMH1mdW5jdGlvbiB0aChiLGUsaCl7U2IuY2FsbCh0aGlzLGIsaCk7dGhpcy50eXBlPSJIZW1pc3BoZXJlTGlnaHQiO3RoaXMuY2FzdFNoYWRvdz0Kdm9pZCAwO3RoaXMucG9zaXRpb24uY29weShTLkRlZmF1bHRVcCk7dGhpcy51cGRhdGVNYXRyaXgoKTt0aGlzLmdyb3VuZENvbG9yPW5ldyBCKGUpfWZ1bmN0aW9uIHdlKGIpe3RoaXMuY2FtZXJhPWI7dGhpcy5iaWFzPTA7dGhpcy5yYWRpdXM9MTt0aGlzLm1hcFNpemU9bmV3IGQoNTEyLDUxMik7dGhpcy5tYXA9bnVsbDt0aGlzLm1hdHJpeD1uZXcgQ31mdW5jdGlvbiB1aCgpe3dlLmNhbGwodGhpcyxuZXcgY2MoNTAsMSwuNSw1MDApKX1mdW5jdGlvbiB2aChiLGUsaCxuLHUsdyl7U2IuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJTcG90TGlnaHQiO3RoaXMucG9zaXRpb24uY29weShTLkRlZmF1bHRVcCk7dGhpcy51cGRhdGVNYXRyaXgoKTt0aGlzLnRhcmdldD1uZXcgUztPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicG93ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqTWF0aC5QSX0sc2V0OmZ1bmN0aW9uKHope3RoaXMuaW50ZW5zaXR5PXovTWF0aC5QSX19KTsKdGhpcy5kaXN0YW5jZT12b2lkIDAhPT1oP2g6MDt0aGlzLmFuZ2xlPXZvaWQgMCE9PW4/bjpNYXRoLlBJLzM7dGhpcy5wZW51bWJyYT12b2lkIDAhPT11P3U6MDt0aGlzLmRlY2F5PXZvaWQgMCE9PXc/dzoxO3RoaXMuc2hhZG93PW5ldyB1aH1mdW5jdGlvbiB3aChiLGUsaCxuKXtTYi5jYWxsKHRoaXMsYixlKTt0aGlzLnR5cGU9IlBvaW50TGlnaHQiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiA0KnRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbih1KXt0aGlzLmludGVuc2l0eT11Lyg0Kk1hdGguUEkpfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09aD9oOjA7dGhpcy5kZWNheT12b2lkIDAhPT1uP246MTt0aGlzLnNoYWRvdz1uZXcgd2UobmV3IGNjKDkwLDEsLjUsNTAwKSl9ZnVuY3Rpb24gdmcoYixlLGgsbix1LHcpe2pkLmNhbGwodGhpcyk7dGhpcy50eXBlPSJPcnRob2dyYXBoaWNDYW1lcmEiO3RoaXMuem9vbT0KMTt0aGlzLnZpZXc9bnVsbDt0aGlzLmxlZnQ9dm9pZCAwIT09Yj9iOi0xO3RoaXMucmlnaHQ9dm9pZCAwIT09ZT9lOjE7dGhpcy50b3A9dm9pZCAwIT09aD9oOjE7dGhpcy5ib3R0b209dm9pZCAwIT09bj9uOi0xO3RoaXMubmVhcj12b2lkIDAhPT11P3U6LjE7dGhpcy5mYXI9dm9pZCAwIT09dz93OjJFMzt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiB4aCgpe3dlLmNhbGwodGhpcyxuZXcgdmcoLTUsNSw1LC01LC41LDUwMCkpfWZ1bmN0aW9uIHloKGIsZSl7U2IuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoUy5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy50YXJnZXQ9bmV3IFM7dGhpcy5zaGFkb3c9bmV3IHhofWZ1bmN0aW9uIHpoKGIsZSl7U2IuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJBbWJpZW50TGlnaHQiO3RoaXMuY2FzdFNoYWRvdz12b2lkIDB9ZnVuY3Rpb24gQWgoYiwKZSxoLG4pe1NiLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodCI7dGhpcy53aWR0aD12b2lkIDAhPT1oP2g6MTA7dGhpcy5oZWlnaHQ9dm9pZCAwIT09bj9uOjEwfWZ1bmN0aW9uIEJoKGIpe3RoaXMubWFuYWdlcj12b2lkIDAhPT1iP2I6QWM7dGhpcy50ZXh0dXJlcz17fX1mdW5jdGlvbiBIaShiKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09Yj9iOkFjfWZ1bmN0aW9uIElpKGIpe3RoaXMubWFuYWdlcj12b2lkIDAhPT1iP2I6QWM7dGhpcy5yZXNvdXJjZVBhdGg9IiJ9ZnVuY3Rpb24gSmkoYil7InVuZGVmaW5lZCI9PT10eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAmJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4iKTsidW5kZWZpbmVkIj09PXR5cGVvZiBmZXRjaCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogZmV0Y2goKSBub3Qgc3VwcG9ydGVkLiIpO3RoaXMubWFuYWdlcj0Kdm9pZCAwIT09Yj9iOkFjO3RoaXMub3B0aW9ucz12b2lkIDB9ZnVuY3Rpb24gS2koKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCI7dGhpcy5jb2xvcj1uZXcgQjt0aGlzLnN1YlBhdGhzPVtdO3RoaXMuY3VycmVudFBhdGg9bnVsbH1mdW5jdGlvbiBMaShiKXt0aGlzLnR5cGU9IkZvbnQiO3RoaXMuZGF0YT1ifWZ1bmN0aW9uIGpwKGIsZSxoKXtiPUFycmF5LmZyb20/QXJyYXkuZnJvbShiKTpTdHJpbmcoYikuc3BsaXQoIiIpO2UvPWgucmVzb2x1dGlvbjtmb3IodmFyIG49KGguYm91bmRpbmdCb3gueU1heC1oLmJvdW5kaW5nQm94LnlNaW4raC51bmRlcmxpbmVUaGlja25lc3MpKmUsdT1bXSx3PTAsej0wLEU9MDtFPGIubGVuZ3RoO0UrKyl7dmFyIEg9YltFXTsiXG4iPT09SD8odz0wLHotPW4pOihIPWtwKEgsZSx3LHosaCksdys9SC5vZmZzZXRYLHUucHVzaChILnBhdGgpKX1yZXR1cm4gdX1mdW5jdGlvbiBrcChiLGUsaCxuLHUpe2lmKGI9dS5nbHlwaHNbYl18fHUuZ2x5cGhzWyI/Il0pe3U9Cm5ldyBLaTtpZihiLm8pZm9yKHZhciB3PWIuX2NhY2hlZE91dGxpbmV8fChiLl9jYWNoZWRPdXRsaW5lPWIuby5zcGxpdCgiICIpKSx6PTAsRT13Lmxlbmd0aDt6PEU7KXN3aXRjaCh3W3orK10pe2Nhc2UgIm0iOnZhciBIPXdbeisrXSplK2g7dmFyIEk9d1t6KytdKmUrbjt1Lm1vdmVUbyhILEkpO2JyZWFrO2Nhc2UgImwiOkg9d1t6KytdKmUraDtJPXdbeisrXSplK247dS5saW5lVG8oSCxJKTticmVhaztjYXNlICJxIjpIPXdbeisrXSplK2g7ST13W3orK10qZStuO3ZhciBPPXdbeisrXSplK2g7dmFyIFE9d1t6KytdKmUrbjt1LnF1YWRyYXRpY0N1cnZlVG8oTyxRLEgsSSk7YnJlYWs7Y2FzZSAiYiI6SD13W3orK10qZStoO0k9d1t6KytdKmUrbjtPPXdbeisrXSplK2g7UT13W3orK10qZStuO3ZhciBSPXdbeisrXSplK2g7dmFyIFU9d1t6KytdKmUrbjt1LmJlemllckN1cnZlVG8oTyxRLFIsVSxILEkpfXJldHVybntvZmZzZXRYOmIuaGEqZSxwYXRoOnV9fX1mdW5jdGlvbiBIbChiKXt0aGlzLm1hbmFnZXI9CnZvaWQgMCE9PWI/YjpBY31mdW5jdGlvbiB3Zygpe31mdW5jdGlvbiBNaShiKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09Yj9iOkFjfWZ1bmN0aW9uIENoKCl7dGhpcy5jb2VmZmljaWVudHM9W107Zm9yKHZhciBiPTA7OT5iO2IrKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBnKX1mdW5jdGlvbiAkYyhiLGUpe1NiLmNhbGwodGhpcyx2b2lkIDAsZSk7dGhpcy5zaD12b2lkIDAhPT1iP2I6bmV3IENofWZ1bmN0aW9uIE5pKGIsZSxoKXskYy5jYWxsKHRoaXMsdm9pZCAwLGgpO2I9KG5ldyBCKS5zZXQoYik7aD0obmV3IEIpLnNldChlKTtlPW5ldyBnKGIucixiLmcsYi5iKTtiPW5ldyBnKGgucixoLmcsaC5iKTtoPU1hdGguc3FydChNYXRoLlBJKTt2YXIgbj1oKk1hdGguc3FydCguNzUpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLmNvcHkoZSkuYWRkKGIpLm11bHRpcGx5U2NhbGFyKGgpO3RoaXMuc2guY29lZmZpY2llbnRzWzFdLmNvcHkoZSkuc3ViKGIpLm11bHRpcGx5U2NhbGFyKG4pfQpmdW5jdGlvbiBPaShiLGUpeyRjLmNhbGwodGhpcyx2b2lkIDAsZSk7Yj0obmV3IEIpLnNldChiKTt0aGlzLnNoLmNvZWZmaWNpZW50c1swXS5zZXQoYi5yLGIuZyxiLmIpLm11bHRpcGx5U2NhbGFyKDIqTWF0aC5zcXJ0KE1hdGguUEkpKX1mdW5jdGlvbiBJbCgpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIjt0aGlzLmFzcGVjdD0xO3RoaXMuZXllU2VwPS4wNjQ7dGhpcy5jYW1lcmFMPW5ldyBjYzt0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKTt0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNhbWVyYVI9bmV3IGNjO3RoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpO3RoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExfWZ1bmN0aW9uIHhnKGIsZSxoLG4pe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmVDYW1lcmEiO3ZhciB1PW5ldyBjYyg5MCwxLGIsZSk7dS51cC5zZXQoMCwtMSwwKTt1Lmxvb2tBdChuZXcgZygxLDAsMCkpO3RoaXMuYWRkKHUpOwp2YXIgdz1uZXcgY2MoOTAsMSxiLGUpO3cudXAuc2V0KDAsLTEsMCk7dy5sb29rQXQobmV3IGcoLTEsMCwwKSk7dGhpcy5hZGQodyk7dmFyIHo9bmV3IGNjKDkwLDEsYixlKTt6LnVwLnNldCgwLDAsMSk7ei5sb29rQXQobmV3IGcoMCwxLDApKTt0aGlzLmFkZCh6KTt2YXIgRT1uZXcgY2MoOTAsMSxiLGUpO0UudXAuc2V0KDAsMCwtMSk7RS5sb29rQXQobmV3IGcoMCwtMSwwKSk7dGhpcy5hZGQoRSk7dmFyIEg9bmV3IGNjKDkwLDEsYixlKTtILnVwLnNldCgwLC0xLDApO0gubG9va0F0KG5ldyBnKDAsMCwxKSk7dGhpcy5hZGQoSCk7dmFyIEk9bmV3IGNjKDkwLDEsYixlKTtJLnVwLnNldCgwLC0xLDApO0kubG9va0F0KG5ldyBnKDAsMCwtMSkpO3RoaXMuYWRkKEkpO249bnx8e2Zvcm1hdDoxMDIyLG1hZ0ZpbHRlcjoxMDA2LG1pbkZpbHRlcjoxMDA2fTt0aGlzLnJlbmRlclRhcmdldD1uZXcgcihoLGgsbik7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhIjsKdGhpcy51cGRhdGU9ZnVuY3Rpb24oTyxRKXtudWxsPT09dGhpcy5wYXJlbnQmJnRoaXMudXBkYXRlTWF0cml4V29ybGQoKTt2YXIgUj1PLmdldFJlbmRlclRhcmdldCgpLFU9dGhpcy5yZW5kZXJUYXJnZXQsVz1VLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1UudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9ITE7Ty5zZXRSZW5kZXJUYXJnZXQoVSwwKTtPLnJlbmRlcihRLHUpO08uc2V0UmVuZGVyVGFyZ2V0KFUsMSk7Ty5yZW5kZXIoUSx3KTtPLnNldFJlbmRlclRhcmdldChVLDIpO08ucmVuZGVyKFEseik7Ty5zZXRSZW5kZXJUYXJnZXQoVSwzKTtPLnJlbmRlcihRLEUpO08uc2V0UmVuZGVyVGFyZ2V0KFUsNCk7Ty5yZW5kZXIoUSxIKTtVLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPVc7Ty5zZXRSZW5kZXJUYXJnZXQoVSw1KTtPLnJlbmRlcihRLEkpO08uc2V0UmVuZGVyVGFyZ2V0KFIpfTt0aGlzLmNsZWFyPWZ1bmN0aW9uKE8sUSxSLFUpe2Zvcih2YXIgVz1PLmdldFJlbmRlclRhcmdldCgpLApaPXRoaXMucmVuZGVyVGFyZ2V0LGZhPTA7Nj5mYTtmYSsrKU8uc2V0UmVuZGVyVGFyZ2V0KFosZmEpLE8uY2xlYXIoUSxSLFUpO08uc2V0UmVuZGVyVGFyZ2V0KFcpfX1mdW5jdGlvbiBQaShiKXt0aGlzLmF1dG9TdGFydD12b2lkIDAhPT1iP2I6ITA7dGhpcy5lbGFwc2VkVGltZT10aGlzLm9sZFRpbWU9dGhpcy5zdGFydFRpbWU9MDt0aGlzLnJ1bm5pbmc9ITF9ZnVuY3Rpb24gUWkoKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpb0xpc3RlbmVyIjt0aGlzLmNvbnRleHQ9UmkuZ2V0Q29udGV4dCgpO3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7dGhpcy5maWx0ZXI9bnVsbDt0aGlzLnRpbWVEZWx0YT0wfWZ1bmN0aW9uIGpmKGIpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkF1ZGlvIjt0aGlzLmxpc3RlbmVyPWI7dGhpcy5jb250ZXh0PWIuY29udGV4dDt0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTsKdGhpcy5nYWluLmNvbm5lY3QoYi5nZXRJbnB1dCgpKTt0aGlzLmF1dG9wbGF5PSExO3RoaXMuYnVmZmVyPW51bGw7dGhpcy5kZXR1bmU9MDt0aGlzLmxvb3A9ITE7dGhpcy5vZmZzZXQ9dGhpcy5zdGFydFRpbWU9MDt0aGlzLnBsYXliYWNrUmF0ZT0xO3RoaXMuaXNQbGF5aW5nPSExO3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwO3RoaXMuc291cmNlVHlwZT0iZW1wdHkiO3RoaXMuZmlsdGVycz1bXX1mdW5jdGlvbiBTaShiKXtqZi5jYWxsKHRoaXMsYik7dGhpcy5wYW5uZXI9dGhpcy5jb250ZXh0LmNyZWF0ZVBhbm5lcigpO3RoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1mdW5jdGlvbiBUaShiLGUpe3RoaXMuYW5hbHlzZXI9Yi5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7dGhpcy5hbmFseXNlci5mZnRTaXplPXZvaWQgMCE9PWU/ZToyMDQ4O3RoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTtiLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9CmZ1bmN0aW9uIFVpKGIsZSxoKXt0aGlzLmJpbmRpbmc9Yjt0aGlzLnZhbHVlU2l6ZT1oO2I9RmxvYXQ2NEFycmF5O3N3aXRjaChlKXtjYXNlICJxdWF0ZXJuaW9uIjplPXRoaXMuX3NsZXJwO2JyZWFrO2Nhc2UgInN0cmluZyI6Y2FzZSAiYm9vbCI6Yj1BcnJheTtlPXRoaXMuX3NlbGVjdDticmVhaztkZWZhdWx0OmU9dGhpcy5fbGVycH10aGlzLmJ1ZmZlcj1uZXcgYig0KmgpO3RoaXMuX21peEJ1ZmZlclJlZ2lvbj1lO3RoaXMucmVmZXJlbmNlQ291bnQ9dGhpcy51c2VDb3VudD10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH1mdW5jdGlvbiBKbChiLGUsaCl7aD1ofHxzYy5wYXJzZVRyYWNrTmFtZShlKTt0aGlzLl90YXJnZXRHcm91cD1iO3RoaXMuX2JpbmRpbmdzPWIuc3Vic2NyaWJlXyhlLGgpfWZ1bmN0aW9uIHNjKGIsZSxoKXt0aGlzLnBhdGg9ZTt0aGlzLnBhcnNlZFBhdGg9aHx8c2MucGFyc2VUcmFja05hbWUoZSk7dGhpcy5ub2RlPXNjLmZpbmROb2RlKGIsdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lKXx8CmI7dGhpcy5yb290Tm9kZT1ifWZ1bmN0aW9uIEtsKCl7dGhpcy51dWlkPW9iLmdlbmVyYXRlVVVJRCgpO3RoaXMuX29iamVjdHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5DYWNoZWRPYmplY3RzXz0wO3ZhciBiPXt9O3RoaXMuX2luZGljZXNCeVVVSUQ9Yjtmb3IodmFyIGU9MCxoPWFyZ3VtZW50cy5sZW5ndGg7ZSE9PWg7KytlKWJbYXJndW1lbnRzW2VdLnV1aWRdPWU7dGhpcy5fcGF0aHM9W107dGhpcy5fcGFyc2VkUGF0aHM9W107dGhpcy5fYmluZGluZ3M9W107dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoPXt9O3ZhciBuPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIG4uX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1uLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBuLl9iaW5kaW5ncy5sZW5ndGh9fX1mdW5jdGlvbiBMbChiLAplLGgpe3RoaXMuX21peGVyPWI7dGhpcy5fY2xpcD1lO3RoaXMuX2xvY2FsUm9vdD1ofHxudWxsO2I9ZS50cmFja3M7ZT1iLmxlbmd0aDtoPUFycmF5KGUpO2Zvcih2YXIgbj17ZW5kaW5nU3RhcnQ6MjQwMCxlbmRpbmdFbmQ6MjQwMH0sdT0wO3UhPT1lOysrdSl7dmFyIHc9Ylt1XS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtoW3VdPXc7dy5zZXR0aW5ncz1ufXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9bjt0aGlzLl9pbnRlcnBvbGFudHM9aDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPUFycmF5KGUpO3RoaXMuX3dlaWdodEludGVycG9sYW50PXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXRoaXMuX2J5Q2xpcENhY2hlSW5kZXg9dGhpcy5fY2FjaGVJbmRleD1udWxsO3RoaXMubG9vcD0yMjAxO3RoaXMuX2xvb3BDb3VudD0tMTt0aGlzLl9zdGFydFRpbWU9bnVsbDt0aGlzLnRpbWU9MDt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy53ZWlnaHQ9dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPQp0aGlzLnRpbWVTY2FsZT0xO3RoaXMucmVwZXRpdGlvbnM9SW5maW5pdHk7dGhpcy5wYXVzZWQ9ITE7dGhpcy5lbmFibGVkPSEwO3RoaXMuY2xhbXBXaGVuRmluaXNoZWQ9ITE7dGhpcy56ZXJvU2xvcGVBdEVuZD10aGlzLnplcm9TbG9wZUF0U3RhcnQ9ITB9ZnVuY3Rpb24gVmkoYil7dGhpcy5fcm9vdD1iO3RoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7dGhpcy50aW1lPXRoaXMuX2FjY3VJbmRleD0wO3RoaXMudGltZVNjYWxlPTF9ZnVuY3Rpb24gRGgoYixlKXsic3RyaW5nIj09PXR5cGVvZiBiJiYoY29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLiIpLGI9ZSk7dGhpcy52YWx1ZT1ifWZ1bmN0aW9uIFdpKCl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLm1heEluc3RhbmNlZENvdW50PXZvaWQgMH1mdW5jdGlvbiBYaShiLGUsaCl7aGUuY2FsbCh0aGlzLGIsZSk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPQpofHwxfWZ1bmN0aW9uIFlpKGIsZSxoLG4peyJudW1iZXIiPT09dHlwZW9mIGgmJihuPWgsaD0hMSxjb25zb2xlLmVycm9yKCJUSFJFRS5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IFRoZSBjb25zdHJ1Y3RvciBub3cgZXhwZWN0cyBub3JtYWxpemVkIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4iKSk7VC5jYWxsKHRoaXMsYixlLGgpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1ufHwxfWZ1bmN0aW9uIE1sKGIsZSxoLG4pe3RoaXMucmF5PW5ldyB4YihiLGUpO3RoaXMubmVhcj1ofHwwO3RoaXMuZmFyPW58fEluZmluaXR5O3RoaXMucGFyYW1zPXtNZXNoOnt9LExpbmU6e30sTE9EOnt9LFBvaW50czp7dGhyZXNob2xkOjF9LFNwcml0ZTp7fX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcy5wYXJhbXMse1BvaW50Q2xvdWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5Y2FzdGVyOiBwYXJhbXMuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIHBhcmFtcy5Qb2ludHMuIik7CnJldHVybiB0aGlzLlBvaW50c319fSl9ZnVuY3Rpb24gTmwoYixlKXtyZXR1cm4gYi5kaXN0YW5jZS1lLmRpc3RhbmNlfWZ1bmN0aW9uIFppKGIsZSxoLG4pe2lmKCExIT09Yi52aXNpYmxlJiYoYi5yYXljYXN0KGUsaCksITA9PT1uKSl7Yj1iLmNoaWxkcmVuO249MDtmb3IodmFyIHU9Yi5sZW5ndGg7bjx1O24rKylaaShiW25dLGUsaCwhMCl9fWZ1bmN0aW9uIE9sKGIsZSxoKXt0aGlzLnJhZGl1cz12b2lkIDAhPT1iP2I6MTt0aGlzLnBoaT12b2lkIDAhPT1lP2U6MDt0aGlzLnRoZXRhPXZvaWQgMCE9PWg/aDowO3JldHVybiB0aGlzfWZ1bmN0aW9uIFBsKGIsZSxoKXt0aGlzLnJhZGl1cz12b2lkIDAhPT1iP2I6MTt0aGlzLnRoZXRhPXZvaWQgMCE9PWU/ZTowO3RoaXMueT12b2lkIDAhPT1oP2g6MDtyZXR1cm4gdGhpc31mdW5jdGlvbiAkaShiLGUpe3RoaXMubWluPXZvaWQgMCE9PWI/YjpuZXcgZChJbmZpbml0eSxJbmZpbml0eSk7dGhpcy5tYXg9dm9pZCAwIT09ZT9lOm5ldyBkKC1JbmZpbml0eSwKLUluZmluaXR5KX1mdW5jdGlvbiBhaihiLGUpe3RoaXMuc3RhcnQ9dm9pZCAwIT09Yj9iOm5ldyBnO3RoaXMuZW5kPXZvaWQgMCE9PWU/ZTpuZXcgZ31mdW5jdGlvbiB5ZyhiKXtTLmNhbGwodGhpcyk7dGhpcy5tYXRlcmlhbD1iO3RoaXMucmVuZGVyPWZ1bmN0aW9uKCl7fX1mdW5jdGlvbiB6ZyhiLGUsaCxuKXt0aGlzLm9iamVjdD1iO3RoaXMuc2l6ZT12b2lkIDAhPT1lP2U6MTtiPXZvaWQgMCE9PWg/aDoxNjcxMTY4MDtuPXZvaWQgMCE9PW4/bjoxO2U9MDsoaD10aGlzLm9iamVjdC5nZW9tZXRyeSkmJmguaXNHZW9tZXRyeT9lPTMqaC5mYWNlcy5sZW5ndGg6aCYmaC5pc0J1ZmZlckdlb21ldHJ5JiYoZT1oLmF0dHJpYnV0ZXMubm9ybWFsLmNvdW50KTtoPW5ldyB4YTtlPW5ldyBiYSg2KmUsMyk7aC5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixlKTtQYi5jYWxsKHRoaXMsaCxuZXcgTGIoe2NvbG9yOmIsbGluZXdpZHRoOm59KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9CmZ1bmN0aW9uIGtmKGIsZSl7Uy5jYWxsKHRoaXMpO3RoaXMubGlnaHQ9Yjt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9Yi5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1lO2I9bmV3IHhhO2U9WzAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLC0xLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLC0xLDFdO2Zvcih2YXIgaD0wLG49MTszMj5oO2grKyxuKyspe3ZhciB1PWgvMzIqTWF0aC5QSSoyLHc9bi8zMipNYXRoLlBJKjI7ZS5wdXNoKE1hdGguY29zKHUpLE1hdGguc2luKHUpLDEsTWF0aC5jb3ModyksTWF0aC5zaW4odyksMSl9Yi5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoZSwzKSk7ZT1uZXcgTGIoe2ZvZzohMX0pO3RoaXMuY29uZT1uZXcgUGIoYixlKTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gUWwoYil7dmFyIGU9W107YiYmYi5pc0JvbmUmJmUucHVzaChiKTsKZm9yKHZhciBoPTA7aDxiLmNoaWxkcmVuLmxlbmd0aDtoKyspZS5wdXNoLmFwcGx5KGUsUWwoYi5jaGlsZHJlbltoXSkpO3JldHVybiBlfWZ1bmN0aW9uIGxmKGIpe2Zvcih2YXIgZT1RbChiKSxoPW5ldyB4YSxuPVtdLHU9W10sdz1uZXcgQigwLDAsMSksej1uZXcgQigwLDEsMCksRT0wO0U8ZS5sZW5ndGg7RSsrKXt2YXIgSD1lW0VdO0gucGFyZW50JiZILnBhcmVudC5pc0JvbmUmJihuLnB1c2goMCwwLDApLG4ucHVzaCgwLDAsMCksdS5wdXNoKHcucix3Lmcsdy5iKSx1LnB1c2goei5yLHouZyx6LmIpKX1oLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShuLDMpKTtoLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBiYSh1LDMpKTtuPW5ldyBMYih7dmVydGV4Q29sb3JzOjIsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsdHJhbnNwYXJlbnQ6ITB9KTtQYi5jYWxsKHRoaXMsaCxuKTt0aGlzLnJvb3Q9Yjt0aGlzLmJvbmVzPWU7dGhpcy5tYXRyaXg9Yi5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9CiExfWZ1bmN0aW9uIG1mKGIsZSxoKXt0aGlzLmxpZ2h0PWI7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMuY29sb3I9aDtiPW5ldyBXZChlLDQsMik7ZT1uZXcgeWIoe3dpcmVmcmFtZTohMCxmb2c6ITF9KTt0Yi5jYWxsKHRoaXMsYixlKTt0aGlzLm1hdHJpeD10aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIG5mKGIsZSl7dGhpcy50eXBlPSJSZWN0QXJlYUxpZ2h0SGVscGVyIjt0aGlzLmxpZ2h0PWI7dGhpcy5jb2xvcj1lO2I9bmV3IHhhO2IuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFsxLDEsMCwtMSwxLDAsLTEsLTEsMCwxLC0xLDAsMSwxLDBdLDMpKTtiLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO2U9bmV3IExiKHtmb2c6ITF9KTtsYy5jYWxsKHRoaXMsYixlKTtiPW5ldyB4YTtiLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShbMSwxLDAsLTEsMSwwLC0xLC0xLAowLDEsMSwwLC0xLC0xLDAsMSwtMSwwXSwzKSk7Yi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt0aGlzLmFkZChuZXcgdGIoYixuZXcgeWIoe3NpZGU6MSxmb2c6ITF9KSkpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gb2YoYixlLGgpe1MuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWI7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWIubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9aDtiPW5ldyBpZShlKTtiLnJvdGF0ZVkoLjUqTWF0aC5QSSk7dGhpcy5tYXRlcmlhbD1uZXcgeWIoe3dpcmVmcmFtZTohMCxmb2c6ITF9KTt2b2lkIDA9PT10aGlzLmNvbG9yJiYodGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9Mik7ZT1iLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtiLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBUKG5ldyBGbG9hdDMyQXJyYXkoMyplLmNvdW50KSwzKSk7dGhpcy5hZGQobmV3IHRiKGIsdGhpcy5tYXRlcmlhbCkpOwp0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIHBmKGIsZSl7dGhpcy5saWdodFByb2JlPWI7dGhpcy5zaXplPWU7Yj1uZXcgZGIoe2RlZmluZXM6e0dBTU1BX09VVFBVVDoiIn0sdW5pZm9ybXM6e3NoOnt2YWx1ZTp0aGlzLmxpZ2h0UHJvYmUuc2guY29lZmZpY2llbnRzfSxpbnRlbnNpdHk6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5pbnRlbnNpdHl9fSx2ZXJ0ZXhTaGFkZXI6InZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xudm9pZCBtYWluKCkge1xuXHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsZnJhZ21lbnRTaGFkZXI6IiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NlxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIG5vcm1hbCwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdC8vIG1hdHJpeCBpcyBhc3N1bWVkIHRvIGJlIG9ydGhvZ29uYWxcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBub3JtYWwsIDAuMCApICogbWF0cml4ICkueHl6ICk7XG59XG52ZWMzIGxpbmVhclRvT3V0cHV0KCBpbiB2ZWMzIGEgKSB7XG5cdCNpZmRlZiBHQU1NQV9PVVRQVVRcblx0XHRyZXR1cm4gcG93KCBhLCB2ZWMzKCAxLjAgLyBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSApO1xuXHQjZWxzZVxuXHRcdHJldHVybiBhO1xuXHQjZW5kaWZcbn1cbi8vIHNvdXJjZTogaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cdGZsb2F0IHggXHgzZCBub3JtYWwueCwgeSBceDNkIG5vcm1hbC55LCB6IFx4M2Qgbm9ybWFsLno7XG5cdC8vIGJhbmQgMFxuXHR2ZWMzIHJlc3VsdCBceDNkIHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0Ly8gYmFuZCAxXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdC8vIGJhbmQgMlxuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA2IF0gKiAoIDAuNzQzMTI1ICogeiAqIHogLSAwLjI0NzcwOCApO1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbnVuaWZvcm0gdmVjMyBzaFsgOSBdOyAvLyBzaCBjb2VmZmljaWVudHNcbnVuaWZvcm0gZmxvYXQgaW50ZW5zaXR5OyAvLyBsaWdodCBwcm9iZSBpbnRlbnNpdHlcbnZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xudm9pZCBtYWluKCkge1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdk5vcm1hbCApO1xuXHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgc2ggKTtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgUkVDSVBST0NBTF9QSSAqIGlycmFkaWFuY2UgKiBpbnRlbnNpdHk7XG5cdG91dGdvaW5nTGlnaHQgXHgzZCBsaW5lYXJUb091dHB1dCggb3V0Z29pbmdMaWdodCApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCAxLjAgKTtcbn0ifSk7CmU9bmV3IFdkKDEsMzIsMTYpO3RiLmNhbGwodGhpcyxlLGIpO3RoaXMub25CZWZvcmVSZW5kZXIoKX1mdW5jdGlvbiBFaChiLGUsaCxuKXtiPWJ8fDEwO2U9ZXx8MTA7aD1uZXcgQih2b2lkIDAhPT1oP2g6NDQ3MzkyNCk7bj1uZXcgQih2b2lkIDAhPT1uP246ODk0Nzg0OCk7dmFyIHU9ZS8yLHc9Yi9lLHo9Yi8yO2I9W107Zm9yKHZhciBFPVtdLEg9MCxJPTAsTz0tejtIPD1lO0grKyxPKz13KXtiLnB1c2goLXosMCxPLHosMCxPKTtiLnB1c2goTywwLC16LE8sMCx6KTt2YXIgUT1IPT09dT9oOm47US50b0FycmF5KEUsSSk7SSs9MztRLnRvQXJyYXkoRSxJKTtJKz0zO1EudG9BcnJheShFLEkpO0krPTM7US50b0FycmF5KEUsSSk7SSs9M31lPW5ldyB4YTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShiLDMpKTtlLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBiYShFLDMpKTtoPW5ldyBMYih7dmVydGV4Q29sb3JzOjJ9KTtQYi5jYWxsKHRoaXMsZSxoKX1mdW5jdGlvbiBGaChiLAplLGgsbix1LHcpe2I9Ynx8MTA7ZT1lfHwxNjtoPWh8fDg7bj1ufHw2NDt1PW5ldyBCKHZvaWQgMCE9PXU/dTo0NDczOTI0KTt3PW5ldyBCKHZvaWQgMCE9PXc/dzo4OTQ3ODQ4KTt2YXIgej1bXSxFPVtdLEg7Zm9yKEg9MDtIPD1lO0grKyl7dmFyIEk9SC9lKjIqTWF0aC5QSTt2YXIgTz1NYXRoLnNpbihJKSpiO0k9TWF0aC5jb3MoSSkqYjt6LnB1c2goMCwwLDApO3oucHVzaChPLDAsSSk7dmFyIFE9SCYxP3U6dztFLnB1c2goUS5yLFEuZyxRLmIpO0UucHVzaChRLnIsUS5nLFEuYil9Zm9yKEg9MDtIPD1oO0grKyl7UT1IJjE/dTp3O3ZhciBSPWItYi9oKkg7Zm9yKGU9MDtlPG47ZSsrKUk9ZS9uKjIqTWF0aC5QSSxPPU1hdGguc2luKEkpKlIsST1NYXRoLmNvcyhJKSpSLHoucHVzaChPLDAsSSksRS5wdXNoKFEucixRLmcsUS5iKSxJPShlKzEpL24qMipNYXRoLlBJLE89TWF0aC5zaW4oSSkqUixJPU1hdGguY29zKEkpKlIsei5wdXNoKE8sMCxJKSxFLnB1c2goUS5yLFEuZyxRLmIpfWI9Cm5ldyB4YTtiLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh6LDMpKTtiLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBiYShFLDMpKTt6PW5ldyBMYih7dmVydGV4Q29sb3JzOjJ9KTtQYi5jYWxsKHRoaXMsYix6KX1mdW5jdGlvbiBxZihiLGUsaCxuKXt0aGlzLmF1ZGlvPWI7dGhpcy5yYW5nZT1lfHwxO3RoaXMuZGl2aXNpb25zSW5uZXJBbmdsZT1ofHwxNjt0aGlzLmRpdmlzaW9uc091dGVyQW5nbGU9bnx8MjtiPW5ldyB4YTtiLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBUKG5ldyBGbG9hdDMyQXJyYXkoMyooMyoodGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlKzIqdGhpcy5kaXZpc2lvbnNPdXRlckFuZ2xlKSszKSksMykpO2U9bmV3IExiKHtjb2xvcjo2NTI4MH0pO2g9bmV3IExiKHtjb2xvcjoxNjc3Njk2MH0pO2xjLmNhbGwodGhpcyxiLFtoLGVdKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIEFnKGIsZSxoLG4pe3RoaXMub2JqZWN0PWI7dGhpcy5zaXplPXZvaWQgMCE9PQplP2U6MTtiPXZvaWQgMCE9PWg/aDoxNjc3Njk2MDtuPXZvaWQgMCE9PW4/bjoxO2U9MDsoaD10aGlzLm9iamVjdC5nZW9tZXRyeSkmJmguaXNHZW9tZXRyeT9lPWguZmFjZXMubGVuZ3RoOmNvbnNvbGUud2FybigiVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4iKTtoPW5ldyB4YTtlPW5ldyBiYSg2KmUsMyk7aC5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixlKTtQYi5jYWxsKHRoaXMsaCxuZXcgTGIoe2NvbG9yOmIsbGluZXdpZHRoOm59KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gcmYoYixlLGgpe1MuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWI7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWIubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9aDsKdm9pZCAwPT09ZSYmKGU9MSk7Yj1uZXcgeGE7Yi5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWy1lLGUsMCxlLGUsMCxlLC1lLDAsLWUsLWUsMCwtZSxlLDBdLDMpKTtlPW5ldyBMYih7Zm9nOiExfSk7dGhpcy5saWdodFBsYW5lPW5ldyBsYyhiLGUpO3RoaXMuYWRkKHRoaXMubGlnaHRQbGFuZSk7Yj1uZXcgeGE7Yi5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWzAsMCwwLDAsMCwxXSwzKSk7dGhpcy50YXJnZXRMaW5lPW5ldyBsYyhiLGUpO3RoaXMuYWRkKHRoaXMudGFyZ2V0TGluZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBCZyhiKXtmdW5jdGlvbiBlKFUsVyxaKXtoKFUsWik7aChXLFopfWZ1bmN0aW9uIGgoVSxXKXt3LnB1c2goMCwwLDApO3oucHVzaChXLnIsVy5nLFcuYik7dm9pZCAwPT09RVtVXSYmKEVbVV09W10pO0VbVV0ucHVzaCh3Lmxlbmd0aC8zLTEpfXZhciBuPW5ldyB4YSx1PW5ldyBMYih7Y29sb3I6MTY3NzcyMTUsdmVydGV4Q29sb3JzOjF9KSwKdz1bXSx6PVtdLEU9e30sSD1uZXcgQigxNjc1NTIwMCksST1uZXcgQigxNjcxMTY4MCksTz1uZXcgQig0Mzc3NSksUT1uZXcgQigxNjc3NzIxNSksUj1uZXcgQigzMzU1NDQzKTtlKCJuMSIsIm4yIixIKTtlKCJuMiIsIm40IixIKTtlKCJuNCIsIm4zIixIKTtlKCJuMyIsIm4xIixIKTtlKCJmMSIsImYyIixIKTtlKCJmMiIsImY0IixIKTtlKCJmNCIsImYzIixIKTtlKCJmMyIsImYxIixIKTtlKCJuMSIsImYxIixIKTtlKCJuMiIsImYyIixIKTtlKCJuMyIsImYzIixIKTtlKCJuNCIsImY0IixIKTtlKCJwIiwibjEiLEkpO2UoInAiLCJuMiIsSSk7ZSgicCIsIm4zIixJKTtlKCJwIiwibjQiLEkpO2UoInUxIiwidTIiLE8pO2UoInUyIiwidTMiLE8pO2UoInUzIiwidTEiLE8pO2UoImMiLCJ0IixRKTtlKCJwIiwiYyIsUik7ZSgiY24xIiwiY24yIixSKTtlKCJjbjMiLCJjbjQiLFIpO2UoImNmMSIsImNmMiIsUik7ZSgiY2YzIiwiY2Y0IixSKTtuLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLApuZXcgYmEodywzKSk7bi5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgYmEoeiwzKSk7UGIuY2FsbCh0aGlzLG4sdSk7dGhpcy5jYW1lcmE9Yjt0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4JiZ0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5tYXRyaXg9Yi5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5wb2ludE1hcD1FO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gQmQoYixlKXt0aGlzLm9iamVjdD1iO3ZvaWQgMD09PWUmJihlPTE2Nzc2OTYwKTtiPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgaD1uZXcgRmxvYXQzMkFycmF5KDI0KSxuPW5ldyB4YTtuLnNldEluZGV4KG5ldyBUKGIsMSkpO24uYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFQoaCwzKSk7UGIuY2FsbCh0aGlzLG4sbmV3IExiKHtjb2xvcjplfSkpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0KITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBDZyhiLGUpe3RoaXMudHlwZT0iQm94M0hlbHBlciI7dGhpcy5ib3g9YjtiPXZvaWQgMCE9PWU/ZToxNjc3Njk2MDtlPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgaD1uZXcgeGE7aC5zZXRJbmRleChuZXcgVChlLDEpKTtoLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLDMpKTtQYi5jYWxsKHRoaXMsaCxuZXcgTGIoe2NvbG9yOmJ9KSk7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX1mdW5jdGlvbiBEZyhiLGUsaCl7dGhpcy50eXBlPSJQbGFuZUhlbHBlciI7dGhpcy5wbGFuZT1iO3RoaXMuc2l6ZT12b2lkIDA9PT1lPzE6ZTtiPXZvaWQgMCE9PWg/aDoxNjc3Njk2MDtlPW5ldyB4YTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLApuZXcgYmEoWzEsLTEsMSwtMSwxLDEsLTEsLTEsMSwxLDEsMSwtMSwxLDEsLTEsLTEsMSwxLC0xLDEsMSwxLDEsMCwwLDEsMCwwLDBdLDMpKTtlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO2xjLmNhbGwodGhpcyxlLG5ldyBMYih7Y29sb3I6Yn0pKTtlPW5ldyB4YTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsLTEsMSwxLC0xLDFdLDMpKTtlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMuYWRkKG5ldyB0YihlLG5ldyB5Yih7Y29sb3I6YixvcGFjaXR5Oi4yLHRyYW5zcGFyZW50OiEwLGRlcHRoV3JpdGU6ITF9KSkpfWZ1bmN0aW9uIENkKGIsZSxoLG4sdSx3KXtTLmNhbGwodGhpcyk7dm9pZCAwPT09YiYmKGI9bmV3IGcoMCwwLDEpKTt2b2lkIDA9PT1lJiYoZT1uZXcgZygwLDAsMCkpO3ZvaWQgMD09PWgmJihoPTEpO3ZvaWQgMD09PW4mJihuPTE2Nzc2OTYwKTt2b2lkIDA9PT11JiYodT0uMipoKTt2b2lkIDA9PT0KdyYmKHc9LjIqdSk7dm9pZCAwPT09R2gmJihHaD1uZXcgeGEsR2guYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFswLDAsMCwwLDEsMF0sMykpLGJqPW5ldyB6ZCgwLC41LDEsNSwxKSxiai50cmFuc2xhdGUoMCwtLjUsMCkpO3RoaXMucG9zaXRpb24uY29weShlKTt0aGlzLmxpbmU9bmV3IGxjKEdoLG5ldyBMYih7Y29sb3I6bn0pKTt0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmxpbmUpO3RoaXMuY29uZT1uZXcgdGIoYmosbmV3IHliKHtjb2xvcjpufSkpO3RoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuYWRkKHRoaXMuY29uZSk7dGhpcy5zZXREaXJlY3Rpb24oYik7dGhpcy5zZXRMZW5ndGgoaCx1LHcpfWZ1bmN0aW9uIEVnKGIpe2I9Ynx8MTt2YXIgZT1bMCwwLDAsYiwwLDAsMCwwLDAsMCxiLDAsMCwwLDAsMCwwLGJdO2I9bmV3IHhhO2IuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKGUsMykpO2IuYWRkQXR0cmlidXRlKCJjb2xvciIsCm5ldyBiYShbMSwwLDAsMSwuNiwwLDAsMSwwLC42LDEsMCwwLDAsMSwwLC42LDFdLDMpKTtlPW5ldyBMYih7dmVydGV4Q29sb3JzOjJ9KTtQYi5jYWxsKHRoaXMsYixlKX1mdW5jdGlvbiBSbChiKXtjb25zb2xlLndhcm4oIlRIUkVFLkNsb3NlZFNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpO3JjLmNhbGwodGhpcyxiKTt0aGlzLnR5cGU9ImNhdG11bGxyb20iO3RoaXMuY2xvc2VkPSEwfWZ1bmN0aW9uIFNsKGIpe2NvbnNvbGUud2FybigiVEhSRUUuU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuIik7cmMuY2FsbCh0aGlzLGIpO3RoaXMudHlwZT0iY2F0bXVsbHJvbSJ9ZnVuY3Rpb24gY2ooYil7Y29uc29sZS53YXJuKCJUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTsKcmMuY2FsbCh0aGlzLGIpO3RoaXMudHlwZT0iY2F0bXVsbHJvbSJ9dm9pZCAwPT09TnVtYmVyLkVQU0lMT04mJihOdW1iZXIuRVBTSUxPTj1NYXRoLnBvdygyLC01MikpO3ZvaWQgMD09PU51bWJlci5pc0ludGVnZXImJihOdW1iZXIuaXNJbnRlZ2VyPWZ1bmN0aW9uKGIpe3JldHVybiJudW1iZXIiPT09dHlwZW9mIGImJmlzRmluaXRlKGIpJiZNYXRoLmZsb29yKGIpPT09Yn0pO3ZvaWQgMD09PU1hdGguc2lnbiYmKE1hdGguc2lnbj1mdW5jdGlvbihiKXtyZXR1cm4gMD5iPy0xOjA8Yj8xOitifSk7ITE9PT0ibmFtZSJpbiBGdW5jdGlvbi5wcm90b3R5cGUmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsIm5hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb25ccyooW15cKFxzXSopLylbMV19fSk7dm9pZCAwPT09T2JqZWN0LmFzc2lnbiYmZnVuY3Rpb24oKXtPYmplY3QuYXNzaWduPWZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PQpifHxudWxsPT09Yil0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIGU9T2JqZWN0KGIpLGg9MTtoPGFyZ3VtZW50cy5sZW5ndGg7aCsrKXt2YXIgbj1hcmd1bWVudHNbaF07aWYodm9pZCAwIT09biYmbnVsbCE9PW4pZm9yKHZhciB1IGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sdSkmJihlW3VdPW5bdV0pfXJldHVybiBlfX0oKTtPYmplY3QuYXNzaWduKGMucHJvdG90eXBlLHthZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXt9KTt2YXIgaD10aGlzLl9saXN0ZW5lcnM7dm9pZCAwPT09aFtiXSYmKGhbYl09W10pOy0xPT09aFtiXS5pbmRleE9mKGUpJiZoW2JdLnB1c2goZSl9LGhhc0V2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuITE7CnZhciBoPXRoaXMuX2xpc3RlbmVycztyZXR1cm4gdm9pZCAwIT09aFtiXSYmLTEhPT1oW2JdLmluZGV4T2YoZSl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYixlKXt2b2lkIDAhPT10aGlzLl9saXN0ZW5lcnMmJihiPXRoaXMuX2xpc3RlbmVyc1tiXSx2b2lkIDAhPT1iJiYoZT1iLmluZGV4T2YoZSksLTEhPT1lJiZiLnNwbGljZShlLDEpKSl9LGRpc3BhdGNoRXZlbnQ6ZnVuY3Rpb24oYil7aWYodm9pZCAwIT09dGhpcy5fbGlzdGVuZXJzKXt2YXIgZT10aGlzLl9saXN0ZW5lcnNbYi50eXBlXTtpZih2b2lkIDAhPT1lKXtiLnRhcmdldD10aGlzO2U9ZS5zbGljZSgwKTtmb3IodmFyIGg9MCxuPWUubGVuZ3RoO2g8bjtoKyspZVtoXS5jYWxsKHRoaXMsYil9fX19KTt2YXIgb2I9e0RFRzJSQUQ6TWF0aC5QSS8xODAsUkFEMkRFRzoxODAvTWF0aC5QSSxnZW5lcmF0ZVVVSUQ6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZT0wOzI1Nj5lO2UrKyliW2VdPSgxNj5lPyIwIjoiIikrZS50b1N0cmluZygxNik7CnJldHVybiBmdW5jdGlvbigpe3ZhciBoPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLG49NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsdT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCx3PTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwO3JldHVybihiW2gmMjU1XStiW2g+PjgmMjU1XStiW2g+PjE2JjI1NV0rYltoPj4yNCYyNTVdKyItIitiW24mMjU1XStiW24+PjgmMjU1XSsiLSIrYltuPj4xNiYxNXw2NF0rYltuPj4yNCYyNTVdKyItIitiW3UmNjN8MTI4XStiW3U+PjgmMjU1XSsiLSIrYlt1Pj4xNiYyNTVdK2JbdT4+MjQmMjU1XStiW3cmMjU1XStiW3c+PjgmMjU1XStiW3c+PjE2JjI1NV0rYlt3Pj4yNCYyNTVdKS50b1VwcGVyQ2FzZSgpfX0oKSxjbGFtcDpmdW5jdGlvbihiLGUsaCl7cmV0dXJuIE1hdGgubWF4KGUsTWF0aC5taW4oaCxiKSl9LGV1Y2xpZGVhbk1vZHVsbzpmdW5jdGlvbihiLGUpe3JldHVybihiJWUrZSklZX0sbWFwTGluZWFyOmZ1bmN0aW9uKGIsZSxoLApuLHUpe3JldHVybiBuKyhiLWUpKih1LW4pLyhoLWUpfSxsZXJwOmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4oMS1oKSpiK2gqZX0sc21vb3Roc3RlcDpmdW5jdGlvbihiLGUsaCl7aWYoYjw9ZSlyZXR1cm4gMDtpZihiPj1oKXJldHVybiAxO2I9KGItZSkvKGgtZSk7cmV0dXJuIGIqYiooMy0yKmIpfSxzbW9vdGhlcnN0ZXA6ZnVuY3Rpb24oYixlLGgpe2lmKGI8PWUpcmV0dXJuIDA7aWYoYj49aClyZXR1cm4gMTtiPShiLWUpLyhoLWUpO3JldHVybiBiKmIqYiooYiooNipiLTE1KSsxMCl9LHJhbmRJbnQ6ZnVuY3Rpb24oYixlKXtyZXR1cm4gYitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKGUtYisxKSl9LHJhbmRGbG9hdDpmdW5jdGlvbihiLGUpe3JldHVybiBiK01hdGgucmFuZG9tKCkqKGUtYil9LHJhbmRGbG9hdFNwcmVhZDpmdW5jdGlvbihiKXtyZXR1cm4gYiooLjUtTWF0aC5yYW5kb20oKSl9LGRlZ1RvUmFkOmZ1bmN0aW9uKGIpe3JldHVybiBiKm9iLkRFRzJSQUR9LHJhZFRvRGVnOmZ1bmN0aW9uKGIpe3JldHVybiBiKgpvYi5SQUQyREVHfSxpc1Bvd2VyT2ZUd286ZnVuY3Rpb24oYil7cmV0dXJuIDA9PT0oYiZiLTEpJiYwIT09Yn0sY2VpbFBvd2VyT2ZUd286ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKGIpL01hdGguTE4yKSl9LGZsb29yUG93ZXJPZlR3bzpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5wb3coMixNYXRoLmZsb29yKE1hdGgubG9nKGIpL01hdGguTE4yKSl9fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkLnByb3RvdHlwZSx7d2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnh9LHNldDpmdW5jdGlvbihiKXt0aGlzLng9Yn19LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueX0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMueT1ifX19KTtPYmplY3QuYXNzaWduKGQucHJvdG90eXBlLHtpc1ZlY3RvcjI6ITAsc2V0OmZ1bmN0aW9uKGIsZSl7dGhpcy54PWI7dGhpcy55PWU7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLnk9CnRoaXMueD1iO3JldHVybiB0aGlzfSxzZXRYOmZ1bmN0aW9uKGIpe3RoaXMueD1iO3JldHVybiB0aGlzfSxzZXRZOmZ1bmN0aW9uKGIpe3RoaXMueT1iO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYixlKXtzd2l0Y2goYil7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYik7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYil7c3dpdGNoKGIpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitiKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX0sY29weTpmdW5jdGlvbihiKXt0aGlzLng9Yi54O3RoaXMueT1iLnk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihiLAplKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYixlKTt0aGlzLngrPWIueDt0aGlzLnkrPWIueTtyZXR1cm4gdGhpc30sYWRkU2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMueCs9Yjt0aGlzLnkrPWI7cmV0dXJuIHRoaXN9LGFkZFZlY3RvcnM6ZnVuY3Rpb24oYixlKXt0aGlzLng9Yi54K2UueDt0aGlzLnk9Yi55K2UueTtyZXR1cm4gdGhpc30sYWRkU2NhbGVkVmVjdG9yOmZ1bmN0aW9uKGIsZSl7dGhpcy54Kz1iLngqZTt0aGlzLnkrPWIueSplO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5zdWJWZWN0b3JzKGIsZSk7dGhpcy54LT1iLng7dGhpcy55LT1iLnk7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngtPWI7dGhpcy55LT1iO3JldHVybiB0aGlzfSxzdWJWZWN0b3JzOmZ1bmN0aW9uKGIsZSl7dGhpcy54PWIueC1lLng7dGhpcy55PWIueS1lLnk7cmV0dXJuIHRoaXN9LG11bHRpcGx5OmZ1bmN0aW9uKGIpe3RoaXMueCo9Yi54O3RoaXMueSo9Yi55O3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngqPWI7dGhpcy55Kj1iO3JldHVybiB0aGlzfSxkaXZpZGU6ZnVuY3Rpb24oYil7dGhpcy54Lz1iLng7dGhpcy55Lz1iLnk7cmV0dXJuIHRoaXN9LGRpdmlkZVNjYWxhcjpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL2IpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LGg9dGhpcy55O2I9Yi5lbGVtZW50czt0aGlzLng9YlswXSplK2JbM10qaCtiWzZdO3RoaXMueT0KYlsxXSplK2JbNF0qaCtiWzddO3JldHVybiB0aGlzfSxtaW46ZnVuY3Rpb24oYil7dGhpcy54PU1hdGgubWluKHRoaXMueCxiLngpO3RoaXMueT1NYXRoLm1pbih0aGlzLnksYi55KTtyZXR1cm4gdGhpc30sbWF4OmZ1bmN0aW9uKGIpe3RoaXMueD1NYXRoLm1heCh0aGlzLngsYi54KTt0aGlzLnk9TWF0aC5tYXgodGhpcy55LGIueSk7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKGIsZSl7dGhpcy54PU1hdGgubWF4KGIueCxNYXRoLm1pbihlLngsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGIueSxNYXRoLm1pbihlLnksdGhpcy55KSk7cmV0dXJuIHRoaXN9LGNsYW1wU2NhbGFyOmZ1bmN0aW9uKGIsZSl7dGhpcy54PU1hdGgubWF4KGIsTWF0aC5taW4oZSx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYixNYXRoLm1pbihlLHRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcExlbmd0aDpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGh8fAoxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heChiLE1hdGgubWluKGUsaCkpKX0sZmxvb3I6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT1NYXRoLmZsb29yKHRoaXMueSk7cmV0dXJuIHRoaXN9LGNlaWw6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5jZWlsKHRoaXMueCk7dGhpcy55PU1hdGguY2VpbCh0aGlzLnkpO3JldHVybiB0aGlzfSxyb3VuZDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9MD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7cmV0dXJuIHRoaXN9LG5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMueD0tdGhpcy54O3RoaXMueT0tdGhpcy55O3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMueCoKYi54K3RoaXMueSpiLnl9LGNyb3NzOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLngqYi55LXRoaXMueSpiLnh9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX0sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSxtYW5oYXR0YW5MZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9LGFuZ2xlOmZ1bmN0aW9uKCl7dmFyIGI9TWF0aC5hdGFuMih0aGlzLnksdGhpcy54KTswPmImJihiKz0yKk1hdGguUEkpO3JldHVybiBifSxkaXN0YW5jZVRvOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZChiKSl9LGRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGIpe3ZhciBlPQp0aGlzLngtYi54O2I9dGhpcy55LWIueTtyZXR1cm4gZSplK2IqYn0sbWFuaGF0dGFuRGlzdGFuY2VUbzpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5hYnModGhpcy54LWIueCkrTWF0aC5hYnModGhpcy55LWIueSl9LHNldExlbmd0aDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihiKX0sbGVycDpmdW5jdGlvbihiLGUpe3RoaXMueCs9KGIueC10aGlzLngpKmU7dGhpcy55Kz0oYi55LXRoaXMueSkqZTtyZXR1cm4gdGhpc30sbGVycFZlY3RvcnM6ZnVuY3Rpb24oYixlLGgpe3JldHVybiB0aGlzLnN1YlZlY3RvcnMoZSxiKS5tdWx0aXBseVNjYWxhcihoKS5hZGQoYil9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi54PT09dGhpcy54JiZiLnk9PT10aGlzLnl9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO3RoaXMueD1iW2VdO3RoaXMueT1iW2UrMV07cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYiwKZSl7dm9pZCAwPT09YiYmKGI9W10pO3ZvaWQgMD09PWUmJihlPTApO2JbZV09dGhpcy54O2JbZSsxXT10aGlzLnk7cmV0dXJuIGJ9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe3ZvaWQgMCE9PWgmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3RoaXMueD1iLmdldFgoZSk7dGhpcy55PWIuZ2V0WShlKTtyZXR1cm4gdGhpc30scm90YXRlQXJvdW5kOmZ1bmN0aW9uKGIsZSl7dmFyIGg9TWF0aC5jb3MoZSk7ZT1NYXRoLnNpbihlKTt2YXIgbj10aGlzLngtYi54LHU9dGhpcy55LWIueTt0aGlzLng9bipoLXUqZStiLng7dGhpcy55PW4qZSt1KmgrYi55O3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oZix7c2xlcnA6ZnVuY3Rpb24oYixlLGgsbil7cmV0dXJuIGguY29weShiKS5zbGVycChlLG4pfSxzbGVycEZsYXQ6ZnVuY3Rpb24oYixlLGgsbix1LHcseil7dmFyIEU9CmhbbiswXSxIPWhbbisxXSxJPWhbbisyXTtoPWhbbiszXTtuPXVbdyswXTt2YXIgTz11W3crMV0sUT11W3crMl07dT11W3crM107aWYoaCE9PXV8fEUhPT1ufHxIIT09T3x8SSE9PVEpe3c9MS16O3ZhciBSPUUqbitIKk8rSSpRK2gqdSxVPTA8PVI/MTotMSxXPTEtUipSO1c+TnVtYmVyLkVQU0lMT04mJihXPU1hdGguc3FydChXKSxSPU1hdGguYXRhbjIoVyxSKlUpLHc9TWF0aC5zaW4odypSKS9XLHo9TWF0aC5zaW4oeipSKS9XKTtVKj16O0U9RSp3K24qVTtIPUgqdytPKlU7ST1JKncrUSpVO2g9aCp3K3UqVTt3PT09MS16JiYoej0xL01hdGguc3FydChFKkUrSCpIK0kqSStoKmgpLEUqPXosSCo9eixJKj16LGgqPXopfWJbZV09RTtiW2UrMV09SDtiW2UrMl09STtiW2UrM109aH19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmLnByb3RvdHlwZSx7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihiKXt0aGlzLl94PWI7dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCl9fSwKeTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihiKXt0aGlzLl95PWI7dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCl9fSx6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3o9Yjt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKX19LHc6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93fSxzZXQ6ZnVuY3Rpb24oYil7dGhpcy5fdz1iO3RoaXMub25DaGFuZ2VDYWxsYmFjaygpfX19KTtPYmplY3QuYXNzaWduKGYucHJvdG90eXBlLHtpc1F1YXRlcm5pb246ITAsc2V0OmZ1bmN0aW9uKGIsZSxoLG4pe3RoaXMuX3g9Yjt0aGlzLl95PWU7dGhpcy5fej1oO3RoaXMuX3c9bjt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fdyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5feD0KYi54O3RoaXMuX3k9Yi55O3RoaXMuX3o9Yi56O3RoaXMuX3c9Yi53O3RoaXMub25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tRXVsZXI6ZnVuY3Rpb24oYixlKXtpZighYnx8IWIuaXNFdWxlcil0aHJvdyBFcnJvcigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7dmFyIGg9Yi5feCxuPWIuX3ksdT1iLl96O2I9Yi5vcmRlcjt2YXIgdz1NYXRoLmNvcyx6PU1hdGguc2luLEU9dyhoLzIpLEg9dyhuLzIpO3c9dyh1LzIpO2g9eihoLzIpO249eihuLzIpO3U9eih1LzIpOyJYWVoiPT09Yj8odGhpcy5feD1oKkgqdytFKm4qdSx0aGlzLl95PUUqbip3LWgqSCp1LHRoaXMuX3o9RSpIKnUraCpuKncsdGhpcy5fdz1FKkgqdy1oKm4qdSk6IllYWiI9PT1iPyh0aGlzLl94PWgqSCp3K0Uqbip1LHRoaXMuX3k9RSpuKnctaCpIKnUsdGhpcy5fej1FKgpIKnUtaCpuKncsdGhpcy5fdz1FKkgqdytoKm4qdSk6IlpYWSI9PT1iPyh0aGlzLl94PWgqSCp3LUUqbip1LHRoaXMuX3k9RSpuKncraCpIKnUsdGhpcy5fej1FKkgqdStoKm4qdyx0aGlzLl93PUUqSCp3LWgqbip1KToiWllYIj09PWI/KHRoaXMuX3g9aCpIKnctRSpuKnUsdGhpcy5feT1FKm4qdytoKkgqdSx0aGlzLl96PUUqSCp1LWgqbip3LHRoaXMuX3c9RSpIKncraCpuKnUpOiJZWlgiPT09Yj8odGhpcy5feD1oKkgqdytFKm4qdSx0aGlzLl95PUUqbip3K2gqSCp1LHRoaXMuX3o9RSpIKnUtaCpuKncsdGhpcy5fdz1FKkgqdy1oKm4qdSk6IlhaWSI9PT1iJiYodGhpcy5feD1oKkgqdy1FKm4qdSx0aGlzLl95PUUqbip3LWgqSCp1LHRoaXMuX3o9RSpIKnUraCpuKncsdGhpcy5fdz1FKkgqdytoKm4qdSk7aWYoITEhPT1lKXRoaXMub25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGIsZSl7ZS89Mjt2YXIgaD1NYXRoLnNpbihlKTsKdGhpcy5feD1iLngqaDt0aGlzLl95PWIueSpoO3RoaXMuX3o9Yi56Kmg7dGhpcy5fdz1NYXRoLmNvcyhlKTt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGIpe3ZhciBlPWIuZWxlbWVudHMsaD1lWzBdO2I9ZVs0XTt2YXIgbj1lWzhdLHU9ZVsxXSx3PWVbNV0sej1lWzldLEU9ZVsyXSxIPWVbNl07ZT1lWzEwXTt2YXIgST1oK3crZTswPEk/KGg9LjUvTWF0aC5zcXJ0KEkrMSksdGhpcy5fdz0uMjUvaCx0aGlzLl94PShILXopKmgsdGhpcy5feT0obi1FKSpoLHRoaXMuX3o9KHUtYikqaCk6aD53JiZoPmU/KGg9MipNYXRoLnNxcnQoMStoLXctZSksdGhpcy5fdz0oSC16KS9oLHRoaXMuX3g9LjI1KmgsdGhpcy5feT0oYit1KS9oLHRoaXMuX3o9KG4rRSkvaCk6dz5lPyhoPTIqTWF0aC5zcXJ0KDErdy1oLWUpLHRoaXMuX3c9KG4tRSkvaCx0aGlzLl94PShiK3UpL2gsdGhpcy5feT0uMjUqaCx0aGlzLl96PSh6K0gpLwpoKTooaD0yKk1hdGguc3FydCgxK2UtaC13KSx0aGlzLl93PSh1LWIpL2gsdGhpcy5feD0obitFKS9oLHRoaXMuX3k9KHorSCkvaCx0aGlzLl96PS4yNSpoKTt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVVuaXRWZWN0b3JzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi5kb3QoZSkrMTsxRS02Pmg/KGg9MCxNYXRoLmFicyhiLngpPk1hdGguYWJzKGIueik/KHRoaXMuX3g9LWIueSx0aGlzLl95PWIueCx0aGlzLl96PTApOih0aGlzLl94PTAsdGhpcy5feT0tYi56LHRoaXMuX3o9Yi55KSk6KHRoaXMuX3g9Yi55KmUuei1iLnoqZS55LHRoaXMuX3k9Yi56KmUueC1iLngqZS56LHRoaXMuX3o9Yi54KmUueS1iLnkqZS54KTt0aGlzLl93PWg7cmV0dXJuIHRoaXMubm9ybWFsaXplKCl9LGFuZ2xlVG86ZnVuY3Rpb24oYil7cmV0dXJuIDIqTWF0aC5hY29zKE1hdGguYWJzKG9iLmNsYW1wKHRoaXMuZG90KGIpLC0xLDEpKSl9LHJvdGF0ZVRvd2FyZHM6ZnVuY3Rpb24oYiwKZSl7dmFyIGg9dGhpcy5hbmdsZVRvKGIpO2lmKDA9PT1oKXJldHVybiB0aGlzO3RoaXMuc2xlcnAoYixNYXRoLm1pbigxLGUvaCkpO3JldHVybiB0aGlzfSxpbnZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9LGNvbmp1Z2F0ZTpmdW5jdGlvbigpe3RoaXMuX3gqPS0xO3RoaXMuX3kqPS0xO3RoaXMuX3oqPS0xO3RoaXMub25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX3gqYi5feCt0aGlzLl95KmIuX3krdGhpcy5feipiLl96K3RoaXMuX3cqYi5fd30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmxlbmd0aCgpOzA9PT1iPyh0aGlzLl96PXRoaXMuX3k9dGhpcy5feD0wLHRoaXMuX3c9MSk6KGI9MS9iLHRoaXMuX3gqPWIsdGhpcy5feSo9Yix0aGlzLl96Kj1iLHRoaXMuX3cqPWIpO3RoaXMub25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiLGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyhiLGUpKTp0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyxiKX0scHJlbXVsdGlwbHk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyhiLHRoaXMpfSxtdWx0aXBseVF1YXRlcm5pb25zOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi5feCxuPWIuX3ksdT1iLl96O2I9Yi5fdzsKdmFyIHc9ZS5feCx6PWUuX3ksRT1lLl96O2U9ZS5fdzt0aGlzLl94PWgqZStiKncrbipFLXUqejt0aGlzLl95PW4qZStiKnordSp3LWgqRTt0aGlzLl96PXUqZStiKkUraCp6LW4qdzt0aGlzLl93PWIqZS1oKnctbip6LXUqRTt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2xlcnA6ZnVuY3Rpb24oYixlKXtpZigwPT09ZSlyZXR1cm4gdGhpcztpZigxPT09ZSlyZXR1cm4gdGhpcy5jb3B5KGIpO3ZhciBoPXRoaXMuX3gsbj10aGlzLl95LHU9dGhpcy5feix3PXRoaXMuX3csej13KmIuX3craCpiLl94K24qYi5feSt1KmIuX3o7MD56Pyh0aGlzLl93PS1iLl93LHRoaXMuX3g9LWIuX3gsdGhpcy5feT0tYi5feSx0aGlzLl96PS1iLl96LHo9LXopOnRoaXMuY29weShiKTtpZigxPD16KXJldHVybiB0aGlzLl93PXcsdGhpcy5feD1oLHRoaXMuX3k9bix0aGlzLl96PXUsdGhpcztiPTEteip6O2lmKGI8PU51bWJlci5FUFNJTE9OKXJldHVybiB6PTEtZSx0aGlzLl93PXoqCncrZSp0aGlzLl93LHRoaXMuX3g9eipoK2UqdGhpcy5feCx0aGlzLl95PXoqbitlKnRoaXMuX3ksdGhpcy5fej16KnUrZSp0aGlzLl96LHRoaXMubm9ybWFsaXplKCk7Yj1NYXRoLnNxcnQoYik7dmFyIEU9TWF0aC5hdGFuMihiLHopO3o9TWF0aC5zaW4oKDEtZSkqRSkvYjtlPU1hdGguc2luKGUqRSkvYjt0aGlzLl93PXcqeit0aGlzLl93KmU7dGhpcy5feD1oKnordGhpcy5feCplO3RoaXMuX3k9bip6K3RoaXMuX3kqZTt0aGlzLl96PXUqeit0aGlzLl96KmU7dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5feD09PXRoaXMuX3gmJmIuX3k9PT10aGlzLl95JiZiLl96PT09dGhpcy5feiYmYi5fdz09PXRoaXMuX3d9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO3RoaXMuX3g9YltlXTt0aGlzLl95PWJbZSsxXTt0aGlzLl96PWJbZSsyXTt0aGlzLl93PWJbZSszXTt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKcmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7YltlXT10aGlzLl94O2JbZSsxXT10aGlzLl95O2JbZSsyXT10aGlzLl96O2JbZSszXT10aGlzLl93O3JldHVybiBifSxvbkNoYW5nZTpmdW5jdGlvbihiKXt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2s9YjtyZXR1cm4gdGhpc30sb25DaGFuZ2VDYWxsYmFjazpmdW5jdGlvbigpe319KTtPYmplY3QuYXNzaWduKGcucHJvdG90eXBlLHtpc1ZlY3RvcjM6ITAsc2V0OmZ1bmN0aW9uKGIsZSxoKXt0aGlzLng9Yjt0aGlzLnk9ZTt0aGlzLno9aDtyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMuej10aGlzLnk9dGhpcy54PWI7cmV0dXJuIHRoaXN9LHNldFg6ZnVuY3Rpb24oYil7dGhpcy54PWI7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYil7dGhpcy55PWI7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYil7dGhpcy56PWI7cmV0dXJuIHRoaXN9LApzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYixlKXtzd2l0Y2goYil7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2IpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGIpe3N3aXRjaChiKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYik7fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMueD1iLng7dGhpcy55PWIueTt0aGlzLno9Yi56O3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5hZGRWZWN0b3JzKGIsZSk7dGhpcy54Kz1iLng7dGhpcy55Kz1iLnk7dGhpcy56Kz1iLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngrPWI7dGhpcy55Kz1iO3RoaXMueis9YjtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngrZS54O3RoaXMueT1iLnkrZS55O3RoaXMuej1iLnorZS56O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYixlKXt0aGlzLngrPWIueCplO3RoaXMueSs9Yi55KmU7dGhpcy56Kz1iLnoqZTtyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGIsZSl7aWYodm9pZCAwIT09ZSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKGIsZSk7dGhpcy54LT1iLng7dGhpcy55LT1iLnk7dGhpcy56LT1iLno7CnJldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54LT1iO3RoaXMueS09Yjt0aGlzLnotPWI7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYixlKXt0aGlzLng9Yi54LWUueDt0aGlzLnk9Yi55LWUueTt0aGlzLno9Yi56LWUuejtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVZlY3RvcnMoYixlKTt0aGlzLngqPWIueDt0aGlzLnkqPWIueTt0aGlzLnoqPWIuejtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54Kj1iO3RoaXMueSo9Yjt0aGlzLnoqPWI7cmV0dXJuIHRoaXN9LG11bHRpcGx5VmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngqCmUueDt0aGlzLnk9Yi55KmUueTt0aGlzLno9Yi56KmUuejtyZXR1cm4gdGhpc30sYXBwbHlFdWxlcjpmdW5jdGlvbigpe3ZhciBiPW5ldyBmO3JldHVybiBmdW5jdGlvbihlKXtlJiZlLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oYi5zZXRGcm9tRXVsZXIoZSkpfX0oKSxhcHBseUF4aXNBbmdsZTpmdW5jdGlvbigpe3ZhciBiPW5ldyBmO3JldHVybiBmdW5jdGlvbihlLGgpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiLnNldEZyb21BeGlzQW5nbGUoZSxoKSl9fSgpLGFwcGx5TWF0cml4MzpmdW5jdGlvbihiKXt2YXIgZT10aGlzLngsaD10aGlzLnksbj10aGlzLno7Yj1iLmVsZW1lbnRzO3RoaXMueD1iWzBdKmUrYlszXSpoK2JbNl0qbjt0aGlzLnk9YlsxXSplKwpiWzRdKmgrYls3XSpuO3RoaXMuej1iWzJdKmUrYls1XSpoK2JbOF0qbjtyZXR1cm4gdGhpc30sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMueCxoPXRoaXMueSxuPXRoaXMuejtiPWIuZWxlbWVudHM7dmFyIHU9MS8oYlszXSplK2JbN10qaCtiWzExXSpuK2JbMTVdKTt0aGlzLng9KGJbMF0qZStiWzRdKmgrYls4XSpuK2JbMTJdKSp1O3RoaXMueT0oYlsxXSplK2JbNV0qaCtiWzldKm4rYlsxM10pKnU7dGhpcy56PShiWzJdKmUrYls2XSpoK2JbMTBdKm4rYlsxNF0pKnU7cmV0dXJuIHRoaXN9LGFwcGx5UXVhdGVybmlvbjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLngsaD10aGlzLnksbj10aGlzLnosdT1iLngsdz1iLnksej1iLno7Yj1iLnc7dmFyIEU9YiplK3cqbi16KmgsSD1iKmgreiplLXUqbixJPWIqbit1KmgtdyplO2U9LXUqZS13KmgteipuO3RoaXMueD1FKmIrZSotdStIKi16LUkqLXc7dGhpcy55PUgqYitlKi13K0kqLXUtRSotejt0aGlzLno9SSpiK2UqLXorCkUqLXctSCotdTtyZXR1cm4gdGhpc30scHJvamVjdDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoYi5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NChiLnByb2plY3Rpb25NYXRyaXgpfSx1bnByb2plY3Q6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGIucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NChiLm1hdHJpeFdvcmxkKX0sdHJhbnNmb3JtRGlyZWN0aW9uOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMueCxoPXRoaXMueSxuPXRoaXMuejtiPWIuZWxlbWVudHM7dGhpcy54PWJbMF0qZStiWzRdKmgrYls4XSpuO3RoaXMueT1iWzFdKmUrYls1XSpoK2JbOV0qbjt0aGlzLno9YlsyXSplK2JbNl0qaCtiWzEwXSpuO3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpfSxkaXZpZGU6ZnVuY3Rpb24oYil7dGhpcy54Lz1iLng7dGhpcy55Lz1iLnk7dGhpcy56Lz1iLno7cmV0dXJuIHRoaXN9LGRpdmlkZVNjYWxhcjpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxLwpiKX0sbWluOmZ1bmN0aW9uKGIpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYi54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LGIueSk7dGhpcy56PU1hdGgubWluKHRoaXMueixiLnopO3JldHVybiB0aGlzfSxtYXg6ZnVuY3Rpb24oYil7dGhpcy54PU1hdGgubWF4KHRoaXMueCxiLngpO3RoaXMueT1NYXRoLm1heCh0aGlzLnksYi55KTt0aGlzLno9TWF0aC5tYXgodGhpcy56LGIueik7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKGIsZSl7dGhpcy54PU1hdGgubWF4KGIueCxNYXRoLm1pbihlLngsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGIueSxNYXRoLm1pbihlLnksdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGIueixNYXRoLm1pbihlLnosdGhpcy56KSk7cmV0dXJuIHRoaXN9LGNsYW1wU2NhbGFyOmZ1bmN0aW9uKGIsZSl7dGhpcy54PU1hdGgubWF4KGIsTWF0aC5taW4oZSx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYixNYXRoLm1pbihlLHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChiLApNYXRoLm1pbihlLHRoaXMueikpO3JldHVybiB0aGlzfSxjbGFtcExlbmd0aDpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGh8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGIsTWF0aC5taW4oZSxoKSkpfSxmbG9vcjpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PU1hdGguZmxvb3IodGhpcy55KTt0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopO3JldHVybiB0aGlzfSxjZWlsOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguY2VpbCh0aGlzLngpO3RoaXMueT1NYXRoLmNlaWwodGhpcy55KTt0aGlzLno9TWF0aC5jZWlsKHRoaXMueik7cmV0dXJuIHRoaXN9LHJvdW5kOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3RoaXMuej1NYXRoLnJvdW5kKHRoaXMueik7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PQowPnRoaXMueD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PTA+dGhpcy55P01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KTt0aGlzLno9MD50aGlzLno/TWF0aC5jZWlsKHRoaXMueik6TWF0aC5mbG9vcih0aGlzLnopO3JldHVybiB0aGlzfSxuZWdhdGU6ZnVuY3Rpb24oKXt0aGlzLng9LXRoaXMueDt0aGlzLnk9LXRoaXMueTt0aGlzLno9LXRoaXMuejtyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLngqYi54K3RoaXMueSpiLnkrdGhpcy56KmIuen0sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnp9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfSxtYW5oYXR0YW5MZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpKwpNYXRoLmFicyh0aGlzLnopfSxub3JtYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9LHNldExlbmd0aDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihiKX0sbGVycDpmdW5jdGlvbihiLGUpe3RoaXMueCs9KGIueC10aGlzLngpKmU7dGhpcy55Kz0oYi55LXRoaXMueSkqZTt0aGlzLnorPShiLnotdGhpcy56KSplO3JldHVybiB0aGlzfSxsZXJwVmVjdG9yczpmdW5jdGlvbihiLGUsaCl7cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyhlLGIpLm11bHRpcGx5U2NhbGFyKGgpLmFkZChiKX0sY3Jvc3M6ZnVuY3Rpb24oYixlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuY3Jvc3MoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5jcm9zc1ZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuY3Jvc3NWZWN0b3JzKGIsZSkpOnRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsCmIpfSxjcm9zc1ZlY3RvcnM6ZnVuY3Rpb24oYixlKXt2YXIgaD1iLngsbj1iLnk7Yj1iLno7dmFyIHU9ZS54LHc9ZS55O2U9ZS56O3RoaXMueD1uKmUtYip3O3RoaXMueT1iKnUtaCplO3RoaXMuej1oKnctbip1O3JldHVybiB0aGlzfSxwcm9qZWN0T25WZWN0b3I6ZnVuY3Rpb24oYil7dmFyIGU9Yi5kb3QodGhpcykvYi5sZW5ndGhTcSgpO3JldHVybiB0aGlzLmNvcHkoYikubXVsdGlwbHlTY2FsYXIoZSl9LHByb2plY3RPblBsYW5lOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKGUpe2IuY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IoZSk7cmV0dXJuIHRoaXMuc3ViKGIpfX0oKSxyZWZsZWN0OmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN1YihiLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoMip0aGlzLmRvdChlKSkpfX0oKSxhbmdsZVRvOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLmFjb3Mob2IuY2xhbXAodGhpcy5kb3QoYikvCk1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqYi5sZW5ndGhTcSgpKSwtMSwxKSl9LGRpc3RhbmNlVG86ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGIpKX0sZGlzdGFuY2VUb1NxdWFyZWQ6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LWIueCxoPXRoaXMueS1iLnk7Yj10aGlzLnotYi56O3JldHVybiBlKmUraCpoK2IqYn0sbWFuaGF0dGFuRGlzdGFuY2VUbzpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5hYnModGhpcy54LWIueCkrTWF0aC5hYnModGhpcy55LWIueSkrTWF0aC5hYnModGhpcy56LWIueil9LHNldEZyb21TcGhlcmljYWw6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3JkcyhiLnJhZGl1cyxiLnBoaSxiLnRoZXRhKX0sc2V0RnJvbVNwaGVyaWNhbENvb3JkczpmdW5jdGlvbihiLGUsaCl7dmFyIG49TWF0aC5zaW4oZSkqYjt0aGlzLng9bipNYXRoLnNpbihoKTt0aGlzLnk9TWF0aC5jb3MoZSkqYjsKdGhpcy56PW4qTWF0aC5jb3MoaCk7cmV0dXJuIHRoaXN9LHNldEZyb21DeWxpbmRyaWNhbDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoYi5yYWRpdXMsYi50aGV0YSxiLnkpfSxzZXRGcm9tQ3lsaW5kcmljYWxDb29yZHM6ZnVuY3Rpb24oYixlLGgpe3RoaXMueD1iKk1hdGguc2luKGUpO3RoaXMueT1oO3RoaXMuej1iKk1hdGguY29zKGUpO3JldHVybiB0aGlzfSxzZXRGcm9tTWF0cml4UG9zaXRpb246ZnVuY3Rpb24oYil7Yj1iLmVsZW1lbnRzO3RoaXMueD1iWzEyXTt0aGlzLnk9YlsxM107dGhpcy56PWJbMTRdO3JldHVybiB0aGlzfSxzZXRGcm9tTWF0cml4U2NhbGU6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGIsMCkubGVuZ3RoKCksaD10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYiwxKS5sZW5ndGgoKTtiPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihiLDIpLmxlbmd0aCgpO3RoaXMueD1lO3RoaXMueT0KaDt0aGlzLno9YjtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeENvbHVtbjpmdW5jdGlvbihiLGUpe3JldHVybiB0aGlzLmZyb21BcnJheShiLmVsZW1lbnRzLDQqZSl9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi54PT09dGhpcy54JiZiLnk9PT10aGlzLnkmJmIuej09PXRoaXMuen0sZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy54PWJbZV07dGhpcy55PWJbZSsxXTt0aGlzLno9YltlKzJdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09YiYmKGI9W10pO3ZvaWQgMD09PWUmJihlPTApO2JbZV09dGhpcy54O2JbZSsxXT10aGlzLnk7YltlKzJdPXRoaXMuejtyZXR1cm4gYn0sZnJvbUJ1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihiLGUsaCl7dm9pZCAwIT09aCYmY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7CnRoaXMueD1iLmdldFgoZSk7dGhpcy55PWIuZ2V0WShlKTt0aGlzLno9Yi5nZXRaKGUpO3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24obC5wcm90b3R5cGUse2lzTWF0cml4MzohMCxzZXQ6ZnVuY3Rpb24oYixlLGgsbix1LHcseixFLEgpe3ZhciBJPXRoaXMuZWxlbWVudHM7SVswXT1iO0lbMV09bjtJWzJdPXo7SVszXT1lO0lbNF09dTtJWzVdPUU7SVs2XT1oO0lbN109dztJWzhdPUg7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfSxjb3B5OmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZWxlbWVudHM7Yj1iLmVsZW1lbnRzO2VbMF09YlswXTtlWzFdPWJbMV07ZVsyXT1iWzJdO2VbM109YlszXTtlWzRdPWJbNF07ZVs1XT1iWzVdO2VbNl09Yls2XTtlWzddPWJbN107ZVs4XT0KYls4XTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeDQ6ZnVuY3Rpb24oYil7Yj1iLmVsZW1lbnRzO3RoaXMuc2V0KGJbMF0sYls0XSxiWzhdLGJbMV0sYls1XSxiWzldLGJbMl0sYls2XSxiWzEwXSk7cmV0dXJuIHRoaXN9LGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZztyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBoPTAsbj1lLmNvdW50O2g8bjtoKyspYi54PWUuZ2V0WChoKSxiLnk9ZS5nZXRZKGgpLGIuej1lLmdldFooaCksYi5hcHBseU1hdHJpeDModGhpcyksZS5zZXRYWVooaCxiLngsYi55LGIueik7cmV0dXJuIGV9fSgpLG11bHRpcGx5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyxiKX0scHJlbXVsdGlwbHk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhiLHRoaXMpfSxtdWx0aXBseU1hdHJpY2VzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi5lbGVtZW50cyxuPWUuZWxlbWVudHM7CmU9dGhpcy5lbGVtZW50cztiPWhbMF07dmFyIHU9aFszXSx3PWhbNl0sej1oWzFdLEU9aFs0XSxIPWhbN10sST1oWzJdLE89aFs1XTtoPWhbOF07dmFyIFE9blswXSxSPW5bM10sVT1uWzZdLFc9blsxXSxaPW5bNF0sZmE9bls3XSxxYT1uWzJdLHJhPW5bNV07bj1uWzhdO2VbMF09YipRK3UqVyt3KnFhO2VbM109YipSK3UqWit3KnJhO2VbNl09YipVK3UqZmErdypuO2VbMV09eipRK0UqVytIKnFhO2VbNF09eipSK0UqWitIKnJhO2VbN109eipVK0UqZmErSCpuO2VbMl09SSpRK08qVytoKnFhO2VbNV09SSpSK08qWitoKnJhO2VbOF09SSpVK08qZmEraCpuO3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0qPWI7ZVszXSo9YjtlWzZdKj1iO2VbMV0qPWI7ZVs0XSo9YjtlWzddKj1iO2VbMl0qPWI7ZVs1XSo9YjtlWzhdKj1iO3JldHVybiB0aGlzfSxkZXRlcm1pbmFudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudHMsCmU9YlswXSxoPWJbMV0sbj1iWzJdLHU9YlszXSx3PWJbNF0sej1iWzVdLEU9Yls2XSxIPWJbN107Yj1iWzhdO3JldHVybiBlKncqYi1lKnoqSC1oKnUqYitoKnoqRStuKnUqSC1uKncqRX0sZ2V0SW52ZXJzZTpmdW5jdGlvbihiLGUpe2ImJmIuaXNNYXRyaXg0JiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIG5vIGxvbmdlciB0YWtlcyBhIE1hdHJpeDQgYXJndW1lbnQuIik7dmFyIGg9Yi5lbGVtZW50cztiPXRoaXMuZWxlbWVudHM7dmFyIG49aFswXSx1PWhbMV0sdz1oWzJdLHo9aFszXSxFPWhbNF0sSD1oWzVdLEk9aFs2XSxPPWhbN107aD1oWzhdO3ZhciBRPWgqRS1IKk8sUj1IKkktaCp6LFU9Typ6LUUqSSxXPW4qUSt1KlIrdypVO2lmKDA9PT1XKXtpZighMD09PWUpdGhyb3cgRXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7CnJldHVybiB0aGlzLmlkZW50aXR5KCl9ZT0xL1c7YlswXT1RKmU7YlsxXT0odypPLWgqdSkqZTtiWzJdPShIKnUtdypFKSplO2JbM109UiplO2JbNF09KGgqbi13KkkpKmU7Yls1XT0odyp6LUgqbikqZTtiWzZdPVUqZTtiWzddPSh1KkktTypuKSplO2JbOF09KEUqbi11KnopKmU7cmV0dXJuIHRoaXN9LHRyYW5zcG9zZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudHM7dmFyIGU9YlsxXTtiWzFdPWJbM107YlszXT1lO2U9YlsyXTtiWzJdPWJbNl07Yls2XT1lO2U9Yls1XTtiWzVdPWJbN107Yls3XT1lO3JldHVybiB0aGlzfSxnZXROb3JtYWxNYXRyaXg6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQoYikuZ2V0SW52ZXJzZSh0aGlzKS50cmFuc3Bvc2UoKX0sdHJhbnNwb3NlSW50b0FycmF5OmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZWxlbWVudHM7YlswXT1lWzBdO2JbMV09ZVszXTtiWzJdPWVbNl07YlszXT1lWzFdO2JbNF09ZVs0XTtiWzVdPWVbN107Yls2XT0KZVsyXTtiWzddPWVbNV07Yls4XT1lWzhdO3JldHVybiB0aGlzfSxzZXRVdlRyYW5zZm9ybTpmdW5jdGlvbihiLGUsaCxuLHUsdyx6KXt2YXIgRT1NYXRoLmNvcyh1KTt1PU1hdGguc2luKHUpO3RoaXMuc2V0KGgqRSxoKnUsLWgqKEUqdyt1KnopK3crYiwtbip1LG4qRSwtbiooLXUqdytFKnopK3orZSwwLDAsMSl9LHNjYWxlOmZ1bmN0aW9uKGIsZSl7dmFyIGg9dGhpcy5lbGVtZW50cztoWzBdKj1iO2hbM10qPWI7aFs2XSo9YjtoWzFdKj1lO2hbNF0qPWU7aFs3XSo9ZTtyZXR1cm4gdGhpc30scm90YXRlOmZ1bmN0aW9uKGIpe3ZhciBlPU1hdGguY29zKGIpO2I9TWF0aC5zaW4oYik7dmFyIGg9dGhpcy5lbGVtZW50cyxuPWhbMF0sdT1oWzNdLHc9aFs2XSx6PWhbMV0sRT1oWzRdLEg9aFs3XTtoWzBdPWUqbitiKno7aFszXT1lKnUrYipFO2hbNl09ZSp3K2IqSDtoWzFdPS1iKm4rZSp6O2hbNF09LWIqdStlKkU7aFs3XT0tYip3K2UqSDtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIsCmUpe3ZhciBoPXRoaXMuZWxlbWVudHM7aFswXSs9YipoWzJdO2hbM10rPWIqaFs1XTtoWzZdKz1iKmhbOF07aFsxXSs9ZSpoWzJdO2hbNF0rPWUqaFs1XTtoWzddKz1lKmhbOF07cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2I9Yi5lbGVtZW50cztmb3IodmFyIGg9MDs5Pmg7aCsrKWlmKGVbaF0hPT1iW2hdKXJldHVybiExO3JldHVybiEwfSxmcm9tQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoZT0wKTtmb3IodmFyIGg9MDs5Pmg7aCsrKXRoaXMuZWxlbWVudHNbaF09YltoK2VdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09YiYmKGI9W10pO3ZvaWQgMD09PWUmJihlPTApO3ZhciBoPXRoaXMuZWxlbWVudHM7YltlXT1oWzBdO2JbZSsxXT1oWzFdO2JbZSsyXT1oWzJdO2JbZSszXT1oWzNdO2JbZSs0XT1oWzRdO2JbZSs1XT1oWzVdO2JbZSs2XT1oWzZdO2JbZSs3XT1oWzddO2JbZSs4XT1oWzhdOwpyZXR1cm4gYn19KTt2YXIgc2YsWWQ9e2dldERhdGFVUkw6ZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gYi5zcmM7aWYoIShiIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpKXt2b2lkIDA9PT1zZiYmKHNmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImNhbnZhcyIpKTtzZi53aWR0aD1iLndpZHRoO3NmLmhlaWdodD1iLmhlaWdodDt2YXIgZT1zZi5nZXRDb250ZXh0KCIyZCIpO2IgaW5zdGFuY2VvZiBJbWFnZURhdGE/ZS5wdXRJbWFnZURhdGEoYiwwLDApOmUuZHJhd0ltYWdlKGIsMCwwLGIud2lkdGgsYi5oZWlnaHQpO2I9c2Z9cmV0dXJuIDIwNDg8Yi53aWR0aHx8MjA0ODxiLmhlaWdodD9iLnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsLjYpOmIudG9EYXRhVVJMKCJpbWFnZS9wbmciKX19LEtuPTA7ay5ERUZBVUxUX0lNQUdFPXZvaWQgMDtrLkRFRkFVTFRfTUFQUElORz0KMzAwO2sucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmssaXNUZXh0dXJlOiEwLHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLm5hbWU9Yi5uYW1lO3RoaXMuaW1hZ2U9Yi5pbWFnZTt0aGlzLm1pcG1hcHM9Yi5taXBtYXBzLnNsaWNlKDApO3RoaXMubWFwcGluZz1iLm1hcHBpbmc7dGhpcy53cmFwUz1iLndyYXBTO3RoaXMud3JhcFQ9Yi53cmFwVDt0aGlzLm1hZ0ZpbHRlcj1iLm1hZ0ZpbHRlcjt0aGlzLm1pbkZpbHRlcj1iLm1pbkZpbHRlcjt0aGlzLmFuaXNvdHJvcHk9CmIuYW5pc290cm9weTt0aGlzLmZvcm1hdD1iLmZvcm1hdDt0aGlzLnR5cGU9Yi50eXBlO3RoaXMub2Zmc2V0LmNvcHkoYi5vZmZzZXQpO3RoaXMucmVwZWF0LmNvcHkoYi5yZXBlYXQpO3RoaXMuY2VudGVyLmNvcHkoYi5jZW50ZXIpO3RoaXMucm90YXRpb249Yi5yb3RhdGlvbjt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9Yi5tYXRyaXhBdXRvVXBkYXRlO3RoaXMubWF0cml4LmNvcHkoYi5tYXRyaXgpO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPWIuZ2VuZXJhdGVNaXBtYXBzO3RoaXMucHJlbXVsdGlwbHlBbHBoYT1iLnByZW11bHRpcGx5QWxwaGE7dGhpcy5mbGlwWT1iLmZsaXBZO3RoaXMudW5wYWNrQWxpZ25tZW50PWIudW5wYWNrQWxpZ25tZW50O3RoaXMuZW5jb2Rpbmc9Yi5lbmNvZGluZztyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGIpe3ZhciBlPXZvaWQgMD09PWJ8fCJzdHJpbmciPT09dHlwZW9mIGI7aWYoIWUmJnZvaWQgMCE9PWIudGV4dHVyZXNbdGhpcy51dWlkXSlyZXR1cm4gYi50ZXh0dXJlc1t0aGlzLnV1aWRdOwp2YXIgaD17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxtYXBwaW5nOnRoaXMubWFwcGluZyxyZXBlYXQ6W3RoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueV0sb2Zmc2V0Olt0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnldLGNlbnRlcjpbdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55XSxyb3RhdGlvbjp0aGlzLnJvdGF0aW9uLHdyYXA6W3RoaXMud3JhcFMsdGhpcy53cmFwVF0sZm9ybWF0OnRoaXMuZm9ybWF0LHR5cGU6dGhpcy50eXBlLGVuY29kaW5nOnRoaXMuZW5jb2RpbmcsbWluRmlsdGVyOnRoaXMubWluRmlsdGVyLG1hZ0ZpbHRlcjp0aGlzLm1hZ0ZpbHRlcixhbmlzb3Ryb3B5OnRoaXMuYW5pc290cm9weSxmbGlwWTp0aGlzLmZsaXBZLHByZW11bHRpcGx5QWxwaGE6dGhpcy5wcmVtdWx0aXBseUFscGhhLHVucGFja0FsaWdubWVudDp0aGlzLnVucGFja0FsaWdubWVudH07CmlmKHZvaWQgMCE9PXRoaXMuaW1hZ2Upe3ZhciBuPXRoaXMuaW1hZ2U7dm9pZCAwPT09bi51dWlkJiYobi51dWlkPW9iLmdlbmVyYXRlVVVJRCgpKTtpZighZSYmdm9pZCAwPT09Yi5pbWFnZXNbbi51dWlkXSl7aWYoQXJyYXkuaXNBcnJheShuKSl7dmFyIHU9W107Zm9yKHZhciB3PTAsej1uLmxlbmd0aDt3PHo7dysrKXUucHVzaChZZC5nZXREYXRhVVJMKG5bd10pKX1lbHNlIHU9WWQuZ2V0RGF0YVVSTChuKTtiLmltYWdlc1tuLnV1aWRdPXt1dWlkOm4udXVpZCx1cmw6dX19aC5pbWFnZT1uLnV1aWR9ZXx8KGIudGV4dHVyZXNbdGhpcy51dWlkXT1oKTtyZXR1cm4gaH0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX0sdHJhbnNmb3JtVXY6ZnVuY3Rpb24oYil7aWYoMzAwIT09dGhpcy5tYXBwaW5nKXJldHVybiBiO2IuYXBwbHlNYXRyaXgzKHRoaXMubWF0cml4KTtpZigwPmIueHx8MTxiLngpc3dpdGNoKHRoaXMud3JhcFMpe2Nhc2UgMUUzOmIueC09Ck1hdGguZmxvb3IoYi54KTticmVhaztjYXNlIDEwMDE6Yi54PTA+Yi54PzA6MTticmVhaztjYXNlIDEwMDI6Yi54PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGIueCklMik/TWF0aC5jZWlsKGIueCktYi54OmIueC1NYXRoLmZsb29yKGIueCl9aWYoMD5iLnl8fDE8Yi55KXN3aXRjaCh0aGlzLndyYXBUKXtjYXNlIDFFMzpiLnktPU1hdGguZmxvb3IoYi55KTticmVhaztjYXNlIDEwMDE6Yi55PTA+Yi55PzA6MTticmVhaztjYXNlIDEwMDI6Yi55PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGIueSklMik/TWF0aC5jZWlsKGIueSktYi55OmIueS1NYXRoLmZsb29yKGIueSl9dGhpcy5mbGlwWSYmKGIueT0xLWIueSk7cmV0dXJuIGJ9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGsucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihiKXshMD09PWImJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24obS5wcm90b3R5cGUse2lzVmVjdG9yNDohMCxzZXQ6ZnVuY3Rpb24oYiwKZSxoLG4pe3RoaXMueD1iO3RoaXMueT1lO3RoaXMuej1oO3RoaXMudz1uO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy53PXRoaXMuej10aGlzLnk9dGhpcy54PWI7cmV0dXJuIHRoaXN9LHNldFg6ZnVuY3Rpb24oYil7dGhpcy54PWI7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYil7dGhpcy55PWI7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYil7dGhpcy56PWI7cmV0dXJuIHRoaXN9LHNldFc6ZnVuY3Rpb24oYil7dGhpcy53PWI7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihiLGUpe3N3aXRjaChiKXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2IpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGIpe3N3aXRjaChiKXtjYXNlIDA6cmV0dXJuIHRoaXMueDsKY2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2IpO319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy54PWIueDt0aGlzLnk9Yi55O3RoaXMuej1iLno7dGhpcy53PXZvaWQgMCE9PWIudz9iLnc6MTtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGIsZSl7aWYodm9pZCAwIT09ZSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGIsZSk7dGhpcy54Kz1iLng7dGhpcy55Kz1iLnk7dGhpcy56Kz1iLno7dGhpcy53Kz1iLnc7cmV0dXJuIHRoaXN9LAphZGRTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54Kz1iO3RoaXMueSs9Yjt0aGlzLnorPWI7dGhpcy53Kz1iO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGIsZSl7dGhpcy54PWIueCtlLng7dGhpcy55PWIueStlLnk7dGhpcy56PWIueitlLno7dGhpcy53PWIudytlLnc7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihiLGUpe3RoaXMueCs9Yi54KmU7dGhpcy55Kz1iLnkqZTt0aGlzLnorPWIueiplO3RoaXMudys9Yi53KmU7cmV0dXJuIHRoaXN9LHN1YjpmdW5jdGlvbihiLGUpe2lmKHZvaWQgMCE9PWUpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyhiLGUpO3RoaXMueC09Yi54O3RoaXMueS09Yi55O3RoaXMuei09Yi56O3RoaXMudy09Yi53O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54LT0KYjt0aGlzLnktPWI7dGhpcy56LT1iO3RoaXMudy09YjtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngtZS54O3RoaXMueT1iLnktZS55O3RoaXMuej1iLnotZS56O3RoaXMudz1iLnctZS53O3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngqPWI7dGhpcy55Kj1iO3RoaXMueio9Yjt0aGlzLncqPWI7cmV0dXJuIHRoaXN9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihiKXt2YXIgZT10aGlzLngsaD10aGlzLnksbj10aGlzLnosdT10aGlzLnc7Yj1iLmVsZW1lbnRzO3RoaXMueD1iWzBdKmUrYls0XSpoK2JbOF0qbitiWzEyXSp1O3RoaXMueT1iWzFdKmUrYls1XSpoK2JbOV0qbitiWzEzXSp1O3RoaXMuej1iWzJdKmUrYls2XSpoK2JbMTBdKm4rYlsxNF0qdTt0aGlzLnc9YlszXSplK2JbN10qaCtiWzExXSpuK2JbMTVdKnU7cmV0dXJuIHRoaXN9LGRpdmlkZVNjYWxhcjpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxLwpiKX0sc2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYil7dGhpcy53PTIqTWF0aC5hY29zKGIudyk7dmFyIGU9TWF0aC5zcXJ0KDEtYi53KmIudyk7MUUtND5lPyh0aGlzLng9MSx0aGlzLno9dGhpcy55PTApOih0aGlzLng9Yi54L2UsdGhpcy55PWIueS9lLHRoaXMuej1iLnovZSk7cmV0dXJuIHRoaXN9LHNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihiKXtiPWIuZWxlbWVudHM7dmFyIGU9YlswXTt2YXIgaD1iWzRdO3ZhciBuPWJbOF0sdT1iWzFdLHc9Yls1XSx6PWJbOV07dmFyIEU9YlsyXTt2YXIgSD1iWzZdO3ZhciBJPWJbMTBdO2lmKC4wMT5NYXRoLmFicyhoLXUpJiYuMDE+TWF0aC5hYnMobi1FKSYmLjAxPk1hdGguYWJzKHotSCkpe2lmKC4xPk1hdGguYWJzKGgrdSkmJi4xPk1hdGguYWJzKG4rRSkmJi4xPk1hdGguYWJzKHorSCkmJi4xPk1hdGguYWJzKGUrdytJLTMpKXJldHVybiB0aGlzLnNldCgxLDAsMCwwKSx0aGlzO2I9TWF0aC5QSTsKZT0oZSsxKS8yO3c9KHcrMSkvMjtJPShJKzEpLzI7aD0oaCt1KS80O249KG4rRSkvNDt6PSh6K0gpLzQ7ZT53JiZlPkk/LjAxPmU/KEg9MCxoPUU9LjcwNzEwNjc4MSk6KEg9TWF0aC5zcXJ0KGUpLEU9aC9ILGg9bi9IKTp3Pkk/LjAxPnc/KEg9LjcwNzEwNjc4MSxFPTAsaD0uNzA3MTA2NzgxKTooRT1NYXRoLnNxcnQodyksSD1oL0UsaD16L0UpOi4wMT5JPyhFPUg9LjcwNzEwNjc4MSxoPTApOihoPU1hdGguc3FydChJKSxIPW4vaCxFPXovaCk7dGhpcy5zZXQoSCxFLGgsYik7cmV0dXJuIHRoaXN9Yj1NYXRoLnNxcnQoKEgteikqKEgteikrKG4tRSkqKG4tRSkrKHUtaCkqKHUtaCkpOy4wMDE+TWF0aC5hYnMoYikmJihiPTEpO3RoaXMueD0oSC16KS9iO3RoaXMueT0obi1FKS9iO3RoaXMuej0odS1oKS9iO3RoaXMudz1NYXRoLmFjb3MoKGUrdytJLTEpLzIpO3JldHVybiB0aGlzfSxtaW46ZnVuY3Rpb24oYil7dGhpcy54PU1hdGgubWluKHRoaXMueCxiLngpO3RoaXMueT1NYXRoLm1pbih0aGlzLnksCmIueSk7dGhpcy56PU1hdGgubWluKHRoaXMueixiLnopO3RoaXMudz1NYXRoLm1pbih0aGlzLncsYi53KTtyZXR1cm4gdGhpc30sbWF4OmZ1bmN0aW9uKGIpe3RoaXMueD1NYXRoLm1heCh0aGlzLngsYi54KTt0aGlzLnk9TWF0aC5tYXgodGhpcy55LGIueSk7dGhpcy56PU1hdGgubWF4KHRoaXMueixiLnopO3RoaXMudz1NYXRoLm1heCh0aGlzLncsYi53KTtyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oYixlKXt0aGlzLng9TWF0aC5tYXgoYi54LE1hdGgubWluKGUueCx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYi55LE1hdGgubWluKGUueSx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYi56LE1hdGgubWluKGUueix0aGlzLnopKTt0aGlzLnc9TWF0aC5tYXgoYi53LE1hdGgubWluKGUudyx0aGlzLncpKTtyZXR1cm4gdGhpc30sY2xhbXBTY2FsYXI6ZnVuY3Rpb24oKXt2YXIgYixlO3JldHVybiBmdW5jdGlvbihoLG4pe3ZvaWQgMD09PWImJihiPW5ldyBtLGU9bmV3IG0pO2Iuc2V0KGgsCmgsaCxoKTtlLnNldChuLG4sbixuKTtyZXR1cm4gdGhpcy5jbGFtcChiLGUpfX0oKSxjbGFtcExlbmd0aDpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGh8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGIsTWF0aC5taW4oZSxoKSkpfSxmbG9vcjpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PU1hdGguZmxvb3IodGhpcy55KTt0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopO3RoaXMudz1NYXRoLmZsb29yKHRoaXMudyk7cmV0dXJuIHRoaXN9LGNlaWw6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5jZWlsKHRoaXMueCk7dGhpcy55PU1hdGguY2VpbCh0aGlzLnkpO3RoaXMuej1NYXRoLmNlaWwodGhpcy56KTt0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyk7cmV0dXJuIHRoaXN9LHJvdW5kOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpOwp0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3RoaXMudz1NYXRoLnJvdW5kKHRoaXMudyk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej0wPnRoaXMuej9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueik7dGhpcy53PTA+dGhpcy53P01hdGguY2VpbCh0aGlzLncpOk1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7dGhpcy53PS10aGlzLnc7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy54KmIueCt0aGlzLnkqYi55K3RoaXMueipiLnordGhpcy53KmIud30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54Kgp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9LHNldExlbmd0aDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihiKX0sbGVycDpmdW5jdGlvbihiLGUpe3RoaXMueCs9KGIueC10aGlzLngpKmU7dGhpcy55Kz0oYi55LXRoaXMueSkqZTt0aGlzLnorPShiLnotdGhpcy56KSplO3RoaXMudys9KGIudy10aGlzLncpKmU7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGIsCmUsaCl7cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyhlLGIpLm11bHRpcGx5U2NhbGFyKGgpLmFkZChiKX0sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLng9PT10aGlzLngmJmIueT09PXRoaXMueSYmYi56PT09dGhpcy56JiZiLnc9PT10aGlzLnd9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO3RoaXMueD1iW2VdO3RoaXMueT1iW2UrMV07dGhpcy56PWJbZSsyXTt0aGlzLnc9YltlKzNdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09YiYmKGI9W10pO3ZvaWQgMD09PWUmJihlPTApO2JbZV09dGhpcy54O2JbZSsxXT10aGlzLnk7YltlKzJdPXRoaXMuejtiW2UrM109dGhpcy53O3JldHVybiBifSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGIsZSxoKXt2b2lkIDAhPT1oJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTsKdGhpcy54PWIuZ2V0WChlKTt0aGlzLnk9Yi5nZXRZKGUpO3RoaXMuej1iLmdldFooZSk7dGhpcy53PWIuZ2V0VyhlKTtyZXR1cm4gdGhpc319KTtwLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpwLGlzV2ViR0xSZW5kZXJUYXJnZXQ6ITAsc2V0U2l6ZTpmdW5jdGlvbihiLGUpe2lmKHRoaXMud2lkdGghPT1ifHx0aGlzLmhlaWdodCE9PWUpdGhpcy53aWR0aD1iLHRoaXMuaGVpZ2h0PWUsdGhpcy5kaXNwb3NlKCk7dGhpcy52aWV3cG9ydC5zZXQoMCwwLGIsZSk7dGhpcy5zY2lzc29yLnNldCgwLDAsYixlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy53aWR0aD1iLndpZHRoO3RoaXMuaGVpZ2h0PWIuaGVpZ2h0O3RoaXMudmlld3BvcnQuY29weShiLnZpZXdwb3J0KTt0aGlzLnRleHR1cmU9Yi50ZXh0dXJlLmNsb25lKCk7CnRoaXMuZGVwdGhCdWZmZXI9Yi5kZXB0aEJ1ZmZlcjt0aGlzLnN0ZW5jaWxCdWZmZXI9Yi5zdGVuY2lsQnVmZmVyO3RoaXMuZGVwdGhUZXh0dXJlPWIuZGVwdGhUZXh0dXJlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO3EucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShwLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnEsaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OiEwLGNvcHk6ZnVuY3Rpb24oYil7cC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5zYW1wbGVzPWIuc2FtcGxlcztyZXR1cm4gdGhpc319KTtyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHAucHJvdG90eXBlKTtyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yO3IucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPSEwO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoay5wcm90b3R5cGUpOwp0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10O3QucHJvdG90eXBlLmlzRGF0YVRleHR1cmU9ITA7T2JqZWN0LmFzc2lnbih2LnByb3RvdHlwZSx7aXNCb3gzOiEwLHNldDpmdW5jdGlvbihiLGUpe3RoaXMubWluLmNvcHkoYik7dGhpcy5tYXguY29weShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbUFycmF5OmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1JbmZpbml0eSxoPUluZmluaXR5LG49SW5maW5pdHksdT0tSW5maW5pdHksdz0tSW5maW5pdHksej0tSW5maW5pdHksRT0wLEg9Yi5sZW5ndGg7RTxIO0UrPTMpe3ZhciBJPWJbRV0sTz1iW0UrMV0sUT1iW0UrMl07STxlJiYoZT1JKTtPPGgmJihoPU8pO1E8biYmKG49USk7ST51JiYodT1JKTtPPncmJih3PU8pO1E+eiYmKHo9USl9dGhpcy5taW4uc2V0KGUsaCxuKTt0aGlzLm1heC5zZXQodSx3LHopO3JldHVybiB0aGlzfSxzZXRGcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1JbmZpbml0eSxoPUluZmluaXR5LG49SW5maW5pdHksCnU9LUluZmluaXR5LHc9LUluZmluaXR5LHo9LUluZmluaXR5LEU9MCxIPWIuY291bnQ7RTxIO0UrKyl7dmFyIEk9Yi5nZXRYKEUpLE89Yi5nZXRZKEUpLFE9Yi5nZXRaKEUpO0k8ZSYmKGU9SSk7TzxoJiYoaD1PKTtRPG4mJihuPVEpO0k+dSYmKHU9SSk7Tz53JiYodz1PKTtRPnomJih6PVEpfXRoaXMubWluLnNldChlLGgsbik7dGhpcy5tYXguc2V0KHUsdyx6KTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihiKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgZT0wLGg9Yi5sZW5ndGg7ZTxoO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYltlXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKGUsaCl7aD1iLmNvcHkoaCkubXVsdGlwbHlTY2FsYXIoLjUpO3RoaXMubWluLmNvcHkoZSkuc3ViKGgpO3RoaXMubWF4LmNvcHkoZSkuYWRkKGgpO3JldHVybiB0aGlzfX0oKSxzZXRGcm9tT2JqZWN0OmZ1bmN0aW9uKGIpe3RoaXMubWFrZUVtcHR5KCk7CnJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KGIpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLm1pbi5jb3B5KGIubWluKTt0aGlzLm1heC5jb3B5KGIubWF4KTtyZXR1cm4gdGhpc30sbWFrZUVtcHR5OmZ1bmN0aW9uKCl7dGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9SW5maW5pdHk7dGhpcy5tYXgueD10aGlzLm1heC55PXRoaXMubWF4Lno9LUluZmluaXR5O3JldHVybiB0aGlzfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9LGdldENlbnRlcjpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3JldHVybiB0aGlzLmlzRW1wdHkoKT8KYi5zZXQoMCwwLDApOmIuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfSxnZXRTaXplOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3JldHVybiB0aGlzLmlzRW1wdHkoKT9iLnNldCgwLDAsMCk6Yi5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX0sZXhwYW5kQnlQb2ludDpmdW5jdGlvbihiKXt0aGlzLm1pbi5taW4oYik7dGhpcy5tYXgubWF4KGIpO3JldHVybiB0aGlzfSxleHBhbmRCeVZlY3RvcjpmdW5jdGlvbihiKXt0aGlzLm1pbi5zdWIoYik7dGhpcy5tYXguYWRkKGIpO3JldHVybiB0aGlzfSxleHBhbmRCeVNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLm1pbi5hZGRTY2FsYXIoLWIpO3RoaXMubWF4LmFkZFNjYWxhcihiKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlPYmplY3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKHcpe3ZhciB6PQp3Lmdlb21ldHJ5O2lmKHZvaWQgMCE9PXopaWYoei5pc0dlb21ldHJ5KWZvcih6PXoudmVydGljZXMsaD0wLG49ei5sZW5ndGg7aDxuO2grKyl1LmNvcHkoeltoXSksdS5hcHBseU1hdHJpeDQody5tYXRyaXhXb3JsZCksZS5leHBhbmRCeVBvaW50KHUpO2Vsc2UgaWYoei5pc0J1ZmZlckdlb21ldHJ5JiYoej16LmF0dHJpYnV0ZXMucG9zaXRpb24sdm9pZCAwIT09eikpZm9yKGg9MCxuPXouY291bnQ7aDxuO2grKyl1LmZyb21CdWZmZXJBdHRyaWJ1dGUoeixoKS5hcHBseU1hdHJpeDQody5tYXRyaXhXb3JsZCksZS5leHBhbmRCeVBvaW50KHUpfXZhciBlLGgsbix1PW5ldyBnO3JldHVybiBmdW5jdGlvbih3KXtlPXRoaXM7dy51cGRhdGVNYXRyaXhXb3JsZCghMCk7dy50cmF2ZXJzZShiKTtyZXR1cm4gdGhpc319KCksY29udGFpbnNQb2ludDpmdW5jdGlvbihiKXtyZXR1cm4gYi54PHRoaXMubWluLnh8fGIueD50aGlzLm1heC54fHxiLnk8dGhpcy5taW4ueXx8Yi55PnRoaXMubWF4Lnl8fApiLno8dGhpcy5taW4uenx8Yi56PnRoaXMubWF4Lno/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm1pbi54PD1iLm1pbi54JiZiLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1iLm1pbi55JiZiLm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD1iLm1pbi56JiZiLm1heC56PD10aGlzLm1heC56fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGcpO3JldHVybiBlLnNldCgoYi54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLChiLnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKGIuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIubWF4Lng8dGhpcy5taW4ueHx8CmIubWluLng+dGhpcy5tYXgueHx8Yi5tYXgueTx0aGlzLm1pbi55fHxiLm1pbi55PnRoaXMubWF4Lnl8fGIubWF4Lno8dGhpcy5taW4uenx8Yi5taW4uej50aGlzLm1heC56PyExOiEwfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMuY2xhbXBQb2ludChlLmNlbnRlcixiKTtyZXR1cm4gYi5kaXN0YW5jZVRvU3F1YXJlZChlLmNlbnRlcik8PWUucmFkaXVzKmUucmFkaXVzfX0oKSxpbnRlcnNlY3RzUGxhbmU6ZnVuY3Rpb24oYil7aWYoMDxiLm5vcm1hbC54KXt2YXIgZT1iLm5vcm1hbC54KnRoaXMubWluLng7dmFyIGg9Yi5ub3JtYWwueCp0aGlzLm1heC54fWVsc2UgZT1iLm5vcm1hbC54KnRoaXMubWF4LngsaD1iLm5vcm1hbC54KnRoaXMubWluLng7MDxiLm5vcm1hbC55PyhlKz1iLm5vcm1hbC55KnRoaXMubWluLnksaCs9Yi5ub3JtYWwueSp0aGlzLm1heC55KTooZSs9Yi5ub3JtYWwueSp0aGlzLm1heC55LGgrPQpiLm5vcm1hbC55KnRoaXMubWluLnkpOzA8Yi5ub3JtYWwuej8oZSs9Yi5ub3JtYWwueip0aGlzLm1pbi56LGgrPWIubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPWIubm9ybWFsLnoqdGhpcy5tYXgueixoKz1iLm5vcm1hbC56KnRoaXMubWluLnopO3JldHVybiBlPD0tYi5jb25zdGFudCYmaD49LWIuY29uc3RhbnR9LGludGVyc2VjdHNUcmlhbmdsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoUSl7dmFyIFI7dmFyIFU9MDtmb3IoUj1RLmxlbmd0aC0zO1U8PVI7VSs9Myl7RS5mcm9tQXJyYXkoUSxVKTt2YXIgVz1lLmRvdChFKSxaPWguZG90KEUpLGZhPW4uZG90KEUpO2lmKE1hdGgubWF4KC1NYXRoLm1heChXLFosZmEpLE1hdGgubWluKFcsWixmYSkpPkkueCpNYXRoLmFicyhFLngpK0kueSpNYXRoLmFicyhFLnkpK0kueipNYXRoLmFicyhFLnopKXJldHVybiExfXJldHVybiEwfXZhciBlPW5ldyBnLGg9bmV3IGcsbj1uZXcgZyx1PW5ldyBnLHc9bmV3IGcsej1uZXcgZyxFPW5ldyBnLEg9Cm5ldyBnLEk9bmV3IGcsTz1uZXcgZztyZXR1cm4gZnVuY3Rpb24oUSl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoSCk7SS5zdWJWZWN0b3JzKHRoaXMubWF4LEgpO2Uuc3ViVmVjdG9ycyhRLmEsSCk7aC5zdWJWZWN0b3JzKFEuYixIKTtuLnN1YlZlY3RvcnMoUS5jLEgpO3Uuc3ViVmVjdG9ycyhoLGUpO3cuc3ViVmVjdG9ycyhuLGgpO3ouc3ViVmVjdG9ycyhlLG4pO1E9WzAsLXUueix1LnksMCwtdy56LHcueSwwLC16Lnosei55LHUueiwwLC11Lngsdy56LDAsLXcueCx6LnosMCwtei54LC11LnksdS54LDAsLXcueSx3LngsMCwtei55LHoueCwwXTtpZighYihRKSlyZXR1cm4hMTtRPVsxLDAsMCwwLDEsMCwwLDAsMV07aWYoIWIoUSkpcmV0dXJuITE7Ty5jcm9zc1ZlY3RvcnModSx3KTtRPVtPLngsTy55LE8uel07cmV0dXJuIGIoUSl9fSgpLGNsYW1wUG9pbnQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSwKZT1uZXcgZyk7cmV0dXJuIGUuY29weShiKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbigpe3ZhciBiPW5ldyBnO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gYi5jb3B5KGUpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5zdWIoZSkubGVuZ3RoKCl9fSgpLGdldEJvdW5kaW5nU3BoZXJlOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKTt0aGlzLmdldENlbnRlcihlLmNlbnRlcik7ZS5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKGIpLmxlbmd0aCgpO3JldHVybiBlfX0oKSxpbnRlcnNlY3Q6ZnVuY3Rpb24oYil7dGhpcy5taW4ubWF4KGIubWluKTt0aGlzLm1heC5taW4oYi5tYXgpO3RoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpO3JldHVybiB0aGlzfSx1bmlvbjpmdW5jdGlvbihiKXt0aGlzLm1pbi5taW4oYi5taW4pOwp0aGlzLm1heC5tYXgoYi5tYXgpO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oKXt2YXIgYj1bbmV3IGcsbmV3IGcsbmV3IGcsbmV3IGcsbmV3IGcsbmV3IGcsbmV3IGcsbmV3IGddO3JldHVybiBmdW5jdGlvbihlKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcztiWzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGUpO2JbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoZSk7YlsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKTtiWzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGUpO2JbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoZSk7Yls1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChlKTsKYls2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKTtiWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGUpO3RoaXMuc2V0RnJvbVBvaW50cyhiKTtyZXR1cm4gdGhpc319KCksdHJhbnNsYXRlOmZ1bmN0aW9uKGIpe3RoaXMubWluLmFkZChiKTt0aGlzLm1heC5hZGQoYik7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5taW4uZXF1YWxzKHRoaXMubWluKSYmYi5tYXguZXF1YWxzKHRoaXMubWF4KX19KTtPYmplY3QuYXNzaWduKEEucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYixlKXt0aGlzLmNlbnRlci5jb3B5KGIpO3RoaXMucmFkaXVzPWU7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgdjtyZXR1cm4gZnVuY3Rpb24oZSxoKXt2YXIgbj10aGlzLmNlbnRlcjt2b2lkIDAhPT1oP24uY29weShoKTpiLnNldEZyb21Qb2ludHMoZSkuZ2V0Q2VudGVyKG4pOwpmb3IodmFyIHU9aD0wLHc9ZS5sZW5ndGg7dTx3O3UrKyloPU1hdGgubWF4KGgsbi5kaXN0YW5jZVRvU3F1YXJlZChlW3VdKSk7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGgpO3JldHVybiB0aGlzfX0oKSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLmNlbnRlci5jb3B5KGIuY2VudGVyKTt0aGlzLnJhZGl1cz1iLnJhZGl1cztyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gMD49dGhpcy5yYWRpdXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c30sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGIpe3JldHVybiBiLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLXRoaXMucmFkaXVzfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMucmFkaXVzKwpiLnJhZGl1cztyZXR1cm4gYi5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLmFicyhiLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c30sY2xhbXBQb2ludDpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKGIpO3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZTogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZT1uZXcgZyk7ZS5jb3B5KGIpO2g+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSk7cmV0dXJuIGV9LGdldEJvdW5kaW5nQm94OmZ1bmN0aW9uKGIpe3ZvaWQgMD09PQpiJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyB2KTtiLnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlcik7Yi5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyk7cmV0dXJuIGJ9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihiKXt0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoYik7dGhpcy5yYWRpdXMqPWIuZ2V0TWF4U2NhbGVPbkF4aXMoKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIpe3RoaXMuY2VudGVyLmFkZChiKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZiLnJhZGl1cz09PXRoaXMucmFkaXVzfX0pO09iamVjdC5hc3NpZ24oeS5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUpe3RoaXMubm9ybWFsLmNvcHkoYik7dGhpcy5jb25zdGFudD1lO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnRzOmZ1bmN0aW9uKGIsCmUsaCxuKXt0aGlzLm5vcm1hbC5zZXQoYixlLGgpO3RoaXMuY29uc3RhbnQ9bjtyZXR1cm4gdGhpc30sc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQ6ZnVuY3Rpb24oYixlKXt0aGlzLm5vcm1hbC5jb3B5KGIpO3RoaXMuY29uc3RhbnQ9LWUuZG90KHRoaXMubm9ybWFsKTtyZXR1cm4gdGhpc30sc2V0RnJvbUNvcGxhbmFyUG9pbnRzOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGcsZT1uZXcgZztyZXR1cm4gZnVuY3Rpb24oaCxuLHUpe249Yi5zdWJWZWN0b3JzKHUsbikuY3Jvc3MoZS5zdWJWZWN0b3JzKGgsbikpLm5vcm1hbGl6ZSgpO3RoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQobixoKTtyZXR1cm4gdGhpc319KCksY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5ub3JtYWwuY29weShiLm5vcm1hbCk7dGhpcy5jb25zdGFudD1iLmNvbnN0YW50O3JldHVybiB0aGlzfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt2YXIgYj0KMS90aGlzLm5vcm1hbC5sZW5ndGgoKTt0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhcihiKTt0aGlzLmNvbnN0YW50Kj1iO3JldHVybiB0aGlzfSxuZWdhdGU6ZnVuY3Rpb24oKXt0aGlzLmNvbnN0YW50Kj0tMTt0aGlzLm5vcm1hbC5uZWdhdGUoKTtyZXR1cm4gdGhpc30sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm5vcm1hbC5kb3QoYikrdGhpcy5jb25zdGFudH0sZGlzdGFuY2VUb1NwaGVyZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoYi5jZW50ZXIpLWIucmFkaXVzfSxwcm9qZWN0UG9pbnQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLnByb2plY3RQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxlPW5ldyBnKTtyZXR1cm4gZS5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5kaXN0YW5jZVRvUG9pbnQoYikpLmFkZChiKX0saW50ZXJzZWN0TGluZTpmdW5jdGlvbigpe3ZhciBiPQpuZXcgZztyZXR1cm4gZnVuY3Rpb24oZSxoKXt2b2lkIDA9PT1oJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmludGVyc2VjdExpbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksaD1uZXcgZyk7dmFyIG49ZS5kZWx0YShiKSx1PXRoaXMubm9ybWFsLmRvdChuKTtpZigwPT09dSl7aWYoMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KGUuc3RhcnQpKXJldHVybiBoLmNvcHkoZS5zdGFydCl9ZWxzZSBpZih1PS0oZS5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL3UsISgwPnV8fDE8dSkpcmV0dXJuIGguY29weShuKS5tdWx0aXBseVNjYWxhcih1KS5hZGQoZS5zdGFydCl9fSgpLGludGVyc2VjdHNMaW5lOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZGlzdGFuY2VUb1BvaW50KGIuc3RhcnQpO2I9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYi5lbmQpO3JldHVybiAwPmUmJjA8Ynx8MD5iJiYwPGV9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSwKaW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pbnRlcnNlY3RzUGxhbmUodGhpcyl9LGNvcGxhbmFyUG9pbnQ6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3JldHVybiBiLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGcsZT1uZXcgbDtyZXR1cm4gZnVuY3Rpb24oaCxuKXtuPW58fGUuZ2V0Tm9ybWFsTWF0cml4KGgpO2g9dGhpcy5jb3BsYW5hclBvaW50KGIpLmFwcGx5TWF0cml4NChoKTtuPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhuKS5ub3JtYWxpemUoKTt0aGlzLmNvbnN0YW50PS1oLmRvdChuKTtyZXR1cm4gdGhpc319KCksdHJhbnNsYXRlOmZ1bmN0aW9uKGIpe3RoaXMuY29uc3RhbnQtPWIuZG90KHRoaXMubm9ybWFsKTsKcmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5ub3JtYWwuZXF1YWxzKHRoaXMubm9ybWFsKSYmYi5jb25zdGFudD09PXRoaXMuY29uc3RhbnR9fSk7T2JqZWN0LmFzc2lnbih4LnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGIsZSxoLG4sdSx3KXt2YXIgej10aGlzLnBsYW5lczt6WzBdLmNvcHkoYik7elsxXS5jb3B5KGUpO3pbMl0uY29weShoKTt6WzNdLmNvcHkobik7els0XS5jb3B5KHUpO3pbNV0uY29weSh3KTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPXRoaXMucGxhbmVzLGg9MDs2Pmg7aCsrKWVbaF0uY29weShiLnBsYW5lc1toXSk7cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXg6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5wbGFuZXMsaD1iLmVsZW1lbnRzO2I9aFswXTt2YXIgbj1oWzFdLHU9aFsyXSx3PWhbM10sej1oWzRdLApFPWhbNV0sSD1oWzZdLEk9aFs3XSxPPWhbOF0sUT1oWzldLFI9aFsxMF0sVT1oWzExXSxXPWhbMTJdLFo9aFsxM10sZmE9aFsxNF07aD1oWzE1XTtlWzBdLnNldENvbXBvbmVudHMody1iLEkteixVLU8saC1XKS5ub3JtYWxpemUoKTtlWzFdLnNldENvbXBvbmVudHModytiLEkreixVK08saCtXKS5ub3JtYWxpemUoKTtlWzJdLnNldENvbXBvbmVudHModytuLEkrRSxVK1EsaCtaKS5ub3JtYWxpemUoKTtlWzNdLnNldENvbXBvbmVudHMody1uLEktRSxVLVEsaC1aKS5ub3JtYWxpemUoKTtlWzRdLnNldENvbXBvbmVudHMody11LEktSCxVLVIsaC1mYSkubm9ybWFsaXplKCk7ZVs1XS5zZXRDb21wb25lbnRzKHcrdSxJK0gsVStSLGgrZmEpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfSxpbnRlcnNlY3RzT2JqZWN0OmZ1bmN0aW9uKCl7dmFyIGI9bmV3IEE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBoPWUuZ2VvbWV0cnk7bnVsbD09PWguYm91bmRpbmdTcGhlcmUmJmguY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CmIuY29weShoLmJvdW5kaW5nU3BoZXJlKS5hcHBseU1hdHJpeDQoZS5tYXRyaXhXb3JsZCk7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZShiKX19KCksaW50ZXJzZWN0c1Nwcml0ZTpmdW5jdGlvbigpe3ZhciBiPW5ldyBBO3JldHVybiBmdW5jdGlvbihlKXtiLmNlbnRlci5zZXQoMCwwLDApO2IucmFkaXVzPS43MDcxMDY3ODExODY1NDc2O2IuYXBwbHlNYXRyaXg0KGUubWF0cml4V29ybGQpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoYil9fSgpLGludGVyc2VjdHNTcGhlcmU6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5wbGFuZXMsaD1iLmNlbnRlcjtiPS1iLnJhZGl1cztmb3IodmFyIG49MDs2Pm47bisrKWlmKGVbbl0uZGlzdGFuY2VUb1BvaW50KGgpPGIpcmV0dXJuITE7cmV0dXJuITB9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZztyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBoPXRoaXMucGxhbmVzLG49MDs2Pm47bisrKXt2YXIgdT1oW25dOwpiLng9MDx1Lm5vcm1hbC54P2UubWF4Lng6ZS5taW4ueDtiLnk9MDx1Lm5vcm1hbC55P2UubWF4Lnk6ZS5taW4ueTtiLno9MDx1Lm5vcm1hbC56P2UubWF4Lno6ZS5taW4uejtpZigwPnUuZGlzdGFuY2VUb1BvaW50KGIpKXJldHVybiExfXJldHVybiEwfX0oKSxjb250YWluc1BvaW50OmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT10aGlzLnBsYW5lcyxoPTA7Nj5oO2grKylpZigwPmVbaF0uZGlzdGFuY2VUb1BvaW50KGIpKXJldHVybiExO3JldHVybiEwfX0pO09iamVjdC5hc3NpZ24oQy5wcm90b3R5cGUse2lzTWF0cml4NDohMCxzZXQ6ZnVuY3Rpb24oYixlLGgsbix1LHcseixFLEgsSSxPLFEsUixVLFcsWil7dmFyIGZhPXRoaXMuZWxlbWVudHM7ZmFbMF09YjtmYVs0XT1lO2ZhWzhdPWg7ZmFbMTJdPW47ZmFbMV09dTtmYVs1XT13O2ZhWzldPXo7ZmFbMTNdPUU7ZmFbMl09SDtmYVs2XT1JO2ZhWzEwXT1PO2ZhWzE0XT1RO2ZhWzNdPVI7ZmFbN109VTtmYVsxMV09VztmYVsxNV09WjtyZXR1cm4gdGhpc30sCmlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBDKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztiPWIuZWxlbWVudHM7ZVswXT1iWzBdO2VbMV09YlsxXTtlWzJdPWJbMl07ZVszXT1iWzNdO2VbNF09Yls0XTtlWzVdPWJbNV07ZVs2XT1iWzZdO2VbN109Yls3XTtlWzhdPWJbOF07ZVs5XT1iWzldO2VbMTBdPWJbMTBdO2VbMTFdPWJbMTFdO2VbMTJdPWJbMTJdO2VbMTNdPWJbMTNdO2VbMTRdPWJbMTRdO2VbMTVdPWJbMTVdO3JldHVybiB0aGlzfSxjb3B5UG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztiPWIuZWxlbWVudHM7ZVsxMl09YlsxMl07ZVsxM109YlsxM107ZVsxNF09YlsxNF07cmV0dXJuIHRoaXN9LGV4dHJhY3RCYXNpczpmdW5jdGlvbihiLGUsaCl7Yi5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsCjApO2Uuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpO2guc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpO3JldHVybiB0aGlzfSxtYWtlQmFzaXM6ZnVuY3Rpb24oYixlLGgpe3RoaXMuc2V0KGIueCxlLngsaC54LDAsYi55LGUueSxoLnksMCxiLnosZS56LGgueiwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxleHRyYWN0Um90YXRpb246ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZztyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIGg9dGhpcy5lbGVtZW50cyxuPWUuZWxlbWVudHMsdT0xL2Iuc2V0RnJvbU1hdHJpeENvbHVtbihlLDApLmxlbmd0aCgpLHc9MS9iLnNldEZyb21NYXRyaXhDb2x1bW4oZSwxKS5sZW5ndGgoKTtlPTEvYi5zZXRGcm9tTWF0cml4Q29sdW1uKGUsMikubGVuZ3RoKCk7aFswXT1uWzBdKnU7aFsxXT1uWzFdKnU7aFsyXT1uWzJdKnU7aFszXT0wO2hbNF09bls0XSp3O2hbNV09bls1XSp3O2hbNl09bls2XSp3O2hbN109MDtoWzhdPW5bOF0qZTtoWzldPW5bOV0qZTtoWzEwXT0KblsxMF0qZTtoWzExXT0wO2hbMTJdPTA7aFsxM109MDtoWzE0XT0wO2hbMTVdPTE7cmV0dXJuIHRoaXN9fSgpLG1ha2VSb3RhdGlvbkZyb21FdWxlcjpmdW5jdGlvbihiKXtiJiZiLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7dmFyIGU9dGhpcy5lbGVtZW50cyxoPWIueCxuPWIueSx1PWIueix3PU1hdGguY29zKGgpO2g9TWF0aC5zaW4oaCk7dmFyIHo9TWF0aC5jb3Mobik7bj1NYXRoLnNpbihuKTt2YXIgRT1NYXRoLmNvcyh1KTt1PU1hdGguc2luKHUpO2lmKCJYWVoiPT09Yi5vcmRlcil7Yj13KkU7dmFyIEg9dyp1LEk9aCpFLE89aCp1O2VbMF09eipFO2VbNF09LXoqdTtlWzhdPW47ZVsxXT1IK0kqbjtlWzVdPWItTypuO2VbOV09LWgqejtlWzJdPU8tYipuO2VbNl09SStIKm47ZVsxMF09dyp6fWVsc2UiWVhaIj09PQpiLm9yZGVyPyhiPXoqRSxIPXoqdSxJPW4qRSxPPW4qdSxlWzBdPWIrTypoLGVbNF09SSpoLUgsZVs4XT13Km4sZVsxXT13KnUsZVs1XT13KkUsZVs5XT0taCxlWzJdPUgqaC1JLGVbNl09TytiKmgsZVsxMF09dyp6KToiWlhZIj09PWIub3JkZXI/KGI9eipFLEg9eip1LEk9bipFLE89bip1LGVbMF09Yi1PKmgsZVs0XT0tdyp1LGVbOF09SStIKmgsZVsxXT1IK0kqaCxlWzVdPXcqRSxlWzldPU8tYipoLGVbMl09LXcqbixlWzZdPWgsZVsxMF09dyp6KToiWllYIj09PWIub3JkZXI/KGI9dypFLEg9dyp1LEk9aCpFLE89aCp1LGVbMF09eipFLGVbNF09SSpuLUgsZVs4XT1iKm4rTyxlWzFdPXoqdSxlWzVdPU8qbitiLGVbOV09SCpuLUksZVsyXT0tbixlWzZdPWgqeixlWzEwXT13KnopOiJZWlgiPT09Yi5vcmRlcj8oYj13KnosSD13Km4sST1oKnosTz1oKm4sZVswXT16KkUsZVs0XT1PLWIqdSxlWzhdPUkqdStILGVbMV09dSxlWzVdPXcqRSxlWzldPS1oKkUsZVsyXT0tbipFLGVbNl09SCoKdStJLGVbMTBdPWItTyp1KToiWFpZIj09PWIub3JkZXImJihiPXcqeixIPXcqbixJPWgqeixPPWgqbixlWzBdPXoqRSxlWzRdPS11LGVbOF09bipFLGVbMV09Yip1K08sZVs1XT13KkUsZVs5XT1IKnUtSSxlWzJdPUkqdS1ILGVbNl09aCpFLGVbMTBdPU8qdStiKTtlWzNdPTA7ZVs3XT0wO2VbMTFdPTA7ZVsxMl09MDtlWzEzXT0wO2VbMTRdPTA7ZVsxNV09MTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZygwLDAsMCksZT1uZXcgZygxLDEsMSk7cmV0dXJuIGZ1bmN0aW9uKGgpe3JldHVybiB0aGlzLmNvbXBvc2UoYixoLGUpfX0oKSxsb29rQXQ6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZyxlPW5ldyBnLGg9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKG4sdSx3KXt2YXIgej10aGlzLmVsZW1lbnRzO2guc3ViVmVjdG9ycyhuLHUpOzA9PT1oLmxlbmd0aFNxKCkmJihoLno9MSk7aC5ub3JtYWxpemUoKTtiLmNyb3NzVmVjdG9ycyh3LApoKTswPT09Yi5sZW5ndGhTcSgpJiYoMT09PU1hdGguYWJzKHcueik/aC54Kz0xRS00Omgueis9MUUtNCxoLm5vcm1hbGl6ZSgpLGIuY3Jvc3NWZWN0b3JzKHcsaCkpO2Iubm9ybWFsaXplKCk7ZS5jcm9zc1ZlY3RvcnMoaCxiKTt6WzBdPWIueDt6WzRdPWUueDt6WzhdPWgueDt6WzFdPWIueTt6WzVdPWUueTt6WzldPWgueTt6WzJdPWIuejt6WzZdPWUuejt6WzEwXT1oLno7cmV0dXJuIHRoaXN9fSgpLG11bHRpcGx5OmZ1bmN0aW9uKGIsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseU1hdHJpY2VzKGIsZSkpOnRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLGIpfSxwcmVtdWx0aXBseTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKGIsdGhpcyl9LAptdWx0aXBseU1hdHJpY2VzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi5lbGVtZW50cyxuPWUuZWxlbWVudHM7ZT10aGlzLmVsZW1lbnRzO2I9aFswXTt2YXIgdT1oWzRdLHc9aFs4XSx6PWhbMTJdLEU9aFsxXSxIPWhbNV0sST1oWzldLE89aFsxM10sUT1oWzJdLFI9aFs2XSxVPWhbMTBdLFc9aFsxNF0sWj1oWzNdLGZhPWhbN10scWE9aFsxMV07aD1oWzE1XTt2YXIgcmE9blswXSxpYT1uWzRdLHRhPW5bOF0sbmE9blsxMl0sdmE9blsxXSxCYT1uWzVdLHNhPW5bOV0sRGE9blsxM10sSGE9blsyXSxLYT1uWzZdLE5hPW5bMTBdLExhPW5bMTRdLGZiPW5bM10sY2I9bls3XSxKYT1uWzExXTtuPW5bMTVdO2VbMF09YipyYSt1KnZhK3cqSGEreipmYjtlWzRdPWIqaWErdSpCYSt3KkthK3oqY2I7ZVs4XT1iKnRhK3Uqc2ErdypOYSt6KkphO2VbMTJdPWIqbmErdSpEYSt3KkxhK3oqbjtlWzFdPUUqcmErSCp2YStJKkhhK08qZmI7ZVs1XT1FKmlhK0gqQmErSSpLYStPKmNiO2VbOV09RSp0YStIKnNhKwpJKk5hK08qSmE7ZVsxM109RSpuYStIKkRhK0kqTGErTypuO2VbMl09USpyYStSKnZhK1UqSGErVypmYjtlWzZdPVEqaWErUipCYStVKkthK1cqY2I7ZVsxMF09USp0YStSKnNhK1UqTmErVypKYTtlWzE0XT1RKm5hK1IqRGErVSpMYStXKm47ZVszXT1aKnJhK2ZhKnZhK3FhKkhhK2gqZmI7ZVs3XT1aKmlhK2ZhKkJhK3FhKkthK2gqY2I7ZVsxMV09Wip0YStmYSpzYStxYSpOYStoKkphO2VbMTVdPVoqbmErZmEqRGErcWEqTGEraCpuO3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0qPWI7ZVs0XSo9YjtlWzhdKj1iO2VbMTJdKj1iO2VbMV0qPWI7ZVs1XSo9YjtlWzldKj1iO2VbMTNdKj1iO2VbMl0qPWI7ZVs2XSo9YjtlWzEwXSo9YjtlWzE0XSo9YjtlWzNdKj1iO2VbN10qPWI7ZVsxMV0qPWI7ZVsxNV0qPWI7cmV0dXJuIHRoaXN9LGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZztyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBoPQowLG49ZS5jb3VudDtoPG47aCsrKWIueD1lLmdldFgoaCksYi55PWUuZ2V0WShoKSxiLno9ZS5nZXRaKGgpLGIuYXBwbHlNYXRyaXg0KHRoaXMpLGUuc2V0WFlaKGgsYi54LGIueSxiLnopO3JldHVybiBlfX0oKSxkZXRlcm1pbmFudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudHMsZT1iWzBdLGg9Yls0XSxuPWJbOF0sdT1iWzEyXSx3PWJbMV0sej1iWzVdLEU9Yls5XSxIPWJbMTNdLEk9YlsyXSxPPWJbNl0sUT1iWzEwXSxSPWJbMTRdO3JldHVybiBiWzNdKigrdSpFKk8tbipIKk8tdSp6KlEraCpIKlErbip6KlItaCpFKlIpK2JbN10qKCtlKkUqUi1lKkgqUSt1KncqUS1uKncqUituKkgqSS11KkUqSSkrYlsxMV0qKCtlKkgqTy1lKnoqUi11KncqTytoKncqUit1KnoqSS1oKkgqSSkrYlsxNV0qKC1uKnoqSS1lKkUqTytlKnoqUStuKncqTy1oKncqUStoKkUqSSl9LHRyYW5zcG9zZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudHM7dmFyIGU9YlsxXTtiWzFdPWJbNF07Yls0XT0KZTtlPWJbMl07YlsyXT1iWzhdO2JbOF09ZTtlPWJbNl07Yls2XT1iWzldO2JbOV09ZTtlPWJbM107YlszXT1iWzEyXTtiWzEyXT1lO2U9Yls3XTtiWzddPWJbMTNdO2JbMTNdPWU7ZT1iWzExXTtiWzExXT1iWzE0XTtiWzE0XT1lO3JldHVybiB0aGlzfSxzZXRQb3NpdGlvbjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMTJdPWIueDtlWzEzXT1iLnk7ZVsxNF09Yi56O3JldHVybiB0aGlzfSxnZXRJbnZlcnNlOmZ1bmN0aW9uKGIsZSl7dmFyIGg9dGhpcy5lbGVtZW50cyxuPWIuZWxlbWVudHM7Yj1uWzBdO3ZhciB1PW5bMV0sdz1uWzJdLHo9blszXSxFPW5bNF0sSD1uWzVdLEk9bls2XSxPPW5bN10sUT1uWzhdLFI9bls5XSxVPW5bMTBdLFc9blsxMV0sWj1uWzEyXSxmYT1uWzEzXSxxYT1uWzE0XTtuPW5bMTVdO3ZhciByYT1SKnFhKk8tZmEqVSpPK2ZhKkkqVy1IKnFhKlctUipJKm4rSCpVKm4saWE9WipVKk8tUSpxYSpPLVoqSSpXK0UqcWEqVytRKkkqbi1FKlUqbix0YT0KUSpmYSpPLVoqUipPK1oqSCpXLUUqZmEqVy1RKkgqbitFKlIqbixuYT1aKlIqSS1RKmZhKkktWipIKlUrRSpmYSpVK1EqSCpxYS1FKlIqcWEsdmE9YipyYSt1KmlhK3cqdGEreipuYTtpZigwPT09dmEpe2lmKCEwPT09ZSl0aHJvdyBFcnJvcigiVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtyZXR1cm4gdGhpcy5pZGVudGl0eSgpfWU9MS92YTtoWzBdPXJhKmU7aFsxXT0oZmEqVSp6LVIqcWEqei1mYSp3KlcrdSpxYSpXK1IqdypuLXUqVSpuKSplO2hbMl09KEgqcWEqei1mYSpJKnorZmEqdypPLXUqcWEqTy1IKncqbit1KkkqbikqZTtoWzNdPShSKkkqei1IKlUqei1SKncqTyt1KlUqTytIKncqVy11KkkqVykqZTtoWzRdPWlhKmU7aFs1XT0oUSpxYSp6LVoqVSp6KwpaKncqVy1iKnFhKlctUSp3Km4rYipVKm4pKmU7aFs2XT0oWipJKnotRSpxYSp6LVoqdypPK2IqcWEqTytFKncqbi1iKkkqbikqZTtoWzddPShFKlUqei1RKkkqeitRKncqTy1iKlUqTy1FKncqVytiKkkqVykqZTtoWzhdPXRhKmU7aFs5XT0oWipSKnotUSpmYSp6LVoqdSpXK2IqZmEqVytRKnUqbi1iKlIqbikqZTtoWzEwXT0oRSpmYSp6LVoqSCp6K1oqdSpPLWIqZmEqTy1FKnUqbitiKkgqbikqZTtoWzExXT0oUSpIKnotRSpSKnotUSp1Kk8rYipSKk8rRSp1KlctYipIKlcpKmU7aFsxMl09bmEqZTtoWzEzXT0oUSpmYSp3LVoqUip3K1oqdSpVLWIqZmEqVS1RKnUqcWErYipSKnFhKSplO2hbMTRdPShaKkgqdy1FKmZhKnctWip1KkkrYipmYSpJK0UqdSpxYS1iKkgqcWEpKmU7aFsxNV09KEUqUip3LVEqSCp3K1EqdSpJLWIqUipJLUUqdSpVK2IqSCpVKSplO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzLGg9Yi54LG49Yi55O2I9Yi56O2VbMF0qPQpoO2VbNF0qPW47ZVs4XSo9YjtlWzFdKj1oO2VbNV0qPW47ZVs5XSo9YjtlWzJdKj1oO2VbNl0qPW47ZVsxMF0qPWI7ZVszXSo9aDtlWzddKj1uO2VbMTFdKj1iO3JldHVybiB0aGlzfSxnZXRNYXhTY2FsZU9uQXhpczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudHM7cmV0dXJuIE1hdGguc3FydChNYXRoLm1heChiWzBdKmJbMF0rYlsxXSpiWzFdK2JbMl0qYlsyXSxiWzRdKmJbNF0rYls1XSpiWzVdK2JbNl0qYls2XSxiWzhdKmJbOF0rYls5XSpiWzldK2JbMTBdKmJbMTBdKSl9LG1ha2VUcmFuc2xhdGlvbjpmdW5jdGlvbihiLGUsaCl7dGhpcy5zZXQoMSwwLDAsYiwwLDEsMCxlLDAsMCwxLGgsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblg6ZnVuY3Rpb24oYil7dmFyIGU9TWF0aC5jb3MoYik7Yj1NYXRoLnNpbihiKTt0aGlzLnNldCgxLDAsMCwwLDAsZSwtYiwwLDAsYixlLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblk6ZnVuY3Rpb24oYil7dmFyIGU9Ck1hdGguY29zKGIpO2I9TWF0aC5zaW4oYik7dGhpcy5zZXQoZSwwLGIsMCwwLDEsMCwwLC1iLDAsZSwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxtYWtlUm90YXRpb25aOmZ1bmN0aW9uKGIpe3ZhciBlPU1hdGguY29zKGIpO2I9TWF0aC5zaW4oYik7dGhpcy5zZXQoZSwtYiwwLDAsYixlLDAsMCwwLDAsMSwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxtYWtlUm90YXRpb25BeGlzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9TWF0aC5jb3MoZSk7ZT1NYXRoLnNpbihlKTt2YXIgbj0xLWgsdT1iLngsdz1iLnk7Yj1iLno7dmFyIHo9bip1LEU9bip3O3RoaXMuc2V0KHoqdStoLHoqdy1lKmIseipiK2UqdywwLHoqdytlKmIsRSp3K2gsRSpiLWUqdSwwLHoqYi1lKncsRSpiK2UqdSxuKmIqYitoLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VTY2FsZTpmdW5jdGlvbihiLGUsaCl7dGhpcy5zZXQoYiwwLDAsMCwwLGUsMCwwLDAsMCxoLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VTaGVhcjpmdW5jdGlvbihiLAplLGgpe3RoaXMuc2V0KDEsZSxoLDAsYiwxLGgsMCxiLGUsMSwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxjb21wb3NlOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbj10aGlzLmVsZW1lbnRzLHU9ZS5feCx3PWUuX3ksej1lLl96LEU9ZS5fdyxIPXUrdSxJPXcrdyxPPXorejtlPXUqSDt2YXIgUT11Kkk7dSo9Tzt2YXIgUj13Kkk7dyo9Tzt6Kj1PO0gqPUU7SSo9RTtFKj1PO089aC54O3ZhciBVPWgueTtoPWguejtuWzBdPSgxLShSK3opKSpPO25bMV09KFErRSkqTztuWzJdPSh1LUkpKk87blszXT0wO25bNF09KFEtRSkqVTtuWzVdPSgxLShlK3opKSpVO25bNl09KHcrSCkqVTtuWzddPTA7bls4XT0odStJKSpoO25bOV09KHctSCkqaDtuWzEwXT0oMS0oZStSKSkqaDtuWzExXT0wO25bMTJdPWIueDtuWzEzXT1iLnk7blsxNF09Yi56O25bMTVdPTE7cmV0dXJuIHRoaXN9LGRlY29tcG9zZTpmdW5jdGlvbigpe3ZhciBiPW5ldyBnLGU9bmV3IEM7cmV0dXJuIGZ1bmN0aW9uKGgsbix1KXt2YXIgdz0KdGhpcy5lbGVtZW50cyx6PWIuc2V0KHdbMF0sd1sxXSx3WzJdKS5sZW5ndGgoKSxFPWIuc2V0KHdbNF0sd1s1XSx3WzZdKS5sZW5ndGgoKSxIPWIuc2V0KHdbOF0sd1s5XSx3WzEwXSkubGVuZ3RoKCk7MD50aGlzLmRldGVybWluYW50KCkmJih6PS16KTtoLng9d1sxMl07aC55PXdbMTNdO2guej13WzE0XTtlLmNvcHkodGhpcyk7aD0xL3o7dz0xL0U7dmFyIEk9MS9IO2UuZWxlbWVudHNbMF0qPWg7ZS5lbGVtZW50c1sxXSo9aDtlLmVsZW1lbnRzWzJdKj1oO2UuZWxlbWVudHNbNF0qPXc7ZS5lbGVtZW50c1s1XSo9dztlLmVsZW1lbnRzWzZdKj13O2UuZWxlbWVudHNbOF0qPUk7ZS5lbGVtZW50c1s5XSo9STtlLmVsZW1lbnRzWzEwXSo9STtuLnNldEZyb21Sb3RhdGlvbk1hdHJpeChlKTt1Lng9ejt1Lnk9RTt1Lno9SDtyZXR1cm4gdGhpc319KCksbWFrZVBlcnNwZWN0aXZlOmZ1bmN0aW9uKGIsZSxoLG4sdSx3KXt2b2lkIDA9PT13JiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4iKTsKdmFyIHo9dGhpcy5lbGVtZW50czt6WzBdPTIqdS8oZS1iKTt6WzRdPTA7els4XT0oZStiKS8oZS1iKTt6WzEyXT0wO3pbMV09MDt6WzVdPTIqdS8oaC1uKTt6WzldPShoK24pLyhoLW4pO3pbMTNdPTA7elsyXT0wO3pbNl09MDt6WzEwXT0tKHcrdSkvKHctdSk7elsxNF09LTIqdyp1Lyh3LXUpO3pbM109MDt6WzddPTA7elsxMV09LTE7elsxNV09MDtyZXR1cm4gdGhpc30sbWFrZU9ydGhvZ3JhcGhpYzpmdW5jdGlvbihiLGUsaCxuLHUsdyl7dmFyIHo9dGhpcy5lbGVtZW50cyxFPTEvKGUtYiksSD0xLyhoLW4pLEk9MS8ody11KTt6WzBdPTIqRTt6WzRdPTA7els4XT0wO3pbMTJdPS0oKGUrYikqRSk7elsxXT0wO3pbNV09MipIO3pbOV09MDt6WzEzXT0tKChoK24pKkgpO3pbMl09MDt6WzZdPTA7elsxMF09LTIqSTt6WzE0XT0tKCh3K3UpKkkpO3pbM109MDt6WzddPTA7elsxMV09MDt6WzE1XT0xO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50czsKYj1iLmVsZW1lbnRzO2Zvcih2YXIgaD0wOzE2Pmg7aCsrKWlmKGVbaF0hPT1iW2hdKXJldHVybiExO3JldHVybiEwfSxmcm9tQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoZT0wKTtmb3IodmFyIGg9MDsxNj5oO2grKyl0aGlzLmVsZW1lbnRzW2hdPWJbaCtlXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWImJihiPVtdKTt2b2lkIDA9PT1lJiYoZT0wKTt2YXIgaD10aGlzLmVsZW1lbnRzO2JbZV09aFswXTtiW2UrMV09aFsxXTtiW2UrMl09aFsyXTtiW2UrM109aFszXTtiW2UrNF09aFs0XTtiW2UrNV09aFs1XTtiW2UrNl09aFs2XTtiW2UrN109aFs3XTtiW2UrOF09aFs4XTtiW2UrOV09aFs5XTtiW2UrMTBdPWhbMTBdO2JbZSsxMV09aFsxMV07YltlKzEyXT1oWzEyXTtiW2UrMTNdPWhbMTNdO2JbZSsxNF09aFsxNF07YltlKzE1XT1oWzE1XTtyZXR1cm4gYn19KTt2YXIgemI9e2FscGhhbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdGRpZmZ1c2VDb2xvci5hICpceDNkIHRleHR1cmUyRCggYWxwaGFNYXAsIHZVdiApLmc7XG4jZW5kaWYiLAphbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixhbHBoYXRlc3RfZnJhZ21lbnQ6IiNpZmRlZiBBTFBIQVRFU1Rcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSBceDNjIEFMUEhBVEVTVCApIGRpc2NhcmQ7XG4jZW5kaWYiLGFvbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gXHgzZCAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGFtYmllbnRPY2NsdXNpb247XG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggUEhZU0lDQUwgKVxuXHRcdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICpceDNkIGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKYW9tYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiIsYmVnaW5fdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkIFx4M2QgdmVjMyggcG9zaXRpb24gKTsiLGJlZ2lubm9ybWFsX3ZlcnRleDoidmVjMyBvYmplY3ROb3JtYWwgXHgzZCB2ZWMzKCBub3JtYWwgKTtcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgXHgzZCB2ZWMzKCB0YW5nZW50Lnh5eiApO1xuI2VuZGlmIixic2RmczoidmVjMiBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IHZlYzQgYzAgXHgzZCB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxIFx4M2QgdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcblx0dmVjNCByIFx4M2Qgcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCBceDNkIG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5cdHJldHVybiB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG59XG5mbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXG5cdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiBceDNkIDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wICkge1xuXHRcdGRpc3RhbmNlRmFsbG9mZiAqXHgzZCBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xuXHR9XG5cdHJldHVybiBkaXN0YW5jZUZhbGxvZmY7XG4jZWxzZVxuXHRpZiggY3V0b2ZmRGlzdGFuY2UgXHgzZSAwLjAgXHgyNlx4MjYgZGVjYXlFeHBvbmVudCBceDNlIDAuMCApIHtcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XG5cdH1cblx0cmV0dXJuIDEuMDtcbiNlbmRpZlxufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xuXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcbn1cbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGdsIFx4M2QgZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gXHgzZCBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhIFx4M2QgcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cdGZsb2F0IEQgXHgzZCBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFICBceDNkIDY0LjA7XG5cdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSBceDNkICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xuXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgXHgzZCAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgZG90TlYgXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xuXHR1diBceDNkIHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtcbn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xuXHRmbG9hdCBsIFx4M2QgbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4IFx4M2QgZG90KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSBceDNkIGFicyggeCApO1xuXHRmbG9hdCBhIFx4M2QgMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xuXHRmbG9hdCBiIFx4M2QgMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xuXHRmbG9hdCB2IFx4M2QgYSAvIGI7XG5cdGZsb2F0IHRoZXRhX3NpbnRoZXRhIFx4M2QgKCB4IFx4M2UgMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcblx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xufVxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XG5cdHZlYzMgdjEgXHgzZCByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgdjIgXHgzZCByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgbGlnaHROb3JtYWwgXHgzZCBjcm9zcyggdjEsIHYyICk7XG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgXHgzYyAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XG5cdHZlYzMgVDEsIFQyO1xuXHRUMSBceDNkIG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xuXHRUMiBceDNkIC0gY3Jvc3MoIE4sIFQxICk7XG5cdG1hdDMgbWF0IFx4M2QgbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7XG5cdHZlYzMgY29vcmRzWyA0IF07XG5cdGNvb3Jkc1sgMCBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XG5cdGNvb3Jkc1sgMSBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XG5cdGNvb3Jkc1sgMCBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xuXHRjb29yZHNbIDEgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcblx0Y29vcmRzWyAyIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xuXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xuXHRmbG9hdCByZXN1bHQgXHgzZCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcblx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xufVxudm9pZCBCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3ROViApO1xuXHR2ZWMyIGJyZGYgXHgzZCBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMyBGc3NFc3MgXHgzZCBGICogYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFc3MgXHgzZCBicmRmLnggKyBicmRmLnk7XG5cdGZsb2F0IEVtcyBceDNkIDEuMCAtIEVzcztcblx0dmVjMyBGYXZnIFx4M2Qgc3BlY3VsYXJDb2xvciArICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogMC4wNDc2MTk7XHR2ZWMzIEZtcyBceDNkIEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcblx0c2luZ2xlU2NhdHRlciArXHgzZCBGc3NFc3M7XG5cdG11bHRpU2NhdHRlciArXHgzZCBGbXMgKiBFbXM7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyIFx4M2Qgbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19CbGlublBob25nX0ltcGxpY2l0KCApO1xuXHRmbG9hdCBEIFx4M2QgRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XG5cdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XG59XG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XG5cdHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xufSIsCmJ1bXBtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9CVU1QTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XG5cdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xuXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcblx0XHR2ZWMyIGRTVGR4IFx4M2QgZEZkeCggdlV2ICk7XG5cdFx0dmVjMiBkU1RkeSBceDNkIGRGZHkoIHZVdiApO1xuXHRcdGZsb2F0IEhsbCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcblx0XHRmbG9hdCBkQnggXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcblx0XHRmbG9hdCBkQnkgXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcblx0XHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcblx0fVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xuXHRcdHZlYzMgdlNpZ21hWCBceDNkIHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZTaWdtYVkgXHgzZCB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2TiBceDNkIHN1cmZfbm9ybTtcblx0XHR2ZWMzIFIxIFx4M2QgY3Jvc3MoIHZTaWdtYVksIHZOICk7XG5cdFx0dmVjMyBSMiBceDNkIGNyb3NzKCB2TiwgdlNpZ21hWCApO1xuXHRcdGZsb2F0IGZEZXQgXHgzZCBkb3QoIHZTaWdtYVgsIFIxICk7XG5cdFx0ZkRldCAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0dmVjMyB2R3JhZCBceDNkIHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xuXHR9XG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHR2ZWM0IHBsYW5lO1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIGRpc2NhcmQ7XG5cdH1cblx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyBceDNjIE5VTV9DTElQUElOR19QTEFORVNcblx0XHRib29sIGNsaXBwZWQgXHgzZCB0cnVlO1xuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSBceDNjIE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0XHRjbGlwcGVkIFx4M2QgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIFx4MjZceDI2IGNsaXBwZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIiwKY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHQjaWYgISBkZWZpbmVkKCBQSFlTSUNBTCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBQSFlTSUNBTCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBQSFlTSUNBTCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuI2VuZGlmIiwKY29sb3JfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0ZGlmZnVzZUNvbG9yLnJnYiAqXHgzZCB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfdmVydGV4OiIjaWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvci54eXogXHgzZCBjb2xvci54eXo7XG4jZW5kaWYiLGNvbW1vbjoiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE4XG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0XG4jZGVmaW5lIExPRzIgMS40NDI2OTVcbiNkZWZpbmUgRVBTSUxPTiAxZS02XG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZGVmaW5lIHdoaXRlQ29tcGxpbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiBceDNkIHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSBceDNkIDEyLjk4OTgsIGIgXHgzZCA3OC4yMzMsIGMgXHgzZCA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCBceDNkIGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuIFx4M2QgbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcbn1cbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcblx0dmVjMyBjb2xvcjtcblx0dmVjMyBkaXJlY3Rpb247XG5cdGJvb2wgdmlzaWJsZTtcbn07XG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xuXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgZGlyZWN0U3BlY3VsYXI7XG5cdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XG59O1xuc3RydWN0IEdlb21ldHJpY0NvbnRleHQge1xuXHR2ZWMzIHBvc2l0aW9uO1xuXHR2ZWMzIG5vcm1hbDtcblx0dmVjMyB2aWV3RGlyO1xufTtcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xufVxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xufVxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludCAtIHBvaW50T25QbGFuZSApO1xuXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XG59XG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBzaWduKCBkb3QoIHBvaW50IC0gcG9pbnRPblBsYW5lLCBwbGFuZU5vcm1hbCApICk7XG59XG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xufVxubWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7XG5cdG1hdDMgdG1wO1xuXHR0bXBbIDAgXSBceDNkIHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcblx0dG1wWyAxIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7XG5cdHRtcFsgMiBdIFx4M2QgdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xuXHRyZXR1cm4gdG1wO1xufVxuZmxvYXQgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHtcblx0dmVjMyB3ZWlnaHRzIFx4M2QgdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xuXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcbn0iLApjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxuaW50IGdldEZhY2VGcm9tRGlyZWN0aW9uKHZlYzMgZGlyZWN0aW9uKSB7XG5cdHZlYzMgYWJzRGlyZWN0aW9uIFx4M2QgYWJzKGRpcmVjdGlvbik7XG5cdGludCBmYWNlIFx4M2QgLTE7XG5cdGlmKCBhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi56ICkge1xuXHRcdGlmKGFic0RpcmVjdGlvbi54IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi54IFx4M2UgMC4wID8gMCA6IDM7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0ZWxzZSB7XG5cdFx0aWYoYWJzRGlyZWN0aW9uLnogXHgzZSBhYnNEaXJlY3Rpb24ueSApXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnogXHgzZSAwLjAgPyAyIDogNTtcblx0XHRlbHNlXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnkgXHgzZSAwLjAgPyAxIDogNDtcblx0fVxuXHRyZXR1cm4gZmFjZTtcbn1cbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXG4jZGVmaW5lIGN1YmVVVl9yYW5nZUNsYW1wIChleHAyKCg2LjAgLSAxLjApICogMi4wKSlcbnZlYzIgTWlwTGV2ZWxJbmZvKCB2ZWMzIHZlYywgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgc2NhbGUgXHgzZCBleHAyKGN1YmVVVl9tYXhMb2RzMSAtIHJvdWdobmVzc0xldmVsKTtcblx0ZmxvYXQgZHhSb3VnaG5lc3MgXHgzZCBkRmR4KHJvdWdobmVzcyk7XG5cdGZsb2F0IGR5Um91Z2huZXNzIFx4M2QgZEZkeShyb3VnaG5lc3MpO1xuXHR2ZWMzIGR4IFx4M2QgZEZkeCggdmVjICogc2NhbGUgKiBkeFJvdWdobmVzcyApO1xuXHR2ZWMzIGR5IFx4M2QgZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xuXHRmbG9hdCBkIFx4M2QgbWF4KCBkb3QoIGR4LCBkeCApLCBkb3QoIGR5LCBkeSApICk7XG5cdGQgXHgzZCBjbGFtcChkLCAxLjAsIGN1YmVVVl9yYW5nZUNsYW1wKTtcblx0ZmxvYXQgbWlwTGV2ZWwgXHgzZCAwLjUgKiBsb2cyKGQpO1xuXHRyZXR1cm4gdmVjMihmbG9vcihtaXBMZXZlbCksIGZyYWN0KG1pcExldmVsKSk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMiAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAyLjApXG4jZGVmaW5lIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZSAoMS4wIC8gY3ViZVVWX3RleHR1cmVTaXplKVxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xuXHRtaXBMZXZlbCBceDNkIHJvdWdobmVzc0xldmVsIFx4M2UgY3ViZVVWX21heExvZHMyIC0gMy4wID8gMC4wIDogbWlwTGV2ZWw7XG5cdGZsb2F0IGEgXHgzZCAxNi4wICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIGV4cDJfcGFja2VkIFx4M2QgZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcblx0dmVjMiByY3BfZXhwMl9wYWNrZWQgXHgzZCB2ZWMyKCAxLjAgKSAvIGV4cDJfcGFja2VkO1xuXHRmbG9hdCBwb3dTY2FsZSBceDNkIGV4cDJfcGFja2VkLnggKiBleHAyX3BhY2tlZC55O1xuXHRmbG9hdCBzY2FsZSBceDNkIHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xuXHRmbG9hdCBtaXBPZmZzZXQgXHgzZCAwLjc1KigxLjAgLSByY3BfZXhwMl9wYWNrZWQueSkgKiByY3BfZXhwMl9wYWNrZWQueDtcblx0Ym9vbCBiUmVzIFx4M2QgbWlwTGV2ZWwgXHgzZFx4M2QgMC4wO1xuXHRzY2FsZSBceDNkICBiUmVzIFx4MjZceDI2IChzY2FsZSBceDNjIGEpID8gYSA6IHNjYWxlO1xuXHR2ZWMzIHI7XG5cdHZlYzIgb2Zmc2V0O1xuXHRpbnQgZmFjZSBceDNkIGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XG5cdGZsb2F0IHJjcFBvd1NjYWxlIFx4M2QgMS4wIC8gcG93U2NhbGU7XG5cdGlmKCBmYWNlIFx4M2RceDNkIDApIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigwLjArbWlwT2Zmc2V0LDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDEpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMikge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMykge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgNCkge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdHIgXHgzZCBub3JtYWxpemUocik7XG5cdGZsb2F0IHRleGVsT2Zmc2V0IFx4M2QgMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIHMgXHgzZCAoIHIueXogLyBhYnMoIHIueCApICsgdmVjMiggMS4wICkgKSAqIDAuNTtcblx0dmVjMiBiYXNlIFx4M2Qgb2Zmc2V0ICsgdmVjMiggdGV4ZWxPZmZzZXQgKTtcblx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMyAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAzLjApXG52ZWM0IHRleHR1cmVDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgcmVmbGVjdGVkRGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHJvdWdobmVzc1ZhbCBceDNkIHJvdWdobmVzcyogY3ViZVVWX21heExvZHMzO1xuXHRmbG9hdCByMSBceDNkIGZsb29yKHJvdWdobmVzc1ZhbCk7XG5cdGZsb2F0IHIyIFx4M2QgcjEgKyAxLjA7XG5cdGZsb2F0IHQgXHgzZCBmcmFjdChyb3VnaG5lc3NWYWwpO1xuXHR2ZWMyIG1pcEluZm8gXHgzZCBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcblx0ZmxvYXQgcyBceDNkIG1pcEluZm8ueTtcblx0ZmxvYXQgbGV2ZWwwIFx4M2QgbWlwSW5mby54O1xuXHRmbG9hdCBsZXZlbDEgXHgzZCBsZXZlbDAgKyAxLjA7XG5cdGxldmVsMSBceDNkIGxldmVsMSBceDNlIDUuMCA/IDUuMCA6IGxldmVsMTtcblx0bGV2ZWwwICtceDNkIG1pbiggZmxvb3IoIHMgKyAwLjUgKSwgNS4wICk7XG5cdHZlYzIgdXZfMTAgXHgzZCBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcblx0dmVjNCBjb2xvcjEwIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8xMCkpO1xuXHR2ZWMyIHV2XzIwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjIsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IyMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcblx0dmVjNCByZXN1bHQgXHgzZCBtaXgoY29sb3IxMCwgY29sb3IyMCwgdCk7XG5cdHJldHVybiB2ZWM0KHJlc3VsdC5yZ2IsIDEuMCk7XG59XG4jZW5kaWYiLApkZWZhdWx0bm9ybWFsX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdE5vcm1hbDtcbiNpZmRlZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsIFx4M2QgLSB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgdHJhbnNmb3JtZWRUYW5nZW50IFx4M2Qgbm9ybWFsTWF0cml4ICogb2JqZWN0VGFuZ2VudDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgXHgzZCAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICtceDNkIG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB1diApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcbiNlbmRpZiIsCmVtaXNzaXZlbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHZlYzQgZW1pc3NpdmVDb2xvciBceDNkIHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xuXHRlbWlzc2l2ZUNvbG9yLnJnYiBceDNkIGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcblx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICpceDNkIGVtaXNzaXZlQ29sb3IucmdiO1xuI2VuZGlmIixlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xuI2VuZGlmIixlbmNvZGluZ3NfZnJhZ21lbnQ6ImdsX0ZyYWdDb2xvciBceDNkIGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApOyIsZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IlxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZhbHVlO1xufVxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4wIC0gMTI4LjAgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgbWF4Q29tcG9uZW50IFx4M2QgbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xuXHRmbG9hdCBmRXhwIFx4M2QgY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVudCApICksIC0xMjguMCwgMTI3LjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XG59XG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiB2YWx1ZS5hICogbWF4UmFuZ2UsIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IE0gXHgzZCBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XG5cdE0gXHgzZCBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xufVxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiBceDNkIG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgRCBceDNkIG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xuXHREIFx4M2QgbWluKCBmbG9vciggRCApIC8gMjU1LjAsIDEuMCApO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xufVxuY29uc3QgbWF0MyBjTG9nTHV2TSBceDNkIG1hdDMoIDAuMjIwOSwgMC4zMzkwLCAwLjQxODQsIDAuMTEzOCwgMC42NzgwLCAwLjczMTksIDAuMDEwMiwgMC4xMTMwLCAwLjI5NjkgKTtcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xuXHR2ZWMzIFhwX1lfWFlacCBceDNkIGNMb2dMdXZNICogdmFsdWUucmdiO1xuXHRYcF9ZX1hZWnAgXHgzZCBtYXgoIFhwX1lfWFlacCwgdmVjMyggMWUtNiwgMWUtNiwgMWUtNiApICk7XG5cdHZlYzQgdlJlc3VsdDtcblx0dlJlc3VsdC54eSBceDNkIFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xuXHRmbG9hdCBMZSBceDNkIDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XG5cdHZSZXN1bHQudyBceDNkIGZyYWN0KCBMZSApO1xuXHR2UmVzdWx0LnogXHgzZCAoIExlIC0gKCBmbG9vciggdlJlc3VsdC53ICogMjU1LjAgKSApIC8gMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdlJlc3VsdDtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNIFx4M2QgbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBMZSBceDNkIHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XG5cdHZlYzMgWHBfWV9YWVpwO1xuXHRYcF9ZX1hZWnAueSBceDNkIGV4cDIoICggTGUgLSAxMjcuMCApIC8gMi4wICk7XG5cdFhwX1lfWFlacC56IFx4M2QgWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xuXHRYcF9ZX1hZWnAueCBceDNkIHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcblx0dmVjMyB2UkdCIFx4M2QgY0xvZ0x1dkludmVyc2VNICogWHBfWV9YWVpwLnJnYjtcblx0cmV0dXJuIHZlYzQoIG1heCggdlJHQiwgMC4wICksIDEuMCApO1xufSIsCmVudm1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2Vsc2Vcblx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCB2UmVmbGVjdDtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHR2ZWMyIHNhbXBsZVVWO1xuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdHNhbXBsZVVWLnggXHgzZCBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdmVjNCggMC4wICk7XG5cdCNlbmRpZlxuXHRlbnZDb2xvciBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0IFx4M2QgbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICtceDNkIGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKZW52bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKVxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcblx0dW5pZm9ybSBmbG9hdCBlbnZNYXBJbnRlbnNpdHk7XG4jZW5kaWZcbiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgXHgyNlx4MjYgKCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIClcblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0I2VuZGlmXG5cdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcblx0dW5pZm9ybSBpbnQgbWF4TWlwTGV2ZWw7XG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIFBIWVNJQ0FMIClcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdCNlbmRpZlxuI2VuZGlmIiwKZW52bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSBceDI2XHgyNiBkZWZpbmVkKCBQSFlTSUNBTCApXG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdFx0dmVjMyBxdWVyeVZlYyBceDNkIHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVZlYyBceDNkIHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcXVlcnlWZWMsIDEuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdmVjNCggMC4wICk7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG5cdGZsb2F0IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGNvbnN0IGluIGZsb2F0IGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciBceDNkIGZsb2F0KCBtYXhNSVBMZXZlbCApO1xuXHRcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCBceDNkIG1heE1JUExldmVsU2NhbGFyICsgMC43OTI0OCAtIDAuNSAqIGxvZzIoIHBvdzIoIGJsaW5uU2hpbmluZXNzRXhwb25lbnQgKSArIDEuMCApO1xuXHRcdHJldHVybiBjbGFtcCggZGVzaXJlZE1JUExldmVsLCAwLjAsIG1heE1JUExldmVsU2NhbGFyICk7XG5cdH1cblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gZmxvYXQgYmxpbm5TaGluaW5lc3NFeHBvbmVudCwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyBceDNkIHJlZnJhY3QoIC1nZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHRcdHJlZmxlY3RWZWMgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCByZWZsZWN0VmVjLCB2aWV3TWF0cml4ICk7XG5cdFx0ZmxvYXQgc3BlY3VsYXJNSVBMZXZlbCBceDNkIGdldFNwZWN1bGFyTUlQTGV2ZWwoIGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIG1heE1JUExldmVsICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyhibGlublNoaW5pbmVzc0V4cG9uZW50ICkpO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdFx0dmVjMiBzYW1wbGVVVjtcblx0XHRcdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0XHRzYW1wbGVVVi54IFx4M2QgYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWYiLAplbnZtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxuXHRcdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleCBceDNkIG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbmRpZlxuI2VuZGlmIiwKZm9nX3ZlcnRleDoiI2lmZGVmIFVTRV9GT0dcblx0Zm9nRGVwdGggXHgzZCAtbXZQb3NpdGlvbi56O1xuI2VuZGlmIixmb2dfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG4jZW5kaWYiLGZvZ19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2Qgd2hpdGVDb21wbGltZW50KCBleHAyKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCAqIExPRzIgKSApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGZvZ0ZhY3RvciBceDNkIHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvci5yZ2IgXHgzZCBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcbiNlbmRpZiIsZm9nX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRk9HXG5cdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0Zhcjtcblx0I2VuZGlmXG4jZW5kaWYiLApncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVE9PTlxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcblx0dmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XG5cdFx0dmVjMiBjb29yZCBceDNkIHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcblx0XHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiAoIGNvb3JkLnggXHgzYyAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsbGlnaHRtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIFBJICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIiwKbGlnaHRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcblx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiIsbGlnaHRzX2xhbWJlcnRfdmVydGV4OiJ2ZWMzIGRpZmZ1c2UgXHgzZCB2ZWMzKCAxLjAgKTtcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiBceDNkIG12UG9zaXRpb24ueHl6O1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuYmFja0dlb21ldHJ5Lm5vcm1hbCBceDNkIC1nZW9tZXRyeS5ub3JtYWw7XG5iYWNrR2VvbWV0cnkudmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG52TGlnaHRGcm9udCBceDNkIHZlYzMoIDAuMCApO1xudkluZGlyZWN0RnJvbnQgXHgzZCB2ZWMzKCAwLjAgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkxpZ2h0QmFjayBceDNkIHZlYzMoIDAuMCApO1xuXHR2SW5kaXJlY3RCYWNrIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG5mbG9hdCBkb3ROTDtcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuI2lmIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZJbmRpcmVjdEZyb250ICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2SW5kaXJlY3RCYWNrICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsCmxpZ2h0c19wYXJzX2JlZ2luOiJ1bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XG51bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xudmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHtcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0dmVjMyByZXN1bHQgXHgzZCBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBsaWdodFByb2JlICk7XG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBhbWJpZW50TGlnaHRDb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xuXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgdHJ1ZTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFBvaW50TGlnaHQge1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0YW5jZTtcblx0XHRmbG9hdCBkZWNheTtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0fTtcblx0dW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yIFx4M2QgcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHBvaW50TGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCAoIGRpcmVjdExpZ2h0LmNvbG9yICFceDNkIHZlYzMoIDAuMCApICk7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFNwb3RMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGZsb2F0IGNvbmVDb3M7XG5cdFx0ZmxvYXQgcGVudW1icmFDb3M7XG5cdFx0aW50IHNoYWRvdztcblx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdH07XG5cdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlIFx4M2QgbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgXHgzZCBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGlmICggYW5nbGVDb3MgXHgzZSBzcG90TGlnaHQuY29uZUNvcyApIHtcblx0XHRcdGZsb2F0IHNwb3RFZmZlY3QgXHgzZCBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBzcG90TGlnaHQuY29sb3I7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHZlYzMoIDAuMCApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIGZhbHNlO1xuXHRcdH1cblx0fVxuI2VuZGlmXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0O1xuXHR9O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xuXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgc2t5Q29sb3I7XG5cdFx0dmVjMyBncm91bmRDb2xvcjtcblx0fTtcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0XHRmbG9hdCBkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgXHgzZCAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gaXJyYWRpYW5jZTtcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3Bob25nX2ZyYWdtZW50OiJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgXHgzZCBzaGluaW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoIFx4M2Qgc3BlY3VsYXJTdHJlbmd0aDsiLGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdHZlYzNcdHNwZWN1bGFyQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclNoaW5pbmVzcztcblx0ZmxvYXRcdHNwZWN1bGFyU3RyZW5ndGg7XG59O1xudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0I2lmZGVmIFRPT05cblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2Vsc2Vcblx0XHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsCmxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDoiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgXHgzZCBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcbiNpZmRlZiBTVEFOREFSRFxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2QgbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2Vsc2Vcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuXHRtYXRlcmlhbC5jbGVhckNvYXQgXHgzZCBzYXR1cmF0ZSggY2xlYXJDb2F0ICk7XHRtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgXHgzZCBjbGFtcCggY2xlYXJDb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcbiNlbmRpZiIsCmxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyUm91Z2huZXNzO1xuXHR2ZWMzXHRzcGVjdWxhckNvbG9yO1xuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0ZmxvYXQgY2xlYXJDb2F0O1xuXHRcdGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcblx0I2VuZGlmXG59O1xuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XG5mbG9hdCBjbGVhckNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XG59XG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9ybWFsIFx4M2QgZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdFx0dmVjMyBwb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGlnaHRQb3MgXHgzZCByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoIFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciBceDNkIHJlY3RBcmVhTGlnaHQuY29sb3I7XG5cdFx0ZmxvYXQgcm91Z2huZXNzIFx4M2QgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XG5cdFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XG5cdFx0cmVjdENvb3Jkc1sgMCBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1x0XHRyZWN0Q29vcmRzWyAxIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMiBdIFx4M2QgbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDMgXSBceDNkIGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHR2ZWMyIHV2IFx4M2QgTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xuXHRcdHZlYzQgdDEgXHgzZCB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xuXHRcdHZlYzQgdDIgXHgzZCB0ZXh0dXJlMkQoIGx0Y18yLCB1diApO1xuXHRcdG1hdDMgbUludiBceDNkIG1hdDMoXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXG5cdFx0XHR2ZWMzKCAgICAwLCAxLCAgICAwICksXG5cdFx0XHR2ZWMzKCB0MS56LCAwLCB0MS53IClcblx0XHQpO1xuXHRcdHZlYzMgZnJlc25lbCBceDNkICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApO1xuXHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKlx4M2QgUEk7XG5cdCNlbmRpZlxuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSIFx4M2QgbWF0ZXJpYWwuY2xlYXJDb2F0ICogY2xlYXJDb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MsIGRvdE5MICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSIFx4M2QgMC4wO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICtceDNkICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgaXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzICk7XG5cdCNlbmRpZlxufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdCNpZm5kZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHQjZW5kaWZcbn1cbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyQ29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0ZmxvYXQgZG90TlYgXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90TlY7XG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSIFx4M2QgbWF0ZXJpYWwuY2xlYXJDb2F0ICogY2xlYXJDb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MsIGRvdE5MICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSIFx4M2QgMC4wO1xuXHQjZW5kaWZcblx0ZmxvYXQgY2xlYXJDb2F0SW52IFx4M2QgMS4wIC0gY2xlYXJDb2F0REhSO1xuXHQjaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0dmVjMyBzaW5nbGVTY2F0dGVyaW5nIFx4M2QgdmVjMyggMC4wICk7XG5cdFx0dmVjMyBtdWx0aVNjYXR0ZXJpbmcgXHgzZCB2ZWMzKCAwLjAgKTtcblx0XHR2ZWMzIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZSBceDNkIGlycmFkaWFuY2UgKiBSRUNJUFJPQ0FMX1BJO1xuXHRcdEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApO1xuXHRcdHZlYzMgZGlmZnVzZSBceDNkIG1hdGVyaWFsLmRpZmZ1c2VDb2xvcjtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyQ29hdEludiAqIHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZztcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCBkaWZmdXNlICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuXHQjZWxzZVxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgK1x4M2QgY2xlYXJDb2F0SW52ICogcmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArXHgzZCBjbGVhckNvYXRSYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcblx0I2VuZGlmXG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbiNkZWZpbmUgTWF0ZXJpYWxfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKVxuI2RlZmluZSBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzIClcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn0iLApsaWdodHNfZnJhZ21lbnRfYmVnaW46IlxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgLSB2Vmlld1Bvc2l0aW9uO1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCBceDNkIHBvaW50TGlnaHRzWyBpIF07XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggcG9pbnRMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0IFx4M2Qgc3BvdExpZ2h0c1sgaSBdO1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBhbGwoIGJ2ZWMyKCBzcG90TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgKCBOVU1fRElSX0xJR0hUUyBceDNlIDAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCBceDNkIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xuXHRcdHJlY3RBcmVhTGlnaHQgXHgzZCByZWN0QXJlYUxpZ2h0c1sgaSBdO1xuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHRpcnJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBsaWdodFByb2JlLCBnZW9tZXRyeSApO1xuXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwIClcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdFx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdFx0aXJyYWRpYW5jZSArXHgzZCBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XG5cdFx0fVxuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHR2ZWMzIHJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgY2xlYXJDb2F0UmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcbiNlbmRpZiIsCmxpZ2h0c19mcmFnbWVudF9tYXBzOiIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcdHZlYzMgbGlnaHRNYXBJcnJhZGlhbmNlIFx4M2QgdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0bGlnaHRNYXBJcnJhZGlhbmNlICpceDNkIFBJO1xuXHRcdCNlbmRpZlxuXHRcdGlycmFkaWFuY2UgK1x4M2QgbGlnaHRNYXBJcnJhZGlhbmNlO1xuXHQjZW5kaWZcblx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSBceDI2XHgyNiBkZWZpbmVkKCBQSFlTSUNBTCApIFx4MjZceDI2IGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdGlycmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggZ2VvbWV0cnksIG1heE1pcExldmVsICk7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIG1heE1pcExldmVsICk7XG5cdCNpZm5kZWYgU1RBTkRBUkRcblx0XHRjbGVhckNvYXRSYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0NsZWFyQ29hdF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApLCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmxpZ2h0c19mcmFnbWVudF9lbmQ6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaXJyYWRpYW5jZSwgY2xlYXJDb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSBceDI2XHgyNiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcblx0Z2xfRnJhZ0RlcHRoRVhUIFx4M2QgbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcbiNlbmRpZiIsCmxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2VuZGlmXG4jZW5kaWYiLGxvZ2RlcHRoYnVmX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZGcmFnRGVwdGggXHgzZCAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHQjZWxzZVxuXHRcdGdsX1Bvc2l0aW9uLnogXHgzZCBsb2cyKCBtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSApICogbG9nRGVwdGhCdWZGQyAtIDEuMDtcblx0XHRnbF9Qb3NpdGlvbi56ICpceDNkIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbmRpZlxuI2VuZGlmIixtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxDb2xvciBceDNkIHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIHRleGVsQ29sb3I7XG4jZW5kaWYiLAptYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmIixtYXBfcGFydGljbGVfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzIgdXYgXHgzZCAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuXHR2ZWM0IG1hcFRleGVsIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqXHgzZCBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmIixtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9mcmFnbWVudDoiZmxvYXQgbWV0YWxuZXNzRmFjdG9yIFx4M2QgbWV0YWxuZXNzO1xuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyBceDNkIHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICpceDNkIHRleGVsTWV0YWxuZXNzLmI7XG4jZW5kaWYiLAptZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xuI2VuZGlmIixtb3JwaG5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMSAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMiAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG4jZW5kaWYiLG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcblx0I2Vsc2Vcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0I2VuZGlmXG4jZW5kaWYiLAptb3JwaHRhcmdldF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgRkxBVF9TSEFERURcblx0dmVjMyBmZHggXHgzZCB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgZmR5IFx4M2QgdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcbiNlbHNlXG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50IFx4M2QgdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHRcdGJpdGFuZ2VudCBceDNkIGJpdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWYiLApub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIFVTRV9OT1JNQUxNQVBcblx0I2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRcdG5vcm1hbCBceDNkIHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0I2lmZGVmIEZMSVBfU0lERURcblx0XHRcdG5vcm1hbCBceDNkIC0gbm9ybWFsO1xuXHRcdCNlbmRpZlxuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdG5vcm1hbCBceDNkIG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0XHRub3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuXHQjZWxzZVxuXHRcdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdFx0bWF0MyB2VEJOIFx4M2QgbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwgKTtcblx0XHRcdHZlYzMgbWFwTiBceDNkIHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0XHRtYXBOLnh5IFx4M2Qgbm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdFx0bm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHRcdCNlbHNlXG5cdFx0XHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcblx0bm9ybWFsIFx4M2QgcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcbiNlbmRpZiIsCm5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcblx0I2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRcdHVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7XG5cdCNlbHNlXG5cdFx0dmVjMyBwZXJ0dXJiTm9ybWFsMkFyYiggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSApIHtcblx0XHRcdHZlYzMgcTAgXHgzZCB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XG5cdFx0XHR2ZWMzIHExIFx4M2QgdmVjMyggZEZkeSggZXllX3Bvcy54ICksIGRGZHkoIGV5ZV9wb3MueSApLCBkRmR5KCBleWVfcG9zLnogKSApO1xuXHRcdFx0dmVjMiBzdDAgXHgzZCBkRmR4KCB2VXYuc3QgKTtcblx0XHRcdHZlYzIgc3QxIFx4M2QgZEZkeSggdlV2LnN0ICk7XG5cdFx0XHRmbG9hdCBzY2FsZSBceDNkIHNpZ24oIHN0MS50ICogc3QwLnMgLSBzdDAudCAqIHN0MS5zICk7XG5cdFx0XHR2ZWMzIFMgXHgzZCBub3JtYWxpemUoICggcTAgKiBzdDEudCAtIHExICogc3QwLnQgKSAqIHNjYWxlICk7XG5cdFx0XHR2ZWMzIFQgXHgzZCBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcblx0XHRcdHZlYzMgTiBceDNkIG5vcm1hbGl6ZSggc3VyZl9ub3JtICk7XG5cdFx0XHRtYXQzIHRzbiBceDNkIG1hdDMoIFMsIFQsIE4gKTtcblx0XHRcdHZlYzMgbWFwTiBceDNkIHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0XHRtYXBOLnh5ICpceDNkIG5vcm1hbFNjYWxlO1xuXHRcdFx0bWFwTi54eSAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0XHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XG5cdFx0fVxuXHQjZW5kaWZcbiNlbmRpZiIsCnBhY2tpbmc6InZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggbm9ybWFsICkgKiAwLjUgKyAwLjU7XG59XG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcblx0cmV0dXJuIDIuMCAqIHJnYi54eXogLSAxLjA7XG59XG5jb25zdCBmbG9hdCBQYWNrVXBzY2FsZSBceDNkIDI1Ni4gLyAyNTUuO2NvbnN0IGZsb2F0IFVucGFja0Rvd25zY2FsZSBceDNkIDI1NS4gLyAyNTYuO1xuY29uc3QgdmVjMyBQYWNrRmFjdG9ycyBceDNkIHZlYzMoIDI1Ni4gKiAyNTYuICogMjU2LiwgMjU2LiAqIDI1Ni4sICAyNTYuICk7XG5jb25zdCB2ZWM0IFVucGFja0ZhY3RvcnMgXHgzZCBVbnBhY2tEb3duc2NhbGUgLyB2ZWM0KCBQYWNrRmFjdG9ycywgMS4gKTtcbmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4IFx4M2QgMS4gLyAyNTYuO1xudmVjNCBwYWNrRGVwdGhUb1JHQkEoIGNvbnN0IGluIGZsb2F0IHYgKSB7XG5cdHZlYzQgciBceDNkIHZlYzQoIGZyYWN0KCB2ICogUGFja0ZhY3RvcnMgKSwgdiApO1xuXHRyLnl6dyAtXHgzZCByLnh5eiAqIFNoaWZ0UmlnaHQ4O1x0cmV0dXJuIHIgKiBQYWNrVXBzY2FsZTtcbn1cbmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25zdCBpbiB2ZWM0IHYgKSB7XG5cdHJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnMgKTtcbn1cbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcbn1cbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcbn0iLApwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxuXHRnbF9GcmFnQ29sb3IucmdiICpceDNkIGdsX0ZyYWdDb2xvci5hO1xuI2VuZGlmIixwcm9qZWN0X3ZlcnRleDoidmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuZ2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsiLGRpdGhlcmluZ19mcmFnbWVudDoiI2lmIGRlZmluZWQoIERJVEhFUklORyApXG5cdGdsX0ZyYWdDb2xvci5yZ2IgXHgzZCBkaXRoZXJpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiIsZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxuXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcblx0XHRmbG9hdCBncmlkX3Bvc2l0aW9uIFx4M2QgcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XG5cdFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCIFx4M2QgdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcblx0XHRkaXRoZXJfc2hpZnRfUkdCIFx4M2QgbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xuXHRcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XG5cdH1cbiNlbmRpZiIsCnJvdWdobmVzc21hcF9mcmFnbWVudDoiZmxvYXQgcm91Z2huZXNzRmFjdG9yIFx4M2Qgcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyBceDNkIHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICpceDNkIHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWYiLHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xuXHQjZW5kaWZcblx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcblx0XHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcblx0fVxuXHRmbG9hdCB0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHNpemUsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XG5cdFx0Y29uc3QgdmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAwLjAsIDEuMCApO1xuXHRcdHZlYzIgdGV4ZWxTaXplIFx4M2QgdmVjMiggMS4wICkgLyBzaXplO1xuXHRcdHZlYzIgY2VudHJvaWRVViBceDNkIGZsb29yKCB1diAqIHNpemUgKyAwLjUgKSAvIHNpemU7XG5cdFx0ZmxvYXQgbGIgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHgsIGNvbXBhcmUgKTtcblx0XHRmbG9hdCBsdCBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eSwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgcnQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXksIGNvbXBhcmUgKTtcblx0XHR2ZWMyIGYgXHgzZCBmcmFjdCggdXYgKiBzaXplICsgMC41ICk7XG5cdFx0ZmxvYXQgYSBceDNkIG1peCggbGIsIGx0LCBmLnkgKTtcblx0XHRmbG9hdCBiIFx4M2QgbWl4KCByYiwgcnQsIGYueSApO1xuXHRcdGZsb2F0IGMgXHgzZCBtaXgoIGEsIGIsIGYueCApO1xuXHRcdHJldHVybiBjO1xuXHR9XG5cdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0ZmxvYXQgc2hhZG93IFx4M2QgMS4wO1xuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvXHgzZCBzaGFkb3dDb29yZC53O1xuXHRcdHNoYWRvd0Nvb3JkLnogK1x4M2Qgc2hhZG93Qmlhcztcblx0XHRidmVjNCBpbkZydXN0dW1WZWMgXHgzZCBidmVjNCAoIHNoYWRvd0Nvb3JkLnggXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC54IFx4M2NceDNkIDEuMCwgc2hhZG93Q29vcmQueSBceDNlXHgzZCAwLjAsIHNoYWRvd0Nvb3JkLnkgXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBpbkZydXN0dW0gXHgzZCBhbGwoIGluRnJ1c3R1bVZlYyApO1xuXHRcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjIFx4M2QgYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiBceDNjXHgzZCAxLjAgKTtcblx0XHRib29sIGZydXN0dW1UZXN0IFx4M2QgYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xuXHRcdGlmICggZnJ1c3R1bVRlc3QgKSB7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0c2hhZG93IFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbmRpZlxuXHRcdH1cblx0XHRyZXR1cm4gc2hhZG93O1xuXHR9XG5cdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcblx0XHR2ZWMzIGFic1YgXHgzZCBhYnMoIHYgKTtcblx0XHRmbG9hdCBzY2FsZVRvQ3ViZSBceDNkIDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcblx0XHRhYnNWICpceDNkIHNjYWxlVG9DdWJlO1xuXHRcdHYgKlx4M2Qgc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcblx0XHR2ZWMyIHBsYW5hciBceDNkIHYueHk7XG5cdFx0ZmxvYXQgYWxtb3N0QVRleGVsIFx4M2QgMS41ICogdGV4ZWxTaXplWTtcblx0XHRmbG9hdCBhbG1vc3RPbmUgXHgzZCAxLjAgLSBhbG1vc3RBVGV4ZWw7XG5cdFx0aWYgKCBhYnNWLnogXHgzZVx4M2QgYWxtb3N0T25lICkge1xuXHRcdFx0aWYgKCB2LnogXHgzZSAwLjAgKVxuXHRcdFx0XHRwbGFuYXIueCBceDNkIDQuMCAtIHYueDtcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnggXHgzZVx4M2QgYWxtb3N0T25lICkge1xuXHRcdFx0ZmxvYXQgc2lnblggXHgzZCBzaWduKCB2LnggKTtcblx0XHRcdHBsYW5hci54IFx4M2Qgdi56ICogc2lnblggKyAyLjAgKiBzaWduWDtcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnkgXHgzZVx4M2QgYWxtb3N0T25lICkge1xuXHRcdFx0ZmxvYXQgc2lnblkgXHgzZCBzaWduKCB2LnkgKTtcblx0XHRcdHBsYW5hci54IFx4M2Qgdi54ICsgMi4wICogc2lnblkgKyAyLjA7XG5cdFx0XHRwbGFuYXIueSBceDNkIHYueiAqIHNpZ25ZIC0gMi4wO1xuXHRcdH1cblx0XHRyZXR1cm4gdmVjMiggMC4xMjUsIDAuMjUgKSAqIHBsYW5hciArIHZlYzIoIDAuMzc1LCAwLjc1ICk7XG5cdH1cblx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XG5cdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcblx0XHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiBceDNkIHNoYWRvd0Nvb3JkLnh5ejtcblx0XHRmbG9hdCBkcCBceDNkICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1x0XHRkcCArXHgzZCBzaGFkb3dCaWFzO1xuXHRcdHZlYzMgYmQzRCBceDNkIG5vcm1hbGl6ZSggbGlnaHRUb1Bvc2l0aW9uICk7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIClcblx0XHRcdHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh4LCB0ZXhlbFNpemUueSApLCBkcCApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsCnNoYWRvd21hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0I2VuZGlmXG4jZW5kaWYiLApzaGFkb3dtYXBfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XG5cdFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSBceDNkIGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBwb2ludFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcbiNlbmRpZiIsCnNoYWRvd21hc2tfcGFyc19mcmFnbWVudDoiZmxvYXQgZ2V0U2hhZG93TWFzaygpIHtcblx0ZmxvYXQgc2hhZG93IFx4M2QgMS4wO1xuXHQjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVFMgXHgzZSAwXG5cdFNwb3RMaWdodCBzcG90TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMFxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRwb2ludExpZ2h0IFx4M2QgcG9pbnRMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggcG9pbnRMaWdodC5zaGFkb3cgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDtcblx0fVxuXHQjZW5kaWZcblx0I2VuZGlmXG5cdHJldHVybiBzaGFkb3c7XG59IiwKc2tpbmJhc2VfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgYm9uZU1hdFggXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xuXHRtYXQ0IGJvbmVNYXRZIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcblx0bWF0NCBib25lTWF0WiBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC56ICk7XG5cdG1hdDQgYm9uZU1hdFcgXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xuI2VuZGlmIixza2lubmluZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xuXHQjaWZkZWYgQk9ORV9URVhUVVJFXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgYm9uZVRleHR1cmU7XG5cdFx0dW5pZm9ybSBpbnQgYm9uZVRleHR1cmVTaXplO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdGZsb2F0IGogXHgzZCBpICogNC4wO1xuXHRcdFx0ZmxvYXQgeCBceDNkIG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCB5IFx4M2QgZmxvb3IoIGogLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IGR4IFx4M2QgMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0ZmxvYXQgZHkgXHgzZCAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0XHR5IFx4M2QgZHkgKiAoIHkgKyAwLjUgKTtcblx0XHRcdHZlYzQgdjEgXHgzZCB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjIgXHgzZCB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjMgXHgzZCB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDIuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjQgXHgzZCB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcblx0XHRcdG1hdDQgYm9uZSBceDNkIG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVTIF07XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0bWF0NCBib25lIFx4M2QgYm9uZU1hdHJpY2VzWyBpbnQoaSkgXTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWYiLApza2lubmluZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dmVjNCBza2luVmVydGV4IFx4M2QgYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcblx0dmVjNCBza2lubmVkIFx4M2QgdmVjNCggMC4wICk7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53O1xuXHR0cmFuc2Zvcm1lZCBceDNkICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xuI2VuZGlmIixza2lubm9ybWFsX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IHNraW5NYXRyaXggXHgzZCBtYXQ0KCAwLjAgKTtcblx0c2tpbk1hdHJpeCArXHgzZCBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcblx0c2tpbk1hdHJpeCArXHgzZCBza2luV2VpZ2h0LnkgKiBib25lTWF0WTtcblx0c2tpbk1hdHJpeCArXHgzZCBza2luV2VpZ2h0LnogKiBib25lTWF0Wjtcblx0c2tpbk1hdHJpeCArXHgzZCBza2luV2VpZ2h0LncgKiBib25lTWF0Vztcblx0c2tpbk1hdHJpeCAgXHgzZCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4O1xuXHRvYmplY3ROb3JtYWwgXHgzZCB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0b2JqZWN0VGFuZ2VudCBceDNkIHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejtcblx0I2VuZGlmXG4jZW5kaWYiLApzcGVjdWxhcm1hcF9mcmFnbWVudDoiZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dmVjNCB0ZXhlbFNwZWN1bGFyIFx4M2QgdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlV2ICk7XG5cdHNwZWN1bGFyU3RyZW5ndGggXHgzZCB0ZXhlbFNwZWN1bGFyLnI7XG4jZWxzZVxuXHRzcGVjdWxhclN0cmVuZ3RoIFx4M2QgMS4wO1xuI2VuZGlmIixzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xuI2VuZGlmIix0b25lbWFwcGluZ19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFRPTkVfTUFQUElORyApXG5cdGdsX0ZyYWdDb2xvci5yZ2IgXHgzZCB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmIix0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiIjaWZuZGVmIHNhdHVyYXRlXG5cdCNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcbiNlbmRpZlxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ0V4cG9zdXJlO1xudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ1doaXRlUG9pbnQ7XG52ZWMzIExpbmVhclRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xufVxudmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb2xvciAqXHgzZCB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcbn1cbiNkZWZpbmUgVW5jaGFydGVkMkhlbHBlciggeCApIG1heCggKCAoIHggKiAoIDAuMTUgKiB4ICsgMC4xMCAqIDAuNTAgKSArIDAuMjAgKiAwLjAyICkgLyAoIHggKiAoIDAuMTUgKiB4ICsgMC41MCApICsgMC4yMCAqIDAuMzAgKSApIC0gMC4wMiAvIDAuMzAsIHZlYzMoIDAuMCApIClcbnZlYzMgVW5jaGFydGVkMlRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb2xvciAqXHgzZCB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRyZXR1cm4gc2F0dXJhdGUoIFVuY2hhcnRlZDJIZWxwZXIoIGNvbG9yICkgLyBVbmNoYXJ0ZWQySGVscGVyKCB2ZWMzKCB0b25lTWFwcGluZ1doaXRlUG9pbnQgKSApICk7XG59XG52ZWMzIE9wdGltaXplZENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb2xvciAqXHgzZCB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRjb2xvciBceDNkIG1heCggdmVjMyggMC4wICksIGNvbG9yIC0gMC4wMDQgKTtcblx0cmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTtcbn1cbnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb2xvciAqXHgzZCB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRyZXR1cm4gc2F0dXJhdGUoICggY29sb3IgKiAoIDIuNTEgKiBjb2xvciArIDAuMDMgKSApIC8gKCBjb2xvciAqICggMi40MyAqIGNvbG9yICsgMC41OSApICsgMC4xNCApICk7XG59IiwKdXZfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfU1BFQ1VMQVJNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKSB8fCBkZWZpbmVkKCBVU0VfRU1JU1NJVkVNQVAgKSB8fCBkZWZpbmVkKCBVU0VfUk9VR0hORVNTTUFQICkgfHwgZGVmaW5lZCggVVNFX01FVEFMTkVTU01BUCApXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG4jZW5kaWYiLHV2X3BhcnNfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjtcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuI2VuZGlmIiwKdXZfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcblx0dlV2IFx4M2QgKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcbiNlbmRpZiIsdXYyX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsdXYyX3BhcnNfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0YXR0cmlidXRlIHZlYzIgdXYyO1xuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsCnV2Ml92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyIFx4M2QgdXYyO1xuI2VuZGlmIix3b3JsZHBvc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApXG5cdHZlYzQgd29ybGRQb3NpdGlvbiBceDNkIG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuI2VuZGlmIixiYWNrZ3JvdW5kX2ZyYWc6InVuaWZvcm0gc2FtcGxlcjJEIHQyRDtcbnZhcnlpbmcgdmVjMiB2VXY7XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLApiYWNrZ3JvdW5kX3ZlcnQ6InZhcnlpbmcgdmVjMiB2VXY7XG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG52b2lkIG1haW4oKSB7XG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XG59IixjdWJlX2ZyYWc6InVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7XG51bmlmb3JtIGZsb2F0IHRGbGlwO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbnZvaWQgbWFpbigpIHtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0Z2xfRnJhZ0NvbG9yLmEgKlx4M2Qgb3BhY2l0eTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxufSIsCmN1YmVfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9zaXRpb24ueiBceDNkIGdsX1Bvc2l0aW9uLnc7XG59IixkZXB0aF9mcmFnOiIjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0ZGlmZnVzZUNvbG9yLmEgXHgzZCBvcGFjaXR5O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDBcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCB2ZWMzKCAxLjAgLSBnbF9GcmFnQ29vcmQueiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMVxuXHRcdGdsX0ZyYWdDb2xvciBceDNkIHBhY2tEZXB0aFRvUkdCQSggZ2xfRnJhZ0Nvb3JkLnogKTtcblx0I2VuZGlmXG59IiwKZGVwdGhfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcbn0iLApkaXN0YW5jZVJHQkFfZnJhZzoiI2RlZmluZSBESVNUQU5DRVxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xudW5pZm9ybSBmbG9hdCBuZWFyRGlzdGFuY2U7XG51bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlO1xudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbiAoKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggMS4wICk7XG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0ZmxvYXQgZGlzdCBceDNkIGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApO1xuXHRkaXN0IFx4M2QgKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XG5cdGRpc3QgXHgzZCBzYXR1cmF0ZSggZGlzdCApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTtcbn0iLApkaXN0YW5jZVJHQkFfdmVydDoiI2RlZmluZSBESVNUQU5DRVxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dldvcmxkUG9zaXRpb24gXHgzZCB3b3JsZFBvc2l0aW9uLnh5ejtcbn0iLAplcXVpcmVjdF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLAplcXVpcmVjdF92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxufSIsbGluZWRhc2hlZF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgXHgzZSBkYXNoU2l6ZSApIHtcblx0XHRkaXNjYXJkO1xuXHR9XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCmxpbmVkYXNoZWRfdmVydDoidW5pZm9ybSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdHZMaW5lRGlzdGFuY2UgXHgzZCBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaGJhc2ljX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX2ZyYWdtZW50XHgzZVxuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCBceDNkIFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdmVjMyggMS4wICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfZnJhZ21lbnRceDNlXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKbWVzaGJhc2ljX3ZlcnQ6IiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9FTlZNQVBcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZW52bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaGxhbWJlcnRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY2RpdGhlcmluZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FvbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hc2tfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCBceDNkIFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSBceDNkIGVtaXNzaXZlO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2SW5kaXJlY3RGcm9udCA6IHZJbmRpcmVjdEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZJbmRpcmVjdEZyb250O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xpZ2h0bWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkIHZMaWdodEZyb250O1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfZnJhZ21lbnRceDNlXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaGxhbWJlcnRfdmVydDoiI2RlZmluZSBMQU1CRVJUXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2xhbWJlcnRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaG1hdGNhcF9mcmFnOiIjZGVmaW5lIE1BVENBUFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7XG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0dmVjMyB2aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG5cdHZlYzMgeCBceDNkIG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcblx0dmVjMyB5IFx4M2QgY3Jvc3MoIHZpZXdEaXIsIHggKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41O1xuXHQjaWZkZWYgVVNFX01BVENBUFxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcblx0XHRtYXRjYXBDb2xvciBceDNkIG1hdGNhcFRleGVsVG9MaW5lYXIoIG1hdGNhcENvbG9yICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjZW5kaWZcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobWF0Y2FwX3ZlcnQ6IiNkZWZpbmUgTUFUQ0FQXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjaWZuZGVmIEZMQVRfU0hBREVEXG5cdFx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG59IiwKbWVzaHBob25nX2ZyYWc6IiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NidW1wbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgXHgzZCBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waG9uZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSBceDNjZW52bWFwX2ZyYWdtZW50XHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZGl0aGVyaW5nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hwaG9uZ192ZXJ0OiIjZGVmaW5lIFBIT05HXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaHBoeXNpY2FsX2ZyYWc6IiNkZWZpbmUgUEhZU0lDQUxcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XG51bmlmb3JtIGZsb2F0IG1ldGFsbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgU1RBTkRBUkRcblx0dW5pZm9ybSBmbG9hdCBjbGVhckNvYXQ7XG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJDb2F0Um91Z2huZXNzO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3JvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCBceDNkIFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSBceDNkIGVtaXNzaXZlO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcm91Z2huZXNzbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWV0YWxuZXNzbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZGl0aGVyaW5nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hwaHlzaWNhbF92ZXJ0OiIjZGVmaW5lIFBIWVNJQ0FMXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3V2Ml92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbm9ybWFsX2ZyYWc6IiNkZWZpbmUgTk9STUFMXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8ICggZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIFx4MjZceDI2ICEgZGVmaW5lZCggT0JKRUNUU1BBQ0VfTk9STUFMTUFQICkgKVxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NidW1wbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIHBhY2tOb3JtYWxUb1JHQiggbm9ybWFsICksIG9wYWNpdHkgKTtcbn0iLApub3JtYWxfdmVydDoiI2RlZmluZSBOT1JNQUxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgKCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgXHgyNlx4MjYgISBkZWZpbmVkKCBPQkpFQ1RTUEFDRV9OT1JNQUxNQVAgKSApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8ICggZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIFx4MjZceDI2ICEgZGVmaW5lZCggT0JKRUNUU1BBQ0VfTk9STUFMTUFQICkgKVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZlxufSIsCnBvaW50c19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9wYXJ0aWNsZV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApwb2ludHNfdmVydDoidW5pZm9ybSBmbG9hdCBzaXplO1xudW5pZm9ybSBmbG9hdCBzY2FsZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHRnbF9Qb2ludFNpemUgXHgzZCBzaXplO1xuXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxuXHRcdGJvb2wgaXNQZXJzcGVjdGl2ZSBceDNkICggcHJvamVjdGlvbk1hdHJpeFsgMiBdWyAzIF0gXHgzZFx4M2QgLSAxLjAgKTtcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKlx4M2QgKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc2hhZG93X2ZyYWc6InVuaWZvcm0gdmVjMyBjb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsc2hhZG93X3ZlcnQ6IiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApzcHJpdGVfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKc3ByaXRlX3ZlcnQ6InVuaWZvcm0gZmxvYXQgcm90YXRpb247XG51bmlmb3JtIHZlYzIgY2VudGVyO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHR2ZWM0IG12UG9zaXRpb24gXHgzZCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0dmVjMiBzY2FsZTtcblx0c2NhbGUueCBceDNkIGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDAgXS54LCBtb2RlbE1hdHJpeFsgMCBdLnksIG1vZGVsTWF0cml4WyAwIF0ueiApICk7XG5cdHNjYWxlLnkgXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xuXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKlx4M2QgLSBtdlBvc2l0aW9uLno7XG5cdCNlbmRpZlxuXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiBceDNkICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlO1xuXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcblx0cm90YXRlZFBvc2l0aW9uLnggXHgzZCBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRyb3RhdGVkUG9zaXRpb24ueSBceDNkIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XG5cdG12UG9zaXRpb24ueHkgK1x4M2Qgcm90YXRlZFBvc2l0aW9uO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59In0sCmxwPXtjbG9uZTpGLG1lcmdlOkR9LG1wPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsCmRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LApncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LApsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLApwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLAp0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH07T2JqZWN0LmFzc2lnbihCLnByb3RvdHlwZSx7aXNDb2xvcjohMCxyOjEsZzoxLGI6MSxzZXQ6ZnVuY3Rpb24oYil7YiYmYi5pc0NvbG9yP3RoaXMuY29weShiKToibnVtYmVyIj09PXR5cGVvZiBiP3RoaXMuc2V0SGV4KGIpOiJzdHJpbmciPT09dHlwZW9mIGImJnRoaXMuc2V0U3R5bGUoYik7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLmI9dGhpcy5nPXRoaXMucj1iO3JldHVybiB0aGlzfSxzZXRIZXg6ZnVuY3Rpb24oYil7Yj1NYXRoLmZsb29yKGIpO3RoaXMucj0oYj4+MTYmMjU1KS8yNTU7dGhpcy5nPShiPj44JjI1NSkvMjU1O3RoaXMuYj0oYiYyNTUpLzI1NTsKcmV0dXJuIHRoaXN9LHNldFJHQjpmdW5jdGlvbihiLGUsaCl7dGhpcy5yPWI7dGhpcy5nPWU7dGhpcy5iPWg7cmV0dXJuIHRoaXN9LHNldEhTTDpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoZSxoLG4pezA+biYmKG4rPTEpOzE8biYmLS1uO3JldHVybiBuPDEvNj9lKzYqKGgtZSkqbjouNT5uP2g6bjwyLzM/ZSs2KihoLWUpKigyLzMtbik6ZX1yZXR1cm4gZnVuY3Rpb24oZSxoLG4pe2U9b2IuZXVjbGlkZWFuTW9kdWxvKGUsMSk7aD1vYi5jbGFtcChoLDAsMSk7bj1vYi5jbGFtcChuLDAsMSk7MD09PWg/dGhpcy5yPXRoaXMuZz10aGlzLmI9bjooaD0uNT49bj9uKigxK2gpOm4raC1uKmgsbj0yKm4taCx0aGlzLnI9YihuLGgsZSsxLzMpLHRoaXMuZz1iKG4saCxlKSx0aGlzLmI9YihuLGgsZS0xLzMpKTtyZXR1cm4gdGhpc319KCksc2V0U3R5bGU6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZSh6KXt2b2lkIDAhPT16JiYxPnBhcnNlRmxvYXQoeikmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiKwpiKyIgd2lsbCBiZSBpZ25vcmVkLiIpfXZhciBoO2lmKGg9L14oKD86cmdifGhzbClhPylcKFxzKihbXlwpXSopXCkvLmV4ZWMoYikpe3ZhciBuPWhbMl07c3dpdGNoKGhbMV0pe2Nhc2UgInJnYiI6Y2FzZSAicmdiYSI6aWYoaD0vXihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhuKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDI1NSxwYXJzZUludChoWzFdLDEwKSkvMjU1LHRoaXMuZz1NYXRoLm1pbigyNTUscGFyc2VJbnQoaFsyXSwxMCkpLzI1NSx0aGlzLmI9TWF0aC5taW4oMjU1LHBhcnNlSW50KGhbM10sMTApKS8yNTUsZShoWzVdKSx0aGlzO2lmKGg9L14oXGQrKSVccyosXHMqKFxkKyklXHMqLFxzKihcZCspJVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMobikpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigxMDAscGFyc2VJbnQoaFsxXSwxMCkpLzEwMCx0aGlzLmc9TWF0aC5taW4oMTAwLHBhcnNlSW50KGhbMl0sCjEwKSkvMTAwLHRoaXMuYj1NYXRoLm1pbigxMDAscGFyc2VJbnQoaFszXSwxMCkpLzEwMCxlKGhbNV0pLHRoaXM7YnJlYWs7Y2FzZSAiaHNsIjpjYXNlICJoc2xhIjppZihoPS9eKFswLTldKlwuP1swLTldKylccyosXHMqKFxkKyklXHMqLFxzKihcZCspJVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMobikpe249cGFyc2VGbG9hdChoWzFdKS8zNjA7dmFyIHU9cGFyc2VJbnQoaFsyXSwxMCkvMTAwLHc9cGFyc2VJbnQoaFszXSwxMCkvMTAwO2UoaFs1XSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4sdSx3KX19fWVsc2UgaWYoaD0vXiMoW0EtRmEtZjAtOV0rKSQvLmV4ZWMoYikpe2g9aFsxXTtuPWgubGVuZ3RoO2lmKDM9PT1uKXJldHVybiB0aGlzLnI9cGFyc2VJbnQoaC5jaGFyQXQoMCkraC5jaGFyQXQoMCksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQoaC5jaGFyQXQoMSkraC5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQoaC5jaGFyQXQoMikraC5jaGFyQXQoMiksCjE2KS8yNTUsdGhpcztpZig2PT09bilyZXR1cm4gdGhpcy5yPXBhcnNlSW50KGguY2hhckF0KDApK2guY2hhckF0KDEpLDE2KS8yNTUsdGhpcy5nPXBhcnNlSW50KGguY2hhckF0KDIpK2guY2hhckF0KDMpLDE2KS8yNTUsdGhpcy5iPXBhcnNlSW50KGguY2hhckF0KDQpK2guY2hhckF0KDUpLDE2KS8yNTUsdGhpc31iJiYwPGIubGVuZ3RoJiYoaD1tcFtiXSx2b2lkIDAhPT1oP3RoaXMuc2V0SGV4KGgpOmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgIitiKSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLnI9Yi5yO3RoaXMuZz1iLmc7dGhpcy5iPWIuYjtyZXR1cm4gdGhpc30sY29weUdhbW1hVG9MaW5lYXI6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoZT0yKTt0aGlzLnI9TWF0aC5wb3coYi5yLGUpO3RoaXMuZz1NYXRoLnBvdyhiLmcsCmUpO3RoaXMuYj1NYXRoLnBvdyhiLmIsZSk7cmV0dXJuIHRoaXN9LGNvcHlMaW5lYXJUb0dhbW1hOmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9Mik7ZT0wPGU/MS9lOjE7dGhpcy5yPU1hdGgucG93KGIucixlKTt0aGlzLmc9TWF0aC5wb3coYi5nLGUpO3RoaXMuYj1NYXRoLnBvdyhiLmIsZSk7cmV0dXJuIHRoaXN9LGNvbnZlcnRHYW1tYVRvTGluZWFyOmZ1bmN0aW9uKGIpe3RoaXMuY29weUdhbW1hVG9MaW5lYXIodGhpcyxiKTtyZXR1cm4gdGhpc30sY29udmVydExpbmVhclRvR2FtbWE6ZnVuY3Rpb24oYil7dGhpcy5jb3B5TGluZWFyVG9HYW1tYSh0aGlzLGIpO3JldHVybiB0aGlzfSxjb3B5U1JHQlRvTGluZWFyOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihlKXtyZXR1cm4uMDQwNDU+ZT8uMDc3Mzk5MzgwOCplOk1hdGgucG93KC45NDc4NjcyOTg2KmUrLjA1MjEzMjcwMTQsMi40KX1yZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy5yPWIoZS5yKTt0aGlzLmc9YihlLmcpO3RoaXMuYj0KYihlLmIpO3JldHVybiB0aGlzfX0oKSxjb3B5TGluZWFyVG9TUkdCOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihlKXtyZXR1cm4uMDAzMTMwOD5lPzEyLjkyKmU6MS4wNTUqTWF0aC5wb3coZSwuNDE2NjYpLS4wNTV9cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMucj1iKGUucik7dGhpcy5nPWIoZS5nKTt0aGlzLmI9YihlLmIpO3JldHVybiB0aGlzfX0oKSxjb252ZXJ0U1JHQlRvTGluZWFyOmZ1bmN0aW9uKCl7dGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9TUkdCOmZ1bmN0aW9uKCl7dGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpO3JldHVybiB0aGlzfSxnZXRIZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMjU1KnRoaXMucjw8MTZeMjU1KnRoaXMuZzw8OF4yNTUqdGhpcy5iPDwwfSxnZXRIZXhTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4oIjAwMDAwMCIrdGhpcy5nZXRIZXgoKS50b1N0cmluZygxNikpLnNsaWNlKC02KX0sZ2V0SFNMOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PQpiJiYoY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogLmdldEhTTCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPXtoOjAsczowLGw6MH0pO3ZhciBlPXRoaXMucixoPXRoaXMuZyxuPXRoaXMuYix1PU1hdGgubWF4KGUsaCxuKSx3PU1hdGgubWluKGUsaCxuKSx6LEU9KHcrdSkvMjtpZih3PT09dSl3PXo9MDtlbHNle3ZhciBIPXUtdzt3PS41Pj1FP0gvKHUrdyk6SC8oMi11LXcpO3N3aXRjaCh1KXtjYXNlIGU6ej0oaC1uKS9IKyhoPG4/NjowKTticmVhaztjYXNlIGg6ej0obi1lKS9IKzI7YnJlYWs7Y2FzZSBuOno9KGUtaCkvSCs0fXovPTZ9Yi5oPXo7Yi5zPXc7Yi5sPUU7cmV0dXJuIGJ9LGdldFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJuInJnYigiKygyNTUqdGhpcy5yfDApKyIsIisoMjU1KnRoaXMuZ3wwKSsiLCIrKDI1NSp0aGlzLmJ8MCkrIikifSxvZmZzZXRIU0w6ZnVuY3Rpb24oKXt2YXIgYj17fTtyZXR1cm4gZnVuY3Rpb24oZSxoLG4pe3RoaXMuZ2V0SFNMKGIpO2IuaCs9CmU7Yi5zKz1oO2IubCs9bjt0aGlzLnNldEhTTChiLmgsYi5zLGIubCk7cmV0dXJuIHRoaXN9fSgpLGFkZDpmdW5jdGlvbihiKXt0aGlzLnIrPWIucjt0aGlzLmcrPWIuZzt0aGlzLmIrPWIuYjtyZXR1cm4gdGhpc30sYWRkQ29sb3JzOmZ1bmN0aW9uKGIsZSl7dGhpcy5yPWIucitlLnI7dGhpcy5nPWIuZytlLmc7dGhpcy5iPWIuYitlLmI7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLnIrPWI7dGhpcy5nKz1iO3RoaXMuYis9YjtyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGIpe3RoaXMucj1NYXRoLm1heCgwLHRoaXMuci1iLnIpO3RoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy1iLmcpO3RoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi1iLmIpO3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiKXt0aGlzLnIqPWIucjt0aGlzLmcqPWIuZzt0aGlzLmIqPWIuYjtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy5yKj1iO3RoaXMuZyo9CmI7dGhpcy5iKj1iO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGIsZSl7dGhpcy5yKz0oYi5yLXRoaXMucikqZTt0aGlzLmcrPShiLmctdGhpcy5nKSplO3RoaXMuYis9KGIuYi10aGlzLmIpKmU7cmV0dXJuIHRoaXN9LGxlcnBIU0w6ZnVuY3Rpb24oKXt2YXIgYj17aDowLHM6MCxsOjB9LGU9e2g6MCxzOjAsbDowfTtyZXR1cm4gZnVuY3Rpb24oaCxuKXt0aGlzLmdldEhTTChiKTtoLmdldEhTTChlKTtoPW9iLmxlcnAoYi5oLGUuaCxuKTt2YXIgdT1vYi5sZXJwKGIucyxlLnMsbik7bj1vYi5sZXJwKGIubCxlLmwsbik7dGhpcy5zZXRIU0woaCx1LG4pO3JldHVybiB0aGlzfX0oKSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIucj09PXRoaXMuciYmYi5nPT09dGhpcy5nJiZiLmI9PT10aGlzLmJ9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO3RoaXMucj1iW2VdO3RoaXMuZz1iW2UrMV07dGhpcy5iPWJbZSsyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihiLAplKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7YltlXT10aGlzLnI7YltlKzFdPXRoaXMuZztiW2UrMl09dGhpcy5iO3JldHVybiBifSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX19KTt2YXIgYmI9e2NvbW1vbjp7ZGlmZnVzZTp7dmFsdWU6bmV3IEIoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgbH0sYWxwaGFNYXA6e3ZhbHVlOm51bGx9fSxzcGVjdWxhcm1hcDp7c3BlY3VsYXJNYXA6e3ZhbHVlOm51bGx9fSxlbnZtYXA6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9LHJlZmxlY3Rpdml0eTp7dmFsdWU6MX0scmVmcmFjdGlvblJhdGlvOnt2YWx1ZTouOTh9LG1heE1pcExldmVsOnt2YWx1ZTowfX0sYW9tYXA6e2FvTWFwOnt2YWx1ZTpudWxsfSxhb01hcEludGVuc2l0eTp7dmFsdWU6MX19LGxpZ2h0bWFwOntsaWdodE1hcDp7dmFsdWU6bnVsbH0sCmxpZ2h0TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfX0sYnVtcG1hcDp7YnVtcE1hcDp7dmFsdWU6bnVsbH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LG5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgZCgxLDEpfX0sZGlzcGxhY2VtZW50bWFwOntkaXNwbGFjZW1lbnRNYXA6e3ZhbHVlOm51bGx9LGRpc3BsYWNlbWVudFNjYWxlOnt2YWx1ZToxfSxkaXNwbGFjZW1lbnRCaWFzOnt2YWx1ZTowfX0scm91Z2huZXNzbWFwOntyb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9fSxtZXRhbG5lc3NtYXA6e21ldGFsbmVzc01hcDp7dmFsdWU6bnVsbH19LGdyYWRpZW50bWFwOntncmFkaWVudE1hcDp7dmFsdWU6bnVsbH19LGZvZzp7Zm9nRGVuc2l0eTp7dmFsdWU6Mi41RS00fSxmb2dOZWFyOnt2YWx1ZToxfSxmb2dGYXI6e3ZhbHVlOjJFM30sZm9nQ29sb3I6e3ZhbHVlOm5ldyBCKDE2Nzc3MjE1KX19LApsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e319fSxkaXJlY3Rpb25hbFNoYWRvd01hcDp7dmFsdWU6W119LGRpcmVjdGlvbmFsU2hhZG93TWF0cml4Ont2YWx1ZTpbXX0sc3BvdExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGlyZWN0aW9uOnt9LGRpc3RhbmNlOnt9LGNvbmVDb3M6e30scGVudW1icmFDb3M6e30sZGVjYXk6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e319fSxzcG90U2hhZG93TWFwOnt2YWx1ZTpbXX0sc3BvdFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHBvaW50TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSwKcG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSxwb2ludFNoYWRvd01hcDp7dmFsdWU6W119LHBvaW50U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0saGVtaXNwaGVyZUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LHNreUNvbG9yOnt9LGdyb3VuZENvbG9yOnt9fX0scmVjdEFyZWFMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LHdpZHRoOnt9LGhlaWdodDp7fX19fSxwb2ludHM6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBCKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sc2l6ZTp7dmFsdWU6MX0sc2NhbGU6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBsfX0sc3ByaXRlOntkaWZmdXNlOnt2YWx1ZTpuZXcgQigxNTY1ODczNCl9LApvcGFjaXR5Ont2YWx1ZToxfSxjZW50ZXI6e3ZhbHVlOm5ldyBkKC41LC41KX0scm90YXRpb246e3ZhbHVlOjB9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBsfX19LGlkPXtiYXNpYzp7dW5pZm9ybXM6RChbYmIuY29tbW9uLGJiLnNwZWN1bGFybWFwLGJiLmVudm1hcCxiYi5hb21hcCxiYi5saWdodG1hcCxiYi5mb2ddKSx2ZXJ0ZXhTaGFkZXI6emIubWVzaGJhc2ljX3ZlcnQsZnJhZ21lbnRTaGFkZXI6emIubWVzaGJhc2ljX2ZyYWd9LGxhbWJlcnQ6e3VuaWZvcm1zOkQoW2JiLmNvbW1vbixiYi5zcGVjdWxhcm1hcCxiYi5lbnZtYXAsYmIuYW9tYXAsYmIubGlnaHRtYXAsYmIuZW1pc3NpdmVtYXAsYmIuZm9nLGJiLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBCKDApfX1dKSx2ZXJ0ZXhTaGFkZXI6emIubWVzaGxhbWJlcnRfdmVydCxmcmFnbWVudFNoYWRlcjp6Yi5tZXNobGFtYmVydF9mcmFnfSxwaG9uZzp7dW5pZm9ybXM6RChbYmIuY29tbW9uLGJiLnNwZWN1bGFybWFwLApiYi5lbnZtYXAsYmIuYW9tYXAsYmIubGlnaHRtYXAsYmIuZW1pc3NpdmVtYXAsYmIuYnVtcG1hcCxiYi5ub3JtYWxtYXAsYmIuZGlzcGxhY2VtZW50bWFwLGJiLmdyYWRpZW50bWFwLGJiLmZvZyxiYi5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgQigwKX0sc3BlY3VsYXI6e3ZhbHVlOm5ldyBCKDExMTg0ODEpfSxzaGluaW5lc3M6e3ZhbHVlOjMwfX1dKSx2ZXJ0ZXhTaGFkZXI6emIubWVzaHBob25nX3ZlcnQsZnJhZ21lbnRTaGFkZXI6emIubWVzaHBob25nX2ZyYWd9LHN0YW5kYXJkOnt1bmlmb3JtczpEKFtiYi5jb21tb24sYmIuZW52bWFwLGJiLmFvbWFwLGJiLmxpZ2h0bWFwLGJiLmVtaXNzaXZlbWFwLGJiLmJ1bXBtYXAsYmIubm9ybWFsbWFwLGJiLmRpc3BsYWNlbWVudG1hcCxiYi5yb3VnaG5lc3NtYXAsYmIubWV0YWxuZXNzbWFwLGJiLmZvZyxiYi5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgQigwKX0scm91Z2huZXNzOnt2YWx1ZTouNX0sbWV0YWxuZXNzOnt2YWx1ZTouNX0sCmVudk1hcEludGVuc2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOnpiLm1lc2hwaHlzaWNhbF92ZXJ0LGZyYWdtZW50U2hhZGVyOnpiLm1lc2hwaHlzaWNhbF9mcmFnfSxtYXRjYXA6e3VuaWZvcm1zOkQoW2JiLmNvbW1vbixiYi5idW1wbWFwLGJiLm5vcm1hbG1hcCxiYi5kaXNwbGFjZW1lbnRtYXAsYmIuZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjp6Yi5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6emIubWVzaG1hdGNhcF9mcmFnfSxwb2ludHM6e3VuaWZvcm1zOkQoW2JiLnBvaW50cyxiYi5mb2ddKSx2ZXJ0ZXhTaGFkZXI6emIucG9pbnRzX3ZlcnQsZnJhZ21lbnRTaGFkZXI6emIucG9pbnRzX2ZyYWd9LGRhc2hlZDp7dW5pZm9ybXM6RChbYmIuY29tbW9uLGJiLmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjp6Yi5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6emIubGluZWRhc2hlZF9mcmFnfSwKZGVwdGg6e3VuaWZvcm1zOkQoW2JiLmNvbW1vbixiYi5kaXNwbGFjZW1lbnRtYXBdKSx2ZXJ0ZXhTaGFkZXI6emIuZGVwdGhfdmVydCxmcmFnbWVudFNoYWRlcjp6Yi5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOkQoW2JiLmNvbW1vbixiYi5idW1wbWFwLGJiLm5vcm1hbG1hcCxiYi5kaXNwbGFjZW1lbnRtYXAse29wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjp6Yi5ub3JtYWxfdmVydCxmcmFnbWVudFNoYWRlcjp6Yi5ub3JtYWxfZnJhZ30sc3ByaXRlOnt1bmlmb3JtczpEKFtiYi5zcHJpdGUsYmIuZm9nXSksdmVydGV4U2hhZGVyOnpiLnNwcml0ZV92ZXJ0LGZyYWdtZW50U2hhZGVyOnpiLnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBsfSx0MkQ6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6emIuYmFja2dyb3VuZF92ZXJ0LGZyYWdtZW50U2hhZGVyOnpiLmJhY2tncm91bmRfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSwKdEZsaXA6e3ZhbHVlOi0xfSxvcGFjaXR5Ont2YWx1ZToxfX0sdmVydGV4U2hhZGVyOnpiLmN1YmVfdmVydCxmcmFnbWVudFNoYWRlcjp6Yi5jdWJlX2ZyYWd9LGVxdWlyZWN0Ont1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOnpiLmVxdWlyZWN0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6emIuZXF1aXJlY3RfZnJhZ30sZGlzdGFuY2VSR0JBOnt1bmlmb3JtczpEKFtiYi5jb21tb24sYmIuZGlzcGxhY2VtZW50bWFwLHtyZWZlcmVuY2VQb3NpdGlvbjp7dmFsdWU6bmV3IGd9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFFM319XSksdmVydGV4U2hhZGVyOnpiLmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOnpiLmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOkQoW2JiLmxpZ2h0cyxiYi5mb2cse2NvbG9yOnt2YWx1ZTpuZXcgQigwKX0sb3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOnpiLnNoYWRvd192ZXJ0LApmcmFnbWVudFNoYWRlcjp6Yi5zaGFkb3dfZnJhZ319O2lkLnBoeXNpY2FsPXt1bmlmb3JtczpEKFtpZC5zdGFuZGFyZC51bmlmb3Jtcyx7Y2xlYXJDb2F0Ont2YWx1ZTowfSxjbGVhckNvYXRSb3VnaG5lc3M6e3ZhbHVlOjB9fV0pLHZlcnRleFNoYWRlcjp6Yi5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjp6Yi5tZXNocGh5c2ljYWxfZnJhZ307T2JqZWN0LmFzc2lnbihMLnByb3RvdHlwZSx7Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5hPWIuYTt0aGlzLmI9Yi5iO3RoaXMuYz1iLmM7dGhpcy5ub3JtYWwuY29weShiLm5vcm1hbCk7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMubWF0ZXJpYWxJbmRleD1iLm1hdGVyaWFsSW5kZXg7Zm9yKHZhciBlPTAsaD1iLnZlcnRleE5vcm1hbHMubGVuZ3RoO2U8aDtlKyspdGhpcy52ZXJ0ZXhOb3JtYWxzW2VdPWIudmVydGV4Tm9ybWFsc1tlXS5jbG9uZSgpOwplPTA7Zm9yKGg9Yi52ZXJ0ZXhDb2xvcnMubGVuZ3RoO2U8aDtlKyspdGhpcy52ZXJ0ZXhDb2xvcnNbZV09Yi52ZXJ0ZXhDb2xvcnNbZV0uY2xvbmUoKTtyZXR1cm4gdGhpc319KTtKLlJvdGF0aW9uT3JkZXJzPSJYWVogWVpYIFpYWSBYWlkgWVhaIFpZWCIuc3BsaXQoIiAiKTtKLkRlZmF1bHRPcmRlcj0iWFlaIjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhKLnByb3RvdHlwZSx7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihiKXt0aGlzLl94PWI7dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCl9fSx5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feX0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3k9Yjt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKX19LHo6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl96fSxzZXQ6ZnVuY3Rpb24oYil7dGhpcy5fej1iO3RoaXMub25DaGFuZ2VDYWxsYmFjaygpfX0sb3JkZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmRlcn0sCnNldDpmdW5jdGlvbihiKXt0aGlzLl9vcmRlcj1iO3RoaXMub25DaGFuZ2VDYWxsYmFjaygpfX19KTtPYmplY3QuYXNzaWduKEoucHJvdG90eXBlLHtpc0V1bGVyOiEwLHNldDpmdW5jdGlvbihiLGUsaCxuKXt0aGlzLl94PWI7dGhpcy5feT1lO3RoaXMuX3o9aDt0aGlzLl9vcmRlcj1ufHx0aGlzLl9vcmRlcjt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMuX3g9Yi5feDt0aGlzLl95PWIuX3k7dGhpcy5fej1iLl96O3RoaXMuX29yZGVyPWIuX29yZGVyO3RoaXMub25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYixlLGgpe3ZhciBuPW9iLmNsYW1wLHU9Yi5lbGVtZW50cztiPXVbMF07dmFyIHc9dVs0XSx6PXVbOF0sRT0KdVsxXSxIPXVbNV0sST11WzldLE89dVsyXSxRPXVbNl07dT11WzEwXTtlPWV8fHRoaXMuX29yZGVyOyJYWVoiPT09ZT8odGhpcy5feT1NYXRoLmFzaW4obih6LC0xLDEpKSwuOTk5OTk+TWF0aC5hYnMoeik/KHRoaXMuX3g9TWF0aC5hdGFuMigtSSx1KSx0aGlzLl96PU1hdGguYXRhbjIoLXcsYikpOih0aGlzLl94PU1hdGguYXRhbjIoUSxIKSx0aGlzLl96PTApKToiWVhaIj09PWU/KHRoaXMuX3g9TWF0aC5hc2luKC1uKEksLTEsMSkpLC45OTk5OT5NYXRoLmFicyhJKT8odGhpcy5feT1NYXRoLmF0YW4yKHosdSksdGhpcy5fej1NYXRoLmF0YW4yKEUsSCkpOih0aGlzLl95PU1hdGguYXRhbjIoLU8sYiksdGhpcy5fej0wKSk6IlpYWSI9PT1lPyh0aGlzLl94PU1hdGguYXNpbihuKFEsLTEsMSkpLC45OTk5OT5NYXRoLmFicyhRKT8odGhpcy5feT1NYXRoLmF0YW4yKC1PLHUpLHRoaXMuX3o9TWF0aC5hdGFuMigtdyxIKSk6KHRoaXMuX3k9MCx0aGlzLl96PU1hdGguYXRhbjIoRSxiKSkpOgoiWllYIj09PWU/KHRoaXMuX3k9TWF0aC5hc2luKC1uKE8sLTEsMSkpLC45OTk5OT5NYXRoLmFicyhPKT8odGhpcy5feD1NYXRoLmF0YW4yKFEsdSksdGhpcy5fej1NYXRoLmF0YW4yKEUsYikpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC13LEgpKSk6IllaWCI9PT1lPyh0aGlzLl96PU1hdGguYXNpbihuKEUsLTEsMSkpLC45OTk5OT5NYXRoLmFicyhFKT8odGhpcy5feD1NYXRoLmF0YW4yKC1JLEgpLHRoaXMuX3k9TWF0aC5hdGFuMigtTyxiKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoeix1KSkpOiJYWlkiPT09ZT8odGhpcy5fej1NYXRoLmFzaW4oLW4odywtMSwxKSksLjk5OTk5Pk1hdGguYWJzKHcpPyh0aGlzLl94PU1hdGguYXRhbjIoUSxIKSx0aGlzLl95PU1hdGguYXRhbjIoeixiKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtSSx1KSx0aGlzLl95PTApKTpjb25zb2xlLndhcm4oIlRIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZ2l2ZW4gdW5zdXBwb3J0ZWQgb3JkZXI6ICIrCmUpO3RoaXMuX29yZGVyPWU7aWYoITEhPT1oKXRoaXMub25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tUXVhdGVybmlvbjpmdW5jdGlvbigpe3ZhciBiPW5ldyBDO3JldHVybiBmdW5jdGlvbihlLGgsbil7Yi5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihlKTtyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoYixoLG4pfX0oKSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihiLGUpe3JldHVybiB0aGlzLnNldChiLngsYi55LGIueixlfHx0aGlzLl9vcmRlcil9LHJlb3JkZXI6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZjtyZXR1cm4gZnVuY3Rpb24oZSl7Yi5zZXRGcm9tRXVsZXIodGhpcyk7cmV0dXJuIHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oYixlKX19KCksZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLl94PT09dGhpcy5feCYmYi5feT09PXRoaXMuX3kmJmIuX3o9PT10aGlzLl96JiZiLl9vcmRlcj09PXRoaXMuX29yZGVyfSxmcm9tQXJyYXk6ZnVuY3Rpb24oYil7dGhpcy5feD0KYlswXTt0aGlzLl95PWJbMV07dGhpcy5fej1iWzJdO3ZvaWQgMCE9PWJbM10mJih0aGlzLl9vcmRlcj1iWzNdKTt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWImJihiPVtdKTt2b2lkIDA9PT1lJiYoZT0wKTtiW2VdPXRoaXMuX3g7YltlKzFdPXRoaXMuX3k7YltlKzJdPXRoaXMuX3o7YltlKzNdPXRoaXMuX29yZGVyO3JldHVybiBifSx0b1ZlY3RvcjM6ZnVuY3Rpb24oYil7cmV0dXJuIGI/Yi5zZXQodGhpcy5feCx0aGlzLl95LHRoaXMuX3opOm5ldyBnKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KX0sb25DaGFuZ2U6ZnVuY3Rpb24oYil7dGhpcy5vbkNoYW5nZUNhbGxiYWNrPWI7cmV0dXJuIHRoaXN9LG9uQ2hhbmdlQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9fSk7T2JqZWN0LmFzc2lnbihQLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGIpe3RoaXMubWFzaz0xPDxifDB9LGVuYWJsZTpmdW5jdGlvbihiKXt0aGlzLm1hc2s9CnRoaXMubWFza3wxPDxifDB9LHRvZ2dsZTpmdW5jdGlvbihiKXt0aGlzLm1hc2tePTE8PGJ8MH0sZGlzYWJsZTpmdW5jdGlvbihiKXt0aGlzLm1hc2smPX4oMTw8YnwwKX0sdGVzdDpmdW5jdGlvbihiKXtyZXR1cm4gMCE9PSh0aGlzLm1hc2smYi5tYXNrKX19KTt2YXIgTG49MDtTLkRlZmF1bHRVcD1uZXcgZygwLDEsMCk7Uy5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZT0hMDtTLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpTLGlzT2JqZWN0M0Q6ITAsb25CZWZvcmVSZW5kZXI6ZnVuY3Rpb24oKXt9LG9uQWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oKXt9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGIpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKTt0aGlzLm1hdHJpeC5wcmVtdWx0aXBseShiKTt0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9LAphcHBseVF1YXRlcm5pb246ZnVuY3Rpb24oYil7dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGIpO3JldHVybiB0aGlzfSxzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGU6ZnVuY3Rpb24oYixlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShiLGUpfSxzZXRSb3RhdGlvbkZyb21FdWxlcjpmdW5jdGlvbihiKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKGIsITApfSxzZXRSb3RhdGlvbkZyb21NYXRyaXg6ZnVuY3Rpb24oYil7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChiKX0sc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjpmdW5jdGlvbihiKXt0aGlzLnF1YXRlcm5pb24uY29weShiKX0scm90YXRlT25BeGlzOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGY7cmV0dXJuIGZ1bmN0aW9uKGUsaCl7Yi5zZXRGcm9tQXhpc0FuZ2xlKGUsaCk7dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KGIpO3JldHVybiB0aGlzfX0oKSxyb3RhdGVPbldvcmxkQXhpczpmdW5jdGlvbigpe3ZhciBiPQpuZXcgZjtyZXR1cm4gZnVuY3Rpb24oZSxoKXtiLnNldEZyb21BeGlzQW5nbGUoZSxoKTt0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoYik7cmV0dXJuIHRoaXN9fSgpLHJvdGF0ZVg6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZygxLDAsMCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhiLGUpfX0oKSxyb3RhdGVZOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGcoMCwxLDApO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoYixlKX19KCkscm90YXRlWjpmdW5jdGlvbigpe3ZhciBiPW5ldyBnKDAsMCwxKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGIsZSl9fSgpLHRyYW5zbGF0ZU9uQXhpczpmdW5jdGlvbigpe3ZhciBiPW5ldyBnO3JldHVybiBmdW5jdGlvbihlLGgpe2IuY29weShlKS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKTt0aGlzLnBvc2l0aW9uLmFkZChiLm11bHRpcGx5U2NhbGFyKGgpKTsKcmV0dXJuIHRoaXN9fSgpLHRyYW5zbGF0ZVg6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZygxLDAsMCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhiLGUpfX0oKSx0cmFuc2xhdGVZOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGcoMCwxLDApO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoYixlKX19KCksdHJhbnNsYXRlWjpmdW5jdGlvbigpe3ZhciBiPW5ldyBnKDAsMCwxKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGIsZSl9fSgpLGxvY2FsVG9Xb3JsZDpmdW5jdGlvbihiKXtyZXR1cm4gYi5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9LHdvcmxkVG9Mb2NhbDpmdW5jdGlvbigpe3ZhciBiPW5ldyBDO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBseU1hdHJpeDQoYi5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpKX19KCksbG9va0F0OmZ1bmN0aW9uKCl7dmFyIGI9Cm5ldyBmLGU9bmV3IEMsaD1uZXcgZyxuPW5ldyBnO3JldHVybiBmdW5jdGlvbih1LHcseil7dS5pc1ZlY3RvcjM/aC5jb3B5KHUpOmguc2V0KHUsdyx6KTt1PXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO3RoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9lLmxvb2tBdChuLGgsdGhpcy51cCk6ZS5sb29rQXQoaCxuLHRoaXMudXApO3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoZSk7dSYmKGUuZXh0cmFjdFJvdGF0aW9uKHUubWF0cml4V29ybGQpLGIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShiLmludmVyc2UoKSkpfX0oKSxhZGQ6ZnVuY3Rpb24oYil7aWYoMTxhcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRoaXMuYWRkKGFyZ3VtZW50c1tlXSk7cmV0dXJuIHRoaXN9aWYoYj09PQp0aGlzKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLGIpLHRoaXM7YiYmYi5pc09iamVjdDNEPyhudWxsIT09Yi5wYXJlbnQmJmIucGFyZW50LnJlbW92ZShiKSxiLnBhcmVudD10aGlzLGIuZGlzcGF0Y2hFdmVudCh7dHlwZToiYWRkZWQifSksdGhpcy5jaGlsZHJlbi5wdXNoKGIpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIixiKTtyZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGIpe2lmKDE8YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLnJlbW92ZShhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfWU9dGhpcy5jaGlsZHJlbi5pbmRleE9mKGIpOy0xIT09ZSYmKGIucGFyZW50PW51bGwsYi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJyZW1vdmVkIn0pLAp0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0QnlJZDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsYil9LGdldE9iamVjdEJ5TmFtZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIixiKX0sZ2V0T2JqZWN0QnlQcm9wZXJ0eTpmdW5jdGlvbihiLGUpe2lmKHRoaXNbYl09PT1lKXJldHVybiB0aGlzO2Zvcih2YXIgaD0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7aDxuO2grKyl7dmFyIHU9dGhpcy5jaGlsZHJlbltoXS5nZXRPYmplY3RCeVByb3BlcnR5KGIsZSk7aWYodm9pZCAwIT09dSlyZXR1cm4gdX19LGdldFdvcmxkUG9zaXRpb246ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFBvc2l0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApOwpyZXR1cm4gYi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9LGdldFdvcmxkUXVhdGVybmlvbjpmdW5jdGlvbigpe3ZhciBiPW5ldyBnLGU9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKGgpe3ZvaWQgMD09PWgmJihjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRRdWF0ZXJuaW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGg9bmV3IGYpO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3RoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGIsaCxlKTtyZXR1cm4gaH19KCksZ2V0V29ybGRTY2FsZTpmdW5jdGlvbigpe3ZhciBiPW5ldyBnLGU9bmV3IGY7cmV0dXJuIGZ1bmN0aW9uKGgpe3ZvaWQgMD09PWgmJihjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRTY2FsZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxoPW5ldyBnKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShiLAplLGgpO3JldHVybiBofX0oKSxnZXRXb3JsZERpcmVjdGlvbjpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGIuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9LHJheWNhc3Q6ZnVuY3Rpb24oKXt9LHRyYXZlcnNlOmZ1bmN0aW9uKGIpe2IodGhpcyk7Zm9yKHZhciBlPXRoaXMuY2hpbGRyZW4saD0wLG49ZS5sZW5ndGg7aDxuO2grKyllW2hdLnRyYXZlcnNlKGIpfSx0cmF2ZXJzZVZpc2libGU6ZnVuY3Rpb24oYil7aWYoITEhPT10aGlzLnZpc2libGUpe2IodGhpcyk7Zm9yKHZhciBlPXRoaXMuY2hpbGRyZW4saD0wLG49ZS5sZW5ndGg7aDxuO2grKyllW2hdLnRyYXZlcnNlVmlzaWJsZShiKX19LHRyYXZlcnNlQW5jZXN0b3JzOmZ1bmN0aW9uKGIpe3ZhciBlPQp0aGlzLnBhcmVudDtudWxsIT09ZSYmKGIoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyhiKSl9LHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSk7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihiKXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7aWYodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHxiKW51bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLGI9ITA7Zm9yKHZhciBlPXRoaXMuY2hpbGRyZW4saD0wLG49ZS5sZW5ndGg7aDxuO2grKyllW2hdLnVwZGF0ZU1hdHJpeFdvcmxkKGIpfSwKdXBkYXRlV29ybGRNYXRyaXg6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLnBhcmVudDshMD09PWImJm51bGwhPT1oJiZoLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7bnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KTtpZighMD09PWUpZm9yKGI9dGhpcy5jaGlsZHJlbixlPTAsaD1iLmxlbmd0aDtlPGg7ZSsrKWJbZV0udXBkYXRlV29ybGRNYXRyaXgoITEsITApfSx0b0pTT046ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZShPLFEpe3ZvaWQgMD09PU9bUS51dWlkXSYmKE9bUS51dWlkXT1RLnRvSlNPTihiKSk7cmV0dXJuIFEudXVpZH1mdW5jdGlvbiBoKE8pe3ZhciBRPVtdLFI7Zm9yKFIgaW4gTyl7dmFyIFU9T1tSXTtkZWxldGUgVS5tZXRhZGF0YTsKUS5wdXNoKFUpfXJldHVybiBRfXZhciBuPXZvaWQgMD09PWJ8fCJzdHJpbmciPT09dHlwZW9mIGIsdT17fTtuJiYoYj17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fX0sdS5tZXRhZGF0YT17dmVyc2lvbjo0LjUsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTt2YXIgdz17fTt3LnV1aWQ9dGhpcy51dWlkO3cudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJih3Lm5hbWU9dGhpcy5uYW1lKTshMD09PXRoaXMuY2FzdFNoYWRvdyYmKHcuY2FzdFNoYWRvdz0hMCk7ITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJih3LnJlY2VpdmVTaGFkb3c9ITApOyExPT09dGhpcy52aXNpYmxlJiYody52aXNpYmxlPSExKTshMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHcuZnJ1c3R1bUN1bGxlZD0hMSk7MCE9PXRoaXMucmVuZGVyT3JkZXImJih3LnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpOyJ7fSIhPT0KSlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJih3LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO3cubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2s7dy5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpOyExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYody5tYXRyaXhBdXRvVXBkYXRlPSExKTt0aGlzLmlzTWVzaCYmMCE9PXRoaXMuZHJhd01vZGUmJih3LmRyYXdNb2RlPXRoaXMuZHJhd01vZGUpO2lmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7dy5nZW9tZXRyeT1lKGIuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTt2YXIgej10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09eiYmdm9pZCAwIT09ei5zaGFwZXMpaWYoej16LnNoYXBlcyxBcnJheS5pc0FycmF5KHopKWZvcih2YXIgRT0wLEg9ei5sZW5ndGg7RTxIO0UrKyllKGIuc2hhcGVzLHpbRV0pO2Vsc2UgZShiLnNoYXBlcyx6KX1pZih2b2lkIDAhPT10aGlzLm1hdGVyaWFsKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe3o9CltdO0U9MDtmb3IoSD10aGlzLm1hdGVyaWFsLmxlbmd0aDtFPEg7RSsrKXoucHVzaChlKGIubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbRV0pKTt3Lm1hdGVyaWFsPXp9ZWxzZSB3Lm1hdGVyaWFsPWUoYi5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYoMDx0aGlzLmNoaWxkcmVuLmxlbmd0aClmb3Iody5jaGlsZHJlbj1bXSxFPTA7RTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtFKyspdy5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bRV0udG9KU09OKGIpLm9iamVjdCk7aWYobil7bj1oKGIuZ2VvbWV0cmllcyk7RT1oKGIubWF0ZXJpYWxzKTtIPWgoYi50ZXh0dXJlcyk7dmFyIEk9aChiLmltYWdlcyk7ej1oKGIuc2hhcGVzKTswPG4ubGVuZ3RoJiYodS5nZW9tZXRyaWVzPW4pOzA8RS5sZW5ndGgmJih1Lm1hdGVyaWFscz1FKTswPEgubGVuZ3RoJiYodS50ZXh0dXJlcz1IKTswPEkubGVuZ3RoJiYodS5pbWFnZXM9SSk7MDx6Lmxlbmd0aCYmKHUuc2hhcGVzPXopfXUub2JqZWN0PXc7cmV0dXJuIHV9LApjbG9uZTpmdW5jdGlvbihiKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyxiKX0sY29weTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPSEwKTt0aGlzLm5hbWU9Yi5uYW1lO3RoaXMudXAuY29weShiLnVwKTt0aGlzLnBvc2l0aW9uLmNvcHkoYi5wb3NpdGlvbik7dGhpcy5xdWF0ZXJuaW9uLmNvcHkoYi5xdWF0ZXJuaW9uKTt0aGlzLnNjYWxlLmNvcHkoYi5zY2FsZSk7dGhpcy5tYXRyaXguY29weShiLm1hdHJpeCk7dGhpcy5tYXRyaXhXb3JsZC5jb3B5KGIubWF0cml4V29ybGQpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1iLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPWIubWF0cml4V29ybGROZWVkc1VwZGF0ZTt0aGlzLmxheWVycy5tYXNrPWIubGF5ZXJzLm1hc2s7dGhpcy52aXNpYmxlPWIudmlzaWJsZTt0aGlzLmNhc3RTaGFkb3c9Yi5jYXN0U2hhZG93O3RoaXMucmVjZWl2ZVNoYWRvdz1iLnJlY2VpdmVTaGFkb3c7CnRoaXMuZnJ1c3R1bUN1bGxlZD1iLmZydXN0dW1DdWxsZWQ7dGhpcy5yZW5kZXJPcmRlcj1iLnJlbmRlck9yZGVyO3RoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShiLnVzZXJEYXRhKSk7aWYoITA9PT1lKWZvcihlPTA7ZTxiLmNoaWxkcmVuLmxlbmd0aDtlKyspdGhpcy5hZGQoYi5jaGlsZHJlbltlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt2YXIgTW49MDtOLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpOLGlzR2VvbWV0cnk6ITAsYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPShuZXcgbCkuZ2V0Tm9ybWFsTWF0cml4KGIpLGg9MCxuPXRoaXMudmVydGljZXMubGVuZ3RoO2g8bjtoKyspdGhpcy52ZXJ0aWNlc1toXS5hcHBseU1hdHJpeDQoYik7aD0wO2ZvcihuPXRoaXMuZmFjZXMubGVuZ3RoO2g8bjtoKyspe2I9dGhpcy5mYWNlc1toXTtiLm5vcm1hbC5hcHBseU1hdHJpeDMoZSkubm9ybWFsaXplKCk7CmZvcih2YXIgdT0wLHc9Yi52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDt1PHc7dSsrKWIudmVydGV4Tm9ybWFsc1t1XS5hcHBseU1hdHJpeDMoZSkubm9ybWFsaXplKCl9bnVsbCE9PXRoaXMuYm91bmRpbmdCb3gmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7bnVsbCE9PXRoaXMuYm91bmRpbmdTcGhlcmUmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMDtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbigpe3ZhciBiPW5ldyBDO3JldHVybiBmdW5jdGlvbihlKXtiLm1ha2VSb3RhdGlvblgoZSk7dGhpcy5hcHBseU1hdHJpeChiKTtyZXR1cm4gdGhpc319KCkscm90YXRlWTpmdW5jdGlvbigpe3ZhciBiPW5ldyBDO3JldHVybiBmdW5jdGlvbihlKXtiLm1ha2VSb3RhdGlvblkoZSk7dGhpcy5hcHBseU1hdHJpeChiKTtyZXR1cm4gdGhpc319KCkscm90YXRlWjpmdW5jdGlvbigpe3ZhciBiPW5ldyBDOwpyZXR1cm4gZnVuY3Rpb24oZSl7Yi5tYWtlUm90YXRpb25aKGUpO3RoaXMuYXBwbHlNYXRyaXgoYik7cmV0dXJuIHRoaXN9fSgpLHRyYW5zbGF0ZTpmdW5jdGlvbigpe3ZhciBiPW5ldyBDO3JldHVybiBmdW5jdGlvbihlLGgsbil7Yi5tYWtlVHJhbnNsYXRpb24oZSxoLG4pO3RoaXMuYXBwbHlNYXRyaXgoYik7cmV0dXJuIHRoaXN9fSgpLHNjYWxlOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IEM7cmV0dXJuIGZ1bmN0aW9uKGUsaCxuKXtiLm1ha2VTY2FsZShlLGgsbik7dGhpcy5hcHBseU1hdHJpeChiKTtyZXR1cm4gdGhpc319KCksbG9va0F0OmZ1bmN0aW9uKCl7dmFyIGI9bmV3IFM7cmV0dXJuIGZ1bmN0aW9uKGUpe2IubG9va0F0KGUpO2IudXBkYXRlTWF0cml4KCk7dGhpcy5hcHBseU1hdHJpeChiLm1hdHJpeCl9fSgpLGZyb21CdWZmZXJHZW9tZXRyeTpmdW5jdGlvbihiKXtmdW5jdGlvbiBlKFcsWixmYSxxYSl7dmFyIHJhPXZvaWQgMD09PUU/W106W2guY29sb3JzW1ddLmNsb25lKCksCmguY29sb3JzW1pdLmNsb25lKCksaC5jb2xvcnNbZmFdLmNsb25lKCldLGlhPXZvaWQgMD09PXo/W106WyhuZXcgZykuZnJvbUFycmF5KHosMypXKSwobmV3IGcpLmZyb21BcnJheSh6LDMqWiksKG5ldyBnKS5mcm9tQXJyYXkoeiwzKmZhKV07cWE9bmV3IEwoVyxaLGZhLGlhLHJhLHFhKTtoLmZhY2VzLnB1c2gocWEpO3ZvaWQgMCE9PUgmJmguZmFjZVZlcnRleFV2c1swXS5wdXNoKFsobmV3IGQpLmZyb21BcnJheShILDIqVyksKG5ldyBkKS5mcm9tQXJyYXkoSCwyKlopLChuZXcgZCkuZnJvbUFycmF5KEgsMipmYSldKTt2b2lkIDAhPT1JJiZoLmZhY2VWZXJ0ZXhVdnNbMV0ucHVzaChbKG5ldyBkKS5mcm9tQXJyYXkoSSwyKlcpLChuZXcgZCkuZnJvbUFycmF5KEksMipaKSwobmV3IGQpLmZyb21BcnJheShJLDIqZmEpXSl9dmFyIGg9dGhpcyxuPW51bGwhPT1iLmluZGV4P2IuaW5kZXguYXJyYXk6dm9pZCAwLHU9Yi5hdHRyaWJ1dGVzLHc9dS5wb3NpdGlvbi5hcnJheSx6PXZvaWQgMCE9PQp1Lm5vcm1hbD91Lm5vcm1hbC5hcnJheTp2b2lkIDAsRT12b2lkIDAhPT11LmNvbG9yP3UuY29sb3IuYXJyYXk6dm9pZCAwLEg9dm9pZCAwIT09dS51dj91LnV2LmFycmF5OnZvaWQgMCxJPXZvaWQgMCE9PXUudXYyP3UudXYyLmFycmF5OnZvaWQgMDt2b2lkIDAhPT1JJiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPVtdKTtmb3IodmFyIE89dT0wO3U8dy5sZW5ndGg7dSs9MyxPKz0yKWgudmVydGljZXMucHVzaCgobmV3IGcpLmZyb21BcnJheSh3LHUpKSx2b2lkIDAhPT1FJiZoLmNvbG9ycy5wdXNoKChuZXcgQikuZnJvbUFycmF5KEUsdSkpO3ZhciBRPWIuZ3JvdXBzO2lmKDA8US5sZW5ndGgpZm9yKHU9MDt1PFEubGVuZ3RoO3UrKyl7dz1RW3VdO3ZhciBSPXcuc3RhcnQsVT13LmNvdW50O089Ujtmb3IoUis9VTtPPFI7Tys9Myl2b2lkIDAhPT1uP2UobltPXSxuW08rMV0sbltPKzJdLHcubWF0ZXJpYWxJbmRleCk6ZShPLE8rMSxPKzIsdy5tYXRlcmlhbEluZGV4KX1lbHNlIGlmKHZvaWQgMCE9PQpuKWZvcih1PTA7dTxuLmxlbmd0aDt1Kz0zKWUoblt1XSxuW3UrMV0sblt1KzJdKTtlbHNlIGZvcih1PTA7dTx3Lmxlbmd0aC8zO3UrPTMpZSh1LHUrMSx1KzIpO3RoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7bnVsbCE9PWIuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWIuYm91bmRpbmdCb3guY2xvbmUoKSk7bnVsbCE9PWIuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWIuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3ZhciBiPW5ldyBnO3JldHVybiBmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoYikubmVnYXRlKCk7dGhpcy50cmFuc2xhdGUoYi54LGIueSxiLnopO3JldHVybiB0aGlzfX0oKSxub3JtYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3ZhciBiPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyLAplPXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzO2U9MD09PWU/MToxL2U7dmFyIGg9bmV3IEM7aC5zZXQoZSwwLDAsLWUqYi54LDAsZSwwLC1lKmIueSwwLDAsZSwtZSpiLnosMCwwLDAsMSk7dGhpcy5hcHBseU1hdHJpeChoKTtyZXR1cm4gdGhpc30sY29tcHV0ZUZhY2VOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPW5ldyBnLGU9bmV3IGcsaD0wLG49dGhpcy5mYWNlcy5sZW5ndGg7aDxuO2grKyl7dmFyIHU9dGhpcy5mYWNlc1toXSx3PXRoaXMudmVydGljZXNbdS5hXSx6PXRoaXMudmVydGljZXNbdS5iXTtiLnN1YlZlY3RvcnModGhpcy52ZXJ0aWNlc1t1LmNdLHopO2Uuc3ViVmVjdG9ycyh3LHopO2IuY3Jvc3MoZSk7Yi5ub3JtYWxpemUoKTt1Lm5vcm1hbC5jb3B5KGIpfX0sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGI9ITApO3ZhciBlO3ZhciBoPUFycmF5KHRoaXMudmVydGljZXMubGVuZ3RoKTt2YXIgbj0wO2ZvcihlPXRoaXMudmVydGljZXMubGVuZ3RoO248CmU7bisrKWhbbl09bmV3IGc7aWYoYil7dmFyIHU9bmV3IGcsdz1uZXcgZztiPTA7Zm9yKG49dGhpcy5mYWNlcy5sZW5ndGg7YjxuO2IrKyl7ZT10aGlzLmZhY2VzW2JdO3ZhciB6PXRoaXMudmVydGljZXNbZS5hXTt2YXIgRT10aGlzLnZlcnRpY2VzW2UuYl07dmFyIEg9dGhpcy52ZXJ0aWNlc1tlLmNdO3Uuc3ViVmVjdG9ycyhILEUpO3cuc3ViVmVjdG9ycyh6LEUpO3UuY3Jvc3Modyk7aFtlLmFdLmFkZCh1KTtoW2UuYl0uYWRkKHUpO2hbZS5jXS5hZGQodSl9fWVsc2UgZm9yKHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCksYj0wLG49dGhpcy5mYWNlcy5sZW5ndGg7YjxuO2IrKyllPXRoaXMuZmFjZXNbYl0saFtlLmFdLmFkZChlLm5vcm1hbCksaFtlLmJdLmFkZChlLm5vcm1hbCksaFtlLmNdLmFkZChlLm5vcm1hbCk7bj0wO2ZvcihlPXRoaXMudmVydGljZXMubGVuZ3RoO248ZTtuKyspaFtuXS5ub3JtYWxpemUoKTtiPTA7Zm9yKG49dGhpcy5mYWNlcy5sZW5ndGg7YjxuO2IrKyllPQp0aGlzLmZhY2VzW2JdLHo9ZS52ZXJ0ZXhOb3JtYWxzLDM9PT16Lmxlbmd0aD8oelswXS5jb3B5KGhbZS5hXSkselsxXS5jb3B5KGhbZS5iXSkselsyXS5jb3B5KGhbZS5jXSkpOih6WzBdPWhbZS5hXS5jbG9uZSgpLHpbMV09aFtlLmJdLmNsb25lKCkselsyXT1oW2UuY10uY2xvbmUoKSk7MDx0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlRmxhdFZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYjt0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO3ZhciBlPTA7Zm9yKGI9dGhpcy5mYWNlcy5sZW5ndGg7ZTxiO2UrKyl7dmFyIGg9dGhpcy5mYWNlc1tlXTt2YXIgbj1oLnZlcnRleE5vcm1hbHM7Mz09PW4ubGVuZ3RoPyhuWzBdLmNvcHkoaC5ub3JtYWwpLG5bMV0uY29weShoLm5vcm1hbCksblsyXS5jb3B5KGgubm9ybWFsKSk6KG5bMF09aC5ub3JtYWwuY2xvbmUoKSxuWzFdPWgubm9ybWFsLmNsb25lKCksblsyXT1oLm5vcm1hbC5jbG9uZSgpKX0wPAp0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlTW9ycGhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGIsZTt2YXIgaD0wO2ZvcihlPXRoaXMuZmFjZXMubGVuZ3RoO2g8ZTtoKyspe3ZhciBuPXRoaXMuZmFjZXNbaF07bi5fX29yaWdpbmFsRmFjZU5vcm1hbD9uLl9fb3JpZ2luYWxGYWNlTm9ybWFsLmNvcHkobi5ub3JtYWwpOm4uX19vcmlnaW5hbEZhY2VOb3JtYWw9bi5ub3JtYWwuY2xvbmUoKTtuLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzfHwobi5fX29yaWdpbmFsVmVydGV4Tm9ybWFscz1bXSk7dmFyIHU9MDtmb3IoYj1uLnZlcnRleE5vcm1hbHMubGVuZ3RoO3U8Yjt1Kyspbi5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1t1XT9uLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3VdLmNvcHkobi52ZXJ0ZXhOb3JtYWxzW3VdKTpuLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3VdPW4udmVydGV4Tm9ybWFsc1t1XS5jbG9uZSgpfXZhciB3PW5ldyBOOwp3LmZhY2VzPXRoaXMuZmFjZXM7dT0wO2ZvcihiPXRoaXMubW9ycGhUYXJnZXRzLmxlbmd0aDt1PGI7dSsrKXtpZighdGhpcy5tb3JwaE5vcm1hbHNbdV0pe3RoaXMubW9ycGhOb3JtYWxzW3VdPXt9O3RoaXMubW9ycGhOb3JtYWxzW3VdLmZhY2VOb3JtYWxzPVtdO3RoaXMubW9ycGhOb3JtYWxzW3VdLnZlcnRleE5vcm1hbHM9W107bj10aGlzLm1vcnBoTm9ybWFsc1t1XS5mYWNlTm9ybWFsczt2YXIgej10aGlzLm1vcnBoTm9ybWFsc1t1XS52ZXJ0ZXhOb3JtYWxzO2g9MDtmb3IoZT10aGlzLmZhY2VzLmxlbmd0aDtoPGU7aCsrKXt2YXIgRT1uZXcgZzt2YXIgSD17YTpuZXcgZyxiOm5ldyBnLGM6bmV3IGd9O24ucHVzaChFKTt6LnB1c2goSCl9fXo9dGhpcy5tb3JwaE5vcm1hbHNbdV07dy52ZXJ0aWNlcz10aGlzLm1vcnBoVGFyZ2V0c1t1XS52ZXJ0aWNlczt3LmNvbXB1dGVGYWNlTm9ybWFscygpO3cuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtoPTA7Zm9yKGU9dGhpcy5mYWNlcy5sZW5ndGg7aDwKZTtoKyspbj10aGlzLmZhY2VzW2hdLEU9ei5mYWNlTm9ybWFsc1toXSxIPXoudmVydGV4Tm9ybWFsc1toXSxFLmNvcHkobi5ub3JtYWwpLEguYS5jb3B5KG4udmVydGV4Tm9ybWFsc1swXSksSC5iLmNvcHkobi52ZXJ0ZXhOb3JtYWxzWzFdKSxILmMuY29weShuLnZlcnRleE5vcm1hbHNbMl0pfWg9MDtmb3IoZT10aGlzLmZhY2VzLmxlbmd0aDtoPGU7aCsrKW49dGhpcy5mYWNlc1toXSxuLm5vcm1hbD1uLl9fb3JpZ2luYWxGYWNlTm9ybWFsLG4udmVydGV4Tm9ybWFscz1uLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzfSxjb21wdXRlQm91bmRpbmdCb3g6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IHYpO3RoaXMuYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyh0aGlzLnZlcnRpY2VzKX0sY29tcHV0ZUJvdW5kaW5nU3BoZXJlOmZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPQpuZXcgQSk7dGhpcy5ib3VuZGluZ1NwaGVyZS5zZXRGcm9tUG9pbnRzKHRoaXMudmVydGljZXMpfSxtZXJnZTpmdW5jdGlvbihiLGUsaCl7aWYoYiYmYi5pc0dlb21ldHJ5KXt2YXIgbix1PXRoaXMudmVydGljZXMubGVuZ3RoLHc9dGhpcy52ZXJ0aWNlcyx6PWIudmVydGljZXMsRT10aGlzLmZhY2VzLEg9Yi5mYWNlcyxJPXRoaXMuZmFjZVZlcnRleFV2c1swXSxPPWIuZmFjZVZlcnRleFV2c1swXSxRPXRoaXMuY29sb3JzLFI9Yi5jb2xvcnM7dm9pZCAwPT09aCYmKGg9MCk7dm9pZCAwIT09ZSYmKG49KG5ldyBsKS5nZXROb3JtYWxNYXRyaXgoZSkpO2I9MDtmb3IodmFyIFU9ei5sZW5ndGg7YjxVO2IrKyl7dmFyIFc9eltiXS5jbG9uZSgpO3ZvaWQgMCE9PWUmJlcuYXBwbHlNYXRyaXg0KGUpO3cucHVzaChXKX1iPTA7Zm9yKFU9Ui5sZW5ndGg7YjxVO2IrKylRLnB1c2goUltiXS5jbG9uZSgpKTtiPTA7Zm9yKFU9SC5sZW5ndGg7YjxVO2IrKyl7ej1IW2JdO3ZhciBaPXoudmVydGV4Tm9ybWFsczsKUj16LnZlcnRleENvbG9ycztRPW5ldyBMKHouYSt1LHouYit1LHouYyt1KTtRLm5vcm1hbC5jb3B5KHoubm9ybWFsKTt2b2lkIDAhPT1uJiZRLm5vcm1hbC5hcHBseU1hdHJpeDMobikubm9ybWFsaXplKCk7ZT0wO2Zvcih3PVoubGVuZ3RoO2U8dztlKyspVz1aW2VdLmNsb25lKCksdm9pZCAwIT09biYmVy5hcHBseU1hdHJpeDMobikubm9ybWFsaXplKCksUS52ZXJ0ZXhOb3JtYWxzLnB1c2goVyk7US5jb2xvci5jb3B5KHouY29sb3IpO2U9MDtmb3Iodz1SLmxlbmd0aDtlPHc7ZSsrKVc9UltlXSxRLnZlcnRleENvbG9ycy5wdXNoKFcuY2xvbmUoKSk7US5tYXRlcmlhbEluZGV4PXoubWF0ZXJpYWxJbmRleCtoO0UucHVzaChRKX1iPTA7Zm9yKFU9Ty5sZW5ndGg7YjxVO2IrKylpZihoPU9bYl0sbj1bXSx2b2lkIDAhPT1oKXtlPTA7Zm9yKHc9aC5sZW5ndGg7ZTx3O2UrKyluLnB1c2goaFtlXS5jbG9uZSgpKTtJLnB1c2gobil9fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkdlb21ldHJ5LiIsCmIpfSxtZXJnZU1lc2g6ZnVuY3Rpb24oYil7YiYmYi5pc01lc2g/KGIubWF0cml4QXV0b1VwZGF0ZSYmYi51cGRhdGVNYXRyaXgoKSx0aGlzLm1lcmdlKGIuZ2VvbWV0cnksYi5tYXRyaXgpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4iLGIpfSxtZXJnZVZlcnRpY2VzOmZ1bmN0aW9uKCl7dmFyIGI9e30sZT1bXSxoPVtdLG49TWF0aC5wb3coMTAsNCksdTt2YXIgdz0wO2Zvcih1PXRoaXMudmVydGljZXMubGVuZ3RoO3c8dTt3Kyspe3ZhciB6PXRoaXMudmVydGljZXNbd107ej1NYXRoLnJvdW5kKHoueCpuKSsiXyIrTWF0aC5yb3VuZCh6LnkqbikrIl8iK01hdGgucm91bmQoei56Km4pO3ZvaWQgMD09PWJbel0/KGJbel09dyxlLnB1c2godGhpcy52ZXJ0aWNlc1t3XSksaFt3XT1lLmxlbmd0aC0xKTpoW3ddPWhbYlt6XV19Yj1bXTt3PTA7Zm9yKHU9dGhpcy5mYWNlcy5sZW5ndGg7dzx1O3crKylmb3Iobj0KdGhpcy5mYWNlc1t3XSxuLmE9aFtuLmFdLG4uYj1oW24uYl0sbi5jPWhbbi5jXSxuPVtuLmEsbi5iLG4uY10sej0wOzM+ejt6KyspaWYoblt6XT09PW5bKHorMSklM10pe2IucHVzaCh3KTticmVha31mb3Iodz1iLmxlbmd0aC0xOzA8PXc7dy0tKWZvcihuPWJbd10sdGhpcy5mYWNlcy5zcGxpY2UobiwxKSxoPTAsdT10aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO2g8dTtoKyspdGhpcy5mYWNlVmVydGV4VXZzW2hdLnNwbGljZShuLDEpO3c9dGhpcy52ZXJ0aWNlcy5sZW5ndGgtZS5sZW5ndGg7dGhpcy52ZXJ0aWNlcz1lO3JldHVybiB3fSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGIpe3RoaXMudmVydGljZXM9W107Zm9yKHZhciBlPTAsaD1iLmxlbmd0aDtlPGg7ZSsrKXt2YXIgbj1iW2VdO3RoaXMudmVydGljZXMucHVzaChuZXcgZyhuLngsbi55LG4uenx8MCkpfXJldHVybiB0aGlzfSxzb3J0RmFjZXNCeU1hdGVyaWFsSW5kZXg6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5mYWNlcywKZT1iLmxlbmd0aCxoPTA7aDxlO2grKyliW2hdLl9pZD1oO2Iuc29ydChmdW5jdGlvbihILEkpe3JldHVybiBILm1hdGVyaWFsSW5kZXgtSS5tYXRlcmlhbEluZGV4fSk7dmFyIG49dGhpcy5mYWNlVmVydGV4VXZzWzBdLHU9dGhpcy5mYWNlVmVydGV4VXZzWzFdLHcsejtuJiZuLmxlbmd0aD09PWUmJih3PVtdKTt1JiZ1Lmxlbmd0aD09PWUmJih6PVtdKTtmb3IoaD0wO2g8ZTtoKyspe3ZhciBFPWJbaF0uX2lkO3cmJncucHVzaChuW0VdKTt6JiZ6LnB1c2godVtFXSl9dyYmKHRoaXMuZmFjZVZlcnRleFV2c1swXT13KTt6JiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPXopfSx0b0pTT046ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKG5hLHZhLEJhKXtyZXR1cm4gQmE/bmF8MTw8dmE6bmEmfigxPDx2YSl9ZnVuY3Rpb24gZShuYSl7dmFyIHZhPW5hLngudG9TdHJpbmcoKStuYS55LnRvU3RyaW5nKCkrbmEuei50b1N0cmluZygpO2lmKHZvaWQgMCE9PUlbdmFdKXJldHVybiBJW3ZhXTtJW3ZhXT1ILmxlbmd0aC8KMztILnB1c2gobmEueCxuYS55LG5hLnopO3JldHVybiBJW3ZhXX1mdW5jdGlvbiBoKG5hKXt2YXIgdmE9bmEuci50b1N0cmluZygpK25hLmcudG9TdHJpbmcoKStuYS5iLnRvU3RyaW5nKCk7aWYodm9pZCAwIT09UVt2YV0pcmV0dXJuIFFbdmFdO1FbdmFdPU8ubGVuZ3RoO08ucHVzaChuYS5nZXRIZXgoKSk7cmV0dXJuIFFbdmFdfWZ1bmN0aW9uIG4obmEpe3ZhciB2YT1uYS54LnRvU3RyaW5nKCkrbmEueS50b1N0cmluZygpO2lmKHZvaWQgMCE9PVVbdmFdKXJldHVybiBVW3ZhXTtVW3ZhXT1SLmxlbmd0aC8yO1IucHVzaChuYS54LG5hLnkpO3JldHVybiBVW3ZhXX12YXIgdT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ikdlb21ldHJ5IixnZW5lcmF0b3I6Ikdlb21ldHJ5LnRvSlNPTiJ9fTt1LnV1aWQ9dGhpcy51dWlkO3UudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJih1Lm5hbWU9dGhpcy5uYW1lKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciB3PXRoaXMucGFyYW1ldGVycywKejtmb3IoeiBpbiB3KXZvaWQgMCE9PXdbel0mJih1W3pdPXdbel0pO3JldHVybiB1fXc9W107Zm9yKHo9MDt6PHRoaXMudmVydGljZXMubGVuZ3RoO3orKyl7dmFyIEU9dGhpcy52ZXJ0aWNlc1t6XTt3LnB1c2goRS54LEUueSxFLnopfUU9W107dmFyIEg9W10sST17fSxPPVtdLFE9e30sUj1bXSxVPXt9O2Zvcih6PTA7ejx0aGlzLmZhY2VzLmxlbmd0aDt6Kyspe3ZhciBXPXRoaXMuZmFjZXNbel0sWj12b2lkIDAhPT10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sZmE9MDxXLm5vcm1hbC5sZW5ndGgoKSxxYT0wPFcudmVydGV4Tm9ybWFscy5sZW5ndGgscmE9MSE9PVcuY29sb3Iucnx8MSE9PVcuY29sb3IuZ3x8MSE9PVcuY29sb3IuYixpYT0wPFcudmVydGV4Q29sb3JzLmxlbmd0aCx0YT0wO3RhPWIodGEsMCwwKTt0YT1iKHRhLDEsITApO3RhPWIodGEsMiwhMSk7dGE9Yih0YSwzLFopO3RhPWIodGEsNCxmYSk7dGE9Yih0YSw1LHFhKTt0YT1iKHRhLDYscmEpO3RhPWIodGEsNyxpYSk7CkUucHVzaCh0YSk7RS5wdXNoKFcuYSxXLmIsVy5jKTtFLnB1c2goVy5tYXRlcmlhbEluZGV4KTtaJiYoWj10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sRS5wdXNoKG4oWlswXSksbihaWzFdKSxuKFpbMl0pKSk7ZmEmJkUucHVzaChlKFcubm9ybWFsKSk7cWEmJihmYT1XLnZlcnRleE5vcm1hbHMsRS5wdXNoKGUoZmFbMF0pLGUoZmFbMV0pLGUoZmFbMl0pKSk7cmEmJkUucHVzaChoKFcuY29sb3IpKTtpYSYmKFc9Vy52ZXJ0ZXhDb2xvcnMsRS5wdXNoKGgoV1swXSksaChXWzFdKSxoKFdbMl0pKSl9dS5kYXRhPXt9O3UuZGF0YS52ZXJ0aWNlcz13O3UuZGF0YS5ub3JtYWxzPUg7MDxPLmxlbmd0aCYmKHUuZGF0YS5jb2xvcnM9Tyk7MDxSLmxlbmd0aCYmKHUuZGF0YS51dnM9W1JdKTt1LmRhdGEuZmFjZXM9RTtyZXR1cm4gdX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IE4pLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGUsaCxuO3RoaXMudmVydGljZXM9W107dGhpcy5jb2xvcnM9CltdO3RoaXMuZmFjZXM9W107dGhpcy5mYWNlVmVydGV4VXZzPVtbXV07dGhpcy5tb3JwaFRhcmdldHM9W107dGhpcy5tb3JwaE5vcm1hbHM9W107dGhpcy5za2luV2VpZ2h0cz1bXTt0aGlzLnNraW5JbmRpY2VzPVtdO3RoaXMubGluZURpc3RhbmNlcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLm5hbWU9Yi5uYW1lO3ZhciB1PWIudmVydGljZXM7dmFyIHc9MDtmb3IoZT11Lmxlbmd0aDt3PGU7dysrKXRoaXMudmVydGljZXMucHVzaCh1W3ddLmNsb25lKCkpO3U9Yi5jb2xvcnM7dz0wO2ZvcihlPXUubGVuZ3RoO3c8ZTt3KyspdGhpcy5jb2xvcnMucHVzaCh1W3ddLmNsb25lKCkpO3U9Yi5mYWNlczt3PTA7Zm9yKGU9dS5sZW5ndGg7dzxlO3crKyl0aGlzLmZhY2VzLnB1c2godVt3XS5jbG9uZSgpKTt3PTA7Zm9yKGU9Yi5mYWNlVmVydGV4VXZzLmxlbmd0aDt3PGU7dysrKXt2YXIgej1iLmZhY2VWZXJ0ZXhVdnNbd107dm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW3ddJiYKKHRoaXMuZmFjZVZlcnRleFV2c1t3XT1bXSk7dT0wO2ZvcihoPXoubGVuZ3RoO3U8aDt1Kyspe3ZhciBFPXpbdV0sSD1bXTt2YXIgST0wO2ZvcihuPUUubGVuZ3RoO0k8bjtJKyspSC5wdXNoKEVbSV0uY2xvbmUoKSk7dGhpcy5mYWNlVmVydGV4VXZzW3ddLnB1c2goSCl9fUk9Yi5tb3JwaFRhcmdldHM7dz0wO2ZvcihlPUkubGVuZ3RoO3c8ZTt3Kyspe249e307bi5uYW1lPUlbd10ubmFtZTtpZih2b2lkIDAhPT1JW3ddLnZlcnRpY2VzKWZvcihuLnZlcnRpY2VzPVtdLHU9MCxoPUlbd10udmVydGljZXMubGVuZ3RoO3U8aDt1Kyspbi52ZXJ0aWNlcy5wdXNoKElbd10udmVydGljZXNbdV0uY2xvbmUoKSk7aWYodm9pZCAwIT09SVt3XS5ub3JtYWxzKWZvcihuLm5vcm1hbHM9W10sdT0wLGg9SVt3XS5ub3JtYWxzLmxlbmd0aDt1PGg7dSsrKW4ubm9ybWFscy5wdXNoKElbd10ubm9ybWFsc1t1XS5jbG9uZSgpKTt0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKG4pfUk9Yi5tb3JwaE5vcm1hbHM7Cnc9MDtmb3IoZT1JLmxlbmd0aDt3PGU7dysrKXtuPXt9O2lmKHZvaWQgMCE9PUlbd10udmVydGV4Tm9ybWFscylmb3Iobi52ZXJ0ZXhOb3JtYWxzPVtdLHU9MCxoPUlbd10udmVydGV4Tm9ybWFscy5sZW5ndGg7dTxoO3UrKyl6PUlbd10udmVydGV4Tm9ybWFsc1t1XSxFPXt9LEUuYT16LmEuY2xvbmUoKSxFLmI9ei5iLmNsb25lKCksRS5jPXouYy5jbG9uZSgpLG4udmVydGV4Tm9ybWFscy5wdXNoKEUpO2lmKHZvaWQgMCE9PUlbd10uZmFjZU5vcm1hbHMpZm9yKG4uZmFjZU5vcm1hbHM9W10sdT0wLGg9SVt3XS5mYWNlTm9ybWFscy5sZW5ndGg7dTxoO3UrKyluLmZhY2VOb3JtYWxzLnB1c2goSVt3XS5mYWNlTm9ybWFsc1t1XS5jbG9uZSgpKTt0aGlzLm1vcnBoTm9ybWFscy5wdXNoKG4pfXU9Yi5za2luV2VpZ2h0czt3PTA7Zm9yKGU9dS5sZW5ndGg7dzxlO3crKyl0aGlzLnNraW5XZWlnaHRzLnB1c2godVt3XS5jbG9uZSgpKTt1PWIuc2tpbkluZGljZXM7dz0wO2ZvcihlPXUubGVuZ3RoO3c8CmU7dysrKXRoaXMuc2tpbkluZGljZXMucHVzaCh1W3ddLmNsb25lKCkpO3U9Yi5saW5lRGlzdGFuY2VzO3c9MDtmb3IoZT11Lmxlbmd0aDt3PGU7dysrKXRoaXMubGluZURpc3RhbmNlcy5wdXNoKHVbd10pO3c9Yi5ib3VuZGluZ0JveDtudWxsIT09dyYmKHRoaXMuYm91bmRpbmdCb3g9dy5jbG9uZSgpKTt3PWIuYm91bmRpbmdTcGhlcmU7bnVsbCE9PXcmJih0aGlzLmJvdW5kaW5nU3BoZXJlPXcuY2xvbmUoKSk7dGhpcy5lbGVtZW50c05lZWRVcGRhdGU9Yi5lbGVtZW50c05lZWRVcGRhdGU7dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9Yi52ZXJ0aWNlc05lZWRVcGRhdGU7dGhpcy51dnNOZWVkVXBkYXRlPWIudXZzTmVlZFVwZGF0ZTt0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPWIubm9ybWFsc05lZWRVcGRhdGU7dGhpcy5jb2xvcnNOZWVkVXBkYXRlPWIuY29sb3JzTmVlZFVwZGF0ZTt0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPWIubGluZURpc3RhbmNlc05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPQpiLmdyb3Vwc05lZWRVcGRhdGU7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFQucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihiKXshMD09PWImJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oVC5wcm90b3R5cGUse2lzQnVmZmVyQXR0cmlidXRlOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGIpe2lmKEFycmF5LmlzQXJyYXkoYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmNvdW50PXZvaWQgMCE9PWI/Yi5sZW5ndGgvdGhpcy5pdGVtU2l6ZTowO3RoaXMuYXJyYXk9YjtyZXR1cm4gdGhpc30sc2V0RHluYW1pYzpmdW5jdGlvbihiKXt0aGlzLmR5bmFtaWM9YjtyZXR1cm4gdGhpc30sCmNvcHk6ZnVuY3Rpb24oYil7dGhpcy5uYW1lPWIubmFtZTt0aGlzLmFycmF5PW5ldyBiLmFycmF5LmNvbnN0cnVjdG9yKGIuYXJyYXkpO3RoaXMuaXRlbVNpemU9Yi5pdGVtU2l6ZTt0aGlzLmNvdW50PWIuY291bnQ7dGhpcy5ub3JtYWxpemVkPWIubm9ybWFsaXplZDt0aGlzLmR5bmFtaWM9Yi5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYixlLGgpe2IqPXRoaXMuaXRlbVNpemU7aCo9ZS5pdGVtU2l6ZTtmb3IodmFyIG49MCx1PXRoaXMuaXRlbVNpemU7bjx1O24rKyl0aGlzLmFycmF5W2Irbl09ZS5hcnJheVtoK25dO3JldHVybiB0aGlzfSxjb3B5QXJyYXk6ZnVuY3Rpb24oYil7dGhpcy5hcnJheS5zZXQoYik7cmV0dXJuIHRoaXN9LGNvcHlDb2xvcnNBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbj0wLHU9Yi5sZW5ndGg7bjx1O24rKyl7dmFyIHc9YltuXTt2b2lkIDA9PT13JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCk6IGNvbG9yIGlzIHVuZGVmaW5lZCIsCm4pLHc9bmV3IEIpO2VbaCsrXT13LnI7ZVtoKytdPXcuZztlW2grK109dy5ifXJldHVybiB0aGlzfSxjb3B5VmVjdG9yMnNBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbj0wLHU9Yi5sZW5ndGg7bjx1O24rKyl7dmFyIHc9YltuXTt2b2lkIDA9PT13JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsbiksdz1uZXcgZCk7ZVtoKytdPXcueDtlW2grK109dy55fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yM3NBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbj0wLHU9Yi5sZW5ndGg7bjx1O24rKyl7dmFyIHc9YltuXTt2b2lkIDA9PT13JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsbiksdz1uZXcgZyk7ZVtoKytdPXcueDtlW2grK109dy55OwplW2grK109dy56fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yNHNBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbj0wLHU9Yi5sZW5ndGg7bjx1O24rKyl7dmFyIHc9YltuXTt2b2lkIDA9PT13JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsbiksdz1uZXcgbSk7ZVtoKytdPXcueDtlW2grK109dy55O2VbaCsrXT13Lno7ZVtoKytdPXcud31yZXR1cm4gdGhpc30sc2V0OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy5hcnJheS5zZXQoYixlKTtyZXR1cm4gdGhpc30sZ2V0WDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hcnJheVtiKnRoaXMuaXRlbVNpemVdfSxzZXRYOmZ1bmN0aW9uKGIsZSl7dGhpcy5hcnJheVtiKnRoaXMuaXRlbVNpemVdPWU7cmV0dXJuIHRoaXN9LGdldFk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuYXJyYXlbYip0aGlzLml0ZW1TaXplKwoxXX0sc2V0WTpmdW5jdGlvbihiLGUpe3RoaXMuYXJyYXlbYip0aGlzLml0ZW1TaXplKzFdPWU7cmV0dXJuIHRoaXN9LGdldFo6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuYXJyYXlbYip0aGlzLml0ZW1TaXplKzJdfSxzZXRaOmZ1bmN0aW9uKGIsZSl7dGhpcy5hcnJheVtiKnRoaXMuaXRlbVNpemUrMl09ZTtyZXR1cm4gdGhpc30sZ2V0VzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hcnJheVtiKnRoaXMuaXRlbVNpemUrM119LHNldFc6ZnVuY3Rpb24oYixlKXt0aGlzLmFycmF5W2IqdGhpcy5pdGVtU2l6ZSszXT1lO3JldHVybiB0aGlzfSxzZXRYWTpmdW5jdGlvbihiLGUsaCl7Yio9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2IrMF09ZTt0aGlzLmFycmF5W2IrMV09aDtyZXR1cm4gdGhpc30sc2V0WFlaOmZ1bmN0aW9uKGIsZSxoLG4pe2IqPXRoaXMuaXRlbVNpemU7dGhpcy5hcnJheVtiKzBdPWU7dGhpcy5hcnJheVtiKzFdPWg7dGhpcy5hcnJheVtiKzJdPW47cmV0dXJuIHRoaXN9LApzZXRYWVpXOmZ1bmN0aW9uKGIsZSxoLG4sdSl7Yio9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2IrMF09ZTt0aGlzLmFycmF5W2IrMV09aDt0aGlzLmFycmF5W2IrMl09bjt0aGlzLmFycmF5W2IrM109dTtyZXR1cm4gdGhpc30sb25VcGxvYWQ6ZnVuY3Rpb24oYil7dGhpcy5vblVwbG9hZENhbGxiYWNrPWI7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkpLmNvcHkodGhpcyl9fSk7WS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShULnByb3RvdHlwZSk7WS5wcm90b3R5cGUuY29uc3RydWN0b3I9WTthYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShULnByb3RvdHlwZSk7YWEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFhO2hhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFQucHJvdG90eXBlKTtoYS5wcm90b3R5cGUuY29uc3RydWN0b3I9aGE7WC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShULnByb3RvdHlwZSk7ClgucHJvdG90eXBlLmNvbnN0cnVjdG9yPVg7Y2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVC5wcm90b3R5cGUpO2NhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jYTtlYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShULnByb3RvdHlwZSk7ZWEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWVhO2thLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFQucHJvdG90eXBlKTtrYS5wcm90b3R5cGUuY29uc3RydWN0b3I9a2E7YmEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVC5wcm90b3R5cGUpO2JhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iYTtsYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShULnByb3RvdHlwZSk7bGEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxhO09iamVjdC5hc3NpZ24od2EucHJvdG90eXBlLHtjb21wdXRlR3JvdXBzOmZ1bmN0aW9uKGIpe3ZhciBlPVtdLGg9dm9pZCAwO2I9Yi5mYWNlcztmb3IodmFyIG49MDtuPGIubGVuZ3RoO24rKyl7dmFyIHU9YltuXTtpZih1Lm1hdGVyaWFsSW5kZXghPT0KaCl7aD11Lm1hdGVyaWFsSW5kZXg7dm9pZCAwIT09dyYmKHcuY291bnQ9MypuLXcuc3RhcnQsZS5wdXNoKHcpKTt2YXIgdz17c3RhcnQ6MypuLG1hdGVyaWFsSW5kZXg6aH19fXZvaWQgMCE9PXcmJih3LmNvdW50PTMqbi13LnN0YXJ0LGUucHVzaCh3KSk7dGhpcy5ncm91cHM9ZX0sZnJvbUdlb21ldHJ5OmZ1bmN0aW9uKGIpe3ZhciBlPWIuZmFjZXMsaD1iLnZlcnRpY2VzLG49Yi5mYWNlVmVydGV4VXZzLHU9blswXSYmMDxuWzBdLmxlbmd0aCx3PW5bMV0mJjA8blsxXS5sZW5ndGgsej1iLm1vcnBoVGFyZ2V0cyxFPXoubGVuZ3RoO2lmKDA8RSl7dmFyIEg9W107Zm9yKHZhciBJPTA7STxFO0krKylIW0ldPXtuYW1lOnpbSV0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbj1IfXZhciBPPWIubW9ycGhOb3JtYWxzLFE9Ty5sZW5ndGg7aWYoMDxRKXt2YXIgUj1bXTtmb3IoST0wO0k8UTtJKyspUltJXT17bmFtZTpPW0ldLm5hbWUsZGF0YTpbXX07dGhpcy5tb3JwaFRhcmdldHMubm9ybWFsPQpSfXZhciBVPWIuc2tpbkluZGljZXMsVz1iLnNraW5XZWlnaHRzLFo9VS5sZW5ndGg9PT1oLmxlbmd0aCxmYT1XLmxlbmd0aD09PWgubGVuZ3RoOzA8aC5sZW5ndGgmJjA9PT1lLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuRGlyZWN0R2VvbWV0cnk6IEZhY2VsZXNzIGdlb21ldHJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7Zm9yKEk9MDtJPGUubGVuZ3RoO0krKyl7dmFyIHFhPWVbSV07dGhpcy52ZXJ0aWNlcy5wdXNoKGhbcWEuYV0saFtxYS5iXSxoW3FhLmNdKTt2YXIgcmE9cWEudmVydGV4Tm9ybWFsczszPT09cmEubGVuZ3RoP3RoaXMubm9ybWFscy5wdXNoKHJhWzBdLHJhWzFdLHJhWzJdKToocmE9cWEubm9ybWFsLHRoaXMubm9ybWFscy5wdXNoKHJhLHJhLHJhKSk7cmE9cWEudmVydGV4Q29sb3JzOzM9PT1yYS5sZW5ndGg/dGhpcy5jb2xvcnMucHVzaChyYVswXSxyYVsxXSxyYVsyXSk6KHJhPXFhLmNvbG9yLHRoaXMuY29sb3JzLnB1c2gocmEscmEscmEpKTshMD09PXUmJgoocmE9blswXVtJXSx2b2lkIDAhPT1yYT90aGlzLnV2cy5wdXNoKHJhWzBdLHJhWzFdLHJhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICIsSSksdGhpcy51dnMucHVzaChuZXcgZCxuZXcgZCxuZXcgZCkpKTshMD09PXcmJihyYT1uWzFdW0ldLHZvaWQgMCE9PXJhP3RoaXMudXZzMi5wdXNoKHJhWzBdLHJhWzFdLHJhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAiLEkpLHRoaXMudXZzMi5wdXNoKG5ldyBkLG5ldyBkLG5ldyBkKSkpO2ZvcihyYT0wO3JhPEU7cmErKyl7dmFyIGlhPXpbcmFdLnZlcnRpY2VzO0hbcmFdLmRhdGEucHVzaChpYVtxYS5hXSxpYVtxYS5iXSxpYVtxYS5jXSl9Zm9yKHJhPTA7cmE8UTtyYSsrKWlhPU9bcmFdLnZlcnRleE5vcm1hbHNbSV0sUltyYV0uZGF0YS5wdXNoKGlhLmEsaWEuYiwKaWEuYyk7WiYmdGhpcy5za2luSW5kaWNlcy5wdXNoKFVbcWEuYV0sVVtxYS5iXSxVW3FhLmNdKTtmYSYmdGhpcy5za2luV2VpZ2h0cy5wdXNoKFdbcWEuYV0sV1txYS5iXSxXW3FhLmNdKX10aGlzLmNvbXB1dGVHcm91cHMoYik7dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9Yi52ZXJ0aWNlc05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1iLm5vcm1hbHNOZWVkVXBkYXRlO3RoaXMuY29sb3JzTmVlZFVwZGF0ZT1iLmNvbG9yc05lZWRVcGRhdGU7dGhpcy51dnNOZWVkVXBkYXRlPWIudXZzTmVlZFVwZGF0ZTt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9Yi5ncm91cHNOZWVkVXBkYXRlO3JldHVybiB0aGlzfX0pO3ZhciBObj0xO3hhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp4YSxpc0J1ZmZlckdlb21ldHJ5OiEwLGdldEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5kZXh9LHNldEluZGV4OmZ1bmN0aW9uKGIpe3RoaXMuaW5kZXg9CkFycmF5LmlzQXJyYXkoYik/bmV3ICg2NTUzNTxDYShiKT9rYTpjYSkoYiwxKTpifSxhZGRBdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe2lmKCEoZSYmZS5pc0J1ZmZlckF0dHJpYnV0ZXx8ZSYmZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuIiksdGhpcy5hZGRBdHRyaWJ1dGUoYixuZXcgVChlLGgpKTtpZigiaW5kZXgiPT09YilyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLiIpLHRoaXMuc2V0SW5kZXgoZSksdGhpczt0aGlzLmF0dHJpYnV0ZXNbYl09ZTtyZXR1cm4gdGhpc30sZ2V0QXR0cmlidXRlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbYl19LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihiKXtkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW2JdOwpyZXR1cm4gdGhpc30sYWRkR3JvdXA6ZnVuY3Rpb24oYixlLGgpe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OmIsY291bnQ6ZSxtYXRlcmlhbEluZGV4OnZvaWQgMCE9PWg/aDowfSl9LGNsZWFyR3JvdXBzOmZ1bmN0aW9uKCl7dGhpcy5ncm91cHM9W119LHNldERyYXdSYW5nZTpmdW5jdGlvbihiLGUpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWI7dGhpcy5kcmF3UmFuZ2UuY291bnQ9ZX0sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWUmJihiLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoZSksZS5uZWVkc1VwZGF0ZT0hMCk7dmFyIGg9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDt2b2lkIDAhPT1oJiYoZT0obmV3IGwpLmdldE5vcm1hbE1hdHJpeChiKSxlLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoaCksaC5uZWVkc1VwZGF0ZT0hMCk7aD10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDt2b2lkIDAhPT1oJiYoZT0obmV3IGwpLmdldE5vcm1hbE1hdHJpeChiKSwKZS5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGgpLGgubmVlZHNVcGRhdGU9ITApO251bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO251bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3JldHVybiB0aGlzfSxyb3RhdGVYOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IEM7cmV0dXJuIGZ1bmN0aW9uKGUpe2IubWFrZVJvdGF0aW9uWChlKTt0aGlzLmFwcGx5TWF0cml4KGIpO3JldHVybiB0aGlzfX0oKSxyb3RhdGVZOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IEM7cmV0dXJuIGZ1bmN0aW9uKGUpe2IubWFrZVJvdGF0aW9uWShlKTt0aGlzLmFwcGx5TWF0cml4KGIpO3JldHVybiB0aGlzfX0oKSxyb3RhdGVaOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IEM7cmV0dXJuIGZ1bmN0aW9uKGUpe2IubWFrZVJvdGF0aW9uWihlKTt0aGlzLmFwcGx5TWF0cml4KGIpO3JldHVybiB0aGlzfX0oKSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIgYj0KbmV3IEM7cmV0dXJuIGZ1bmN0aW9uKGUsaCxuKXtiLm1ha2VUcmFuc2xhdGlvbihlLGgsbik7dGhpcy5hcHBseU1hdHJpeChiKTtyZXR1cm4gdGhpc319KCksc2NhbGU6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgQztyZXR1cm4gZnVuY3Rpb24oZSxoLG4pe2IubWFrZVNjYWxlKGUsaCxuKTt0aGlzLmFwcGx5TWF0cml4KGIpO3JldHVybiB0aGlzfX0oKSxsb29rQXQ6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgUztyZXR1cm4gZnVuY3Rpb24oZSl7Yi5sb29rQXQoZSk7Yi51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KGIubWF0cml4KX19KCksY2VudGVyOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTt0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihiKS5uZWdhdGUoKTt0aGlzLnRyYW5zbGF0ZShiLngsYi55LGIueik7cmV0dXJuIHRoaXN9fSgpLHNldEZyb21PYmplY3Q6ZnVuY3Rpb24oYil7dmFyIGU9Yi5nZW9tZXRyeTsKaWYoYi5pc1BvaW50c3x8Yi5pc0xpbmUpe2I9bmV3IGJhKDMqZS52ZXJ0aWNlcy5sZW5ndGgsMyk7dmFyIGg9bmV3IGJhKDMqZS5jb2xvcnMubGVuZ3RoLDMpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsYi5jb3B5VmVjdG9yM3NBcnJheShlLnZlcnRpY2VzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoImNvbG9yIixoLmNvcHlDb2xvcnNBcnJheShlLmNvbG9ycykpO2UubGluZURpc3RhbmNlcyYmZS5saW5lRGlzdGFuY2VzLmxlbmd0aD09PWUudmVydGljZXMubGVuZ3RoJiYoYj1uZXcgYmEoZS5saW5lRGlzdGFuY2VzLmxlbmd0aCwxKSx0aGlzLmFkZEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixiLmNvcHlBcnJheShlLmxpbmVEaXN0YW5jZXMpKSk7bnVsbCE9PWUuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWUuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWUuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWUuYm91bmRpbmdCb3guY2xvbmUoKSl9ZWxzZSBiLmlzTWVzaCYmCmUmJmUuaXNHZW9tZXRyeSYmdGhpcy5mcm9tR2VvbWV0cnkoZSk7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPVtdLGg9MCxuPWIubGVuZ3RoO2g8bjtoKyspe3ZhciB1PWJbaF07ZS5wdXNoKHUueCx1LnksdS56fHwwKX10aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShlLDMpKTtyZXR1cm4gdGhpc30sdXBkYXRlRnJvbU9iamVjdDpmdW5jdGlvbihiKXt2YXIgZT1iLmdlb21ldHJ5O2lmKGIuaXNNZXNoKXt2YXIgaD1lLl9fZGlyZWN0R2VvbWV0cnk7ITA9PT1lLmVsZW1lbnRzTmVlZFVwZGF0ZSYmKGg9dm9pZCAwLGUuZWxlbWVudHNOZWVkVXBkYXRlPSExKTtpZih2b2lkIDA9PT1oKXJldHVybiB0aGlzLmZyb21HZW9tZXRyeShlKTtoLnZlcnRpY2VzTmVlZFVwZGF0ZT1lLnZlcnRpY2VzTmVlZFVwZGF0ZTtoLm5vcm1hbHNOZWVkVXBkYXRlPWUubm9ybWFsc05lZWRVcGRhdGU7aC5jb2xvcnNOZWVkVXBkYXRlPWUuY29sb3JzTmVlZFVwZGF0ZTsKaC51dnNOZWVkVXBkYXRlPWUudXZzTmVlZFVwZGF0ZTtoLmdyb3Vwc05lZWRVcGRhdGU9ZS5ncm91cHNOZWVkVXBkYXRlO2UudmVydGljZXNOZWVkVXBkYXRlPSExO2Uubm9ybWFsc05lZWRVcGRhdGU9ITE7ZS5jb2xvcnNOZWVkVXBkYXRlPSExO2UudXZzTmVlZFVwZGF0ZT0hMTtlLmdyb3Vwc05lZWRVcGRhdGU9ITE7ZT1ofSEwPT09ZS52ZXJ0aWNlc05lZWRVcGRhdGUmJihoPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1oJiYoaC5jb3B5VmVjdG9yM3NBcnJheShlLnZlcnRpY2VzKSxoLm5lZWRzVXBkYXRlPSEwKSxlLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMSk7ITA9PT1lLm5vcm1hbHNOZWVkVXBkYXRlJiYoaD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLHZvaWQgMCE9PWgmJihoLmNvcHlWZWN0b3Izc0FycmF5KGUubm9ybWFscyksaC5uZWVkc1VwZGF0ZT0hMCksZS5ub3JtYWxzTmVlZFVwZGF0ZT0hMSk7ITA9PT1lLmNvbG9yc05lZWRVcGRhdGUmJihoPXRoaXMuYXR0cmlidXRlcy5jb2xvciwKdm9pZCAwIT09aCYmKGguY29weUNvbG9yc0FycmF5KGUuY29sb3JzKSxoLm5lZWRzVXBkYXRlPSEwKSxlLmNvbG9yc05lZWRVcGRhdGU9ITEpO2UudXZzTmVlZFVwZGF0ZSYmKGg9dGhpcy5hdHRyaWJ1dGVzLnV2LHZvaWQgMCE9PWgmJihoLmNvcHlWZWN0b3Iyc0FycmF5KGUudXZzKSxoLm5lZWRzVXBkYXRlPSEwKSxlLnV2c05lZWRVcGRhdGU9ITEpO2UubGluZURpc3RhbmNlc05lZWRVcGRhdGUmJihoPXRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2Usdm9pZCAwIT09aCYmKGguY29weUFycmF5KGUubGluZURpc3RhbmNlcyksaC5uZWVkc1VwZGF0ZT0hMCksZS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZT0hMSk7ZS5ncm91cHNOZWVkVXBkYXRlJiYoZS5jb21wdXRlR3JvdXBzKGIuZ2VvbWV0cnkpLHRoaXMuZ3JvdXBzPWUuZ3JvdXBzLGUuZ3JvdXBzTmVlZFVwZGF0ZT0hMSk7cmV0dXJuIHRoaXN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihiKXtiLl9fZGlyZWN0R2VvbWV0cnk9KG5ldyB3YSkuZnJvbUdlb21ldHJ5KGIpOwpyZXR1cm4gdGhpcy5mcm9tRGlyZWN0R2VvbWV0cnkoYi5fX2RpcmVjdEdlb21ldHJ5KX0sZnJvbURpcmVjdEdlb21ldHJ5OmZ1bmN0aW9uKGIpe3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsKG5ldyBUKG5ldyBGbG9hdDMyQXJyYXkoMypiLnZlcnRpY2VzLmxlbmd0aCksMykpLmNvcHlWZWN0b3Izc0FycmF5KGIudmVydGljZXMpKTswPGIubm9ybWFscy5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLChuZXcgVChuZXcgRmxvYXQzMkFycmF5KDMqYi5ub3JtYWxzLmxlbmd0aCksMykpLmNvcHlWZWN0b3Izc0FycmF5KGIubm9ybWFscykpOzA8Yi5jb2xvcnMubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgiY29sb3IiLChuZXcgVChuZXcgRmxvYXQzMkFycmF5KDMqYi5jb2xvcnMubGVuZ3RoKSwzKSkuY29weUNvbG9yc0FycmF5KGIuY29sb3JzKSk7MDxiLnV2cy5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJ1diIsKG5ldyBUKG5ldyBGbG9hdDMyQXJyYXkoMioKYi51dnMubGVuZ3RoKSwyKSkuY29weVZlY3RvcjJzQXJyYXkoYi51dnMpKTswPGIudXZzMi5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJ1djIiLChuZXcgVChuZXcgRmxvYXQzMkFycmF5KDIqYi51dnMyLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGIudXZzMikpO3RoaXMuZ3JvdXBzPWIuZ3JvdXBzO2Zvcih2YXIgZSBpbiBiLm1vcnBoVGFyZ2V0cyl7Zm9yKHZhciBoPVtdLG49Yi5tb3JwaFRhcmdldHNbZV0sdT0wLHc9bi5sZW5ndGg7dTx3O3UrKyl7dmFyIHo9blt1XSxFPW5ldyBiYSgzKnouZGF0YS5sZW5ndGgsMyk7RS5uYW1lPXoubmFtZTtoLnB1c2goRS5jb3B5VmVjdG9yM3NBcnJheSh6LmRhdGEpKX10aGlzLm1vcnBoQXR0cmlidXRlc1tlXT1ofTA8Yi5za2luSW5kaWNlcy5sZW5ndGgmJihlPW5ldyBiYSg0KmIuc2tpbkluZGljZXMubGVuZ3RoLDQpLHRoaXMuYWRkQXR0cmlidXRlKCJza2luSW5kZXgiLGUuY29weVZlY3RvcjRzQXJyYXkoYi5za2luSW5kaWNlcykpKTsKMDxiLnNraW5XZWlnaHRzLmxlbmd0aCYmKGU9bmV3IGJhKDQqYi5za2luV2VpZ2h0cy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5XZWlnaHQiLGUuY29weVZlY3RvcjRzQXJyYXkoYi5za2luV2VpZ2h0cykpKTtudWxsIT09Yi5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Yi5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09Yi5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9Yi5ib3VuZGluZ0JveC5jbG9uZSgpKTtyZXR1cm4gdGhpc30sY29tcHV0ZUJvdW5kaW5nQm94OmZ1bmN0aW9uKCl7dmFyIGI9bmV3IHY7cmV0dXJuIGZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PW5ldyB2KTt2YXIgZT10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24saD10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih2b2lkIDAhPT1lKXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoZSksCmgpe2U9MDtmb3IodmFyIG49aC5sZW5ndGg7ZTxuO2UrKyliLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoaFtlXSksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGIubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYi5tYXgpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfX0oKSxjb21wdXRlQm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgdixlPW5ldyB2LGg9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKCl7bnVsbD09PQp0aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgQSk7dmFyIG49dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYobil7dmFyIHc9dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7Yi5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKG4pO2lmKHUpZm9yKHZhciB6PTAsRT11Lmxlbmd0aDt6PEU7eisrKXt2YXIgSD11W3pdO2Uuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShIKTtiLmV4cGFuZEJ5UG9pbnQoZS5taW4pO2IuZXhwYW5kQnlQb2ludChlLm1heCl9Yi5nZXRDZW50ZXIodyk7dmFyIEk9MDt6PTA7Zm9yKEU9bi5jb3VudDt6PEU7eisrKWguZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHopLEk9TWF0aC5tYXgoSSx3LmRpc3RhbmNlVG9TcXVhcmVkKGgpKTtpZih1KWZvcih6PTAsRT11Lmxlbmd0aDt6PEU7eisrKXtIPXVbel07bj0wO2Zvcih2YXIgTz1ILmNvdW50O248TztuKyspaC5mcm9tQnVmZmVyQXR0cmlidXRlKEgsCm4pLEk9TWF0aC5tYXgoSSx3LmRpc3RhbmNlVG9TcXVhcmVkKGgpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQoSSk7aXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19fSgpLGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe30sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKGUucG9zaXRpb24pe3ZhciBoPWUucG9zaXRpb24uYXJyYXk7aWYodm9pZCAwPT09ZS5ub3JtYWwpdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFQobmV3IEZsb2F0MzJBcnJheShoLmxlbmd0aCksMykpO2Vsc2UgZm9yKHZhciBuPQplLm5vcm1hbC5hcnJheSx1PTAsdz1uLmxlbmd0aDt1PHc7dSsrKW5bdV09MDtuPWUubm9ybWFsLmFycmF5O3ZhciB6PW5ldyBnLEU9bmV3IGcsSD1uZXcgZyxJPW5ldyBnLE89bmV3IGc7aWYoYil7dmFyIFE9Yi5hcnJheTt1PTA7Zm9yKHc9Yi5jb3VudDt1PHc7dSs9Myl7Yj0zKlFbdSswXTt2YXIgUj0zKlFbdSsxXTt2YXIgVT0zKlFbdSsyXTt6LmZyb21BcnJheShoLGIpO0UuZnJvbUFycmF5KGgsUik7SC5mcm9tQXJyYXkoaCxVKTtJLnN1YlZlY3RvcnMoSCxFKTtPLnN1YlZlY3RvcnMoeixFKTtJLmNyb3NzKE8pO25bYl0rPUkueDtuW2IrMV0rPUkueTtuW2IrMl0rPUkuejtuW1JdKz1JLng7bltSKzFdKz1JLnk7bltSKzJdKz1JLno7bltVXSs9SS54O25bVSsxXSs9SS55O25bVSsyXSs9SS56fX1lbHNlIGZvcih1PTAsdz1oLmxlbmd0aDt1PHc7dSs9OSl6LmZyb21BcnJheShoLHUpLEUuZnJvbUFycmF5KGgsdSszKSxILmZyb21BcnJheShoLHUrNiksSS5zdWJWZWN0b3JzKEgsRSksCk8uc3ViVmVjdG9ycyh6LEUpLEkuY3Jvc3MoTyksblt1XT1JLngsblt1KzFdPUkueSxuW3UrMl09SS56LG5bdSszXT1JLngsblt1KzRdPUkueSxuW3UrNV09SS56LG5bdSs2XT1JLngsblt1KzddPUkueSxuW3UrOF09SS56O3RoaXMubm9ybWFsaXplTm9ybWFscygpO2Uubm9ybWFsLm5lZWRzVXBkYXRlPSEwfX0sbWVyZ2U6ZnVuY3Rpb24oYixlKXtpZihiJiZiLmlzQnVmZmVyR2VvbWV0cnkpe3ZvaWQgMD09PWUmJihlPTAsY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBPdmVyd3JpdGluZyBvcmlnaW5hbCBnZW9tZXRyeSwgc3RhcnRpbmcgYXQgb2Zmc2V0XHgzZDAuIFVzZSBCdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlQnVmZmVyR2VvbWV0cmllcygpIGZvciBsb3NzbGVzcyBtZXJnZS4iKSk7dmFyIGg9dGhpcy5hdHRyaWJ1dGVzLG47Zm9yKG4gaW4gaClpZih2b2lkIDAhPT1iLmF0dHJpYnV0ZXNbbl0pe3ZhciB1PWhbbl0uYXJyYXksdz1iLmF0dHJpYnV0ZXNbbl0sCno9dy5hcnJheSxFPXcuaXRlbVNpemUqZTt3PU1hdGgubWluKHoubGVuZ3RoLHUubGVuZ3RoLUUpO2Zvcih2YXIgSD0wO0g8dztIKyssRSsrKXVbRV09eltIXX1yZXR1cm4gdGhpc31jb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkuIixiKX0sbm9ybWFsaXplTm9ybWFsczpmdW5jdGlvbigpe3ZhciBiPW5ldyBnO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLGg9MCxuPWUuY291bnQ7aDxuO2grKyliLng9ZS5nZXRYKGgpLGIueT1lLmdldFkoaCksYi56PWUuZ2V0WihoKSxiLm5vcm1hbGl6ZSgpLGUuc2V0WFlaKGgsYi54LGIueSxiLnopfX0oKSx0b05vbkluZGV4ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKE8sUSl7dmFyIFI9Ty5hcnJheTtPPU8uaXRlbVNpemU7Zm9yKHZhciBVPW5ldyBSLmNvbnN0cnVjdG9yKFEubGVuZ3RoKgpPKSxXLFo9MCxmYT0wLHFhPVEubGVuZ3RoO2ZhPHFhO2ZhKyspe1c9UVtmYV0qTztmb3IodmFyIHJhPTA7cmE8TztyYSsrKVVbWisrXT1SW1crK119cmV0dXJuIG5ldyBUKFUsTyl9aWYobnVsbD09PXRoaXMuaW5kZXgpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuIiksdGhpczt2YXIgZT1uZXcgeGEsaD10aGlzLmluZGV4LmFycmF5LG49dGhpcy5hdHRyaWJ1dGVzLHU7Zm9yKHUgaW4gbil7dmFyIHc9blt1XTt3PWIodyxoKTtlLmFkZEF0dHJpYnV0ZSh1LHcpfXZhciB6PXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcih1IGluIHope3ZhciBFPVtdLEg9elt1XTtuPTA7Zm9yKHZhciBJPUgubGVuZ3RoO248STtuKyspdz1IW25dLHc9Yih3LGgpLEUucHVzaCh3KTtlLm1vcnBoQXR0cmlidXRlc1t1XT1FfWg9dGhpcy5ncm91cHM7bj0wO2Zvcih1PWgubGVuZ3RoO248dTtuKyspdz0KaFtuXSxlLmFkZEdyb3VwKHcuc3RhcnQsdy5jb3VudCx3Lm1hdGVyaWFsSW5kZXgpO3JldHVybiBlfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtiLnV1aWQ9dGhpcy51dWlkO2IudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJihiLm5hbWU9dGhpcy5uYW1lKTswPE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aCYmKGIudXNlckRhdGE9dGhpcy51c2VyRGF0YSk7aWYodm9pZCAwIT09dGhpcy5wYXJhbWV0ZXJzKXt2YXIgZT10aGlzLnBhcmFtZXRlcnM7Zm9yKEkgaW4gZSl2b2lkIDAhPT1lW0ldJiYoYltJXT1lW0ldKTtyZXR1cm4gYn1iLmRhdGE9e2F0dHJpYnV0ZXM6e319O2U9dGhpcy5pbmRleDtudWxsIT09ZSYmKGIuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTsKdmFyIGg9dGhpcy5hdHRyaWJ1dGVzO2ZvcihJIGluIGgpe2U9aFtJXTt2YXIgbj17aXRlbVNpemU6ZS5pdGVtU2l6ZSx0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KSxub3JtYWxpemVkOmUubm9ybWFsaXplZH07IiIhPT1lLm5hbWUmJihuLm5hbWU9ZS5uYW1lKTtiLmRhdGEuYXR0cmlidXRlc1tJXT1ufWg9e307dmFyIHU9ITE7Zm9yKEkgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2Zvcih2YXIgdz10aGlzLm1vcnBoQXR0cmlidXRlc1tJXSx6PVtdLEU9MCxIPXcubGVuZ3RoO0U8SDtFKyspZT13W0VdLG49e2l0ZW1TaXplOmUuaXRlbVNpemUsdHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSksbm9ybWFsaXplZDplLm5vcm1hbGl6ZWR9LCIiIT09ZS5uYW1lJiYobi5uYW1lPWUubmFtZSksei5wdXNoKG4pOzA8ei5sZW5ndGgmJgooaFtJXT16LHU9ITApfXUmJihiLmRhdGEubW9ycGhBdHRyaWJ1dGVzPWgpO3ZhciBJPXRoaXMuZ3JvdXBzOzA8SS5sZW5ndGgmJihiLmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSSkpKTtJPXRoaXMuYm91bmRpbmdTcGhlcmU7bnVsbCE9PUkmJihiLmRhdGEuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjpJLmNlbnRlci50b0FycmF5KCkscmFkaXVzOkkucmFkaXVzfSk7cmV0dXJuIGJ9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB4YSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt2YXIgZTt0aGlzLmluZGV4PW51bGw7dGhpcy5hdHRyaWJ1dGVzPXt9O3RoaXMubW9ycGhBdHRyaWJ1dGVzPXt9O3RoaXMuZ3JvdXBzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1iLm5hbWU7dmFyIGg9Yi5pbmRleDtudWxsIT09aCYmdGhpcy5zZXRJbmRleChoLmNsb25lKCkpO2g9Yi5hdHRyaWJ1dGVzO2Zvcih6IGluIGgpdGhpcy5hZGRBdHRyaWJ1dGUoeiwKaFt6XS5jbG9uZSgpKTt2YXIgbj1iLm1vcnBoQXR0cmlidXRlcztmb3IoeiBpbiBuKXt2YXIgdT1bXSx3PW5bel07aD0wO2ZvcihlPXcubGVuZ3RoO2g8ZTtoKyspdS5wdXNoKHdbaF0uY2xvbmUoKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbel09dX12YXIgej1iLmdyb3VwcztoPTA7Zm9yKGU9ei5sZW5ndGg7aDxlO2grKyluPXpbaF0sdGhpcy5hZGRHcm91cChuLnN0YXJ0LG4uY291bnQsbi5tYXRlcmlhbEluZGV4KTt6PWIuYm91bmRpbmdCb3g7bnVsbCE9PXomJih0aGlzLmJvdW5kaW5nQm94PXouY2xvbmUoKSk7ej1iLmJvdW5kaW5nU3BoZXJlO251bGwhPT16JiYodGhpcy5ib3VuZGluZ1NwaGVyZT16LmNsb25lKCkpO3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWIuZHJhd1JhbmdlLnN0YXJ0O3RoaXMuZHJhd1JhbmdlLmNvdW50PWIuZHJhd1JhbmdlLmNvdW50O3RoaXMudXNlckRhdGE9Yi51c2VyRGF0YTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTsKemEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTi5wcm90b3R5cGUpO3phLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj16YTtGYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0ZhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYTtTYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShOLnByb3RvdHlwZSk7U2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNhO0VhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7RWEucHJvdG90eXBlLmNvbnN0cnVjdG9yPUVhO3ZhciBPbj0wO0dhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpHYSxpc01hdGVyaWFsOiEwLG9uQmVmb3JlQ29tcGlsZTpmdW5jdGlvbigpe30sc2V0VmFsdWVzOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMCE9PWIpZm9yKHZhciBlIGluIGIpe3ZhciBoPWJbZV07aWYodm9pZCAwPT09aCljb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAnIisKZSsiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiIpO2Vsc2UgaWYoInNoYWRpbmciPT09ZSljb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT1oPyEwOiExO2Vsc2V7dmFyIG49dGhpc1tlXTt2b2lkIDA9PT1uP2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogJyIrZSsiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLiIpOm4mJm4uaXNDb2xvcj9uLnNldChoKTpuJiZuLmlzVmVjdG9yMyYmaCYmaC5pc1ZlY3RvcjM/bi5jb3B5KGgpOnRoaXNbZV09aH19fSx0b0pTT046ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZSh1KXt2YXIgdz1bXSx6O2Zvcih6IGluIHUpe3ZhciBFPXVbel07ZGVsZXRlIEUubWV0YWRhdGE7dy5wdXNoKEUpfXJldHVybiB3fXZhciBoPXZvaWQgMD09PWJ8fCJzdHJpbmciPT09CnR5cGVvZiBiO2gmJihiPXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTt2YXIgbj17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ik1hdGVyaWFsIixnZW5lcmF0b3I6Ik1hdGVyaWFsLnRvSlNPTiJ9fTtuLnV1aWQ9dGhpcy51dWlkO24udHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJihuLm5hbWU9dGhpcy5uYW1lKTt0aGlzLmNvbG9yJiZ0aGlzLmNvbG9yLmlzQ29sb3ImJihuLmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCkpO3ZvaWQgMCE9PXRoaXMucm91Z2huZXNzJiYobi5yb3VnaG5lc3M9dGhpcy5yb3VnaG5lc3MpO3ZvaWQgMCE9PXRoaXMubWV0YWxuZXNzJiYobi5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpO3RoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSk7MSE9PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpOwp0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihuLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpO3ZvaWQgMCE9PXRoaXMuc2hpbmluZXNzJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpO3ZvaWQgMCE9PXRoaXMuY2xlYXJDb2F0JiYobi5jbGVhckNvYXQ9dGhpcy5jbGVhckNvYXQpO3ZvaWQgMCE9PXRoaXMuY2xlYXJDb2F0Um91Z2huZXNzJiYobi5jbGVhckNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhckNvYXRSb3VnaG5lc3MpO3RoaXMubWFwJiZ0aGlzLm1hcC5pc1RleHR1cmUmJihuLm1hcD10aGlzLm1hcC50b0pTT04oYikudXVpZCk7dGhpcy5tYXRjYXAmJnRoaXMubWF0Y2FwLmlzVGV4dHVyZSYmKG4ubWF0Y2FwPXRoaXMubWF0Y2FwLnRvSlNPTihiKS51dWlkKTt0aGlzLmFscGhhTWFwJiZ0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSYmKG4uYWxwaGFNYXA9dGhpcy5hbHBoYU1hcC50b0pTT04oYikudXVpZCk7dGhpcy5saWdodE1hcCYmdGhpcy5saWdodE1hcC5pc1RleHR1cmUmJgoobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTihiKS51dWlkKTt0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKG4uYW9NYXA9dGhpcy5hb01hcC50b0pTT04oYikudXVpZCxuLmFvTWFwSW50ZW5zaXR5PXRoaXMuYW9NYXBJbnRlbnNpdHkpO3RoaXMuYnVtcE1hcCYmdGhpcy5idW1wTWFwLmlzVGV4dHVyZSYmKG4uYnVtcE1hcD10aGlzLmJ1bXBNYXAudG9KU09OKGIpLnV1aWQsbi5idW1wU2NhbGU9dGhpcy5idW1wU2NhbGUpO3RoaXMubm9ybWFsTWFwJiZ0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUmJihuLm5vcm1hbE1hcD10aGlzLm5vcm1hbE1hcC50b0pTT04oYikudXVpZCxuLm5vcm1hbE1hcFR5cGU9dGhpcy5ub3JtYWxNYXBUeXBlLG4ubm9ybWFsU2NhbGU9dGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCkpO3RoaXMuZGlzcGxhY2VtZW50TWFwJiZ0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUmJihuLmRpc3BsYWNlbWVudE1hcD10aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04oYikudXVpZCwKbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpO3RoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04oYikudXVpZCk7dGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTihiKS51dWlkKTt0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04oYikudXVpZCk7dGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKGIpLnV1aWQpO3RoaXMuZW52TWFwJiZ0aGlzLmVudk1hcC5pc1RleHR1cmUmJgoobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKGIpLnV1aWQsbi5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHksdm9pZCAwIT09dGhpcy5jb21iaW5lJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSksdm9pZCAwIT09dGhpcy5lbnZNYXBJbnRlbnNpdHkmJihuLmVudk1hcEludGVuc2l0eT10aGlzLmVudk1hcEludGVuc2l0eSkpO3RoaXMuZ3JhZGllbnRNYXAmJnRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlJiYobi5ncmFkaWVudE1hcD10aGlzLmdyYWRpZW50TWFwLnRvSlNPTihiKS51dWlkKTt2b2lkIDAhPT10aGlzLnNpemUmJihuLnNpemU9dGhpcy5zaXplKTt2b2lkIDAhPT10aGlzLnNpemVBdHRlbnVhdGlvbiYmKG4uc2l6ZUF0dGVudWF0aW9uPXRoaXMuc2l6ZUF0dGVudWF0aW9uKTsxIT09dGhpcy5ibGVuZGluZyYmKG4uYmxlbmRpbmc9dGhpcy5ibGVuZGluZyk7ITA9PT10aGlzLmZsYXRTaGFkaW5nJiYobi5mbGF0U2hhZGluZz10aGlzLmZsYXRTaGFkaW5nKTswIT09CnRoaXMuc2lkZSYmKG4uc2lkZT10aGlzLnNpZGUpOzAhPT10aGlzLnZlcnRleENvbG9ycyYmKG4udmVydGV4Q29sb3JzPXRoaXMudmVydGV4Q29sb3JzKTsxPnRoaXMub3BhY2l0eSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpOyEwPT09dGhpcy50cmFuc3BhcmVudCYmKG4udHJhbnNwYXJlbnQ9dGhpcy50cmFuc3BhcmVudCk7bi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmM7bi5kZXB0aFRlc3Q9dGhpcy5kZXB0aFRlc3Q7bi5kZXB0aFdyaXRlPXRoaXMuZGVwdGhXcml0ZTswIT09dGhpcy5yb3RhdGlvbiYmKG4ucm90YXRpb249dGhpcy5yb3RhdGlvbik7ITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJihuLnBvbHlnb25PZmZzZXQ9ITApOzAhPT10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3ImJihuLnBvbHlnb25PZmZzZXRGYWN0b3I9dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yKTswIT09dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMmJihuLnBvbHlnb25PZmZzZXRVbml0cz10aGlzLnBvbHlnb25PZmZzZXRVbml0cyk7CjEhPT10aGlzLmxpbmV3aWR0aCYmKG4ubGluZXdpZHRoPXRoaXMubGluZXdpZHRoKTt2b2lkIDAhPT10aGlzLmRhc2hTaXplJiYobi5kYXNoU2l6ZT10aGlzLmRhc2hTaXplKTt2b2lkIDAhPT10aGlzLmdhcFNpemUmJihuLmdhcFNpemU9dGhpcy5nYXBTaXplKTt2b2lkIDAhPT10aGlzLnNjYWxlJiYobi5zY2FsZT10aGlzLnNjYWxlKTshMD09PXRoaXMuZGl0aGVyaW5nJiYobi5kaXRoZXJpbmc9ITApOzA8dGhpcy5hbHBoYVRlc3QmJihuLmFscGhhVGVzdD10aGlzLmFscGhhVGVzdCk7ITA9PT10aGlzLnByZW11bHRpcGxpZWRBbHBoYSYmKG4ucHJlbXVsdGlwbGllZEFscGhhPXRoaXMucHJlbXVsdGlwbGllZEFscGhhKTshMD09PXRoaXMud2lyZWZyYW1lJiYobi53aXJlZnJhbWU9dGhpcy53aXJlZnJhbWUpOzE8dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgmJihuLndpcmVmcmFtZUxpbmV3aWR0aD10aGlzLndpcmVmcmFtZUxpbmV3aWR0aCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWNhcCYmCihuLndpcmVmcmFtZUxpbmVjYXA9dGhpcy53aXJlZnJhbWVMaW5lY2FwKTsicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lam9pbiYmKG4ud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lam9pbik7ITA9PT10aGlzLm1vcnBoVGFyZ2V0cyYmKG4ubW9ycGhUYXJnZXRzPSEwKTshMD09PXRoaXMuc2tpbm5pbmcmJihuLnNraW5uaW5nPSEwKTshMT09PXRoaXMudmlzaWJsZSYmKG4udmlzaWJsZT0hMSk7Int9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtoJiYoaD1lKGIudGV4dHVyZXMpLGI9ZShiLmltYWdlcyksMDxoLmxlbmd0aCYmKG4udGV4dHVyZXM9aCksMDxiLmxlbmd0aCYmKG4uaW1hZ2VzPWIpKTtyZXR1cm4gbn0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5uYW1lPWIubmFtZTt0aGlzLmZvZz1iLmZvZzsKdGhpcy5saWdodHM9Yi5saWdodHM7dGhpcy5ibGVuZGluZz1iLmJsZW5kaW5nO3RoaXMuc2lkZT1iLnNpZGU7dGhpcy5mbGF0U2hhZGluZz1iLmZsYXRTaGFkaW5nO3RoaXMudmVydGV4Q29sb3JzPWIudmVydGV4Q29sb3JzO3RoaXMub3BhY2l0eT1iLm9wYWNpdHk7dGhpcy50cmFuc3BhcmVudD1iLnRyYW5zcGFyZW50O3RoaXMuYmxlbmRTcmM9Yi5ibGVuZFNyYzt0aGlzLmJsZW5kRHN0PWIuYmxlbmREc3Q7dGhpcy5ibGVuZEVxdWF0aW9uPWIuYmxlbmRFcXVhdGlvbjt0aGlzLmJsZW5kU3JjQWxwaGE9Yi5ibGVuZFNyY0FscGhhO3RoaXMuYmxlbmREc3RBbHBoYT1iLmJsZW5kRHN0QWxwaGE7dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9Yi5ibGVuZEVxdWF0aW9uQWxwaGE7dGhpcy5kZXB0aEZ1bmM9Yi5kZXB0aEZ1bmM7dGhpcy5kZXB0aFRlc3Q9Yi5kZXB0aFRlc3Q7dGhpcy5kZXB0aFdyaXRlPWIuZGVwdGhXcml0ZTt0aGlzLmNvbG9yV3JpdGU9Yi5jb2xvcldyaXRlO3RoaXMucHJlY2lzaW9uPQpiLnByZWNpc2lvbjt0aGlzLnBvbHlnb25PZmZzZXQ9Yi5wb2x5Z29uT2Zmc2V0O3RoaXMucG9seWdvbk9mZnNldEZhY3Rvcj1iLnBvbHlnb25PZmZzZXRGYWN0b3I7dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9Yi5wb2x5Z29uT2Zmc2V0VW5pdHM7dGhpcy5kaXRoZXJpbmc9Yi5kaXRoZXJpbmc7dGhpcy5hbHBoYVRlc3Q9Yi5hbHBoYVRlc3Q7dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9Yi5wcmVtdWx0aXBsaWVkQWxwaGE7dGhpcy52aXNpYmxlPWIudmlzaWJsZTt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYi51c2VyRGF0YSkpO3RoaXMuY2xpcFNoYWRvd3M9Yi5jbGlwU2hhZG93czt0aGlzLmNsaXBJbnRlcnNlY3Rpb249Yi5jbGlwSW50ZXJzZWN0aW9uO3ZhciBlPWIuY2xpcHBpbmdQbGFuZXMsaD1udWxsO2lmKG51bGwhPT1lKXt2YXIgbj1lLmxlbmd0aDtoPUFycmF5KG4pO2Zvcih2YXIgdT0wO3UhPT1uOysrdSloW3VdPWVbdV0uY2xvbmUoKX10aGlzLmNsaXBwaW5nUGxhbmVzPQpoO3RoaXMuc2hhZG93U2lkZT1iLnNoYWRvd1NpZGU7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7ZGIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoR2EucHJvdG90eXBlKTtkYi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGI7ZGIucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWw9ITA7ZGIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7R2EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZnJhZ21lbnRTaGFkZXI9Yi5mcmFnbWVudFNoYWRlcjt0aGlzLnZlcnRleFNoYWRlcj1iLnZlcnRleFNoYWRlcjt0aGlzLnVuaWZvcm1zPUYoYi51bmlmb3Jtcyk7dGhpcy5kZWZpbmVzPU9iamVjdC5hc3NpZ24oe30sYi5kZWZpbmVzKTt0aGlzLndpcmVmcmFtZT1iLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1iLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLmxpZ2h0cz1iLmxpZ2h0czt0aGlzLmNsaXBwaW5nPQpiLmNsaXBwaW5nO3RoaXMuc2tpbm5pbmc9Yi5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1iLm1vcnBoTm9ybWFsczt0aGlzLmV4dGVuc2lvbnM9Yi5leHRlbnNpb25zO3JldHVybiB0aGlzfTtkYi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKGIpe3ZhciBlPUdhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGIpO2UudW5pZm9ybXM9e307Zm9yKHZhciBoIGluIHRoaXMudW5pZm9ybXMpe3ZhciBuPXRoaXMudW5pZm9ybXNbaF0udmFsdWU7ZS51bmlmb3Jtc1toXT1uJiZuLmlzVGV4dHVyZT97dHlwZToidCIsdmFsdWU6bi50b0pTT04oYikudXVpZH06biYmbi5pc0NvbG9yP3t0eXBlOiJjIix2YWx1ZTpuLmdldEhleCgpfTpuJiZuLmlzVmVjdG9yMj97dHlwZToidjIiLHZhbHVlOm4udG9BcnJheSgpfTpuJiZuLmlzVmVjdG9yMz97dHlwZToidjMiLHZhbHVlOm4udG9BcnJheSgpfTpuJiZuLmlzVmVjdG9yND97dHlwZToidjQiLAp2YWx1ZTpuLnRvQXJyYXkoKX06biYmbi5pc01hdHJpeDM/e3R5cGU6Im0zIix2YWx1ZTpuLnRvQXJyYXkoKX06biYmbi5pc01hdHJpeDQ/e3R5cGU6Im00Iix2YWx1ZTpuLnRvQXJyYXkoKX06e3ZhbHVlOm59fTA8T2JqZWN0LmtleXModGhpcy5kZWZpbmVzKS5sZW5ndGgmJihlLmRlZmluZXM9dGhpcy5kZWZpbmVzKTtlLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcjtlLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXI7Yj17fTtmb3IodmFyIHUgaW4gdGhpcy5leHRlbnNpb25zKSEwPT09dGhpcy5leHRlbnNpb25zW3VdJiYoYlt1XT0hMCk7MDxPYmplY3Qua2V5cyhiKS5sZW5ndGgmJihlLmV4dGVuc2lvbnM9Yik7cmV0dXJuIGV9O09iamVjdC5hc3NpZ24oeGIucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYixlKXt0aGlzLm9yaWdpbi5jb3B5KGIpO3RoaXMuZGlyZWN0aW9uLmNvcHkoZSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSwKY29weTpmdW5jdGlvbihiKXt0aGlzLm9yaWdpbi5jb3B5KGIub3JpZ2luKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGIuZGlyZWN0aW9uKTtyZXR1cm4gdGhpc30sYXQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxlPW5ldyBnKTtyZXR1cm4gZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5vcmlnaW4pfSxsb29rQXQ6ZnVuY3Rpb24oYil7dGhpcy5kaXJlY3Rpb24uY29weShiKS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfSxyZWNhc3Q6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZztyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KGUsYikpO3JldHVybiB0aGlzfX0oKSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSwKZT1uZXcgZyk7ZS5zdWJWZWN0b3JzKGIsdGhpcy5vcmlnaW4pO2I9ZS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiAwPmI/ZS5jb3B5KHRoaXMub3JpZ2luKTplLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKGIpLmFkZCh0aGlzLm9yaWdpbil9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoYikpfSxkaXN0YW5jZVNxVG9Qb2ludDpmdW5jdGlvbigpe3ZhciBiPW5ldyBnO3JldHVybiBmdW5jdGlvbihlKXt2YXIgaD1iLnN1YlZlY3RvcnMoZSx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPmgpcmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKGUpO2IuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoaCkuYWRkKHRoaXMub3JpZ2luKTtyZXR1cm4gYi5kaXN0YW5jZVRvU3F1YXJlZChlKX19KCksZGlzdGFuY2VTcVRvU2VnbWVudDpmdW5jdGlvbigpe3ZhciBiPQpuZXcgZyxlPW5ldyBnLGg9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKG4sdSx3LHope2IuY29weShuKS5hZGQodSkubXVsdGlwbHlTY2FsYXIoLjUpO2UuY29weSh1KS5zdWIobikubm9ybWFsaXplKCk7aC5jb3B5KHRoaXMub3JpZ2luKS5zdWIoYik7dmFyIEU9LjUqbi5kaXN0YW5jZVRvKHUpLEg9LXRoaXMuZGlyZWN0aW9uLmRvdChlKSxJPWguZG90KHRoaXMuZGlyZWN0aW9uKSxPPS1oLmRvdChlKSxRPWgubGVuZ3RoU3EoKSxSPU1hdGguYWJzKDEtSCpIKTtpZigwPFIpe249SCpPLUk7dT1IKkktTzt2YXIgVT1FKlI7MDw9bj91Pj0tVT91PD1VPyhFPTEvUixuKj1FLHUqPUUsSD1uKihuK0gqdSsyKkkpK3UqKEgqbit1KzIqTykrUSk6KHU9RSxuPU1hdGgubWF4KDAsLShIKnUrSSkpLEg9LW4qbit1Kih1KzIqTykrUSk6KHU9LUUsbj1NYXRoLm1heCgwLC0oSCp1K0kpKSxIPS1uKm4rdSoodSsyKk8pK1EpOnU8PS1VPyhuPU1hdGgubWF4KDAsLSgtSCpFK0kpKSx1PTA8bj8tRTpNYXRoLm1pbihNYXRoLm1heCgtRSwKLU8pLEUpLEg9LW4qbit1Kih1KzIqTykrUSk6dTw9VT8obj0wLHU9TWF0aC5taW4oTWF0aC5tYXgoLUUsLU8pLEUpLEg9dSoodSsyKk8pK1EpOihuPU1hdGgubWF4KDAsLShIKkUrSSkpLHU9MDxuP0U6TWF0aC5taW4oTWF0aC5tYXgoLUUsLU8pLEUpLEg9LW4qbit1Kih1KzIqTykrUSl9ZWxzZSB1PTA8SD8tRTpFLG49TWF0aC5tYXgoMCwtKEgqdStJKSksSD0tbipuK3UqKHUrMipPKStRO3cmJncuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIobikuYWRkKHRoaXMub3JpZ2luKTt6JiZ6LmNvcHkoZSkubXVsdGlwbHlTY2FsYXIodSkuYWRkKGIpO3JldHVybiBIfX0oKSxpbnRlcnNlY3RTcGhlcmU6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZztyZXR1cm4gZnVuY3Rpb24oZSxoKXtiLnN1YlZlY3RvcnMoZS5jZW50ZXIsdGhpcy5vcmlnaW4pO3ZhciBuPWIuZG90KHRoaXMuZGlyZWN0aW9uKSx1PWIuZG90KGIpLW4qbjtlPWUucmFkaXVzKmUucmFkaXVzO2lmKHU+ZSlyZXR1cm4gbnVsbDsKZT1NYXRoLnNxcnQoZS11KTt1PW4tZTtuKz1lO3JldHVybiAwPnUmJjA+bj9udWxsOjA+dT90aGlzLmF0KG4saCk6dGhpcy5hdCh1LGgpfX0oKSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGIuY2VudGVyKTw9Yi5yYWRpdXMqYi5yYWRpdXN9LGRpc3RhbmNlVG9QbGFuZTpmdW5jdGlvbihiKXt2YXIgZT1iLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09Yi5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtiPS0odGhpcy5vcmlnaW4uZG90KGIubm9ybWFsKStiLmNvbnN0YW50KS9lO3JldHVybiAwPD1iP2I6bnVsbH0saW50ZXJzZWN0UGxhbmU6ZnVuY3Rpb24oYixlKXtiPXRoaXMuZGlzdGFuY2VUb1BsYW5lKGIpO3JldHVybiBudWxsPT09Yj9udWxsOnRoaXMuYXQoYixlKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGIpe3ZhciBlPWIuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTsKcmV0dXJuIDA9PT1lfHwwPmIubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZT8hMDohMX0saW50ZXJzZWN0Qm94OmZ1bmN0aW9uKGIsZSl7dmFyIGg9MS90aGlzLmRpcmVjdGlvbi54O3ZhciBuPTEvdGhpcy5kaXJlY3Rpb24ueTt2YXIgdT0xL3RoaXMuZGlyZWN0aW9uLnosdz10aGlzLm9yaWdpbjtpZigwPD1oKXt2YXIgej0oYi5taW4ueC13LngpKmg7aCo9Yi5tYXgueC13Lnh9ZWxzZSB6PShiLm1heC54LXcueCkqaCxoKj1iLm1pbi54LXcueDtpZigwPD1uKXt2YXIgRT0oYi5taW4ueS13LnkpKm47bio9Yi5tYXgueS13Lnl9ZWxzZSBFPShiLm1heC55LXcueSkqbixuKj1iLm1pbi55LXcueTtpZih6Pm58fEU+aClyZXR1cm4gbnVsbDtpZihFPnp8fHohPT16KXo9RTtpZihuPGh8fGghPT1oKWg9bjswPD11PyhFPShiLm1pbi56LXcueikqdSxiPShiLm1heC56LXcueikqdSk6KEU9KGIubWF4Lnotdy56KSp1LGI9KGIubWluLnotdy56KSp1KTtpZih6PmJ8fEU+aClyZXR1cm4gbnVsbDsKaWYoRT56fHx6IT09eil6PUU7aWYoYjxofHxoIT09aCloPWI7cmV0dXJuIDA+aD9udWxsOnRoaXMuYXQoMDw9ej96OmgsZSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZztyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveChlLGIpfX0oKSxpbnRlcnNlY3RUcmlhbmdsZTpmdW5jdGlvbigpe3ZhciBiPW5ldyBnLGU9bmV3IGcsaD1uZXcgZyxuPW5ldyBnO3JldHVybiBmdW5jdGlvbih1LHcseixFLEgpe2Uuc3ViVmVjdG9ycyh3LHUpO2guc3ViVmVjdG9ycyh6LHUpO24uY3Jvc3NWZWN0b3JzKGUsaCk7dz10aGlzLmRpcmVjdGlvbi5kb3Qobik7aWYoMDx3KXtpZihFKXJldHVybiBudWxsO0U9MX1lbHNlIGlmKDA+dylFPS0xLHc9LXc7ZWxzZSByZXR1cm4gbnVsbDtiLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sdSk7dT1FKnRoaXMuZGlyZWN0aW9uLmRvdChoLmNyb3NzVmVjdG9ycyhiLGgpKTtpZigwPnUpcmV0dXJuIG51bGw7Cno9RSp0aGlzLmRpcmVjdGlvbi5kb3QoZS5jcm9zcyhiKSk7aWYoMD56fHx1K3o+dylyZXR1cm4gbnVsbDt1PS1FKmIuZG90KG4pO3JldHVybiAwPnU/bnVsbDp0aGlzLmF0KHUvdyxIKX19KCksYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGIpe3RoaXMub3JpZ2luLmFwcGx5TWF0cml4NChiKTt0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oYik7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmYi5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX19KTtPYmplY3QuYXNzaWduKENiLHtnZXROb3JtYWw6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZztyZXR1cm4gZnVuY3Rpb24oZSxoLG4sdSl7dm9pZCAwPT09dSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksdT1uZXcgZyk7dS5zdWJWZWN0b3JzKG4saCk7Yi5zdWJWZWN0b3JzKGUsCmgpO3UuY3Jvc3MoYik7ZT11Lmxlbmd0aFNxKCk7cmV0dXJuIDA8ZT91Lm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KGUpKTp1LnNldCgwLDAsMCl9fSgpLGdldEJhcnljb29yZDpmdW5jdGlvbigpe3ZhciBiPW5ldyBnLGU9bmV3IGcsaD1uZXcgZztyZXR1cm4gZnVuY3Rpb24obix1LHcseixFKXtiLnN1YlZlY3RvcnMoeix1KTtlLnN1YlZlY3RvcnModyx1KTtoLnN1YlZlY3RvcnMobix1KTtuPWIuZG90KGIpO3U9Yi5kb3QoZSk7dz1iLmRvdChoKTt2YXIgSD1lLmRvdChlKTt6PWUuZG90KGgpO3ZhciBJPW4qSC11KnU7dm9pZCAwPT09RSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRCYXJ5Y29vcmQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksRT1uZXcgZyk7aWYoMD09PUkpcmV0dXJuIEUuc2V0KC0yLC0xLC0xKTtJPTEvSTtIPShIKnctdSp6KSpJO249KG4qei11KncpKkk7cmV0dXJuIEUuc2V0KDEtSC1uLG4sSCl9fSgpLGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oKXt2YXIgYj0KbmV3IGc7cmV0dXJuIGZ1bmN0aW9uKGUsaCxuLHUpe0NiLmdldEJhcnljb29yZChlLGgsbix1LGIpO3JldHVybiAwPD1iLngmJjA8PWIueSYmMT49Yi54K2IueX19KCksZ2V0VVY6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZztyZXR1cm4gZnVuY3Rpb24oZSxoLG4sdSx3LHosRSxIKXt0aGlzLmdldEJhcnljb29yZChlLGgsbix1LGIpO0guc2V0KDAsMCk7SC5hZGRTY2FsZWRWZWN0b3IodyxiLngpO0guYWRkU2NhbGVkVmVjdG9yKHosYi55KTtILmFkZFNjYWxlZFZlY3RvcihFLGIueik7cmV0dXJuIEh9fSgpfSk7T2JqZWN0LmFzc2lnbihDYi5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUsaCl7dGhpcy5hLmNvcHkoYik7dGhpcy5iLmNvcHkoZSk7dGhpcy5jLmNvcHkoaCk7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHNBbmRJbmRpY2VzOmZ1bmN0aW9uKGIsZSxoLG4pe3RoaXMuYS5jb3B5KGJbZV0pO3RoaXMuYi5jb3B5KGJbaF0pO3RoaXMuYy5jb3B5KGJbbl0pO3JldHVybiB0aGlzfSwKY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5hLmNvcHkoYi5hKTt0aGlzLmIuY29weShiLmIpO3RoaXMuYy5jb3B5KGIuYyk7cmV0dXJuIHRoaXN9LGdldEFyZWE6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZyxlPW5ldyBnO3JldHVybiBmdW5jdGlvbigpe2Iuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKTtlLnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYik7cmV0dXJuLjUqYi5jcm9zcyhlKS5sZW5ndGgoKX19KCksZ2V0TWlkcG9pbnQ6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTtyZXR1cm4gYi5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9LGdldE5vcm1hbDpmdW5jdGlvbihiKXtyZXR1cm4gQ2IuZ2V0Tm9ybWFsKHRoaXMuYSwKdGhpcy5iLHRoaXMuYyxiKX0sZ2V0UGxhbmU6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRQbGFuZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTtyZXR1cm4gYi5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfSxnZXRCYXJ5Y29vcmQ6ZnVuY3Rpb24oYixlKXtyZXR1cm4gQ2IuZ2V0QmFyeWNvb3JkKGIsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIENiLmNvbnRhaW5zUG9pbnQoYix0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGdldFVWOmZ1bmN0aW9uKGIsZSxoLG4sdSl7cmV0dXJuIENiLmdldFVWKGIsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxoLG4sdSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKCl7dmFyIGI9Cm5ldyBnLGU9bmV3IGcsaD1uZXcgZyxuPW5ldyBnLHU9bmV3IGcsdz1uZXcgZztyZXR1cm4gZnVuY3Rpb24oeixFKXt2b2lkIDA9PT1FJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksRT1uZXcgZyk7dmFyIEg9dGhpcy5hLEk9dGhpcy5iLE89dGhpcy5jO2Iuc3ViVmVjdG9ycyhJLEgpO2Uuc3ViVmVjdG9ycyhPLEgpO24uc3ViVmVjdG9ycyh6LEgpO3ZhciBRPWIuZG90KG4pLFI9ZS5kb3Qobik7aWYoMD49USYmMD49UilyZXR1cm4gRS5jb3B5KEgpO3Uuc3ViVmVjdG9ycyh6LEkpO3ZhciBVPWIuZG90KHUpLFc9ZS5kb3QodSk7aWYoMDw9VSYmVzw9VSlyZXR1cm4gRS5jb3B5KEkpO3ZhciBaPVEqVy1VKlI7aWYoMD49WiYmMDw9USYmMD49VSlyZXR1cm4gST1RLyhRLVUpLEUuY29weShIKS5hZGRTY2FsZWRWZWN0b3IoYixJKTt3LnN1YlZlY3RvcnMoeixPKTt6PWIuZG90KHcpO3ZhciBmYT0KZS5kb3Qodyk7aWYoMDw9ZmEmJno8PWZhKXJldHVybiBFLmNvcHkoTyk7UT16KlItUSpmYTtpZigwPj1RJiYwPD1SJiYwPj1mYSlyZXR1cm4gWj1SLyhSLWZhKSxFLmNvcHkoSCkuYWRkU2NhbGVkVmVjdG9yKGUsWik7Uj1VKmZhLXoqVztpZigwPj1SJiYwPD1XLVUmJjA8PXotZmEpcmV0dXJuIGguc3ViVmVjdG9ycyhPLEkpLFo9KFctVSkvKFctVSsoei1mYSkpLEUuY29weShJKS5hZGRTY2FsZWRWZWN0b3IoaCxaKTtPPTEvKFIrUStaKTtJPVEqTztaKj1PO3JldHVybiBFLmNvcHkoSCkuYWRkU2NhbGVkVmVjdG9yKGIsSSkuYWRkU2NhbGVkVmVjdG9yKGUsWil9fSgpLGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5hLmVxdWFscyh0aGlzLmEpJiZiLmIuZXF1YWxzKHRoaXMuYikmJmIuYy5lcXVhbHModGhpcy5jKX19KTt5Yi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShHYS5wcm90b3R5cGUpO3liLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj15Yjt5Yi5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbD0KITA7eWIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7R2EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuY29sb3IuY29weShiLmNvbG9yKTt0aGlzLm1hcD1iLm1hcDt0aGlzLmxpZ2h0TWFwPWIubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1iLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9Yi5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWIuYW9NYXBJbnRlbnNpdHk7dGhpcy5zcGVjdWxhck1hcD1iLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9Yi5hbHBoYU1hcDt0aGlzLmVudk1hcD1iLmVudk1hcDt0aGlzLmNvbWJpbmU9Yi5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWIucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWIucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMud2lyZWZyYW1lTGluZWNhcD1iLndpcmVmcmFtZUxpbmVjYXA7CnRoaXMud2lyZWZyYW1lTGluZWpvaW49Yi53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWIuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9Yi5tb3JwaFRhcmdldHM7cmV0dXJuIHRoaXN9O3RiLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp0Yixpc01lc2g6ITAsc2V0RHJhd01vZGU6ZnVuY3Rpb24oYil7dGhpcy5kcmF3TW9kZT1ifSxjb3B5OmZ1bmN0aW9uKGIpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZHJhd01vZGU9Yi5kcmF3TW9kZTt2b2lkIDAhPT1iLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPWIubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpO3ZvaWQgMCE9PWIubW9ycGhUYXJnZXREaWN0aW9uYXJ5JiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSxiLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpOwpyZXR1cm4gdGhpc30sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZW9tZXRyeTtpZihiLmlzQnVmZmVyR2VvbWV0cnkpe2I9Yi5tb3JwaEF0dHJpYnV0ZXM7dmFyIGU9T2JqZWN0LmtleXMoYik7aWYoMDxlLmxlbmd0aCl7dmFyIGg9YltlWzBdXTtpZih2b2lkIDAhPT1oKWZvcih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fSxiPTAsZT1oLmxlbmd0aDtiPGU7YisrKXt2YXIgbj1oW2JdLm5hbWV8fFN0cmluZyhiKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApO3RoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W25dPWJ9fX1lbHNlIGI9Yi5tb3JwaFRhcmdldHMsdm9pZCAwIT09YiYmMDxiLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfSwKcmF5Y2FzdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoaWEsdGEsbmEsdmEsQmEsc2EsRGEsSGEpe2lmKG51bGw9PT0oMT09PXRhLnNpZGU/dmEuaW50ZXJzZWN0VHJpYW5nbGUoRGEsc2EsQmEsITAsSGEpOnZhLmludGVyc2VjdFRyaWFuZ2xlKEJhLHNhLERhLDIhPT10YS5zaWRlLEhhKSkpcmV0dXJuIG51bGw7cmEuY29weShIYSk7cmEuYXBwbHlNYXRyaXg0KGlhLm1hdHJpeFdvcmxkKTt0YT1uYS5yYXkub3JpZ2luLmRpc3RhbmNlVG8ocmEpO3JldHVybiB0YTxuYS5uZWFyfHx0YT5uYS5mYXI/bnVsbDp7ZGlzdGFuY2U6dGEscG9pbnQ6cmEuY2xvbmUoKSxvYmplY3Q6aWF9fWZ1bmN0aW9uIGUoaWEsdGEsbmEsdmEsQmEsc2EsRGEsSGEsS2EsTmEpe3cuZnJvbUJ1ZmZlckF0dHJpYnV0ZShCYSxIYSk7ei5mcm9tQnVmZmVyQXR0cmlidXRlKEJhLEthKTtFLmZyb21CdWZmZXJBdHRyaWJ1dGUoQmEsTmEpO0JhPWlhLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZih0YS5tb3JwaFRhcmdldHMmJgpzYSYmQmEpe1Euc2V0KDAsMCwwKTtSLnNldCgwLDAsMCk7VS5zZXQoMCwwLDApO2Zvcih2YXIgTGE9MCxmYj1zYS5sZW5ndGg7TGE8ZmI7TGErKyl7dmFyIGNiPUJhW0xhXSxKYT1zYVtMYV07MCE9PWNiJiYoSC5mcm9tQnVmZmVyQXR0cmlidXRlKEphLEhhKSxJLmZyb21CdWZmZXJBdHRyaWJ1dGUoSmEsS2EpLE8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShKYSxOYSksUS5hZGRTY2FsZWRWZWN0b3IoSC5zdWIodyksY2IpLFIuYWRkU2NhbGVkVmVjdG9yKEkuc3ViKHopLGNiKSxVLmFkZFNjYWxlZFZlY3RvcihPLnN1YihFKSxjYikpfXcuYWRkKFEpO3ouYWRkKFIpO0UuYWRkKFUpfWlmKGlhPWIoaWEsdGEsbmEsdmEsdyx6LEUscWEpKURhJiYoVy5mcm9tQnVmZmVyQXR0cmlidXRlKERhLEhhKSxaLmZyb21CdWZmZXJBdHRyaWJ1dGUoRGEsS2EpLGZhLmZyb21CdWZmZXJBdHRyaWJ1dGUoRGEsTmEpLGlhLnV2PUNiLmdldFVWKHFhLHcseixFLFcsWixmYSxuZXcgZCkpLERhPW5ldyBMKEhhLEthLApOYSksQ2IuZ2V0Tm9ybWFsKHcseixFLERhLm5vcm1hbCksaWEuZmFjZT1EYTtyZXR1cm4gaWF9dmFyIGg9bmV3IEMsbj1uZXcgeGIsdT1uZXcgQSx3PW5ldyBnLHo9bmV3IGcsRT1uZXcgZyxIPW5ldyBnLEk9bmV3IGcsTz1uZXcgZyxRPW5ldyBnLFI9bmV3IGcsVT1uZXcgZyxXPW5ldyBkLFo9bmV3IGQsZmE9bmV3IGQscWE9bmV3IGcscmE9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKGlhLHRhKXt2YXIgbmE9dGhpcy5nZW9tZXRyeSx2YT10aGlzLm1hdGVyaWFsLEJhPXRoaXMubWF0cml4V29ybGQ7aWYodm9pZCAwIT09dmEmJihudWxsPT09bmEuYm91bmRpbmdTcGhlcmUmJm5hLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHUuY29weShuYS5ib3VuZGluZ1NwaGVyZSksdS5hcHBseU1hdHJpeDQoQmEpLCExIT09aWEucmF5LmludGVyc2VjdHNTcGhlcmUodSkmJihoLmdldEludmVyc2UoQmEpLG4uY29weShpYS5yYXkpLmFwcGx5TWF0cml4NChoKSxudWxsPT09bmEuYm91bmRpbmdCb3h8fCExIT09Cm4uaW50ZXJzZWN0c0JveChuYS5ib3VuZGluZ0JveCkpKSlpZihuYS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgc2E9bmEuaW5kZXg7QmE9bmEuYXR0cmlidXRlcy5wb3NpdGlvbjt2YXIgRGE9bmEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLEhhPW5hLmF0dHJpYnV0ZXMudXYsS2E9bmEuZ3JvdXBzLE5hPW5hLmRyYXdSYW5nZSxMYSxmYjtpZihudWxsIT09c2EpaWYoQXJyYXkuaXNBcnJheSh2YSkpe3ZhciBjYj0wO2ZvcihMYT1LYS5sZW5ndGg7Y2I8TGE7Y2IrKyl7dmFyIEphPUthW2NiXTt2YXIgaGI9dmFbSmEubWF0ZXJpYWxJbmRleF07dmFyIFVhPU1hdGgubWF4KEphLnN0YXJ0LE5hLnN0YXJ0KTtmb3IoZmI9bmE9TWF0aC5taW4oSmEuc3RhcnQrSmEuY291bnQsTmEuc3RhcnQrTmEuY291bnQpO1VhPGZiO1VhKz0zKXtuYT1zYS5nZXRYKFVhKTt2YXIgSGI9c2EuZ2V0WChVYSsxKTt2YXIgcWI9c2EuZ2V0WChVYSsyKTtpZihuYT1lKHRoaXMsaGIsaWEsbixCYSxEYSxIYSxuYSxIYiwKcWIpKW5hLmZhY2VJbmRleD1NYXRoLmZsb29yKFVhLzMpLG5hLmZhY2UubWF0ZXJpYWxJbmRleD1KYS5tYXRlcmlhbEluZGV4LHRhLnB1c2gobmEpfX19ZWxzZSBmb3IoVWE9TWF0aC5tYXgoMCxOYS5zdGFydCksbmE9TWF0aC5taW4oc2EuY291bnQsTmEuc3RhcnQrTmEuY291bnQpLGNiPVVhLExhPW5hO2NiPExhO2NiKz0zKXtpZihuYT1zYS5nZXRYKGNiKSxIYj1zYS5nZXRYKGNiKzEpLHFiPXNhLmdldFgoY2IrMiksbmE9ZSh0aGlzLHZhLGlhLG4sQmEsRGEsSGEsbmEsSGIscWIpKW5hLmZhY2VJbmRleD1NYXRoLmZsb29yKGNiLzMpLHRhLnB1c2gobmEpfWVsc2UgaWYodm9pZCAwIT09QmEpaWYoQXJyYXkuaXNBcnJheSh2YSkpZm9yKGNiPTAsTGE9S2EubGVuZ3RoO2NiPExhO2NiKyspZm9yKEphPUthW2NiXSxoYj12YVtKYS5tYXRlcmlhbEluZGV4XSxVYT1NYXRoLm1heChKYS5zdGFydCxOYS5zdGFydCksZmI9bmE9TWF0aC5taW4oSmEuc3RhcnQrSmEuY291bnQsTmEuc3RhcnQrCk5hLmNvdW50KTtVYTxmYjtVYSs9Myl7aWYobmE9VWEsSGI9VWErMSxxYj1VYSsyLG5hPWUodGhpcyxoYixpYSxuLEJhLERhLEhhLG5hLEhiLHFiKSluYS5mYWNlSW5kZXg9TWF0aC5mbG9vcihVYS8zKSxuYS5mYWNlLm1hdGVyaWFsSW5kZXg9SmEubWF0ZXJpYWxJbmRleCx0YS5wdXNoKG5hKX1lbHNlIGZvcihVYT1NYXRoLm1heCgwLE5hLnN0YXJ0KSxuYT1NYXRoLm1pbihCYS5jb3VudCxOYS5zdGFydCtOYS5jb3VudCksY2I9VWEsTGE9bmE7Y2I8TGE7Y2IrPTMpaWYobmE9Y2IsSGI9Y2IrMSxxYj1jYisyLG5hPWUodGhpcyx2YSxpYSxuLEJhLERhLEhhLG5hLEhiLHFiKSluYS5mYWNlSW5kZXg9TWF0aC5mbG9vcihjYi8zKSx0YS5wdXNoKG5hKX1lbHNlIGlmKG5hLmlzR2VvbWV0cnkpZm9yKEJhPUFycmF5LmlzQXJyYXkodmEpLERhPW5hLnZlcnRpY2VzLEhhPW5hLmZhY2VzLG5hPW5hLmZhY2VWZXJ0ZXhVdnNbMF0sMDxuYS5sZW5ndGgmJihzYT1uYSksTGE9MCxKYT1IYS5sZW5ndGg7TGE8CkphO0xhKyspaWYoaGI9SGFbTGFdLG5hPUJhP3ZhW2hiLm1hdGVyaWFsSW5kZXhdOnZhLHZvaWQgMCE9PW5hJiYoS2E9RGFbaGIuYV0sTmE9RGFbaGIuYl0sY2I9RGFbaGIuY10sbmE9Yih0aGlzLG5hLGlhLG4sS2EsTmEsY2IscWEpKSlzYSYmc2FbTGFdJiYoVWE9c2FbTGFdLFcuY29weShVYVswXSksWi5jb3B5KFVhWzFdKSxmYS5jb3B5KFVhWzJdKSxuYS51dj1DYi5nZXRVVihxYSxLYSxOYSxjYixXLFosZmEsbmV3IGQpKSxuYS5mYWNlPWhiLG5hLmZhY2VJbmRleD1MYSx0YS5wdXNoKG5hKX19KCksY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt1ZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShrLnByb3RvdHlwZSk7dWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXVkO3VkLnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlPSEwO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1ZC5wcm90b3R5cGUsCiJpbWFnZXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbWFnZX0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuaW1hZ2U9Yn19KTtLZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShrLnByb3RvdHlwZSk7S2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUtlO0tlLnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlMkRBcnJheT0hMDtMZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShrLnByb3RvdHlwZSk7TGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxlO0xlLnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlM0Q9ITA7dmFyIFlrPW5ldyBrLFpuPW5ldyBLZSxhbz1uZXcgTGUsWms9bmV3IHVkLFNrPVtdLFVrPVtdLFhrPW5ldyBGbG9hdDMyQXJyYXkoMTYpLFdrPW5ldyBGbG9hdDMyQXJyYXkoOSksVms9bmV3IEZsb2F0MzJBcnJheSg0KTtjbC5wcm90b3R5cGUudXBkYXRlQ2FjaGU9ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5jYWNoZTtiIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5JiZlLmxlbmd0aCE9PWIubGVuZ3RoJiYKKHRoaXMuY2FjaGU9bmV3IEZsb2F0MzJBcnJheShiLmxlbmd0aCkpO2tjKGUsYil9O2RsLnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbihiLGUsaCl7Zm9yKHZhciBuPXRoaXMuc2VxLHU9MCx3PW4ubGVuZ3RoO3UhPT13OysrdSl7dmFyIHo9blt1XTt6LnNldFZhbHVlKGIsZVt6LmlkXSxoKX19O3ZhciByaT0vKFtcd1xkX10rKShcXSk/KFxbfFwuKT8vZztPZC5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYixlLGgsbil7ZT10aGlzLm1hcFtlXTt2b2lkIDAhPT1lJiZlLnNldFZhbHVlKGIsaCxuKX07T2QucHJvdG90eXBlLnNldE9wdGlvbmFsPWZ1bmN0aW9uKGIsZSxoKXtlPWVbaF07dm9pZCAwIT09ZSYmdGhpcy5zZXRWYWx1ZShiLGgsZSl9O09kLnVwbG9hZD1mdW5jdGlvbihiLGUsaCxuKXtmb3IodmFyIHU9MCx3PWUubGVuZ3RoO3UhPT13OysrdSl7dmFyIHo9ZVt1XSxFPWhbei5pZF07ITEhPT1FLm5lZWRzVXBkYXRlJiZ6LnNldFZhbHVlKGIsRS52YWx1ZSxuKX19O09kLnNlcVdpdGhWYWx1ZT0KZnVuY3Rpb24oYixlKXtmb3IodmFyIGg9W10sbj0wLHU9Yi5sZW5ndGg7biE9PXU7KytuKXt2YXIgdz1iW25dO3cuaWQgaW4gZSYmaC5wdXNoKHcpfXJldHVybiBofTt2YXIgeW89MCxHbz0wO1BkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEdhLnByb3RvdHlwZSk7UGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVBkO1BkLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsPSEwO1BkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe0dhLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmRlcHRoUGFja2luZz1iLmRlcHRoUGFja2luZzt0aGlzLnNraW5uaW5nPWIuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9Yi5tb3JwaFRhcmdldHM7dGhpcy5tYXA9Yi5tYXA7dGhpcy5hbHBoYU1hcD1iLmFscGhhTWFwO3RoaXMuZGlzcGxhY2VtZW50TWFwPWIuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9CmIuZGlzcGxhY2VtZW50Qmlhczt0aGlzLndpcmVmcmFtZT1iLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1iLndpcmVmcmFtZUxpbmV3aWR0aDtyZXR1cm4gdGhpc307UWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoR2EucHJvdG90eXBlKTtRZC5wcm90b3R5cGUuY29uc3RydWN0b3I9UWQ7UWQucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITA7UWQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7R2EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weShiLnJlZmVyZW5jZVBvc2l0aW9uKTt0aGlzLm5lYXJEaXN0YW5jZT1iLm5lYXJEaXN0YW5jZTt0aGlzLmZhckRpc3RhbmNlPWIuZmFyRGlzdGFuY2U7dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzO3RoaXMubWFwPWIubWFwO3RoaXMuYWxwaGFNYXA9Yi5hbHBoYU1hcDt0aGlzLmRpc3BsYWNlbWVudE1hcD0KYi5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1iLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1iLmRpc3BsYWNlbWVudEJpYXM7cmV0dXJuIHRoaXN9O05lLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpOZSxpc0dyb3VwOiEwfSk7amQucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmpkLGlzQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYixlKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiLGUpO3RoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoYi5tYXRyaXhXb3JsZEludmVyc2UpO3RoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KGIucHJvamVjdGlvbk1hdHJpeCk7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KGIucHJvamVjdGlvbk1hdHJpeEludmVyc2UpO3JldHVybiB0aGlzfSwKZ2V0V29ybGREaXJlY3Rpb246ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuQ2FtZXJhOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZyk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7dmFyIGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gYi5zZXQoLWVbOF0sLWVbOV0sLWVbMTBdKS5ub3JtYWxpemUoKX0sdXBkYXRlTWF0cml4V29ybGQ6ZnVuY3Rpb24oYil7Uy5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGIpO3RoaXMubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UodGhpcy5tYXRyaXhXb3JsZCl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX0pO2NjLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoamQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6Y2MsaXNQZXJzcGVjdGl2ZUNhbWVyYTohMCwKY29weTpmdW5jdGlvbihiLGUpe2pkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiLGUpO3RoaXMuZm92PWIuZm92O3RoaXMuem9vbT1iLnpvb207dGhpcy5uZWFyPWIubmVhcjt0aGlzLmZhcj1iLmZhcjt0aGlzLmZvY3VzPWIuZm9jdXM7dGhpcy5hc3BlY3Q9Yi5hc3BlY3Q7dGhpcy52aWV3PW51bGw9PT1iLnZpZXc/bnVsbDpPYmplY3QuYXNzaWduKHt9LGIudmlldyk7dGhpcy5maWxtR2F1Z2U9Yi5maWxtR2F1Z2U7dGhpcy5maWxtT2Zmc2V0PWIuZmlsbU9mZnNldDtyZXR1cm4gdGhpc30sc2V0Rm9jYWxMZW5ndGg6ZnVuY3Rpb24oYil7dGhpcy5mb3Y9MipvYi5SQUQyREVHKk1hdGguYXRhbiguNSp0aGlzLmdldEZpbG1IZWlnaHQoKS9iKTt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sZ2V0Rm9jYWxMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4uNSp0aGlzLmdldEZpbG1IZWlnaHQoKS9NYXRoLnRhbiguNSpvYi5ERUcyUkFEKnRoaXMuZm92KX0sZ2V0RWZmZWN0aXZlRk9WOmZ1bmN0aW9uKCl7cmV0dXJuIDIqCm9iLlJBRDJERUcqTWF0aC5hdGFuKE1hdGgudGFuKC41Km9iLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSl9LGdldEZpbG1XaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbG1HYXVnZSpNYXRoLm1pbih0aGlzLmFzcGVjdCwxKX0sZ2V0RmlsbUhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbG1HYXVnZS9NYXRoLm1heCh0aGlzLmFzcGVjdCwxKX0sc2V0Vmlld09mZnNldDpmdW5jdGlvbihiLGUsaCxuLHUsdyl7dGhpcy5hc3BlY3Q9Yi9lO251bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pO3RoaXMudmlldy5lbmFibGVkPSEwO3RoaXMudmlldy5mdWxsV2lkdGg9Yjt0aGlzLnZpZXcuZnVsbEhlaWdodD1lO3RoaXMudmlldy5vZmZzZXRYPWg7dGhpcy52aWV3Lm9mZnNldFk9bjt0aGlzLnZpZXcud2lkdGg9dTt0aGlzLnZpZXcuaGVpZ2h0PQp3O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSx1cGRhdGVQcm9qZWN0aW9uTWF0cml4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZWFyLGU9YipNYXRoLnRhbiguNSpvYi5ERUcyUkFEKnRoaXMuZm92KS90aGlzLnpvb20saD0yKmUsbj10aGlzLmFzcGVjdCpoLHU9LS41Km4sdz10aGlzLnZpZXc7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe3ZhciB6PXcuZnVsbFdpZHRoLEU9dy5mdWxsSGVpZ2h0O3UrPXcub2Zmc2V0WCpuL3o7ZS09dy5vZmZzZXRZKmgvRTtuKj13LndpZHRoL3o7aCo9dy5oZWlnaHQvRX13PXRoaXMuZmlsbU9mZnNldDswIT09dyYmKHUrPWIqdy90aGlzLmdldEZpbG1XaWR0aCgpKTt0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHUsdSsKbixlLGUtaCxiLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sdG9KU09OOmZ1bmN0aW9uKGIpe2I9Uy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTtiLm9iamVjdC5mb3Y9dGhpcy5mb3Y7Yi5vYmplY3Quem9vbT10aGlzLnpvb207Yi5vYmplY3QubmVhcj10aGlzLm5lYXI7Yi5vYmplY3QuZmFyPXRoaXMuZmFyO2Iub2JqZWN0LmZvY3VzPXRoaXMuZm9jdXM7Yi5vYmplY3QuYXNwZWN0PXRoaXMuYXNwZWN0O251bGwhPT10aGlzLnZpZXcmJihiLm9iamVjdC52aWV3PU9iamVjdC5hc3NpZ24oe30sdGhpcy52aWV3KSk7Yi5vYmplY3QuZmlsbUdhdWdlPXRoaXMuZmlsbUdhdWdlO2Iub2JqZWN0LmZpbG1PZmZzZXQ9dGhpcy5maWxtT2Zmc2V0O3JldHVybiBifX0pO1BmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoY2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UGYsaXNBcnJheUNhbWVyYTohMH0pOwp2YXIgcGw9bmV3IGcscWw9bmV3IGc7T2JqZWN0LmFzc2lnbihnaC5wcm90b3R5cGUse2lzRm9nRXhwMjohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgZ2godGhpcy5jb2xvcix0aGlzLmRlbnNpdHkpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fSk7T2JqZWN0LmFzc2lnbihoaC5wcm90b3R5cGUse2lzRm9nOiEwLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBoaCh0aGlzLmNvbG9yLHRoaXMubmVhcix0aGlzLmZhcil9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJGb2ciLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksbmVhcjp0aGlzLm5lYXIsZmFyOnRoaXMuZmFyfX19KTtpaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6aWgsaXNTY2VuZTohMCxjb3B5OmZ1bmN0aW9uKGIsCmUpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIsZSk7bnVsbCE9PWIuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD1iLmJhY2tncm91bmQuY2xvbmUoKSk7bnVsbCE9PWIuZm9nJiYodGhpcy5mb2c9Yi5mb2cuY2xvbmUoKSk7bnVsbCE9PWIub3ZlcnJpZGVNYXRlcmlhbCYmKHRoaXMub3ZlcnJpZGVNYXRlcmlhbD1iLm92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKSk7dGhpcy5hdXRvVXBkYXRlPWIuYXV0b1VwZGF0ZTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9Yi5tYXRyaXhBdXRvVXBkYXRlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYil7dmFyIGU9Uy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTtudWxsIT09dGhpcy5iYWNrZ3JvdW5kJiYoZS5vYmplY3QuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKGIpKTtudWxsIT09dGhpcy5mb2cmJihlLm9iamVjdC5mb2c9dGhpcy5mb2cudG9KU09OKCkpO3JldHVybiBlfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydHkoaGUucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihiKXshMD09PWImJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oaGUucHJvdG90eXBlLHtpc0ludGVybGVhdmVkQnVmZmVyOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGIpe2lmKEFycmF5LmlzQXJyYXkoYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmNvdW50PXZvaWQgMCE9PWI/Yi5sZW5ndGgvdGhpcy5zdHJpZGU6MDt0aGlzLmFycmF5PWI7cmV0dXJuIHRoaXN9LHNldER5bmFtaWM6ZnVuY3Rpb24oYil7dGhpcy5keW5hbWljPWI7cmV0dXJuIHRoaXN9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5hcnJheT1uZXcgYi5hcnJheS5jb25zdHJ1Y3RvcihiLmFycmF5KTt0aGlzLmNvdW50PWIuY291bnQ7dGhpcy5zdHJpZGU9CmIuc3RyaWRlO3RoaXMuZHluYW1pYz1iLmR5bmFtaWM7cmV0dXJuIHRoaXN9LGNvcHlBdDpmdW5jdGlvbihiLGUsaCl7Yio9dGhpcy5zdHJpZGU7aCo9ZS5zdHJpZGU7Zm9yKHZhciBuPTAsdT10aGlzLnN0cmlkZTtuPHU7bisrKXRoaXMuYXJyYXlbYituXT1lLmFycmF5W2grbl07cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO3RoaXMuYXJyYXkuc2V0KGIsZSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxvblVwbG9hZDpmdW5jdGlvbihiKXt0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9YjtyZXR1cm4gdGhpc319KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZi5wcm90b3R5cGUse2NvdW50OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLmNvdW50fX0sYXJyYXk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEuYXJyYXl9fX0pO09iamVjdC5hc3NpZ24oUmYucHJvdG90eXBlLAp7aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTohMCxzZXRYOmZ1bmN0aW9uKGIsZSl7dGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF09ZTtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihiLGUpe3RoaXMuZGF0YS5hcnJheVtiKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZTtyZXR1cm4gdGhpc30sc2V0WjpmdW5jdGlvbihiLGUpe3RoaXMuZGF0YS5hcnJheVtiKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09ZTtyZXR1cm4gdGhpc30sc2V0VzpmdW5jdGlvbihiLGUpe3RoaXMuZGF0YS5hcnJheVtiKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrM109ZTtyZXR1cm4gdGhpc30sZ2V0WDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF19LGdldFk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVtiKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrCjFdfSxnZXRaOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdfSxnZXRXOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdfSxzZXRYWTpmdW5jdGlvbihiLGUsaCl7Yj1iKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2IrMF09ZTt0aGlzLmRhdGEuYXJyYXlbYisxXT1oO3JldHVybiB0aGlzfSxzZXRYWVo6ZnVuY3Rpb24oYixlLGgsbil7Yj1iKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2IrMF09ZTt0aGlzLmRhdGEuYXJyYXlbYisxXT1oO3RoaXMuZGF0YS5hcnJheVtiKzJdPW47cmV0dXJuIHRoaXN9LHNldFhZWlc6ZnVuY3Rpb24oYixlLGgsbix1KXtiPWIqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDt0aGlzLmRhdGEuYXJyYXlbYiswXT1lO3RoaXMuZGF0YS5hcnJheVtiKwoxXT1oO3RoaXMuZGF0YS5hcnJheVtiKzJdPW47dGhpcy5kYXRhLmFycmF5W2IrM109dTtyZXR1cm4gdGhpc319KTtWZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShHYS5wcm90b3R5cGUpO1ZkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1WZDtWZC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbD0hMDtWZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtHYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMubWFwPWIubWFwO3RoaXMucm90YXRpb249Yi5yb3RhdGlvbjt0aGlzLnNpemVBdHRlbnVhdGlvbj1iLnNpemVBdHRlbnVhdGlvbjtyZXR1cm4gdGhpc307dmFyIFFlO1NmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpTZixpc1Nwcml0ZTohMCxyYXljYXN0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihVLFcsWixmYSxxYSxyYSl7dS5zdWJWZWN0b3JzKFUsWikuYWRkU2NhbGFyKC41KS5tdWx0aXBseShmYSk7CnZvaWQgMCE9PXFhPyh3Lng9cmEqdS54LXFhKnUueSx3Lnk9cWEqdS54K3JhKnUueSk6dy5jb3B5KHUpO1UuY29weShXKTtVLngrPXcueDtVLnkrPXcueTtVLmFwcGx5TWF0cml4NCh6KX12YXIgZT1uZXcgZyxoPW5ldyBnLG49bmV3IGcsdT1uZXcgZCx3PW5ldyBkLHo9bmV3IEMsRT1uZXcgZyxIPW5ldyBnLEk9bmV3IGcsTz1uZXcgZCxRPW5ldyBkLFI9bmV3IGQ7cmV0dXJuIGZ1bmN0aW9uKFUsVyl7aC5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCk7ei5nZXRJbnZlcnNlKHRoaXMubW9kZWxWaWV3TWF0cml4KS5wcmVtdWx0aXBseSh0aGlzLm1hdHJpeFdvcmxkKTtuLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1vZGVsVmlld01hdHJpeCk7dmFyIFo9dGhpcy5tYXRlcmlhbC5yb3RhdGlvbjtpZigwIT09Wil7dmFyIGZhPU1hdGguY29zKFopO3ZhciBxYT1NYXRoLnNpbihaKX1aPXRoaXMuY2VudGVyO2IoRS5zZXQoLS41LC0uNSwwKSxuLFosaCxxYSxmYSk7YihILnNldCguNSwKLS41LDApLG4sWixoLHFhLGZhKTtiKEkuc2V0KC41LC41LDApLG4sWixoLHFhLGZhKTtPLnNldCgwLDApO1Euc2V0KDEsMCk7Ui5zZXQoMSwxKTt2YXIgcmE9VS5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoRSxILEksITEsZSk7aWYobnVsbD09PXJhJiYoYihILnNldCgtLjUsLjUsMCksbixaLGgscWEsZmEpLFEuc2V0KDAsMSkscmE9VS5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoRSxJLEgsITEsZSksbnVsbD09PXJhKSlyZXR1cm47cWE9VS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oZSk7cWE8VS5uZWFyfHxxYT5VLmZhcnx8Vy5wdXNoKHtkaXN0YW5jZTpxYSxwb2ludDplLmNsb25lKCksdXY6Q2IuZ2V0VVYoZSxFLEgsSSxPLFEsUixuZXcgZCksZmFjZTpudWxsLG9iamVjdDp0aGlzfSl9fSgpLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubWF0ZXJpYWwpKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGIpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLApiKTt2b2lkIDAhPT1iLmNlbnRlciYmdGhpcy5jZW50ZXIuY29weShiLmNlbnRlcik7cmV0dXJuIHRoaXN9fSk7VGYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlRmLGlzTE9EOiEwLGNvcHk6ZnVuY3Rpb24oYil7Uy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYiwhMSk7Yj1iLmxldmVscztmb3IodmFyIGU9MCxoPWIubGVuZ3RoO2U8aDtlKyspe3ZhciBuPWJbZV07dGhpcy5hZGRMZXZlbChuLm9iamVjdC5jbG9uZSgpLG4uZGlzdGFuY2UpfXJldHVybiB0aGlzfSxhZGRMZXZlbDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO2U9TWF0aC5hYnMoZSk7Zm9yKHZhciBoPXRoaXMubGV2ZWxzLG49MDtuPGgubGVuZ3RoJiYhKGU8aFtuXS5kaXN0YW5jZSk7bisrKTtoLnNwbGljZShuLDAse2Rpc3RhbmNlOmUsb2JqZWN0OmJ9KTt0aGlzLmFkZChiKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0Rm9yRGlzdGFuY2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPQp0aGlzLmxldmVscyxoPTEsbj1lLmxlbmd0aDtoPG4mJiEoYjxlW2hdLmRpc3RhbmNlKTtoKyspO3JldHVybiBlW2gtMV0ub2JqZWN0fSxyYXljYXN0OmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKGUsaCl7Yi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZShlLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhiKSkucmF5Y2FzdChlLGgpfX0oKSx1cGRhdGU6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZyxlPW5ldyBnO3JldHVybiBmdW5jdGlvbihoKXt2YXIgbj10aGlzLmxldmVscztpZigxPG4ubGVuZ3RoKXtiLnNldEZyb21NYXRyaXhQb3NpdGlvbihoLm1hdHJpeFdvcmxkKTtlLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTtoPWIuZGlzdGFuY2VUbyhlKTtuWzBdLm9iamVjdC52aXNpYmxlPSEwO2Zvcih2YXIgdT0xLHc9bi5sZW5ndGg7dTx3O3UrKylpZihoPj1uW3VdLmRpc3RhbmNlKW5bdS0KMV0ub2JqZWN0LnZpc2libGU9ITEsblt1XS5vYmplY3QudmlzaWJsZT0hMDtlbHNlIGJyZWFrO2Zvcig7dTx3O3UrKyluW3VdLm9iamVjdC52aXNpYmxlPSExfX19KCksdG9KU09OOmZ1bmN0aW9uKGIpe2I9Uy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTtiLm9iamVjdC5sZXZlbHM9W107Zm9yKHZhciBlPXRoaXMubGV2ZWxzLGg9MCxuPWUubGVuZ3RoO2g8bjtoKyspe3ZhciB1PWVbaF07Yi5vYmplY3QubGV2ZWxzLnB1c2goe29iamVjdDp1Lm9iamVjdC51dWlkLGRpc3RhbmNlOnUuZGlzdGFuY2V9KX1yZXR1cm4gYn19KTtVZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHRiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVmLGlzU2tpbm5lZE1lc2g6ITAsYmluZDpmdW5jdGlvbihiLGUpe3RoaXMuc2tlbGV0b249Yjt2b2lkIDA9PT1lJiYodGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCksdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpLGU9CnRoaXMubWF0cml4V29ybGQpO3RoaXMuYmluZE1hdHJpeC5jb3B5KGUpO3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZShlKX0scG9zZTpmdW5jdGlvbigpe3RoaXMuc2tlbGV0b24ucG9zZSgpfSxub3JtYWxpemVTa2luV2VpZ2h0czpmdW5jdGlvbigpe2Zvcih2YXIgYj1uZXcgbSxlPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LGg9MCxuPWUuY291bnQ7aDxuO2grKyl7Yi54PWUuZ2V0WChoKTtiLnk9ZS5nZXRZKGgpO2Iuej1lLmdldFooaCk7Yi53PWUuZ2V0VyhoKTt2YXIgdT0xL2IubWFuaGF0dGFuTGVuZ3RoKCk7SW5maW5pdHkhPT11P2IubXVsdGlwbHlTY2FsYXIodSk6Yi5zZXQoMSwwLDAsMCk7ZS5zZXRYWVpXKGgsYi54LGIueSxiLnosYi53KX19LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGIpe3RiLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYik7ImF0dGFjaGVkIj09PXRoaXMuYmluZE1vZGU/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpOgoiZGV0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5iaW5kTWF0cml4KTpjb25zb2xlLndhcm4oIlRIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICIrdGhpcy5iaW5kTW9kZSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7T2JqZWN0LmFzc2lnbihqaC5wcm90b3R5cGUse2NhbGN1bGF0ZUludmVyc2VzOmZ1bmN0aW9uKCl7dGhpcy5ib25lSW52ZXJzZXM9W107Zm9yKHZhciBiPTAsZT10aGlzLmJvbmVzLmxlbmd0aDtiPGU7YisrKXt2YXIgaD1uZXcgQzt0aGlzLmJvbmVzW2JdJiZoLmdldEludmVyc2UodGhpcy5ib25lc1tiXS5tYXRyaXhXb3JsZCk7dGhpcy5ib25lSW52ZXJzZXMucHVzaChoKX19LHBvc2U6ZnVuY3Rpb24oKXt2YXIgYixlO3ZhciBoPTA7Zm9yKGU9dGhpcy5ib25lcy5sZW5ndGg7aDwKZTtoKyspKGI9dGhpcy5ib25lc1toXSkmJmIubWF0cml4V29ybGQuZ2V0SW52ZXJzZSh0aGlzLmJvbmVJbnZlcnNlc1toXSk7aD0wO2ZvcihlPXRoaXMuYm9uZXMubGVuZ3RoO2g8ZTtoKyspaWYoYj10aGlzLmJvbmVzW2hdKWIucGFyZW50JiZiLnBhcmVudC5pc0JvbmU/KGIubWF0cml4LmdldEludmVyc2UoYi5wYXJlbnQubWF0cml4V29ybGQpLGIubWF0cml4Lm11bHRpcGx5KGIubWF0cml4V29ybGQpKTpiLm1hdHJpeC5jb3B5KGIubWF0cml4V29ybGQpLGIubWF0cml4LmRlY29tcG9zZShiLnBvc2l0aW9uLGIucXVhdGVybmlvbixiLnNjYWxlKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IEMsZT1uZXcgQztyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGg9dGhpcy5ib25lcyxuPXRoaXMuYm9uZUludmVyc2VzLHU9dGhpcy5ib25lTWF0cmljZXMsdz10aGlzLmJvbmVUZXh0dXJlLHo9MCxFPWgubGVuZ3RoO3o8RTt6KyspYi5tdWx0aXBseU1hdHJpY2VzKGhbel0/aFt6XS5tYXRyaXhXb3JsZDoKZSxuW3pdKSxiLnRvQXJyYXkodSwxNip6KTt2b2lkIDAhPT13JiYody5uZWVkc1VwZGF0ZT0hMCl9fSgpLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBqaCh0aGlzLmJvbmVzLHRoaXMuYm9uZUludmVyc2VzKX0sZ2V0Qm9uZUJ5TmFtZTpmdW5jdGlvbihiKXtmb3IodmFyIGU9MCxoPXRoaXMuYm9uZXMubGVuZ3RoO2U8aDtlKyspe3ZhciBuPXRoaXMuYm9uZXNbZV07aWYobi5uYW1lPT09YilyZXR1cm4gbn19fSk7emkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnppLGlzQm9uZTohMH0pO0xiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEdhLnByb3RvdHlwZSk7TGIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxiO0xiLnByb3RvdHlwZS5pc0xpbmVCYXNpY01hdGVyaWFsPSEwO0xiLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe0dhLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmNvbG9yLmNvcHkoYi5jb2xvcik7CnRoaXMubGluZXdpZHRoPWIubGluZXdpZHRoO3RoaXMubGluZWNhcD1iLmxpbmVjYXA7dGhpcy5saW5lam9pbj1iLmxpbmVqb2luO3JldHVybiB0aGlzfTtsYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6bGMsaXNMaW5lOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGcsZT1uZXcgZztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLmdlb21ldHJ5O2lmKGguaXNCdWZmZXJHZW9tZXRyeSlpZihudWxsPT09aC5pbmRleCl7Zm9yKHZhciBuPWguYXR0cmlidXRlcy5wb3NpdGlvbix1PVswXSx3PTEsej1uLmNvdW50O3c8ejt3KyspYi5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdy0xKSxlLmZyb21CdWZmZXJBdHRyaWJ1dGUobix3KSx1W3ddPXVbdy0xXSx1W3ddKz1iLmRpc3RhbmNlVG8oZSk7aC5hZGRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGJhKHUsMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTsKZWxzZSBpZihoLmlzR2VvbWV0cnkpZm9yKG49aC52ZXJ0aWNlcyx1PWgubGluZURpc3RhbmNlcyx1WzBdPTAsdz0xLHo9bi5sZW5ndGg7dzx6O3crKyl1W3ddPXVbdy0xXSx1W3ddKz1uW3ctMV0uZGlzdGFuY2VUbyhuW3ddKTtyZXR1cm4gdGhpc319KCkscmF5Y2FzdDpmdW5jdGlvbigpe3ZhciBiPW5ldyBDLGU9bmV3IHhiLGg9bmV3IEE7cmV0dXJuIGZ1bmN0aW9uKG4sdSl7dmFyIHc9bi5saW5lUHJlY2lzaW9uLHo9dGhpcy5nZW9tZXRyeSxFPXRoaXMubWF0cml4V29ybGQ7bnVsbD09PXouYm91bmRpbmdTcGhlcmUmJnouY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7aC5jb3B5KHouYm91bmRpbmdTcGhlcmUpO2guYXBwbHlNYXRyaXg0KEUpO2gucmFkaXVzKz13O2lmKCExIT09bi5yYXkuaW50ZXJzZWN0c1NwaGVyZShoKSl7Yi5nZXRJbnZlcnNlKEUpO2UuY29weShuLnJheSkuYXBwbHlNYXRyaXg0KGIpO3cvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvCjM7dyo9dzt2YXIgSD1uZXcgZyxJPW5ldyBnO0U9bmV3IGc7dmFyIE89bmV3IGcsUT10aGlzJiZ0aGlzLmlzTGluZVNlZ21lbnRzPzI6MTtpZih6LmlzQnVmZmVyR2VvbWV0cnkpe3ZhciBSPXouaW5kZXgsVT16LmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7aWYobnVsbCE9PVIpe1I9Ui5hcnJheTt6PTA7Zm9yKHZhciBXPVIubGVuZ3RoLTE7ejxXO3orPVEpe3ZhciBaPVJbeisxXTtILmZyb21BcnJheShVLDMqUlt6XSk7SS5mcm9tQXJyYXkoVSwzKlopO1o9ZS5kaXN0YW5jZVNxVG9TZWdtZW50KEgsSSxPLEUpO1o+d3x8KE8uYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLFo9bi5yYXkub3JpZ2luLmRpc3RhbmNlVG8oTyksWjxuLm5lYXJ8fFo+bi5mYXJ8fHUucHVzaCh7ZGlzdGFuY2U6Wixwb2ludDpFLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OnosZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfX1lbHNlIGZvcih6PQowLFc9VS5sZW5ndGgvMy0xO3o8Vzt6Kz1RKUguZnJvbUFycmF5KFUsMyp6KSxJLmZyb21BcnJheShVLDMqeiszKSxaPWUuZGlzdGFuY2VTcVRvU2VnbWVudChILEksTyxFKSxaPnd8fChPLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxaPW4ucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKE8pLFo8bi5uZWFyfHxaPm4uZmFyfHx1LnB1c2goe2Rpc3RhbmNlOloscG9pbnQ6RS5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDp6LGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX1lbHNlIGlmKHouaXNHZW9tZXRyeSlmb3IoSD16LnZlcnRpY2VzLEk9SC5sZW5ndGgsej0wO3o8SS0xO3orPVEpWj1lLmRpc3RhbmNlU3FUb1NlZ21lbnQoSFt6XSxIW3orMV0sTyxFKSxaPnd8fChPLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxaPW4ucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKE8pLFo8bi5uZWFyfHxaPm4uZmFyfHx1LnB1c2goe2Rpc3RhbmNlOlosCnBvaW50OkUuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksaW5kZXg6eixmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KSl9fX0oKSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmdlb21ldHJ5LHRoaXMubWF0ZXJpYWwpKS5jb3B5KHRoaXMpfX0pO1BiLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UGIsaXNMaW5lU2VnbWVudHM6ITAsY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZyxlPW5ldyBnO3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMuZ2VvbWV0cnk7aWYoaC5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT1oLmluZGV4KXtmb3IodmFyIG49aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9W10sdz0wLHo9bi5jb3VudDt3PHo7dys9MiliLmZyb21CdWZmZXJBdHRyaWJ1dGUobix3KSxlLmZyb21CdWZmZXJBdHRyaWJ1dGUobiwKdysxKSx1W3ddPTA9PT13PzA6dVt3LTFdLHVbdysxXT11W3ddK2IuZGlzdGFuY2VUbyhlKTtoLmFkZEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixuZXcgYmEodSwxKSl9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSBpZihoLmlzR2VvbWV0cnkpZm9yKG49aC52ZXJ0aWNlcyx1PWgubGluZURpc3RhbmNlcyx3PTAsej1uLmxlbmd0aDt3PHo7dys9MiliLmNvcHkoblt3XSksZS5jb3B5KG5bdysxXSksdVt3XT0wPT09dz8wOnVbdy0xXSx1W3crMV09dVt3XStiLmRpc3RhbmNlVG8oZSk7cmV0dXJuIHRoaXN9fSgpfSk7a2gucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShsYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpraCxpc0xpbmVMb29wOiEwfSk7U2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoR2EucHJvdG90eXBlKTsKU2MucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNjO1NjLnByb3RvdHlwZS5pc1BvaW50c01hdGVyaWFsPSEwO1NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe0dhLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmNvbG9yLmNvcHkoYi5jb2xvcik7dGhpcy5tYXA9Yi5tYXA7dGhpcy5zaXplPWIuc2l6ZTt0aGlzLnNpemVBdHRlbnVhdGlvbj1iLnNpemVBdHRlbnVhdGlvbjt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0cztyZXR1cm4gdGhpc307UmUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlJlLGlzUG9pbnRzOiEwLHJheWNhc3Q6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgQyxlPW5ldyB4YixoPW5ldyBBO3JldHVybiBmdW5jdGlvbihuLHUpe2Z1bmN0aW9uIHcoZmEscWEpe3ZhciByYT1lLmRpc3RhbmNlU3FUb1BvaW50KGZhKTtyYTxPJiYoZS5jbG9zZXN0UG9pbnRUb1BvaW50KGZhLFEpLFEuYXBwbHlNYXRyaXg0KEgpLApmYT1uLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhRKSxmYTxuLm5lYXJ8fGZhPm4uZmFyfHx1LnB1c2goe2Rpc3RhbmNlOmZhLGRpc3RhbmNlVG9SYXk6TWF0aC5zcXJ0KHJhKSxwb2ludDpRLmNsb25lKCksaW5kZXg6cWEsZmFjZTpudWxsLG9iamVjdDp6fSkpfXZhciB6PXRoaXMsRT10aGlzLmdlb21ldHJ5LEg9dGhpcy5tYXRyaXhXb3JsZCxJPW4ucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7bnVsbD09PUUuYm91bmRpbmdTcGhlcmUmJkUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7aC5jb3B5KEUuYm91bmRpbmdTcGhlcmUpO2guYXBwbHlNYXRyaXg0KEgpO2gucmFkaXVzKz1JO2lmKCExIT09bi5yYXkuaW50ZXJzZWN0c1NwaGVyZShoKSl7Yi5nZXRJbnZlcnNlKEgpO2UuY29weShuLnJheSkuYXBwbHlNYXRyaXg0KGIpO0kvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMzt2YXIgTz1JKkk7ST1uZXcgZzt2YXIgUT1uZXcgZztpZihFLmlzQnVmZmVyR2VvbWV0cnkpe3ZhciBSPQpFLmluZGV4O0U9RS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O2lmKG51bGwhPT1SKXt2YXIgVT1SLmFycmF5O1I9MDtmb3IodmFyIFc9VS5sZW5ndGg7UjxXO1IrKyl7dmFyIFo9VVtSXTtJLmZyb21BcnJheShFLDMqWik7dyhJLFopfX1lbHNlIGZvcihSPTAsVT1FLmxlbmd0aC8zO1I8VTtSKyspSS5mcm9tQXJyYXkoRSwzKlIpLHcoSSxSKX1lbHNlIGZvcihJPUUudmVydGljZXMsUj0wLFU9SS5sZW5ndGg7UjxVO1IrKyl3KElbUl0sUil9fX0oKSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmdlb21ldHJ5LHRoaXMubWF0ZXJpYWwpKS5jb3B5KHRoaXMpfX0pO0FpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoay5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBaSxpc1ZpZGVvVGV4dHVyZTohMCx1cGRhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmltYWdlO2IucmVhZHlTdGF0ZT49Yi5IQVZFX0NVUlJFTlRfREFUQSYmCih0aGlzLm5lZWRzVXBkYXRlPSEwKX19KTtTZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShrLnByb3RvdHlwZSk7U2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNlO1NlLnByb3RvdHlwZS5pc0NvbXByZXNzZWRUZXh0dXJlPSEwO1ZmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtWZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VmY7VmYucHJvdG90eXBlLmlzQ2FudmFzVGV4dHVyZT0hMDtXZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShrLnByb3RvdHlwZSk7V2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPVdmO1dmLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZT0hMDtUZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1RlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UZTtYZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShOLnByb3RvdHlwZSk7WGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhmO1VlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7ClVlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VZTtZZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShOLnByb3RvdHlwZSk7WWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVlmO3pjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7emMucHJvdG90eXBlLmNvbnN0cnVjdG9yPXpjO1pmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE4ucHJvdG90eXBlKTtaZi5wcm90b3R5cGUuY29uc3RydWN0b3I9WmY7VmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemMucHJvdG90eXBlKTtWZS5wcm90b3R5cGUuY29uc3RydWN0b3I9VmU7JGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTi5wcm90b3R5cGUpOyRmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0kZjtpZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6Yy5wcm90b3R5cGUpO2llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pZTthZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShOLnByb3RvdHlwZSk7YWcucHJvdG90eXBlLmNvbnN0cnVjdG9yPQphZztXZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6Yy5wcm90b3R5cGUpO1dlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1XZTtiZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShOLnByb3RvdHlwZSk7YmcucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJnO1hlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHpjLnByb3RvdHlwZSk7WGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhlO2NnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE4ucHJvdG90eXBlKTtjZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2c7amUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtqZS5wcm90b3R5cGUuY29uc3RydWN0b3I9amU7amUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPXhhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCk7cmV0dXJuIGJ9O2RnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE4ucHJvdG90eXBlKTsKZGcucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRnO1llLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7WWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVllO2VnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE4ucHJvdG90eXBlKTtlZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZWc7WmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtaZS5wcm90b3R5cGUuY29uc3RydWN0b3I9WmU7dmFyIG5wPXt0cmlhbmd1bGF0ZTpmdW5jdGlvbihiLGUsaCl7aD1ofHwyO3ZhciBuPWUmJmUubGVuZ3RoLHU9bj9lWzBdKmg6Yi5sZW5ndGgsdz13bChiLDAsdSxoLCEwKSx6PVtdO2lmKCF3KXJldHVybiB6O24mJih3PVNvKGIsZSx3LGgpKTtpZihiLmxlbmd0aD44MCpoKXt2YXIgRT1lPWJbMF07dmFyIEg9bj1iWzFdO2Zvcih2YXIgST1oO0k8dTtJKz1oKXt2YXIgTz1iW0ldO3ZhciBRPWJbSSsxXTtPPEUmJihFPU8pO1E8SCYmKEg9USk7Tz5lJiYoZT1PKTtRPm4mJihuPQpRKX1PPU1hdGgubWF4KGUtRSxuLUgpO089MCE9PU8/MS9POjB9aGcodyx6LGgsRSxILE8pO3JldHVybiB6fX0seWQ9e2FyZWE6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPWIubGVuZ3RoLGg9MCxuPWUtMSx1PTA7dTxlO249dSsrKWgrPWJbbl0ueCpiW3VdLnktYlt1XS54KmJbbl0ueTtyZXR1cm4uNSpofSxpc0Nsb2NrV2lzZTpmdW5jdGlvbihiKXtyZXR1cm4gMD55ZC5hcmVhKGIpfSx0cmlhbmd1bGF0ZVNoYXBlOmZ1bmN0aW9uKGIsZSl7dmFyIGg9W10sbj1bXSx1PVtdO0FsKGIpO0JsKGgsYik7dmFyIHc9Yi5sZW5ndGg7ZS5mb3JFYWNoKEFsKTtmb3IoYj0wO2I8ZS5sZW5ndGg7YisrKW4ucHVzaCh3KSx3Kz1lW2JdLmxlbmd0aCxCbChoLGVbYl0pO2U9bnAudHJpYW5ndWxhdGUoaCxuKTtmb3IoYj0wO2I8ZS5sZW5ndGg7Yis9Myl1LnB1c2goZS5zbGljZShiLGIrMykpO3JldHVybiB1fX07bGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTi5wcm90b3R5cGUpO2xlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0KbGU7bGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPU4ucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBDbCh0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGIpfTttZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO21kLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tZDttZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9eGEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBDbCh0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGIpfTt2YXIgJG89e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oYixlLGgsbix1KXtiPWVbMypuXTtuPWVbMypuKzFdO3ZhciB3PWVbMyp1XTt1PWVbMyp1KzFdO3JldHVybltuZXcgZChlWzMqaF0sZVszKmgrMV0pLG5ldyBkKGIsbiksbmV3IGQodyx1KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihiLGUsCmgsbix1LHcpe2I9ZVszKmhdO3ZhciB6PWVbMypoKzFdO2g9ZVszKmgrMl07dmFyIEU9ZVszKm5dLEg9ZVszKm4rMV07bj1lWzMqbisyXTt2YXIgST1lWzMqdV0sTz1lWzMqdSsxXTt1PWVbMyp1KzJdO3ZhciBRPWVbMyp3XSxSPWVbMyp3KzFdO2U9ZVszKncrMl07cmV0dXJuLjAxPk1hdGguYWJzKHotSCk/W25ldyBkKGIsMS1oKSxuZXcgZChFLDEtbiksbmV3IGQoSSwxLXUpLG5ldyBkKFEsMS1lKV06W25ldyBkKHosMS1oKSxuZXcgZChILDEtbiksbmV3IGQoTywxLXUpLG5ldyBkKFIsMS1lKV19fTtqZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShOLnByb3RvdHlwZSk7amcucHJvdG90eXBlLmNvbnN0cnVjdG9yPWpnOyRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG1kLnByb3RvdHlwZSk7JGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRlO2tnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE4ucHJvdG90eXBlKTtrZy5wcm90b3R5cGUuY29uc3RydWN0b3I9a2c7V2QucHJvdG90eXBlPQpPYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7V2QucHJvdG90eXBlLmNvbnN0cnVjdG9yPVdkO2xnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE4ucHJvdG90eXBlKTtsZy5wcm90b3R5cGUuY29uc3RydWN0b3I9bGc7YWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTthZi5wcm90b3R5cGUuY29uc3RydWN0b3I9YWY7bWcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTi5wcm90b3R5cGUpO21nLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tZztiZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO2JmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZjttZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShOLnByb3RvdHlwZSk7bWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW1lO21lLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYj1OLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gRGwodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxiKX07Cm5lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7bmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW5lO25lLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYj14YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIERsKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsYil9O2NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7Y2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPWNmO29lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE4ucHJvdG90eXBlKTtvZS5wcm90b3R5cGUuY29uc3RydWN0b3I9b2U7emQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTt6ZC5wcm90b3R5cGUuY29uc3RydWN0b3I9emQ7bmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUob2UucHJvdG90eXBlKTtuZy5wcm90b3R5cGUuY29uc3RydWN0b3I9bmc7b2cucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemQucHJvdG90eXBlKTtvZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Cm9nO3BnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE4ucHJvdG90eXBlKTtwZy5wcm90b3R5cGUuY29uc3RydWN0b3I9cGc7ZGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtkZi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGY7dmFyIHhjPU9iamVjdC5mcmVlemUoe1dpcmVmcmFtZUdlb21ldHJ5OlRlLFBhcmFtZXRyaWNHZW9tZXRyeTpYZixQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6VWUsVGV0cmFoZWRyb25HZW9tZXRyeTpaZixUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OlZlLE9jdGFoZWRyb25HZW9tZXRyeTokZixPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk6aWUsSWNvc2FoZWRyb25HZW9tZXRyeTphZyxJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OldlLERvZGVjYWhlZHJvbkdlb21ldHJ5OmJnLERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OlhlLFBvbHloZWRyb25HZW9tZXRyeTpZZixQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk6emMsVHViZUdlb21ldHJ5OmNnLApUdWJlQnVmZmVyR2VvbWV0cnk6amUsVG9ydXNLbm90R2VvbWV0cnk6ZGcsVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk6WWUsVG9ydXNHZW9tZXRyeTplZyxUb3J1c0J1ZmZlckdlb21ldHJ5OlplLFRleHRHZW9tZXRyeTpqZyxUZXh0QnVmZmVyR2VvbWV0cnk6JGUsU3BoZXJlR2VvbWV0cnk6a2csU3BoZXJlQnVmZmVyR2VvbWV0cnk6V2QsUmluZ0dlb21ldHJ5OmxnLFJpbmdCdWZmZXJHZW9tZXRyeTphZixQbGFuZUdlb21ldHJ5OlNhLFBsYW5lQnVmZmVyR2VvbWV0cnk6RWEsTGF0aGVHZW9tZXRyeTptZyxMYXRoZUJ1ZmZlckdlb21ldHJ5OmJmLFNoYXBlR2VvbWV0cnk6bWUsU2hhcGVCdWZmZXJHZW9tZXRyeTpuZSxFeHRydWRlR2VvbWV0cnk6bGUsRXh0cnVkZUJ1ZmZlckdlb21ldHJ5Om1kLEVkZ2VzR2VvbWV0cnk6Y2YsQ29uZUdlb21ldHJ5Om5nLENvbmVCdWZmZXJHZW9tZXRyeTpvZyxDeWxpbmRlckdlb21ldHJ5Om9lLEN5bGluZGVyQnVmZmVyR2VvbWV0cnk6emQsQ2lyY2xlR2VvbWV0cnk6cGcsCkNpcmNsZUJ1ZmZlckdlb21ldHJ5OmRmLEJveEdlb21ldHJ5OnphLEJveEJ1ZmZlckdlb21ldHJ5OkZhfSk7cGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoR2EucHJvdG90eXBlKTtwZS5wcm90b3R5cGUuY29uc3RydWN0b3I9cGU7cGUucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWw9ITA7cGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7R2EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuY29sb3IuY29weShiLmNvbG9yKTtyZXR1cm4gdGhpc307ZWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZGIucHJvdG90eXBlKTtlZi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZWY7ZWYucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITA7bmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoR2EucHJvdG90eXBlKTtuZC5wcm90b3R5cGUuY29uc3RydWN0b3I9bmQ7bmQucHJvdG90eXBlLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw9ITA7bmQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7R2EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLApiKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLmNvbG9yLmNvcHkoYi5jb2xvcik7dGhpcy5yb3VnaG5lc3M9Yi5yb3VnaG5lc3M7dGhpcy5tZXRhbG5lc3M9Yi5tZXRhbG5lc3M7dGhpcy5tYXA9Yi5tYXA7dGhpcy5saWdodE1hcD1iLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9Yi5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWIuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1iLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShiLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWIuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1iLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuYnVtcE1hcD1iLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9Yi5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9Yi5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWIubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYi5ub3JtYWxTY2FsZSk7CnRoaXMuZGlzcGxhY2VtZW50TWFwPWIuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9Yi5kaXNwbGFjZW1lbnRCaWFzO3RoaXMucm91Z2huZXNzTWFwPWIucm91Z2huZXNzTWFwO3RoaXMubWV0YWxuZXNzTWFwPWIubWV0YWxuZXNzTWFwO3RoaXMuYWxwaGFNYXA9Yi5hbHBoYU1hcDt0aGlzLmVudk1hcD1iLmVudk1hcDt0aGlzLmVudk1hcEludGVuc2l0eT1iLmVudk1hcEludGVuc2l0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1iLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1iLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1iLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9Yi53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49Yi53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWIuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9CmIubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWIubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtxZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuZC5wcm90b3R5cGUpO3FlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1xZTtxZS5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD0hMDtxZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtuZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5kZWZpbmVzPXtQSFlTSUNBTDoiIn07dGhpcy5yZWZsZWN0aXZpdHk9Yi5yZWZsZWN0aXZpdHk7dGhpcy5jbGVhckNvYXQ9Yi5jbGVhckNvYXQ7dGhpcy5jbGVhckNvYXRSb3VnaG5lc3M9Yi5jbGVhckNvYXRSb3VnaG5lc3M7cmV0dXJuIHRoaXN9O1RjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEdhLnByb3RvdHlwZSk7VGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVRjO1RjLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwO1RjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe0dhLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMuc3BlY3VsYXIuY29weShiLnNwZWN1bGFyKTt0aGlzLnNoaW5pbmVzcz1iLnNoaW5pbmVzczt0aGlzLm1hcD1iLm1hcDt0aGlzLmxpZ2h0TWFwPWIubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1iLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9Yi5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWIuYW9NYXBJbnRlbnNpdHk7dGhpcy5lbWlzc2l2ZS5jb3B5KGIuZW1pc3NpdmUpO3RoaXMuZW1pc3NpdmVNYXA9Yi5lbWlzc2l2ZU1hcDt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWIuZW1pc3NpdmVJbnRlbnNpdHk7dGhpcy5idW1wTWFwPWIuYnVtcE1hcDt0aGlzLmJ1bXBTY2FsZT1iLmJ1bXBTY2FsZTt0aGlzLm5vcm1hbE1hcD1iLm5vcm1hbE1hcDt0aGlzLm5vcm1hbE1hcFR5cGU9Yi5ub3JtYWxNYXBUeXBlO3RoaXMubm9ybWFsU2NhbGUuY29weShiLm5vcm1hbFNjYWxlKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1iLmRpc3BsYWNlbWVudE1hcDsKdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1iLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1iLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5zcGVjdWxhck1hcD1iLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9Yi5hbHBoYU1hcDt0aGlzLmVudk1hcD1iLmVudk1hcDt0aGlzLmNvbWJpbmU9Yi5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWIucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWIucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMud2lyZWZyYW1lTGluZWNhcD1iLndpcmVmcmFtZUxpbmVjYXA7dGhpcy53aXJlZnJhbWVMaW5lam9pbj1iLndpcmVmcmFtZUxpbmVqb2luO3RoaXMuc2tpbm5pbmc9Yi5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1iLm1vcnBoTm9ybWFsczsKcmV0dXJuIHRoaXN9O3JlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFRjLnByb3RvdHlwZSk7cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPXJlO3JlLnByb3RvdHlwZS5pc01lc2hUb29uTWF0ZXJpYWw9ITA7cmUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7VGMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZ3JhZGllbnRNYXA9Yi5ncmFkaWVudE1hcDtyZXR1cm4gdGhpc307c2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoR2EucHJvdG90eXBlKTtzZS5wcm90b3R5cGUuY29uc3RydWN0b3I9c2U7c2UucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsPSEwO3NlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe0dhLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmJ1bXBNYXA9Yi5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWIuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWIubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGU7CnRoaXMubm9ybWFsU2NhbGUuY29weShiLm5vcm1hbFNjYWxlKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1iLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWIuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWIuZGlzcGxhY2VtZW50Qmlhczt0aGlzLndpcmVmcmFtZT1iLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1iLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLnNraW5uaW5nPWIuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9Yi5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9Yi5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O3RlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEdhLnByb3RvdHlwZSk7dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPXRlO3RlLnByb3RvdHlwZS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw9ITA7dGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7R2EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLApiKTt0aGlzLmNvbG9yLmNvcHkoYi5jb2xvcik7dGhpcy5tYXA9Yi5tYXA7dGhpcy5saWdodE1hcD1iLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9Yi5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWIuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1iLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShiLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWIuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1iLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuc3BlY3VsYXJNYXA9Yi5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWIuYWxwaGFNYXA7dGhpcy5lbnZNYXA9Yi5lbnZNYXA7dGhpcy5jb21iaW5lPWIuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1iLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1iLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1iLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1iLndpcmVmcmFtZUxpbmV3aWR0aDsKdGhpcy53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWIud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWIubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTt1ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShHYS5wcm90b3R5cGUpO3VlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj11ZTt1ZS5wcm90b3R5cGUuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw9ITA7dWUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7R2EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZGVmaW5lcz17TUFUQ0FQOiIifTt0aGlzLmNvbG9yLmNvcHkoYi5jb2xvcik7dGhpcy5tYXRjYXA9Yi5tYXRjYXA7dGhpcy5tYXA9Yi5tYXA7dGhpcy5idW1wTWFwPWIuYnVtcE1hcDt0aGlzLmJ1bXBTY2FsZT1iLmJ1bXBTY2FsZTt0aGlzLm5vcm1hbE1hcD0KYi5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWIubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYi5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9Yi5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1iLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1iLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5hbHBoYU1hcD1iLmFscGhhTWFwO3RoaXMuc2tpbm5pbmc9Yi5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1iLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307dmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTGIucHJvdG90eXBlKTt2ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9dmU7dmUucHJvdG90eXBlLmlzTGluZURhc2hlZE1hdGVyaWFsPSEwO3ZlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe0xiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTsKdGhpcy5zY2FsZT1iLnNjYWxlO3RoaXMuZGFzaFNpemU9Yi5kYXNoU2l6ZTt0aGlzLmdhcFNpemU9Yi5nYXBTaXplO3JldHVybiB0aGlzfTt2YXIgb3A9T2JqZWN0LmZyZWV6ZSh7U2hhZG93TWF0ZXJpYWw6cGUsU3ByaXRlTWF0ZXJpYWw6VmQsUmF3U2hhZGVyTWF0ZXJpYWw6ZWYsU2hhZGVyTWF0ZXJpYWw6ZGIsUG9pbnRzTWF0ZXJpYWw6U2MsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6cWUsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6bmQsTWVzaFBob25nTWF0ZXJpYWw6VGMsTWVzaFRvb25NYXRlcmlhbDpyZSxNZXNoTm9ybWFsTWF0ZXJpYWw6c2UsTWVzaExhbWJlcnRNYXRlcmlhbDp0ZSxNZXNoRGVwdGhNYXRlcmlhbDpQZCxNZXNoRGlzdGFuY2VNYXRlcmlhbDpRZCxNZXNoQmFzaWNNYXRlcmlhbDp5YixNZXNoTWF0Y2FwTWF0ZXJpYWw6dWUsTGluZURhc2hlZE1hdGVyaWFsOnZlLExpbmVCYXNpY01hdGVyaWFsOkxiLE1hdGVyaWFsOkdhfSksZ2M9e2FycmF5U2xpY2U6ZnVuY3Rpb24oYixlLApoKXtyZXR1cm4gZ2MuaXNUeXBlZEFycmF5KGIpP25ldyBiLmNvbnN0cnVjdG9yKGIuc3ViYXJyYXkoZSx2b2lkIDAhPT1oP2g6Yi5sZW5ndGgpKTpiLnNsaWNlKGUsaCl9LGNvbnZlcnRBcnJheTpmdW5jdGlvbihiLGUsaCl7cmV0dXJuIWJ8fCFoJiZiLmNvbnN0cnVjdG9yPT09ZT9iOiJudW1iZXIiPT09dHlwZW9mIGUuQllURVNfUEVSX0VMRU1FTlQ/bmV3IGUoYik6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYil9LGlzVHlwZWRBcnJheTpmdW5jdGlvbihiKXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGIpJiYhKGIgaW5zdGFuY2VvZiBEYXRhVmlldyl9LGdldEtleWZyYW1lT3JkZXI6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPWIubGVuZ3RoLGg9QXJyYXkoZSksbj0wO24hPT1lOysrbiloW25dPW47aC5zb3J0KGZ1bmN0aW9uKHUsdyl7cmV0dXJuIGJbdV0tYlt3XX0pO3JldHVybiBofSxzb3J0ZWRBcnJheTpmdW5jdGlvbihiLGUsaCl7Zm9yKHZhciBuPWIubGVuZ3RoLHU9bmV3IGIuY29uc3RydWN0b3IobiksCnc9MCx6PTA7eiE9PW47Kyt3KWZvcih2YXIgRT1oW3ddKmUsSD0wO0ghPT1lOysrSCl1W3orK109YltFK0hdO3JldHVybiB1fSxmbGF0dGVuSlNPTjpmdW5jdGlvbihiLGUsaCxuKXtmb3IodmFyIHU9MSx3PWJbMF07dm9pZCAwIT09dyYmdm9pZCAwPT09d1tuXTspdz1iW3UrK107aWYodm9pZCAwIT09dyl7dmFyIHo9d1tuXTtpZih2b2lkIDAhPT16KWlmKEFycmF5LmlzQXJyYXkoeikpe2RvIHo9d1tuXSx2b2lkIDAhPT16JiYoZS5wdXNoKHcudGltZSksaC5wdXNoLmFwcGx5KGgseikpLHc9Ylt1KytdO3doaWxlKHZvaWQgMCE9PXcpfWVsc2UgaWYodm9pZCAwIT09ei50b0FycmF5KXtkbyB6PXdbbl0sdm9pZCAwIT09eiYmKGUucHVzaCh3LnRpbWUpLHoudG9BcnJheShoLGgubGVuZ3RoKSksdz1iW3UrK107d2hpbGUodm9pZCAwIT09dyl9ZWxzZXtkbyB6PXdbbl0sdm9pZCAwIT09eiYmKGUucHVzaCh3LnRpbWUpLGgucHVzaCh6KSksdz1iW3UrK107d2hpbGUodm9pZCAwIT09dyl9fX19OwpPYmplY3QuYXNzaWduKERjLnByb3RvdHlwZSx7ZXZhbHVhdGU6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsaD10aGlzLl9jYWNoZWRJbmRleCxuPWVbaF0sdT1lW2gtMV07YTp7Yjp7Yzp7ZDppZighKGI8bikpe2Zvcih2YXIgdz1oKzI7Oyl7aWYodm9pZCAwPT09bil7aWYoYjx1KWJyZWFrIGQ7dGhpcy5fY2FjaGVkSW5kZXg9aD1lLmxlbmd0aDtyZXR1cm4gdGhpcy5hZnRlckVuZF8oaC0xLGIsdSl9aWYoaD09PXcpYnJlYWs7dT1uO249ZVsrK2hdO2lmKGI8bilicmVhayBifW49ZS5sZW5ndGg7YnJlYWsgY31pZihiPj11KWJyZWFrIGE7ZWxzZXt3PWVbMV07Yjx3JiYoaD0yLHU9dyk7Zm9yKHc9aC0yOzspe2lmKHZvaWQgMD09PXUpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxiLG4pO2lmKGg9PT13KWJyZWFrO249dTt1PWVbLS1oLTFdO2lmKGI+PXUpYnJlYWsgYn1uPWg7aD0wfX1mb3IoO2g8bjspdT1oK24+Pj4KMSxiPGVbdV0/bj11Omg9dSsxO249ZVtoXTt1PWVbaC0xXTtpZih2b2lkIDA9PT11KXJldHVybiB0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMuYmVmb3JlU3RhcnRfKDAsYixuKTtpZih2b2lkIDA9PT1uKXJldHVybiB0aGlzLl9jYWNoZWRJbmRleD1oPWUubGVuZ3RoLHRoaXMuYWZ0ZXJFbmRfKGgtMSx1LGIpfXRoaXMuX2NhY2hlZEluZGV4PWg7dGhpcy5pbnRlcnZhbENoYW5nZWRfKGgsdSxuKX1yZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8oaCx1LGIsbil9LHNldHRpbmdzOm51bGwsRGVmYXVsdFNldHRpbmdzXzp7fSxnZXRTZXR0aW5nc186ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXR0aW5nc3x8dGhpcy5EZWZhdWx0U2V0dGluZ3NffSxjb3B5U2FtcGxlVmFsdWVfOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMucmVzdWx0QnVmZmVyLGg9dGhpcy5zYW1wbGVWYWx1ZXMsbj10aGlzLnZhbHVlU2l6ZTtiKj1uO2Zvcih2YXIgdT0wO3UhPT1uOysrdSllW3VdPWhbYit1XTtyZXR1cm4gZX0sCmludGVycG9sYXRlXzpmdW5jdGlvbigpe3Rocm93IEVycm9yKCJjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCIpO30saW50ZXJ2YWxDaGFuZ2VkXzpmdW5jdGlvbigpe319KTtPYmplY3QuYXNzaWduKERjLnByb3RvdHlwZSx7YmVmb3JlU3RhcnRfOkRjLnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLGFmdGVyRW5kXzpEYy5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlX30pO21oLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6bWgsRGVmYXVsdFNldHRpbmdzXzp7ZW5kaW5nU3RhcnQ6MjQwMCxlbmRpbmdFbmQ6MjQwMH0saW50ZXJ2YWxDaGFuZ2VkXzpmdW5jdGlvbihiLGUsaCl7dmFyIG49dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsdT1iLTIsdz1iKzEsej1uW3VdLEU9blt3XTtpZih2b2lkIDA9PT16KXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIDI0MDE6dT1iO3o9MiplLWg7YnJlYWs7CmNhc2UgMjQwMjp1PW4ubGVuZ3RoLTI7ej1lK25bdV0tblt1KzFdO2JyZWFrO2RlZmF1bHQ6dT1iLHo9aH1pZih2b2lkIDA9PT1FKXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ0VuZCl7Y2FzZSAyNDAxOnc9YjtFPTIqaC1lO2JyZWFrO2Nhc2UgMjQwMjp3PTE7RT1oK25bMV0tblswXTticmVhaztkZWZhdWx0Onc9Yi0xLEU9ZX1iPS41KihoLWUpO249dGhpcy52YWx1ZVNpemU7dGhpcy5fd2VpZ2h0UHJldj1iLyhlLXopO3RoaXMuX3dlaWdodE5leHQ9Yi8oRS1oKTt0aGlzLl9vZmZzZXRQcmV2PXUqbjt0aGlzLl9vZmZzZXROZXh0PXcqbn0saW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGIsZSxoLG4pe3ZhciB1PXRoaXMucmVzdWx0QnVmZmVyLHc9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTtiKj16O3ZhciBFPWIteixIPXRoaXMuX29mZnNldFByZXYsST10aGlzLl9vZmZzZXROZXh0LE89dGhpcy5fd2VpZ2h0UHJldixRPXRoaXMuX3dlaWdodE5leHQsUj0oaC0KZSkvKG4tZSk7aD1SKlI7bj1oKlI7ZT0tTypuKzIqTypoLU8qUjtPPSgxK08pKm4rKC0xLjUtMipPKSpoKygtLjUrTykqUisxO1I9KC0xLVEpKm4rKDEuNStRKSpoKy41KlI7UT1RKm4tUSpoO2ZvcihoPTA7aCE9PXo7KytoKXVbaF09ZSp3W0graF0rTyp3W0UraF0rUip3W2IraF0rUSp3W0kraF07cmV0dXJuIHV9fSk7cWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpxZyxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYixlLGgsbil7dmFyIHU9dGhpcy5yZXN1bHRCdWZmZXIsdz10aGlzLnNhbXBsZVZhbHVlcyx6PXRoaXMudmFsdWVTaXplO2IqPXo7dmFyIEU9Yi16O2U9KGgtZSkvKG4tZSk7aD0xLWU7Zm9yKG49MDtuIT09ejsrK24pdVtuXT13W0Urbl0qaCt3W2Irbl0qZTtyZXR1cm4gdX19KTtuaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm5oLAppbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyhiLTEpfX0pO09iamVjdC5hc3NpZ24obWMse3RvSlNPTjpmdW5jdGlvbihiKXt2YXIgZT1iLmNvbnN0cnVjdG9yO2lmKHZvaWQgMCE9PWUudG9KU09OKWU9ZS50b0pTT04oYik7ZWxzZXtlPXtuYW1lOmIubmFtZSx0aW1lczpnYy5jb252ZXJ0QXJyYXkoYi50aW1lcyxBcnJheSksdmFsdWVzOmdjLmNvbnZlcnRBcnJheShiLnZhbHVlcyxBcnJheSl9O3ZhciBoPWIuZ2V0SW50ZXJwb2xhdGlvbigpO2ghPT1iLkRlZmF1bHRJbnRlcnBvbGF0aW9uJiYoZS5pbnRlcnBvbGF0aW9uPWgpfWUudHlwZT1iLlZhbHVlVHlwZU5hbWU7cmV0dXJuIGV9fSk7T2JqZWN0LmFzc2lnbihtYy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOm1jLFRpbWVCdWZmZXJUeXBlOkZsb2F0MzJBcnJheSxWYWx1ZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBuaCh0aGlzLnRpbWVzLAp0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGIpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBxZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYil9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpmdW5jdGlvbihiKXtyZXR1cm4gbmV3IG1oKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxiKX0sc2V0SW50ZXJwb2xhdGlvbjpmdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSAyMzAwOnZhciBlPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7YnJlYWs7Y2FzZSAyMzAxOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7YnJlYWs7Y2FzZSAyMzAyOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09ZSl7ZT0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrCiIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgIit0aGlzLm5hbWU7aWYodm9pZCAwPT09dGhpcy5jcmVhdGVJbnRlcnBvbGFudClpZihiIT09dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil0aGlzLnNldEludGVycG9sYXRpb24odGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbik7ZWxzZSB0aHJvdyBFcnJvcihlKTtjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IixlKTtyZXR1cm4gdGhpc310aGlzLmNyZWF0ZUludGVycG9sYW50PWU7cmV0dXJuIHRoaXN9LGdldEludGVycG9sYXRpb246ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5jcmVhdGVJbnRlcnBvbGFudCl7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOnJldHVybiAyMzAwO2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIDIzMDE7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpyZXR1cm4gMjMwMn19LGdldFZhbHVlU2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvCnRoaXMudGltZXMubGVuZ3RofSxzaGlmdDpmdW5jdGlvbihiKXtpZigwIT09Yilmb3IodmFyIGU9dGhpcy50aW1lcyxoPTAsbj1lLmxlbmd0aDtoIT09bjsrK2gpZVtoXSs9YjtyZXR1cm4gdGhpc30sc2NhbGU6ZnVuY3Rpb24oYil7aWYoMSE9PWIpZm9yKHZhciBlPXRoaXMudGltZXMsaD0wLG49ZS5sZW5ndGg7aCE9PW47KytoKWVbaF0qPWI7cmV0dXJuIHRoaXN9LHRyaW06ZnVuY3Rpb24oYixlKXtmb3IodmFyIGg9dGhpcy50aW1lcyxuPWgubGVuZ3RoLHU9MCx3PW4tMTt1IT09biYmaFt1XTxiOykrK3U7Zm9yKDstMSE9PXcmJmhbd10+ZTspLS13OysrdztpZigwIT09dXx8dyE9PW4pdT49dyYmKHc9TWF0aC5tYXgodywxKSx1PXctMSksYj10aGlzLmdldFZhbHVlU2l6ZSgpLHRoaXMudGltZXM9Z2MuYXJyYXlTbGljZShoLHUsdyksdGhpcy52YWx1ZXM9Z2MuYXJyYXlTbGljZSh0aGlzLnZhbHVlcyx1KmIsdypiKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYj0KITAsZT10aGlzLmdldFZhbHVlU2l6ZSgpOzAhPT1lLU1hdGguZmxvb3IoZSkmJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suIix0aGlzKSxiPSExKTt2YXIgaD10aGlzLnRpbWVzO2U9dGhpcy52YWx1ZXM7dmFyIG49aC5sZW5ndGg7MD09PW4mJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4iLHRoaXMpLGI9ITEpO2Zvcih2YXIgdT1udWxsLHc9MDt3IT09bjt3Kyspe3ZhciB6PWhbd107aWYoIm51bWJlciI9PT10eXBlb2YgeiYmaXNOYU4oeikpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyx3LHopO2I9ITE7YnJlYWt9aWYobnVsbCE9PXUmJnU+eil7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIix0aGlzLHcseix1KTtiPSExO2JyZWFrfXU9Cnp9aWYodm9pZCAwIT09ZSYmZ2MuaXNUeXBlZEFycmF5KGUpKWZvcih3PTAsaD1lLmxlbmd0aDt3IT09aDsrK3cpaWYobj1lW3ddLGlzTmFOKG4pKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBWYWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLHcsbik7Yj0hMTticmVha31yZXR1cm4gYn0sb3B0aW1pemU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy50aW1lcyxlPXRoaXMudmFsdWVzLGg9dGhpcy5nZXRWYWx1ZVNpemUoKSxuPTIzMDI9PT10aGlzLmdldEludGVycG9sYXRpb24oKSx1PTEsdz1iLmxlbmd0aC0xLHo9MTt6PHc7Kyt6KXt2YXIgRT0hMSxIPWJbel07aWYoSCE9PWJbeisxXSYmKDEhPT16fHxIIT09SFswXSkpaWYobilFPSEwO2Vsc2V7dmFyIEk9eipoLE89SS1oLFE9SStoO2ZvcihIPTA7SCE9PWg7KytIKXt2YXIgUj1lW0krSF07aWYoUiE9PWVbTytIXXx8UiE9PWVbUStIXSl7RT0hMDticmVha319fWlmKEUpe2lmKHohPT11KWZvcihiW3VdPQpiW3pdLEU9eipoLEk9dSpoLEg9MDtIIT09aDsrK0gpZVtJK0hdPWVbRStIXTsrK3V9fWlmKDA8dyl7Ylt1XT1iW3ddO0U9dypoO0k9dSpoO2ZvcihIPTA7SCE9PWg7KytIKWVbSStIXT1lW0UrSF07Kyt1fXUhPT1iLmxlbmd0aCYmKHRoaXMudGltZXM9Z2MuYXJyYXlTbGljZShiLDAsdSksdGhpcy52YWx1ZXM9Z2MuYXJyYXlTbGljZShlLDAsdSpoKSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9Z2MuYXJyYXlTbGljZSh0aGlzLnRpbWVzLDApLGU9Z2MuYXJyYXlTbGljZSh0aGlzLnZhbHVlcywwKTtiPW5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubmFtZSxiLGUpO2IuY3JlYXRlSW50ZXJwb2xhbnQ9dGhpcy5jcmVhdGVJbnRlcnBvbGFudDtyZXR1cm4gYn19KTtvaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG1jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm9oLFZhbHVlVHlwZU5hbWU6ImJvb2wiLFZhbHVlQnVmZmVyVHlwZTpBcnJheSwKRGVmYXVsdEludGVycG9sYXRpb246MjMwMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6dm9pZCAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtwaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG1jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnBoLFZhbHVlVHlwZU5hbWU6ImNvbG9yIn0pO2ZmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6ZmYsVmFsdWVUeXBlTmFtZToibnVtYmVyIn0pO3FoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6cWgsaW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGIsZSxoLG4pe3ZhciB1PXRoaXMucmVzdWx0QnVmZmVyLHc9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTtiKj16O2U9KGgtZSkvKG4tZSk7Zm9yKGg9Yit6O2IhPT1oO2IrPTQpZi5zbGVycEZsYXQodSwKMCx3LGIteix3LGIsZSk7cmV0dXJuIHV9fSk7cmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpyZyxWYWx1ZVR5cGVOYW1lOiJxdWF0ZXJuaW9uIixEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAxLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpmdW5jdGlvbihiKXtyZXR1cm4gbmV3IHFoKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxiKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO3JoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6cmgsVmFsdWVUeXBlTmFtZToic3RyaW5nIixWYWx1ZUJ1ZmZlclR5cGU6QXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6dm9pZCAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTsKZ2YucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpnZixWYWx1ZVR5cGVOYW1lOiJ2ZWN0b3IifSk7T2JqZWN0LmFzc2lnbihJYyx7cGFyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPVtdLGg9Yi50cmFja3Msbj0xLyhiLmZwc3x8MSksdT0wLHc9aC5sZW5ndGg7dSE9PXc7Kyt1KWUucHVzaChicChoW3VdKS5zY2FsZShuKSk7cmV0dXJuIG5ldyBJYyhiLm5hbWUsYi5kdXJhdGlvbixlKX0sdG9KU09OOmZ1bmN0aW9uKGIpe3ZhciBlPVtdLGg9Yi50cmFja3M7Yj17bmFtZTpiLm5hbWUsZHVyYXRpb246Yi5kdXJhdGlvbix0cmFja3M6ZSx1dWlkOmIudXVpZH07Zm9yKHZhciBuPTAsdT1oLmxlbmd0aDtuIT09dTsrK24pZS5wdXNoKG1jLnRvSlNPTihoW25dKSk7cmV0dXJuIGJ9LENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOmZ1bmN0aW9uKGIsZSxoLG4pe2Zvcih2YXIgdT1lLmxlbmd0aCx3PVtdLHo9MDt6PHU7eisrKXt2YXIgRT0KW10sSD1bXTtFLnB1c2goKHordS0xKSV1LHosKHorMSkldSk7SC5wdXNoKDAsMSwwKTt2YXIgST1nYy5nZXRLZXlmcmFtZU9yZGVyKEUpO0U9Z2Muc29ydGVkQXJyYXkoRSwxLEkpO0g9Z2Muc29ydGVkQXJyYXkoSCwxLEkpO258fDAhPT1FWzBdfHwoRS5wdXNoKHUpLEgucHVzaChIWzBdKSk7dy5wdXNoKChuZXcgZmYoIi5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIitlW3pdLm5hbWUrIl0iLEUsSCkpLnNjYWxlKDEvaCkpfXJldHVybiBuZXcgSWMoYiwtMSx3KX0sZmluZEJ5TmFtZTpmdW5jdGlvbihiLGUpe3ZhciBoPWI7QXJyYXkuaXNBcnJheShiKXx8KGg9Yi5nZW9tZXRyeSYmYi5nZW9tZXRyeS5hbmltYXRpb25zfHxiLmFuaW1hdGlvbnMpO2ZvcihiPTA7YjxoLmxlbmd0aDtiKyspaWYoaFtiXS5uYW1lPT09ZSlyZXR1cm4gaFtiXTtyZXR1cm4gbnVsbH0sQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6ZnVuY3Rpb24oYixlLGgpe2Zvcih2YXIgbj17fSx1PS9eKFtcdy1dKj8pKFtcZF0rKSQvLAp3PTAsej1iLmxlbmd0aDt3PHo7dysrKXt2YXIgRT1iW3ddLEg9RS5uYW1lLm1hdGNoKHUpO2lmKEgmJjE8SC5sZW5ndGgpe3ZhciBJPUhbMV07KEg9bltJXSl8fChuW0ldPUg9W10pO0gucHVzaChFKX19Yj1bXTtmb3IoSSBpbiBuKWIucHVzaChJYy5DcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZShJLG5bSV0sZSxoKSk7cmV0dXJuIGJ9LHBhcnNlQW5pbWF0aW9uOmZ1bmN0aW9uKGIsZSl7ZnVuY3Rpb24gaChaLGZhLHFhLHJhLGlhKXtpZigwIT09cWEubGVuZ3RoKXt2YXIgdGE9W10sbmE9W107Z2MuZmxhdHRlbkpTT04ocWEsdGEsbmEscmEpOzAhPT10YS5sZW5ndGgmJmlhLnB1c2gobmV3IFooZmEsdGEsbmEpKX19aWYoIWIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuIiksbnVsbDt2YXIgbj1bXSx1PWIubmFtZXx8ImRlZmF1bHQiLHc9Yi5sZW5ndGh8fC0xLHo9Yi5mcHN8fDMwO2I9Yi5oaWVyYXJjaHl8fApbXTtmb3IodmFyIEU9MDtFPGIubGVuZ3RoO0UrKyl7dmFyIEg9YltFXS5rZXlzO2lmKEgmJjAhPT1ILmxlbmd0aClpZihIWzBdLm1vcnBoVGFyZ2V0cyl7dz17fTtmb3IodmFyIEk9MDtJPEgubGVuZ3RoO0krKylpZihIW0ldLm1vcnBoVGFyZ2V0cylmb3IodmFyIE89MDtPPEhbSV0ubW9ycGhUYXJnZXRzLmxlbmd0aDtPKyspd1tIW0ldLm1vcnBoVGFyZ2V0c1tPXV09LTE7Zm9yKHZhciBRIGluIHcpe3ZhciBSPVtdLFU9W107Zm9yKE89MDtPIT09SFtJXS5tb3JwaFRhcmdldHMubGVuZ3RoOysrTyl7dmFyIFc9SFtJXTtSLnB1c2goVy50aW1lKTtVLnB1c2goVy5tb3JwaFRhcmdldD09PVE/MTowKX1uLnB1c2gobmV3IGZmKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VbIitRKyJdIixSLFUpKX13PXcubGVuZ3RoKih6fHwxKX1lbHNlIEk9Ii5ib25lc1siK2VbRV0ubmFtZSsiXSIsaChnZixJKyIucG9zaXRpb24iLEgsInBvcyIsbiksaChyZyxJKyIucXVhdGVybmlvbiIsSCwicm90IixuKSwKaChnZixJKyIuc2NhbGUiLEgsInNjbCIsbil9cmV0dXJuIDA9PT1uLmxlbmd0aD9udWxsOm5ldyBJYyh1LHcsbil9fSk7T2JqZWN0LmFzc2lnbihJYy5wcm90b3R5cGUse3Jlc2V0RHVyYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGI9MCxlPTAsaD10aGlzLnRyYWNrcy5sZW5ndGg7ZSE9PWg7KytlKXt2YXIgbj10aGlzLnRyYWNrc1tlXTtiPU1hdGgubWF4KGIsbi50aW1lc1tuLnRpbWVzLmxlbmd0aC0xXSl9dGhpcy5kdXJhdGlvbj1iO3JldHVybiB0aGlzfSx0cmltOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7Yjx0aGlzLnRyYWNrcy5sZW5ndGg7YisrKXRoaXMudHJhY2tzW2JdLnRyaW0oMCx0aGlzLmR1cmF0aW9uKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ITAsZT0wO2U8dGhpcy50cmFja3MubGVuZ3RoO2UrKyliPWImJnRoaXMudHJhY2tzW2VdLnZhbGlkYXRlKCk7cmV0dXJuIGJ9LG9wdGltaXplOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7Yjx0aGlzLnRyYWNrcy5sZW5ndGg7YisrKXRoaXMudHJhY2tzW2JdLm9wdGltaXplKCk7CnJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYj1bXSxlPTA7ZTx0aGlzLnRyYWNrcy5sZW5ndGg7ZSsrKWIucHVzaCh0aGlzLnRyYWNrc1tlXS5jbG9uZSgpKTtyZXR1cm4gbmV3IEljKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLGIpfX0pO3ZhciB4ZT17ZW5hYmxlZDohMSxmaWxlczp7fSxhZGQ6ZnVuY3Rpb24oYixlKXshMSE9PXRoaXMuZW5hYmxlZCYmKHRoaXMuZmlsZXNbYl09ZSl9LGdldDpmdW5jdGlvbihiKXtpZighMSE9PXRoaXMuZW5hYmxlZClyZXR1cm4gdGhpcy5maWxlc1tiXX0scmVtb3ZlOmZ1bmN0aW9uKGIpe2RlbGV0ZSB0aGlzLmZpbGVzW2JdfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuZmlsZXM9e319fSxBYz1uZXcgRGksYWQ9e307T2JqZWN0LmFzc2lnbihVYy5wcm90b3R5cGUse2xvYWQ6ZnVuY3Rpb24oYixlLGgsbil7dm9pZCAwPT09YiYmKGI9IiIpO3ZvaWQgMCE9PXRoaXMucGF0aCYmKGI9dGhpcy5wYXRoK2IpO2I9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoYik7CnZhciB1PXRoaXMsdz14ZS5nZXQoYik7aWYodm9pZCAwIT09dylyZXR1cm4gdS5tYW5hZ2VyLml0ZW1TdGFydChiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSYmZSh3KTt1Lm1hbmFnZXIuaXRlbUVuZChiKX0sMCksdztpZih2b2lkIDAhPT1hZFtiXSlhZFtiXS5wdXNoKHtvbkxvYWQ6ZSxvblByb2dyZXNzOmgsb25FcnJvcjpufSk7ZWxzZXt2YXIgej1iLm1hdGNoKC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvKTtpZih6KXtoPXpbMV07dmFyIEU9ISF6WzJdO3o9elszXTt6PWRlY29kZVVSSUNvbXBvbmVudCh6KTtFJiYoej1hdG9iKHopKTt0cnl7dmFyIEg9KHRoaXMucmVzcG9uc2VUeXBlfHwiIikudG9Mb3dlckNhc2UoKTtzd2l0Y2goSCl7Y2FzZSAiYXJyYXlidWZmZXIiOmNhc2UgImJsb2IiOnZhciBJPW5ldyBVaW50OEFycmF5KHoubGVuZ3RoKTtmb3IoRT0wO0U8ei5sZW5ndGg7RSsrKUlbRV09ei5jaGFyQ29kZUF0KEUpO3ZhciBPPSJibG9iIj09PUg/bmV3IEJsb2IoW0kuYnVmZmVyXSwKe3R5cGU6aH0pOkkuYnVmZmVyO2JyZWFrO2Nhc2UgImRvY3VtZW50IjpPPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoeixoKTticmVhaztjYXNlICJqc29uIjpPPUpTT04ucGFyc2Uoeik7YnJlYWs7ZGVmYXVsdDpPPXp9c2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUoTyk7dS5tYW5hZ2VyLml0ZW1FbmQoYil9LDApfWNhdGNoKFIpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuJiZuKFIpO3UubWFuYWdlci5pdGVtRXJyb3IoYik7dS5tYW5hZ2VyLml0ZW1FbmQoYil9LDApfX1lbHNle2FkW2JdPVtdO2FkW2JdLnB1c2goe29uTG9hZDplLG9uUHJvZ3Jlc3M6aCxvbkVycm9yOm59KTt2YXIgUT1uZXcgWE1MSHR0cFJlcXVlc3Q7US5vcGVuKCJHRVQiLGIsITApO1EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oUil7dmFyIFU9dGhpcy5yZXNwb25zZTt4ZS5hZGQoYixVKTt2YXIgVz1hZFtiXTtkZWxldGUgYWRbYl07aWYoMjAwPT09dGhpcy5zdGF0dXN8fDA9PT10aGlzLnN0YXR1cyl7MD09PQp0aGlzLnN0YXR1cyYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpO2Zvcih2YXIgWj0wLGZhPVcubGVuZ3RoO1o8ZmE7WisrKXt2YXIgcWE9V1taXTtpZihxYS5vbkxvYWQpcWEub25Mb2FkKFUpfX1lbHNle1o9MDtmb3IoZmE9Vy5sZW5ndGg7WjxmYTtaKyspaWYocWE9V1taXSxxYS5vbkVycm9yKXFhLm9uRXJyb3IoUik7dS5tYW5hZ2VyLml0ZW1FcnJvcihiKX11Lm1hbmFnZXIuaXRlbUVuZChiKX0sITEpO1EuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGZ1bmN0aW9uKFIpe2Zvcih2YXIgVT1hZFtiXSxXPTAsWj1VLmxlbmd0aDtXPFo7VysrKXt2YXIgZmE9VVtXXTtpZihmYS5vblByb2dyZXNzKWZhLm9uUHJvZ3Jlc3MoUil9fSwhMSk7US5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oUil7dmFyIFU9YWRbYl07ZGVsZXRlIGFkW2JdO2Zvcih2YXIgVz0wLFo9VS5sZW5ndGg7VzxaO1crKyl7dmFyIGZhPVVbV107CmlmKGZhLm9uRXJyb3IpZmEub25FcnJvcihSKX11Lm1hbmFnZXIuaXRlbUVycm9yKGIpO3UubWFuYWdlci5pdGVtRW5kKGIpfSwhMSk7US5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsZnVuY3Rpb24oUil7dmFyIFU9YWRbYl07ZGVsZXRlIGFkW2JdO2Zvcih2YXIgVz0wLFo9VS5sZW5ndGg7VzxaO1crKyl7dmFyIGZhPVVbV107aWYoZmEub25FcnJvcilmYS5vbkVycm9yKFIpfXUubWFuYWdlci5pdGVtRXJyb3IoYik7dS5tYW5hZ2VyLml0ZW1FbmQoYil9LCExKTt2b2lkIDAhPT10aGlzLnJlc3BvbnNlVHlwZSYmKFEucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUeXBlKTt2b2lkIDAhPT10aGlzLndpdGhDcmVkZW50aWFscyYmKFEud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzKTtRLm92ZXJyaWRlTWltZVR5cGUmJlEub3ZlcnJpZGVNaW1lVHlwZSh2b2lkIDAhPT10aGlzLm1pbWVUeXBlP3RoaXMubWltZVR5cGU6InRleHQvcGxhaW4iKTtmb3IoRSBpbiB0aGlzLnJlcXVlc3RIZWFkZXIpUS5zZXRSZXF1ZXN0SGVhZGVyKEUsCnRoaXMucmVxdWVzdEhlYWRlcltFXSk7US5zZW5kKG51bGwpfXUubWFuYWdlci5pdGVtU3RhcnQoYik7cmV0dXJuIFF9fSxzZXRQYXRoOmZ1bmN0aW9uKGIpe3RoaXMucGF0aD1iO3JldHVybiB0aGlzfSxzZXRSZXNwb25zZVR5cGU6ZnVuY3Rpb24oYil7dGhpcy5yZXNwb25zZVR5cGU9YjtyZXR1cm4gdGhpc30sc2V0V2l0aENyZWRlbnRpYWxzOmZ1bmN0aW9uKGIpe3RoaXMud2l0aENyZWRlbnRpYWxzPWI7cmV0dXJuIHRoaXN9LHNldE1pbWVUeXBlOmZ1bmN0aW9uKGIpe3RoaXMubWltZVR5cGU9YjtyZXR1cm4gdGhpc30sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihiKXt0aGlzLnJlcXVlc3RIZWFkZXI9YjtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKEVsLnByb3RvdHlwZSx7bG9hZDpmdW5jdGlvbihiLGUsaCxuKXt2YXIgdT10aGlzLHc9bmV3IFVjKHUubWFuYWdlcik7dy5zZXRQYXRoKHUucGF0aCk7dy5sb2FkKGIsZnVuY3Rpb24oeil7ZSh1LnBhcnNlKEpTT04ucGFyc2UoeikpKX0sCmgsbil9LHBhcnNlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1bXSxoPTA7aDxiLmxlbmd0aDtoKyspe3ZhciBuPUljLnBhcnNlKGJbaF0pO2UucHVzaChuKX1yZXR1cm4gZX0sc2V0UGF0aDpmdW5jdGlvbihiKXt0aGlzLnBhdGg9YjtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKEZsLnByb3RvdHlwZSx7bG9hZDpmdW5jdGlvbihiLGUsaCxuKXtmdW5jdGlvbiB1KFIpe0gubG9hZChiW1JdLGZ1bmN0aW9uKFUpe1U9dy5fcGFyc2VyKFUsITApO3pbUl09e3dpZHRoOlUud2lkdGgsaGVpZ2h0OlUuaGVpZ2h0LGZvcm1hdDpVLmZvcm1hdCxtaXBtYXBzOlUubWlwbWFwc307SSs9MTs2PT09SSYmKDE9PT1VLm1pcG1hcENvdW50JiYoRS5taW5GaWx0ZXI9MTAwNiksRS5mb3JtYXQ9VS5mb3JtYXQsRS5uZWVkc1VwZGF0ZT0hMCxlJiZlKEUpKX0saCxuKX12YXIgdz10aGlzLHo9W10sRT1uZXcgU2U7RS5pbWFnZT16O3ZhciBIPW5ldyBVYyh0aGlzLm1hbmFnZXIpO0guc2V0UGF0aCh0aGlzLnBhdGgpOwpILnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKTtpZihBcnJheS5pc0FycmF5KGIpKWZvcih2YXIgST0wLE89MCxRPWIubGVuZ3RoO088UTsrK08pdShPKTtlbHNlIEgubG9hZChiLGZ1bmN0aW9uKFIpe1I9dy5fcGFyc2VyKFIsITApO2lmKFIuaXNDdWJlbWFwKWZvcih2YXIgVT1SLm1pcG1hcHMubGVuZ3RoL1IubWlwbWFwQ291bnQsVz0wO1c8VTtXKyspe3pbV109e21pcG1hcHM6W119O2Zvcih2YXIgWj0wO1o8Ui5taXBtYXBDb3VudDtaKyspeltXXS5taXBtYXBzLnB1c2goUi5taXBtYXBzW1cqUi5taXBtYXBDb3VudCtaXSkseltXXS5mb3JtYXQ9Ui5mb3JtYXQseltXXS53aWR0aD1SLndpZHRoLHpbV10uaGVpZ2h0PVIuaGVpZ2h0fWVsc2UgRS5pbWFnZS53aWR0aD1SLndpZHRoLEUuaW1hZ2UuaGVpZ2h0PVIuaGVpZ2h0LEUubWlwbWFwcz1SLm1pcG1hcHM7MT09PVIubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0xMDA2KTtFLmZvcm1hdD1SLmZvcm1hdDtFLm5lZWRzVXBkYXRlPQohMDtlJiZlKEUpfSxoLG4pO3JldHVybiBFfSxzZXRQYXRoOmZ1bmN0aW9uKGIpe3RoaXMucGF0aD1iO3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oRWkucHJvdG90eXBlLHtsb2FkOmZ1bmN0aW9uKGIsZSxoLG4pe3ZhciB1PXRoaXMsdz1uZXcgdCx6PW5ldyBVYyh0aGlzLm1hbmFnZXIpO3ouc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO3ouc2V0UGF0aCh0aGlzLnBhdGgpO3oubG9hZChiLGZ1bmN0aW9uKEUpe2lmKEU9dS5fcGFyc2VyKEUpKXZvaWQgMCE9PUUuaW1hZ2U/dy5pbWFnZT1FLmltYWdlOnZvaWQgMCE9PUUuZGF0YSYmKHcuaW1hZ2Uud2lkdGg9RS53aWR0aCx3LmltYWdlLmhlaWdodD1FLmhlaWdodCx3LmltYWdlLmRhdGE9RS5kYXRhKSx3LndyYXBTPXZvaWQgMCE9PUUud3JhcFM/RS53cmFwUzoxMDAxLHcud3JhcFQ9dm9pZCAwIT09RS53cmFwVD9FLndyYXBUOjEwMDEsdy5tYWdGaWx0ZXI9dm9pZCAwIT09RS5tYWdGaWx0ZXI/RS5tYWdGaWx0ZXI6MTAwNiwKdy5taW5GaWx0ZXI9dm9pZCAwIT09RS5taW5GaWx0ZXI/RS5taW5GaWx0ZXI6MTAwOCx3LmFuaXNvdHJvcHk9dm9pZCAwIT09RS5hbmlzb3Ryb3B5P0UuYW5pc290cm9weToxLHZvaWQgMCE9PUUuZm9ybWF0JiYody5mb3JtYXQ9RS5mb3JtYXQpLHZvaWQgMCE9PUUudHlwZSYmKHcudHlwZT1FLnR5cGUpLHZvaWQgMCE9PUUubWlwbWFwcyYmKHcubWlwbWFwcz1FLm1pcG1hcHMpLDE9PT1FLm1pcG1hcENvdW50JiYody5taW5GaWx0ZXI9MTAwNiksdy5uZWVkc1VwZGF0ZT0hMCxlJiZlKHcsRSl9LGgsbik7cmV0dXJuIHd9LHNldFBhdGg6ZnVuY3Rpb24oYil7dGhpcy5wYXRoPWI7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihzZy5wcm90b3R5cGUse2Nyb3NzT3JpZ2luOiJhbm9ueW1vdXMiLGxvYWQ6ZnVuY3Rpb24oYixlLGgsbil7ZnVuY3Rpb24gdSgpe0gucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsdSwhMSk7SC5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdywhMSk7CnhlLmFkZChiLHRoaXMpO2UmJmUodGhpcyk7ei5tYW5hZ2VyLml0ZW1FbmQoYil9ZnVuY3Rpb24gdyhJKXtILnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHUsITEpO0gucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHcsITEpO24mJm4oSSk7ei5tYW5hZ2VyLml0ZW1FcnJvcihiKTt6Lm1hbmFnZXIuaXRlbUVuZChiKX12b2lkIDA9PT1iJiYoYj0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYj10aGlzLnBhdGgrYik7Yj10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChiKTt2YXIgej10aGlzLEU9eGUuZ2V0KGIpO2lmKHZvaWQgMCE9PUUpcmV0dXJuIHoubWFuYWdlci5pdGVtU3RhcnQoYiksc2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUoRSk7ei5tYW5hZ2VyLml0ZW1FbmQoYil9LDApLEU7dmFyIEg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiaW1nIik7SC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix1LCExKTtILmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKdywhMSk7ImRhdGE6IiE9PWIuc3Vic3RyKDAsNSkmJnZvaWQgMCE9PXRoaXMuY3Jvc3NPcmlnaW4mJihILmNyb3NzT3JpZ2luPXRoaXMuY3Jvc3NPcmlnaW4pO3oubWFuYWdlci5pdGVtU3RhcnQoYik7SC5zcmM9YjtyZXR1cm4gSH0sc2V0Q3Jvc3NPcmlnaW46ZnVuY3Rpb24oYil7dGhpcy5jcm9zc09yaWdpbj1iO3JldHVybiB0aGlzfSxzZXRQYXRoOmZ1bmN0aW9uKGIpe3RoaXMucGF0aD1iO3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oRmkucHJvdG90eXBlLHtjcm9zc09yaWdpbjoiYW5vbnltb3VzIixsb2FkOmZ1bmN0aW9uKGIsZSxoLG4pe2Z1bmN0aW9uIHUoSCl7ei5sb2FkKGJbSF0sZnVuY3Rpb24oSSl7dy5pbWFnZXNbSF09STtFKys7Nj09PUUmJih3Lm5lZWRzVXBkYXRlPSEwLGUmJmUodykpfSx2b2lkIDAsbil9dmFyIHc9bmV3IHVkLHo9bmV3IHNnKHRoaXMubWFuYWdlcik7ei5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTt6LnNldFBhdGgodGhpcy5wYXRoKTsKdmFyIEU9MDtmb3IoaD0wO2g8Yi5sZW5ndGg7KytoKXUoaCk7cmV0dXJuIHd9LHNldENyb3NzT3JpZ2luOmZ1bmN0aW9uKGIpe3RoaXMuY3Jvc3NPcmlnaW49YjtyZXR1cm4gdGhpc30sc2V0UGF0aDpmdW5jdGlvbihiKXt0aGlzLnBhdGg9YjtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKHNoLnByb3RvdHlwZSx7Y3Jvc3NPcmlnaW46ImFub255bW91cyIsbG9hZDpmdW5jdGlvbihiLGUsaCxuKXt2YXIgdT1uZXcgayx3PW5ldyBzZyh0aGlzLm1hbmFnZXIpO3cuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7dy5zZXRQYXRoKHRoaXMucGF0aCk7dy5sb2FkKGIsZnVuY3Rpb24oeil7dS5pbWFnZT16O3o9MDxiLnNlYXJjaCgvXC5qcGU/ZygkfFw/KS9pKXx8MD09PWIuc2VhcmNoKC9eZGF0YTppbWFnZVwvanBlZy8pO3UuZm9ybWF0PXo/MTAyMjoxMDIzO3UubmVlZHNVcGRhdGU9ITA7dm9pZCAwIT09ZSYmZSh1KX0saCxuKTtyZXR1cm4gdX0sc2V0Q3Jvc3NPcmlnaW46ZnVuY3Rpb24oYil7dGhpcy5jcm9zc09yaWdpbj0KYjtyZXR1cm4gdGhpc30sc2V0UGF0aDpmdW5jdGlvbihiKXt0aGlzLnBhdGg9YjtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKGViLnByb3RvdHlwZSx7Z2V0UG9pbnQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIik7cmV0dXJuIG51bGx9LGdldFBvaW50QXQ6ZnVuY3Rpb24oYixlKXtiPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYik7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYixlKX0sZ2V0UG9pbnRzOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihiPTUpO2Zvcih2YXIgZT1bXSxoPTA7aDw9YjtoKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQoaC9iKSk7cmV0dXJuIGV9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoYj01KTtmb3IodmFyIGU9W10saD0wO2g8PWI7aCsrKWUucHVzaCh0aGlzLmdldFBvaW50QXQoaC9iKSk7cmV0dXJuIGV9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0TGVuZ3RocygpOwpyZXR1cm4gYltiLmxlbmd0aC0xXX0sZ2V0TGVuZ3RoczpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoYj10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyk7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PWIrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7dmFyIGU9W10saD10aGlzLmdldFBvaW50KDApLG4sdT0wO2UucHVzaCgwKTtmb3Iobj0xO248PWI7bisrKXt2YXIgdz10aGlzLmdldFBvaW50KG4vYik7dSs9dy5kaXN0YW5jZVRvKGgpO2UucHVzaCh1KTtoPXd9cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzPWV9LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuZ2V0TGVuZ3RocygpfSxnZXRVdG9UbWFwcGluZzpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuZ2V0TGVuZ3RocygpLG49aC5sZW5ndGg7ZT1lP2U6YioKaFtuLTFdO2Zvcih2YXIgdT0wLHc9bi0xLHo7dTw9dzspaWYoYj1NYXRoLmZsb29yKHUrKHctdSkvMiksej1oW2JdLWUsMD56KXU9YisxO2Vsc2UgaWYoMDx6KXc9Yi0xO2Vsc2V7dz1iO2JyZWFrfWI9dztpZihoW2JdPT09ZSlyZXR1cm4gYi8obi0xKTt1PWhbYl07cmV0dXJuKGIrKGUtdSkvKGhbYisxXS11KSkvKG4tMSl9LGdldFRhbmdlbnQ6ZnVuY3Rpb24oYil7dmFyIGU9Yi0xRS00O2IrPTFFLTQ7MD5lJiYoZT0wKTsxPGImJihiPTEpO2U9dGhpcy5nZXRQb2ludChlKTtyZXR1cm4gdGhpcy5nZXRQb2ludChiKS5jbG9uZSgpLnN1YihlKS5ub3JtYWxpemUoKX0sZ2V0VGFuZ2VudEF0OmZ1bmN0aW9uKGIpe2I9dGhpcy5nZXRVdG9UbWFwcGluZyhiKTtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KGIpfSxjb21wdXRlRnJlbmV0RnJhbWVzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9bmV3IGcsbj1bXSx1PVtdLHc9W10sej1uZXcgZyxFPW5ldyBDLEg7Zm9yKEg9MDtIPD1iO0grKyl7dmFyIEk9CkgvYjtuW0hdPXRoaXMuZ2V0VGFuZ2VudEF0KEkpO25bSF0ubm9ybWFsaXplKCl9dVswXT1uZXcgZzt3WzBdPW5ldyBnO0g9TnVtYmVyLk1BWF9WQUxVRTtJPU1hdGguYWJzKG5bMF0ueCk7dmFyIE89TWF0aC5hYnMoblswXS55KSxRPU1hdGguYWJzKG5bMF0ueik7STw9SCYmKEg9SSxoLnNldCgxLDAsMCkpO088PUgmJihIPU8saC5zZXQoMCwxLDApKTtRPD1IJiZoLnNldCgwLDAsMSk7ei5jcm9zc1ZlY3RvcnMoblswXSxoKS5ub3JtYWxpemUoKTt1WzBdLmNyb3NzVmVjdG9ycyhuWzBdLHopO3dbMF0uY3Jvc3NWZWN0b3JzKG5bMF0sdVswXSk7Zm9yKEg9MTtIPD1iO0grKyl1W0hdPXVbSC0xXS5jbG9uZSgpLHdbSF09d1tILTFdLmNsb25lKCksei5jcm9zc1ZlY3RvcnMobltILTFdLG5bSF0pLHoubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04mJih6Lm5vcm1hbGl6ZSgpLGg9TWF0aC5hY29zKG9iLmNsYW1wKG5bSC0xXS5kb3QobltIXSksLTEsMSkpLHVbSF0uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyh6LApoKSkpLHdbSF0uY3Jvc3NWZWN0b3JzKG5bSF0sdVtIXSk7aWYoITA9PT1lKWZvcihoPU1hdGguYWNvcyhvYi5jbGFtcCh1WzBdLmRvdCh1W2JdKSwtMSwxKSksaC89YiwwPG5bMF0uZG90KHouY3Jvc3NWZWN0b3JzKHVbMF0sdVtiXSkpJiYoaD0taCksSD0xO0g8PWI7SCsrKXVbSF0uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyhuW0hdLGgqSCkpLHdbSF0uY3Jvc3NWZWN0b3JzKG5bSF0sdVtIXSk7cmV0dXJue3RhbmdlbnRzOm4sbm9ybWFsczp1LGJpbm9ybWFsczp3fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9Yi5hcmNMZW5ndGhEaXZpc2lvbnM7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBiPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O2IuYXJjTGVuZ3RoRGl2aXNpb25zPQp0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztiLnR5cGU9dGhpcy50eXBlO3JldHVybiBifSxmcm9tSlNPTjpmdW5jdGlvbihiKXt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz1iLmFyY0xlbmd0aERpdmlzaW9ucztyZXR1cm4gdGhpc319KTtFYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlYi5wcm90b3R5cGUpO0VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FYztFYy5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmU9ITA7RWMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGIsZSl7ZT1lfHxuZXcgZDtmb3IodmFyIGg9MipNYXRoLlBJLG49dGhpcy5hRW5kQW5nbGUtdGhpcy5hU3RhcnRBbmdsZSx1PU1hdGguYWJzKG4pPE51bWJlci5FUFNJTE9OOzA+bjspbis9aDtmb3IoO24+aDspbi09aDtuPE51bWJlci5FUFNJTE9OJiYobj11PzA6aCk7ITAhPT10aGlzLmFDbG9ja3dpc2V8fHV8fChuPW49PT1oPy1oOm4taCk7aD10aGlzLmFTdGFydEFuZ2xlK2IqbjtiPXRoaXMuYVgrdGhpcy54UmFkaXVzKgpNYXRoLmNvcyhoKTt2YXIgdz10aGlzLmFZK3RoaXMueVJhZGl1cypNYXRoLnNpbihoKTswIT09dGhpcy5hUm90YXRpb24mJihoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxuPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSx1PWItdGhpcy5hWCx3LT10aGlzLmFZLGI9dSpoLXcqbit0aGlzLmFYLHc9dSpuK3cqaCt0aGlzLmFZKTtyZXR1cm4gZS5zZXQoYix3KX07RWMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7ZWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuYVg9Yi5hWDt0aGlzLmFZPWIuYVk7dGhpcy54UmFkaXVzPWIueFJhZGl1czt0aGlzLnlSYWRpdXM9Yi55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9Yi5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1iLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9Yi5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWIuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtFYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9CmViLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLmFYPXRoaXMuYVg7Yi5hWT10aGlzLmFZO2IueFJhZGl1cz10aGlzLnhSYWRpdXM7Yi55UmFkaXVzPXRoaXMueVJhZGl1cztiLmFTdGFydEFuZ2xlPXRoaXMuYVN0YXJ0QW5nbGU7Yi5hRW5kQW5nbGU9dGhpcy5hRW5kQW5nbGU7Yi5hQ2xvY2t3aXNlPXRoaXMuYUNsb2Nrd2lzZTtiLmFSb3RhdGlvbj10aGlzLmFSb3RhdGlvbjtyZXR1cm4gYn07RWMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2ViLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5hWD1iLmFYO3RoaXMuYVk9Yi5hWTt0aGlzLnhSYWRpdXM9Yi54UmFkaXVzO3RoaXMueVJhZGl1cz1iLnlSYWRpdXM7dGhpcy5hU3RhcnRBbmdsZT1iLmFTdGFydEFuZ2xlO3RoaXMuYUVuZEFuZ2xlPWIuYUVuZEFuZ2xlO3RoaXMuYUNsb2Nrd2lzZT1iLmFDbG9ja3dpc2U7dGhpcy5hUm90YXRpb249Yi5hUm90YXRpb247cmV0dXJuIHRoaXN9O2hmLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZShFYy5wcm90b3R5cGUpO2hmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZjtoZi5wcm90b3R5cGUuaXNBcmNDdXJ2ZT0hMDt2YXIgSGg9bmV3IGcsZGo9bmV3IEdpLGVqPW5ldyBHaSxmaj1uZXcgR2k7cmMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZWIucHJvdG90eXBlKTtyYy5wcm90b3R5cGUuY29uc3RydWN0b3I9cmM7cmMucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMDtyYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBnO3ZhciBoPXRoaXMucG9pbnRzLG49aC5sZW5ndGg7Yio9bi0odGhpcy5jbG9zZWQ/MDoxKTt2YXIgdT1NYXRoLmZsb29yKGIpO2ItPXU7dGhpcy5jbG9zZWQ/dSs9MDx1PzA6KE1hdGguZmxvb3IoTWF0aC5hYnModSkvbikrMSkqbjowPT09YiYmdT09PW4tMSYmKHU9bi0yLGI9MSk7aWYodGhpcy5jbG9zZWR8fDA8dSl2YXIgdz1oWyh1LTEpJW5dO2Vsc2UgSGguc3ViVmVjdG9ycyhoWzBdLGhbMV0pLmFkZChoWzBdKSwKdz1IaDt2YXIgej1oW3Ulbl07dmFyIEU9aFsodSsxKSVuXTt0aGlzLmNsb3NlZHx8dSsyPG4/aD1oWyh1KzIpJW5dOihIaC5zdWJWZWN0b3JzKGhbbi0xXSxoW24tMl0pLmFkZChoW24tMV0pLGg9SGgpO2lmKCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe3ZhciBIPSJjaG9yZGFsIj09PXRoaXMuY3VydmVUeXBlPy41Oi4yNTtuPU1hdGgucG93KHcuZGlzdGFuY2VUb1NxdWFyZWQoeiksSCk7dT1NYXRoLnBvdyh6LmRpc3RhbmNlVG9TcXVhcmVkKEUpLEgpO0g9TWF0aC5wb3coRS5kaXN0YW5jZVRvU3F1YXJlZChoKSxIKTsxRS00PnUmJih1PTEpOzFFLTQ+biYmKG49dSk7MUUtND5IJiYoSD11KTtkai5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20ody54LHoueCxFLngsaC54LG4sdSxIKTtlai5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20ody55LHoueSxFLnksaC55LG4sdSxIKTtmai5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20ody56LAp6LnosRS56LGgueixuLHUsSCl9ZWxzZSJjYXRtdWxscm9tIj09PXRoaXMuY3VydmVUeXBlJiYoZGouaW5pdENhdG11bGxSb20ody54LHoueCxFLngsaC54LHRoaXMudGVuc2lvbiksZWouaW5pdENhdG11bGxSb20ody55LHoueSxFLnksaC55LHRoaXMudGVuc2lvbiksZmouaW5pdENhdG11bGxSb20ody56LHoueixFLnosaC56LHRoaXMudGVuc2lvbikpO2Uuc2V0KGRqLmNhbGMoYiksZWouY2FsYyhiKSxmai5jYWxjKGIpKTtyZXR1cm4gZX07cmMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7ZWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMucG9pbnRzPVtdO2Zvcih2YXIgZT0wLGg9Yi5wb2ludHMubGVuZ3RoO2U8aDtlKyspdGhpcy5wb2ludHMucHVzaChiLnBvaW50c1tlXS5jbG9uZSgpKTt0aGlzLmNsb3NlZD1iLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1iLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249Yi50ZW5zaW9uO3JldHVybiB0aGlzfTtyYy5wcm90b3R5cGUudG9KU09OPQpmdW5jdGlvbigpe3ZhciBiPWViLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnBvaW50cz1bXTtmb3IodmFyIGU9MCxoPXRoaXMucG9pbnRzLmxlbmd0aDtlPGg7ZSsrKWIucG9pbnRzLnB1c2godGhpcy5wb2ludHNbZV0udG9BcnJheSgpKTtiLmNsb3NlZD10aGlzLmNsb3NlZDtiLmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZTtiLnRlbnNpb249dGhpcy50ZW5zaW9uO3JldHVybiBifTtyYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYil7ZWIucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxiKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGU9MCxoPWIucG9pbnRzLmxlbmd0aDtlPGg7ZSsrKXt2YXIgbj1iLnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgZykuZnJvbUFycmF5KG4pKX10aGlzLmNsb3NlZD1iLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1iLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249Yi50ZW5zaW9uO3JldHVybiB0aGlzfTtWYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlYi5wcm90b3R5cGUpOwpWYy5wcm90b3R5cGUuY29uc3RydWN0b3I9VmM7VmMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZT0hMDtWYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBkO3ZhciBoPXRoaXMudjAsbj10aGlzLnYxLHU9dGhpcy52Mix3PXRoaXMudjM7ZS5zZXQodWcoYixoLngsbi54LHUueCx3LngpLHVnKGIsaC55LG4ueSx1Lnksdy55KSk7cmV0dXJuIGV9O1ZjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2ViLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLnYwLmNvcHkoYi52MCk7dGhpcy52MS5jb3B5KGIudjEpO3RoaXMudjIuY29weShiLnYyKTt0aGlzLnYzLmNvcHkoYi52Myk7cmV0dXJuIHRoaXN9O1ZjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYj1lYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7Yi52MD10aGlzLnYwLnRvQXJyYXkoKTtiLnYxPXRoaXMudjEudG9BcnJheSgpO2IudjI9dGhpcy52Mi50b0FycmF5KCk7CmIudjM9dGhpcy52My50b0FycmF5KCk7cmV0dXJuIGJ9O1ZjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihiKXtlYi5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGIpO3RoaXMudjAuZnJvbUFycmF5KGIudjApO3RoaXMudjEuZnJvbUFycmF5KGIudjEpO3RoaXMudjIuZnJvbUFycmF5KGIudjIpO3RoaXMudjMuZnJvbUFycmF5KGIudjMpO3JldHVybiB0aGlzfTtvZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlYi5wcm90b3R5cGUpO29kLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1vZDtvZC5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlMz0hMDtvZC5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBnO3ZhciBoPXRoaXMudjAsbj10aGlzLnYxLHU9dGhpcy52Mix3PXRoaXMudjM7ZS5zZXQodWcoYixoLngsbi54LHUueCx3LngpLHVnKGIsaC55LG4ueSx1Lnksdy55KSx1ZyhiLGgueixuLnosdS56LHcueikpO3JldHVybiBlfTtvZC5wcm90b3R5cGUuY29weT0KZnVuY3Rpb24oYil7ZWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMudjAuY29weShiLnYwKTt0aGlzLnYxLmNvcHkoYi52MSk7dGhpcy52Mi5jb3B5KGIudjIpO3RoaXMudjMuY29weShiLnYzKTtyZXR1cm4gdGhpc307b2QucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWViLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnYwPXRoaXMudjAudG9BcnJheSgpO2IudjE9dGhpcy52MS50b0FycmF5KCk7Yi52Mj10aGlzLnYyLnRvQXJyYXkoKTtiLnYzPXRoaXMudjMudG9BcnJheSgpO3JldHVybiBifTtvZC5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYil7ZWIucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxiKTt0aGlzLnYwLmZyb21BcnJheShiLnYwKTt0aGlzLnYxLmZyb21BcnJheShiLnYxKTt0aGlzLnYyLmZyb21BcnJheShiLnYyKTt0aGlzLnYzLmZyb21BcnJheShiLnYzKTtyZXR1cm4gdGhpc307QmMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZWIucHJvdG90eXBlKTsKQmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPUJjO0JjLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZT0hMDtCYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBkOzE9PT1iP2UuY29weSh0aGlzLnYyKTooZS5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxlLm11bHRpcGx5U2NhbGFyKGIpLmFkZCh0aGlzLnYxKSk7cmV0dXJuIGV9O0JjLnByb3RvdHlwZS5nZXRQb2ludEF0PWZ1bmN0aW9uKGIsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYixlKX07QmMucHJvdG90eXBlLmdldFRhbmdlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52Mi5jbG9uZSgpLnN1Yih0aGlzLnYxKS5ub3JtYWxpemUoKX07QmMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7ZWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMudjEuY29weShiLnYxKTt0aGlzLnYyLmNvcHkoYi52Mik7cmV0dXJuIHRoaXN9O0JjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYj1lYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7CmIudjE9dGhpcy52MS50b0FycmF5KCk7Yi52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYn07QmMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2ViLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy52MS5mcm9tQXJyYXkoYi52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYi52Mik7cmV0dXJuIHRoaXN9O1djLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGViLnByb3RvdHlwZSk7V2MucHJvdG90eXBlLmNvbnN0cnVjdG9yPVdjO1djLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZTM9ITA7V2MucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGIsZSl7ZT1lfHxuZXcgZzsxPT09Yj9lLmNvcHkodGhpcy52Mik6KGUuY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksZS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy52MSkpO3JldHVybiBlfTtXYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihiLGUpe3JldHVybiB0aGlzLmdldFBvaW50KGIsZSl9O1djLnByb3RvdHlwZS5jb3B5PQpmdW5jdGlvbihiKXtlYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy52MS5jb3B5KGIudjEpO3RoaXMudjIuY29weShiLnYyKTtyZXR1cm4gdGhpc307V2MucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWViLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnYxPXRoaXMudjEudG9BcnJheSgpO2IudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGJ9O1djLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihiKXtlYi5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGIpO3RoaXMudjEuZnJvbUFycmF5KGIudjEpO3RoaXMudjIuZnJvbUFycmF5KGIudjIpO3JldHVybiB0aGlzfTtYYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlYi5wcm90b3R5cGUpO1hjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YYztYYy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMDtYYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBkOwp2YXIgaD10aGlzLnYwLG49dGhpcy52MSx1PXRoaXMudjI7ZS5zZXQodGcoYixoLngsbi54LHUueCksdGcoYixoLnksbi55LHUueSkpO3JldHVybiBlfTtYYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtlYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy52MC5jb3B5KGIudjApO3RoaXMudjEuY29weShiLnYxKTt0aGlzLnYyLmNvcHkoYi52Mik7cmV0dXJuIHRoaXN9O1hjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYj1lYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7Yi52MD10aGlzLnYwLnRvQXJyYXkoKTtiLnYxPXRoaXMudjEudG9BcnJheSgpO2IudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGJ9O1hjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihiKXtlYi5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGIpO3RoaXMudjAuZnJvbUFycmF5KGIudjApO3RoaXMudjEuZnJvbUFycmF5KGIudjEpO3RoaXMudjIuZnJvbUFycmF5KGIudjIpOwpyZXR1cm4gdGhpc307cGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZWIucHJvdG90eXBlKTtwZC5wcm90b3R5cGUuY29uc3RydWN0b3I9cGQ7cGQucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO3BkLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihiLGUpe2U9ZXx8bmV3IGc7dmFyIGg9dGhpcy52MCxuPXRoaXMudjEsdT10aGlzLnYyO2Uuc2V0KHRnKGIsaC54LG4ueCx1LngpLHRnKGIsaC55LG4ueSx1LnkpLHRnKGIsaC56LG4ueix1LnopKTtyZXR1cm4gZX07cGQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7ZWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMudjAuY29weShiLnYwKTt0aGlzLnYxLmNvcHkoYi52MSk7dGhpcy52Mi5jb3B5KGIudjIpO3JldHVybiB0aGlzfTtwZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9ZWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IudjA9dGhpcy52MC50b0FycmF5KCk7Yi52MT0KdGhpcy52MS50b0FycmF5KCk7Yi52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYn07cGQucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2ViLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy52MC5mcm9tQXJyYXkoYi52MCk7dGhpcy52MS5mcm9tQXJyYXkoYi52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYi52Mik7cmV0dXJuIHRoaXN9O1ljLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGViLnByb3RvdHlwZSk7WWMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVljO1ljLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlPSEwO1ljLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihiLGUpe2U9ZXx8bmV3IGQ7dmFyIGg9dGhpcy5wb2ludHMsbj0oaC5sZW5ndGgtMSkqYjtiPU1hdGguZmxvb3Iobik7bi09Yjt2YXIgdT1oWzA9PT1iP2I6Yi0xXSx3PWhbYl0sej1oW2I+aC5sZW5ndGgtMj9oLmxlbmd0aC0xOmIrMV07aD1oW2I+aC5sZW5ndGgtMz9oLmxlbmd0aC0xOmIrMl07CmUuc2V0KEdsKG4sdS54LHcueCx6LngsaC54KSxHbChuLHUueSx3Lnksei55LGgueSkpO3JldHVybiBlfTtZYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtlYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5wb2ludHM9W107Zm9yKHZhciBlPTAsaD1iLnBvaW50cy5sZW5ndGg7ZTxoO2UrKyl0aGlzLnBvaW50cy5wdXNoKGIucG9pbnRzW2VdLmNsb25lKCkpO3JldHVybiB0aGlzfTtZYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9ZWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IucG9pbnRzPVtdO2Zvcih2YXIgZT0wLGg9dGhpcy5wb2ludHMubGVuZ3RoO2U8aDtlKyspYi5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tlXS50b0FycmF5KCkpO3JldHVybiBifTtZYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYil7ZWIucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxiKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGU9MCxoPWIucG9pbnRzLmxlbmd0aDtlPApoO2UrKyl7dmFyIG49Yi5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IGQpLmZyb21BcnJheShuKSl9cmV0dXJuIHRoaXN9O3ZhciBnaj1PYmplY3QuZnJlZXplKHtBcmNDdXJ2ZTpoZixDYXRtdWxsUm9tQ3VydmUzOnJjLEN1YmljQmV6aWVyQ3VydmU6VmMsQ3ViaWNCZXppZXJDdXJ2ZTM6b2QsRWxsaXBzZUN1cnZlOkVjLExpbmVDdXJ2ZTpCYyxMaW5lQ3VydmUzOldjLFF1YWRyYXRpY0JlemllckN1cnZlOlhjLFF1YWRyYXRpY0JlemllckN1cnZlMzpwZCxTcGxpbmVDdXJ2ZTpZY30pO0FkLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZWIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6QWQsYWRkOmZ1bmN0aW9uKGIpe3RoaXMuY3VydmVzLnB1c2goYil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuY3VydmVzWzBdLmdldFBvaW50KDApLGU9dGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoLTFdLmdldFBvaW50KDEpO2IuZXF1YWxzKGUpfHwKdGhpcy5jdXJ2ZXMucHVzaChuZXcgQmMoZSxiKSl9LGdldFBvaW50OmZ1bmN0aW9uKGIpe3ZhciBlPWIqdGhpcy5nZXRMZW5ndGgoKSxoPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7Zm9yKGI9MDtiPGgubGVuZ3RoOyl7aWYoaFtiXT49ZSlyZXR1cm4gZT1oW2JdLWUsYj10aGlzLmN1cnZlc1tiXSxoPWIuZ2V0TGVuZ3RoKCksYi5nZXRQb2ludEF0KDA9PT1oPzA6MS1lL2gpO2IrK31yZXR1cm4gbnVsbH0sZ2V0TGVuZ3RoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtyZXR1cm4gYltiLmxlbmd0aC0xXX0sdXBkYXRlQXJjTGVuZ3RoczpmdW5jdGlvbigpe3RoaXMubmVlZHNVcGRhdGU9ITA7dGhpcy5jYWNoZUxlbmd0aHM9bnVsbDt0aGlzLmdldEN1cnZlTGVuZ3RocygpfSxnZXRDdXJ2ZUxlbmd0aHM6ZnVuY3Rpb24oKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3RoczsKZm9yKHZhciBiPVtdLGU9MCxoPTAsbj10aGlzLmN1cnZlcy5sZW5ndGg7aDxuO2grKyllKz10aGlzLmN1cnZlc1toXS5nZXRMZW5ndGgoKSxiLnB1c2goZSk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPWJ9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoYj00MCk7Zm9yKHZhciBlPVtdLGg9MDtoPD1iO2grKyllLnB1c2godGhpcy5nZXRQb2ludChoL2IpKTt0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pO3JldHVybiBlfSxnZXRQb2ludHM6ZnVuY3Rpb24oYil7Yj1ifHwxMjtmb3IodmFyIGU9W10saCxuPTAsdT10aGlzLmN1cnZlcztuPHUubGVuZ3RoO24rKyl7dmFyIHc9dVtuXTt3PXcuZ2V0UG9pbnRzKHcmJncuaXNFbGxpcHNlQ3VydmU/MipiOncmJih3LmlzTGluZUN1cnZlfHx3LmlzTGluZUN1cnZlMyk/MTp3JiZ3LmlzU3BsaW5lQ3VydmU/Yip3LnBvaW50cy5sZW5ndGg6Yik7Zm9yKHZhciB6PTA7ejx3Lmxlbmd0aDt6Kyspe3ZhciBFPXdbel07CmgmJmguZXF1YWxzKEUpfHwoZS5wdXNoKEUpLGg9RSl9fXRoaXMuYXV0b0Nsb3NlJiYxPGUubGVuZ3RoJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKTtyZXR1cm4gZX0sY29weTpmdW5jdGlvbihiKXtlYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBlPTAsaD1iLmN1cnZlcy5sZW5ndGg7ZTxoO2UrKyl0aGlzLmN1cnZlcy5wdXNoKGIuY3VydmVzW2VdLmNsb25lKCkpO3RoaXMuYXV0b0Nsb3NlPWIuYXV0b0Nsb3NlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj1lYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7Yi5hdXRvQ2xvc2U9dGhpcy5hdXRvQ2xvc2U7Yi5jdXJ2ZXM9W107Zm9yKHZhciBlPTAsaD10aGlzLmN1cnZlcy5sZW5ndGg7ZTxoO2UrKyliLmN1cnZlcy5wdXNoKHRoaXMuY3VydmVzW2VdLnRvSlNPTigpKTtyZXR1cm4gYn0sZnJvbUpTT046ZnVuY3Rpb24oYil7ZWIucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcywKYik7dGhpcy5hdXRvQ2xvc2U9Yi5hdXRvQ2xvc2U7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBlPTAsaD1iLmN1cnZlcy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG49Yi5jdXJ2ZXNbZV07dGhpcy5jdXJ2ZXMucHVzaCgobmV3IGdqW24udHlwZV0pLmZyb21KU09OKG4pKX1yZXR1cm4gdGhpc319KTtaYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEFkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlpjLHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYil7dGhpcy5tb3ZlVG8oYlswXS54LGJbMF0ueSk7Zm9yKHZhciBlPTEsaD1iLmxlbmd0aDtlPGg7ZSsrKXRoaXMubGluZVRvKGJbZV0ueCxiW2VdLnkpfSxtb3ZlVG86ZnVuY3Rpb24oYixlKXt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYixlKX0sbGluZVRvOmZ1bmN0aW9uKGIsZSl7dmFyIGg9bmV3IEJjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGQoYixlKSk7dGhpcy5jdXJ2ZXMucHVzaChoKTt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYiwKZSl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYixlLGgsbil7Yj1uZXcgWGModGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgZChiLGUpLG5ldyBkKGgsbikpO3RoaXMuY3VydmVzLnB1c2goYik7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGgsbil9LGJlemllckN1cnZlVG86ZnVuY3Rpb24oYixlLGgsbix1LHcpe2I9bmV3IFZjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGQoYixlKSxuZXcgZChoLG4pLG5ldyBkKHUsdykpO3RoaXMuY3VydmVzLnB1c2goYik7dGhpcy5jdXJyZW50UG9pbnQuc2V0KHUsdyl9LHNwbGluZVRocnU6ZnVuY3Rpb24oYil7dmFyIGU9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdChiKTtlPW5ldyBZYyhlKTt0aGlzLmN1cnZlcy5wdXNoKGUpO3RoaXMuY3VycmVudFBvaW50LmNvcHkoYltiLmxlbmd0aC0xXSl9LGFyYzpmdW5jdGlvbihiLGUsaCxuLHUsdyl7dGhpcy5hYnNhcmMoYit0aGlzLmN1cnJlbnRQb2ludC54LGUrdGhpcy5jdXJyZW50UG9pbnQueSwKaCxuLHUsdyl9LGFic2FyYzpmdW5jdGlvbihiLGUsaCxuLHUsdyl7dGhpcy5hYnNlbGxpcHNlKGIsZSxoLGgsbix1LHcpfSxlbGxpcHNlOmZ1bmN0aW9uKGIsZSxoLG4sdSx3LHosRSl7dGhpcy5hYnNlbGxpcHNlKGIrdGhpcy5jdXJyZW50UG9pbnQueCxlK3RoaXMuY3VycmVudFBvaW50LnksaCxuLHUsdyx6LEUpfSxhYnNlbGxpcHNlOmZ1bmN0aW9uKGIsZSxoLG4sdSx3LHosRSl7Yj1uZXcgRWMoYixlLGgsbix1LHcseixFKTswPHRoaXMuY3VydmVzLmxlbmd0aCYmKGU9Yi5nZXRQb2ludCgwKSxlLmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCl8fHRoaXMubGluZVRvKGUueCxlLnkpKTt0aGlzLmN1cnZlcy5wdXNoKGIpO2I9Yi5nZXRQb2ludCgxKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGIpfSxjb3B5OmZ1bmN0aW9uKGIpe0FkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGIuY3VycmVudFBvaW50KTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGI9CkFkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7cmV0dXJuIGJ9LGZyb21KU09OOmZ1bmN0aW9uKGIpe0FkLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KGIuY3VycmVudFBvaW50KTtyZXR1cm4gdGhpc319KTtYZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFpjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlhkLGdldFBvaW50c0hvbGVzOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1bXSxoPTAsbj10aGlzLmhvbGVzLmxlbmd0aDtoPG47aCsrKWVbaF09dGhpcy5ob2xlc1toXS5nZXRQb2ludHMoYik7cmV0dXJuIGV9LGV4dHJhY3RQb2ludHM6ZnVuY3Rpb24oYil7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKGIpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXMoYil9fSxjb3B5OmZ1bmN0aW9uKGIpe1pjLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYik7dGhpcy5ob2xlcz1bXTtmb3IodmFyIGU9MCxoPWIuaG9sZXMubGVuZ3RoO2U8aDtlKyspdGhpcy5ob2xlcy5wdXNoKGIuaG9sZXNbZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBiPVpjLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnV1aWQ9dGhpcy51dWlkO2IuaG9sZXM9W107Zm9yKHZhciBlPTAsaD10aGlzLmhvbGVzLmxlbmd0aDtlPGg7ZSsrKWIuaG9sZXMucHVzaCh0aGlzLmhvbGVzW2VdLnRvSlNPTigpKTtyZXR1cm4gYn0sZnJvbUpTT046ZnVuY3Rpb24oYil7WmMucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxiKTt0aGlzLnV1aWQ9Yi51dWlkO3RoaXMuaG9sZXM9W107Zm9yKHZhciBlPTAsaD1iLmhvbGVzLmxlbmd0aDtlPGg7ZSsrKXt2YXIgbj1iLmhvbGVzW2VdO3RoaXMuaG9sZXMucHVzaCgobmV3IFpjKS5mcm9tSlNPTihuKSl9cmV0dXJuIHRoaXN9fSk7U2IucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpTYixpc0xpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYil7Uy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMuaW50ZW5zaXR5PWIuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYil7Yj1TLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGIpO2Iub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCk7Yi5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5O3ZvaWQgMCE9PXRoaXMuZ3JvdW5kQ29sb3ImJihiLm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKTt2b2lkIDAhPT10aGlzLmRpc3RhbmNlJiYoYi5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSk7dm9pZCAwIT09dGhpcy5hbmdsZSYmKGIub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpO3ZvaWQgMCE9PXRoaXMuZGVjYXkmJihiLm9iamVjdC5kZWNheT10aGlzLmRlY2F5KTt2b2lkIDAhPT0KdGhpcy5wZW51bWJyYSYmKGIub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpO3ZvaWQgMCE9PXRoaXMuc2hhZG93JiYoYi5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKTtyZXR1cm4gYn19KTt0aC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFNiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnRoLGlzSGVtaXNwaGVyZUxpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYil7U2IucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZ3JvdW5kQ29sb3IuY29weShiLmdyb3VuZENvbG9yKTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKHdlLnByb3RvdHlwZSx7Y29weTpmdW5jdGlvbihiKXt0aGlzLmNhbWVyYT1iLmNhbWVyYS5jbG9uZSgpO3RoaXMuYmlhcz1iLmJpYXM7dGhpcy5yYWRpdXM9Yi5yYWRpdXM7dGhpcy5tYXBTaXplLmNvcHkoYi5tYXBTaXplKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LAp0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj17fTswIT09dGhpcy5iaWFzJiYoYi5iaWFzPXRoaXMuYmlhcyk7MSE9PXRoaXMucmFkaXVzJiYoYi5yYWRpdXM9dGhpcy5yYWRpdXMpO2lmKDUxMiE9PXRoaXMubWFwU2l6ZS54fHw1MTIhPT10aGlzLm1hcFNpemUueSliLm1hcFNpemU9dGhpcy5tYXBTaXplLnRvQXJyYXkoKTtiLmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdDtkZWxldGUgYi5jYW1lcmEubWF0cml4O3JldHVybiBifX0pO3VoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUod2UucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6dWgsaXNTcG90TGlnaHRTaGFkb3c6ITAsdXBkYXRlOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuY2FtZXJhLGg9MipvYi5SQUQyREVHKmIuYW5nbGUsbj10aGlzLm1hcFNpemUud2lkdGgvdGhpcy5tYXBTaXplLmhlaWdodDtiPWIuZGlzdGFuY2V8fGUuZmFyO2lmKGghPT1lLmZvdnx8biE9PWUuYXNwZWN0fHxiIT09ZS5mYXIpZS5mb3Y9CmgsZS5hc3BlY3Q9bixlLmZhcj1iLGUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfX0pO3ZoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6dmgsaXNTcG90TGlnaHQ6ITAsY29weTpmdW5jdGlvbihiKXtTYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5kaXN0YW5jZT1iLmRpc3RhbmNlO3RoaXMuYW5nbGU9Yi5hbmdsZTt0aGlzLnBlbnVtYnJhPWIucGVudW1icmE7dGhpcy5kZWNheT1iLmRlY2F5O3RoaXMudGFyZ2V0PWIudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9Yi5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTt3aC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFNiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOndoLGlzUG9pbnRMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGIpe1NiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmRpc3RhbmNlPWIuZGlzdGFuY2U7CnRoaXMuZGVjYXk9Yi5kZWNheTt0aGlzLnNoYWRvdz1iLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO3ZnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoamQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6dmcsaXNPcnRob2dyYXBoaWNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihiLGUpe2pkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiLGUpO3RoaXMubGVmdD1iLmxlZnQ7dGhpcy5yaWdodD1iLnJpZ2h0O3RoaXMudG9wPWIudG9wO3RoaXMuYm90dG9tPWIuYm90dG9tO3RoaXMubmVhcj1iLm5lYXI7dGhpcy5mYXI9Yi5mYXI7dGhpcy56b29tPWIuem9vbTt0aGlzLnZpZXc9bnVsbD09PWIudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYi52aWV3KTtyZXR1cm4gdGhpc30sc2V0Vmlld09mZnNldDpmdW5jdGlvbihiLGUsaCxuLHUsdyl7bnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLApvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pO3RoaXMudmlldy5lbmFibGVkPSEwO3RoaXMudmlldy5mdWxsV2lkdGg9Yjt0aGlzLnZpZXcuZnVsbEhlaWdodD1lO3RoaXMudmlldy5vZmZzZXRYPWg7dGhpcy52aWV3Lm9mZnNldFk9bjt0aGlzLnZpZXcud2lkdGg9dTt0aGlzLnZpZXcuaGVpZ2h0PXc7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LGNsZWFyVmlld09mZnNldDpmdW5jdGlvbigpe251bGwhPT10aGlzLnZpZXcmJih0aGlzLnZpZXcuZW5hYmxlZD0hMSk7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYj0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksZT0odGhpcy50b3AtdGhpcy5ib3R0b20pLygyKnRoaXMuem9vbSksaD0odGhpcy5yaWdodCt0aGlzLmxlZnQpLzIsbj0odGhpcy50b3ArdGhpcy5ib3R0b20pLzIsdT1oLWI7aCs9YjtiPW4rZTtlPW4tZTtpZihudWxsIT09CnRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2g9dGhpcy56b29tLyh0aGlzLnZpZXcud2lkdGgvdGhpcy52aWV3LmZ1bGxXaWR0aCk7ZT10aGlzLnpvb20vKHRoaXMudmlldy5oZWlnaHQvdGhpcy52aWV3LmZ1bGxIZWlnaHQpO3ZhciB3PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LndpZHRoO249KHRoaXMudG9wLXRoaXMuYm90dG9tKS90aGlzLnZpZXcuaGVpZ2h0O3UrPXRoaXMudmlldy5vZmZzZXRYL2gqdztoPXUrdGhpcy52aWV3LndpZHRoL2gqdztiLT10aGlzLnZpZXcub2Zmc2V0WS9lKm47ZT1iLXRoaXMudmlldy5oZWlnaHQvZSpufXRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKHUsaCxiLGUsdGhpcy5uZWFyLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sdG9KU09OOmZ1bmN0aW9uKGIpe2I9Uy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTsKYi5vYmplY3Quem9vbT10aGlzLnpvb207Yi5vYmplY3QubGVmdD10aGlzLmxlZnQ7Yi5vYmplY3QucmlnaHQ9dGhpcy5yaWdodDtiLm9iamVjdC50b3A9dGhpcy50b3A7Yi5vYmplY3QuYm90dG9tPXRoaXMuYm90dG9tO2Iub2JqZWN0Lm5lYXI9dGhpcy5uZWFyO2Iub2JqZWN0LmZhcj10aGlzLmZhcjtudWxsIT09dGhpcy52aWV3JiYoYi5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpO3JldHVybiBifX0pO3hoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUod2UucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eGh9KTt5aC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFNiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnloLGlzRGlyZWN0aW9uYWxMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGIpe1NiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLnRhcmdldD1iLnRhcmdldC5jbG9uZSgpO3RoaXMuc2hhZG93PWIuc2hhZG93LmNsb25lKCk7CnJldHVybiB0aGlzfX0pO3poLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6emgsaXNBbWJpZW50TGlnaHQ6ITB9KTtBaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFNiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkFoLGlzUmVjdEFyZWFMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGIpe1NiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLndpZHRoPWIud2lkdGg7dGhpcy5oZWlnaHQ9Yi5oZWlnaHQ7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihiKXtiPVNiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGIpO2Iub2JqZWN0LndpZHRoPXRoaXMud2lkdGg7Yi5vYmplY3QuaGVpZ2h0PXRoaXMuaGVpZ2h0O3JldHVybiBifX0pO09iamVjdC5hc3NpZ24oQmgucHJvdG90eXBlLHtsb2FkOmZ1bmN0aW9uKGIsZSxoLG4pe3ZhciB1PXRoaXMsdz1uZXcgVWModS5tYW5hZ2VyKTt3LnNldFBhdGgodS5wYXRoKTsKdy5sb2FkKGIsZnVuY3Rpb24oeil7ZSh1LnBhcnNlKEpTT04ucGFyc2UoeikpKX0saCxuKX0scGFyc2U6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZShFKXt2b2lkIDA9PT1oW0VdJiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZSIsRSk7cmV0dXJuIGhbRV19dmFyIGg9dGhpcy50ZXh0dXJlcyxuPW5ldyBvcFtiLnR5cGVdO3ZvaWQgMCE9PWIudXVpZCYmKG4udXVpZD1iLnV1aWQpO3ZvaWQgMCE9PWIubmFtZSYmKG4ubmFtZT1iLm5hbWUpO3ZvaWQgMCE9PWIuY29sb3ImJm4uY29sb3Iuc2V0SGV4KGIuY29sb3IpO3ZvaWQgMCE9PWIucm91Z2huZXNzJiYobi5yb3VnaG5lc3M9Yi5yb3VnaG5lc3MpO3ZvaWQgMCE9PWIubWV0YWxuZXNzJiYobi5tZXRhbG5lc3M9Yi5tZXRhbG5lc3MpO3ZvaWQgMCE9PWIuZW1pc3NpdmUmJm4uZW1pc3NpdmUuc2V0SGV4KGIuZW1pc3NpdmUpO3ZvaWQgMCE9PWIuc3BlY3VsYXImJm4uc3BlY3VsYXIuc2V0SGV4KGIuc3BlY3VsYXIpOwp2b2lkIDAhPT1iLnNoaW5pbmVzcyYmKG4uc2hpbmluZXNzPWIuc2hpbmluZXNzKTt2b2lkIDAhPT1iLmNsZWFyQ29hdCYmKG4uY2xlYXJDb2F0PWIuY2xlYXJDb2F0KTt2b2lkIDAhPT1iLmNsZWFyQ29hdFJvdWdobmVzcyYmKG4uY2xlYXJDb2F0Um91Z2huZXNzPWIuY2xlYXJDb2F0Um91Z2huZXNzKTt2b2lkIDAhPT1iLnZlcnRleENvbG9ycyYmKG4udmVydGV4Q29sb3JzPWIudmVydGV4Q29sb3JzKTt2b2lkIDAhPT1iLmZvZyYmKG4uZm9nPWIuZm9nKTt2b2lkIDAhPT1iLmZsYXRTaGFkaW5nJiYobi5mbGF0U2hhZGluZz1iLmZsYXRTaGFkaW5nKTt2b2lkIDAhPT1iLmJsZW5kaW5nJiYobi5ibGVuZGluZz1iLmJsZW5kaW5nKTt2b2lkIDAhPT1iLmNvbWJpbmUmJihuLmNvbWJpbmU9Yi5jb21iaW5lKTt2b2lkIDAhPT1iLnNpZGUmJihuLnNpZGU9Yi5zaWRlKTt2b2lkIDAhPT1iLm9wYWNpdHkmJihuLm9wYWNpdHk9Yi5vcGFjaXR5KTt2b2lkIDAhPT1iLnRyYW5zcGFyZW50JiYobi50cmFuc3BhcmVudD0KYi50cmFuc3BhcmVudCk7dm9pZCAwIT09Yi5hbHBoYVRlc3QmJihuLmFscGhhVGVzdD1iLmFscGhhVGVzdCk7dm9pZCAwIT09Yi5kZXB0aFRlc3QmJihuLmRlcHRoVGVzdD1iLmRlcHRoVGVzdCk7dm9pZCAwIT09Yi5kZXB0aFdyaXRlJiYobi5kZXB0aFdyaXRlPWIuZGVwdGhXcml0ZSk7dm9pZCAwIT09Yi5jb2xvcldyaXRlJiYobi5jb2xvcldyaXRlPWIuY29sb3JXcml0ZSk7dm9pZCAwIT09Yi53aXJlZnJhbWUmJihuLndpcmVmcmFtZT1iLndpcmVmcmFtZSk7dm9pZCAwIT09Yi53aXJlZnJhbWVMaW5ld2lkdGgmJihuLndpcmVmcmFtZUxpbmV3aWR0aD1iLndpcmVmcmFtZUxpbmV3aWR0aCk7dm9pZCAwIT09Yi53aXJlZnJhbWVMaW5lY2FwJiYobi53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcCk7dm9pZCAwIT09Yi53aXJlZnJhbWVMaW5lam9pbiYmKG4ud2lyZWZyYW1lTGluZWpvaW49Yi53aXJlZnJhbWVMaW5lam9pbik7dm9pZCAwIT09Yi5yb3RhdGlvbiYmKG4ucm90YXRpb249CmIucm90YXRpb24pOzEhPT1iLmxpbmV3aWR0aCYmKG4ubGluZXdpZHRoPWIubGluZXdpZHRoKTt2b2lkIDAhPT1iLmRhc2hTaXplJiYobi5kYXNoU2l6ZT1iLmRhc2hTaXplKTt2b2lkIDAhPT1iLmdhcFNpemUmJihuLmdhcFNpemU9Yi5nYXBTaXplKTt2b2lkIDAhPT1iLnNjYWxlJiYobi5zY2FsZT1iLnNjYWxlKTt2b2lkIDAhPT1iLnBvbHlnb25PZmZzZXQmJihuLnBvbHlnb25PZmZzZXQ9Yi5wb2x5Z29uT2Zmc2V0KTt2b2lkIDAhPT1iLnBvbHlnb25PZmZzZXRGYWN0b3ImJihuLnBvbHlnb25PZmZzZXRGYWN0b3I9Yi5wb2x5Z29uT2Zmc2V0RmFjdG9yKTt2b2lkIDAhPT1iLnBvbHlnb25PZmZzZXRVbml0cyYmKG4ucG9seWdvbk9mZnNldFVuaXRzPWIucG9seWdvbk9mZnNldFVuaXRzKTt2b2lkIDAhPT1iLnNraW5uaW5nJiYobi5za2lubmluZz1iLnNraW5uaW5nKTt2b2lkIDAhPT1iLm1vcnBoVGFyZ2V0cyYmKG4ubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzKTt2b2lkIDAhPT0KYi5kaXRoZXJpbmcmJihuLmRpdGhlcmluZz1iLmRpdGhlcmluZyk7dm9pZCAwIT09Yi52aXNpYmxlJiYobi52aXNpYmxlPWIudmlzaWJsZSk7dm9pZCAwIT09Yi51c2VyRGF0YSYmKG4udXNlckRhdGE9Yi51c2VyRGF0YSk7aWYodm9pZCAwIT09Yi51bmlmb3Jtcylmb3IodmFyIHUgaW4gYi51bmlmb3Jtcyl7dmFyIHc9Yi51bmlmb3Jtc1t1XTtuLnVuaWZvcm1zW3VdPXt9O3N3aXRjaCh3LnR5cGUpe2Nhc2UgInQiOm4udW5pZm9ybXNbdV0udmFsdWU9ZSh3LnZhbHVlKTticmVhaztjYXNlICJjIjpuLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgQikuc2V0SGV4KHcudmFsdWUpO2JyZWFrO2Nhc2UgInYyIjpuLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgZCkuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2Nhc2UgInYzIjpuLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgZykuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2Nhc2UgInY0IjpuLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgbSkuZnJvbUFycmF5KHcudmFsdWUpOwpicmVhaztjYXNlICJtMyI6bi51bmlmb3Jtc1t1XS52YWx1ZT0obmV3IGwpLmZyb21BcnJheSh3LnZhbHVlKTtjYXNlICJtNCI6bi51bmlmb3Jtc1t1XS52YWx1ZT0obmV3IEMpLmZyb21BcnJheSh3LnZhbHVlKTticmVhaztkZWZhdWx0Om4udW5pZm9ybXNbdV0udmFsdWU9dy52YWx1ZX19dm9pZCAwIT09Yi5kZWZpbmVzJiYobi5kZWZpbmVzPWIuZGVmaW5lcyk7dm9pZCAwIT09Yi52ZXJ0ZXhTaGFkZXImJihuLnZlcnRleFNoYWRlcj1iLnZlcnRleFNoYWRlcik7dm9pZCAwIT09Yi5mcmFnbWVudFNoYWRlciYmKG4uZnJhZ21lbnRTaGFkZXI9Yi5mcmFnbWVudFNoYWRlcik7aWYodm9pZCAwIT09Yi5leHRlbnNpb25zKWZvcih2YXIgeiBpbiBiLmV4dGVuc2lvbnMpbi5leHRlbnNpb25zW3pdPWIuZXh0ZW5zaW9uc1t6XTt2b2lkIDAhPT1iLnNoYWRpbmcmJihuLmZsYXRTaGFkaW5nPTE9PT1iLnNoYWRpbmcpO3ZvaWQgMCE9PWIuc2l6ZSYmKG4uc2l6ZT1iLnNpemUpO3ZvaWQgMCE9PWIuc2l6ZUF0dGVudWF0aW9uJiYKKG4uc2l6ZUF0dGVudWF0aW9uPWIuc2l6ZUF0dGVudWF0aW9uKTt2b2lkIDAhPT1iLm1hcCYmKG4ubWFwPWUoYi5tYXApKTt2b2lkIDAhPT1iLm1hdGNhcCYmKG4ubWF0Y2FwPWUoYi5tYXRjYXApKTt2b2lkIDAhPT1iLmFscGhhTWFwJiYobi5hbHBoYU1hcD1lKGIuYWxwaGFNYXApLG4udHJhbnNwYXJlbnQ9ITApO3ZvaWQgMCE9PWIuYnVtcE1hcCYmKG4uYnVtcE1hcD1lKGIuYnVtcE1hcCkpO3ZvaWQgMCE9PWIuYnVtcFNjYWxlJiYobi5idW1wU2NhbGU9Yi5idW1wU2NhbGUpO3ZvaWQgMCE9PWIubm9ybWFsTWFwJiYobi5ub3JtYWxNYXA9ZShiLm5vcm1hbE1hcCkpO3ZvaWQgMCE9PWIubm9ybWFsTWFwVHlwZSYmKG4ubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGUpO3ZvaWQgMCE9PWIubm9ybWFsU2NhbGUmJih1PWIubm9ybWFsU2NhbGUsITE9PT1BcnJheS5pc0FycmF5KHUpJiYodT1bdSx1XSksbi5ub3JtYWxTY2FsZT0obmV3IGQpLmZyb21BcnJheSh1KSk7dm9pZCAwIT09CmIuZGlzcGxhY2VtZW50TWFwJiYobi5kaXNwbGFjZW1lbnRNYXA9ZShiLmRpc3BsYWNlbWVudE1hcCkpO3ZvaWQgMCE9PWIuZGlzcGxhY2VtZW50U2NhbGUmJihuLmRpc3BsYWNlbWVudFNjYWxlPWIuZGlzcGxhY2VtZW50U2NhbGUpO3ZvaWQgMCE9PWIuZGlzcGxhY2VtZW50QmlhcyYmKG4uZGlzcGxhY2VtZW50Qmlhcz1iLmRpc3BsYWNlbWVudEJpYXMpO3ZvaWQgMCE9PWIucm91Z2huZXNzTWFwJiYobi5yb3VnaG5lc3NNYXA9ZShiLnJvdWdobmVzc01hcCkpO3ZvaWQgMCE9PWIubWV0YWxuZXNzTWFwJiYobi5tZXRhbG5lc3NNYXA9ZShiLm1ldGFsbmVzc01hcCkpO3ZvaWQgMCE9PWIuZW1pc3NpdmVNYXAmJihuLmVtaXNzaXZlTWFwPWUoYi5lbWlzc2l2ZU1hcCkpO3ZvaWQgMCE9PWIuZW1pc3NpdmVJbnRlbnNpdHkmJihuLmVtaXNzaXZlSW50ZW5zaXR5PWIuZW1pc3NpdmVJbnRlbnNpdHkpO3ZvaWQgMCE9PWIuc3BlY3VsYXJNYXAmJihuLnNwZWN1bGFyTWFwPWUoYi5zcGVjdWxhck1hcCkpOwp2b2lkIDAhPT1iLmVudk1hcCYmKG4uZW52TWFwPWUoYi5lbnZNYXApKTt2b2lkIDAhPT1iLmVudk1hcEludGVuc2l0eSYmKG4uZW52TWFwSW50ZW5zaXR5PWIuZW52TWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1iLnJlZmxlY3Rpdml0eSYmKG4ucmVmbGVjdGl2aXR5PWIucmVmbGVjdGl2aXR5KTt2b2lkIDAhPT1iLmxpZ2h0TWFwJiYobi5saWdodE1hcD1lKGIubGlnaHRNYXApKTt2b2lkIDAhPT1iLmxpZ2h0TWFwSW50ZW5zaXR5JiYobi5saWdodE1hcEludGVuc2l0eT1iLmxpZ2h0TWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1iLmFvTWFwJiYobi5hb01hcD1lKGIuYW9NYXApKTt2b2lkIDAhPT1iLmFvTWFwSW50ZW5zaXR5JiYobi5hb01hcEludGVuc2l0eT1iLmFvTWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1iLmdyYWRpZW50TWFwJiYobi5ncmFkaWVudE1hcD1lKGIuZ3JhZGllbnRNYXApKTtyZXR1cm4gbn0sc2V0UGF0aDpmdW5jdGlvbihiKXt0aGlzLnBhdGg9YjtyZXR1cm4gdGhpc30sc2V0VGV4dHVyZXM6ZnVuY3Rpb24oYil7dGhpcy50ZXh0dXJlcz0KYjtyZXR1cm4gdGhpc319KTt2YXIgaGo9e2RlY29kZVRleHQ6ZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgVGV4dERlY29kZXIpcmV0dXJuKG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGIpO2Zvcih2YXIgZT0iIixoPTAsbj1iLmxlbmd0aDtoPG47aCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoYltoXSk7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZSkpfSxleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihiKXt2YXIgZT1iLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT1lPyIuLyI6Yi5zdWJzdHIoMCxlKzEpfX07T2JqZWN0LmFzc2lnbihIaS5wcm90b3R5cGUse2xvYWQ6ZnVuY3Rpb24oYixlLGgsbil7dmFyIHU9dGhpcyx3PW5ldyBVYyh1Lm1hbmFnZXIpO3cuc2V0UGF0aCh1LnBhdGgpO3cubG9hZChiLGZ1bmN0aW9uKHope2UodS5wYXJzZShKU09OLnBhcnNlKHopKSl9LGgsbil9LHBhcnNlOmZ1bmN0aW9uKGIpe3ZhciBlPW5ldyB4YSxoPWIuZGF0YS5pbmRleDsKaWYodm9pZCAwIT09aCl7dmFyIG49bmV3IGlqW2gudHlwZV0oaC5hcnJheSk7ZS5zZXRJbmRleChuZXcgVChuLDEpKX1oPWIuZGF0YS5hdHRyaWJ1dGVzO2Zvcih2YXIgdSBpbiBoKXt2YXIgdz1oW3VdO249bmV3IGlqW3cudHlwZV0ody5hcnJheSk7bj1uZXcgVChuLHcuaXRlbVNpemUsdy5ub3JtYWxpemVkKTt2b2lkIDAhPT13Lm5hbWUmJihuLm5hbWU9dy5uYW1lKTtlLmFkZEF0dHJpYnV0ZSh1LG4pfXZhciB6PWIuZGF0YS5tb3JwaEF0dHJpYnV0ZXM7aWYoeilmb3IodSBpbiB6KXt2YXIgRT16W3VdLEg9W107aD0wO2Zvcih2YXIgST1FLmxlbmd0aDtoPEk7aCsrKXc9RVtoXSxuPW5ldyBpalt3LnR5cGVdKHcuYXJyYXkpLG49bmV3IFQobix3Lml0ZW1TaXplLHcubm9ybWFsaXplZCksdm9pZCAwIT09dy5uYW1lJiYobi5uYW1lPXcubmFtZSksSC5wdXNoKG4pO2UubW9ycGhBdHRyaWJ1dGVzW3VdPUh9dT1iLmRhdGEuZ3JvdXBzfHxiLmRhdGEuZHJhd2NhbGxzfHxiLmRhdGEub2Zmc2V0czsKaWYodm9pZCAwIT09dSlmb3IoaD0wLHc9dS5sZW5ndGg7aCE9PXc7KytoKW49dVtoXSxlLmFkZEdyb3VwKG4uc3RhcnQsbi5jb3VudCxuLm1hdGVyaWFsSW5kZXgpO2g9Yi5kYXRhLmJvdW5kaW5nU3BoZXJlO3ZvaWQgMCE9PWgmJih1PW5ldyBnLHZvaWQgMCE9PWguY2VudGVyJiZ1LmZyb21BcnJheShoLmNlbnRlciksZS5ib3VuZGluZ1NwaGVyZT1uZXcgQSh1LGgucmFkaXVzKSk7Yi5uYW1lJiYoZS5uYW1lPWIubmFtZSk7Yi51c2VyRGF0YSYmKGUudXNlckRhdGE9Yi51c2VyRGF0YSk7cmV0dXJuIGV9LHNldFBhdGg6ZnVuY3Rpb24oYil7dGhpcy5wYXRoPWI7cmV0dXJuIHRoaXN9fSk7dmFyIGlqPXtJbnQ4QXJyYXksVWludDhBcnJheSxVaW50OENsYW1wZWRBcnJheToidW5kZWZpbmVkIiE9PXR5cGVvZiBVaW50OENsYW1wZWRBcnJheT9VaW50OENsYW1wZWRBcnJheTpVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksCkZsb2F0NjRBcnJheX07T2JqZWN0LmFzc2lnbihJaS5wcm90b3R5cGUse2Nyb3NzT3JpZ2luOiJhbm9ueW1vdXMiLGxvYWQ6ZnVuY3Rpb24oYixlLGgsbil7dmFyIHU9dGhpcyx3PXZvaWQgMD09PXRoaXMucGF0aD9oai5leHRyYWN0VXJsQmFzZShiKTp0aGlzLnBhdGg7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5yZXNvdXJjZVBhdGh8fHc7dz1uZXcgVWModS5tYW5hZ2VyKTt3LnNldFBhdGgodGhpcy5wYXRoKTt3LmxvYWQoYixmdW5jdGlvbih6KXt2YXIgRT1udWxsO3RyeXtFPUpTT04ucGFyc2Uoeil9Y2F0Y2goSCl7dm9pZCAwIT09biYmbihIKTtjb25zb2xlLmVycm9yKCJUSFJFRTpPYmplY3RMb2FkZXI6IENhbid0IHBhcnNlICIrYisiLiIsSC5tZXNzYWdlKTtyZXR1cm59ej1FLm1ldGFkYXRhO3ZvaWQgMD09PXp8fHZvaWQgMD09PXoudHlwZXx8Imdlb21ldHJ5Ij09PXoudHlwZS50b0xvd2VyQ2FzZSgpP2NvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiKwpiKTp1LnBhcnNlKEUsZSl9LGgsbil9LHNldFBhdGg6ZnVuY3Rpb24oYil7dGhpcy5wYXRoPWI7cmV0dXJuIHRoaXN9LHNldFJlc291cmNlUGF0aDpmdW5jdGlvbihiKXt0aGlzLnJlc291cmNlUGF0aD1iO3JldHVybiB0aGlzfSxzZXRDcm9zc09yaWdpbjpmdW5jdGlvbihiKXt0aGlzLmNyb3NzT3JpZ2luPWI7cmV0dXJuIHRoaXN9LHBhcnNlOmZ1bmN0aW9uKGIsZSl7dmFyIGg9dGhpcy5wYXJzZVNoYXBlKGIuc2hhcGVzKTtoPXRoaXMucGFyc2VHZW9tZXRyaWVzKGIuZ2VvbWV0cmllcyxoKTt2YXIgbj10aGlzLnBhcnNlSW1hZ2VzKGIuaW1hZ2VzLGZ1bmN0aW9uKCl7dm9pZCAwIT09ZSYmZSh1KX0pO249dGhpcy5wYXJzZVRleHR1cmVzKGIudGV4dHVyZXMsbik7bj10aGlzLnBhcnNlTWF0ZXJpYWxzKGIubWF0ZXJpYWxzLG4pO3ZhciB1PXRoaXMucGFyc2VPYmplY3QoYi5vYmplY3QsaCxuKTtiLmFuaW1hdGlvbnMmJih1LmFuaW1hdGlvbnM9dGhpcy5wYXJzZUFuaW1hdGlvbnMoYi5hbmltYXRpb25zKSk7CnZvaWQgMCE9PWIuaW1hZ2VzJiYwIT09Yi5pbWFnZXMubGVuZ3RofHx2b2lkIDA9PT1lfHxlKHUpO3JldHVybiB1fSxwYXJzZVNoYXBlOmZ1bmN0aW9uKGIpe3ZhciBlPXt9O2lmKHZvaWQgMCE9PWIpZm9yKHZhciBoPTAsbj1iLmxlbmd0aDtoPG47aCsrKXt2YXIgdT0obmV3IFhkKS5mcm9tSlNPTihiW2hdKTtlW3UudXVpZF09dX1yZXR1cm4gZX0scGFyc2VHZW9tZXRyaWVzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9e307aWYodm9pZCAwIT09Yilmb3IodmFyIG49bmV3IEhpLHU9MCx3PWIubGVuZ3RoO3U8dzt1Kyspe3ZhciB6PWJbdV07c3dpdGNoKHoudHlwZSl7Y2FzZSAiUGxhbmVHZW9tZXRyeSI6Y2FzZSAiUGxhbmVCdWZmZXJHZW9tZXRyeSI6dmFyIEU9bmV3IHhjW3oudHlwZV0oei53aWR0aCx6LmhlaWdodCx6LndpZHRoU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyk7YnJlYWs7Y2FzZSAiQm94R2VvbWV0cnkiOmNhc2UgIkJveEJ1ZmZlckdlb21ldHJ5IjpjYXNlICJDdWJlR2VvbWV0cnkiOkU9Cm5ldyB4Y1t6LnR5cGVdKHoud2lkdGgsei5oZWlnaHQsei5kZXB0aCx6LndpZHRoU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6LmRlcHRoU2VnbWVudHMpO2JyZWFrO2Nhc2UgIkNpcmNsZUdlb21ldHJ5IjpjYXNlICJDaXJjbGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgeGNbei50eXBlXSh6LnJhZGl1cyx6LnNlZ21lbnRzLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDeWxpbmRlckdlb21ldHJ5IjpjYXNlICJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IjpFPW5ldyB4Y1t6LnR5cGVdKHoucmFkaXVzVG9wLHoucmFkaXVzQm90dG9tLHouaGVpZ2h0LHoucmFkaWFsU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCx6LnRoZXRhU3RhcnQsei50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiQ29uZUdlb21ldHJ5IjpjYXNlICJDb25lQnVmZmVyR2VvbWV0cnkiOkU9bmV3IHhjW3oudHlwZV0oei5yYWRpdXMsei5oZWlnaHQsei5yYWRpYWxTZWdtZW50cywKei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCx6LnRoZXRhU3RhcnQsei50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiU3BoZXJlR2VvbWV0cnkiOmNhc2UgIlNwaGVyZUJ1ZmZlckdlb21ldHJ5IjpFPW5ldyB4Y1t6LnR5cGVdKHoucmFkaXVzLHoud2lkdGhTZWdtZW50cyx6LmhlaWdodFNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIkRvZGVjYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkdlb21ldHJ5IjpjYXNlICJPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOkU9bmV3IHhjW3oudHlwZV0oei5yYWRpdXMsei5kZXRhaWwpOwpicmVhaztjYXNlICJSaW5nR2VvbWV0cnkiOmNhc2UgIlJpbmdCdWZmZXJHZW9tZXRyeSI6RT1uZXcgeGNbei50eXBlXSh6LmlubmVyUmFkaXVzLHoub3V0ZXJSYWRpdXMsei50aGV0YVNlZ21lbnRzLHoucGhpU2VnbWVudHMsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlRvcnVzR2VvbWV0cnkiOmNhc2UgIlRvcnVzQnVmZmVyR2VvbWV0cnkiOkU9bmV3IHhjW3oudHlwZV0oei5yYWRpdXMsei50dWJlLHoucmFkaWFsU2VnbWVudHMsei50dWJ1bGFyU2VnbWVudHMsei5hcmMpO2JyZWFrO2Nhc2UgIlRvcnVzS25vdEdlb21ldHJ5IjpjYXNlICJUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSI6RT1uZXcgeGNbei50eXBlXSh6LnJhZGl1cyx6LnR1YmUsei50dWJ1bGFyU2VnbWVudHMsei5yYWRpYWxTZWdtZW50cyx6LnAsei5xKTticmVhaztjYXNlICJUdWJlR2VvbWV0cnkiOmNhc2UgIlR1YmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgeGNbei50eXBlXSgobmV3IGdqW3oucGF0aC50eXBlXSkuZnJvbUpTT04oei5wYXRoKSwKei50dWJ1bGFyU2VnbWVudHMsei5yYWRpdXMsei5yYWRpYWxTZWdtZW50cyx6LmNsb3NlZCk7YnJlYWs7Y2FzZSAiTGF0aGVHZW9tZXRyeSI6Y2FzZSAiTGF0aGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgeGNbei50eXBlXSh6LnBvaW50cyx6LnNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgpO2JyZWFrO2Nhc2UgIlBvbHloZWRyb25HZW9tZXRyeSI6Y2FzZSAiUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPW5ldyB4Y1t6LnR5cGVdKHoudmVydGljZXMsei5pbmRpY2VzLHoucmFkaXVzLHouZGV0YWlscyk7YnJlYWs7Y2FzZSAiU2hhcGVHZW9tZXRyeSI6Y2FzZSAiU2hhcGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtmb3IodmFyIEg9MCxJPXouc2hhcGVzLmxlbmd0aDtIPEk7SCsrKXt2YXIgTz1lW3ouc2hhcGVzW0hdXTtFLnB1c2goTyl9RT1uZXcgeGNbei50eXBlXShFLHouY3VydmVTZWdtZW50cyk7YnJlYWs7Y2FzZSAiRXh0cnVkZUdlb21ldHJ5IjpjYXNlICJFeHRydWRlQnVmZmVyR2VvbWV0cnkiOkU9CltdO0g9MDtmb3IoST16LnNoYXBlcy5sZW5ndGg7SDxJO0grKylPPWVbei5zaGFwZXNbSF1dLEUucHVzaChPKTtIPXoub3B0aW9ucy5leHRydWRlUGF0aDt2b2lkIDAhPT1IJiYoei5vcHRpb25zLmV4dHJ1ZGVQYXRoPShuZXcgZ2pbSC50eXBlXSkuZnJvbUpTT04oSCkpO0U9bmV3IHhjW3oudHlwZV0oRSx6Lm9wdGlvbnMpO2JyZWFrO2Nhc2UgIkJ1ZmZlckdlb21ldHJ5IjpFPW4ucGFyc2Uoeik7YnJlYWs7Y2FzZSAiR2VvbWV0cnkiOiJUSFJFRSJpbiB3aW5kb3cmJiJMZWdhY3lKU09OTG9hZGVyImluIFRIUkVFP0U9KG5ldyBUSFJFRS5MZWdhY3lKU09OTG9hZGVyKS5wYXJzZSh6LHRoaXMucmVzb3VyY2VQYXRoKS5nZW9tZXRyeTpjb25zb2xlLmVycm9yKCdUSFJFRS5PYmplY3RMb2FkZXI6IFlvdSBoYXZlIHRvIGltcG9ydCBMZWdhY3lKU09OTG9hZGVyIGluIG9yZGVyIGxvYWQgZ2VvbWV0cnkgZGF0YSBvZiB0eXBlICJHZW9tZXRyeSIuJyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJysKei50eXBlKyciJyk7Y29udGludWV9RS51dWlkPXoudXVpZDt2b2lkIDAhPT16Lm5hbWUmJihFLm5hbWU9ei5uYW1lKTshMD09PUUuaXNCdWZmZXJHZW9tZXRyeSYmdm9pZCAwIT09ei51c2VyRGF0YSYmKEUudXNlckRhdGE9ei51c2VyRGF0YSk7aFt6LnV1aWRdPUV9cmV0dXJuIGh9LHBhcnNlTWF0ZXJpYWxzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9e30sbj17fTtpZih2b2lkIDAhPT1iKXt2YXIgdT1uZXcgQmg7dS5zZXRUZXh0dXJlcyhlKTtlPTA7Zm9yKHZhciB3PWIubGVuZ3RoO2U8dztlKyspe3ZhciB6PWJbZV07aWYoIk11bHRpTWF0ZXJpYWwiPT09ei50eXBlKXtmb3IodmFyIEU9W10sSD0wO0g8ei5tYXRlcmlhbHMubGVuZ3RoO0grKyl7dmFyIEk9ei5tYXRlcmlhbHNbSF07dm9pZCAwPT09aFtJLnV1aWRdJiYoaFtJLnV1aWRdPXUucGFyc2UoSSkpO0UucHVzaChoW0kudXVpZF0pfW5bei51dWlkXT1FfWVsc2Ugdm9pZCAwPT09aFt6LnV1aWRdJiYoaFt6LnV1aWRdPXUucGFyc2UoeikpLApuW3oudXVpZF09aFt6LnV1aWRdfX1yZXR1cm4gbn0scGFyc2VBbmltYXRpb25zOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1bXSxoPTA7aDxiLmxlbmd0aDtoKyspe3ZhciBuPWJbaF0sdT1JYy5wYXJzZShuKTt2b2lkIDAhPT1uLnV1aWQmJih1LnV1aWQ9bi51dWlkKTtlLnB1c2godSl9cmV0dXJuIGV9LHBhcnNlSW1hZ2VzOmZ1bmN0aW9uKGIsZSl7ZnVuY3Rpb24gaChSKXtuLm1hbmFnZXIuaXRlbVN0YXJ0KFIpO3JldHVybiB3LmxvYWQoUixmdW5jdGlvbigpe24ubWFuYWdlci5pdGVtRW5kKFIpfSx2b2lkIDAsZnVuY3Rpb24oKXtuLm1hbmFnZXIuaXRlbUVycm9yKFIpO24ubWFuYWdlci5pdGVtRW5kKFIpfSl9dmFyIG49dGhpcyx1PXt9O2lmKHZvaWQgMCE9PWImJjA8Yi5sZW5ndGgpe2U9bmV3IERpKGUpO3ZhciB3PW5ldyBzZyhlKTt3LnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2U9MDtmb3IodmFyIHo9Yi5sZW5ndGg7ZTx6O2UrKyl7dmFyIEU9YltlXSxIPUUudXJsOwppZihBcnJheS5pc0FycmF5KEgpKXt1W0UudXVpZF09W107Zm9yKHZhciBJPTAsTz1ILmxlbmd0aDtJPE87SSsrKXt2YXIgUT1IW0ldO1E9L14oXC9cLyl8KFthLXpdKzooXC9cLyk/KS9pLnRlc3QoUSk/UTpuLnJlc291cmNlUGF0aCtRO3VbRS51dWlkXS5wdXNoKGgoUSkpfX1lbHNlIFE9L14oXC9cLyl8KFthLXpdKzooXC9cLyk/KS9pLnRlc3QoRS51cmwpP0UudXJsOm4ucmVzb3VyY2VQYXRoK0UudXJsLHVbRS51dWlkXT1oKFEpfX1yZXR1cm4gdX0scGFyc2VUZXh0dXJlczpmdW5jdGlvbihiLGUpe2Z1bmN0aW9uIGgoSCxJKXtpZigibnVtYmVyIj09PXR5cGVvZiBIKXJldHVybiBIO2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlVGV4dHVyZTogQ29uc3RhbnQgc2hvdWxkIGJlIGluIG51bWVyaWMgZm9ybS4iLEgpO3JldHVybiBJW0hdfXZhciBuPXt9O2lmKHZvaWQgMCE9PWIpZm9yKHZhciB1PTAsdz1iLmxlbmd0aDt1PHc7dSsrKXt2YXIgej1iW3VdO3ZvaWQgMD09PQp6LmltYWdlJiZjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gImltYWdlIiBzcGVjaWZpZWQgZm9yJyx6LnV1aWQpO3ZvaWQgMD09PWVbei5pbWFnZV0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UiLHouaW1hZ2UpO3ZhciBFPUFycmF5LmlzQXJyYXkoZVt6LmltYWdlXSk/bmV3IHVkKGVbei5pbWFnZV0pOm5ldyBrKGVbei5pbWFnZV0pO0UubmVlZHNVcGRhdGU9ITA7RS51dWlkPXoudXVpZDt2b2lkIDAhPT16Lm5hbWUmJihFLm5hbWU9ei5uYW1lKTt2b2lkIDAhPT16Lm1hcHBpbmcmJihFLm1hcHBpbmc9aCh6Lm1hcHBpbmcscHApKTt2b2lkIDAhPT16Lm9mZnNldCYmRS5vZmZzZXQuZnJvbUFycmF5KHoub2Zmc2V0KTt2b2lkIDAhPT16LnJlcGVhdCYmRS5yZXBlYXQuZnJvbUFycmF5KHoucmVwZWF0KTt2b2lkIDAhPT16LmNlbnRlciYmRS5jZW50ZXIuZnJvbUFycmF5KHouY2VudGVyKTt2b2lkIDAhPT16LnJvdGF0aW9uJiYKKEUucm90YXRpb249ei5yb3RhdGlvbik7dm9pZCAwIT09ei53cmFwJiYoRS53cmFwUz1oKHoud3JhcFswXSxUbCksRS53cmFwVD1oKHoud3JhcFsxXSxUbCkpO3ZvaWQgMCE9PXouZm9ybWF0JiYoRS5mb3JtYXQ9ei5mb3JtYXQpO3ZvaWQgMCE9PXoudHlwZSYmKEUudHlwZT16LnR5cGUpO3ZvaWQgMCE9PXouZW5jb2RpbmcmJihFLmVuY29kaW5nPXouZW5jb2RpbmcpO3ZvaWQgMCE9PXoubWluRmlsdGVyJiYoRS5taW5GaWx0ZXI9aCh6Lm1pbkZpbHRlcixVbCkpO3ZvaWQgMCE9PXoubWFnRmlsdGVyJiYoRS5tYWdGaWx0ZXI9aCh6Lm1hZ0ZpbHRlcixVbCkpO3ZvaWQgMCE9PXouYW5pc290cm9weSYmKEUuYW5pc290cm9weT16LmFuaXNvdHJvcHkpO3ZvaWQgMCE9PXouZmxpcFkmJihFLmZsaXBZPXouZmxpcFkpO3ZvaWQgMCE9PXoucHJlbXVsdGlwbHlBbHBoYSYmKEUucHJlbXVsdGlwbHlBbHBoYT16LnByZW11bHRpcGx5QWxwaGEpO3ZvaWQgMCE9PXoudW5wYWNrQWxpZ25tZW50JiYoRS51bnBhY2tBbGlnbm1lbnQ9CnoudW5wYWNrQWxpZ25tZW50KTtuW3oudXVpZF09RX1yZXR1cm4gbn0scGFyc2VPYmplY3Q6ZnVuY3Rpb24oYixlLGgpe2Z1bmN0aW9uIG4oSSl7dm9pZCAwPT09ZVtJXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBnZW9tZXRyeSIsSSk7cmV0dXJuIGVbSV19ZnVuY3Rpb24gdShJKXtpZih2b2lkIDAhPT1JKXtpZihBcnJheS5pc0FycmF5KEkpKXtmb3IodmFyIE89W10sUT0wLFI9SS5sZW5ndGg7UTxSO1ErKyl7dmFyIFU9SVtRXTt2b2lkIDA9PT1oW1VdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixVKTtPLnB1c2goaFtVXSl9cmV0dXJuIE99dm9pZCAwPT09aFtJXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCIsSSk7cmV0dXJuIGhbSV19fXN3aXRjaChiLnR5cGUpe2Nhc2UgIlNjZW5lIjp2YXIgdz1uZXcgaWg7dm9pZCAwIT09Yi5iYWNrZ3JvdW5kJiYKTnVtYmVyLmlzSW50ZWdlcihiLmJhY2tncm91bmQpJiYody5iYWNrZ3JvdW5kPW5ldyBCKGIuYmFja2dyb3VuZCkpO3ZvaWQgMCE9PWIuZm9nJiYoIkZvZyI9PT1iLmZvZy50eXBlP3cuZm9nPW5ldyBoaChiLmZvZy5jb2xvcixiLmZvZy5uZWFyLGIuZm9nLmZhcik6IkZvZ0V4cDIiPT09Yi5mb2cudHlwZSYmKHcuZm9nPW5ldyBnaChiLmZvZy5jb2xvcixiLmZvZy5kZW5zaXR5KSkpO2JyZWFrO2Nhc2UgIlBlcnNwZWN0aXZlQ2FtZXJhIjp3PW5ldyBjYyhiLmZvdixiLmFzcGVjdCxiLm5lYXIsYi5mYXIpO3ZvaWQgMCE9PWIuZm9jdXMmJih3LmZvY3VzPWIuZm9jdXMpO3ZvaWQgMCE9PWIuem9vbSYmKHcuem9vbT1iLnpvb20pO3ZvaWQgMCE9PWIuZmlsbUdhdWdlJiYody5maWxtR2F1Z2U9Yi5maWxtR2F1Z2UpO3ZvaWQgMCE9PWIuZmlsbU9mZnNldCYmKHcuZmlsbU9mZnNldD1iLmZpbG1PZmZzZXQpO3ZvaWQgMCE9PWIudmlldyYmKHcudmlldz1PYmplY3QuYXNzaWduKHt9LGIudmlldykpOwpicmVhaztjYXNlICJPcnRob2dyYXBoaWNDYW1lcmEiOnc9bmV3IHZnKGIubGVmdCxiLnJpZ2h0LGIudG9wLGIuYm90dG9tLGIubmVhcixiLmZhcik7dm9pZCAwIT09Yi56b29tJiYody56b29tPWIuem9vbSk7dm9pZCAwIT09Yi52aWV3JiYody52aWV3PU9iamVjdC5hc3NpZ24oe30sYi52aWV3KSk7YnJlYWs7Y2FzZSAiQW1iaWVudExpZ2h0Ijp3PW5ldyB6aChiLmNvbG9yLGIuaW50ZW5zaXR5KTticmVhaztjYXNlICJEaXJlY3Rpb25hbExpZ2h0Ijp3PW5ldyB5aChiLmNvbG9yLGIuaW50ZW5zaXR5KTticmVhaztjYXNlICJQb2ludExpZ2h0Ijp3PW5ldyB3aChiLmNvbG9yLGIuaW50ZW5zaXR5LGIuZGlzdGFuY2UsYi5kZWNheSk7YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6dz1uZXcgQWgoYi5jb2xvcixiLmludGVuc2l0eSxiLndpZHRoLGIuaGVpZ2h0KTticmVhaztjYXNlICJTcG90TGlnaHQiOnc9bmV3IHZoKGIuY29sb3IsYi5pbnRlbnNpdHksYi5kaXN0YW5jZSxiLmFuZ2xlLApiLnBlbnVtYnJhLGIuZGVjYXkpO2JyZWFrO2Nhc2UgIkhlbWlzcGhlcmVMaWdodCI6dz1uZXcgdGgoYi5jb2xvcixiLmdyb3VuZENvbG9yLGIuaW50ZW5zaXR5KTticmVhaztjYXNlICJTa2lubmVkTWVzaCI6Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VPYmplY3QoKSBkb2VzIG5vdCBzdXBwb3J0IFNraW5uZWRNZXNoIHlldC4iKTtjYXNlICJNZXNoIjp3PW4oYi5nZW9tZXRyeSk7dmFyIHo9dShiLm1hdGVyaWFsKTt3PXcuYm9uZXMmJjA8dy5ib25lcy5sZW5ndGg/bmV3IFVmKHcseik6bmV3IHRiKHcseik7dm9pZCAwIT09Yi5kcmF3TW9kZSYmdy5zZXREcmF3TW9kZShiLmRyYXdNb2RlKTticmVhaztjYXNlICJMT0QiOnc9bmV3IFRmO2JyZWFrO2Nhc2UgIkxpbmUiOnc9bmV3IGxjKG4oYi5nZW9tZXRyeSksdShiLm1hdGVyaWFsKSxiLm1vZGUpO2JyZWFrO2Nhc2UgIkxpbmVMb29wIjp3PW5ldyBraChuKGIuZ2VvbWV0cnkpLHUoYi5tYXRlcmlhbCkpO2JyZWFrOwpjYXNlICJMaW5lU2VnbWVudHMiOnc9bmV3IFBiKG4oYi5nZW9tZXRyeSksdShiLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiUG9pbnRDbG91ZCI6Y2FzZSAiUG9pbnRzIjp3PW5ldyBSZShuKGIuZ2VvbWV0cnkpLHUoYi5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlNwcml0ZSI6dz1uZXcgU2YodShiLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiR3JvdXAiOnc9bmV3IE5lO2JyZWFrO2RlZmF1bHQ6dz1uZXcgU313LnV1aWQ9Yi51dWlkO3ZvaWQgMCE9PWIubmFtZSYmKHcubmFtZT1iLm5hbWUpO3ZvaWQgMCE9PWIubWF0cml4Pyh3Lm1hdHJpeC5mcm9tQXJyYXkoYi5tYXRyaXgpLHZvaWQgMCE9PWIubWF0cml4QXV0b1VwZGF0ZSYmKHcubWF0cml4QXV0b1VwZGF0ZT1iLm1hdHJpeEF1dG9VcGRhdGUpLHcubWF0cml4QXV0b1VwZGF0ZSYmdy5tYXRyaXguZGVjb21wb3NlKHcucG9zaXRpb24sdy5xdWF0ZXJuaW9uLHcuc2NhbGUpKToodm9pZCAwIT09Yi5wb3NpdGlvbiYmdy5wb3NpdGlvbi5mcm9tQXJyYXkoYi5wb3NpdGlvbiksCnZvaWQgMCE9PWIucm90YXRpb24mJncucm90YXRpb24uZnJvbUFycmF5KGIucm90YXRpb24pLHZvaWQgMCE9PWIucXVhdGVybmlvbiYmdy5xdWF0ZXJuaW9uLmZyb21BcnJheShiLnF1YXRlcm5pb24pLHZvaWQgMCE9PWIuc2NhbGUmJncuc2NhbGUuZnJvbUFycmF5KGIuc2NhbGUpKTt2b2lkIDAhPT1iLmNhc3RTaGFkb3cmJih3LmNhc3RTaGFkb3c9Yi5jYXN0U2hhZG93KTt2b2lkIDAhPT1iLnJlY2VpdmVTaGFkb3cmJih3LnJlY2VpdmVTaGFkb3c9Yi5yZWNlaXZlU2hhZG93KTtiLnNoYWRvdyYmKHZvaWQgMCE9PWIuc2hhZG93LmJpYXMmJih3LnNoYWRvdy5iaWFzPWIuc2hhZG93LmJpYXMpLHZvaWQgMCE9PWIuc2hhZG93LnJhZGl1cyYmKHcuc2hhZG93LnJhZGl1cz1iLnNoYWRvdy5yYWRpdXMpLHZvaWQgMCE9PWIuc2hhZG93Lm1hcFNpemUmJncuc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KGIuc2hhZG93Lm1hcFNpemUpLHZvaWQgMCE9PWIuc2hhZG93LmNhbWVyYSYmKHcuc2hhZG93LmNhbWVyYT0KdGhpcy5wYXJzZU9iamVjdChiLnNoYWRvdy5jYW1lcmEpKSk7dm9pZCAwIT09Yi52aXNpYmxlJiYody52aXNpYmxlPWIudmlzaWJsZSk7dm9pZCAwIT09Yi5mcnVzdHVtQ3VsbGVkJiYody5mcnVzdHVtQ3VsbGVkPWIuZnJ1c3R1bUN1bGxlZCk7dm9pZCAwIT09Yi5yZW5kZXJPcmRlciYmKHcucmVuZGVyT3JkZXI9Yi5yZW5kZXJPcmRlcik7dm9pZCAwIT09Yi51c2VyRGF0YSYmKHcudXNlckRhdGE9Yi51c2VyRGF0YSk7dm9pZCAwIT09Yi5sYXllcnMmJih3LmxheWVycy5tYXNrPWIubGF5ZXJzKTtpZih2b2lkIDAhPT1iLmNoaWxkcmVuKXt6PWIuY2hpbGRyZW47Zm9yKHZhciBFPTA7RTx6Lmxlbmd0aDtFKyspdy5hZGQodGhpcy5wYXJzZU9iamVjdCh6W0VdLGUsaCkpfWlmKCJMT0QiPT09Yi50eXBlKWZvcihiPWIubGV2ZWxzLHo9MDt6PGIubGVuZ3RoO3orKyl7RT1iW3pdO3ZhciBIPXcuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgidXVpZCIsRS5vYmplY3QpO3ZvaWQgMCE9PUgmJncuYWRkTGV2ZWwoSCwKRS5kaXN0YW5jZSl9cmV0dXJuIHd9fSk7dmFyIHBwPXtVVk1hcHBpbmc6MzAwLEN1YmVSZWZsZWN0aW9uTWFwcGluZzozMDEsQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOjMwMixFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzozMDMsRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6MzA0LFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOjMwNSxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzozMDYsQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6MzA3fSxUbD17UmVwZWF0V3JhcHBpbmc6MUUzLENsYW1wVG9FZGdlV3JhcHBpbmc6MTAwMSxNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOjEwMDJ9LFVsPXtOZWFyZXN0RmlsdGVyOjEwMDMsTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6MTAwNCxOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyOjEwMDUsTGluZWFyRmlsdGVyOjEwMDYsTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlcjoxMDA3LExpbmVhck1pcE1hcExpbmVhckZpbHRlcjoxMDA4fTsKSmkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpKaSxzZXRPcHRpb25zOmZ1bmN0aW9uKGIpe3RoaXMub3B0aW9ucz1iO3JldHVybiB0aGlzfSxsb2FkOmZ1bmN0aW9uKGIsZSxoLG4pe3ZvaWQgMD09PWImJihiPSIiKTt2b2lkIDAhPT10aGlzLnBhdGgmJihiPXRoaXMucGF0aCtiKTtiPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGIpO3ZhciB1PXRoaXMsdz14ZS5nZXQoYik7aWYodm9pZCAwIT09dylyZXR1cm4gdS5tYW5hZ2VyLml0ZW1TdGFydChiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSYmZSh3KTt1Lm1hbmFnZXIuaXRlbUVuZChiKX0sMCksdztmZXRjaChiKS50aGVuKGZ1bmN0aW9uKHope3JldHVybiB6LmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24oeil7cmV0dXJuIHZvaWQgMD09PXUub3B0aW9ucz9jcmVhdGVJbWFnZUJpdG1hcCh6KTpjcmVhdGVJbWFnZUJpdG1hcCh6LHUub3B0aW9ucyl9KS50aGVuKGZ1bmN0aW9uKHope3hlLmFkZChiLHopO2UmJmUoeik7dS5tYW5hZ2VyLml0ZW1FbmQoYil9KS5jYXRjaChmdW5jdGlvbih6KXtuJiYKbih6KTt1Lm1hbmFnZXIuaXRlbUVycm9yKGIpO3UubWFuYWdlci5pdGVtRW5kKGIpfSk7dS5tYW5hZ2VyLml0ZW1TdGFydChiKX0sc2V0Q3Jvc3NPcmlnaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sc2V0UGF0aDpmdW5jdGlvbihiKXt0aGlzLnBhdGg9YjtyZXR1cm4gdGhpc319O09iamVjdC5hc3NpZ24oS2kucHJvdG90eXBlLHttb3ZlVG86ZnVuY3Rpb24oYixlKXt0aGlzLmN1cnJlbnRQYXRoPW5ldyBaYzt0aGlzLnN1YlBhdGhzLnB1c2godGhpcy5jdXJyZW50UGF0aCk7dGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8oYixlKX0sbGluZVRvOmZ1bmN0aW9uKGIsZSl7dGhpcy5jdXJyZW50UGF0aC5saW5lVG8oYixlKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbihiLGUsaCxuKXt0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oYixlLGgsbil9LGJlemllckN1cnZlVG86ZnVuY3Rpb24oYixlLGgsbix1LHcpe3RoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyhiLGUsCmgsbix1LHcpfSxzcGxpbmVUaHJ1OmZ1bmN0aW9uKGIpe3RoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydShiKX0sdG9TaGFwZXM6ZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBoKGZhKXtmb3IodmFyIHFhPVtdLHJhPTAsaWE9ZmEubGVuZ3RoO3JhPGlhO3JhKyspe3ZhciB0YT1mYVtyYV0sbmE9bmV3IFhkO25hLmN1cnZlcz10YS5jdXJ2ZXM7cWEucHVzaChuYSl9cmV0dXJuIHFhfWZ1bmN0aW9uIG4oZmEscWEpe2Zvcih2YXIgcmE9cWEubGVuZ3RoLGlhPSExLHRhPXJhLTEsbmE9MDtuYTxyYTt0YT1uYSsrKXt2YXIgdmE9cWFbdGFdLEJhPXFhW25hXSxzYT1CYS54LXZhLngsRGE9QmEueS12YS55O2lmKE1hdGguYWJzKERhKT5OdW1iZXIuRVBTSUxPTil7aWYoMD5EYSYmKHZhPXFhW25hXSxzYT0tc2EsQmE9cWFbdGFdLERhPS1EYSksIShmYS55PHZhLnl8fGZhLnk+QmEueSkpaWYoZmEueT09PXZhLnkpe2lmKGZhLng9PT12YS54KXJldHVybiEwfWVsc2V7dGE9RGEqKGZhLngtdmEueCktc2EqCihmYS55LXZhLnkpO2lmKDA9PT10YSlyZXR1cm4hMDswPnRhfHwoaWE9IWlhKX19ZWxzZSBpZihmYS55PT09dmEueSYmKEJhLng8PWZhLngmJmZhLng8PXZhLnh8fHZhLng8PWZhLngmJmZhLng8PUJhLngpKXJldHVybiEwfXJldHVybiBpYX12YXIgdT15ZC5pc0Nsb2NrV2lzZSx3PXRoaXMuc3ViUGF0aHM7aWYoMD09PXcubGVuZ3RoKXJldHVybltdO2lmKCEwPT09ZSlyZXR1cm4gaCh3KTtlPVtdO2lmKDE9PT13Lmxlbmd0aCl7dmFyIHo9d1swXTt2YXIgRT1uZXcgWGQ7RS5jdXJ2ZXM9ei5jdXJ2ZXM7ZS5wdXNoKEUpO3JldHVybiBlfXZhciBIPSF1KHdbMF0uZ2V0UG9pbnRzKCkpO0g9Yj8hSDpIO0U9W107dmFyIEk9W10sTz1bXSxRPTA7SVtRXT12b2lkIDA7T1tRXT1bXTtmb3IodmFyIFI9MCxVPXcubGVuZ3RoO1I8VTtSKyspe3o9d1tSXTt2YXIgVz16LmdldFBvaW50cygpO3ZhciBaPXUoVyk7KFo9Yj8hWjpaKT8oIUgmJklbUV0mJlErKyxJW1FdPXtzOm5ldyBYZCxwOld9LElbUV0ucy5jdXJ2ZXM9CnouY3VydmVzLEgmJlErKyxPW1FdPVtdKTpPW1FdLnB1c2goe2g6eixwOldbMF19KX1pZighSVswXSlyZXR1cm4gaCh3KTtpZigxPEkubGVuZ3RoKXtSPSExO2I9W107dT0wO2Zvcih3PUkubGVuZ3RoO3U8dzt1KyspRVt1XT1bXTt1PTA7Zm9yKHc9SS5sZW5ndGg7dTx3O3UrKylmb3Ioej1PW3VdLFo9MDtaPHoubGVuZ3RoO1orKyl7SD16W1pdO1E9ITA7Zm9yKFc9MDtXPEkubGVuZ3RoO1crKyluKEgucCxJW1ddLnApJiYodSE9PVcmJmIucHVzaCh7ZnJvbXM6dSx0b3M6Vyxob2xlOlp9KSxRPyhRPSExLEVbV10ucHVzaChIKSk6Uj0hMCk7USYmRVt1XS5wdXNoKEgpfTA8Yi5sZW5ndGgmJihSfHwoTz1FKSl9Uj0wO2Zvcih1PUkubGVuZ3RoO1I8dTtSKyspZm9yKEU9SVtSXS5zLGUucHVzaChFKSxiPU9bUl0sdz0wLHo9Yi5sZW5ndGg7dzx6O3crKylFLmhvbGVzLnB1c2goYlt3XS5oKTtyZXR1cm4gZX19KTtPYmplY3QuYXNzaWduKExpLnByb3RvdHlwZSx7aXNGb250OiEwLGdlbmVyYXRlU2hhcGVzOmZ1bmN0aW9uKGIsCmUpe3ZvaWQgMD09PWUmJihlPTEwMCk7dmFyIGg9W107Yj1qcChiLGUsdGhpcy5kYXRhKTtlPTA7Zm9yKHZhciBuPWIubGVuZ3RoO2U8bjtlKyspQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoaCxiW2VdLnRvU2hhcGVzKCkpO3JldHVybiBofX0pO09iamVjdC5hc3NpZ24oSGwucHJvdG90eXBlLHtsb2FkOmZ1bmN0aW9uKGIsZSxoLG4pe3ZhciB1PXRoaXMsdz1uZXcgVWModGhpcy5tYW5hZ2VyKTt3LnNldFBhdGgodGhpcy5wYXRoKTt3LmxvYWQoYixmdW5jdGlvbih6KXt0cnl7dmFyIEU9SlNPTi5wYXJzZSh6KX1jYXRjaChIKXtjb25zb2xlLndhcm4oIlRIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4iKSxFPUpTT04ucGFyc2Uoei5zdWJzdHJpbmcoNjUsei5sZW5ndGgtMikpfXo9dS5wYXJzZShFKTtlJiZlKHopfSxoLG4pfSxwYXJzZTpmdW5jdGlvbihiKXtyZXR1cm4gbmV3IExpKGIpfSwKc2V0UGF0aDpmdW5jdGlvbihiKXt0aGlzLnBhdGg9YjtyZXR1cm4gdGhpc319KTt3Zy5IYW5kbGVycz17aGFuZGxlcnM6W10sYWRkOmZ1bmN0aW9uKGIsZSl7dGhpcy5oYW5kbGVycy5wdXNoKGIsZSl9LGdldDpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5oYW5kbGVycyxoPTAsbj1lLmxlbmd0aDtoPG47aCs9Mil7dmFyIHU9ZVtoKzFdO2lmKGVbaF0udGVzdChiKSlyZXR1cm4gdX1yZXR1cm4gbnVsbH19O09iamVjdC5hc3NpZ24od2cucHJvdG90eXBlLHtjcm9zc09yaWdpbjoiYW5vbnltb3VzIixvbkxvYWRTdGFydDpmdW5jdGlvbigpe30sb25Mb2FkUHJvZ3Jlc3M6ZnVuY3Rpb24oKXt9LG9uTG9hZENvbXBsZXRlOmZ1bmN0aW9uKCl7fSxpbml0TWF0ZXJpYWxzOmZ1bmN0aW9uKGIsZSxoKXtmb3IodmFyIG49W10sdT0wO3U8Yi5sZW5ndGg7Kyt1KW5bdV09dGhpcy5jcmVhdGVNYXRlcmlhbChiW3VdLGUsaCk7cmV0dXJuIG59LGNyZWF0ZU1hdGVyaWFsOmZ1bmN0aW9uKCl7dmFyIGI9CntOb0JsZW5kaW5nOjAsTm9ybWFsQmxlbmRpbmc6MSxBZGRpdGl2ZUJsZW5kaW5nOjIsU3VidHJhY3RpdmVCbGVuZGluZzozLE11bHRpcGx5QmxlbmRpbmc6NCxDdXN0b21CbGVuZGluZzo1fSxlPW5ldyBCLGg9bmV3IHNoLG49bmV3IEJoO3JldHVybiBmdW5jdGlvbih1LHcseil7ZnVuY3Rpb24gRShSLFUsVyxaLGZhKXtSPXcrUjt2YXIgcWE9d2cuSGFuZGxlcnMuZ2V0KFIpO251bGwhPT1xYT9SPXFhLmxvYWQoUik6KGguc2V0Q3Jvc3NPcmlnaW4oeiksUj1oLmxvYWQoUikpO3ZvaWQgMCE9PVUmJihSLnJlcGVhdC5mcm9tQXJyYXkoVSksMSE9PVVbMF0mJihSLndyYXBTPTFFMyksMSE9PVVbMV0mJihSLndyYXBUPTFFMykpO3ZvaWQgMCE9PVcmJlIub2Zmc2V0LmZyb21BcnJheShXKTt2b2lkIDAhPT1aJiYoInJlcGVhdCI9PT1aWzBdJiYoUi53cmFwUz0xRTMpLCJtaXJyb3IiPT09WlswXSYmKFIud3JhcFM9MTAwMiksInJlcGVhdCI9PT1aWzFdJiYoUi53cmFwVD0xRTMpLCJtaXJyb3IiPT09ClpbMV0mJihSLndyYXBUPTEwMDIpKTt2b2lkIDAhPT1mYSYmKFIuYW5pc290cm9weT1mYSk7VT1vYi5nZW5lcmF0ZVVVSUQoKTtIW1VdPVI7cmV0dXJuIFV9dmFyIEg9e30sST17dXVpZDpvYi5nZW5lcmF0ZVVVSUQoKSx0eXBlOiJNZXNoTGFtYmVydE1hdGVyaWFsIn0sTztmb3IoTyBpbiB1KXt2YXIgUT11W09dO3N3aXRjaChPKXtjYXNlICJEYmdDb2xvciI6Y2FzZSAiRGJnSW5kZXgiOmNhc2UgIm9wdGljYWxEZW5zaXR5IjpjYXNlICJpbGx1bWluYXRpb24iOmJyZWFrO2Nhc2UgIkRiZ05hbWUiOkkubmFtZT1RO2JyZWFrO2Nhc2UgImJsZW5kaW5nIjpJLmJsZW5kaW5nPWJbUV07YnJlYWs7Y2FzZSAiY29sb3JBbWJpZW50IjpjYXNlICJtYXBBbWJpZW50Ijpjb25zb2xlLndhcm4oIlRIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDoiLE8sImlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIik7YnJlYWs7Y2FzZSAiY29sb3JEaWZmdXNlIjpJLmNvbG9yPWUuZnJvbUFycmF5KFEpLmdldEhleCgpOwpicmVhaztjYXNlICJjb2xvclNwZWN1bGFyIjpJLnNwZWN1bGFyPWUuZnJvbUFycmF5KFEpLmdldEhleCgpO2JyZWFrO2Nhc2UgImNvbG9yRW1pc3NpdmUiOkkuZW1pc3NpdmU9ZS5mcm9tQXJyYXkoUSkuZ2V0SGV4KCk7YnJlYWs7Y2FzZSAic3BlY3VsYXJDb2VmIjpJLnNoaW5pbmVzcz1RO2JyZWFrO2Nhc2UgInNoYWRpbmciOiJiYXNpYyI9PT1RLnRvTG93ZXJDYXNlKCkmJihJLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIik7InBob25nIj09PVEudG9Mb3dlckNhc2UoKSYmKEkudHlwZT0iTWVzaFBob25nTWF0ZXJpYWwiKTsic3RhbmRhcmQiPT09US50b0xvd2VyQ2FzZSgpJiYoSS50eXBlPSJNZXNoU3RhbmRhcmRNYXRlcmlhbCIpO2JyZWFrO2Nhc2UgIm1hcERpZmZ1c2UiOkkubWFwPUUoUSx1Lm1hcERpZmZ1c2VSZXBlYXQsdS5tYXBEaWZmdXNlT2Zmc2V0LHUubWFwRGlmZnVzZVdyYXAsdS5tYXBEaWZmdXNlQW5pc290cm9weSk7YnJlYWs7Y2FzZSAibWFwRGlmZnVzZVJlcGVhdCI6Y2FzZSAibWFwRGlmZnVzZU9mZnNldCI6Y2FzZSAibWFwRGlmZnVzZVdyYXAiOmNhc2UgIm1hcERpZmZ1c2VBbmlzb3Ryb3B5IjpicmVhazsKY2FzZSAibWFwRW1pc3NpdmUiOkkuZW1pc3NpdmVNYXA9RShRLHUubWFwRW1pc3NpdmVSZXBlYXQsdS5tYXBFbWlzc2l2ZU9mZnNldCx1Lm1hcEVtaXNzaXZlV3JhcCx1Lm1hcEVtaXNzaXZlQW5pc290cm9weSk7YnJlYWs7Y2FzZSAibWFwRW1pc3NpdmVSZXBlYXQiOmNhc2UgIm1hcEVtaXNzaXZlT2Zmc2V0IjpjYXNlICJtYXBFbWlzc2l2ZVdyYXAiOmNhc2UgIm1hcEVtaXNzaXZlQW5pc290cm9weSI6YnJlYWs7Y2FzZSAibWFwTGlnaHQiOkkubGlnaHRNYXA9RShRLHUubWFwTGlnaHRSZXBlYXQsdS5tYXBMaWdodE9mZnNldCx1Lm1hcExpZ2h0V3JhcCx1Lm1hcExpZ2h0QW5pc290cm9weSk7YnJlYWs7Y2FzZSAibWFwTGlnaHRSZXBlYXQiOmNhc2UgIm1hcExpZ2h0T2Zmc2V0IjpjYXNlICJtYXBMaWdodFdyYXAiOmNhc2UgIm1hcExpZ2h0QW5pc290cm9weSI6YnJlYWs7Y2FzZSAibWFwQU8iOkkuYW9NYXA9RShRLHUubWFwQU9SZXBlYXQsdS5tYXBBT09mZnNldCx1Lm1hcEFPV3JhcCwKdS5tYXBBT0FuaXNvdHJvcHkpO2JyZWFrO2Nhc2UgIm1hcEFPUmVwZWF0IjpjYXNlICJtYXBBT09mZnNldCI6Y2FzZSAibWFwQU9XcmFwIjpjYXNlICJtYXBBT0FuaXNvdHJvcHkiOmJyZWFrO2Nhc2UgIm1hcEJ1bXAiOkkuYnVtcE1hcD1FKFEsdS5tYXBCdW1wUmVwZWF0LHUubWFwQnVtcE9mZnNldCx1Lm1hcEJ1bXBXcmFwLHUubWFwQnVtcEFuaXNvdHJvcHkpO2JyZWFrO2Nhc2UgIm1hcEJ1bXBTY2FsZSI6SS5idW1wU2NhbGU9UTticmVhaztjYXNlICJtYXBCdW1wUmVwZWF0IjpjYXNlICJtYXBCdW1wT2Zmc2V0IjpjYXNlICJtYXBCdW1wV3JhcCI6Y2FzZSAibWFwQnVtcEFuaXNvdHJvcHkiOmJyZWFrO2Nhc2UgIm1hcE5vcm1hbCI6SS5ub3JtYWxNYXA9RShRLHUubWFwTm9ybWFsUmVwZWF0LHUubWFwTm9ybWFsT2Zmc2V0LHUubWFwTm9ybWFsV3JhcCx1Lm1hcE5vcm1hbEFuaXNvdHJvcHkpO2JyZWFrO2Nhc2UgIm1hcE5vcm1hbEZhY3RvciI6SS5ub3JtYWxTY2FsZT1RO2JyZWFrOwpjYXNlICJtYXBOb3JtYWxSZXBlYXQiOmNhc2UgIm1hcE5vcm1hbE9mZnNldCI6Y2FzZSAibWFwTm9ybWFsV3JhcCI6Y2FzZSAibWFwTm9ybWFsQW5pc290cm9weSI6YnJlYWs7Y2FzZSAibWFwU3BlY3VsYXIiOkkuc3BlY3VsYXJNYXA9RShRLHUubWFwU3BlY3VsYXJSZXBlYXQsdS5tYXBTcGVjdWxhck9mZnNldCx1Lm1hcFNwZWN1bGFyV3JhcCx1Lm1hcFNwZWN1bGFyQW5pc290cm9weSk7YnJlYWs7Y2FzZSAibWFwU3BlY3VsYXJSZXBlYXQiOmNhc2UgIm1hcFNwZWN1bGFyT2Zmc2V0IjpjYXNlICJtYXBTcGVjdWxhcldyYXAiOmNhc2UgIm1hcFNwZWN1bGFyQW5pc290cm9weSI6YnJlYWs7Y2FzZSAibWFwTWV0YWxuZXNzIjpJLm1ldGFsbmVzc01hcD1FKFEsdS5tYXBNZXRhbG5lc3NSZXBlYXQsdS5tYXBNZXRhbG5lc3NPZmZzZXQsdS5tYXBNZXRhbG5lc3NXcmFwLHUubWFwTWV0YWxuZXNzQW5pc290cm9weSk7YnJlYWs7Y2FzZSAibWFwTWV0YWxuZXNzUmVwZWF0IjpjYXNlICJtYXBNZXRhbG5lc3NPZmZzZXQiOmNhc2UgIm1hcE1ldGFsbmVzc1dyYXAiOmNhc2UgIm1hcE1ldGFsbmVzc0FuaXNvdHJvcHkiOmJyZWFrOwpjYXNlICJtYXBSb3VnaG5lc3MiOkkucm91Z2huZXNzTWFwPUUoUSx1Lm1hcFJvdWdobmVzc1JlcGVhdCx1Lm1hcFJvdWdobmVzc09mZnNldCx1Lm1hcFJvdWdobmVzc1dyYXAsdS5tYXBSb3VnaG5lc3NBbmlzb3Ryb3B5KTticmVhaztjYXNlICJtYXBSb3VnaG5lc3NSZXBlYXQiOmNhc2UgIm1hcFJvdWdobmVzc09mZnNldCI6Y2FzZSAibWFwUm91Z2huZXNzV3JhcCI6Y2FzZSAibWFwUm91Z2huZXNzQW5pc290cm9weSI6YnJlYWs7Y2FzZSAibWFwQWxwaGEiOkkuYWxwaGFNYXA9RShRLHUubWFwQWxwaGFSZXBlYXQsdS5tYXBBbHBoYU9mZnNldCx1Lm1hcEFscGhhV3JhcCx1Lm1hcEFscGhhQW5pc290cm9weSk7YnJlYWs7Y2FzZSAibWFwQWxwaGFSZXBlYXQiOmNhc2UgIm1hcEFscGhhT2Zmc2V0IjpjYXNlICJtYXBBbHBoYVdyYXAiOmNhc2UgIm1hcEFscGhhQW5pc290cm9weSI6YnJlYWs7Y2FzZSAiZmxpcFNpZGVkIjpJLnNpZGU9MTticmVhaztjYXNlICJkb3VibGVTaWRlZCI6SS5zaWRlPQoyO2JyZWFrO2Nhc2UgInRyYW5zcGFyZW5jeSI6Y29uc29sZS53YXJuKCJUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IHRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIG9wYWNpdHkiKTtJLm9wYWNpdHk9UTticmVhaztjYXNlICJkZXB0aFRlc3QiOmNhc2UgImRlcHRoV3JpdGUiOmNhc2UgImNvbG9yV3JpdGUiOmNhc2UgIm9wYWNpdHkiOmNhc2UgInJlZmxlY3Rpdml0eSI6Y2FzZSAidHJhbnNwYXJlbnQiOmNhc2UgInZpc2libGUiOmNhc2UgIndpcmVmcmFtZSI6SVtPXT1RO2JyZWFrO2Nhc2UgInZlcnRleENvbG9ycyI6ITA9PT1RJiYoSS52ZXJ0ZXhDb2xvcnM9Mik7ImZhY2UiPT09USYmKEkudmVydGV4Q29sb3JzPTEpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOiBVbnN1cHBvcnRlZCIsTyxRKX19Ik1lc2hCYXNpY01hdGVyaWFsIj09PUkudHlwZSYmZGVsZXRlIEkuZW1pc3NpdmU7Ik1lc2hQaG9uZ01hdGVyaWFsIiE9PQpJLnR5cGUmJmRlbGV0ZSBJLnNwZWN1bGFyOzE+SS5vcGFjaXR5JiYoSS50cmFuc3BhcmVudD0hMCk7bi5zZXRUZXh0dXJlcyhIKTtyZXR1cm4gbi5wYXJzZShJKX19KCl9KTt2YXIgSWgsUmk9e2dldENvbnRleHQ6ZnVuY3Rpb24oKXt2b2lkIDA9PT1JaCYmKEloPW5ldyAod2luZG93LkF1ZGlvQ29udGV4dHx8d2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkpO3JldHVybiBJaH0sc2V0Q29udGV4dDpmdW5jdGlvbihiKXtJaD1ifX07T2JqZWN0LmFzc2lnbihNaS5wcm90b3R5cGUse2xvYWQ6ZnVuY3Rpb24oYixlLGgsbil7dmFyIHU9bmV3IFVjKHRoaXMubWFuYWdlcik7dS5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7dS5zZXRQYXRoKHRoaXMucGF0aCk7dS5sb2FkKGIsZnVuY3Rpb24odyl7dz13LnNsaWNlKDApO1JpLmdldENvbnRleHQoKS5kZWNvZGVBdWRpb0RhdGEodyxmdW5jdGlvbih6KXtlKHopfSl9LGgsbil9LHNldFBhdGg6ZnVuY3Rpb24oYil7dGhpcy5wYXRoPWI7CnJldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oQ2gucHJvdG90eXBlLHtpc1NwaGVyaWNhbEhhcm1vbmljczM6ITAsc2V0OmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT0wOzk+ZTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uY29weShiW2VdKTtyZXR1cm4gdGhpc30semVybzpmdW5jdGlvbigpe2Zvcih2YXIgYj0wOzk+YjtiKyspdGhpcy5jb2VmZmljaWVudHNbYl0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc30sZ2V0QXQ6ZnVuY3Rpb24oYixlKXt2YXIgaD1iLngsbj1iLnk7Yj1iLno7dmFyIHU9dGhpcy5jb2VmZmljaWVudHM7ZT0uMjgyMDk1KnVbMF07ZSs9LjQ4ODYwMyp1WzFdKm47ZSs9LjQ4ODYwMyp1WzJdKmI7ZSs9LjQ4ODYwMyp1WzNdKmg7ZSs9MS4wOTI1NDgqdVs0XSpoKm47ZSs9MS4wOTI1NDgqdVs1XSpuKmI7ZSs9LjMxNTM5Mip1WzZdKigzKmIqYi0xKTtlKz0xLjA5MjU0OCp1WzddKmgqYjtyZXR1cm4gZSs9LjU0NjI3NCp1WzhdKihoKmgtbipuKX0sZ2V0SXJyYWRpYW5jZUF0OmZ1bmN0aW9uKGIsCmUpe3ZhciBoPWIueCxuPWIueTtiPWIuejt2YXIgdT10aGlzLmNvZWZmaWNpZW50cztlPS44ODYyMjcqdVswXTtlKz0xLjAyMzMyOCp1WzFdKm47ZSs9MS4wMjMzMjgqdVsyXSpiO2UrPTEuMDIzMzI4KnVbM10qaDtlKz0uODU4MDg2KnVbNF0qaCpuO2UrPS44NTgwODYqdVs1XSpuKmI7ZSs9dVs2XSooLjc0MzEyNSpiKmItLjI0NzcwOCk7ZSs9Ljg1ODA4Nip1WzddKmgqYjtyZXR1cm4gZSs9LjQyOTA0Myp1WzhdKihoKmgtbipuKX0sYWRkOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT0wOzk+ZTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uYWRkKGIuY29lZmZpY2llbnRzW2VdKTtyZXR1cm4gdGhpc30sc2NhbGU6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5tdWx0aXBseVNjYWxhcihiKTtyZXR1cm4gdGhpc30sbGVycDpmdW5jdGlvbihiLGUpe2Zvcih2YXIgaD0wOzk+aDtoKyspdGhpcy5jb2VmZmljaWVudHNbaF0ubGVycChiLmNvZWZmaWNpZW50c1toXSwKZSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtmb3IodmFyIGU9MDs5PmU7ZSsrKWlmKCF0aGlzLmNvZWZmaWNpZW50c1tlXS5lcXVhbHMoYi5jb2VmZmljaWVudHNbZV0pKXJldHVybiExO3JldHVybiEwfSxjb3B5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNldChiLmNvZWZmaWNpZW50cyl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxmcm9tQXJyYXk6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPXRoaXMuY29lZmZpY2llbnRzLGg9MDs5Pmg7aCsrKWVbaF0uZnJvbUFycmF5KGIsMypoKTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbigpe2Zvcih2YXIgYj1bXSxlPXRoaXMuY29lZmZpY2llbnRzLGg9MDs5Pmg7aCsrKWVbaF0udG9BcnJheShiLDMqaCk7cmV0dXJuIGJ9fSk7T2JqZWN0LmFzc2lnbihDaCx7Z2V0QmFzaXNBdDpmdW5jdGlvbihiLGUpe3ZhciBoPWIueCxuPWIueTtiPWIuejtlWzBdPS4yODIwOTU7CmVbMV09LjQ4ODYwMypuO2VbMl09LjQ4ODYwMypiO2VbM109LjQ4ODYwMypoO2VbNF09MS4wOTI1NDgqaCpuO2VbNV09MS4wOTI1NDgqbipiO2VbNl09LjMxNTM5MiooMypiKmItMSk7ZVs3XT0xLjA5MjU0OCpoKmI7ZVs4XT0uNTQ2Mjc0KihoKmgtbipuKX19KTskYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFNiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOiRjLGlzTGlnaHRQcm9iZTohMCxjb3B5OmZ1bmN0aW9uKGIpe1NiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLnNoLmNvcHkoYi5zaCk7dGhpcy5pbnRlbnNpdHk9Yi5pbnRlbnNpdHk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihiKXtyZXR1cm4gU2IucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYil9fSk7TmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSgkYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpOaSxpc0hlbWlzcGhlcmVMaWdodFByb2JlOiEwLApjb3B5OmZ1bmN0aW9uKGIpeyRjLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGIpe3JldHVybiAkYy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKX19KTtPaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKCRjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOk9pLGlzQW1iaWVudExpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihiKXskYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihiKXtyZXR1cm4gJGMucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYil9fSk7T2JqZWN0LmFzc2lnbihJbC5wcm90b3R5cGUse3VwZGF0ZTpmdW5jdGlvbigpe3ZhciBiLGUsaCxuLHUsdyx6LEUsSD1uZXcgQyxJPW5ldyBDO3JldHVybiBmdW5jdGlvbihPKXtpZihiIT09dGhpc3x8ZSE9PU8uZm9jdXN8fGghPT1PLmZvdnx8biE9PU8uYXNwZWN0KnRoaXMuYXNwZWN0fHwKdSE9PU8ubmVhcnx8dyE9PU8uZmFyfHx6IT09Ty56b29tfHxFIT09dGhpcy5leWVTZXApe2I9dGhpcztlPU8uZm9jdXM7aD1PLmZvdjtuPU8uYXNwZWN0KnRoaXMuYXNwZWN0O3U9Ty5uZWFyO3c9Ty5mYXI7ej1PLnpvb207dmFyIFE9Ty5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCk7RT10aGlzLmV5ZVNlcC8yO3ZhciBSPUUqdS9lLFU9dSpNYXRoLnRhbihvYi5ERUcyUkFEKmgqLjUpL3o7SS5lbGVtZW50c1sxMl09LUU7SC5lbGVtZW50c1sxMl09RTt2YXIgVz0tVSpuK1I7dmFyIFo9VSpuK1I7US5lbGVtZW50c1swXT0yKnUvKFotVyk7US5lbGVtZW50c1s4XT0oWitXKS8oWi1XKTt0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KFEpO1c9LVUqbi1SO1o9VSpuLVI7US5lbGVtZW50c1swXT0yKnUvKFotVyk7US5lbGVtZW50c1s4XT0oWitXKS8oWi1XKTt0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KFEpfXRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KE8ubWF0cml4V29ybGQpLm11bHRpcGx5KEkpOwp0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weShPLm1hdHJpeFdvcmxkKS5tdWx0aXBseShIKX19KCl9KTt4Zy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7eGcucHJvdG90eXBlLmNvbnN0cnVjdG9yPXhnO09iamVjdC5hc3NpZ24oUGkucHJvdG90eXBlLHtzdGFydDpmdW5jdGlvbigpe3RoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0oInVuZGVmaW5lZCI9PT10eXBlb2YgcGVyZm9ybWFuY2U/RGF0ZTpwZXJmb3JtYW5jZSkubm93KCk7dGhpcy5lbGFwc2VkVGltZT0wO3RoaXMucnVubmluZz0hMH0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZ2V0RWxhcHNlZFRpbWUoKTt0aGlzLmF1dG9TdGFydD10aGlzLnJ1bm5pbmc9ITF9LGdldEVsYXBzZWRUaW1lOmZ1bmN0aW9uKCl7dGhpcy5nZXREZWx0YSgpO3JldHVybiB0aGlzLmVsYXBzZWRUaW1lfSxnZXREZWx0YTpmdW5jdGlvbigpe3ZhciBiPTA7aWYodGhpcy5hdXRvU3RhcnQmJiF0aGlzLnJ1bm5pbmcpcmV0dXJuIHRoaXMuc3RhcnQoKSwKMDtpZih0aGlzLnJ1bm5pbmcpe3ZhciBlPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTtiPShlLXRoaXMub2xkVGltZSkvMUUzO3RoaXMub2xkVGltZT1lO3RoaXMuZWxhcHNlZFRpbWUrPWJ9cmV0dXJuIGJ9fSk7UWkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlFpLGdldElucHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbn0scmVtb3ZlRmlsdGVyOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuZmlsdGVyJiYodGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwpO3JldHVybiB0aGlzfSxnZXRGaWx0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXJ9LApzZXRGaWx0ZXI6ZnVuY3Rpb24oYil7bnVsbCE9PXRoaXMuZmlsdGVyPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3RoaXMuZmlsdGVyPWI7dGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpO3RoaXMuZmlsdGVyLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTtyZXR1cm4gdGhpc30sZ2V0TWFzdGVyVm9sdW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlfSxzZXRNYXN0ZXJWb2x1bWU6ZnVuY3Rpb24oYil7dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKGIsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSk7cmV0dXJuIHRoaXN9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGcsZT1uZXcgZixoPW5ldyBnLG49bmV3IGcsCnU9bmV3IFBpO3JldHVybiBmdW5jdGlvbih3KXtTLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsdyk7dz10aGlzLmNvbnRleHQubGlzdGVuZXI7dmFyIHo9dGhpcy51cDt0aGlzLnRpbWVEZWx0YT11LmdldERlbHRhKCk7dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoYixlLGgpO24uc2V0KDAsMCwtMSkuYXBwbHlRdWF0ZXJuaW9uKGUpO2lmKHcucG9zaXRpb25YKXt2YXIgRT10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy50aW1lRGVsdGE7dy5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYi54LEUpO3cucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGIueSxFKTt3LnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShiLnosRSk7dy5mb3J3YXJkWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLngsRSk7dy5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnksRSk7dy5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnosCkUpO3cudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHoueCxFKTt3LnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh6LnksRSk7dy51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoei56LEUpfWVsc2Ugdy5zZXRQb3NpdGlvbihiLngsYi55LGIueiksdy5zZXRPcmllbnRhdGlvbihuLngsbi55LG4ueix6Lngsei55LHoueil9fSgpfSk7amYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmpmLGdldE91dHB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW59LHNldE5vZGVTb3VyY2U6ZnVuY3Rpb24oYil7dGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITE7dGhpcy5zb3VyY2VUeXBlPSJhdWRpb05vZGUiO3RoaXMuc291cmNlPWI7dGhpcy5jb25uZWN0KCk7cmV0dXJuIHRoaXN9LHNldE1lZGlhRWxlbWVudFNvdXJjZTpmdW5jdGlvbihiKXt0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMTt0aGlzLnNvdXJjZVR5cGU9CiJtZWRpYU5vZGUiO3RoaXMuc291cmNlPXRoaXMuY29udGV4dC5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UoYik7dGhpcy5jb25uZWN0KCk7cmV0dXJuIHRoaXN9LHNldEJ1ZmZlcjpmdW5jdGlvbihiKXt0aGlzLmJ1ZmZlcj1iO3RoaXMuc291cmNlVHlwZT0iYnVmZmVyIjt0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKTtyZXR1cm4gdGhpc30scGxheTpmdW5jdGlvbigpe2lmKCEwPT09dGhpcy5pc1BsYXlpbmcpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpO2Vsc2UgaWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2V7dmFyIGI9dGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO2IuYnVmZmVyPXRoaXMuYnVmZmVyO2IubG9vcD10aGlzLmxvb3A7Yi5vbmVuZGVkPXRoaXMub25FbmRlZC5iaW5kKHRoaXMpOwp0aGlzLnN0YXJ0VGltZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWU7Yi5zdGFydCh0aGlzLnN0YXJ0VGltZSx0aGlzLm9mZnNldCk7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5zb3VyY2U9Yjt0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSk7dGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpO3JldHVybiB0aGlzLmNvbm5lY3QoKX19LHBhdXNlOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmKHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5vZmZzZXQrPSh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5zdGFydFRpbWUpKnRoaXMucGxheWJhY2tSYXRlLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7aWYoITE9PT0KdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNlIHJldHVybiB0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0PTAsdGhpcy5pc1BsYXlpbmc9ITEsdGhpc30sY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYj0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDtiPGU7YisrKXRoaXMuZmlsdGVyc1tiLTFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW2JdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpc30sZGlzY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pOwpmb3IodmFyIGI9MSxlPXRoaXMuZmlsdGVycy5sZW5ndGg7YjxlO2IrKyl0aGlzLmZpbHRlcnNbYi0xXS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1tiXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXJzfSxzZXRGaWx0ZXJzOmZ1bmN0aW9uKGIpe2J8fChiPVtdKTshMD09PXRoaXMuaXNQbGF5aW5nPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9Yix0aGlzLmNvbm5lY3QoKSk6dGhpcy5maWx0ZXJzPWI7cmV0dXJuIHRoaXN9LHNldERldHVuZTpmdW5jdGlvbihiKXt0aGlzLmRldHVuZT1iO2lmKHZvaWQgMCE9PXRoaXMuc291cmNlLmRldHVuZSlyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5kZXR1bmUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMuZGV0dW5lLAp0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXREZXR1bmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXR1bmV9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZpbHRlcnMoKVswXX0sc2V0RmlsdGVyOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNldEZpbHRlcnMoYj9bYl06W10pfSxzZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oYil7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMucGxheWJhY2tSYXRlPWIsITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnNldFRhcmdldEF0VGltZSh0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGV9LApvbkVuZGVkOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITF9LGdldExvb3A6ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9LHNldExvb3A6ZnVuY3Rpb24oYil7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMubG9vcD1iLCEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5sb29wPXRoaXMubG9vcCksdGhpc30sZ2V0Vm9sdW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlfSxzZXRWb2x1bWU6ZnVuY3Rpb24oYil7dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKGIsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSk7CnJldHVybiB0aGlzfX0pO1NpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoamYucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6U2ksZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyfSxnZXRSZWZEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZX0sc2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oYil7dGhpcy5wYW5uZXIucmVmRGlzdGFuY2U9YjtyZXR1cm4gdGhpc30sZ2V0Um9sbG9mZkZhY3RvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfSxzZXRSb2xsb2ZmRmFjdG9yOmZ1bmN0aW9uKGIpe3RoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I9YjtyZXR1cm4gdGhpc30sZ2V0RGlzdGFuY2VNb2RlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsfSxzZXREaXN0YW5jZU1vZGVsOmZ1bmN0aW9uKGIpe3RoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw9YjsKcmV0dXJuIHRoaXN9LGdldE1heERpc3RhbmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlfSxzZXRNYXhEaXN0YW5jZTpmdW5jdGlvbihiKXt0aGlzLnBhbm5lci5tYXhEaXN0YW5jZT1iO3JldHVybiB0aGlzfSxzZXREaXJlY3Rpb25hbENvbmU6ZnVuY3Rpb24oYixlLGgpe3RoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPWI7dGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9ZTt0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPWg7cmV0dXJuIHRoaXN9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGcsZT1uZXcgZixoPW5ldyBnLG49bmV3IGc7cmV0dXJuIGZ1bmN0aW9uKHUpe1MucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyx1KTtpZighMCE9PXRoaXMuaGFzUGxheWJhY2tDb250cm9sfHwhMSE9PXRoaXMuaXNQbGF5aW5nKWlmKHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGIsZSxoKSxuLnNldCgwLDAsMSkuYXBwbHlRdWF0ZXJuaW9uKGUpLAp1PXRoaXMucGFubmVyLHUucG9zaXRpb25YKXt2YXIgdz10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7dS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYi54LHcpO3UucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGIueSx3KTt1LnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShiLnosdyk7dS5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobi54LHcpO3Uub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG4ueSx3KTt1Lm9yaWVudGF0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnosdyl9ZWxzZSB1LnNldFBvc2l0aW9uKGIueCxiLnksYi56KSx1LnNldE9yaWVudGF0aW9uKG4ueCxuLnksbi56KX19KCl9KTtPYmplY3QuYXNzaWduKFRpLnByb3RvdHlwZSx7Z2V0RnJlcXVlbmN5RGF0YTpmdW5jdGlvbigpe3RoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEodGhpcy5kYXRhKTsKcmV0dXJuIHRoaXMuZGF0YX0sZ2V0QXZlcmFnZUZyZXF1ZW5jeTpmdW5jdGlvbigpe2Zvcih2YXIgYj0wLGU9dGhpcy5nZXRGcmVxdWVuY3lEYXRhKCksaD0wO2g8ZS5sZW5ndGg7aCsrKWIrPWVbaF07cmV0dXJuIGIvZS5sZW5ndGh9fSk7T2JqZWN0LmFzc2lnbihVaS5wcm90b3R5cGUse2FjY3VtdWxhdGU6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplO2I9YipuK247dmFyIHU9dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKDA9PT11KXtmb3IodT0wO3UhPT1uOysrdSloW2IrdV09aFt1XTt1PWV9ZWxzZSB1Kz1lLHRoaXMuX21peEJ1ZmZlclJlZ2lvbihoLGIsMCxlL3Usbik7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PXV9LGFwcGx5OmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMudmFsdWVTaXplLGg9dGhpcy5idWZmZXI7Yj1iKmUrZTt2YXIgbj10aGlzLmN1bXVsYXRpdmVXZWlnaHQsdT10aGlzLmJpbmRpbmc7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTA7CjE+biYmdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGgsYiwzKmUsMS1uLGUpO249ZTtmb3IodmFyIHc9ZStlO24hPT13OysrbilpZihoW25dIT09aFtuK2VdKXt1LnNldFZhbHVlKGgsYik7YnJlYWt9fSxzYXZlT3JpZ2luYWxTdGF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuYnVmZmVyLGU9dGhpcy52YWx1ZVNpemUsaD0zKmU7dGhpcy5iaW5kaW5nLmdldFZhbHVlKGIsaCk7Zm9yKHZhciBuPWU7biE9PWg7KytuKWJbbl09YltoK24lZV07dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTB9LHJlc3RvcmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLDMqdGhpcy52YWx1ZVNpemUpfSxfc2VsZWN0OmZ1bmN0aW9uKGIsZSxoLG4sdSl7aWYoLjU8PW4pZm9yKG49MDtuIT09dTsrK24pYltlK25dPWJbaCtuXX0sX3NsZXJwOmZ1bmN0aW9uKGIsZSxoLG4pe2Yuc2xlcnBGbGF0KGIsZSxiLGUsYixoLG4pfSxfbGVycDpmdW5jdGlvbihiLGUsaCxuLAp1KXtmb3IodmFyIHc9MS1uLHo9MDt6IT09dTsrK3ope3ZhciBFPWUrejtiW0VdPWJbRV0qdytiW2grel0qbn19fSk7T2JqZWN0LmFzc2lnbihKbC5wcm90b3R5cGUse2dldFZhbHVlOmZ1bmN0aW9uKGIsZSl7dGhpcy5iaW5kKCk7dmFyIGg9dGhpcy5fYmluZGluZ3NbdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfXTt2b2lkIDAhPT1oJiZoLmdldFZhbHVlKGIsZSl9LHNldFZhbHVlOmZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPXRoaXMuX2JpbmRpbmdzLG49dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLHU9aC5sZW5ndGg7biE9PXU7KytuKWhbbl0uc2V0VmFsdWUoYixlKX0sYmluZDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9iaW5kaW5ncyxlPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxoPWIubGVuZ3RoO2UhPT1oOysrZSliW2VdLmJpbmQoKX0sdW5iaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX2JpbmRpbmdzLGU9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLApoPWIubGVuZ3RoO2UhPT1oOysrZSliW2VdLnVuYmluZCgpfX0pO09iamVjdC5hc3NpZ24oc2Mse0NvbXBvc2l0ZTpKbCxjcmVhdGU6ZnVuY3Rpb24oYixlLGgpe3JldHVybiBiJiZiLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IHNjLkNvbXBvc2l0ZShiLGUsaCk6bmV3IHNjKGIsZSxoKX0sc2FuaXRpemVOb2RlTmFtZTpmdW5jdGlvbigpe3ZhciBiPS9bXFtcXVwuOlwvXS9nO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZShiLCIiKX19KCkscGFyc2VUcmFja05hbWU6ZnVuY3Rpb24oKXt2YXIgYj0iW14iKyJcXFtcXF1cXC46XFwvIi5yZXBsYWNlKCJcXC4iLCIiKSsiXSIsZT0vKCg/OldDK1tcLzpdKSopLy5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIik7Yj0vKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCJXQ09EIixiKTt2YXIgaD0vKD86XC4oV0MrKSg/OlxbKC4rKVxdKT8pPy8uc291cmNlLnJlcGxhY2UoIldDIiwKIlteXFxbXFxdXFwuOlxcL10iKSxuPS9cLihXQyspKD86XFsoLispXF0pPy8uc291cmNlLnJlcGxhY2UoIldDIiwiW15cXFtcXF1cXC46XFwvXSIpLHU9bmV3IFJlZ0V4cCgiXiIrZStiK2grbisiJCIpLHc9WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIl07cmV0dXJuIGZ1bmN0aW9uKHope3ZhciBFPXUuZXhlYyh6KTtpZighRSl0aHJvdyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAiK3opO0U9e25vZGVOYW1lOkVbMl0sb2JqZWN0TmFtZTpFWzNdLG9iamVjdEluZGV4OkVbNF0scHJvcGVydHlOYW1lOkVbNV0scHJvcGVydHlJbmRleDpFWzZdfTt2YXIgSD1FLm5vZGVOYW1lJiZFLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYodm9pZCAwIT09SCYmLTEhPT1IKXt2YXIgST1FLm5vZGVOYW1lLnN1YnN0cmluZyhIKzEpOy0xIT09dy5pbmRleE9mKEkpJiYoRS5ub2RlTmFtZT1FLm5vZGVOYW1lLnN1YnN0cmluZygwLEgpLEUub2JqZWN0TmFtZT0KSSl9aWYobnVsbD09PUUucHJvcGVydHlOYW1lfHwwPT09RS5wcm9wZXJ0eU5hbWUubGVuZ3RoKXRocm93IEVycm9yKCJQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAiK3opO3JldHVybiBFfX0oKSxmaW5kTm9kZTpmdW5jdGlvbihiLGUpe2lmKCFlfHwiIj09PWV8fCJyb290Ij09PWV8fCIuIj09PWV8fC0xPT09ZXx8ZT09PWIubmFtZXx8ZT09PWIudXVpZClyZXR1cm4gYjtpZihiLnNrZWxldG9uKXt2YXIgaD1iLnNrZWxldG9uLmdldEJvbmVCeU5hbWUoZSk7aWYodm9pZCAwIT09aClyZXR1cm4gaH1pZihiLmNoaWxkcmVuKXt2YXIgbj1mdW5jdGlvbih1KXtmb3IodmFyIHc9MDt3PHUubGVuZ3RoO3crKyl7dmFyIHo9dVt3XTtpZih6Lm5hbWU9PT1lfHx6LnV1aWQ9PT1lKXJldHVybiB6O2lmKHo9bih6LmNoaWxkcmVuKSlyZXR1cm4gen1yZXR1cm4gbnVsbH07aWYoYj1uKGIuY2hpbGRyZW4pKXJldHVybiBifXJldHVybiBudWxsfX0pOwpPYmplY3QuYXNzaWduKHNjLnByb3RvdHlwZSx7X2dldFZhbHVlX3VuYXZhaWxhYmxlOmZ1bmN0aW9uKCl7fSxfc2V0VmFsdWVfdW5hdmFpbGFibGU6ZnVuY3Rpb24oKXt9LEJpbmRpbmdUeXBlOntEaXJlY3Q6MCxFbnRpcmVBcnJheToxLEFycmF5RWxlbWVudDoyLEhhc0Zyb21Ub0FycmF5OjN9LFZlcnNpb25pbmc6e05vbmU6MCxOZWVkc1VwZGF0ZToxLE1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6Mn0sR2V0dGVyQnlCaW5kaW5nVHlwZTpbZnVuY3Rpb24oYixlKXtiW2VdPXRoaXMubm9kZVt0aGlzLnByb3BlcnR5TmFtZV19LGZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSxuPTAsdT1oLmxlbmd0aDtuIT09dTsrK24pYltlKytdPWhbbl19LGZ1bmN0aW9uKGIsZSl7YltlXT10aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XX0sZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheShiLGUpfV0sU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6W1tmdW5jdGlvbihiLAplKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09YltlXX0sZnVuY3Rpb24oYixlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09YltlXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYixlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09YltlXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV0sW2Z1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSxuPTAsdT1oLmxlbmd0aDtuIT09dTsrK24paFtuXT1iW2UrK119LGZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSxuPTAsdT1oLmxlbmd0aDtuIT09dTsrK24paFtuXT1iW2UrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSxuPTAsdT1oLmxlbmd0aDtuIT09CnU7KytuKWhbbl09YltlKytdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1iW2VdfSxmdW5jdGlvbihiLGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWJbZV07dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGIsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YltlXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV0sW2Z1bmN0aW9uKGIsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShiLGUpfSxmdW5jdGlvbihiLGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYixlKTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGIsCmUpO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XV0sZ2V0VmFsdWU6ZnVuY3Rpb24oYixlKXt0aGlzLmJpbmQoKTt0aGlzLmdldFZhbHVlKGIsZSl9LHNldFZhbHVlOmZ1bmN0aW9uKGIsZSl7dGhpcy5iaW5kKCk7dGhpcy5zZXRWYWx1ZShiLGUpfSxiaW5kOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5ub2RlLGU9dGhpcy5wYXJzZWRQYXRoLGg9ZS5vYmplY3ROYW1lLG49ZS5wcm9wZXJ0eU5hbWUsdT1lLnByb3BlcnR5SW5kZXg7Ynx8KHRoaXMubm9kZT1iPXNjLmZpbmROb2RlKHRoaXMucm9vdE5vZGUsZS5ub2RlTmFtZSl8fHRoaXMucm9vdE5vZGUpO3RoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGU7dGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtpZihiKXtpZihoKXt2YXIgdz1lLm9iamVjdEluZGV4O3N3aXRjaChoKXtjYXNlICJtYXRlcmlhbHMiOmlmKCFiLm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLAp0aGlzKTtyZXR1cm59aWYoIWIubWF0ZXJpYWwubWF0ZXJpYWxzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LiIsdGhpcyk7cmV0dXJufWI9Yi5tYXRlcmlhbC5tYXRlcmlhbHM7YnJlYWs7Y2FzZSAiYm9uZXMiOmlmKCFiLnNrZWxldG9uKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBza2VsZXRvbi4iLHRoaXMpO3JldHVybn1iPWIuc2tlbGV0b24uYm9uZXM7Zm9yKGg9MDtoPGIubGVuZ3RoO2grKylpZihiW2hdLm5hbWU9PT13KXt3PWg7YnJlYWt9YnJlYWs7ZGVmYXVsdDppZih2b2lkIDA9PT1iW2hdKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsCnRoaXMpO3JldHVybn1iPWJbaF19aWYodm9pZCAwIT09dyl7aWYodm9pZCAwPT09Ylt3XSl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLiIsdGhpcyxiKTtyZXR1cm59Yj1iW3ddfX13PWJbbl07aWYodm9pZCAwPT09dyljb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiAiK2Uubm9kZU5hbWUrIi4iK24rIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIsYik7ZWxzZXtlPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PWI7dm9pZCAwIT09Yi5uZWVkc1VwZGF0ZT9lPXRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTp2b2lkIDAhPT1iLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUmJihlPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtoPQp0aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDtpZih2b2lkIDAhPT11KXtpZigibW9ycGhUYXJnZXRJbmZsdWVuY2VzIj09PW4pe2lmKCFiLmdlb21ldHJ5KXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4iLHRoaXMpO3JldHVybn1pZihiLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkpe2lmKCFiLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLiIsdGhpcyk7cmV0dXJufWZvcihoPTA7aDx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDtoKyspaWYoYi5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25baF0ubmFtZT09PQp1KXt1PWg7YnJlYWt9fWVsc2V7aWYoIWIuZ2VvbWV0cnkubW9ycGhUYXJnZXRzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaFRhcmdldHMuIix0aGlzKTtyZXR1cm59Zm9yKGg9MDtoPHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoO2grKylpZihiLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1toXS5uYW1lPT09dSl7dT1oO2JyZWFrfX19aD10aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudDt0aGlzLnJlc29sdmVkUHJvcGVydHk9dzt0aGlzLnByb3BlcnR5SW5kZXg9dX1lbHNlIHZvaWQgMCE9PXcuZnJvbUFycmF5JiZ2b2lkIDAhPT13LnRvQXJyYXk/KGg9dGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9dyk6QXJyYXkuaXNBcnJheSh3KT8oaD10aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5LAp0aGlzLnJlc29sdmVkUHJvcGVydHk9dyk6dGhpcy5wcm9wZXJ0eU5hbWU9bjt0aGlzLmdldFZhbHVlPXRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVtoXTt0aGlzLnNldFZhbHVlPXRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbaF1bZV19fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIG5vZGUgZm9yIHRyYWNrOiAiK3RoaXMucGF0aCsiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIil9LHVuYmluZDpmdW5jdGlvbigpe3RoaXMubm9kZT1udWxsO3RoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDt0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYm91bmR9fSk7T2JqZWN0LmFzc2lnbihzYy5wcm90b3R5cGUse19nZXRWYWx1ZV91bmJvdW5kOnNjLnByb3RvdHlwZS5nZXRWYWx1ZSxfc2V0VmFsdWVfdW5ib3VuZDpzYy5wcm90b3R5cGUuc2V0VmFsdWV9KTtPYmplY3QuYXNzaWduKEtsLnByb3RvdHlwZSwKe2lzQW5pbWF0aW9uT2JqZWN0R3JvdXA6ITAsYWRkOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX29iamVjdHMsZT1iLmxlbmd0aCxoPXRoaXMubkNhY2hlZE9iamVjdHNfLG49dGhpcy5faW5kaWNlc0J5VVVJRCx1PXRoaXMuX3BhdGhzLHc9dGhpcy5fcGFyc2VkUGF0aHMsej10aGlzLl9iaW5kaW5ncyxFPXoubGVuZ3RoLEg9dm9pZCAwLEk9MCxPPWFyZ3VtZW50cy5sZW5ndGg7SSE9PU87KytJKXt2YXIgUT1hcmd1bWVudHNbSV0sUj1RLnV1aWQsVT1uW1JdO2lmKHZvaWQgMD09PVUpe1U9ZSsrO25bUl09VTtiLnB1c2goUSk7Uj0wO2Zvcih2YXIgVz1FO1IhPT1XOysrUil6W1JdLnB1c2gobmV3IHNjKFEsdVtSXSx3W1JdKSl9ZWxzZSBpZihVPGgpe0g9YltVXTt2YXIgWj0tLWg7Vz1iW1pdO25bVy51dWlkXT1VO2JbVV09VztuW1JdPVo7YltaXT1RO1I9MDtmb3IoVz1FO1IhPT1XOysrUil7dmFyIGZhPXpbUl0scWE9ZmFbVV07ZmFbVV09ZmFbWl07dm9pZCAwPT09cWEmJihxYT1uZXcgc2MoUSwKdVtSXSx3W1JdKSk7ZmFbWl09cWF9fWVsc2UgYltVXSE9PUgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuIil9dGhpcy5uQ2FjaGVkT2JqZWN0c189aH0scmVtb3ZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX29iamVjdHMsZT10aGlzLm5DYWNoZWRPYmplY3RzXyxoPXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9iaW5kaW5ncyx1PW4ubGVuZ3RoLHc9MCx6PWFyZ3VtZW50cy5sZW5ndGg7dyE9PXo7Kyt3KXt2YXIgRT1hcmd1bWVudHNbd10sSD1FLnV1aWQsST1oW0hdO2lmKHZvaWQgMCE9PUkmJkk+PWUpe3ZhciBPPWUrKyxRPWJbT107aFtRLnV1aWRdPUk7YltJXT1RO2hbSF09TztiW09dPUU7RT0wO2ZvcihIPXU7RSE9PUg7KytFKXtRPQpuW0VdO3ZhciBSPVFbSV07UVtJXT1RW09dO1FbT109Un19fXRoaXMubkNhY2hlZE9iamVjdHNfPWV9LHVuY2FjaGU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fb2JqZWN0cyxlPWIubGVuZ3RoLGg9dGhpcy5uQ2FjaGVkT2JqZWN0c18sbj10aGlzLl9pbmRpY2VzQnlVVUlELHU9dGhpcy5fYmluZGluZ3Msdz11Lmxlbmd0aCx6PTAsRT1hcmd1bWVudHMubGVuZ3RoO3ohPT1FOysreil7dmFyIEg9YXJndW1lbnRzW3pdLnV1aWQsST1uW0hdO2lmKHZvaWQgMCE9PUkpaWYoZGVsZXRlIG5bSF0sSTxoKXtIPS0taDt2YXIgTz1iW0hdLFE9LS1lLFI9YltRXTtuW08udXVpZF09STtiW0ldPU87bltSLnV1aWRdPUg7YltIXT1SO2IucG9wKCk7Tz0wO2ZvcihSPXc7TyE9PVI7KytPKXt2YXIgVT11W09dLFc9VVtRXTtVW0ldPVVbSF07VVtIXT1XO1UucG9wKCl9fWVsc2UgZm9yKFE9LS1lLFI9YltRXSxuW1IudXVpZF09SSxiW0ldPVIsYi5wb3AoKSxPPTAsUj13O08hPT1SOysrTylVPXVbT10sClVbSV09VVtRXSxVLnBvcCgpfXRoaXMubkNhY2hlZE9iamVjdHNfPWh9LHN1YnNjcmliZV86ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsbj1oW2JdLHU9dGhpcy5fYmluZGluZ3M7aWYodm9pZCAwIT09bilyZXR1cm4gdVtuXTt2YXIgdz10aGlzLl9wYXRocyx6PXRoaXMuX3BhcnNlZFBhdGhzLEU9dGhpcy5fb2JqZWN0cyxIPXRoaXMubkNhY2hlZE9iamVjdHNfLEk9QXJyYXkoRS5sZW5ndGgpO249dS5sZW5ndGg7aFtiXT1uO3cucHVzaChiKTt6LnB1c2goZSk7dS5wdXNoKEkpO2g9SDtmb3Iobj1FLmxlbmd0aDtoIT09bjsrK2gpSVtoXT1uZXcgc2MoRVtoXSxiLGUpO3JldHVybiBJfSx1bnN1YnNjcmliZV86ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGg9ZVtiXTtpZih2b2lkIDAhPT1oKXt2YXIgbj10aGlzLl9wYXRocyx1PXRoaXMuX3BhcnNlZFBhdGhzLHc9dGhpcy5fYmluZGluZ3Msej13Lmxlbmd0aC0KMSxFPXdbel07ZVtiW3pdXT1oO3dbaF09RTt3LnBvcCgpO3VbaF09dVt6XTt1LnBvcCgpO25baF09blt6XTtuLnBvcCgpfX19KTtPYmplY3QuYXNzaWduKExsLnByb3RvdHlwZSx7cGxheTpmdW5jdGlvbigpe3RoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbih0aGlzKTtyZXR1cm4gdGhpc30sc3RvcDpmdW5jdGlvbigpe3RoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKHRoaXMpO3JldHVybiB0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5wYXVzZWQ9ITE7dGhpcy5lbmFibGVkPSEwO3RoaXMudGltZT0wO3RoaXMuX2xvb3BDb3VudD0tMTt0aGlzLl9zdGFydFRpbWU9bnVsbDtyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKX0saXNSdW5uaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5hYmxlZCYmIXRoaXMucGF1c2VkJiYwIT09dGhpcy50aW1lU2NhbGUmJm51bGw9PT10aGlzLl9zdGFydFRpbWUmJnRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX0sCmlzU2NoZWR1bGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX0sc3RhcnRBdDpmdW5jdGlvbihiKXt0aGlzLl9zdGFydFRpbWU9YjtyZXR1cm4gdGhpc30sc2V0TG9vcDpmdW5jdGlvbihiLGUpe3RoaXMubG9vcD1iO3RoaXMucmVwZXRpdGlvbnM9ZTtyZXR1cm4gdGhpc30sc2V0RWZmZWN0aXZlV2VpZ2h0OmZ1bmN0aW9uKGIpe3RoaXMud2VpZ2h0PWI7dGhpcy5fZWZmZWN0aXZlV2VpZ2h0PXRoaXMuZW5hYmxlZD9iOjA7cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpfSxnZXRFZmZlY3RpdmVXZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0fSxmYWRlSW46ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKGIsMCwxKX0sZmFkZU91dDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoYiwxLDApfSxjcm9zc0ZhZGVGcm9tOmZ1bmN0aW9uKGIsZSxoKXtiLmZhZGVPdXQoZSk7CnRoaXMuZmFkZUluKGUpO2lmKGgpe2g9dGhpcy5fY2xpcC5kdXJhdGlvbjt2YXIgbj1iLl9jbGlwLmR1cmF0aW9uLHU9aC9uO2Iud2FycCgxLG4vaCxlKTt0aGlzLndhcnAodSwxLGUpfXJldHVybiB0aGlzfSxjcm9zc0ZhZGVUbzpmdW5jdGlvbihiLGUsaCl7cmV0dXJuIGIuY3Jvc3NGYWRlRnJvbSh0aGlzLGUsaCl9LHN0b3BGYWRpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtudWxsIT09YiYmKHRoaXMuX3dlaWdodEludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KGIpKTtyZXR1cm4gdGhpc30sc2V0RWZmZWN0aXZlVGltZVNjYWxlOmZ1bmN0aW9uKGIpe3RoaXMudGltZVNjYWxlPWI7dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPXRoaXMucGF1c2VkPzA6YjtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxnZXRFZmZlY3RpdmVUaW1lU2NhbGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlfSwKc2V0RHVyYXRpb246ZnVuY3Rpb24oYil7dGhpcy50aW1lU2NhbGU9dGhpcy5fY2xpcC5kdXJhdGlvbi9iO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LHN5bmNXaXRoOmZ1bmN0aW9uKGIpe3RoaXMudGltZT1iLnRpbWU7dGhpcy50aW1lU2NhbGU9Yi50aW1lU2NhbGU7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0saGFsdDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy53YXJwKHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwwLGIpfSx3YXJwOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbj10aGlzLl9taXhlcix1PW4udGltZSx3PXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50LHo9dGhpcy50aW1lU2NhbGU7bnVsbD09PXcmJih0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD13PW4uX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSk7bj13LnBhcmFtZXRlclBvc2l0aW9uczt3PXcuc2FtcGxlVmFsdWVzO25bMF09dTtuWzFdPXUraDt3WzBdPWIvejt3WzFdPWUvejtyZXR1cm4gdGhpc30sc3RvcFdhcnBpbmc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bnVsbCE9PWImJih0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudChiKSk7cmV0dXJuIHRoaXN9LGdldE1peGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21peGVyfSxnZXRDbGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NsaXB9LGdldFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9jYWxSb290fHx0aGlzLl9taXhlci5fcm9vdH0sX3VwZGF0ZTpmdW5jdGlvbihiLGUsaCxuKXtpZih0aGlzLmVuYWJsZWQpe3ZhciB1PXRoaXMuX3N0YXJ0VGltZTtpZihudWxsIT09dSl7ZT0oYi11KSpoO2lmKDA+ZXx8MD09PWgpcmV0dXJuO3RoaXMuX3N0YXJ0VGltZT1udWxsO2UqPWh9ZSo9dGhpcy5fdXBkYXRlVGltZVNjYWxlKGIpO2g9dGhpcy5fdXBkYXRlVGltZShlKTtiPXRoaXMuX3VwZGF0ZVdlaWdodChiKTtpZigwPGIpe2U9dGhpcy5faW50ZXJwb2xhbnRzOwp1PXRoaXMuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKHZhciB3PTAsej1lLmxlbmd0aDt3IT09ejsrK3cpZVt3XS5ldmFsdWF0ZShoKSx1W3ddLmFjY3VtdWxhdGUobixiKX19ZWxzZSB0aGlzLl91cGRhdGVXZWlnaHQoYil9LF91cGRhdGVXZWlnaHQ6ZnVuY3Rpb24oYil7dmFyIGU9MDtpZih0aGlzLmVuYWJsZWQpe2U9dGhpcy53ZWlnaHQ7dmFyIGg9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7aWYobnVsbCE9PWgpe3ZhciBuPWguZXZhbHVhdGUoYilbMF07ZSo9bjtiPmgucGFyYW1ldGVyUG9zaXRpb25zWzFdJiYodGhpcy5zdG9wRmFkaW5nKCksMD09PW4mJih0aGlzLmVuYWJsZWQ9ITEpKX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodD1lfSxfdXBkYXRlVGltZVNjYWxlOmZ1bmN0aW9uKGIpe3ZhciBlPTA7aWYoIXRoaXMucGF1c2VkKXtlPXRoaXMudGltZVNjYWxlO3ZhciBoPXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O2lmKG51bGwhPT1oKXt2YXIgbj1oLmV2YWx1YXRlKGIpWzBdOwplKj1uO2I+aC5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BXYXJwaW5nKCksMD09PWU/dGhpcy5wYXVzZWQ9ITA6dGhpcy50aW1lU2NhbGU9ZSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9ZX0sX3VwZGF0ZVRpbWU6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy50aW1lK2IsaD10aGlzLl9jbGlwLmR1cmF0aW9uLG49dGhpcy5sb29wLHU9dGhpcy5fbG9vcENvdW50LHc9MjIwMj09PW47aWYoMD09PWIpcmV0dXJuLTE9PT11P2U6dyYmMT09PSh1JjEpP2gtZTplO2lmKDIyMDA9PT1uKWE6e2lmKC0xPT09dSYmKHRoaXMuX2xvb3BDb3VudD0wLHRoaXMuX3NldEVuZGluZ3MoITAsITAsITEpKSxlPj1oKWU9aDtlbHNlIGlmKDA+ZSllPTA7ZWxzZSBicmVhayBhO3RoaXMuY2xhbXBXaGVuRmluaXNoZWQ/dGhpcy5wYXVzZWQ9ITA6dGhpcy5lbmFibGVkPSExO3RoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246MD4KYj8tMToxfSl9ZWxzZXstMT09PXUmJigwPD1iPyh1PTAsdGhpcy5fc2V0RW5kaW5ncyghMCwwPT09dGhpcy5yZXBldGl0aW9ucyx3KSk6dGhpcy5fc2V0RW5kaW5ncygwPT09dGhpcy5yZXBldGl0aW9ucywhMCx3KSk7aWYoZT49aHx8MD5lKXtuPU1hdGguZmxvb3IoZS9oKTtlLT1oKm47dSs9TWF0aC5hYnMobik7dmFyIHo9dGhpcy5yZXBldGl0aW9ucy11OzA+PXo/KHRoaXMuY2xhbXBXaGVuRmluaXNoZWQ/dGhpcy5wYXVzZWQ9ITA6dGhpcy5lbmFibGVkPSExLGU9MDxiP2g6MCx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOjA8Yj8xOi0xfSkpOigxPT09ej8oYj0wPmIsdGhpcy5fc2V0RW5kaW5ncyhiLCFiLHcpKTp0aGlzLl9zZXRFbmRpbmdzKCExLCExLHcpLHRoaXMuX2xvb3BDb3VudD11LHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6Imxvb3AiLGFjdGlvbjp0aGlzLGxvb3BEZWx0YTpufSkpfWlmKHcmJgoxPT09KHUmMSkpcmV0dXJuIHRoaXMudGltZT1lLGgtZX1yZXR1cm4gdGhpcy50aW1lPWV9LF9zZXRFbmRpbmdzOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbj10aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO2g/KG4uZW5kaW5nU3RhcnQ9MjQwMSxuLmVuZGluZ0VuZD0yNDAxKToobi5lbmRpbmdTdGFydD1iP3RoaXMuemVyb1Nsb3BlQXRTdGFydD8yNDAxOjI0MDA6MjQwMixuLmVuZGluZ0VuZD1lP3RoaXMuemVyb1Nsb3BlQXRFbmQ/MjQwMToyNDAwOjI0MDIpfSxfc2NoZWR1bGVGYWRpbmc6ZnVuY3Rpb24oYixlLGgpe3ZhciBuPXRoaXMuX21peGVyLHU9bi50aW1lLHc9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbD09PXcmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD13PW4uX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSk7bj13LnBhcmFtZXRlclBvc2l0aW9uczt3PXcuc2FtcGxlVmFsdWVzO25bMF09dTt3WzBdPWU7blsxXT11K2I7d1sxXT1oO3JldHVybiB0aGlzfX0pO1ZpLnByb3RvdHlwZT0KT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VmksX2JpbmRBY3Rpb246ZnVuY3Rpb24oYixlKXt2YXIgaD1iLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3Qsbj1iLl9jbGlwLnRyYWNrcyx1PW4ubGVuZ3RoLHc9Yi5fcHJvcGVydHlCaW5kaW5ncztiPWIuX2ludGVycG9sYW50czt2YXIgej1oLnV1aWQsRT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsSD1FW3pdO3ZvaWQgMD09PUgmJihIPXt9LEVbel09SCk7Zm9yKEU9MDtFIT09dTsrK0Upe3ZhciBJPW5bRV0sTz1JLm5hbWUsUT1IW09dO2lmKHZvaWQgMD09PVEpe1E9d1tFXTtpZih2b2lkIDAhPT1RKXtudWxsPT09US5fY2FjaGVJbmRleCYmKCsrUS5yZWZlcmVuY2VDb3VudCx0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUSx6LE8pKTtjb250aW51ZX1RPW5ldyBVaShzYy5jcmVhdGUoaCxPLGUmJmUuX3Byb3BlcnR5QmluZGluZ3NbRV0uYmluZGluZy5wYXJzZWRQYXRoKSxJLlZhbHVlVHlwZU5hbWUsCkkuZ2V0VmFsdWVTaXplKCkpOysrUS5yZWZlcmVuY2VDb3VudDt0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUSx6LE8pfXdbRV09UTtiW0VdLnJlc3VsdEJ1ZmZlcj1RLmJ1ZmZlcn19LF9hY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihiKXtpZighdGhpcy5faXNBY3RpdmVBY3Rpb24oYikpe2lmKG51bGw9PT1iLl9jYWNoZUluZGV4KXt2YXIgZT0oYi5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLGg9Yi5fY2xpcC51dWlkLG49dGhpcy5fYWN0aW9uc0J5Q2xpcFtoXTt0aGlzLl9iaW5kQWN0aW9uKGIsbiYmbi5rbm93bkFjdGlvbnNbMF0pO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGIsaCxlKX1lPWIuX3Byb3BlcnR5QmluZGluZ3M7aD0wO2ZvcihuPWUubGVuZ3RoO2ghPT1uOysraCl7dmFyIHU9ZVtoXTswPT09dS51c2VDb3VudCsrJiYodGhpcy5fbGVuZEJpbmRpbmcodSksdS5zYXZlT3JpZ2luYWxTdGF0ZSgpKX10aGlzLl9sZW5kQWN0aW9uKGIpfX0sX2RlYWN0aXZhdGVBY3Rpb246ZnVuY3Rpb24oYil7aWYodGhpcy5faXNBY3RpdmVBY3Rpb24oYikpe2Zvcih2YXIgZT0KYi5fcHJvcGVydHlCaW5kaW5ncyxoPTAsbj1lLmxlbmd0aDtoIT09bjsrK2gpe3ZhciB1PWVbaF07MD09PS0tdS51c2VDb3VudCYmKHUucmVzdG9yZU9yaWdpbmFsU3RhdGUoKSx0aGlzLl90YWtlQmFja0JpbmRpbmcodSkpfXRoaXMuX3Rha2VCYWNrQWN0aW9uKGIpfX0sX2luaXRNZW1vcnlNYW5hZ2VyOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aW9ucz1bXTt0aGlzLl9uQWN0aXZlQWN0aW9ucz0wO3RoaXMuX2FjdGlvbnNCeUNsaXA9e307dGhpcy5fYmluZGluZ3M9W107dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTA7dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9O3RoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W107dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDt2YXIgYj10aGlzO3RoaXMuc3RhdHM9e2FjdGlvbnM6e2dldCB0b3RhbCgpe3JldHVybiBiLl9hY3Rpb25zLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGIuX25BY3RpdmVBY3Rpb25zfX0sYmluZGluZ3M6e2dldCB0b3RhbCgpe3JldHVybiBiLl9iaW5kaW5ncy5sZW5ndGh9LApnZXQgaW5Vc2UoKXtyZXR1cm4gYi5fbkFjdGl2ZUJpbmRpbmdzfX0sY29udHJvbEludGVycG9sYW50czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGIuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gYi5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHN9fX19LF9pc0FjdGl2ZUFjdGlvbjpmdW5jdGlvbihiKXtiPWIuX2NhY2hlSW5kZXg7cmV0dXJuIG51bGwhPT1iJiZiPHRoaXMuX25BY3RpdmVBY3Rpb25zfSxfYWRkSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYixlLGgpe3ZhciBuPXRoaXMuX2FjdGlvbnMsdT10aGlzLl9hY3Rpb25zQnlDbGlwLHc9dVtlXTt2b2lkIDA9PT13Pyh3PXtrbm93bkFjdGlvbnM6W2JdLGFjdGlvbkJ5Um9vdDp7fX0sYi5fYnlDbGlwQ2FjaGVJbmRleD0wLHVbZV09dyk6KGU9dy5rbm93bkFjdGlvbnMsYi5fYnlDbGlwQ2FjaGVJbmRleD1lLmxlbmd0aCxlLnB1c2goYikpO2IuX2NhY2hlSW5kZXg9bi5sZW5ndGg7bi5wdXNoKGIpOwp3LmFjdGlvbkJ5Um9vdFtoXT1ifSxfcmVtb3ZlSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5fYWN0aW9ucyxoPWVbZS5sZW5ndGgtMV0sbj1iLl9jYWNoZUluZGV4O2guX2NhY2hlSW5kZXg9bjtlW25dPWg7ZS5wb3AoKTtiLl9jYWNoZUluZGV4PW51bGw7ZT1iLl9jbGlwLnV1aWQ7aD10aGlzLl9hY3Rpb25zQnlDbGlwO249aFtlXTt2YXIgdT1uLmtub3duQWN0aW9ucyx3PXVbdS5sZW5ndGgtMV0sej1iLl9ieUNsaXBDYWNoZUluZGV4O3cuX2J5Q2xpcENhY2hlSW5kZXg9ejt1W3pdPXc7dS5wb3AoKTtiLl9ieUNsaXBDYWNoZUluZGV4PW51bGw7ZGVsZXRlIG4uYWN0aW9uQnlSb290WyhiLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWRdOzA9PT11Lmxlbmd0aCYmZGVsZXRlIGhbZV07dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihiKX0sX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb246ZnVuY3Rpb24oYil7Yj1iLl9wcm9wZXJ0eUJpbmRpbmdzOwpmb3IodmFyIGU9MCxoPWIubGVuZ3RoO2UhPT1oOysrZSl7dmFyIG49YltlXTswPT09LS1uLnJlZmVyZW5jZUNvdW50JiZ0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcobil9fSxfbGVuZEFjdGlvbjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLl9hY3Rpb25zLGg9Yi5fY2FjaGVJbmRleCxuPXRoaXMuX25BY3RpdmVBY3Rpb25zKyssdT1lW25dO2IuX2NhY2hlSW5kZXg9bjtlW25dPWI7dS5fY2FjaGVJbmRleD1oO2VbaF09dX0sX3Rha2VCYWNrQWN0aW9uOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuX2FjdGlvbnMsaD1iLl9jYWNoZUluZGV4LG49LS10aGlzLl9uQWN0aXZlQWN0aW9ucyx1PWVbbl07Yi5fY2FjaGVJbmRleD1uO2Vbbl09Yjt1Ll9jYWNoZUluZGV4PWg7ZVtoXT11fSxfYWRkSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbj10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsdT1uW2VdLHc9dGhpcy5fYmluZGluZ3M7dm9pZCAwPT09dSYmKHU9e30sbltlXT0KdSk7dVtoXT1iO2IuX2NhY2hlSW5kZXg9dy5sZW5ndGg7dy5wdXNoKGIpfSxfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuX2JpbmRpbmdzLGg9Yi5iaW5kaW5nLG49aC5yb290Tm9kZS51dWlkO2g9aC5wYXRoO3ZhciB1PXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSx3PXVbbl0sej1lW2UubGVuZ3RoLTFdO2I9Yi5fY2FjaGVJbmRleDt6Ll9jYWNoZUluZGV4PWI7ZVtiXT16O2UucG9wKCk7ZGVsZXRlIHdbaF07YTp7Zm9yKHZhciBFIGluIHcpYnJlYWsgYTtkZWxldGUgdVtuXX19LF9sZW5kQmluZGluZzpmdW5jdGlvbihiKXt2YXIgZT10aGlzLl9iaW5kaW5ncyxoPWIuX2NhY2hlSW5kZXgsbj10aGlzLl9uQWN0aXZlQmluZGluZ3MrKyx1PWVbbl07Yi5fY2FjaGVJbmRleD1uO2Vbbl09Yjt1Ll9jYWNoZUluZGV4PWg7ZVtoXT11fSxfdGFrZUJhY2tCaW5kaW5nOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuX2JpbmRpbmdzLGg9Yi5fY2FjaGVJbmRleCwKbj0tLXRoaXMuX25BY3RpdmVCaW5kaW5ncyx1PWVbbl07Yi5fY2FjaGVJbmRleD1uO2Vbbl09Yjt1Ll9jYWNoZUluZGV4PWg7ZVtoXT11fSxfbGVuZENvbnRyb2xJbnRlcnBvbGFudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsZT10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrLGg9YltlXTt2b2lkIDA9PT1oJiYoaD1uZXcgcWcobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciksaC5fX2NhY2hlSW5kZXg9ZSxiW2VdPWgpO3JldHVybiBofSxfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxoPWIuX19jYWNoZUluZGV4LG49LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyx1PWVbbl07Yi5fX2NhY2hlSW5kZXg9bjtlW25dPWI7dS5fX2NhY2hlSW5kZXg9Cmg7ZVtoXT11fSxfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjpuZXcgRmxvYXQzMkFycmF5KDEpLGNsaXBBY3Rpb246ZnVuY3Rpb24oYixlKXt2YXIgaD1lfHx0aGlzLl9yb290LG49aC51dWlkO2g9InN0cmluZyI9PT10eXBlb2YgYj9JYy5maW5kQnlOYW1lKGgsYik6YjtiPW51bGwhPT1oP2gudXVpZDpiO3ZhciB1PXRoaXMuX2FjdGlvbnNCeUNsaXBbYl0sdz1udWxsO2lmKHZvaWQgMCE9PXUpe3c9dS5hY3Rpb25CeVJvb3Rbbl07aWYodm9pZCAwIT09dylyZXR1cm4gdzt3PXUua25vd25BY3Rpb25zWzBdO251bGw9PT1oJiYoaD13Ll9jbGlwKX1pZihudWxsPT09aClyZXR1cm4gbnVsbDtlPW5ldyBMbCh0aGlzLGgsZSk7dGhpcy5fYmluZEFjdGlvbihlLHcpO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGUsYixuKTtyZXR1cm4gZX0sZXhpc3RpbmdBY3Rpb246ZnVuY3Rpb24oYixlKXt2YXIgaD1lfHx0aGlzLl9yb290O2U9aC51dWlkO2g9InN0cmluZyI9PT10eXBlb2YgYj8KSWMuZmluZEJ5TmFtZShoLGIpOmI7Yj10aGlzLl9hY3Rpb25zQnlDbGlwW2g/aC51dWlkOmJdO3JldHVybiB2b2lkIDAhPT1iP2IuYWN0aW9uQnlSb290W2VdfHxudWxsOm51bGx9LHN0b3BBbGxBY3Rpb246ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fYWN0aW9ucyxlPXRoaXMuX25BY3RpdmVBY3Rpb25zLGg9dGhpcy5fYmluZGluZ3Msbj10aGlzLl9uQWN0aXZlQmluZGluZ3MsdT10aGlzLl9uQWN0aXZlQmluZGluZ3M9dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDt1IT09ZTsrK3UpYlt1XS5yZXNldCgpO2Zvcih1PTA7dSE9PW47Kyt1KWhbdV0udXNlQ291bnQ9MDtyZXR1cm4gdGhpc30sdXBkYXRlOmZ1bmN0aW9uKGIpe2IqPXRoaXMudGltZVNjYWxlO2Zvcih2YXIgZT10aGlzLl9hY3Rpb25zLGg9dGhpcy5fbkFjdGl2ZUFjdGlvbnMsbj10aGlzLnRpbWUrPWIsdT1NYXRoLnNpZ24oYiksdz10aGlzLl9hY2N1SW5kZXhePTEsej0wO3ohPT1oOysreillW3pdLl91cGRhdGUobixiLHUsCncpO2I9dGhpcy5fYmluZGluZ3M7ZT10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKHo9MDt6IT09ZTsrK3opYlt6XS5hcHBseSh3KTtyZXR1cm4gdGhpc30sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSx1bmNhY2hlQ2xpcDpmdW5jdGlvbihiKXt2YXIgZT10aGlzLl9hY3Rpb25zO2I9Yi51dWlkO3ZhciBoPXRoaXMuX2FjdGlvbnNCeUNsaXAsbj1oW2JdO2lmKHZvaWQgMCE9PW4pe249bi5rbm93bkFjdGlvbnM7Zm9yKHZhciB1PTAsdz1uLmxlbmd0aDt1IT09dzsrK3Upe3ZhciB6PW5bdV07dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbih6KTt2YXIgRT16Ll9jYWNoZUluZGV4LEg9ZVtlLmxlbmd0aC0xXTt6Ll9jYWNoZUluZGV4PW51bGw7ei5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO0guX2NhY2hlSW5kZXg9RTtlW0VdPUg7ZS5wb3AoKTt0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHopfWRlbGV0ZSBoW2JdfX0sdW5jYWNoZVJvb3Q6ZnVuY3Rpb24oYil7Yj0KYi51dWlkO3ZhciBlPXRoaXMuX2FjdGlvbnNCeUNsaXA7Zm9yKG4gaW4gZSl7dmFyIGg9ZVtuXS5hY3Rpb25CeVJvb3RbYl07dm9pZCAwIT09aCYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oaCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oaCkpfXZhciBuPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZVtiXTtpZih2b2lkIDAhPT1uKWZvcih2YXIgdSBpbiBuKWI9blt1XSxiLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGIpfSx1bmNhY2hlQWN0aW9uOmZ1bmN0aW9uKGIsZSl7Yj10aGlzLmV4aXN0aW5nQWN0aW9uKGIsZSk7bnVsbCE9PWImJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGIpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGIpKX19KTtEaC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERoKHZvaWQgMD09PXRoaXMudmFsdWUuY2xvbmU/dGhpcy52YWx1ZTp0aGlzLnZhbHVlLmNsb25lKCkpfTtXaS5wcm90b3R5cGU9Ck9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpXaSxpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiEwLGNvcHk6ZnVuY3Rpb24oYil7eGEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMubWF4SW5zdGFuY2VkQ291bnQ9Yi5tYXhJbnN0YW5jZWRDb3VudDtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSk7WGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShoZS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpYaSxpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiEwLGNvcHk6ZnVuY3Rpb24oYil7aGUucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1iLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9fSk7WWkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShULnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpZaSxpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTohMCxjb3B5OmZ1bmN0aW9uKGIpe1QucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1iLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihNbC5wcm90b3R5cGUse2xpbmVQcmVjaXNpb246MSxzZXQ6ZnVuY3Rpb24oYixlKXt0aGlzLnJheS5zZXQoYixlKX0sc2V0RnJvbUNhbWVyYTpmdW5jdGlvbihiLGUpe2UmJmUuaXNQZXJzcGVjdGl2ZUNhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKSx0aGlzLnJheS5kaXJlY3Rpb24uc2V0KGIueCxiLnksLjUpLnVucHJvamVjdChlKS5zdWIodGhpcy5yYXkub3JpZ2luKS5ub3JtYWxpemUoKSk6ZSYmZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldChiLngsYi55LChlLm5lYXIrZS5mYXIpLyhlLm5lYXItZS5mYXIpKS51bnByb2plY3QoZSksCnRoaXMucmF5LmRpcmVjdGlvbi5zZXQoMCwwLC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oZS5tYXRyaXhXb3JsZCkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLlJheWNhc3RlcjogVW5zdXBwb3J0ZWQgY2FtZXJhIHR5cGUuIil9LGludGVyc2VjdE9iamVjdDpmdW5jdGlvbihiLGUsaCl7aD1ofHxbXTtaaShiLHRoaXMsaCxlKTtoLnNvcnQoTmwpO3JldHVybiBofSxpbnRlcnNlY3RPYmplY3RzOmZ1bmN0aW9uKGIsZSxoKXtoPWh8fFtdO2lmKCExPT09QXJyYXkuaXNBcnJheShiKSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5SYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuIiksaDtmb3IodmFyIG49MCx1PWIubGVuZ3RoO248dTtuKyspWmkoYltuXSx0aGlzLGgsZSk7aC5zb3J0KE5sKTtyZXR1cm4gaH19KTtPYmplY3QuYXNzaWduKE9sLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnJhZGl1cz1iO3RoaXMucGhpPWU7dGhpcy50aGV0YT0KaDtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5yYWRpdXM9Yi5yYWRpdXM7dGhpcy5waGk9Yi5waGk7dGhpcy50aGV0YT1iLnRoZXRhO3JldHVybiB0aGlzfSxtYWtlU2FmZTpmdW5jdGlvbigpe3RoaXMucGhpPU1hdGgubWF4KDFFLTYsTWF0aC5taW4oTWF0aC5QSS0xRS02LHRoaXMucGhpKSk7cmV0dXJuIHRoaXN9LHNldEZyb21WZWN0b3IzOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoYi54LGIueSxiLnopfSxzZXRGcm9tQ2FydGVzaWFuQ29vcmRzOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnJhZGl1cz1NYXRoLnNxcnQoYipiK2UqZStoKmgpOzA9PT10aGlzLnJhZGl1cz90aGlzLnBoaT10aGlzLnRoZXRhPTA6KHRoaXMudGhldGE9TWF0aC5hdGFuMihiLGgpLHRoaXMucGhpPU1hdGguYWNvcyhvYi5jbGFtcChlL3RoaXMucmFkaXVzLAotMSwxKSkpO3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oUGwucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYixlLGgpe3RoaXMucmFkaXVzPWI7dGhpcy50aGV0YT1lO3RoaXMueT1oO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLnJhZGl1cz1iLnJhZGl1czt0aGlzLnRoZXRhPWIudGhldGE7dGhpcy55PWIueTtyZXR1cm4gdGhpc30sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhiLngsYi55LGIueil9LHNldEZyb21DYXJ0ZXNpYW5Db29yZHM6ZnVuY3Rpb24oYixlLGgpe3RoaXMucmFkaXVzPU1hdGguc3FydChiKmIraCpoKTt0aGlzLnRoZXRhPU1hdGguYXRhbjIoYixoKTt0aGlzLnk9ZTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKCRpLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGIsZSl7dGhpcy5taW4uY29weShiKTsKdGhpcy5tYXguY29weShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihiKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgZT0wLGg9Yi5sZW5ndGg7ZTxoO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYltlXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKCl7dmFyIGI9bmV3IGQ7cmV0dXJuIGZ1bmN0aW9uKGUsaCl7aD1iLmNvcHkoaCkubXVsdGlwbHlTY2FsYXIoLjUpO3RoaXMubWluLmNvcHkoZSkuc3ViKGgpO3RoaXMubWF4LmNvcHkoZSkuYWRkKGgpO3JldHVybiB0aGlzfX0oKSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLm1pbi5jb3B5KGIubWluKTt0aGlzLm1heC5jb3B5KGIubWF4KTtyZXR1cm4gdGhpc30sbWFrZUVtcHR5OmZ1bmN0aW9uKCl7dGhpcy5taW4ueD10aGlzLm1pbi55PUluZmluaXR5O3RoaXMubWF4Lng9dGhpcy5tYXgueT0KLUluZmluaXR5O3JldHVybiB0aGlzfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBkKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/Yi5zZXQoMCwwKTpiLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBkKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/Yi5zZXQoMCwwKTpiLnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfSxleHBhbmRCeVBvaW50OmZ1bmN0aW9uKGIpe3RoaXMubWluLm1pbihiKTt0aGlzLm1heC5tYXgoYik7CnJldHVybiB0aGlzfSxleHBhbmRCeVZlY3RvcjpmdW5jdGlvbihiKXt0aGlzLm1pbi5zdWIoYik7dGhpcy5tYXguYWRkKGIpO3JldHVybiB0aGlzfSxleHBhbmRCeVNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLm1pbi5hZGRTY2FsYXIoLWIpO3RoaXMubWF4LmFkZFNjYWxhcihiKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihiKXtyZXR1cm4gYi54PHRoaXMubWluLnh8fGIueD50aGlzLm1heC54fHxiLnk8dGhpcy5taW4ueXx8Yi55PnRoaXMubWF4Lnk/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm1pbi54PD1iLm1pbi54JiZiLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1iLm1pbi55JiZiLm1heC55PD10aGlzLm1heC55fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGQpOwpyZXR1cm4gZS5zZXQoKGIueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwoYi55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpKX0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihiKXtyZXR1cm4gYi5tYXgueDx0aGlzLm1pbi54fHxiLm1pbi54PnRoaXMubWF4Lnh8fGIubWF4Lnk8dGhpcy5taW4ueXx8Yi5taW4ueT50aGlzLm1heC55PyExOiEwfSxjbGFtcFBvaW50OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZT1uZXcgZCk7cmV0dXJuIGUuY29weShiKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbigpe3ZhciBiPW5ldyBkO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gYi5jb3B5KGUpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5zdWIoZSkubGVuZ3RoKCl9fSgpLGludGVyc2VjdDpmdW5jdGlvbihiKXt0aGlzLm1pbi5tYXgoYi5taW4pOwp0aGlzLm1heC5taW4oYi5tYXgpO3JldHVybiB0aGlzfSx1bmlvbjpmdW5jdGlvbihiKXt0aGlzLm1pbi5taW4oYi5taW4pO3RoaXMubWF4Lm1heChiLm1heCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihiKXt0aGlzLm1pbi5hZGQoYik7dGhpcy5tYXguYWRkKGIpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIubWluLmVxdWFscyh0aGlzLm1pbikmJmIubWF4LmVxdWFscyh0aGlzLm1heCl9fSk7T2JqZWN0LmFzc2lnbihhai5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUpe3RoaXMuc3RhcnQuY29weShiKTt0aGlzLmVuZC5jb3B5KGUpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLnN0YXJ0LmNvcHkoYi5zdGFydCk7dGhpcy5lbmQuY29weShiLmVuZCk7cmV0dXJuIHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbihiKXt2b2lkIDA9PT0KYiYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZyk7cmV0dXJuIGIuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9LGRlbHRhOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZyk7cmV0dXJuIGIuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX0sZGlzdGFuY2VTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX0sZGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX0sYXQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9Cm5ldyBnKTtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5zdGFydCl9LGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZyxlPW5ldyBnO3JldHVybiBmdW5jdGlvbihoLG4pe2Iuc3ViVmVjdG9ycyhoLHRoaXMuc3RhcnQpO2Uuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTtoPWUuZG90KGIpL2UuZG90KGUpO24mJihoPW9iLmNsYW1wKGgsMCwxKSk7cmV0dXJuIGh9fSgpLGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYixlLGgpe2I9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKGIsZSk7dm9pZCAwPT09aCYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGg9bmV3IGcpO3JldHVybiB0aGlzLmRlbHRhKGgpLm11bHRpcGx5U2NhbGFyKGIpLmFkZCh0aGlzLnN0YXJ0KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGIpe3RoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KGIpOwp0aGlzLmVuZC5hcHBseU1hdHJpeDQoYik7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJmIuZW5kLmVxdWFscyh0aGlzLmVuZCl9fSk7eWcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpO3lnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj15Zzt5Zy5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Q9ITA7emcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUGIucHJvdG90eXBlKTt6Zy5wcm90b3R5cGUuY29uc3RydWN0b3I9emc7emcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBiPW5ldyBnLGU9bmV3IGcsaD1uZXcgbDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1bImEiLCJiIiwiYyJdO3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtoLmdldE5vcm1hbE1hdHJpeCh0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCk7dmFyIHU9dGhpcy5vYmplY3QubWF0cml4V29ybGQsdz0KdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHo9dGhpcy5vYmplY3QuZ2VvbWV0cnk7aWYoeiYmei5pc0dlb21ldHJ5KWZvcih2YXIgRT16LnZlcnRpY2VzLEg9ei5mYWNlcyxJPXo9MCxPPUgubGVuZ3RoO0k8TztJKyspZm9yKHZhciBRPUhbSV0sUj0wLFU9US52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDtSPFU7UisrKXt2YXIgVz1RLnZlcnRleE5vcm1hbHNbUl07Yi5jb3B5KEVbUVtuW1JdXV0pLmFwcGx5TWF0cml4NCh1KTtlLmNvcHkoVykuYXBwbHlNYXRyaXgzKGgpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKGIpO3cuc2V0WFlaKHosYi54LGIueSxiLnopO3orPTE7dy5zZXRYWVooeixlLngsZS55LGUueik7eis9MX1lbHNlIGlmKHomJnouaXNCdWZmZXJHZW9tZXRyeSlmb3Iobj16LmF0dHJpYnV0ZXMucG9zaXRpb24sRT16LmF0dHJpYnV0ZXMubm9ybWFsLFI9ej0wLFU9bi5jb3VudDtSPFU7UisrKWIuc2V0KG4uZ2V0WChSKSxuLmdldFkoUiksCm4uZ2V0WihSKSkuYXBwbHlNYXRyaXg0KHUpLGUuc2V0KEUuZ2V0WChSKSxFLmdldFkoUiksRS5nZXRaKFIpKSxlLmFwcGx5TWF0cml4MyhoKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0aGlzLnNpemUpLmFkZChiKSx3LnNldFhZWih6LGIueCxiLnksYi56KSx6Kz0xLHcuc2V0WFlaKHosZS54LGUueSxlLnopLHorPTE7dy5uZWVkc1VwZGF0ZT0hMH19KCk7a2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpO2tmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1rZjtrZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKX07a2YucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBiPW5ldyBnO3JldHVybiBmdW5jdGlvbigpe3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt2YXIgZT10aGlzLmxpZ2h0LmRpc3RhbmNlP3RoaXMubGlnaHQuZGlzdGFuY2U6CjFFMyxoPWUqTWF0aC50YW4odGhpcy5saWdodC5hbmdsZSk7dGhpcy5jb25lLnNjYWxlLnNldChoLGgsZSk7Yi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpO3RoaXMuY29uZS5sb29rQXQoYik7dm9pZCAwIT09dGhpcy5jb2xvcj90aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfX0oKTtsZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShQYi5wcm90b3R5cGUpO2xmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1sZjtsZi5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZyxlPW5ldyBDLGg9bmV3IEM7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB1PXRoaXMuYm9uZXMsdz10aGlzLmdlb21ldHJ5LHo9dy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aC5nZXRJbnZlcnNlKHRoaXMucm9vdC5tYXRyaXhXb3JsZCk7CmZvcih2YXIgRT0wLEg9MDtFPHUubGVuZ3RoO0UrKyl7dmFyIEk9dVtFXTtJLnBhcmVudCYmSS5wYXJlbnQuaXNCb25lJiYoZS5tdWx0aXBseU1hdHJpY2VzKGgsSS5tYXRyaXhXb3JsZCksYi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZSksei5zZXRYWVooSCxiLngsYi55LGIueiksZS5tdWx0aXBseU1hdHJpY2VzKGgsSS5wYXJlbnQubWF0cml4V29ybGQpLGIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUpLHouc2V0WFlaKEgrMSxiLngsYi55LGIueiksSCs9Mil9dy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITA7Uy5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLG4pfX0oKTttZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0Yi5wcm90b3R5cGUpO21mLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tZjttZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTttZi5wcm90b3R5cGUudXBkYXRlPQpmdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMuY29sb3I/dGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTtuZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsYy5wcm90b3R5cGUpO25mLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uZjtuZi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5zY2FsZS5zZXQoLjUqdGhpcy5saWdodC53aWR0aCwuNSp0aGlzLmxpZ2h0LmhlaWdodCwxKTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpO2Vsc2V7dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLm11bHRpcGx5U2NhbGFyKHRoaXMubGlnaHQuaW50ZW5zaXR5KTt2YXIgYj10aGlzLm1hdGVyaWFsLmNvbG9yLGU9TWF0aC5tYXgoYi5yLApiLmcsYi5iKTsxPGUmJmIubXVsdGlwbHlTY2FsYXIoMS9lKTt0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5tYXRlcmlhbC5jb2xvcil9fTtuZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTtvZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7b2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPW9mO29mLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9O29mLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZyxlPW5ldyBCLGg9bmV3IEI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49CnRoaXMuY2hpbGRyZW5bMF07aWYodm9pZCAwIT09dGhpcy5jb2xvcil0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTtlbHNle3ZhciB1PW4uZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO2UuY29weSh0aGlzLmxpZ2h0LmNvbG9yKTtoLmNvcHkodGhpcy5saWdodC5ncm91bmRDb2xvcik7Zm9yKHZhciB3PTAsej11LmNvdW50O3c8ejt3Kyspe3ZhciBFPXc8ei8yP2U6aDt1LnNldFhZWih3LEUucixFLmcsRS5iKX11Lm5lZWRzVXBkYXRlPSEwfW4ubG9va0F0KGIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQubWF0cml4V29ybGQpLm5lZ2F0ZSgpKX19KCk7cGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodGIucHJvdG90eXBlKTtwZi5wcm90b3R5cGUuY29uc3RydWN0b3I9cGY7cGYucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTt0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX07cGYucHJvdG90eXBlLm9uQmVmb3JlUmVuZGVyPQpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucG9zaXRpb24uY29weSh0aGlzLmxpZ2h0UHJvYmUucG9zaXRpb24pO3RoaXMuc2NhbGUuc2V0KDEsMSwxKS5tdWx0aXBseVNjYWxhcih0aGlzLnNpemUpO3RoaXMubWF0ZXJpYWwudW5pZm9ybXMuaW50ZW5zaXR5LnZhbHVlPXRoaXMubGlnaHRQcm9iZS5pbnRlbnNpdHl9fSgpO0VoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoUGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RWgsY29weTpmdW5jdGlvbihiKXtQYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5nZW9tZXRyeS5jb3B5KGIuZ2VvbWV0cnkpO3RoaXMubWF0ZXJpYWwuY29weShiLm1hdGVyaWFsKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSk7RmgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUGIucHJvdG90eXBlKTtGaC5wcm90b3R5cGUuY29uc3RydWN0b3I9CkZoO3FmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGxjLnByb3RvdHlwZSk7cWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPXFmO3FmLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKFcsWixmYSxxYSl7ZmE9KFotVykvZmE7VS5zZXRYWVooSCwwLDAsMCk7SSsrO2ZvcihPPVc7TzxaO08rPWZhKVE9SCtJLFUuc2V0WFlaKFEsTWF0aC5zaW4oTykqaCwwLE1hdGguY29zKE8pKmgpLFUuc2V0WFlaKFErMSxNYXRoLnNpbihNYXRoLm1pbihPK2ZhLFopKSpoLDAsTWF0aC5jb3MoTWF0aC5taW4oTytmYSxaKSkqaCksVS5zZXRYWVooUSsyLDAsMCwwKSxJKz0zO1IuYWRkR3JvdXAoSCxJLHFhKTtIKz1JO0k9MH12YXIgZT10aGlzLmF1ZGlvLGg9dGhpcy5yYW5nZSxuPXRoaXMuZGl2aXNpb25zSW5uZXJBbmdsZSx1PXRoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZSx3PW9iLmRlZ1RvUmFkKGUucGFubmVyLmNvbmVJbm5lckFuZ2xlKTtlPW9iLmRlZ1RvUmFkKGUucGFubmVyLmNvbmVPdXRlckFuZ2xlKTsKdmFyIHo9dy8yLEU9ZS8yLEg9MCxJPTAsTyxRLFI9dGhpcy5nZW9tZXRyeSxVPVIuYXR0cmlidXRlcy5wb3NpdGlvbjtSLmNsZWFyR3JvdXBzKCk7YigtRSwteix1LDApO2IoLXoseixuLDEpO2IoeixFLHUsMCk7VS5uZWVkc1VwZGF0ZT0hMDt3PT09ZSYmKHRoaXMubWF0ZXJpYWxbMF0udmlzaWJsZT0hMSl9O3FmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFswXS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFsxXS5kaXNwb3NlKCl9O0FnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFBiLnByb3RvdHlwZSk7QWcucHJvdG90eXBlLmNvbnN0cnVjdG9yPUFnO0FnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYj1uZXcgZyxlPW5ldyBnLGg9bmV3IGw7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoITApO2guZ2V0Tm9ybWFsTWF0cml4KHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkKTsKdmFyIG49dGhpcy5vYmplY3QubWF0cml4V29ybGQsdT10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sdz10aGlzLm9iamVjdC5nZW9tZXRyeSx6PXcudmVydGljZXM7dz13LmZhY2VzO2Zvcih2YXIgRT0wLEg9MCxJPXcubGVuZ3RoO0g8STtIKyspe3ZhciBPPXdbSF0sUT1PLm5vcm1hbDtiLmNvcHkoeltPLmFdKS5hZGQoeltPLmJdKS5hZGQoeltPLmNdKS5kaXZpZGVTY2FsYXIoMykuYXBwbHlNYXRyaXg0KG4pO2UuY29weShRKS5hcHBseU1hdHJpeDMoaCkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKS5hZGQoYik7dS5zZXRYWVooRSxiLngsYi55LGIueik7RSs9MTt1LnNldFhZWihFLGUueCxlLnksZS56KTtFKz0xfXUubmVlZHNVcGRhdGU9ITB9fSgpO3JmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtyZi5wcm90b3R5cGUuY29uc3RydWN0b3I9cmY7cmYucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpOwp0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO3RoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKX07cmYucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBiPW5ldyBnLGU9bmV3IGcsaD1uZXcgZztyZXR1cm4gZnVuY3Rpb24oKXtiLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKTtlLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCk7aC5zdWJWZWN0b3JzKGUsYik7dGhpcy5saWdodFBsYW5lLmxvb2tBdChlKTt2b2lkIDAhPT10aGlzLmNvbG9yPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSwKdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcikpO3RoaXMudGFyZ2V0TGluZS5sb29rQXQoZSk7dGhpcy50YXJnZXRMaW5lLnNjYWxlLno9aC5sZW5ndGgoKX19KCk7QmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUGIucHJvdG90eXBlKTtCZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Qmc7QmcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGIodyx6LEUsSCl7bi5zZXQoeixFLEgpLnVucHJvamVjdCh1KTt3PWhbd107aWYodm9pZCAwIT09dylmb3Ioej1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxFPTAsSD13Lmxlbmd0aDtFPEg7RSsrKXouc2V0WFlaKHdbRV0sbi54LG4ueSxuLnopfXZhciBlLGgsbj1uZXcgZyx1PW5ldyBqZDtyZXR1cm4gZnVuY3Rpb24oKXtlPXRoaXMuZ2VvbWV0cnk7aD10aGlzLnBvaW50TWFwO3UucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0aGlzLmNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSk7CmIoImMiLDAsMCwtMSk7YigidCIsMCwwLDEpO2IoIm4xIiwtMSwtMSwtMSk7YigibjIiLDEsLTEsLTEpO2IoIm4zIiwtMSwxLC0xKTtiKCJuNCIsMSwxLC0xKTtiKCJmMSIsLTEsLTEsMSk7YigiZjIiLDEsLTEsMSk7YigiZjMiLC0xLDEsMSk7YigiZjQiLDEsMSwxKTtiKCJ1MSIsLjcsMS4xLC0xKTtiKCJ1MiIsLS43LDEuMSwtMSk7YigidTMiLDAsMiwtMSk7YigiY2YxIiwtMSwwLDEpO2IoImNmMiIsMSwwLDEpO2IoImNmMyIsMCwtMSwxKTtiKCJjZjQiLDAsMSwxKTtiKCJjbjEiLC0xLDAsLTEpO2IoImNuMiIsMSwwLC0xKTtiKCJjbjMiLDAsLTEsLTEpO2IoImNuNCIsMCwxLC0xKTtlLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMH19KCk7QmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUGIucHJvdG90eXBlKTtCZC5wcm90b3R5cGUuY29uc3RydWN0b3I9QmQ7QmQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBiPW5ldyB2O3JldHVybiBmdW5jdGlvbihlKXt2b2lkIDAhPT0KZSYmY29uc29sZS53YXJuKCJUSFJFRS5Cb3hIZWxwZXI6IC51cGRhdGUoKSBoYXMgbm8gbG9uZ2VyIGFyZ3VtZW50cy4iKTt2b2lkIDAhPT10aGlzLm9iamVjdCYmYi5zZXRGcm9tT2JqZWN0KHRoaXMub2JqZWN0KTtpZighYi5pc0VtcHR5KCkpe2U9Yi5taW47dmFyIGg9Yi5tYXgsbj10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sdT1uLmFycmF5O3VbMF09aC54O3VbMV09aC55O3VbMl09aC56O3VbM109ZS54O3VbNF09aC55O3VbNV09aC56O3VbNl09ZS54O3VbN109ZS55O3VbOF09aC56O3VbOV09aC54O3VbMTBdPWUueTt1WzExXT1oLno7dVsxMl09aC54O3VbMTNdPWgueTt1WzE0XT1lLno7dVsxNV09ZS54O3VbMTZdPWgueTt1WzE3XT1lLno7dVsxOF09ZS54O3VbMTldPWUueTt1WzIwXT1lLno7dVsyMV09aC54O3VbMjJdPWUueTt1WzIzXT1lLno7bi5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfX19KCk7QmQucHJvdG90eXBlLnNldEZyb21PYmplY3Q9CmZ1bmN0aW9uKGIpe3RoaXMub2JqZWN0PWI7dGhpcy51cGRhdGUoKTtyZXR1cm4gdGhpc307QmQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7UGIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMub2JqZWN0PWIub2JqZWN0O3JldHVybiB0aGlzfTtCZC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9O0NnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFBiLnByb3RvdHlwZSk7Q2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPUNnO0NnLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZD1mdW5jdGlvbihiKXt2YXIgZT10aGlzLmJveDtlLmlzRW1wdHkoKXx8KGUuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLGUuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxTLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYikpfTtEZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsYy5wcm90b3R5cGUpOwpEZy5wcm90b3R5cGUuY29uc3RydWN0b3I9RGc7RGcucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPWZ1bmN0aW9uKGIpe3ZhciBlPS10aGlzLnBsYW5lLmNvbnN0YW50OzFFLTg+TWF0aC5hYnMoZSkmJihlPTFFLTgpO3RoaXMuc2NhbGUuc2V0KC41KnRoaXMuc2l6ZSwuNSp0aGlzLnNpemUsZSk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5zaWRlPTA+ZT8xOjA7dGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpO1MucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyxiKX07dmFyIEdoLGJqO0NkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtDZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Q2Q7Q2QucHJvdG90eXBlLnNldERpcmVjdGlvbj1mdW5jdGlvbigpe3ZhciBiPW5ldyBnLGU7cmV0dXJuIGZ1bmN0aW9uKGgpey45OTk5OTxoLnk/dGhpcy5xdWF0ZXJuaW9uLnNldCgwLDAsMCwxKTotLjk5OTk5PmgueT90aGlzLnF1YXRlcm5pb24uc2V0KDEsCjAsMCwwKTooYi5zZXQoaC56LDAsLWgueCkubm9ybWFsaXplKCksZT1NYXRoLmFjb3MoaC55KSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShiLGUpKX19KCk7Q2QucHJvdG90eXBlLnNldExlbmd0aD1mdW5jdGlvbihiLGUsaCl7dm9pZCAwPT09ZSYmKGU9LjIqYik7dm9pZCAwPT09aCYmKGg9LjIqZSk7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDAsYi1lKSwxKTt0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7dGhpcy5jb25lLnNjYWxlLnNldChoLGUsaCk7dGhpcy5jb25lLnBvc2l0aW9uLnk9Yjt0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9O0NkLnByb3RvdHlwZS5zZXRDb2xvcj1mdW5jdGlvbihiKXt0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weShiKTt0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weShiKX07Q2QucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7Uy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYiwhMSk7dGhpcy5saW5lLmNvcHkoYi5saW5lKTsKdGhpcy5jb25lLmNvcHkoYi5jb25lKTtyZXR1cm4gdGhpc307Q2QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTtFZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShQYi5wcm90b3R5cGUpO0VnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FZztlYi5jcmVhdGU9ZnVuY3Rpb24oYixlKXtjb25zb2xlLmxvZygiVEhSRUUuQ3VydmUuY3JlYXRlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCIpO2IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZWIucHJvdG90eXBlKTtiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iO2IucHJvdG90eXBlLmdldFBvaW50PWU7cmV0dXJuIGJ9O09iamVjdC5hc3NpZ24oQWQucHJvdG90eXBlLHtjcmVhdGVQb2ludHNHZW9tZXRyeTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7CmI9dGhpcy5nZXRQb2ludHMoYik7cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoYil9LGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4iKTtiPXRoaXMuZ2V0U3BhY2VkUG9pbnRzKGIpO3JldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KGIpfSxjcmVhdGVHZW9tZXRyeTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7Zm9yKHZhciBlPW5ldyBOLGg9MCxuPWIubGVuZ3RoO2g8bjtoKyspe3ZhciB1PWJbaF07ZS52ZXJ0aWNlcy5wdXNoKG5ldyBnKHUueCwKdS55LHUuenx8MCkpfXJldHVybiBlfX0pO09iamVjdC5hc3NpZ24oWmMucHJvdG90eXBlLHtmcm9tUG9pbnRzOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuIik7dGhpcy5zZXRGcm9tUG9pbnRzKGIpfX0pO1JsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHJjLnByb3RvdHlwZSk7U2wucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocmMucHJvdG90eXBlKTtjai5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyYy5wcm90b3R5cGUpO09iamVjdC5hc3NpZ24oY2oucHJvdG90eXBlLHtpbml0RnJvbUFycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAuaW5pdEZyb21BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGdldENvbnRyb2xQb2ludHNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNwbGluZTogLmdldENvbnRyb2xQb2ludHNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyZXBhcmFtZXRyaXplQnlBcmNMZW5ndGg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO0VoLnByb3RvdHlwZS5zZXRDb2xvcnM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuIil9O2xmLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Ta2VsZXRvbkhlbHBlcjogdXBkYXRlKCkgbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGNhbGxlZC4iKX07T2JqZWN0LmFzc2lnbih3Zy5wcm90b3R5cGUse2V4dHJhY3RVcmxCYXNlOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTG9hZGVyOiAuZXh0cmFjdFVybEJhc2UoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoKSBpbnN0ZWFkLiIpOwpyZXR1cm4gaGouZXh0cmFjdFVybEJhc2UoYil9fSk7T2JqZWN0LmFzc2lnbihJaS5wcm90b3R5cGUse3NldFRleHR1cmVQYXRoOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiAuc2V0VGV4dHVyZVBhdGgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRSZXNvdXJjZVBhdGgoKS4iKTtyZXR1cm4gdGhpcy5zZXRSZXNvdXJjZVBhdGgoYil9fSk7T2JqZWN0LmFzc2lnbigkaS5wcm90b3R5cGUse2NlbnRlcjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKTtyZXR1cm4gdGhpcy5nZXRDZW50ZXIoYil9LGVtcHR5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuIik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfSxpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4iKTsKcmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChiKX0sc2l6ZTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpO3JldHVybiB0aGlzLmdldFNpemUoYil9fSk7T2JqZWN0LmFzc2lnbih2LnByb3RvdHlwZSx7Y2VudGVyOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihiKX0sZW1wdHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4iKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCl9LGlzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpOwpyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGIpfSxpc0ludGVyc2VjdGlvblNwaGVyZTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGIpfSxzaXplOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MzogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuIik7cmV0dXJuIHRoaXMuZ2V0U2l6ZShiKX19KTthai5wcm90b3R5cGUuY2VudGVyPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKTtyZXR1cm4gdGhpcy5nZXRDZW50ZXIoYil9O09iamVjdC5hc3NpZ24ob2Ise3JhbmRvbTE2OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAucmFuZG9tMTYoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgTWF0aC5yYW5kb20oKSBpbnN0ZWFkLiIpOwpyZXR1cm4gTWF0aC5yYW5kb20oKX0sbmVhcmVzdFBvd2VyT2ZUd286ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAubmVhcmVzdFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mbG9vclBvd2VyT2ZUd28oKS4iKTtyZXR1cm4gb2IuZmxvb3JQb3dlck9mVHdvKGIpfSxuZXh0UG93ZXJPZlR3bzpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGg6IC5uZXh0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNlaWxQb3dlck9mVHdvKCkuIik7cmV0dXJuIG9iLmNlaWxQb3dlck9mVHdvKGIpfX0pO09iamVjdC5hc3NpZ24obC5wcm90b3R5cGUse2ZsYXR0ZW5Ub0FycmF5T2Zmc2V0OmZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLnRvQXJyYXkoYixlKX0sCm11bHRpcGx5VmVjdG9yMzpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4iKTtyZXR1cm4gYi5hcHBseU1hdHJpeDModGhpcyl9LG11bHRpcGx5VmVjdG9yM0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLm11bHRpcGx5VmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYXBwbHlUb0J1ZmZlcjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYil9LGFwcGx5VG9WZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7Ck9iamVjdC5hc3NpZ24oQy5wcm90b3R5cGUse2V4dHJhY3RQb3NpdGlvbjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4iKTtyZXR1cm4gdGhpcy5jb3B5UG9zaXRpb24oYil9LGZsYXR0ZW5Ub0FycmF5T2Zmc2V0OmZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLnRvQXJyYXkoYixlKX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYjtyZXR1cm4gZnVuY3Rpb24oKXt2b2lkIDA9PT1iJiYoYj1uZXcgZyk7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuIik7CnJldHVybiBiLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywzKX19KCksc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKS4iKTtyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihiKX0sbXVsdGlwbHlUb0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbXVsdGlwbHlWZWN0b3IzOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBiLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3I0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpOwpyZXR1cm4gYi5hcHBseU1hdHJpeDQodGhpcyl9LG11bHRpcGx5VmVjdG9yM0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scm90YXRlQXhpczpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO2IudHJhbnNmb3JtRGlyZWN0aW9uKHRoaXMpfSxjcm9zc1ZlY3RvcjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBiLmFwcGx5TWF0cml4NCh0aGlzKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVYOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVgoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyb3RhdGVZOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyb3RhdGVaOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyb3RhdGVCeUF4aXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYXBwbHlUb0J1ZmZlcjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYil9LAphcHBseVRvVmVjdG9yM0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxtYWtlRnJ1c3R1bTpmdW5jdGlvbihiLGUsaCxuLHUsdyl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZShiLGUsbixoLHUsdyl9fSk7eS5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNMaW5lKGIpfTtmLnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjM9CmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuIik7cmV0dXJuIGIuYXBwbHlRdWF0ZXJuaW9uKHRoaXMpfTtPYmplY3QuYXNzaWduKHhiLnByb3RvdHlwZSx7aXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGIpfSxpc0ludGVyc2VjdGlvblBsYW5lOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZShiKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTsKcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZShiKX19KTtPYmplY3QuYXNzaWduKENiLnByb3RvdHlwZSx7YXJlYTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLiIpO3JldHVybiB0aGlzLmdldEFyZWEoKX0sYmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpO3JldHVybiB0aGlzLmdldEJhcnljb29yZChiLGUpfSxtaWRwb2ludDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubWlkcG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRNaWRwb2ludCgpLiIpO3JldHVybiB0aGlzLmdldE1pZHBvaW50KGIpfSxub3JtYWw6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLiIpOwpyZXR1cm4gdGhpcy5nZXROb3JtYWwoYil9LHBsYW5lOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuIik7cmV0dXJuIHRoaXMuZ2V0UGxhbmUoYil9fSk7T2JqZWN0LmFzc2lnbihDYix7YmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGIsZSxoLG4sdSl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpO3JldHVybiBDYi5nZXRCYXJ5Y29vcmQoYixlLGgsbix1KX0sbm9ybWFsOmZ1bmN0aW9uKGIsZSxoLG4pe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gQ2IuZ2V0Tm9ybWFsKGIsZSxoLG4pfX0pO09iamVjdC5hc3NpZ24oWGQucHJvdG90eXBlLHtleHRyYWN0QWxsUG9pbnRzOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuU2hhcGU6IC5leHRyYWN0QWxsUG9pbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5leHRyYWN0UG9pbnRzKCkgaW5zdGVhZC4iKTsKcmV0dXJuIHRoaXMuZXh0cmFjdFBvaW50cyhiKX0sZXh0cnVkZTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgbGUodGhpcyxiKX0sbWFrZUdlb21ldHJ5OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuU2hhcGU6IC5tYWtlR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgU2hhcGVHZW9tZXRyeSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBtZSh0aGlzLGIpfX0pO09iamVjdC5hc3NpZ24oZC5wcm90b3R5cGUse2Zyb21BdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShiLGUsaCl9LGRpc3RhbmNlVG9NYW5oYXR0YW46ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4iKTsKcmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyhiKX0sbGVuZ3RoTWFuaGF0dGFuOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9fSk7T2JqZWN0LmFzc2lnbihnLnByb3RvdHlwZSx7c2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5zdGVhZC4iKX0sc2V0RXVsZXJGcm9tUXVhdGVybmlvbjpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21RdWF0ZXJuaW9uKCkgaW5zdGVhZC4iKX0sCmdldFBvc2l0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4iKTtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oYil9LGdldFNjYWxlRnJvbU1hdHJpeDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRTY2FsZUZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4U2NhbGUoKS4iKTtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4U2NhbGUoYil9LGdldENvbHVtbkZyb21NYXRyaXg6ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLiIpO3JldHVybiB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oZSwKYil9LGFwcGx5UHJvamVjdGlvbjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGIpfSxmcm9tQXR0cmlidXRlOmZ1bmN0aW9uKGIsZSxoKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3JldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYixlLGgpfSxkaXN0YW5jZVRvTWFuaGF0dGFuOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyhiKX0sbGVuZ3RoTWFuaGF0dGFuOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIik7CnJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24obS5wcm90b3R5cGUse2Zyb21BdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShiLGUsaCl9LGxlbmd0aE1hbmhhdHRhbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24oTi5wcm90b3R5cGUse2NvbXB1dGVUYW5nZW50czpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuYXNzaWduKFMucHJvdG90eXBlLHtnZXRDaGlsZEJ5TmFtZTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4iKTtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeU5hbWUoYil9LHJlbmRlckRlcHRoOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuIil9LHRyYW5zbGF0ZTpmdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhlLGIpfSxnZXRXb3JsZFJvdGF0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4iKX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUy5wcm90b3R5cGUse2V1bGVyT3JkZXI6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXJ9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLiIpO3RoaXMucm90YXRpb24ub3JkZXI9Yn19LHVzZVF1YXRlcm5pb246e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUZi5wcm90b3R5cGUse29iamVjdHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTE9EOiAub2JqZWN0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5sZXZlbHMuIik7cmV0dXJuIHRoaXMubGV2ZWxzfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoamgucHJvdG90eXBlLCJ1c2VWZXJ0ZXhUZXh0dXJlIix7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7VWYucHJvdG90eXBlLmluaXRCb25lcz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoOiBpbml0Qm9uZXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZWIucHJvdG90eXBlLAoiX19hcmNMZW5ndGhEaXZpc2lvbnMiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLiIpO3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWJ9fSk7Y2MucHJvdG90eXBlLnNldExlbnM9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuIik7dm9pZCAwIT09ZSYmKHRoaXMuZmlsbUdhdWdlPWUpO3RoaXMuc2V0Rm9jYWxMZW5ndGgoYil9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNiLnByb3RvdHlwZSwKe29ubHlTaGFkb3c6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dDYW1lcmFGb3Y6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRm92IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mb3YuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmZvdj1ifX0sc2hhZG93Q2FtZXJhTGVmdDp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LiIpO3RoaXMuc2hhZG93LmNhbWVyYS5sZWZ0PWJ9fSxzaGFkb3dDYW1lcmFSaWdodDp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLnJpZ2h0PWJ9fSxzaGFkb3dDYW1lcmFUb3A6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVG9wIGlzIG5vdyAuc2hhZG93LmNhbWVyYS50b3AuIik7CnRoaXMuc2hhZG93LmNhbWVyYS50b3A9Yn19LHNoYWRvd0NhbWVyYUJvdHRvbTp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tPWJ9fSxzaGFkb3dDYW1lcmFOZWFyOntzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuIik7dGhpcy5zaGFkb3cuY2FtZXJhLm5lYXI9Yn19LHNoYWRvd0NhbWVyYUZhcjp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZmFyPWJ9fSxzaGFkb3dDYW1lcmFWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuIil9fSwKc2hhZG93Qmlhczp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuIik7dGhpcy5zaGFkb3cuYmlhcz1ifX0sc2hhZG93RGFya25lc3M6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93TWFwV2lkdGg6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4iKTt0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoPWJ9fSxzaGFkb3dNYXBIZWlnaHQ6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LiIpO3RoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0PWJ9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFQucHJvdG90eXBlLAp7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RofX0sY29weUluZGljZXNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24oeGEucHJvdG90eXBlLHthZGRJbmRleDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLiIpO3RoaXMuc2V0SW5kZXgoYil9LGFkZERyYXdDYWxsOmZ1bmN0aW9uKGIsZSxoKXt2b2lkIDAhPT1oJiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuIik7CmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4iKTt0aGlzLmFkZEdyb3VwKGIsZSl9LGNsZWFyRHJhd0NhbGxzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLiIpO3RoaXMuY2xlYXJHcm91cHMoKX0sY29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGNvbXB1dGVPZmZzZXRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4YS5wcm90b3R5cGUse2RyYXdjYWxsczp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpOwpyZXR1cm4gdGhpcy5ncm91cHN9fSxvZmZzZXRzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7cmV0dXJuIHRoaXMuZ3JvdXBzfX19KTtPYmplY3QuYXNzaWduKG1kLnByb3RvdHlwZSx7Z2V0QXJyYXlzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGVMaXN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRGgucHJvdG90eXBlLAp7ZHluYW1pYzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKX19LG9uVXBkYXRlOnt2YWx1ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuIik7cmV0dXJuIHRoaXN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEdhLnByb3RvdHlwZSx7d3JhcEFyb3VuZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LG92ZXJkcmF3OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sd3JhcFJHQjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLndyYXBSR0IgaGFzIGJlZW4gcmVtb3ZlZC4iKTtyZXR1cm4gbmV3IEJ9fSxzaGFkaW5nOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKTt0aGlzLmZsYXRTaGFkaW5nPTE9PT1ifX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUYy5wcm90b3R5cGUse21ldGFsOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQuIik7CnJldHVybiExfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQiKX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGIucHJvdG90eXBlLHtkZXJpdmF0aXZlczp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXN9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLiBTaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLiIpO3RoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcz1ifX19KTtPYmplY3QuYXNzaWduKHRpLnByb3RvdHlwZSwKe2NsZWFyVGFyZ2V0OmZ1bmN0aW9uKGIsZSxoLG4pe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNsZWFyVGFyZ2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zZXRSZW5kZXJUYXJnZXQoKSBhbmQgLmNsZWFyKCkgaW5zdGVhZC4iKTt0aGlzLnNldFJlbmRlclRhcmdldChiKTt0aGlzLmNsZWFyKGUsaCxuKX0sYW5pbWF0ZTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hbmltYXRlKCkgaXMgbm93IC5zZXRBbmltYXRpb25Mb29wKCkuIik7dGhpcy5zZXRBbmltYXRpb25Mb29wKGIpfSxnZXRDdXJyZW50UmVuZGVyVGFyZ2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0Q3VycmVudFJlbmRlclRhcmdldCgpIGlzIG5vdyAuZ2V0UmVuZGVyVGFyZ2V0KCkuIik7cmV0dXJuIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCl9LGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRNYXhBbmlzb3Ryb3B5KCkgaXMgbm93IC5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpLiIpOwpyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpfSxnZXRQcmVjaXNpb246ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRQcmVjaXNpb24oKSBpcyBub3cgLmNhcGFiaWxpdGllcy5wcmVjaXNpb24uIik7cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbn0scmVzZXRHTFN0YXRlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAucmVzZXRHTFN0YXRlKCkgaXMgbm93IC5zdGF0ZS5yZXNldCgpLiIpO3JldHVybiB0aGlzLnN0YXRlLnJlc2V0KCl9LHN1cHBvcnRzRmxvYXRUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKX0sCnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXQiKX0sc3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIil9LHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkuIik7CnJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfSxzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKX0sc3VwcG9ydHNCbGVuZE1pbk1heDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQmxlbmRNaW5NYXgoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2JsZW5kX21pbm1heCcgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiRVhUX2JsZW5kX21pbm1heCIpfSxzdXBwb3J0c1ZlcnRleFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcygpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLiIpOwpyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXN9LHN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNJbnN0YW5jZWRBcnJheXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpfSxlbmFibGVTY2lzc29yVGVzdDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5lbmFibGVTY2lzc29yVGVzdCgpIGlzIG5vdyAuc2V0U2Npc3NvclRlc3QoKS4iKTt0aGlzLnNldFNjaXNzb3JUZXN0KGIpfSxpbml0TWF0ZXJpYWw6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5pbml0TWF0ZXJpYWwoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhZGRQcmVQbHVnaW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKYWRkUG9zdFBsdWdpbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFBvc3RQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLiIpfSx1cGRhdGVTaGFkb3dNYXA6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXRGYWNlQ3VsbGluZzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldEZhY2VDdWxsaW5nKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWxsb2NUZXh0dXJlVW5pdDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFsbG9jVGV4dHVyZVVuaXQoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXRUZXh0dXJlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldFRleHR1cmUyRDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUyRCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApzZXRUZXh0dXJlQ3ViZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmVDdWJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aS5wcm90b3R5cGUse3NoYWRvd01hcEVuYWJsZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLiIpO3RoaXMuc2hhZG93TWFwLmVuYWJsZWQ9Yn19LHNoYWRvd01hcFR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC50eXBlfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLiIpO3RoaXMuc2hhZG93TWFwLnR5cGU9Yn19LApzaGFkb3dNYXBDdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobWwucHJvdG90eXBlLHtjdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0sCnJlbmRlclJldmVyc2VTaWRlZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxyZW5kZXJTaW5nbGVTaWRlZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoci5wcm90b3R5cGUse2FjdGl2ZUN1YmVGYWNlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZUN1YmVGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBXZWJHTFJlbmRlcmVyLnNldFJlbmRlclRhcmdldCgpLiIpfX0sYWN0aXZlTWlwTWFwTGV2ZWw6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlOiAuYWN0aXZlTWlwTWFwTGV2ZWwgaGFzIGJlZW4gcmVtb3ZlZC4gSXQgaXMgbm93IHRoZSB0aGlyZCBwYXJhbWV0ZXIgb2YgV2ViR0xSZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoKS4iKX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocC5wcm90b3R5cGUse3dyYXBTOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpOwpyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTt0aGlzLnRleHR1cmUud3JhcFM9Yn19LHdyYXBUOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpO3JldHVybiB0aGlzLnRleHR1cmUud3JhcFR9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpO3RoaXMudGV4dHVyZS53cmFwVD1ifX0sbWFnRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5tYWdGaWx0ZXJ9LApzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5tYWdGaWx0ZXI9Yn19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5taW5GaWx0ZXI9Yn19LGFuaXNvdHJvcHk6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpO3JldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weX0sCnNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTt0aGlzLnRleHR1cmUuYW5pc290cm9weT1ifX0sb2Zmc2V0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXR9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7dGhpcy50ZXh0dXJlLm9mZnNldD1ifX0scmVwZWF0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5yZXBlYXR9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7CnRoaXMudGV4dHVyZS5yZXBlYXQ9Yn19LGZvcm1hdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0fSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpO3RoaXMudGV4dHVyZS5mb3JtYXQ9Yn19LHR5cGU6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3JldHVybiB0aGlzLnRleHR1cmUudHlwZX0sc2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3RoaXMudGV4dHVyZS50eXBlPWJ9fSxnZW5lcmF0ZU1pcG1hcHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4iKTsKcmV0dXJuIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1ifX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhybC5wcm90b3R5cGUse3N0YW5kaW5nOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuIil9fSx1c2VySGVpZ2h0OntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnVzZXJIZWlnaHQgaGFzIGJlZW4gcmVtb3ZlZC4iKX19fSk7amYucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuIik7CnZhciBlPXRoaXM7KG5ldyBNaSkubG9hZChiLGZ1bmN0aW9uKGgpe2Uuc2V0QnVmZmVyKGgpfSk7cmV0dXJuIHRoaXN9O1RpLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLiIpO3JldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKX07eGcucHJvdG90eXBlLnVwZGF0ZUN1YmVNYXA9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1YmVDYW1lcmE6IC51cGRhdGVDdWJlTWFwKCkgaXMgbm93IC51cGRhdGUoKS4iKTtyZXR1cm4gdGhpcy51cGRhdGUoYixlKX07WWQuY3Jvc3NPcmlnaW49dm9pZCAwO1lkLmxvYWRUZXh0dXJlPWZ1bmN0aW9uKGIsZSxoLG4pe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuIik7dmFyIHU9Cm5ldyBzaDt1LnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2I9dS5sb2FkKGIsaCx2b2lkIDAsbik7ZSYmKGIubWFwcGluZz1lKTtyZXR1cm4gYn07WWQubG9hZFRleHR1cmVDdWJlPWZ1bmN0aW9uKGIsZSxoLG4pe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTt2YXIgdT1uZXcgRmk7dS5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtiPXUubG9hZChiLGgsdm9pZCAwLG4pO2UmJihiLm1hcHBpbmc9ZSk7cmV0dXJuIGJ9O1lkLmxvYWRDb21wcmVzc2VkVGV4dHVyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4iKX07WWQubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZT0KZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLiIpfTthLldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9cTthLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZT1yO2EuV2ViR0xSZW5kZXJUYXJnZXQ9cDthLldlYkdMUmVuZGVyZXI9dGk7YS5TaGFkZXJMaWI9aWQ7YS5Vbmlmb3Jtc0xpYj1iYjthLlVuaWZvcm1zVXRpbHM9bHA7YS5TaGFkZXJDaHVuaz16YjthLkZvZ0V4cDI9Z2g7YS5Gb2c9aGg7YS5TY2VuZT1paDthLlNwcml0ZT1TZjthLkxPRD1UZjthLlNraW5uZWRNZXNoPVVmO2EuU2tlbGV0b249amg7YS5Cb25lPXppO2EuTWVzaD10YjthLkxpbmVTZWdtZW50cz1QYjthLkxpbmVMb29wPWtoO2EuTGluZT1sYzthLlBvaW50cz1SZTthLkdyb3VwPU5lO2EuVmlkZW9UZXh0dXJlPUFpO2EuRGF0YVRleHR1cmU9dDthLkRhdGFUZXh0dXJlMkRBcnJheT0KS2U7YS5EYXRhVGV4dHVyZTNEPUxlO2EuQ29tcHJlc3NlZFRleHR1cmU9U2U7YS5DdWJlVGV4dHVyZT11ZDthLkNhbnZhc1RleHR1cmU9VmY7YS5EZXB0aFRleHR1cmU9V2Y7YS5UZXh0dXJlPWs7YS5BbmltYXRpb25Mb2FkZXI9RWw7YS5Db21wcmVzc2VkVGV4dHVyZUxvYWRlcj1GbDthLkRhdGFUZXh0dXJlTG9hZGVyPUVpO2EuQ3ViZVRleHR1cmVMb2FkZXI9Rmk7YS5UZXh0dXJlTG9hZGVyPXNoO2EuT2JqZWN0TG9hZGVyPUlpO2EuTWF0ZXJpYWxMb2FkZXI9Qmg7YS5CdWZmZXJHZW9tZXRyeUxvYWRlcj1IaTthLkRlZmF1bHRMb2FkaW5nTWFuYWdlcj1BYzthLkxvYWRpbmdNYW5hZ2VyPURpO2EuSW1hZ2VMb2FkZXI9c2c7YS5JbWFnZUJpdG1hcExvYWRlcj1KaTthLkZvbnRMb2FkZXI9SGw7YS5GaWxlTG9hZGVyPVVjO2EuTG9hZGVyPXdnO2EuTG9hZGVyVXRpbHM9aGo7YS5DYWNoZT14ZTthLkF1ZGlvTG9hZGVyPU1pO2EuU3BvdExpZ2h0U2hhZG93PXVoO2EuU3BvdExpZ2h0PXZoOwphLlBvaW50TGlnaHQ9d2g7YS5SZWN0QXJlYUxpZ2h0PUFoO2EuSGVtaXNwaGVyZUxpZ2h0PXRoO2EuSGVtaXNwaGVyZUxpZ2h0UHJvYmU9Tmk7YS5EaXJlY3Rpb25hbExpZ2h0U2hhZG93PXhoO2EuRGlyZWN0aW9uYWxMaWdodD15aDthLkFtYmllbnRMaWdodD16aDthLkFtYmllbnRMaWdodFByb2JlPU9pO2EuTGlnaHRTaGFkb3c9d2U7YS5MaWdodD1TYjthLkxpZ2h0UHJvYmU9JGM7YS5TdGVyZW9DYW1lcmE9SWw7YS5QZXJzcGVjdGl2ZUNhbWVyYT1jYzthLk9ydGhvZ3JhcGhpY0NhbWVyYT12ZzthLkN1YmVDYW1lcmE9eGc7YS5BcnJheUNhbWVyYT1QZjthLkNhbWVyYT1qZDthLkF1ZGlvTGlzdGVuZXI9UWk7YS5Qb3NpdGlvbmFsQXVkaW89U2k7YS5BdWRpb0NvbnRleHQ9Umk7YS5BdWRpb0FuYWx5c2VyPVRpO2EuQXVkaW89amY7YS5WZWN0b3JLZXlmcmFtZVRyYWNrPWdmO2EuU3RyaW5nS2V5ZnJhbWVUcmFjaz1yaDthLlF1YXRlcm5pb25LZXlmcmFtZVRyYWNrPXJnO2EuTnVtYmVyS2V5ZnJhbWVUcmFjaz0KZmY7YS5Db2xvcktleWZyYW1lVHJhY2s9cGg7YS5Cb29sZWFuS2V5ZnJhbWVUcmFjaz1vaDthLlByb3BlcnR5TWl4ZXI9VWk7YS5Qcm9wZXJ0eUJpbmRpbmc9c2M7YS5LZXlmcmFtZVRyYWNrPW1jO2EuQW5pbWF0aW9uVXRpbHM9Z2M7YS5BbmltYXRpb25PYmplY3RHcm91cD1LbDthLkFuaW1hdGlvbk1peGVyPVZpO2EuQW5pbWF0aW9uQ2xpcD1JYzthLlVuaWZvcm09RGg7YS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT1XaTthLkJ1ZmZlckdlb21ldHJ5PXhhO2EuR2VvbWV0cnk9TjthLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlPVJmO2EuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI9WGk7YS5JbnRlcmxlYXZlZEJ1ZmZlcj1oZTthLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT1ZaTthLkZhY2UzPUw7YS5PYmplY3QzRD1TO2EuUmF5Y2FzdGVyPU1sO2EuTGF5ZXJzPVA7YS5FdmVudERpc3BhdGNoZXI9YzthLkNsb2NrPVBpO2EuUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50PXFoOwphLkxpbmVhckludGVycG9sYW50PXFnO2EuRGlzY3JldGVJbnRlcnBvbGFudD1uaDthLkN1YmljSW50ZXJwb2xhbnQ9bWg7YS5JbnRlcnBvbGFudD1EYzthLlRyaWFuZ2xlPUNiO2EuTWF0aD1vYjthLlNwaGVyaWNhbD1PbDthLkN5bGluZHJpY2FsPVBsO2EuUGxhbmU9eTthLkZydXN0dW09eDthLlNwaGVyZT1BO2EuUmF5PXhiO2EuTWF0cml4ND1DO2EuTWF0cml4Mz1sO2EuQm94Mz12O2EuQm94Mj0kaTthLkxpbmUzPWFqO2EuRXVsZXI9SjthLlZlY3RvcjQ9bTthLlZlY3RvcjM9ZzthLlZlY3RvcjI9ZDthLlF1YXRlcm5pb249ZjthLkNvbG9yPUI7YS5TcGhlcmljYWxIYXJtb25pY3MzPUNoO2EuSW1tZWRpYXRlUmVuZGVyT2JqZWN0PXlnO2EuVmVydGV4Tm9ybWFsc0hlbHBlcj16ZzthLlNwb3RMaWdodEhlbHBlcj1rZjthLlNrZWxldG9uSGVscGVyPWxmO2EuUG9pbnRMaWdodEhlbHBlcj1tZjthLlJlY3RBcmVhTGlnaHRIZWxwZXI9bmY7YS5IZW1pc3BoZXJlTGlnaHRIZWxwZXI9b2Y7CmEuTGlnaHRQcm9iZUhlbHBlcj1wZjthLkdyaWRIZWxwZXI9RWg7YS5Qb2xhckdyaWRIZWxwZXI9Rmg7YS5Qb3NpdGlvbmFsQXVkaW9IZWxwZXI9cWY7YS5GYWNlTm9ybWFsc0hlbHBlcj1BZzthLkRpcmVjdGlvbmFsTGlnaHRIZWxwZXI9cmY7YS5DYW1lcmFIZWxwZXI9Qmc7YS5Cb3hIZWxwZXI9QmQ7YS5Cb3gzSGVscGVyPUNnO2EuUGxhbmVIZWxwZXI9RGc7YS5BcnJvd0hlbHBlcj1DZDthLkF4ZXNIZWxwZXI9RWc7YS5TaGFwZT1YZDthLlBhdGg9WmM7YS5TaGFwZVBhdGg9S2k7YS5Gb250PUxpO2EuQ3VydmVQYXRoPUFkO2EuQ3VydmU9ZWI7YS5JbWFnZVV0aWxzPVlkO2EuU2hhcGVVdGlscz15ZDthLldlYkdMVXRpbHM9bmw7YS5XaXJlZnJhbWVHZW9tZXRyeT1UZTthLlBhcmFtZXRyaWNHZW9tZXRyeT1YZjthLlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeT1VZTthLlRldHJhaGVkcm9uR2VvbWV0cnk9WmY7YS5UZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5PVZlO2EuT2N0YWhlZHJvbkdlb21ldHJ5PQokZjthLk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeT1pZTthLkljb3NhaGVkcm9uR2VvbWV0cnk9YWc7YS5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5PVdlO2EuRG9kZWNhaGVkcm9uR2VvbWV0cnk9Ymc7YS5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeT1YZTthLlBvbHloZWRyb25HZW9tZXRyeT1ZZjthLlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeT16YzthLlR1YmVHZW9tZXRyeT1jZzthLlR1YmVCdWZmZXJHZW9tZXRyeT1qZTthLlRvcnVzS25vdEdlb21ldHJ5PWRnO2EuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk9WWU7YS5Ub3J1c0dlb21ldHJ5PWVnO2EuVG9ydXNCdWZmZXJHZW9tZXRyeT1aZTthLlRleHRHZW9tZXRyeT1qZzthLlRleHRCdWZmZXJHZW9tZXRyeT0kZTthLlNwaGVyZUdlb21ldHJ5PWtnO2EuU3BoZXJlQnVmZmVyR2VvbWV0cnk9V2Q7YS5SaW5nR2VvbWV0cnk9bGc7YS5SaW5nQnVmZmVyR2VvbWV0cnk9YWY7YS5QbGFuZUdlb21ldHJ5PVNhO2EuUGxhbmVCdWZmZXJHZW9tZXRyeT0KRWE7YS5MYXRoZUdlb21ldHJ5PW1nO2EuTGF0aGVCdWZmZXJHZW9tZXRyeT1iZjthLlNoYXBlR2VvbWV0cnk9bWU7YS5TaGFwZUJ1ZmZlckdlb21ldHJ5PW5lO2EuRXh0cnVkZUdlb21ldHJ5PWxlO2EuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5PW1kO2EuRWRnZXNHZW9tZXRyeT1jZjthLkNvbmVHZW9tZXRyeT1uZzthLkNvbmVCdWZmZXJHZW9tZXRyeT1vZzthLkN5bGluZGVyR2VvbWV0cnk9b2U7YS5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5PXpkO2EuQ2lyY2xlR2VvbWV0cnk9cGc7YS5DaXJjbGVCdWZmZXJHZW9tZXRyeT1kZjthLkJveEdlb21ldHJ5PXphO2EuQ3ViZUdlb21ldHJ5PXphO2EuQm94QnVmZmVyR2VvbWV0cnk9RmE7YS5TaGFkb3dNYXRlcmlhbD1wZTthLlNwcml0ZU1hdGVyaWFsPVZkO2EuUmF3U2hhZGVyTWF0ZXJpYWw9ZWY7YS5TaGFkZXJNYXRlcmlhbD1kYjthLlBvaW50c01hdGVyaWFsPVNjO2EuTWVzaFBoeXNpY2FsTWF0ZXJpYWw9cWU7YS5NZXNoU3RhbmRhcmRNYXRlcmlhbD0KbmQ7YS5NZXNoUGhvbmdNYXRlcmlhbD1UYzthLk1lc2hUb29uTWF0ZXJpYWw9cmU7YS5NZXNoTm9ybWFsTWF0ZXJpYWw9c2U7YS5NZXNoTGFtYmVydE1hdGVyaWFsPXRlO2EuTWVzaERlcHRoTWF0ZXJpYWw9UGQ7YS5NZXNoRGlzdGFuY2VNYXRlcmlhbD1RZDthLk1lc2hCYXNpY01hdGVyaWFsPXliO2EuTWVzaE1hdGNhcE1hdGVyaWFsPXVlO2EuTGluZURhc2hlZE1hdGVyaWFsPXZlO2EuTGluZUJhc2ljTWF0ZXJpYWw9TGI7YS5NYXRlcmlhbD1HYTthLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU9bGE7YS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlPWJhO2EuVWludDMyQnVmZmVyQXR0cmlidXRlPWthO2EuSW50MzJCdWZmZXJBdHRyaWJ1dGU9ZWE7YS5VaW50MTZCdWZmZXJBdHRyaWJ1dGU9Y2E7YS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZT1YO2EuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlPWhhO2EuVWludDhCdWZmZXJBdHRyaWJ1dGU9YWE7YS5JbnQ4QnVmZmVyQXR0cmlidXRlPVk7YS5CdWZmZXJBdHRyaWJ1dGU9ClQ7YS5BcmNDdXJ2ZT1oZjthLkNhdG11bGxSb21DdXJ2ZTM9cmM7YS5DdWJpY0JlemllckN1cnZlPVZjO2EuQ3ViaWNCZXppZXJDdXJ2ZTM9b2Q7YS5FbGxpcHNlQ3VydmU9RWM7YS5MaW5lQ3VydmU9QmM7YS5MaW5lQ3VydmUzPVdjO2EuUXVhZHJhdGljQmV6aWVyQ3VydmU9WGM7YS5RdWFkcmF0aWNCZXppZXJDdXJ2ZTM9cGQ7YS5TcGxpbmVDdXJ2ZT1ZYzthLlJFVklTSU9OPSIxMDQiO2EuTU9VU0U9e0xFRlQ6MCxNSURETEU6MSxSSUdIVDoyfTthLkN1bGxGYWNlTm9uZT0wO2EuQ3VsbEZhY2VCYWNrPTE7YS5DdWxsRmFjZUZyb250PTI7YS5DdWxsRmFjZUZyb250QmFjaz0zO2EuRnJvbnRGYWNlRGlyZWN0aW9uQ1c9MDthLkZyb250RmFjZURpcmVjdGlvbkNDVz0xO2EuQmFzaWNTaGFkb3dNYXA9MDthLlBDRlNoYWRvd01hcD0xO2EuUENGU29mdFNoYWRvd01hcD0yO2EuRnJvbnRTaWRlPTA7YS5CYWNrU2lkZT0xO2EuRG91YmxlU2lkZT0yO2EuRmxhdFNoYWRpbmc9MTthLlNtb290aFNoYWRpbmc9CjI7YS5Ob0NvbG9ycz0wO2EuRmFjZUNvbG9ycz0xO2EuVmVydGV4Q29sb3JzPTI7YS5Ob0JsZW5kaW5nPTA7YS5Ob3JtYWxCbGVuZGluZz0xO2EuQWRkaXRpdmVCbGVuZGluZz0yO2EuU3VidHJhY3RpdmVCbGVuZGluZz0zO2EuTXVsdGlwbHlCbGVuZGluZz00O2EuQ3VzdG9tQmxlbmRpbmc9NTthLkFkZEVxdWF0aW9uPTEwMDthLlN1YnRyYWN0RXF1YXRpb249MTAxO2EuUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb249MTAyO2EuTWluRXF1YXRpb249MTAzO2EuTWF4RXF1YXRpb249MTA0O2EuWmVyb0ZhY3Rvcj0yMDA7YS5PbmVGYWN0b3I9MjAxO2EuU3JjQ29sb3JGYWN0b3I9MjAyO2EuT25lTWludXNTcmNDb2xvckZhY3Rvcj0yMDM7YS5TcmNBbHBoYUZhY3Rvcj0yMDQ7YS5PbmVNaW51c1NyY0FscGhhRmFjdG9yPTIwNTthLkRzdEFscGhhRmFjdG9yPTIwNjthLk9uZU1pbnVzRHN0QWxwaGFGYWN0b3I9MjA3O2EuRHN0Q29sb3JGYWN0b3I9MjA4O2EuT25lTWludXNEc3RDb2xvckZhY3Rvcj0KMjA5O2EuU3JjQWxwaGFTYXR1cmF0ZUZhY3Rvcj0yMTA7YS5OZXZlckRlcHRoPTA7YS5BbHdheXNEZXB0aD0xO2EuTGVzc0RlcHRoPTI7YS5MZXNzRXF1YWxEZXB0aD0zO2EuRXF1YWxEZXB0aD00O2EuR3JlYXRlckVxdWFsRGVwdGg9NTthLkdyZWF0ZXJEZXB0aD02O2EuTm90RXF1YWxEZXB0aD03O2EuTXVsdGlwbHlPcGVyYXRpb249MDthLk1peE9wZXJhdGlvbj0xO2EuQWRkT3BlcmF0aW9uPTI7YS5Ob1RvbmVNYXBwaW5nPTA7YS5MaW5lYXJUb25lTWFwcGluZz0xO2EuUmVpbmhhcmRUb25lTWFwcGluZz0yO2EuVW5jaGFydGVkMlRvbmVNYXBwaW5nPTM7YS5DaW5lb25Ub25lTWFwcGluZz00O2EuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nPTU7YS5VVk1hcHBpbmc9MzAwO2EuQ3ViZVJlZmxlY3Rpb25NYXBwaW5nPTMwMTthLkN1YmVSZWZyYWN0aW9uTWFwcGluZz0zMDI7YS5FcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZz0zMDM7YS5FcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZz0KMzA0O2EuU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc9MzA1O2EuQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc9MzA2O2EuQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc9MzA3O2EuUmVwZWF0V3JhcHBpbmc9MUUzO2EuQ2xhbXBUb0VkZ2VXcmFwcGluZz0xMDAxO2EuTWlycm9yZWRSZXBlYXRXcmFwcGluZz0xMDAyO2EuTmVhcmVzdEZpbHRlcj0xMDAzO2EuTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI9MTAwNDthLk5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI9MTAwNTthLkxpbmVhckZpbHRlcj0xMDA2O2EuTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlcj0xMDA3O2EuTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyPTEwMDg7YS5VbnNpZ25lZEJ5dGVUeXBlPTEwMDk7YS5CeXRlVHlwZT0xMDEwO2EuU2hvcnRUeXBlPTEwMTE7YS5VbnNpZ25lZFNob3J0VHlwZT0xMDEyO2EuSW50VHlwZT0xMDEzO2EuVW5zaWduZWRJbnRUeXBlPTEwMTQ7YS5GbG9hdFR5cGU9MTAxNTthLkhhbGZGbG9hdFR5cGU9CjEwMTY7YS5VbnNpZ25lZFNob3J0NDQ0NFR5cGU9MTAxNzthLlVuc2lnbmVkU2hvcnQ1NTUxVHlwZT0xMDE4O2EuVW5zaWduZWRTaG9ydDU2NVR5cGU9MTAxOTthLlVuc2lnbmVkSW50MjQ4VHlwZT0xMDIwO2EuQWxwaGFGb3JtYXQ9MTAyMTthLlJHQkZvcm1hdD0xMDIyO2EuUkdCQUZvcm1hdD0xMDIzO2EuTHVtaW5hbmNlRm9ybWF0PTEwMjQ7YS5MdW1pbmFuY2VBbHBoYUZvcm1hdD0xMDI1O2EuUkdCRUZvcm1hdD0xMDIzO2EuRGVwdGhGb3JtYXQ9MTAyNjthLkRlcHRoU3RlbmNpbEZvcm1hdD0xMDI3O2EuUmVkRm9ybWF0PTEwMjg7YS5SR0JfUzNUQ19EWFQxX0Zvcm1hdD0zMzc3NjthLlJHQkFfUzNUQ19EWFQxX0Zvcm1hdD0zMzc3NzthLlJHQkFfUzNUQ19EWFQzX0Zvcm1hdD0zMzc3ODthLlJHQkFfUzNUQ19EWFQ1X0Zvcm1hdD0zMzc3OTthLlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQwO2EuUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQ9MzU4NDE7YS5SR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ9CjM1ODQyO2EuUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQzO2EuUkdCX0VUQzFfRm9ybWF0PTM2MTk2O2EuUkdCQV9BU1RDXzR4NF9Gb3JtYXQ9Mzc4MDg7YS5SR0JBX0FTVENfNXg0X0Zvcm1hdD0zNzgwOTthLlJHQkFfQVNUQ181eDVfRm9ybWF0PTM3ODEwO2EuUkdCQV9BU1RDXzZ4NV9Gb3JtYXQ9Mzc4MTE7YS5SR0JBX0FTVENfNng2X0Zvcm1hdD0zNzgxMjthLlJHQkFfQVNUQ184eDVfRm9ybWF0PTM3ODEzO2EuUkdCQV9BU1RDXzh4Nl9Gb3JtYXQ9Mzc4MTQ7YS5SR0JBX0FTVENfOHg4X0Zvcm1hdD0zNzgxNTthLlJHQkFfQVNUQ18xMHg1X0Zvcm1hdD0zNzgxNjthLlJHQkFfQVNUQ18xMHg2X0Zvcm1hdD0zNzgxNzthLlJHQkFfQVNUQ18xMHg4X0Zvcm1hdD0zNzgxODthLlJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ9Mzc4MTk7YS5SR0JBX0FTVENfMTJ4MTBfRm9ybWF0PTM3ODIwO2EuUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdD0zNzgyMTthLkxvb3BPbmNlPTIyMDA7YS5Mb29wUmVwZWF0PQoyMjAxO2EuTG9vcFBpbmdQb25nPTIyMDI7YS5JbnRlcnBvbGF0ZURpc2NyZXRlPTIzMDA7YS5JbnRlcnBvbGF0ZUxpbmVhcj0yMzAxO2EuSW50ZXJwb2xhdGVTbW9vdGg9MjMwMjthLlplcm9DdXJ2YXR1cmVFbmRpbmc9MjQwMDthLlplcm9TbG9wZUVuZGluZz0yNDAxO2EuV3JhcEFyb3VuZEVuZGluZz0yNDAyO2EuVHJpYW5nbGVzRHJhd01vZGU9MDthLlRyaWFuZ2xlU3RyaXBEcmF3TW9kZT0xO2EuVHJpYW5nbGVGYW5EcmF3TW9kZT0yO2EuTGluZWFyRW5jb2Rpbmc9M0UzO2Euc1JHQkVuY29kaW5nPTMwMDE7YS5HYW1tYUVuY29kaW5nPTMwMDc7YS5SR0JFRW5jb2Rpbmc9MzAwMjthLkxvZ0x1dkVuY29kaW5nPTMwMDM7YS5SR0JNN0VuY29kaW5nPTMwMDQ7YS5SR0JNMTZFbmNvZGluZz0zMDA1O2EuUkdCREVuY29kaW5nPTMwMDY7YS5CYXNpY0RlcHRoUGFja2luZz0zMjAwO2EuUkdCQURlcHRoUGFja2luZz0zMjAxO2EuVGFuZ2VudFNwYWNlTm9ybWFsTWFwPTA7YS5PYmplY3RTcGFjZU5vcm1hbE1hcD0KMTthLkZhY2U0PWZ1bmN0aW9uKGIsZSxoLG4sdSx3LHope2NvbnNvbGUud2FybigiVEhSRUUuRmFjZTQgaGFzIGJlZW4gcmVtb3ZlZC4gQSBUSFJFRS5GYWNlMyB3aWxsIGJlIGNyZWF0ZWQgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IEwoYixlLGgsdSx3LHopfTthLkxpbmVTdHJpcD0wO2EuTGluZVBpZWNlcz0xO2EuTWVzaEZhY2VNYXRlcmlhbD1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1lc2hGYWNlTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7cmV0dXJuIGJ9O2EuTXVsdGlNYXRlcmlhbD1mdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoYj1bXSk7Y29uc29sZS53YXJuKCJUSFJFRS5NdWx0aU1hdGVyaWFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLiIpO2IuaXNNdWx0aU1hdGVyaWFsPSEwO2IubWF0ZXJpYWxzPWI7Yi5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBiLnNsaWNlKCl9O3JldHVybiBifTthLlBvaW50Q2xvdWQ9CmZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgUmUoYixlKX07YS5QYXJ0aWNsZT1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU3ByaXRlLiIpO3JldHVybiBuZXcgU2YoYil9O2EuUGFydGljbGVTeXN0ZW09ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgUmUoYixlKX07YS5Qb2ludENsb3VkTWF0ZXJpYWw9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IFNjKGIpfTthLlBhcnRpY2xlQmFzaWNNYXRlcmlhbD1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLiIpOwpyZXR1cm4gbmV3IFNjKGIpfTthLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuIik7cmV0dXJuIG5ldyBTYyhiKX07YS5WZXJ0ZXg9ZnVuY3Rpb24oYixlLGgpe2NvbnNvbGUud2FybigiVEhSRUUuVmVydGV4IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5WZWN0b3IzIGluc3RlYWQuIik7cmV0dXJuIG5ldyBnKGIsZSxoKX07YS5EeW5hbWljQnVmZmVyQXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBUKGIsZSkpLnNldER5bmFtaWMoITApfTthLkludDhBdHRyaWJ1dGU9ZnVuY3Rpb24oYiwKZSl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBZKGIsZSl9O2EuVWludDhBdHRyaWJ1dGU9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgYWEoYixlKX07YS5VaW50OENsYW1wZWRBdHRyaWJ1dGU9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBoYShiLGUpfTthLkludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTsKcmV0dXJuIG5ldyBYKGIsZSl9O2EuVWludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgY2EoYixlKX07YS5JbnQzMkF0dHJpYnV0ZT1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBlYShiLGUpfTthLlVpbnQzMkF0dHJpYnV0ZT1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGthKGIsZSl9O2EuRmxvYXQzMkF0dHJpYnV0ZT1mdW5jdGlvbihiLAplKXtjb25zb2xlLndhcm4oIlRIUkVFLkZsb2F0MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGJhKGIsZSl9O2EuRmxvYXQ2NEF0dHJpYnV0ZT1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuRmxvYXQ2NEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgbGEoYixlKX07YS5DbG9zZWRTcGxpbmVDdXJ2ZTM9Umw7YS5TcGxpbmVDdXJ2ZTM9U2w7YS5TcGxpbmU9Y2o7YS5BeGlzSGVscGVyPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQXhpc0hlbHBlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkF4ZXNIZWxwZXIuIik7cmV0dXJuIG5ldyBFZyhiKX07YS5Cb3VuZGluZ0JveEhlbHBlcj1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuQm91bmRpbmdCb3hIZWxwZXIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gQ3JlYXRpbmcgYSBUSFJFRS5Cb3hIZWxwZXIgaW5zdGVhZC4iKTsKcmV0dXJuIG5ldyBCZChiLGUpfTthLkVkZ2VzSGVscGVyPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5FZGdlc0hlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRWRnZXNHZW9tZXRyeSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgUGIobmV3IGNmKGIuZ2VvbWV0cnkpLG5ldyBMYih7Y29sb3I6dm9pZCAwIT09ZT9lOjE2Nzc3MjE1fSkpfTthLldpcmVmcmFtZUhlbHBlcj1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuV2lyZWZyYW1lSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgUGIobmV3IFRlKGIuZ2VvbWV0cnkpLG5ldyBMYih7Y29sb3I6dm9pZCAwIT09ZT9lOjE2Nzc3MjE1fSkpfTthLlhIUkxvYWRlcj1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuIik7cmV0dXJuIG5ldyBVYyhiKX07CmEuQmluYXJ5VGV4dHVyZUxvYWRlcj1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4iKTtyZXR1cm4gbmV3IEVpKGIpfTthLkdlb21ldHJ5VXRpbHM9e21lcmdlOmZ1bmN0aW9uKGIsZSxoKXtjb25zb2xlLndhcm4oIlRIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4iKTtpZihlLmlzTWVzaCl7ZS5tYXRyaXhBdXRvVXBkYXRlJiZlLnVwZGF0ZU1hdHJpeCgpO3ZhciBuPWUubWF0cml4O2U9ZS5nZW9tZXRyeX1iLm1lcmdlKGUsbixoKX0sY2VudGVyOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4iKTsKcmV0dXJuIGIuY2VudGVyKCl9fTthLlByb2plY3Rvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb2plY3RvciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL1Byb2plY3Rvci5qcy4iKTt0aGlzLnByb2plY3RWZWN0b3I9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlByb2plY3RvcjogLnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnByb2plY3QoKS4iKTtiLnByb2plY3QoZSl9O3RoaXMudW5wcm9qZWN0VmVjdG9yPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5Qcm9qZWN0b3I6IC51bnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnVucHJvamVjdCgpLiIpO2IudW5wcm9qZWN0KGUpfTt0aGlzLnBpY2tpbmdSYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9qZWN0b3I6IC5waWNraW5nUmF5KCkgaXMgbm93IHJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKCkuIil9fTthLkNhbnZhc1JlbmRlcmVyPQpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkNhbnZhc1JlbmRlcmVyIGhhcyBiZWVuIHJlbW92ZWQiKX07YS5KU09OTG9hZGVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuSlNPTkxvYWRlciBoYXMgYmVlbiByZW1vdmVkLiIpfTthLlNjZW5lVXRpbHM9e2NyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9LGRldGFjaDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMiKX0sYXR0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfX07YS5MZW5zRmxhcmU9CmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTGVuc0ZsYXJlIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy9vYmplY3RzL0xlbnNmbGFyZS5qcyIpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1pbXBvcnRzL09yYml0Q29udHJvbHMuanMKVEhSRUUuT3JiaXRDb250cm9scz1mdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoKXtyZXR1cm4gMipNYXRoLlBJLzYwLzYwKlguYXV0b1JvdGF0ZVNwZWVkfWZ1bmN0aW9uIGYoKXtyZXR1cm4gTWF0aC5wb3coLjk1LFguem9vbVNwZWVkKX1mdW5jdGlvbiBnKEFhKXt4YS50aGV0YS09QWF9ZnVuY3Rpb24gbChBYSl7eGEucGhpLT1BYX1mdW5jdGlvbiBrKEFhKXtYLm9iamVjdC5pc1BlcnNwZWN0aXZlQ2FtZXJhP3phLz1BYTpYLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8oWC5vYmplY3Quem9vbT1NYXRoLm1heChYLm1pblpvb20sTWF0aC5taW4oWC5tYXhab29tLFgub2JqZWN0Lnpvb20qQWEpKSxYLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksU2E9ITApOihjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuIiksWC5lbmFibGVab29tPSExKX1mdW5jdGlvbiBtKEFhKXtYLm9iamVjdC5pc1BlcnNwZWN0aXZlQ2FtZXJhPwp6YSo9QWE6WC5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KFgub2JqZWN0Lnpvb209TWF0aC5tYXgoWC5taW5ab29tLE1hdGgubWluKFgubWF4Wm9vbSxYLm9iamVjdC56b29tL0FhKSksWC5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLFNhPSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLFguZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gcChBYSl7RWEuc2V0KEFhLmNsaWVudFgsQWEuY2xpZW50WSl9ZnVuY3Rpb24gcShBYSl7dGIuc2V0KEFhLmNsaWVudFgsQWEuY2xpZW50WSl9ZnVuY3Rpb24gcihBYSl7eGIuc2V0KEFhLmNsaWVudFgsQWEuY2xpZW50WSl9ZnVuY3Rpb24gdChBYSl7R2Euc2V0KEFhLmNsaWVudFgsQWEuY2xpZW50WSk7ZGIuc3ViVmVjdG9ycyhHYSxFYSkubXVsdGlwbHlTY2FsYXIoWC5yb3RhdGVTcGVlZCk7QWE9ClguZG9tRWxlbWVudD09PWRvY3VtZW50P1guZG9tRWxlbWVudC5ib2R5OlguZG9tRWxlbWVudDtnKDIqTWF0aC5QSSpkYi54L0FhLmNsaWVudEhlaWdodCk7bCgyKk1hdGguUEkqZGIueS9BYS5jbGllbnRIZWlnaHQpO0VhLmNvcHkoR2EpO1gudXBkYXRlKCl9ZnVuY3Rpb24gdihBYSl7Q2Muc2V0KEFhLmNsaWVudFgsQWEuY2xpZW50WSk7WmIuc3ViVmVjdG9ycyhDYyx0Yik7MDxaYi55P2soZigpKTowPlpiLnkmJm0oZigpKTt0Yi5jb3B5KENjKTtYLnVwZGF0ZSgpfWZ1bmN0aW9uIEEoQWEpe0NiLnNldChBYS5jbGllbnRYLEFhLmNsaWVudFkpO3liLnN1YlZlY3RvcnMoQ2IseGIpLm11bHRpcGx5U2NhbGFyKFgucGFuU3BlZWQpO2ZjKHliLngseWIueSk7eGIuY29weShDYik7WC51cGRhdGUoKX1mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIHgoQWEpezA+QWEuZGVsdGFZP20oZigpKTowPEFhLmRlbHRhWSYmayhmKCkpO1gudXBkYXRlKCl9ZnVuY3Rpb24gQyhBYSl7dmFyIE1iPSExO3N3aXRjaChBYS5rZXlDb2RlKXtjYXNlIFgua2V5cy5VUDpmYygwLApYLmtleVBhblNwZWVkKTtNYj0hMDticmVhaztjYXNlIFgua2V5cy5CT1RUT006ZmMoMCwtWC5rZXlQYW5TcGVlZCk7TWI9ITA7YnJlYWs7Y2FzZSBYLmtleXMuTEVGVDpmYyhYLmtleVBhblNwZWVkLDApO01iPSEwO2JyZWFrO2Nhc2UgWC5rZXlzLlJJR0hUOmZjKC1YLmtleVBhblNwZWVkLDApLE1iPSEwfU1iJiYoQWEucHJldmVudERlZmF1bHQoKSxYLnVwZGF0ZSgpKX1mdW5jdGlvbiBGKEFhKXtFYS5zZXQoQWEudG91Y2hlc1swXS5wYWdlWCxBYS50b3VjaGVzWzBdLnBhZ2VZKX1mdW5jdGlvbiBEKEFhKXtpZihYLmVuYWJsZVpvb20pe3ZhciBNYj1BYS50b3VjaGVzWzBdLnBhZ2VYLUFhLnRvdWNoZXNbMV0ucGFnZVgsamM9QWEudG91Y2hlc1swXS5wYWdlWS1BYS50b3VjaGVzWzFdLnBhZ2VZO3RiLnNldCgwLE1hdGguc3FydChNYipNYitqYypqYykpfVguZW5hYmxlUGFuJiZ4Yi5zZXQoLjUqKEFhLnRvdWNoZXNbMF0ucGFnZVgrQWEudG91Y2hlc1sxXS5wYWdlWCksLjUqKEFhLnRvdWNoZXNbMF0ucGFnZVkrCkFhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBCKEFhKXtHYS5zZXQoQWEudG91Y2hlc1swXS5wYWdlWCxBYS50b3VjaGVzWzBdLnBhZ2VZKTtkYi5zdWJWZWN0b3JzKEdhLEVhKS5tdWx0aXBseVNjYWxhcihYLnJvdGF0ZVNwZWVkKTtBYT1YLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9YLmRvbUVsZW1lbnQuYm9keTpYLmRvbUVsZW1lbnQ7ZygyKk1hdGguUEkqZGIueC9BYS5jbGllbnRIZWlnaHQpO2woMipNYXRoLlBJKmRiLnkvQWEuY2xpZW50SGVpZ2h0KTtFYS5jb3B5KEdhKTtYLnVwZGF0ZSgpfWZ1bmN0aW9uIEcoQWEpe2lmKFguZW5hYmxlWm9vbSl7dmFyIE1iPUFhLnRvdWNoZXNbMF0ucGFnZVgtQWEudG91Y2hlc1sxXS5wYWdlWCxqYz1BYS50b3VjaGVzWzBdLnBhZ2VZLUFhLnRvdWNoZXNbMV0ucGFnZVk7Q2Muc2V0KDAsTWF0aC5zcXJ0KE1iKk1iK2pjKmpjKSk7WmIuc2V0KDAsTWF0aC5wb3coQ2MueS90Yi55LFguem9vbVNwZWVkKSk7ayhaYi55KTt0Yi5jb3B5KENjKX1YLmVuYWJsZVBhbiYmCihDYi5zZXQoLjUqKEFhLnRvdWNoZXNbMF0ucGFnZVgrQWEudG91Y2hlc1sxXS5wYWdlWCksLjUqKEFhLnRvdWNoZXNbMF0ucGFnZVkrQWEudG91Y2hlc1sxXS5wYWdlWSkpLHliLnN1YlZlY3RvcnMoQ2IseGIpLm11bHRpcGx5U2NhbGFyKFgucGFuU3BlZWQpLGZjKHliLngseWIueSkseGIuY29weShDYikpO1gudXBkYXRlKCl9ZnVuY3Rpb24gSygpe31mdW5jdGlvbiBMKEFhKXtpZighMSE9PVguZW5hYmxlZCl7QWEucHJldmVudERlZmF1bHQoKTtYLmRvbUVsZW1lbnQuZm9jdXM/WC5kb21FbGVtZW50LmZvY3VzKCk6d2luZG93LmZvY3VzKCk7c3dpdGNoKEFhLmJ1dHRvbil7Y2FzZSBYLm1vdXNlQnV0dG9ucy5MRUZUOmlmKEFhLmN0cmxLZXl8fEFhLm1ldGFLZXl8fEFhLnNoaWZ0S2V5KXtpZighMT09PVguZW5hYmxlUGFuKXJldHVybjtyKEFhKTtsYT1iYS5QQU59ZWxzZXtpZighMT09PVguZW5hYmxlUm90YXRlKXJldHVybjtwKEFhKTtsYT1iYS5ST1RBVEV9YnJlYWs7Y2FzZSBYLm1vdXNlQnV0dG9ucy5NSURETEU6aWYoITE9PT0KWC5lbmFibGVab29tKXJldHVybjtxKEFhKTtsYT1iYS5ET0xMWTticmVhaztjYXNlIFgubW91c2VCdXR0b25zLlJJR0hUOmlmKCExPT09WC5lbmFibGVQYW4pcmV0dXJuO3IoQWEpO2xhPWJhLlBBTn1sYSE9PWJhLk5PTkUmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEosITEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLFAsITEpLFguZGlzcGF0Y2hFdmVudChlYSkpfX1mdW5jdGlvbiBKKEFhKXtpZighMSE9PVguZW5hYmxlZClzd2l0Y2goQWEucHJldmVudERlZmF1bHQoKSxsYSl7Y2FzZSBiYS5ST1RBVEU6aWYoITE9PT1YLmVuYWJsZVJvdGF0ZSlicmVhazt0KEFhKTticmVhaztjYXNlIGJhLkRPTExZOmlmKCExPT09WC5lbmFibGVab29tKWJyZWFrO3YoQWEpO2JyZWFrO2Nhc2UgYmEuUEFOOiExIT09WC5lbmFibGVQYW4mJkEoQWEpfX1mdW5jdGlvbiBQKEFhKXshMSE9PVguZW5hYmxlZCYmKHkoQWEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsCkosITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLFAsITEpLFguZGlzcGF0Y2hFdmVudChrYSksbGE9YmEuTk9ORSl9ZnVuY3Rpb24gUyhBYSl7ITE9PT1YLmVuYWJsZWR8fCExPT09WC5lbmFibGVab29tfHxsYSE9PWJhLk5PTkUmJmxhIT09YmEuUk9UQVRFfHwoQWEucHJldmVudERlZmF1bHQoKSxBYS5zdG9wUHJvcGFnYXRpb24oKSxYLmRpc3BhdGNoRXZlbnQoZWEpLHgoQWEpLFguZGlzcGF0Y2hFdmVudChrYSkpfWZ1bmN0aW9uIE4oQWEpeyExIT09WC5lbmFibGVkJiYhMSE9PVguZW5hYmxlS2V5cyYmITEhPT1YLmVuYWJsZVBhbiYmQyhBYSl9ZnVuY3Rpb24gVChBYSl7aWYoITEhPT1YLmVuYWJsZWQpe0FhLnByZXZlbnREZWZhdWx0KCk7c3dpdGNoKEFhLnRvdWNoZXMubGVuZ3RoKXtjYXNlIDE6aWYoITE9PT1YLmVuYWJsZVJvdGF0ZSlyZXR1cm47RihBYSk7bGE9YmEuVE9VQ0hfUk9UQVRFO2JyZWFrO2Nhc2UgMjppZighMT09PVguZW5hYmxlWm9vbSYmCiExPT09WC5lbmFibGVQYW4pcmV0dXJuO0QoQWEpO2xhPWJhLlRPVUNIX0RPTExZX1BBTjticmVhaztkZWZhdWx0OmxhPWJhLk5PTkV9bGEhPT1iYS5OT05FJiZYLmRpc3BhdGNoRXZlbnQoZWEpfX1mdW5jdGlvbiBZKEFhKXtpZighMSE9PVguZW5hYmxlZClzd2l0Y2goQWEucHJldmVudERlZmF1bHQoKSxBYS5zdG9wUHJvcGFnYXRpb24oKSxBYS50b3VjaGVzLmxlbmd0aCl7Y2FzZSAxOmlmKCExPT09WC5lbmFibGVSb3RhdGUpYnJlYWs7aWYobGEhPT1iYS5UT1VDSF9ST1RBVEUpYnJlYWs7QihBYSk7YnJlYWs7Y2FzZSAyOmlmKCExPT09WC5lbmFibGVab29tJiYhMT09PVguZW5hYmxlUGFuKWJyZWFrO2lmKGxhIT09YmEuVE9VQ0hfRE9MTFlfUEFOKWJyZWFrO0coQWEpO2JyZWFrO2RlZmF1bHQ6bGE9YmEuTk9ORX19ZnVuY3Rpb24gYWEoQWEpeyExIT09WC5lbmFibGVkJiYoSyhBYSksWC5kaXNwYXRjaEV2ZW50KGthKSxsYT1iYS5OT05FKX1mdW5jdGlvbiBoYShBYSl7ITEhPT1YLmVuYWJsZWQmJgpBYS5wcmV2ZW50RGVmYXVsdCgpfXRoaXMub2JqZWN0PWE7dGhpcy5kb21FbGVtZW50PXZvaWQgMCE9PWM/Yzpkb2N1bWVudDt0aGlzLmVuYWJsZWQ9ITA7dGhpcy50YXJnZXQ9bmV3IFRIUkVFLlZlY3RvcjM7dGhpcy5taW5EaXN0YW5jZT0wO3RoaXMubWF4RGlzdGFuY2U9SW5maW5pdHk7dGhpcy5taW5ab29tPTA7dGhpcy5tYXhab29tPUluZmluaXR5O3RoaXMubWluUG9sYXJBbmdsZT0wO3RoaXMubWF4UG9sYXJBbmdsZT1NYXRoLlBJO3RoaXMubWluQXppbXV0aEFuZ2xlPS1JbmZpbml0eTt0aGlzLm1heEF6aW11dGhBbmdsZT1JbmZpbml0eTt0aGlzLmVuYWJsZURhbXBpbmc9ITE7dGhpcy5kYW1waW5nRmFjdG9yPS4yNTt0aGlzLmVuYWJsZVpvb209ITA7dGhpcy56b29tU3BlZWQ9MTt0aGlzLmVuYWJsZVJvdGF0ZT0hMDt0aGlzLnJvdGF0ZVNwZWVkPTE7dGhpcy5lbmFibGVQYW49ITA7dGhpcy5wYW5TcGVlZD0xO3RoaXMuc2NyZWVuU3BhY2VQYW5uaW5nPSExO3RoaXMua2V5UGFuU3BlZWQ9Cjc7dGhpcy5hdXRvUm90YXRlPSExO3RoaXMuYXV0b1JvdGF0ZVNwZWVkPTI7dGhpcy5lbmFibGVLZXlzPSEwO3RoaXMua2V5cz17TEVGVDozNyxVUDozOCxSSUdIVDozOSxCT1RUT006NDB9O3RoaXMubW91c2VCdXR0b25zPXtMRUZUOlRIUkVFLk1PVVNFLkxFRlQsTUlERExFOlRIUkVFLk1PVVNFLk1JRERMRSxSSUdIVDpUSFJFRS5NT1VTRS5SSUdIVH07dGhpcy50YXJnZXQwPXRoaXMudGFyZ2V0LmNsb25lKCk7dGhpcy5wb3NpdGlvbjA9dGhpcy5vYmplY3QucG9zaXRpb24uY2xvbmUoKTt0aGlzLnpvb20wPXRoaXMub2JqZWN0Lnpvb207dGhpcy5nZXRQb2xhckFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIENhLnBoaX07dGhpcy5nZXRBemltdXRoYWxBbmdsZT1mdW5jdGlvbigpe3JldHVybiBDYS50aGV0YX07dGhpcy5zYXZlU3RhdGU9ZnVuY3Rpb24oKXtYLnRhcmdldDAuY29weShYLnRhcmdldCk7WC5wb3NpdGlvbjAuY29weShYLm9iamVjdC5wb3NpdGlvbik7WC56b29tMD1YLm9iamVjdC56b29tfTsKdGhpcy5yZXNldD1mdW5jdGlvbigpe1gudGFyZ2V0LmNvcHkoWC50YXJnZXQwKTtYLm9iamVjdC5wb3NpdGlvbi5jb3B5KFgucG9zaXRpb24wKTtYLm9iamVjdC56b29tPVguem9vbTA7WC5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1guZGlzcGF0Y2hFdmVudChjYSk7WC51cGRhdGUoKTtsYT1iYS5OT05FfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBBYT1uZXcgVEhSRUUuVmVjdG9yMyxNYj0obmV3IFRIUkVFLlF1YXRlcm5pb24pLnNldEZyb21Vbml0VmVjdG9ycyhhLnVwLG5ldyBUSFJFRS5WZWN0b3IzKDAsMSwwKSksamM9TWIuY2xvbmUoKS5pbnZlcnNlKCksdGQ9bmV3IFRIUkVFLlZlY3RvcjMsTmQ9bmV3IFRIUkVFLlF1YXRlcm5pb247cmV0dXJuIGZ1bmN0aW9uKCl7dmFyICRnPVgub2JqZWN0LnBvc2l0aW9uO0FhLmNvcHkoJGcpLnN1YihYLnRhcmdldCk7QWEuYXBwbHlRdWF0ZXJuaW9uKE1iKTtDYS5zZXRGcm9tVmVjdG9yMyhBYSk7WC5hdXRvUm90YXRlJiYKbGE9PT1iYS5OT05FJiZnKGQoKSk7Q2EudGhldGErPXhhLnRoZXRhO0NhLnBoaSs9eGEucGhpO0NhLnRoZXRhPU1hdGgubWF4KFgubWluQXppbXV0aEFuZ2xlLE1hdGgubWluKFgubWF4QXppbXV0aEFuZ2xlLENhLnRoZXRhKSk7Q2EucGhpPU1hdGgubWF4KFgubWluUG9sYXJBbmdsZSxNYXRoLm1pbihYLm1heFBvbGFyQW5nbGUsQ2EucGhpKSk7Q2EubWFrZVNhZmUoKTtDYS5yYWRpdXMqPXphO0NhLnJhZGl1cz1NYXRoLm1heChYLm1pbkRpc3RhbmNlLE1hdGgubWluKFgubWF4RGlzdGFuY2UsQ2EucmFkaXVzKSk7WC50YXJnZXQuYWRkKEZhKTtBYS5zZXRGcm9tU3BoZXJpY2FsKENhKTtBYS5hcHBseVF1YXRlcm5pb24oamMpOyRnLmNvcHkoWC50YXJnZXQpLmFkZChBYSk7WC5vYmplY3QubG9va0F0KFgudGFyZ2V0KTshMD09PVguZW5hYmxlRGFtcGluZz8oeGEudGhldGEqPTEtWC5kYW1waW5nRmFjdG9yLHhhLnBoaSo9MS1YLmRhbXBpbmdGYWN0b3IsRmEubXVsdGlwbHlTY2FsYXIoMS0KWC5kYW1waW5nRmFjdG9yKSk6KHhhLnNldCgwLDAsMCksRmEuc2V0KDAsMCwwKSk7emE9MTtyZXR1cm4gU2F8fHRkLmRpc3RhbmNlVG9TcXVhcmVkKFgub2JqZWN0LnBvc2l0aW9uKT53YXx8OCooMS1OZC5kb3QoWC5vYmplY3QucXVhdGVybmlvbikpPndhPyhYLmRpc3BhdGNoRXZlbnQoY2EpLHRkLmNvcHkoWC5vYmplY3QucG9zaXRpb24pLE5kLmNvcHkoWC5vYmplY3QucXVhdGVybmlvbiksU2E9ITEsITApOiExfX0oKTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXtYLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGhhLCExKTtYLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixMLCExKTtYLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLFMsITEpO1guZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixULCExKTtYLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLAphYSwhMSk7WC5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsWSwhMSk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixKLCExKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIixQLCExKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsTiwhMSl9O3ZhciBYPXRoaXMsY2E9e3R5cGU6ImNoYW5nZSJ9LGVhPXt0eXBlOiJzdGFydCJ9LGthPXt0eXBlOiJlbmQifSxiYT17Tk9ORTotMSxST1RBVEU6MCxET0xMWToxLFBBTjoyLFRPVUNIX1JPVEFURTozLFRPVUNIX0RPTExZX1BBTjo0fSxsYT1iYS5OT05FLHdhPTFFLTYsQ2E9bmV3IFRIUkVFLlNwaGVyaWNhbCx4YT1uZXcgVEhSRUUuU3BoZXJpY2FsLHphPTEsRmE9bmV3IFRIUkVFLlZlY3RvcjMsU2E9ITEsRWE9bmV3IFRIUkVFLlZlY3RvcjIsR2E9bmV3IFRIUkVFLlZlY3RvcjIsZGI9bmV3IFRIUkVFLlZlY3RvcjIseGI9bmV3IFRIUkVFLlZlY3RvcjIsCkNiPW5ldyBUSFJFRS5WZWN0b3IyLHliPW5ldyBUSFJFRS5WZWN0b3IyLHRiPW5ldyBUSFJFRS5WZWN0b3IyLENjPW5ldyBUSFJFRS5WZWN0b3IyLFpiPW5ldyBUSFJFRS5WZWN0b3IyLGhkPWZ1bmN0aW9uKCl7dmFyIEFhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbihNYixqYyl7QWEuc2V0RnJvbU1hdHJpeENvbHVtbihqYywwKTtBYS5tdWx0aXBseVNjYWxhcigtTWIpO0ZhLmFkZChBYSl9fSgpLCRiPWZ1bmN0aW9uKCl7dmFyIEFhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbihNYixqYyl7ITA9PT1YLnNjcmVlblNwYWNlUGFubmluZz9BYS5zZXRGcm9tTWF0cml4Q29sdW1uKGpjLDEpOihBYS5zZXRGcm9tTWF0cml4Q29sdW1uKGpjLDApLEFhLmNyb3NzVmVjdG9ycyhYLm9iamVjdC51cCxBYSkpO0FhLm11bHRpcGx5U2NhbGFyKE1iKTtGYS5hZGQoQWEpfX0oKSxmYz1mdW5jdGlvbigpe3ZhciBBYT1uZXcgVEhSRUUuVmVjdG9yMztyZXR1cm4gZnVuY3Rpb24oTWIsCmpjKXt2YXIgdGQ9WC5kb21FbGVtZW50PT09ZG9jdW1lbnQ/WC5kb21FbGVtZW50LmJvZHk6WC5kb21FbGVtZW50O2lmKFgub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmEpe0FhLmNvcHkoWC5vYmplY3QucG9zaXRpb24pLnN1YihYLnRhcmdldCk7dmFyIE5kPUFhLmxlbmd0aCgpO05kKj1NYXRoLnRhbihYLm9iamVjdC5mb3YvMipNYXRoLlBJLzE4MCk7aGQoMipNYipOZC90ZC5jbGllbnRIZWlnaHQsWC5vYmplY3QubWF0cml4KTskYigyKmpjKk5kL3RkLmNsaWVudEhlaWdodCxYLm9iamVjdC5tYXRyaXgpfWVsc2UgWC5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KGhkKE1iKihYLm9iamVjdC5yaWdodC1YLm9iamVjdC5sZWZ0KS9YLm9iamVjdC56b29tL3RkLmNsaWVudFdpZHRoLFgub2JqZWN0Lm1hdHJpeCksJGIoamMqKFgub2JqZWN0LnRvcC1YLm9iamVjdC5ib3R0b20pL1gub2JqZWN0Lnpvb20vdGQuY2xpZW50SGVpZ2h0LFgub2JqZWN0Lm1hdHJpeCkpOihjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIHBhbiBkaXNhYmxlZC4iKSwKWC5lbmFibGVQYW49ITEpfX0oKTtYLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGhhLCExKTtYLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixMLCExKTtYLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLFMsITEpO1guZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixULCExKTtYLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLGFhLCExKTtYLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixZLCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsTiwhMSk7dGhpcy51cGRhdGUoKX07VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1USFJFRS5PcmJpdENvbnRyb2xzOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZSx7Y2VudGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9yYml0Q29udHJvbHM6IC5jZW50ZXIgaGFzIGJlZW4gcmVuYW1lZCB0byAudGFyZ2V0Iik7cmV0dXJuIHRoaXMudGFyZ2V0fX0sbm9ab29tOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9yYml0Q29udHJvbHM6IC5ub1pvb20gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVab29tIGluc3RlYWQuIik7cmV0dXJuIXRoaXMuZW5hYmxlWm9vbX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT3JiaXRDb250cm9sczogLm5vWm9vbSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVpvb20gaW5zdGVhZC4iKTt0aGlzLmVuYWJsZVpvb209IWF9fSxub1JvdGF0ZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4iKTsKcmV0dXJuIXRoaXMuZW5hYmxlUm90YXRlfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5PcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4iKTt0aGlzLmVuYWJsZVJvdGF0ZT0hYX19LG5vUGFuOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLiIpO3JldHVybiF0aGlzLmVuYWJsZVBhbn0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT3JiaXRDb250cm9sczogLm5vUGFuIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlUGFuIGluc3RlYWQuIik7dGhpcy5lbmFibGVQYW49IWF9fSxub0tleXM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT3JiaXRDb250cm9sczogLm5vS2V5cyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZUtleXMgaW5zdGVhZC4iKTsKcmV0dXJuIXRoaXMuZW5hYmxlS2V5c30sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT3JiaXRDb250cm9sczogLm5vS2V5cyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZUtleXMgaW5zdGVhZC4iKTt0aGlzLmVuYWJsZUtleXM9IWF9fSxzdGF0aWNNb3Zpbmc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT3JiaXRDb250cm9sczogLnN0YXRpY01vdmluZyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZURhbXBpbmcgaW5zdGVhZC4iKTtyZXR1cm4hdGhpcy5lbmFibGVEYW1waW5nfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5PcmJpdENvbnRyb2xzOiAuc3RhdGljTW92aW5nIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlRGFtcGluZyBpbnN0ZWFkLiIpO3RoaXMuZW5hYmxlRGFtcGluZz0hYX19LGR5bmFtaWNEYW1waW5nRmFjdG9yOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9yYml0Q29udHJvbHM6IC5keW5hbWljRGFtcGluZ0ZhY3RvciBoYXMgYmVlbiByZW5hbWVkLiBVc2UgLmRhbXBpbmdGYWN0b3IgaW5zdGVhZC4iKTsKcmV0dXJuIHRoaXMuZGFtcGluZ0ZhY3Rvcn0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT3JiaXRDb250cm9sczogLmR5bmFtaWNEYW1waW5nRmFjdG9yIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSAuZGFtcGluZ0ZhY3RvciBpbnN0ZWFkLiIpO3RoaXMuZGFtcGluZ0ZhY3Rvcj1hfX19KTsKPC9zY3JpcHQ+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZmFjZXRzLWRpdmUvbGliL3Nwcml0ZS1hdGxhcy5qcwpjbGFzcyBYbSBleHRlbmRzIFRIUkVFLlRleHR1cmV7Y29uc3RydWN0b3IoYSxjLGQpe2NvbnN0IGY9TWF0aC5jZWlsKE1hdGguc3FydChhKSksZz1NYXRoLmNlaWwoYS9mKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2wud2lkdGg9YypmO2wuaGVpZ2h0PWQqZztjb25zdCBrPWwuZ2V0Q29udGV4dCgiMmQiKTtzdXBlcihsKTt0aGlzLmNhcGFjaXR5PWE7dGhpcy5pbWFnZVdpZHRoPWM7dGhpcy5pbWFnZUhlaWdodD1kO3RoaXMuc3ByaXRlQ29sdW1ucz1mO3RoaXMuc3ByaXRlUm93cz1nO3RoaXMuY2FudmFzPWw7dGhpcy5jb250ZXh0PWs7dGhpcy5tYWdGaWx0ZXI9dGhpcy5taW5GaWx0ZXI9VEhSRUUuTGluZWFyRmlsdGVyO3RoaXMuZHJhd1RpbWVvdXQ9NTA7dGhpcy53YWl0VGltZW91dD0xO3RoaXMuZHJhd1F1ZXVlPVtdO3RoaXMuaXNEcmF3UXVldWVkPSExO3RoaXMubGFzdENsZWFyVGltZXN0YW1wPTA7dGhpcy5jYWxsYmFja1F1ZXVlPVtdO3RoaXMucGVuZGluZ0ltYWdlQ291bnQ9CjA7dGhpcy5maXR0ZXI9bmV3IFdtKHt4Oi4xMjUqYyx5Oi4xMjUqZCx3aWR0aDouNzUqYyxoZWlnaHQ6Ljc1KmR9KX1jbGVhclF1ZXVlcygpe3RoaXMuZHJhd1F1ZXVlPVtdO3RoaXMuY2FsbGJhY2tRdWV1ZT1bXTt0aGlzLnBlbmRpbmdJbWFnZUNvdW50PTA7cmV0dXJuIHRoaXMubGFzdENsZWFyVGltZXN0YW1wPURhdGUubm93KCl9c2V0U3ByaXRlSW1hZ2VEYXRhKGEsYyxkKXt0aGlzLmRyYXdRdWV1ZS5wdXNoKHtzcHJpdGVJbmRleDphLHRpbWVzdGFtcDpEYXRlLm5vdygpLGltYWdlRGF0YTpjLGNhbGxiYWNrOmR9KTt0aGlzLnF1ZXVlRHJhdygpfXNldEF0bGFzVXJsKGEsYyxkKXtjb25zdCBmPXRoaXMuY2xlYXJRdWV1ZXMoKSxnPW5ldyBJbWFnZTt2b2lkIDAhPT1jJiYoZy5jcm9zc09yaWdpbj1jKTt0aGlzLnBlbmRpbmdJbWFnZUNvdW50Kys7Zy5vbmVycm9yPSgpPT57dGhpcy5sYXN0Q2xlYXJUaW1lc3RhbXA+Znx8dGhpcy5wZW5kaW5nSW1hZ2VDb3VudC0tfTtnLm9ubG9hZD0KKCk9PntpZighKHRoaXMubGFzdENsZWFyVGltZXN0YW1wPmYpJiYodGhpcy5wZW5kaW5nSW1hZ2VDb3VudC0tLHRoaXMudXBkYXRlUHJvcGVydGllc1RvTWF0Y2hJbWFnZURpbWVuc2lvbnMoZy53aWR0aCxnLmhlaWdodCksdGhpcy5jb250ZXh0LmRyYXdJbWFnZShnLDAsMCx0aGlzLmNhbnZhcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQpLHRoaXMubmVlZHNVcGRhdGU9ITAsZCYmdGhpcy5jYWxsYmFja1F1ZXVlLnB1c2goe2NhbGxiYWNrOmQsYXJnczpbZ119KSx0aGlzLm9uRHJhd0ZpbmlzaGVkKSl0aGlzLm9uRHJhd0ZpbmlzaGVkKCl9O2cuc3JjPWF9dXBkYXRlUHJvcGVydGllc1RvTWF0Y2hJbWFnZURpbWVuc2lvbnMoYSxjKXtpZihhIT09dGhpcy5pbWFnZVdpZHRoKnRoaXMuc3ByaXRlQ29sdW1uc3x8YyE9PXRoaXMuaW1hZ2VIZWlnaHQqdGhpcy5zcHJpdGVSb3dzKXt2YXIgZD1hL3RoaXMuaW1hZ2VXaWR0aCxmPWMvdGhpcy5pbWFnZUhlaWdodDtpZihkKmY8dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiQXRsYXMgaW1hZ2UgdG9vIHNtYWxsIHRvIGFjY29tbW9kYXRlIGF0bGFzIGNhcGFjaXR5LiIpOwppZihkIT09TWF0aC5yb3VuZChkKXx8ZiE9PU1hdGgucm91bmQoZikpdGhyb3cgRXJyb3IoIkF0bGFzIGltYWdlIGRpbWVuc2lvbnMgZG8gbm90IGZpdCBzcHJpdGUgaW1hZ2UgZGltZW5zaW9ucy4iKTt0aGlzLnNwcml0ZUNvbHVtbnM9ZDt0aGlzLnNwcml0ZVJvd3M9Zjt0aGlzLmNhbnZhcy53aWR0aD1hO3RoaXMuY2FudmFzLmhlaWdodD1jfX1wb3N0UmVuZGVyKCl7aWYoISh0aGlzLmRyYXdRdWV1ZS5sZW5ndGh8fDA8dGhpcy5wZW5kaW5nSW1hZ2VDb3VudCkpZm9yKDt0aGlzLmNhbGxiYWNrUXVldWUubGVuZ3RoOyl7Y29uc3Qge2NhbGxiYWNrOmEsYXJnczpjfT10aGlzLmNhbGxiYWNrUXVldWUuc2hpZnQoKTthLmFwcGx5KG51bGwsYyl9fXF1ZXVlRHJhdygpe3RoaXMuaXNEcmF3UXVldWVkfHwodGhpcy5pc0RyYXdRdWV1ZWQ9ITAsc2V0VGltZW91dCgoKT0+e3RoaXMuaXNEcmF3UXVldWVkJiZ0aGlzLndvcmtPbkRyYXdKb2JzKCl9LHRoaXMud2FpdFRpbWVvdXQpKX13b3JrT25EcmF3Sm9icygpe3RoaXMuaXNEcmF3UXVldWVkPQohMTtjb25zdCBhPURhdGUubm93KCksYz1hKyh0aGlzLmRyYXdUaW1lb3V0fHxJbmZpbml0eSk7Zm9yKDt0aGlzLmRyYXdRdWV1ZS5sZW5ndGgmJkRhdGUubm93KCk8Yzspe2NvbnN0IHtzcHJpdGVJbmRleDpwLHRpbWVzdGFtcDpxLGltYWdlRGF0YTpyLGltYWdlOnQsY2FsbGJhY2s6dn09dGhpcy5kcmF3UXVldWUuc2hpZnQoKTtpZih0KXt2YXIgZD10aGlzLmltYWdlV2lkdGgsZj10aGlzLmltYWdlSGVpZ2h0LGc9cCV0aGlzLnNwcml0ZUNvbHVtbnMqZCxsPWYqTWF0aC5mbG9vcihwL3RoaXMuc3ByaXRlQ29sdW1ucyk7dGhpcy5jb250ZXh0LmNsZWFyUmVjdChnLGwsZCxmKTt0aGlzLmNvbnRleHQuZHJhd0ltYWdlKHQsZyxsLGQsZik7ImZ1bmN0aW9uIj09PXR5cGVvZiB2JiZ0aGlzLmNhbGxiYWNrUXVldWUucHVzaCh7Y2FsbGJhY2s6dixhcmdzOltwXX0pfWVsc2UgaWYociYmInRleHQiPT09ci50eXBlKXtkPXAldGhpcy5zcHJpdGVDb2x1bW5zKnRoaXMuaW1hZ2VXaWR0aDtmPXRoaXMuaW1hZ2VIZWlnaHQqCk1hdGguZmxvb3IocC90aGlzLnNwcml0ZUNvbHVtbnMpO3ZhciBrPWQrdGhpcy5pbWFnZVdpZHRoLzIsbT1mK3RoaXMuaW1hZ2VIZWlnaHQvMjtnPXRoaXMuZml0dGVyLmZpdChyLmRhdGErIiIpO2w9dGhpcy5jb250ZXh0O2wuY2xlYXJSZWN0KGQsZix0aGlzLmltYWdlV2lkdGgsdGhpcy5pbWFnZUhlaWdodCk7bC5zYXZlKCk7bC50cmFuc2xhdGUoayxtKTtsLnNjYWxlKHRoaXMuaW1hZ2VXaWR0aCx0aGlzLmltYWdlSGVpZ2h0KTtsLmJlZ2luUGF0aCgpO2wuYXJjKDAsMCwuNSwwLDIqTWF0aC5QSSk7bC5yZXN0b3JlKCk7bC5maWxsU3R5bGU9IiM1NTU1NTUiO2wuZmlsbCgpO2wuZmlsbFN0eWxlPSJ3aGl0ZSI7bC50ZXh0QmFzZWxpbmU9ImhhbmdpbmciO2wuZm9udD1gJHtyLnNwZWNpYWw/Iml0YWxpYyI6ImJvbGQifSAke2cuZm9udFNpemV9cHggJHsiJ1JvYm90byBNb25vJywgJ0NvbnNvbGFzJywgJ01lbmxvJywgbW9ub3NwYWNlIn1gO2s9Zy5saW5lcztmb3IobT0wO208ay5sZW5ndGg7bSsrKXtjb25zdCBBPQprW21dO2wuZmlsbFRleHQoQS50ZXh0LGQrQS54LGYrQS55LEEudGV4dC5sZW5ndGgqdGhpcy5maXR0ZXIuc2V0dGluZ3MuZ2x5cGhBc3BlY3RSYXRpbypnLmZvbnRTaXplKX0iZnVuY3Rpb24iPT09dHlwZW9mIHYmJnRoaXMuY2FsbGJhY2tRdWV1ZS5wdXNoKHtjYWxsYmFjazp2LGFyZ3M6W3BdfSl9ZWxzZSBpZihyKXtjb25zdCBBPW5ldyBJbWFnZTt0aGlzLnBlbmRpbmdJbWFnZUNvdW50Kys7QS5vbmxvYWQ9KCk9PnthPHRoaXMubGFzdENsZWFyVGltZXN0YW1wfHwodGhpcy5wZW5kaW5nSW1hZ2VDb3VudC0tLHRoaXMuZHJhd1F1ZXVlLnVuc2hpZnQoe3Nwcml0ZUluZGV4OnAsdGltZXN0YW1wOnEsaW1hZ2U6QSxjYWxsYmFjazp2fSksdGhpcy5xdWV1ZURyYXcoKSl9O0Eub25lcnJvcj0oKT0+e2E8dGhpcy5sYXN0Q2xlYXJUaW1lc3RhbXB8fCh0aGlzLnBlbmRpbmdJbWFnZUNvdW50LS0sdGhpcy5kcmF3UXVldWUucHVzaCh7c3ByaXRlSW5kZXg6cCx0aW1lc3RhbXA6cSxpbWFnZURhdGE6ciwKY2FsbGJhY2s6dn0pLHRoaXMucXVldWVEcmF3KCkpfTtBLnNyYz0ic3ZnIj09PXIudHlwZT9VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtyLmRhdGFdLHt0eXBlOiJpbWFnZS9zdmcreG1sO2NoYXJzZXRceDNkdXRmLTgifSkpOmBkYXRhOiR7ci50eXBlfTtiYXNlNjQsJHtyLmRhdGF9YH19aWYodGhpcy5kcmF3UXVldWUubGVuZ3RofHwwPHRoaXMucGVuZGluZ0ltYWdlQ291bnQpdGhpcy5xdWV1ZURyYXcoKTtlbHNlIGlmKHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5vbkRyYXdGaW5pc2hlZCl0aGlzLm9uRHJhd0ZpbmlzaGVkKCl9fTsKPC9zY3JpcHQ+CgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9mYWNldHMtZGl2ZS9saWIvc3ByaXRlLW1hdGVyaWFsLmpzCmNsYXNzIFltIGV4dGVuZHMgVEhSRUUuUmF3U2hhZGVyTWF0ZXJpYWx7Y29uc3RydWN0b3IoYSxjKXtzdXBlcih7dmVydGV4U2hhZGVyOiJcblxuICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gIHByZWNpc2lvbiBoaWdocCBpbnQ7XG5cbiAgI2RlZmluZSBTSEFERVJfTkFNRSBTcHJpdGVNYXRlcmlhbFxuXG4gIC8vIFN0YW5kYXJkIHVuaWZvcm1zIHByb3ZpZGVkIGJ5IFRIUkVFLmpzIGZvciBwcm9qZWN0aW5nIHRocm91Z2ggdGhlIGNhbWVyYS5cbiAgdW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDtcbiAgdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XG5cbiAgdW5pZm9ybSBmbG9hdCB0aW1lO1xuXG4gIHVuaWZvcm0gZmxvYXQgc3ByaXRlQ29sdW1ucztcbiAgdW5pZm9ybSBmbG9hdCBzcHJpdGVSb3dzO1xuXG4gIGF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuICBhdHRyaWJ1dGUgdmVjMyBiYXNlUG9zaXRpb247XG5cbiAgYXR0cmlidXRlIHZlYzQgY29sb3I7XG4gIGF0dHJpYnV0ZSB2ZWM0IGJhc2VDb2xvcjtcblxuICBhdHRyaWJ1dGUgZmxvYXQgb3BhY2l0eTtcbiAgYXR0cmlidXRlIGZsb2F0IGJhc2VPcGFjaXR5O1xuXG4gIGF0dHJpYnV0ZSBmbG9hdCB0aW1lc3RhbXA7XG4gIGF0dHJpYnV0ZSBmbG9hdCBiYXNlVGltZXN0YW1wO1xuXG4gIGF0dHJpYnV0ZSBmbG9hdCB2ZXJ0ZXhJbmRleDtcblxuICBhdHRyaWJ1dGUgZmxvYXQgdGV4dHVyZUluZGV4O1xuICBhdHRyaWJ1dGUgZmxvYXQgYmFzZVRleHR1cmVJbmRleDtcblxuICBhdHRyaWJ1dGUgZmxvYXQgdGV4dHVyZVRpbWVzdGFtcDtcbiAgYXR0cmlidXRlIGZsb2F0IGJhc2VUZXh0dXJlVGltZXN0YW1wO1xuXG4gIC8vIENvbXB1dGVkIFVWIGNvb3JkaW5hdGVzIGludG8gdGhlIGRlZmF1bHRUZXh0dXJlIGJhc2VkIG9uIHRoZSB2ZXJ0ZXhJbmRleC5cbiAgdmFyeWluZyB2ZWMyIHZEZWZhdWx0VXY7XG5cbiAgLy8gQ29tcHV0ZWQgVVYgY29vcmRpbmF0ZXMgaW50byB0aGUgc3ByaXRlIHRleHR1cmUgYXRsYXMuXG4gIHZhcnlpbmcgdmVjMiB2U3ByaXRlVXY7XG5cbiAgLy8gSW50ZXJwb2xhdGVkIGNvbG9yIHVzZWQgYnkgdGhlIGZyYWdtZW50IHNoYWRlci5cbiAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcblxuICAvLyBJbnRlcnBvbGF0ZWQgb3BhY2l0eSB1c2VkIGJ5IHRoZSBmcmFnbWVudCBzaGFkZXIuXG4gIHZhcnlpbmcgZmxvYXQgdk9wYWNpdHk7XG5cbiAgLy8gRGVncmVlIG9mIG1peGluZyBiZXR3ZWVuIGJhc2UgYW5kIGN1cnJlbnQgdGV4dHVyZS5cbiAgdmFyeWluZyBmbG9hdCB2VGV4dHVyZU1peDtcblxuICBmbG9hdCBhcHBseUVhc2luZyhmbG9hdCB0KSB7XG4gICAgcmV0dXJuIHQgXHgzYyAwLjUgPyA0LjAgKiB0ICogdCAqIHQgOlxuICAgICAgNC4wICogKHQgLSAxLjApICogKHQgLSAxLjApICogKHQgLSAxLjApICsgMS4wO1xuICB9XG5cbiAgdm9pZCBtYWluKCkge1xuXG4gICAgLy8gQ29tcHV0ZSBkZWZhdWx0IFVWcy4gQSBceDNkXHgzZSAoMCwwKSwgQiBceDNkXHgzZSAoMSwwKSwgZXRjLlxuICAgIHZEZWZhdWx0VXYueCBceDNkIG1vZChmbG9vcigodmVydGV4SW5kZXggKyAxLjApIC8gMi4wKSwgMi4wKTtcbiAgICB2RGVmYXVsdFV2LnkgXHgzZCBtb2QoZmxvb3IodmVydGV4SW5kZXggLyAyLjApLCAyLjApO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSByb3cgYW5kIGNvbHVtbiBpbmRpY2VzIGZvciB0aGlzIHNwcml0ZS5cbiAgICBmbG9hdCBzcHJpdGVJbmRleCBceDNkIGZsb29yKHZlcnRleEluZGV4IC8gNC4wKSArIDAuNTtcbiAgICBmbG9hdCBjb2x1bW5JbmRleCBceDNkIGZsb29yKG1vZChzcHJpdGVJbmRleCwgc3ByaXRlQ29sdW1ucykpO1xuICAgIGZsb2F0IHJvd0luZGV4IFx4M2Qgc3ByaXRlUm93cyAtIDEuMCAtIGZsb29yKHNwcml0ZUluZGV4IC8gc3ByaXRlQ29sdW1ucyk7XG5cbiAgICAvLyBDb21wdXRlIHNwcml0ZSBVVnMgZnJvbSByb3cgYW5kIGNvbHVtbiBpbmRpY2VzLlxuICAgIHZTcHJpdGVVdi54IFx4M2QgKGNvbHVtbkluZGV4ICsgdkRlZmF1bHRVdi54KSAvIHNwcml0ZUNvbHVtbnM7XG4gICAgdlNwcml0ZVV2LnkgXHgzZCAocm93SW5kZXggKyB2RGVmYXVsdFV2LnkpIC8gc3ByaXRlUm93cztcblxuICAgIGZsb2F0IGJsZW5kIFx4M2QgYXBwbHlFYXNpbmcoc21vb3Roc3RlcChiYXNlVGltZXN0YW1wLCB0aW1lc3RhbXAsIHRpbWUpKTtcblxuICAgIHZUZXh0dXJlTWl4IFx4M2QgbWl4KGJhc2VUZXh0dXJlSW5kZXgsIHRleHR1cmVJbmRleCxcbiAgICAgICAgc21vb3Roc3RlcChiYXNlVGV4dHVyZVRpbWVzdGFtcCwgdGV4dHVyZVRpbWVzdGFtcCwgdGltZSkpO1xuXG4gICAgdkNvbG9yIFx4M2QgbWl4KGJhc2VDb2xvciwgY29sb3IsIGJsZW5kKTtcblxuICAgIHZPcGFjaXR5IFx4M2QgbWl4KGJhc2VPcGFjaXR5LCBvcGFjaXR5LCBibGVuZCk7XG5cbiAgICBnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKlxuICAgICAgICB2ZWM0KG1peChiYXNlUG9zaXRpb24sIHBvc2l0aW9uLCB2ZWMzKGJsZW5kKSksIDEuMCk7XG5cbiAgfVxuXG4iLApmcmFnbWVudFNoYWRlcjoiXG5cbiAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICBwcmVjaXNpb24gaGlnaHAgaW50O1xuXG4gICNkZWZpbmUgU0hBREVSX05BTUUgU3ByaXRlTWF0ZXJpYWxcblxuICAvLyBMaWdodG5lc3MgdGhhdCBzaG91bGQgaWRlYWxseSBleGFjdGx5IG1hdGNoIHRoZSB2Q29sb3IuXG4gICNkZWZpbmUgVEFSR0VUX0xJR0hUTkVTUyAwLjZcblxuICB1bmlmb3JtIGZsb2F0IHRpbWU7XG5cbiAgdW5pZm9ybSBzYW1wbGVyMkQgZGVmYXVsdFRleHR1cmU7XG4gIHVuaWZvcm0gc2FtcGxlcjJEIHNwcml0ZUF0bGFzO1xuXG4gIHZhcnlpbmcgdmVjMiB2RGVmYXVsdFV2O1xuICB2YXJ5aW5nIHZlYzIgdlNwcml0ZVV2O1xuICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuICB2YXJ5aW5nIGZsb2F0IHZPcGFjaXR5O1xuICB2YXJ5aW5nIGZsb2F0IHZUZXh0dXJlTWl4O1xuXG4gIC8vIENvbXB1dGUgcmVsYXRpdmUgbHVtaW5hbmNlIGZyb20gUkdCLlxuICBmbG9hdCByZ2JUb0wodmVjMyByZ2IpIHtcbiAgICByZXR1cm4gZG90KHJnYiwgdmVjMygwLjMsIDAuNTksIDAuMTEpKTtcbiAgfVxuXG4gIC8vIEFwcGx5IGx1bWluYW5jZSBlYXNpbmcuXG4gIGZsb2F0IGVhc2VMKGZsb2F0IGwpIHtcbiAgICByZXR1cm4gMS4wIC0gKDEuMCAtIGwpICogKDEuMCAtIGwpICogKDEuMCAtIGwpO1xuICB9XG5cbiAgdm9pZCBtYWluKCkge1xuICAgIGlmICh2T3BhY2l0eSBceDNjXHgzZCAwLjA1KSB7XG4gICAgICBkaXNjYXJkO1xuICAgIH1cblxuICAgIC8vIEludGVycG9sYXRlIGJldHdlZW4gZGVmYXVsdCB0ZXh0dXJlIGFuZCBzcHJpdGUgdGV4dHVyZS5cbiAgICB2ZWM0IGRlZmF1bHRDb2xvciBceDNkXG4gICAgICB2VGV4dHVyZU1peCBceDNjIDEuMCA/IHRleHR1cmUyRChkZWZhdWx0VGV4dHVyZSwgdkRlZmF1bHRVdikgOiB2ZWM0KDAuMCk7XG4gICAgdmVjNCBzcHJpdGVDb2xvciBceDNkXG4gICAgICB2VGV4dHVyZU1peCBceDNlIDAuMCA/IHRleHR1cmUyRChzcHJpdGVBdGxhcywgdlNwcml0ZVV2KSA6IHZlYzQoMC4wKTtcbiAgICB2ZWM0IG1peGVkQ29sb3IgXHgzZCBtaXgoZGVmYXVsdENvbG9yLCBzcHJpdGVDb2xvciwgdlRleHR1cmVNaXgpO1xuXG4gICAgLy8gTGlnaHRuZXNzIG9mIHRoZSBtaXhlZCBwaXhlbC5cbiAgICBmbG9hdCBtaXhlZEwgXHgzZCByZ2JUb0wobWl4ZWRDb2xvci5yZ2IpO1xuXG4gICAgLy8gVXNpbmcgdGhlIG1peGVkIGFuZCB0YXJnZXQgbGlnaHRuZXNzLCBkZXRlcm1pbmUgdGhlIGNvbG9yIHRoYXQncyBiZXR3ZWVuXG4gICAgLy8gYmxhY2ssIHZDb2xvciBhbmQgd2hpdGUuXG4gICAgdmVjMyBjb2xvciBceDNkIG1peGVkTCBceDNjIFRBUkdFVF9MSUdIVE5FU1MgP1xuICAgICAgICBtaXgodmVjMygwLjApLCB2Q29sb3IucmdiLCBlYXNlTChtaXhlZEwgLyBUQVJHRVRfTElHSFRORVNTKSkgOlxuICAgICAgICBtaXgodmVjMygxLjApLCB2Q29sb3IucmdiLFxuICAgICAgICAgICAgZWFzZUwoKDEuMCAtIG1peGVkTCkgLyAoMS4wIC0gVEFSR0VUX0xJR0hUTkVTUykpKTtcblxuICAgIHZlYzMgZmluYWxDb2xvciBceDNkIG1peChtaXhlZENvbG9yLnJnYiwgY29sb3IsIHZDb2xvci5hKTtcblxuICAgIC8vIEFwcGx5IG9wYWNpdHkuXG4gICAgZ2xfRnJhZ0NvbG9yIFx4M2QgdmVjNChmaW5hbENvbG9yLCBtaXhlZENvbG9yLmEgKiB2T3BhY2l0eSk7XG4gIH1cbiIsCnVuaWZvcm1zOnt0aW1lOnt0eXBlOiJmIix2YWx1ZTowfSxkZWZhdWx0VGV4dHVyZTp7dHlwZToidCIsdmFsdWU6YX0sc3ByaXRlQXRsYXM6e3R5cGU6InQiLHZhbHVlOmN9LHNwcml0ZUNvbHVtbnM6e3R5cGU6ImYiLHZhbHVlOmM/Yy5zcHJpdGVDb2x1bW5zOjF9LHNwcml0ZVJvd3M6e3R5cGU6ImYiLHZhbHVlOmM/Yy5zcHJpdGVSb3dzOjF9fSx0cmFuc3BhcmVudDohMH0pfWdldCB0aW1lKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudGltZS52YWx1ZX1zZXQgdGltZShhKXt0aGlzLnVuaWZvcm1zLnRpbWUudmFsdWU9YX1nZXQgZGVmYXVsdFRleHR1cmUoKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5kZWZhdWx0VGV4dHVyZS52YWx1ZX1zZXQgZGVmYXVsdFRleHR1cmUoYSl7dGhpcy51bmlmb3Jtcy5kZWZhdWx0VGV4dHVyZS52YWx1ZT1hfWdldCBzcHJpdGVBdGxhcygpe3JldHVybiB0aGlzLnVuaWZvcm1zLnNwcml0ZUF0bGFzLnZhbHVlfXNldCBzcHJpdGVBdGxhcyhhKXt0aGlzLnVuaWZvcm1zLnNwcml0ZUF0bGFzLnZhbHVlPQphfXVwZGF0ZUF0bGFzVW5pZm9ybXMoKXt0aGlzLnVuaWZvcm1zLnNwcml0ZUNvbHVtbnMudmFsdWU9dGhpcy5zcHJpdGVBdGxhcy5zcHJpdGVDb2x1bW5zO3RoaXMudW5pZm9ybXMuc3ByaXRlUm93cy52YWx1ZT10aGlzLnNwcml0ZUF0bGFzLnNwcml0ZVJvd3N9YXBwbHlFYXNpbmcoYSl7cmV0dXJuLjU+YT80KmEqYSphOjQqKGEtMSkqKGEtMSkqKGEtMSkrMX19Owo8L3NjcmlwdD4KCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZmFjZXRzLWRpdmUvbGliL3Nwcml0ZS1tZXNoLmpzCmNsYXNzIFpte2NvbnN0cnVjdG9yKGEsYyl7dGhpcy5fc3ByaXRlTWVzaD1hO3RoaXMuX3Nwcml0ZUluZGV4PWN9Z2V0IHNwcml0ZU1lc2goKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaH1nZXQgc3ByaXRlSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3ByaXRlSW5kZXh9Z2V0IHgoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRYKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgeChhKXt0aGlzLl9zcHJpdGVNZXNoLnNldFgodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRZKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgeShhKXt0aGlzLl9zcHJpdGVNZXNoLnNldFkodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRaKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgeihhKXt0aGlzLl9zcHJpdGVNZXNoLnNldFoodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IHIoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRSKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgcihhKXt0aGlzLl9zcHJpdGVNZXNoLnNldFIodGhpcy5fc3ByaXRlSW5kZXgsCmEpfWdldCBnKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0Ryh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGcoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRHKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBiKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0Qih0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGIoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBhKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QSh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGEoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRBKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBvcGFjaXR5KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0T3BhY2l0eSh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IG9wYWNpdHkoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRPcGFjaXR5KHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCB0aW1lc3RhbXAoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRUaW1lc3RhbXAodGhpcy5fc3ByaXRlSW5kZXgpfXNldCB0aW1lc3RhbXAoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRUaW1lc3RhbXAodGhpcy5fc3ByaXRlSW5kZXgsCmEpfWdldCBiYXNlWCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VYKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgYmFzZVgoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlWCh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZVkoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlWSh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VZKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVkodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IGJhc2VaKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZVoodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlWihhKXt0aGlzLl9zcHJpdGVNZXNoLnNldEJhc2VaKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBiYXNlUigpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VSKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgYmFzZVIoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlUih0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZUcoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlRyh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VHKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZUcodGhpcy5fc3ByaXRlSW5kZXgsCmEpfWdldCBiYXNlQigpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VCKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgYmFzZUIoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlQih0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZUEoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlQSh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VBKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZUEodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IGJhc2VPcGFjaXR5KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZU9wYWNpdHkodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlT3BhY2l0eShhKXt0aGlzLl9zcHJpdGVNZXNoLnNldEJhc2VPcGFjaXR5KHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBiYXNlVGltZXN0YW1wKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZVRpbWVzdGFtcCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VUaW1lc3RhbXAoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlVGltZXN0YW1wKHRoaXMuX3Nwcml0ZUluZGV4LAphKX1nZXQgdGV4dHVyZUluZGV4KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0VGV4dHVyZUluZGV4KHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgdGV4dHVyZUluZGV4KGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0VGV4dHVyZUluZGV4KHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBiYXNlVGV4dHVyZUluZGV4KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZVRleHR1cmVJbmRleCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VUZXh0dXJlSW5kZXgoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlVGV4dHVyZUluZGV4KHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCB0ZXh0dXJlVGltZXN0YW1wKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0VGV4dHVyZVRpbWVzdGFtcCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHRleHR1cmVUaW1lc3RhbXAoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRUZXh0dXJlVGltZXN0YW1wKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBiYXNlVGV4dHVyZVRpbWVzdGFtcCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VUZXh0dXJlVGltZXN0YW1wKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgYmFzZVRleHR1cmVUaW1lc3RhbXAoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlVGV4dHVyZVRpbWVzdGFtcCh0aGlzLl9zcHJpdGVJbmRleCwKYSl9cmViYXNlKGEpe3RoaXMuX3Nwcml0ZU1lc2gucmViYXNlKHRoaXMuX3Nwcml0ZUluZGV4LGEpfXNldFNwcml0ZUltYWdlRGF0YShhLGMpe3RoaXMuX3Nwcml0ZU1lc2guc2V0U3ByaXRlSW1hZ2VEYXRhKHRoaXMuX3Nwcml0ZUluZGV4LGEsYyl9c3dpdGNoVGV4dHVyZXMoYSxjKXt0aGlzLl9zcHJpdGVNZXNoLnN3aXRjaFRleHR1cmVzKHRoaXMuX3Nwcml0ZUluZGV4LGEsYyl9fQpjbGFzcyAkbSBleHRlbmRzIFRIUkVFLk1lc2h7Y29uc3RydWN0b3IoYSxjPTMyLGQ9MzIpe3N1cGVyKCk7dGhpcy5jYXBhY2l0eT1hO3RoaXMuaW1hZ2VXaWR0aD1jO3RoaXMuaW1hZ2VIZWlnaHQ9ZDt0aGlzLm5leHRJbmRleD0wO3RoaXMuc3ByaXRlV2lkdGg9dGhpcy5pbWFnZVdpZHRoL3RoaXMuaW1hZ2VIZWlnaHQ7dGhpcy5zcHJpdGVIZWlnaHQ9MTt0aGlzLmdlb21ldHJ5PW5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeTt0aGlzLnBvc2l0aW9uRGF0YT1uZXcgRmxvYXQzMkFycmF5KDEyKmEpO3RoaXMucG9zaXRpb25BdHRyaWJ1dGU9bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSh0aGlzLnBvc2l0aW9uRGF0YSwzKTt0aGlzLnBvc2l0aW9uQXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsdGhpcy5wb3NpdGlvbkF0dHJpYnV0ZSk7dGhpcy5iYXNlUG9zaXRpb25EYXRhPW5ldyBGbG9hdDMyQXJyYXkoMTIqYSk7dGhpcy5iYXNlUG9zaXRpb25BdHRyaWJ1dGU9Cm5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5iYXNlUG9zaXRpb25EYXRhLDMpO3RoaXMuYmFzZVBvc2l0aW9uQXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJiYXNlUG9zaXRpb24iLHRoaXMuYmFzZVBvc2l0aW9uQXR0cmlidXRlKTt0aGlzLmNvbG9yRGF0YT1uZXcgVWludDhBcnJheSgxNiphKTt0aGlzLmNvbG9yQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5jb2xvckRhdGEsNCk7dGhpcy5jb2xvckF0dHJpYnV0ZS5ub3JtYWxpemVkPSEwO3RoaXMuY29sb3JBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoImNvbG9yIix0aGlzLmNvbG9yQXR0cmlidXRlKTt0aGlzLmJhc2VDb2xvckRhdGE9bmV3IFVpbnQ4QXJyYXkoMTYqYSk7dGhpcy5iYXNlQ29sb3JBdHRyaWJ1dGU9bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSh0aGlzLmJhc2VDb2xvckRhdGEsNCk7dGhpcy5iYXNlQ29sb3JBdHRyaWJ1dGUubm9ybWFsaXplZD0KITA7dGhpcy5iYXNlQ29sb3JBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoImJhc2VDb2xvciIsdGhpcy5iYXNlQ29sb3JBdHRyaWJ1dGUpO3RoaXMub3BhY2l0eURhdGE9bmV3IEZsb2F0MzJBcnJheSg0KmEpO3RoaXMub3BhY2l0eUF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMub3BhY2l0eURhdGEsMSk7dGhpcy5vcGFjaXR5QXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJvcGFjaXR5Iix0aGlzLm9wYWNpdHlBdHRyaWJ1dGUpO3RoaXMuYmFzZU9wYWNpdHlEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNCphKTt0aGlzLmJhc2VPcGFjaXR5QXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5iYXNlT3BhY2l0eURhdGEsMSk7dGhpcy5iYXNlT3BhY2l0eUF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgiYmFzZU9wYWNpdHkiLAp0aGlzLmJhc2VPcGFjaXR5QXR0cmlidXRlKTt0aGlzLnRpbWVzdGFtcERhdGE9bmV3IEZsb2F0MzJBcnJheSg0KmEpO3RoaXMudGltZXN0YW1wQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy50aW1lc3RhbXBEYXRhLDEpO3RoaXMudGltZXN0YW1wQXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJ0aW1lc3RhbXAiLHRoaXMudGltZXN0YW1wQXR0cmlidXRlKTt0aGlzLmJhc2VUaW1lc3RhbXBEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNCphKTt0aGlzLmJhc2VUaW1lc3RhbXBBdHRyaWJ1dGU9bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSh0aGlzLmJhc2VUaW1lc3RhbXBEYXRhLDEpO3RoaXMuYmFzZVRpbWVzdGFtcEF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgiYmFzZVRpbWVzdGFtcCIsdGhpcy5iYXNlVGltZXN0YW1wQXR0cmlidXRlKTt0aGlzLmZhY2VJbmRleERhdGE9Cm5ldyBVaW50MzJBcnJheSg2KmEpO2Zvcih2YXIgZj0wO2Y8YTtmKyspe3ZhciBnPTYqZjtjb25zdCBsPTQqZjt0aGlzLmZhY2VJbmRleERhdGFbZyswXT1sKzA7dGhpcy5mYWNlSW5kZXhEYXRhW2crMV09bCsxO3RoaXMuZmFjZUluZGV4RGF0YVtnKzJdPWwrMjt0aGlzLmZhY2VJbmRleERhdGFbZyszXT1sKzA7dGhpcy5mYWNlSW5kZXhEYXRhW2crNF09bCsyO3RoaXMuZmFjZUluZGV4RGF0YVtnKzVdPWwrM310aGlzLmZhY2VJbmRleEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuZmFjZUluZGV4RGF0YSwxKTt0aGlzLmdlb21ldHJ5LnNldEluZGV4KHRoaXMuZmFjZUluZGV4QXR0cmlidXRlKTt0aGlzLnRleHR1cmVJbmRleERhdGE9bmV3IEZsb2F0MzJBcnJheSg0KmEpO3RoaXMudGV4dHVyZUluZGV4QXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy50ZXh0dXJlSW5kZXhEYXRhLDEpO3RoaXMudGV4dHVyZUluZGV4QXR0cmlidXRlLnNldER5bmFtaWMoITApOwp0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgidGV4dHVyZUluZGV4Iix0aGlzLnRleHR1cmVJbmRleEF0dHJpYnV0ZSk7dGhpcy5iYXNlVGV4dHVyZUluZGV4RGF0YT1uZXcgRmxvYXQzMkFycmF5KDQqYSk7dGhpcy5iYXNlVGV4dHVyZUluZGV4QXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5iYXNlVGV4dHVyZUluZGV4RGF0YSwxKTt0aGlzLmJhc2VUZXh0dXJlSW5kZXhBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoImJhc2VUZXh0dXJlSW5kZXgiLHRoaXMuYmFzZVRleHR1cmVJbmRleEF0dHJpYnV0ZSk7dGhpcy50ZXh0dXJlVGltZXN0YW1wRGF0YT1uZXcgRmxvYXQzMkFycmF5KDQqYSk7dGhpcy50ZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy50ZXh0dXJlVGltZXN0YW1wRGF0YSwxKTt0aGlzLnRleHR1cmVUaW1lc3RhbXBBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7CnRoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJ0ZXh0dXJlVGltZXN0YW1wIix0aGlzLnRleHR1cmVUaW1lc3RhbXBBdHRyaWJ1dGUpO3RoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNCphKTt0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcERhdGEsMSk7dGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcEF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgiYmFzZVRleHR1cmVUaW1lc3RhbXAiLHRoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBBdHRyaWJ1dGUpO2Y9NCphO3RoaXMudmVydGV4SW5kZXhEYXRhPW5ldyBGbG9hdDMyQXJyYXkoZik7Zm9yKGc9MDtnPGY7ZysrKXRoaXMudmVydGV4SW5kZXhEYXRhW2ddPWc7dGhpcy52ZXJ0ZXhJbmRleEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMudmVydGV4SW5kZXhEYXRhLAoxKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgidmVydGV4SW5kZXgiLHRoaXMudmVydGV4SW5kZXhBdHRyaWJ1dGUpO3RoaXMuZGVmYXVsdFRleHR1cmVDYW52YXM9dGhpcy5jcmVhdGVEZWZhdWx0VGV4dHVyZUNhbnZhcygpO3RoaXMuZGVmYXVsdFRleHR1cmU9bmV3IFRIUkVFLlRleHR1cmUodGhpcy5kZWZhdWx0VGV4dHVyZUNhbnZhcyk7dGhpcy5kZWZhdWx0VGV4dHVyZS5taW5GaWx0ZXI9VEhSRUUuTGluZWFyRmlsdGVyO3RoaXMuZGVmYXVsdFRleHR1cmUubWFnRmlsdGVyPVRIUkVFLk5lYXJlc3RGaWx0ZXI7dGhpcy5kZWZhdWx0VGV4dHVyZS5uZWVkc1VwZGF0ZT0hMDt0aGlzLnNwcml0ZUF0bGFzPW5ldyBYbShhLGMsZCk7dGhpcy5tYXRlcmlhbD1uZXcgWW0odGhpcy5kZWZhdWx0VGV4dHVyZSx0aGlzLnNwcml0ZUF0bGFzKTt0aGlzLm9uQmVmb3JlUmVuZGVyPSgpPT57dGhpcy5tYXRlcmlhbC51cGRhdGVBdGxhc1VuaWZvcm1zKCl9O3RoaXMudGltZT10aGlzLmNvbnN0cnVjdGlvblRpbWVzdGFtcD0KRGF0ZS5ub3coKTt0aGlzLmZydXN0dW1DdWxsZWQ9ITF9Y3JlYXRlU3ByaXRlKCl7cmV0dXJuIG5ldyBabSh0aGlzLHRoaXMubmV4dEluZGV4KyspfWdldCB0aW1lKCl7cmV0dXJuIHRoaXMubWF0ZXJpYWwudGltZSt0aGlzLmNvbnN0cnVjdGlvblRpbWVzdGFtcH1zZXQgdGltZShhKXt0aGlzLm1hdGVyaWFsLnRpbWU9YS10aGlzLmNvbnN0cnVjdGlvblRpbWVzdGFtcH1jcmVhdGVEZWZhdWx0VGV4dHVyZUNhbnZhcygpe2NvbnN0IGE9dGhpcy5kZWZhdWx0VGV4dHVyZUNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxjPWEud2lkdGg9dGhpcy5pbWFnZVdpZHRoLGQ9YS5oZWlnaHQ9dGhpcy5pbWFnZUhlaWdodCxmPWEuZ2V0Q29udGV4dCgiMmQiKSxnPW5ldyBJbWFnZTtnLm9ubG9hZD0oKT0+e2YuZHJhd0ltYWdlKGcsMCwwLGMsZCk7dGhpcy5kZWZhdWx0VGV4dHVyZS5uZWVkc1VwZGF0ZT0hMH07Zy5zcmM9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbJ1xuXHgzY3N2ZyB2ZXJzaW9uXHgzZCIxLjEiXG4gICAgIGJhc2VQcm9maWxlXHgzZCJmdWxsIlxuICAgICB3aWR0aFx4M2QiMTI4IiBoZWlnaHRceDNkIjEyOCJcbiAgICAgeG1sbnNceDNkImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIlxuICAgICB4bWxuczp4bGlua1x4M2QiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayJceDNlXG4gIFx4M2NkZWZzXHgzZVxuICAgIFx4M2NsaW5lYXJHcmFkaWVudCBpZFx4M2QibGluZWFyR3JhZGllbnQzNzc0Ilx4M2VcbiAgICAgIFx4M2NzdG9wXG4gICAgICAgICBzdHlsZVx4M2Qic3RvcC1jb2xvcjojODA4MDgwO3N0b3Atb3BhY2l0eToxOyJcbiAgICAgICAgIG9mZnNldFx4M2QiMCIgL1x4M2VcbiAgICAgIFx4M2NzdG9wXG4gICAgICAgICBzdHlsZVx4M2Qic3RvcC1jb2xvcjojNTU1NTU1O3N0b3Atb3BhY2l0eToxOyJcbiAgICAgICAgIG9mZnNldFx4M2QiMSIgL1x4M2VcbiAgICBceDNjL2xpbmVhckdyYWRpZW50XHgzZVxuICAgIFx4M2NyYWRpYWxHcmFkaWVudFxuICAgICAgIHhsaW5rOmhyZWZceDNkIiNsaW5lYXJHcmFkaWVudDM3NzQiXG4gICAgICAgaWRceDNkInJhZGlhbEdyYWRpZW50Mzc4MCJcbiAgICAgICBjeFx4M2QiODAiXG4gICAgICAgY3lceDNkIjQwIlxuICAgICAgIGZ4XHgzZCI4MCJcbiAgICAgICBmeVx4M2QiNDAiXG4gICAgICAgclx4M2QiODAiXG4gICAgICAgZ3JhZGllbnRVbml0c1x4M2QidXNlclNwYWNlT25Vc2UiXG4gICAgICAgc3ByZWFkTWV0aG9kXHgzZCJwYWQiIC9ceDNlXG4gIFx4M2MvZGVmc1x4M2VcbiAgXHgzY2NpcmNsZSBjeFx4M2QiNTAlIiBjeVx4M2QiNTAlIiByXHgzZCI1MCUiIGZpbGxceDNkInVybCgjcmFkaWFsR3JhZGllbnQzNzgwKSIgL1x4M2Vcblx4M2Mvc3ZnXHgzZVxuJ10sCnt0eXBlOiJpbWFnZS9zdmcreG1sO2NoYXJzZXRceDNkdXRmLTgifSkpO3JldHVybiBhfWdldFgoYSl7cmV0dXJuIHRoaXMucG9zaXRpb25EYXRhWzEyKmFdfXNldFgoYSxjKXthKj0xMjt0aGlzLnBvc2l0aW9uRGF0YVthKzBdPWM7dGhpcy5wb3NpdGlvbkRhdGFbYSszXT1jK3RoaXMuc3ByaXRlV2lkdGg7dGhpcy5wb3NpdGlvbkRhdGFbYSs2XT1jK3RoaXMuc3ByaXRlV2lkdGg7dGhpcy5wb3NpdGlvbkRhdGFbYSs5XT1jO3RoaXMucG9zaXRpb25BdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0WShhKXtyZXR1cm4gdGhpcy5wb3NpdGlvbkRhdGFbMTIqYSsxXX1zZXRZKGEsYyl7YSo9MTI7dGhpcy5wb3NpdGlvbkRhdGFbYSsxXT1jO3RoaXMucG9zaXRpb25EYXRhW2ErNF09Yzt0aGlzLnBvc2l0aW9uRGF0YVthKzddPWMrdGhpcy5zcHJpdGVIZWlnaHQ7dGhpcy5wb3NpdGlvbkRhdGFbYSsxMF09Yyt0aGlzLnNwcml0ZUhlaWdodDt0aGlzLnBvc2l0aW9uQXR0cmlidXRlLm5lZWRzVXBkYXRlPQohMH1nZXRaKGEpe3JldHVybiB0aGlzLnBvc2l0aW9uRGF0YVsxMiphKzJdfXNldFooYSxjKXthKj0xMjt0aGlzLnBvc2l0aW9uRGF0YVthKzJdPWM7dGhpcy5wb3NpdGlvbkRhdGFbYSs1XT1jO3RoaXMucG9zaXRpb25EYXRhW2ErOF09Yzt0aGlzLnBvc2l0aW9uRGF0YVthKzExXT1jO3RoaXMucG9zaXRpb25BdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0UihhKXtyZXR1cm4gdGhpcy5jb2xvckRhdGFbMTYqYV19c2V0UihhLGMpe2EqPTE2O3RoaXMuY29sb3JEYXRhW2ErMF09Yzt0aGlzLmNvbG9yRGF0YVthKzRdPWM7dGhpcy5jb2xvckRhdGFbYSs4XT1jO3RoaXMuY29sb3JEYXRhW2ErMTJdPWM7dGhpcy5jb2xvckF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRHKGEpe3JldHVybiB0aGlzLmNvbG9yRGF0YVsxNiphKzFdfXNldEcoYSxjKXthKj0xNjt0aGlzLmNvbG9yRGF0YVthKzFdPWM7dGhpcy5jb2xvckRhdGFbYSs1XT1jO3RoaXMuY29sb3JEYXRhW2ErOV09Yzt0aGlzLmNvbG9yRGF0YVthKwoxM109Yzt0aGlzLmNvbG9yQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEIoYSl7cmV0dXJuIHRoaXMuY29sb3JEYXRhWzE2KmErMl19c2V0QihhLGMpe2EqPTE2O3RoaXMuY29sb3JEYXRhW2ErMl09Yzt0aGlzLmNvbG9yRGF0YVthKzZdPWM7dGhpcy5jb2xvckRhdGFbYSsxMF09Yzt0aGlzLmNvbG9yRGF0YVthKzE0XT1jO3RoaXMuY29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QShhKXtyZXR1cm4gdGhpcy5jb2xvckRhdGFbMTYqYSszXX1zZXRBKGEsYyl7YSo9MTY7dGhpcy5jb2xvckRhdGFbYSszXT1jO3RoaXMuY29sb3JEYXRhW2ErN109Yzt0aGlzLmNvbG9yRGF0YVthKzExXT1jO3RoaXMuY29sb3JEYXRhW2ErMTVdPWM7dGhpcy5jb2xvckF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlWChhKXtyZXR1cm4gdGhpcy5iYXNlUG9zaXRpb25EYXRhWzEyKmFdfXNldEJhc2VYKGEsYyl7YSo9MTI7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErMF09Yzt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSsKM109Yyt0aGlzLnNwcml0ZVdpZHRoO3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzZdPWMrdGhpcy5zcHJpdGVXaWR0aDt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSs5XT1jO3RoaXMuYmFzZVBvc2l0aW9uQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEJhc2VZKGEpe3JldHVybiB0aGlzLmJhc2VQb3NpdGlvbkRhdGFbMTIqYSsxXX1zZXRCYXNlWShhLGMpe2EqPTEyO3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzFdPWM7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErNF09Yzt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSs3XT1jK3RoaXMuc3ByaXRlSGVpZ2h0O3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzEwXT1jK3RoaXMuc3ByaXRlSGVpZ2h0O3RoaXMuYmFzZVBvc2l0aW9uQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEJhc2VaKGEpe3JldHVybiB0aGlzLmJhc2VQb3NpdGlvbkRhdGFbMTIqYSsyXX1zZXRCYXNlWihhLGMpe2EqPTEyO3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzJdPWM7CnRoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzVdPWM7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErOF09Yzt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSsxMV09Yzt0aGlzLmJhc2VQb3NpdGlvbkF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlUihhKXtyZXR1cm4gdGhpcy5iYXNlQ29sb3JEYXRhWzE2KmFdfXNldEJhc2VSKGEsYyl7YSo9MTY7dGhpcy5iYXNlQ29sb3JEYXRhW2ErMF09Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSs0XT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzhdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErMTJdPWM7dGhpcy5iYXNlQ29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZUcoYSl7cmV0dXJuIHRoaXMuYmFzZUNvbG9yRGF0YVsxNiphKzFdfXNldEJhc2VHKGEsYyl7YSo9MTY7dGhpcy5iYXNlQ29sb3JEYXRhW2ErMV09Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSs1XT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzldPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErCjEzXT1jO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEJhc2VCKGEpe3JldHVybiB0aGlzLmJhc2VDb2xvckRhdGFbMTYqYSsyXX1zZXRCYXNlQihhLGMpe2EqPTE2O3RoaXMuYmFzZUNvbG9yRGF0YVthKzJdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErNl09Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSsxMF09Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSsxNF09Yzt0aGlzLmJhc2VDb2xvckF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlQShhKXtyZXR1cm4gdGhpcy5iYXNlQ29sb3JEYXRhWzE2KmErM119c2V0QmFzZUEoYSxjKXthKj0xNjt0aGlzLmJhc2VDb2xvckRhdGFbYSszXT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzddPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErMTFdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErMTVdPWM7dGhpcy5iYXNlQ29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0T3BhY2l0eShhKXtyZXR1cm4gdGhpcy5vcGFjaXR5RGF0YVs0KgphXX1zZXRPcGFjaXR5KGEsYyl7YSo9NDt0aGlzLm9wYWNpdHlEYXRhW2ErMF09Yzt0aGlzLm9wYWNpdHlEYXRhW2ErMV09Yzt0aGlzLm9wYWNpdHlEYXRhW2ErMl09Yzt0aGlzLm9wYWNpdHlEYXRhW2ErM109Yzt0aGlzLm9wYWNpdHlBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZU9wYWNpdHkoYSl7cmV0dXJuIHRoaXMuYmFzZU9wYWNpdHlEYXRhWzQqYV19c2V0QmFzZU9wYWNpdHkoYSxjKXthKj00O3RoaXMuYmFzZU9wYWNpdHlEYXRhW2ErMF09Yzt0aGlzLmJhc2VPcGFjaXR5RGF0YVthKzFdPWM7dGhpcy5iYXNlT3BhY2l0eURhdGFbYSsyXT1jO3RoaXMuYmFzZU9wYWNpdHlEYXRhW2ErM109Yzt0aGlzLmJhc2VPcGFjaXR5QXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldFRpbWVzdGFtcChhKXtyZXR1cm4gdGhpcy50aW1lc3RhbXBEYXRhWzQqYV0rdGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXB9c2V0VGltZXN0YW1wKGEsYyl7YSo9NDtjLT10aGlzLmNvbnN0cnVjdGlvblRpbWVzdGFtcDsKdGhpcy50aW1lc3RhbXBEYXRhW2ErMF09Yzt0aGlzLnRpbWVzdGFtcERhdGFbYSsxXT1jO3RoaXMudGltZXN0YW1wRGF0YVthKzJdPWM7dGhpcy50aW1lc3RhbXBEYXRhW2ErM109Yzt0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlVGltZXN0YW1wKGEpe3JldHVybiB0aGlzLmJhc2VUaW1lc3RhbXBEYXRhWzQqYV0rdGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXB9c2V0QmFzZVRpbWVzdGFtcChhLGMpe2EqPTQ7Yy09dGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXA7dGhpcy5iYXNlVGltZXN0YW1wRGF0YVthKzBdPWM7dGhpcy5iYXNlVGltZXN0YW1wRGF0YVthKzFdPWM7dGhpcy5iYXNlVGltZXN0YW1wRGF0YVthKzJdPWM7dGhpcy5iYXNlVGltZXN0YW1wRGF0YVthKzNdPWM7dGhpcy5iYXNlVGltZXN0YW1wQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldFRleHR1cmVJbmRleChhKXtyZXR1cm4gdGhpcy50ZXh0dXJlSW5kZXhEYXRhWzQqYV19c2V0VGV4dHVyZUluZGV4KGEsCmMpe2EqPTQ7dGhpcy50ZXh0dXJlSW5kZXhEYXRhW2ErMF09Yzt0aGlzLnRleHR1cmVJbmRleERhdGFbYSsxXT1jO3RoaXMudGV4dHVyZUluZGV4RGF0YVthKzJdPWM7dGhpcy50ZXh0dXJlSW5kZXhEYXRhW2ErM109Yzt0aGlzLnRleHR1cmVJbmRleEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlVGV4dHVyZUluZGV4KGEpe3JldHVybiB0aGlzLmJhc2VUZXh0dXJlSW5kZXhEYXRhWzQqYV19c2V0QmFzZVRleHR1cmVJbmRleChhLGMpe2EqPTQ7dGhpcy5iYXNlVGV4dHVyZUluZGV4RGF0YVthKzBdPWM7dGhpcy5iYXNlVGV4dHVyZUluZGV4RGF0YVthKzFdPWM7dGhpcy5iYXNlVGV4dHVyZUluZGV4RGF0YVthKzJdPWM7dGhpcy5iYXNlVGV4dHVyZUluZGV4RGF0YVthKzNdPWM7dGhpcy5iYXNlVGV4dHVyZUluZGV4QXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldFRleHR1cmVUaW1lc3RhbXAoYSl7cmV0dXJuIHRoaXMudGV4dHVyZVRpbWVzdGFtcERhdGFbNCphXSt0aGlzLmNvbnN0cnVjdGlvblRpbWVzdGFtcH1zZXRUZXh0dXJlVGltZXN0YW1wKGEsCmMpe2EqPTQ7Yy09dGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXA7dGhpcy50ZXh0dXJlVGltZXN0YW1wRGF0YVthKzBdPWM7dGhpcy50ZXh0dXJlVGltZXN0YW1wRGF0YVthKzFdPWM7dGhpcy50ZXh0dXJlVGltZXN0YW1wRGF0YVthKzJdPWM7dGhpcy50ZXh0dXJlVGltZXN0YW1wRGF0YVthKzNdPWM7dGhpcy50ZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEJhc2VUZXh0dXJlVGltZXN0YW1wKGEpe3JldHVybiB0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wRGF0YVs0KmFdK3RoaXMuY29uc3RydWN0aW9uVGltZXN0YW1wfXNldEJhc2VUZXh0dXJlVGltZXN0YW1wKGEsYyl7YSo9NDtjLT10aGlzLmNvbnN0cnVjdGlvblRpbWVzdGFtcDt0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wRGF0YVthKzBdPWM7dGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcERhdGFbYSsxXT1jO3RoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBEYXRhW2ErMl09Yzt0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wRGF0YVthKwozXT1jO3RoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9cmViYXNlKGEsYyl7Yz12b2lkIDA9PT1jP3RoaXMudGltZTpjO2NvbnN0IGQ9dGhpcy5nZXRCYXNlVGltZXN0YW1wKGEpLGY9dGhpcy5nZXRUaW1lc3RhbXAoYSksZz1jPj1mPzE6Yzw9ZD8wOnRoaXMubWF0ZXJpYWwuYXBwbHlFYXNpbmcoKGMtZCkvKGYtZCkpLGw9KGssbSk9PmsqZyttKigxLWcpO3RoaXMuc2V0QmFzZVgoYSxsKHRoaXMuZ2V0WChhKSx0aGlzLmdldEJhc2VYKGEpKSk7dGhpcy5zZXRCYXNlWShhLGwodGhpcy5nZXRZKGEpLHRoaXMuZ2V0QmFzZVkoYSkpKTt0aGlzLnNldEJhc2VaKGEsbCh0aGlzLmdldFooYSksdGhpcy5nZXRCYXNlWihhKSkpO3RoaXMuc2V0QmFzZVIoYSxsKHRoaXMuZ2V0UihhKSx0aGlzLmdldEJhc2VSKGEpKSk7dGhpcy5zZXRCYXNlRyhhLGwodGhpcy5nZXRHKGEpLHRoaXMuZ2V0QmFzZUcoYSkpKTt0aGlzLnNldEJhc2VCKGEsbCh0aGlzLmdldEIoYSksCnRoaXMuZ2V0QmFzZUIoYSkpKTt0aGlzLnNldEJhc2VBKGEsbCh0aGlzLmdldEEoYSksdGhpcy5nZXRCYXNlQShhKSkpO3RoaXMuc2V0QmFzZU9wYWNpdHkoYSxsKHRoaXMuZ2V0T3BhY2l0eShhKSx0aGlzLmdldEJhc2VPcGFjaXR5KGEpKSk7Yz1jPj1mP2M6bChmLGQpO3RoaXMuc2V0QmFzZVRpbWVzdGFtcChhLGMpfXNldFNwcml0ZUltYWdlRGF0YShhLGMsZCl7dGhpcy5zcHJpdGVBdGxhcy5zZXRTcHJpdGVJbWFnZURhdGEoYSxjLGQpfXN3aXRjaFRleHR1cmVzKGEsYyxkKXtjb25zdCBmPXRoaXMuZ2V0VGV4dHVyZUluZGV4KGEpO3RoaXMuc2V0QmFzZVRleHR1cmVJbmRleChhLGYpO3RoaXMuc2V0VGV4dHVyZUluZGV4KGEsMD09PWY/MTowKTt0aGlzLnNldEJhc2VUZXh0dXJlVGltZXN0YW1wKGEsYyk7dGhpcy5zZXRUZXh0dXJlVGltZXN0YW1wKGEsZCl9ZmluZFNwcml0ZXMoYSxjKXtjb25zdCBkPVtdO2ZvcihsZXQgZj0wO2Y8dGhpcy5jYXBhY2l0eTtmKyspe2NvbnN0IGc9MTIqCmY7YT49dGhpcy5wb3NpdGlvbkRhdGFbZyswXSYmYTw9dGhpcy5wb3NpdGlvbkRhdGFbZys2XSYmYz49dGhpcy5wb3NpdGlvbkRhdGFbZysxXSYmYzw9dGhpcy5wb3NpdGlvbkRhdGFbZys3XSYmZC5wdXNoKGYpfXJldHVybiBkfX07Cjwvc2NyaXB0PgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1kaXZlL2xpYi93b3JkdHJlZS5qcwpjb25zdCBhbj0vXGJbLSdcd10rXGIvZztmdW5jdGlvbiBibihhKXtyZXR1cm5gJHt0eXBlb2YgYX1cdTAwMUYke2F9YH1mdW5jdGlvbiBjbihhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpLm1hdGNoKGFuKXx8W119CmZ1bmN0aW9uIGRuKGEpe2lmKDI+YS52YWx1ZUNvdW50KXJldHVybiBudWxsO2Zvcih2YXIgYz0oZyxsKT0+e2ZvcihsZXQgaz0wO2s8Zy5sZW5ndGg7aysrKWxbZ1trXV09ITB9LGQ9e30sZj1hO2Y7KWMoZi5jb21tb25Xb3JkcyxkKSxmPWYucGFyZW50O2ZvcihmPTA7ZjxhLmNoaWxkcmVuLmxlbmd0aDtmKyspYyhhLmNoaWxkcmVuW2ZdLmNvbW1vbldvcmRzLGQpO2M9e307Zm9yKGNvbnN0IGcgaW4gYS52YWx1ZUhhc2gpe2NvbnN0IHtjb3VudDpsLHdvcmRzOmt9PWEudmFsdWVIYXNoW2ddO2Zvcihjb25zdCBtIGluIGspbSBpbiBkfHwoY1ttXT0oY1ttXXx8MCkrbCxjW21dPT09YS50b3RhbENvdW50JiYoYS5jb21tb25Xb3Jkcy5wdXNoKG0pLGRbbV09ITAsZGVsZXRlIGNbbV0pKX1hPW51bGw7ZD0wO2Zvcihjb25zdCBnIGluIGMpY1tnXT5kJiYoYT1nLGQ9Y1tnXSk7cmV0dXJuIGF9CmZ1bmN0aW9uIGVuKGEpe3ZhciBjPXtwYXJlbnQ6bnVsbCxjb21tb25Xb3JkczpbXSxsZXZlbDoxLG9yZGVyOjAsdG90YWxDb3VudDowLHZhbHVlSGFzaDp7fSx2YWx1ZUNvdW50OjAsbm9uVmFsdWVDb3VudDowLGNoaWxkcmVuOltdfTtjb25zdCBkPXtyb290OmMsbm9kZUhhc2g6e30saGlnaGVzdExldmVsOjEsbGV2ZWxIYXNoOnsxOmN9fTtmb3IodmFyIGYgaW4gYSl7aWYoIWEuaGFzT3duUHJvcGVydHkoZikpY29udGludWU7Y29uc3Qge3ZhbHVlOnEsY291bnQ6cix3b3Jkczp0fT1hW2ZdOyJzdHJpbmciPT09dHlwZW9mIHE/KGMudmFsdWVIYXNoW2ZdPXt2YWx1ZTpxLGNvdW50OnIsd29yZHM6dH0sYy52YWx1ZUNvdW50Kz1yKTpjLm5vblZhbHVlQ291bnQrPXI7Yy50b3RhbENvdW50Kz1yO2Qubm9kZUhhc2hbZl09Y31hPWMubGV2ZWw7aWYoYy5ub25WYWx1ZUNvdW50KXthKys7Zj17cGFyZW50OmMsY29tbW9uV29yZHM6W10sbGV2ZWw6YSxvcmRlcjowLHRvdGFsQ291bnQ6Yy5ub25WYWx1ZUNvdW50LAp2YWx1ZUhhc2g6e30sdmFsdWVDb3VudDowLG5vblZhbHVlQ291bnQ6Yy5ub25WYWx1ZUNvdW50LGNoaWxkcmVuOltdfTtjLm5vblZhbHVlQ291bnQ9MDtjLmNoaWxkcmVuLnB1c2goZik7ZC5oaWdoZXN0TGV2ZWw9YTtkLmxldmVsSGFzaFthXT1mO2Zvcih2YXIgZyBpbiBkLm5vZGVIYXNoKWcgaW4gYy52YWx1ZUhhc2h8fChkLm5vZGVIYXNoW2ddPWYpfWM9W2NdO2ZvcihnPXE9PnEudmFsdWVDb3VudCtxLm5vblZhbHVlQ291bnQ7MTAwPmEmJmMubGVuZ3RoOyl7Zj0wO3ZhciBsPWcoY1tmXSk7Zm9yKHZhciBrPTE7azxjLmxlbmd0aDtrKyspe2NvbnN0IHE9ZyhjW2tdKTtxPmwmJihmPWssbD1xKX1sPWNbZl07aWYoaz1kbihsKSl7YSsrO2Y9e3BhcmVudDpsLGNvbW1vbldvcmRzOltrXSxsZXZlbDphLG9yZGVyOjAsdG90YWxDb3VudDowLHZhbHVlSGFzaDp7fSx2YWx1ZUNvdW50OjAsbm9uVmFsdWVDb3VudDowLGNoaWxkcmVuOltdfTtsLmNoaWxkcmVuLnB1c2goZik7Yy5wdXNoKGYpOwpmb3IoY29uc3QgcSBpbiBsLnZhbHVlSGFzaCl7aWYoIWwudmFsdWVIYXNoLmhhc093blByb3BlcnR5KHEpKWNvbnRpbnVlO2NvbnN0IHt2YWx1ZTpyLGNvdW50OnQsd29yZHM6dn09bC52YWx1ZUhhc2hbcV07diYmayBpbiB2JiYoZi52YWx1ZUhhc2hbcV09e3ZhbHVlOnIsY291bnQ6dCx3b3Jkczp2fSxmLnZhbHVlQ291bnQrPXQsZi50b3RhbENvdW50Kz10LGRlbGV0ZSBsLnZhbHVlSGFzaFtxXSxsLnZhbHVlQ291bnQtPXQsZC5ub2RlSGFzaFtxXT1mLGQuaGlnaGVzdExldmVsPWEsZC5sZXZlbEhhc2hbYV09Zil9fWVsc2UgYy5zcGxpY2UoZiwxKX1sZXQgbT0wO2NvbnN0IHA9cT0+e3Eub3JkZXI9KyttO2ZvcihsZXQgcj0wO3I8cS5jaGlsZHJlbi5sZW5ndGg7cisrKXAocS5jaGlsZHJlbltyXSl9O3AoZC5yb290KTtyZXR1cm4gZH07Cjwvc2NyaXB0PgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1kaXZlL2xpYi9zdGF0cy5qcwpmdW5jdGlvbiBmbihhKXtpZighYXx8IWEubGVuZ3RoKXJldHVybltdO2NvbnN0IGM9e307Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYVtkXSl7Y29uc3QgZj1PYmplY3Qua2V5cyhhW2RdKTtmb3IobGV0IGc9MDtnPGYubGVuZ3RoO2crKyljW2ZbZ11dPSEwfXJldHVybiBPYmplY3Qua2V5cyhjKX1jb25zdCBnbj1hPT4ibnVtYmVyIj09PXR5cGVvZiBhJiZhPj4wPT09YTsKY2xhc3MgaG57Y29uc3RydWN0b3IoKXt0aGlzLnVuaXF1ZUNvdW50PXRoaXMudG90YWxDb3VudD0wO3RoaXMudmFsdWVIYXNoPXt9O3RoaXMub3RoZXJDb3VudD10aGlzLnN0cmluZ0NvdW50PXRoaXMuaW50ZWdlckNvdW50PXRoaXMubnVtYmVyQ291bnQ9MDt0aGlzLnN0cmluZ0xlbmd0aHNDb3VudD10aGlzLnN0cmluZ01lYW5MZW5ndGg9dGhpcy5zdHJpbmdNYXhMZW5ndGg9dGhpcy5zdHJpbmdNaW5MZW5ndGg9dGhpcy5udW1iZXJNYXg9dGhpcy5udW1iZXJNaW49bnVsbDt0aGlzLnN0cmluZ0xlbmd0aHNIYXNoPXt9O3RoaXMudG90YWxXb3JkQ291bnQ9dGhpcy5tdWx0aXdvcmRDb3VudD0wO3RoaXMud29yZENvdW50cz17fTt0aGlzLnVuaXF1ZVdvcmRDb3VudD0wO3RoaXMud29yZFRyZWU9bnVsbH1pc051bWVyaWMoKXtyZXR1cm4gMDx0aGlzLm51bWJlckNvdW50JiZudWxsIT09dGhpcy5udW1iZXJNaW4mJm51bGwhPT10aGlzLm51bWJlck1heCYmdGhpcy5udW1iZXJNYXg+dGhpcy5udW1iZXJNaW59aXNJbnRlZ2VyKCl7cmV0dXJuIDA8CnRoaXMubnVtYmVyQ291bnQmJnRoaXMuaW50ZWdlckNvdW50PT09dGhpcy5udW1iZXJDb3VudH1hZGRWYWx1ZShhKXt0aGlzLnRvdGFsQ291bnQrKztjb25zdCBjPWJuKGEpO2MgaW4gdGhpcy52YWx1ZUhhc2h8fCh0aGlzLnZhbHVlSGFzaFtjXT17dmFsdWU6YSxjb3VudDowfSx0aGlzLnVuaXF1ZUNvdW50KyspO3RoaXMudmFsdWVIYXNoW2NdLmNvdW50Kys7c3dpdGNoKHR5cGVvZiBhKXtjYXNlICJudW1iZXIiOnRoaXMuaW5jb3Jwb3JhdGVOdW1iZXJWYWx1ZShhKTticmVhaztjYXNlICJzdHJpbmciOnRoaXMuaW5jb3Jwb3JhdGVTdHJpbmdWYWx1ZShjLGEpO2JyZWFrO2RlZmF1bHQ6dGhpcy5vdGhlckNvdW50Kyt9fWluY29ycG9yYXRlTnVtYmVyVmFsdWUoYSl7dGhpcy5udW1iZXJDb3VudCsrO2duKGEpJiZ0aGlzLmludGVnZXJDb3VudCsrO2lzTmFOKGEpfHwodGhpcy5udW1iZXJNaW49bnVsbD09PXRoaXMubnVtYmVyTWluP2E6TWF0aC5taW4odGhpcy5udW1iZXJNaW4sYSksdGhpcy5udW1iZXJNYXg9Cm51bGw9PT10aGlzLm51bWJlck1heD9hOk1hdGgubWF4KHRoaXMubnVtYmVyTWF4LGEpKX1pbmNvcnBvcmF0ZVN0cmluZ1ZhbHVlKGEsYyl7dGhpcy5zdHJpbmdDb3VudCsrO3ZhciBkPWMubGVuZ3RoO2QgaW4gdGhpcy5zdHJpbmdMZW5ndGhzSGFzaHx8KHRoaXMuc3RyaW5nTGVuZ3Roc0NvdW50PSh0aGlzLnN0cmluZ0xlbmd0aHNDb3VudHx8MCkrMSk7dGhpcy5zdHJpbmdMZW5ndGhzSGFzaFtkXT0odGhpcy5zdHJpbmdMZW5ndGhzSGFzaFtkXXx8MCkrMTt0aGlzLnN0cmluZ01pbkxlbmd0aD1udWxsPT09dGhpcy5zdHJpbmdNaW5MZW5ndGg/ZDpNYXRoLm1pbih0aGlzLnN0cmluZ01pbkxlbmd0aCxkKTt0aGlzLnN0cmluZ01heExlbmd0aD1udWxsPT09dGhpcy5zdHJpbmdNYXhMZW5ndGg/ZDpNYXRoLm1heCh0aGlzLnN0cmluZ01heExlbmd0aCxkKTt0aGlzLnN0cmluZ01lYW5MZW5ndGg9KHRoaXMuc3RyaW5nTWVhbkxlbmd0aHx8MCkqKHRoaXMuc3RyaW5nQ291bnQtMSkvdGhpcy5zdHJpbmdDb3VudCsKZC90aGlzLnN0cmluZ0NvdW50O2lmKCF0aGlzLnZhbHVlSGFzaFthXS53b3Jkcyl7Yz1jbihjLnRvTG93ZXJDYXNlKCkpOzE8Yy5sZW5ndGgmJih0aGlzLm11bHRpd29yZENvdW50KyssdGhpcy50b3RhbFdvcmRDb3VudCs9Yy5sZW5ndGgpO2Q9dGhpcy52YWx1ZUhhc2hbYV0ud29yZHM9e307Zm9yKGxldCBmPTA7ZjxjLmxlbmd0aDtmKyspe2NvbnN0IGc9Y1tmXTtkW2ddPShkW2ddfHwwKSsxO2cgaW4gdGhpcy53b3JkQ291bnRzfHwodGhpcy53b3JkQ291bnRzW2ddPTAsdGhpcy51bmlxdWVXb3JkQ291bnQrKyl9fWE9dGhpcy52YWx1ZUhhc2hbYV0ud29yZHM7Zm9yKGNvbnN0IGYgaW4gYSl0aGlzLndvcmRDb3VudHNbZl09KHRoaXMud29yZENvdW50c1tmXXx8MCkrMX19CmZ1bmN0aW9uIGpuKGEpe2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJue307Y29uc3QgYz17fTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZj1hW2RdO2lmKG51bGw9PWYpY29udGludWU7Y29uc3QgZz1PYmplY3Qua2V5cyhmKTtmb3IobGV0IGw9MDtsPGcubGVuZ3RoO2wrKyl7Y29uc3Qgaz1nW2xdLG09ZltrXTtrIGluIGN8fChjW2tdPW5ldyBobik7Y1trXS5hZGRWYWx1ZShtKX19Zm9yKGNvbnN0IGQgaW4gYylhPWNbZF0sYS5tdWx0aXdvcmRDb3VudCYmKGEud29yZFRyZWU9ZW4oYS52YWx1ZUhhc2gpKTtyZXR1cm4gY307Cjwvc2NyaXB0PgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1kaXZlL2xpYi9zdHJpbmctZm9ybWF0LmpzCmZ1bmN0aW9uIGtuKGEpe3JldHVybiBhLnJlcGxhY2UoLyhbXFdfXSkvZywiJDFcdTIwMGIiKX1mdW5jdGlvbiBsbihhKXtyZXR1cm4gNjU+YS5sZW5ndGg/YTphLnN1YnN0cigwLDMwKSsiLi4uIithLnN1YnN0cigtMzApfTsKPC9zY3JpcHQ+CgoKCgo8ZG9tLW1vZHVsZSBpZD0iZmFjZXRzLWRpdmUtdmlzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAubGFiZWxzIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtaGVhZGxpbmU7CiAgICAgIH0KICAgICAgLnJvdGF0ZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMS41LCAwLjU7CiAgICAgICAgYW5pbWF0aW9uOiByb3RhdGUgMXMgbGluZWFyIGluZmluaXRlOwogICAgICB9CiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHsKICAgICAgICBmcm9tIHsKICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwOwogICAgICAgIH0KICAgICAgICB0byB7CiAgICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogMjsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGlkPSJob2xkZXIiPgogICAgICAKICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9mYWNldHMtZGl2ZS9jb21wb25lbnRzL2ZhY2V0cy1kaXZlLXZpcy9mYWNldHMtZGl2ZS12aXMuanMKLyoKCiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLgoKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoqLwpjb25zdCBtbj17Ym90dG9tOjYsbGVmdDo2LHJpZ2h0OjYsdG9wOjZ9LG5uPXsiXHVmZmZjT1RIRVJcdWZmZmMiOiJvdGhlciIsIlx1ZmZmY05PX1dPUkRTXHVmZmZjIjoibm9uLXdvcmRzIiwiXHVmZmZjQUxMX1dPUkRTXHVmZmZjIjoib3RoZXIifSxvbj1hPT5udWxsIT09YSYmYSBpbiBubj97bGFiZWw6bm5bYV0sc3BlY2lhbDohMH06Im51bWJlciIhPT10eXBlb2YgYSYmInN0cmluZyIhPT10eXBlb2YgYT97bGFiZWw6IiIrYSxzcGVjaWFsOiEwfTp7bGFiZWw6bG4oIiIrYSksc3BlY2lhbDohMX0scG49IiM0Mjg1RjQgI0RCNDQzNyAjRjRCNDAwICMwRjlENTggI0FCNDdCQyAjMDBBQ0MxICNGRjcwNDMgIzlFOUQyNCAjNUM2QkMwICNGMDYyOTIgIzAwNzk2QiAjQzIxODVCIi5zcGxpdCgiICIpLHFuPSIjNDI4NUY0ICMwRjlENTggIzAwQUNDMSAjOUU5RDI0ICM1QzZCQzAgIzAwNzk2QiAjNjA3RDhCIi5zcGxpdCgiICIpLHJuPSIjREI0NDM3ICNGNEI0MDAgI0FCNDdCQyAjRjA2MjkyICNBQjQ3QkMgIzc5NTU0OCAjRkY3MDQzICNDMjE4NUIiLnNwbGl0KCIgIiksCnNuPSIjNDI4NUY0ICNDNTM5MjkgI0Y3Q0I0RCAjMEI4MDQzICM1RTM1QjEgIzgwREVFQSAjRkY3MDQzICNDMENBMzMiLnNwbGl0KCIgIiksdG49eyJhbGlnbm1lbnQtYmFzZWxpbmUiOiJtaWRkbGUiLGZpbGw6IiM0NDQ0NDQiLCJmb250LXNpemUiOjE4LCJmb250LXN0eWxlIjoibm9ybWFsIiwidGV4dC1hbmNob3IiOiJtaWRkbGUiLHg6MCx5OjB9O2NsYXNzIHVuIGV4dGVuZHMgSG17fQpjbGFzcyB2bntjb25zdHJ1Y3RvcihhKXt0aGlzLmVsZW09YTt0aGlzLmVuZFRpbWVzdGFtcD0wO3RoaXMucmVuZGVyUXVldWVkPSExO3RoaXMubGFiZWxzPVtdO3RoaXMuYXV0b0NvbG9yQnk9ITE7dGhpcy5ob3Jpem9udGFsRmFjZXRJbmZvPXRoaXMudmVydGljYWxGYWNldEluZm89bnVsbH1yZWFkeSgpe3RoaXMubGF5b3V0PW5ldyBTbTt0aGlzLmhvbGRlcj10aGlzLmVsZW0uJC5ob2xkZXI7dGhpcy5lbGVtLnNjb3BlU3VidHJlZSh0aGlzLmhvbGRlciwhMCk7dGhpcy5jZWxsQmFja2dyb3VuZFNWRz1kMy5zZWxlY3QodGhpcy5ob2xkZXIpLmFwcGVuZCgic3ZnIikuc3R5bGUoImxlZnQiLDApLnN0eWxlKCJwb3NpdGlvbiIsImFic29sdXRlIikuc3R5bGUoInRvcCIsMCk7dGhpcy5jZWxsQmFja2dyb3VuZFNWR1Jvb3Q9dGhpcy5jZWxsQmFja2dyb3VuZFNWRy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInJvb3QiKTt0aGlzLmNlbGxCYWNrZ3JvdW5kTGF5ZXI9dGhpcy5jZWxsQmFja2dyb3VuZFNWR1Jvb3QuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLAoibGFiZWxzIik7dGhpcy5zY2VuZT1uZXcgVEhSRUUuU2NlbmU7dGhpcy5jYW1lcmE9bmV3IFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSgwLDEwMCwwLDEwMCwuMSwxRTMpO3RyeXt0aGlzLnJlbmRlcmVyPW5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHthbHBoYTohMH0pLHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbygpLGQzLnNlbGVjdCh0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQpLnN0eWxlKCJsZWZ0IiwwKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc3R5bGUoInBvc2l0aW9uIiwiYWJzb2x1dGUiKS5zdHlsZSgidG9wIiwwKSx0aGlzLmhvbGRlci5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQpfWNhdGNoKGEpe310aGlzLnpvb209ZDMuem9vbSgpLnNjYWxlRXh0ZW50KFsxLDUwMF0pLm9uKCJ6b29tIix0aGlzLnpvb21lZC5iaW5kKHRoaXMpKTtkMy5zZWxlY3QodGhpcy5lbGVtKS5jYWxsKHRoaXMuem9vbSk7dGhpcy5sYWJlbHNBbmRBeGVzU1ZHPQpkMy5zZWxlY3QodGhpcy5ob2xkZXIpLmFwcGVuZCgic3ZnIikuc3R5bGUoImxlZnQiLDApLnN0eWxlKCJwb3NpdGlvbiIsImFic29sdXRlIikuc3R5bGUoInRvcCIsMCk7dGhpcy5sYWJlbHNBbmRBeGVzU1ZHUm9vdD10aGlzLmxhYmVsc0FuZEF4ZXNTVkcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJyb290Iik7dGhpcy5sYWJlbHNMYXllcj10aGlzLmxhYmVsc0FuZEF4ZXNTVkdSb290LmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWxzIik7dGhpcy5heGVzTGF5ZXI9dGhpcy5sYWJlbHNBbmRBeGVzU1ZHUm9vdC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImF4ZXMiKTt0aGlzLmNvbXBhcmVkTGF5ZXI9dGhpcy5sYWJlbHNBbmRBeGVzU1ZHUm9vdC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImNvbXBhcmVkYm94ZXMiKTt0aGlzLnNlbGVjdGVkTGF5ZXI9dGhpcy5sYWJlbHNBbmRBeGVzU1ZHUm9vdC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInNlbGVjdGVkYm94ZXMiKTsKdGhpcy5sYWJlbHNBbmRBeGVzU1ZHLm9uKCJjbGljayIsdGhpcy5jbGlja2VkLmJpbmQodGhpcykpO3RoaXMucmVuZGVyZXJ8fCh0aGlzLmxhYmVsc0FuZEF4ZXNTVkcuc3R5bGUoImRpc3BsYXkiLCJub25lIiksdGhpcy5jZWxsQmFja2dyb3VuZFNWRy5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKSxkMy5zZWxlY3QodGhpcy5ob2xkZXIpLmFwcGVuZCgicCIpLmF0dHIoImNsYXNzIiwiZXJyb3IiKS5zdHlsZSgiY29sb3IiLCJkYXJrcmVkIikuaHRtbCgnXG4gICAgICAgICAgICBceDNjc3Ryb25nXHgzZUVSUk9SXHgzYy9zdHJvbmdceDNlOiBGYWNldHMgRGl2ZSByZXF1aXJlcyBXZWJHTCwgYW5kIGl0IGlzIG5vdFxuICAgICAgICAgICAgZW5hYmxlZCBpbiB5b3VyIGJyb3dzZXIuIFNlZVxuICAgICAgICAgICAgXHgzY2EgcmVsXHgzZCJub3JlZmVycmVyIiBocmVmXHgzZCJodHRwOi8vd2ViZ2xyZXBvcnQuY29tLyJceDNlXG4gICAgICAgICAgICBXZWJHTCBSZXBvcnRceDNjL2FceDNlIGZvciBkZXRhaWxzLlxuICAgICAgICAgICcpKX16b29tZWQoKXtjb25zdCB7eDphLAp5OmMsazpkfT1kMy5ldmVudC50cmFuc2Zvcm0sZj10aGlzLnNjYWxlL2Q7dGhpcy5jYW1lcmEudG9wKj1mO3RoaXMuY2FtZXJhLmxlZnQqPWY7dGhpcy5jYW1lcmEucmlnaHQqPWY7dGhpcy5jYW1lcmEuYm90dG9tKj1mO3RoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgtYS9kLGMvZCx0aGlzLmNhbWVyYS5wb3NpdGlvbi56KTt0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5zY2FsZT1kO3RoaXMudHJhbnNmb3JtU1ZHKCk7dGhpcy51cGRhdGVPYmplY3RWaXNpYmlsaXR5KCk7dGhpcy5xdWV1ZVJlbmRlclNjZW5lKCl9Y2xpY2tlZCgpe3ZhciBhPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPWQzLmV2ZW50O2E9dGhpcy5zcHJpdGVNZXNoLmZpbmRTcHJpdGVzKHRoaXMuY2FtZXJhLnBvc2l0aW9uLngrKGMuY2xpZW50WC1hLmxlZnQpL3RoaXMuc2NhbGUsdGhpcy5jYW1lcmEucG9zaXRpb24ueS0oYy5jbGllbnRZLWEudG9wKS90aGlzLnNjYWxlKTsKdmFyIGQ9e307aWYoYy5jdHJsS2V5KWZvcihjPTA7Yzx0aGlzLmVsZW0uc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDtjKyspZFt0aGlzLmVsZW0uc2VsZWN0ZWRJbmRpY2VzW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV09ITA7dGhpcy5lbGVtLnNldCgic2VsZWN0ZWRJbmRpY2VzIixBcnJheS5mcm9tKE9iamVjdC5rZXlzKGQpLm1hcChmPT4rZikpKTthPVtdO2ZvcihkPTA7ZDx0aGlzLmVsZW0uc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDtkKyspYS5wdXNoKHRoaXMuZWxlbS5kYXRhW3RoaXMuZWxlbS5zZWxlY3RlZEluZGljZXNbZF1dKTt0aGlzLmVsZW0uc2V0KCJzZWxlY3RlZERhdGEiLGEpfXNlbGVjdGVkSW5kaWNlc1VwZGF0ZWQoKXt0aGlzLnNwcml0ZU1lc2gmJnRoaXMudXBkYXRlU2VsZWN0ZWRCb3hlcygpfWNvbXBhcmVkSW5kaWNlc1VwZGF0ZWQoKXtpZih0aGlzLnNwcml0ZU1lc2gpe3ZhciBhPVtdO2ZvcihsZXQgYz0wO2M8dGhpcy5lbGVtLmNvbXBhcmVkSW5kaWNlcy5sZW5ndGg7YysrKWEucHVzaCh0aGlzLmVsZW0uZGF0YVt0aGlzLmVsZW0uY29tcGFyZWRJbmRpY2VzW2NdXSk7CnRoaXMuZWxlbS5zZXQoImNvbXBhcmVkRGF0YSIsYSk7dGhpcy51cGRhdGVDb21wYXJlZEJveGVzKCl9fXVwZGF0ZVNlbGVjdGVkQm94ZXMoKXt2YXIgYT10aGlzLmVsZW0uc2VsZWN0ZWRJbmRpY2VzLm1hcChkPT4oe3g6dGhpcy5zcHJpdGVNZXNoLmdldFgoZCkseTp0aGlzLnNwcml0ZU1lc2guZ2V0WShkKX0pKTthPXRoaXMuc2VsZWN0ZWRMYXllci5zZWxlY3RBbGwoIi5zZWxlY3RlZCIpLmRhdGEoYSk7dmFyIGM9YS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInNlbGVjdGVkIiwhMCkuYXR0cigidHJhbnNmb3JtIixkPT5gdHJhbnNsYXRlKCR7LjUrKGQueHx8MCl9LCR7LjUrKGQueXx8MCl9KSBzY2FsZSgkezN9KWApLnN0eWxlKCJvcGFjaXR5IiwwKTtjLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0uNSkuYXR0cigieSIsLS41KS5hdHRyKCJ3aWR0aCIsMSkuYXR0cigiaGVpZ2h0IiwxKS5hdHRyKCJzdHJva2UiLCIjNDgzZDA2IikuYXR0cigic3Ryb2tlLWxpbmVjYXAiLAoicm91bmQiKS5hdHRyKCJzdHJva2UtbGluZWpvaW4iLCJyb3VuZCIpLmF0dHIoInN0cm9rZS1vcGFjaXR5IiwwKS5hdHRyKCJzdHJva2Utd2lkdGgiLC4zKS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApO2MuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLS41KS5hdHRyKCJ5IiwtLjUpLmF0dHIoIndpZHRoIiwxKS5hdHRyKCJoZWlnaHQiLDEpLmF0dHIoInN0cm9rZSIsIiNmYWQ0MTEiKS5hdHRyKCJzdHJva2UtbGluZWNhcCIsInJvdW5kIikuYXR0cigic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMCkuYXR0cigic3Ryb2tlLXdpZHRoIiwuMTUpLmF0dHIoImZpbGwtb3BhY2l0eSIsMCk7Yz1jLm1lcmdlKGEpO2MudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsZD0+YHRyYW5zbGF0ZSgkey41KyhkLnh8fDApfSwkey41KyhkLnl8fDApfSkgc2NhbGUoJHsuOH0pYCkuc3R5bGUoIm9wYWNpdHkiLDEpO2Muc2VsZWN0QWxsKCJyZWN0IikuY2xhc3NlZCgicm90YXRlIiwKITApLmF0dHIoInN0cm9rZS1vcGFjaXR5IiwxKTthLmV4aXQoKS50cmFuc2l0aW9uKCkuc3R5bGUoIm9wYWNpdHkiLDApLnJlbW92ZSgpfXVwZGF0ZUNvbXBhcmVkQm94ZXMoKXt2YXIgYT10aGlzLmVsZW0uY29tcGFyZWRJbmRpY2VzLm1hcChkPT4oe3g6dGhpcy5zcHJpdGVNZXNoLmdldFgoZCkseTp0aGlzLnNwcml0ZU1lc2guZ2V0WShkKX0pKTthPXRoaXMuY29tcGFyZWRMYXllci5zZWxlY3RBbGwoIi5jb21wYXJlZCIpLmRhdGEoYSk7dmFyIGM9YS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImNvbXBhcmVkIiwhMCkuYXR0cigidHJhbnNmb3JtIixkPT5gdHJhbnNsYXRlKCR7LjUrKGQueHx8MCl9LCR7LjUrKGQueXx8MCl9KSBzY2FsZSgkezN9KWApLnN0eWxlKCJvcGFjaXR5IiwwKTtjLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0uNSkuYXR0cigieSIsLS41KS5hdHRyKCJ3aWR0aCIsMSkuYXR0cigiaGVpZ2h0IiwxKS5hdHRyKCJzdHJva2UiLCIjNDRmZjQ0IikuYXR0cigic3Ryb2tlLWxpbmVjYXAiLAoicm91bmQiKS5hdHRyKCJzdHJva2UtbGluZWpvaW4iLCJyb3VuZCIpLmF0dHIoInN0cm9rZS1vcGFjaXR5IiwwKS5hdHRyKCJzdHJva2Utd2lkdGgiLC4zKS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApO2MuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLS41KS5hdHRyKCJ5IiwtLjUpLmF0dHIoIndpZHRoIiwxKS5hdHRyKCJoZWlnaHQiLDEpLmF0dHIoInN0cm9rZSIsIiMxZDZiMWQiKS5hdHRyKCJzdHJva2UtbGluZWNhcCIsInJvdW5kIikuYXR0cigic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMCkuYXR0cigic3Ryb2tlLXdpZHRoIiwuMTUpLmF0dHIoImZpbGwtb3BhY2l0eSIsMCk7Yz1jLm1lcmdlKGEpO2MudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsZD0+YHRyYW5zbGF0ZSgkey41KyhkLnh8fDApfSwkey41KyhkLnl8fDApfSkgc2NhbGUoJHsuOH0pYCkuc3R5bGUoIm9wYWNpdHkiLDEpO2Muc2VsZWN0QWxsKCJyZWN0IikuY2xhc3NlZCgicm90YXRlIiwKITApLmF0dHIoInN0cm9rZS1vcGFjaXR5IiwxKTthLmV4aXQoKS50cmFuc2l0aW9uKCkuc3R5bGUoIm9wYWNpdHkiLDApLnJlbW92ZSgpfWZpdFRvVmlld3BvcnQoKXtjb25zdCBhPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihhLndpZHRoJiZhLmhlaWdodCl7dGhpcy5sYXlvdXQudmlld3BvcnQud2lkdGg9YS53aWR0aDt0aGlzLmxheW91dC52aWV3cG9ydC5oZWlnaHQ9YS5oZWlnaHQ7dGhpcy5sYXlvdXQucGFkZGluZy5ib3R0b209dGhpcy5lbGVtLnNjZW5lUGFkZGluZzt0aGlzLmxheW91dC5wYWRkaW5nLmxlZnQ9dGhpcy5lbGVtLnNjZW5lUGFkZGluZzt0aGlzLmxheW91dC5wYWRkaW5nLnJpZ2h0PXRoaXMuZWxlbS5zY2VuZVBhZGRpbmc7dGhpcy5sYXlvdXQucGFkZGluZy50b3A9dGhpcy5lbGVtLnNjZW5lUGFkZGluZzt0aGlzLmxheW91dC5ncmlkPXtib3R0b206MCxsZWZ0OjAscmlnaHQ6dGhpcy5ncmlkLndpZHRoLHRvcDp0aGlzLmdyaWQuaGVpZ2h0fTsKaWYodGhpcy5sYWJlbHMubGVuZ3RoKXt2YXIgYz0wLGQ9MCxmPTAsZz0wO3RoaXMubGFiZWxzTGF5ZXIuc2VsZWN0QWxsKCIubGFiZWwiKS5lYWNoKGZ1bmN0aW9uKG0pe3ZhciBwPWQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoIi5jdXJyZW50Iikubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IHE9bS5lbGVtZW50TWFyZ2lufHx7Ym90dG9tOjAsbGVmdDowLHJpZ2h0OjAsdG9wOjB9LHI9cC5oZWlnaHQrcS50b3ArcS5ib3R0b207cD1wLndpZHRoK3EubGVmdCtxLnJpZ2h0O3N3aXRjaChtLnNpZGUpe2Nhc2UgR20uQm90dG9tOmM9TWF0aC5tYXgoYyxyKTticmVhaztjYXNlIEdtLlRvcDpnPU1hdGgubWF4KGcscik7YnJlYWs7Y2FzZSBHbS5MZWZ0OmQ9TWF0aC5tYXgoZCxwKTticmVhaztjYXNlIEdtLlJpZ2h0OmY9TWF0aC5tYXgoZixwKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgU2lkZS4iKTt9fSk7dGhpcy5sYXlvdXQucGFkZGluZy5ib3R0b20rPQpjO3RoaXMubGF5b3V0LnBhZGRpbmcubGVmdCs9ZDt0aGlzLmxheW91dC5wYWRkaW5nLnJpZ2h0Kz1mO3RoaXMubGF5b3V0LnBhZGRpbmcudG9wKz1nfXRoaXMubGF5b3V0LnJlZHVjZVBhZGRpbmdUb0ZpdFdpZHRoKGEud2lkdGgpO3RoaXMubGF5b3V0LnJlZHVjZVBhZGRpbmdUb0ZpdEhlaWdodChhLmhlaWdodCk7dGhpcy5zY2FsZT10aGlzLmxheW91dC5jb21wdXRlU2NhbGUoKTt2YXIge3Bvc2l0aW9uOmwsZnJ1c3R1bTprfT10aGlzLmxheW91dC5jb21wdXRlQ2FtZXJhKCk7dGhpcy5jYW1lcmEubGVmdD1rLmxlZnQ7dGhpcy5jYW1lcmEucmlnaHQ9ay5yaWdodDt0aGlzLmNhbWVyYS50b3A9ay50b3A7dGhpcy5jYW1lcmEuYm90dG9tPWsuYm90dG9tO3RoaXMuY2FtZXJhLnBvc2l0aW9uLnNldChsLngsbC55LDEwMCk7dGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO2QzLnNlbGVjdCh0aGlzLmVsZW0pLmNhbGwodGhpcy56b29tLnRyYW5zZm9ybSxkMy56b29tSWRlbnRpdHkuc2NhbGUodGhpcy5zY2FsZSkudHJhbnNsYXRlKC10aGlzLmNhbWVyYS5wb3NpdGlvbi54LAp0aGlzLmNhbWVyYS5wb3NpdGlvbi55KSk7dGhpcy50cmFuc2Zvcm1TVkcoKTt0aGlzLnVwZGF0ZU9iamVjdFZpc2liaWxpdHkoKTt0aGlzLnF1ZXVlUmVuZGVyU2NlbmUoKX1lbHNlIHNldFRpbWVvdXQoKCk9PnRoaXMuZml0VG9WaWV3cG9ydCgpLDEwMCl9em9vbUluKCl7dGhpcy56b29tLnNjYWxlQnkoZDMuc2VsZWN0KHRoaXMuZWxlbSksMS4xKX16b29tT3V0KCl7dGhpcy56b29tLnNjYWxlQnkoZDMuc2VsZWN0KHRoaXMuZWxlbSksMS8xLjEpfXRyYW5zZm9ybVNWRygpe2NvbnN0IGE9LXRoaXMuY2FtZXJhLnBvc2l0aW9uLngqdGhpcy5zY2FsZSxjPXRoaXMuY2FtZXJhLnBvc2l0aW9uLnkqdGhpcy5zY2FsZTt0aGlzLmNlbGxCYWNrZ3JvdW5kU1ZHUm9vdC5hdHRyKCJ0cmFuc2Zvcm0iLGB0cmFuc2xhdGUoJHthfSwke2N9KSBzY2FsZSgke3RoaXMuc2NhbGV9LCR7LXRoaXMuc2NhbGV9KWApO3RoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3QuYXR0cigidHJhbnNmb3JtIixgdHJhbnNsYXRlKCR7YX0sJHtjfSkgc2NhbGUoJHt0aGlzLnNjYWxlfSwkey10aGlzLnNjYWxlfSlgKTsKdGhpcy5sYWJlbHNBbmRBeGVzU1ZHUm9vdC5zZWxlY3RBbGwoIi51bnNjYWxlIikuYXR0cigidHJhbnNmb3JtIixgc2NhbGUoJHsxL3RoaXMuc2NhbGV9KWApO3RoaXMuYXhlc0xheWVyLnNlbGVjdEFsbCgiLmF4aXMiKS5zZWxlY3QoInBhdGgiKS5hdHRyKCJkIixkPT5kLnBhdGgodGhpcy5zY2FsZSkpLmF0dHIoInN0cm9rZS13aWR0aCIsZD0+ZC5zdHJva2VXaWR0aCh0aGlzLnNjYWxlKSl9aXNWaXNpYmxlKGEsYyl7cmV0dXJuIGEuc2hvdWxkQmVWaXNpYmxlKGMsdGhpcy5zY2FsZSx0aGlzLmNhbWVyYS5wb3NpdGlvbix0aGlzLmNhbWVyYSl9dXBkYXRlT2JqZWN0VmlzaWJpbGl0eSgpe2NvbnN0IGE9dGhpczt2YXIgYz10aGlzLmxhYmVsc0xheWVyLnNlbGVjdEFsbCgiLmxhYmVsIik7Y29uc3QgZD1jLmZpbHRlcihmdW5jdGlvbihnKXtyZXR1cm4odm9pZCAwPT09Zy52aXNpYmxlfHwhZy52aXNpYmxlKSYmYS5pc1Zpc2libGUoZyx0aGlzKX0pLmVhY2goZz0+Zy52aXNpYmxlPSEwKSwKZj1jLmZpbHRlcihmdW5jdGlvbihnKXtyZXR1cm4odm9pZCAwPT09Zy52aXNpYmxlfHxnLnZpc2libGUpJiYhYS5pc1Zpc2libGUoZyx0aGlzKX0pLmVhY2goZz0+Zy52aXNpYmxlPSExKTtkLnNlbGVjdEFsbCgiLm9wYWNpdHkiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoIm9wYWNpdHkiLDEpO2Yuc2VsZWN0QWxsKCIub3BhY2l0eSIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikuYXR0cigib3BhY2l0eSIsMCk7Yy5maWx0ZXIoZz0+ISFnLnNjYWxlRG93bikuc2VsZWN0QWxsKCIuc2NhbGUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGc9PmBzY2FsZSgke3RoaXMuc2NhbGU8Zy5taW5TY2FsZT90aGlzLnNjYWxlL2cubWluU2NhbGU6MX0pYCk7Yz10aGlzLmF4ZXNMYXllci5zZWxlY3RBbGwoIi5heGlzIikuZWFjaChmdW5jdGlvbihnKXtnLnZpc2libGU9YS5pc1Zpc2libGUoZyx0aGlzKX0pO2MuZmlsdGVyKGc9PgohIWcudmlzaWJsZSkuc2VsZWN0KCJwYXRoIikudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMSk7Yy5maWx0ZXIoZz0+IWcudmlzaWJsZSkuc2VsZWN0KCJwYXRoIikudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMCl9YWRkVmVydGljYWxGYWNldExhYmVscyhhKXt0aGlzLmVsZW0udmVydGljYWxGYWNldCBpbiB0aGlzLnN0YXRzJiZ0aGlzLmdyaWQuZ2V0Q29sdW1uKHRoaXMuZ3JpZC5ob3Jpem9udGFsS2V5c1t0aGlzLmdyaWQuaG9yaXpvbnRhbEtleXMubGVuZ3RoLTFdKS5mb3JFYWNoKGM9Pntjb25zdCBkPXRoaXMudmVydGljYWxGYWNldEluZm8ubGFiZWxpbmdGdW5jdGlvbihjLnZlcnRpY2FsS2V5KSxmPW5ldyB1bjtmLnRleHQ9ZC5sYWJlbDtmLng9Yy54K2Mud2lkdGg7Zi55PWMuY29udGVudFkrYy5pbm5lckhlaWdodC8KMjtmLnNpZGU9R20uUmlnaHQ7Zi5jZWxsPWM7Zi5hdHRyaWJ1dGVzPXsiYWxpZ25tZW50LWJhc2VsaW5lIjoibWlkZGxlIixmaWxsOiIjNjY2NjY2IiwiZm9udC1zaXplIjp0blsiZm9udC1zaXplIl0sInRleHQtYW5jaG9yIjoic3RhcnQiLCJmb250LXN0eWxlIjpkLnNwZWNpYWw/Iml0YWxpYyI6Im5vcm1hbCJ9O2Yub2Zmc2V0UG9zaXRpb249e3g6OH07Zi5taW5TY2FsZT10blsiZm9udC1zaXplIl0vKGMuaGVpZ2h0K3RoaXMuZ3JpZC5jZWxsTWFyZ2luKTtmLnNjYWxlRG93bj0hMDthLnB1c2goZil9KX1hZGRIb3Jpem9udGFsRmFjZXRMYWJlbHMoYSl7dGhpcy5lbGVtLmhvcml6b250YWxGYWNldCBpbiB0aGlzLnN0YXRzJiZ0aGlzLmdyaWQuZ2V0Um93KHRoaXMuZ3JpZC52ZXJ0aWNhbEtleXNbdGhpcy5ncmlkLnZlcnRpY2FsS2V5cy5sZW5ndGgtMV0pLmZvckVhY2goYz0+e2NvbnN0IGQ9dGhpcy5ob3Jpem9udGFsRmFjZXRJbmZvLmxhYmVsaW5nRnVuY3Rpb24oYy5ob3Jpem9udGFsS2V5KSwKZj1uZXcgdW47Zi50ZXh0PWQubGFiZWw7Zi54PWMuY29udGVudFgrYy5pbm5lcldpZHRoLzI7Zi55PWMueStjLmhlaWdodDtmLnNpZGU9R20uVG9wO2YuY2VsbD1jO2Yucm90YXRlPS00NTtmLmF0dHJpYnV0ZXM9eyJhbGlnbm1lbnQtYmFzZWxpbmUiOiJpZGVvZ3JhcGhpYyIsZmlsbDoiI2RkNjYyMiIsImZvbnQtc2l6ZSI6dG5bImZvbnQtc2l6ZSJdLCJ0ZXh0LWFuY2hvciI6InN0YXJ0IiwiZm9udC1zdHlsZSI6ZC5zcGVjaWFsPyJpdGFsaWMiOiJub3JtYWwifTtmLm9mZnNldFBvc2l0aW9uPXt4OjgseTotOH07Zi5taW5TY2FsZT10blsiZm9udC1zaXplIl0vKGMud2lkdGgrdGhpcy5ncmlkLmNlbGxNYXJnaW4vMik7Zi5zY2FsZURvd249ITA7YS5wdXNoKGYpfSl9YWRkVmVydGljYWxQb3NpdGlvbmluZ0xhYmVscyhhKXtpZigic2NhdHRlciI9PT10aGlzLmVsZW0ucG9zaXRpb25Nb2RlJiZ0aGlzLmVsZW0udmVydGljYWxQb3NpdGlvbiBpbiB0aGlzLnN0YXRzKXt2YXIgYz10aGlzLnN0YXRzW3RoaXMuZWxlbS52ZXJ0aWNhbFBvc2l0aW9uXSwKZD10aGlzLmZvcm1hdE51bWJlcihjLm51bWJlck1pbiksZj10aGlzLmZvcm1hdE51bWJlcihjLm51bWJlck1heCksZz0oZC5sZW5ndGgrMykvKGQubGVuZ3RoK2YubGVuZ3RoKzYpO3RoaXMuZ3JpZC5lYWNoQ2VsbChsPT57aWYobC5pdGVtcy5sZW5ndGgpe2Zvcih2YXIgaz1sLnNpYmxpbmdzLmxlZnQ7ISgha3x8ay5pdGVtcy5sZW5ndGh8fGsuc2libGluZ3MuYWJvdmUmJmsuc2libGluZ3MuYWJvdmUuaXRlbXMubGVuZ3RoKTspaz1rLnNpYmxpbmdzLmxlZnQ7az1rP2suY29udGVudFgray5pbm5lcldpZHRoOi1JbmZpbml0eTt2YXIgbT1sLngrOCxwPWwuY29udGVudFkscT1sLmNvbnRlbnRZK2wuaW5uZXJIZWlnaHQscj1uZXcgdW47ci5pZD1gJHtsLmNvbXBvdW5kS2V5fS1sZWZ0LXN0YXJ0YDtyLnRleHQ9ZDtyLng9bC54Kzg7ci55PWwueSsodGhpcy5lbGVtLmhvcml6b250YWxQb3NpdGlvbj84OjApO3Iuc2lkZT1HbS5MZWZ0O3IuY2VsbD1sO3Iucm90YXRlPS05MDtyLmF0dHJpYnV0ZXM9CnsiYWxpZ25tZW50LWJhc2VsaW5lIjoiaWRlb2dyYXBoaWMiLGZpbGw6IiMyMjU1YWEiLCJmb250LXNpemUiOjE2LCJ0ZXh0LWFuY2hvciI6InN0YXJ0In07ci5vZmZzZXRQb3NpdGlvbj17eDptbi5ib3R0b20seTotbW4ucmlnaHR9O3IuYm91bmRpbmdCb3g9e2JvdHRvbTpwLGxlZnQ6ayxyaWdodDptLHRvcDpwK2wuaW5uZXJIZWlnaHQqKE1hdGgubWF4KGcsLjEpLS4wNSl9O3IuZWxlbWVudE1hcmdpbj1tbjthLnB1c2gocik7cj1uZXcgdW47ci5pZD1gJHtsLmNvbXBvdW5kS2V5fS1sZWZ0LWVuZGA7ci50ZXh0PWY7ci54PWwueCs4O3IueT1sLnkrbC5oZWlnaHQ7ci5zaWRlPUdtLkxlZnQ7ci5jZWxsPWw7ci5yb3RhdGU9LTkwO3IuYXR0cmlidXRlcz17ImFsaWdubWVudC1iYXNlbGluZSI6ImlkZW9ncmFwaGljIixmaWxsOiIjMjI1NWFhIiwiZm9udC1zaXplIjoxNiwidGV4dC1hbmNob3IiOiJlbmQifTtyLm9mZnNldFBvc2l0aW9uPXt4Oi1tbi50b3AseTotbW4ucmlnaHR9O3IuYm91bmRpbmdCb3g9Cntib3R0b206cCtsLmlubmVySGVpZ2h0KihNYXRoLm1pbihnLC45KSsuMDUpLGxlZnQ6ayxyaWdodDptLHRvcDpxfTtyLmVsZW1lbnRNYXJnaW49bW47YS5wdXNoKHIpfX0pfX1hZGRIb3Jpem9udGFsUG9zaXRpb25pbmdMYWJlbHMoYSl7aWYoInNjYXR0ZXIiPT09dGhpcy5lbGVtLnBvc2l0aW9uTW9kZSYmdGhpcy5lbGVtLmhvcml6b250YWxQb3NpdGlvbiBpbiB0aGlzLnN0YXRzKXt2YXIgYz10aGlzLnN0YXRzW3RoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb25dLGQ9dGhpcy5mb3JtYXROdW1iZXIoYy5udW1iZXJNaW4pLGY9dGhpcy5mb3JtYXROdW1iZXIoYy5udW1iZXJNYXgpLGc9KGQubGVuZ3RoKzMpLyhkLmxlbmd0aCtmLmxlbmd0aCs2KTt0aGlzLmdyaWQuZWFjaENlbGwobD0+e2lmKGwuaXRlbXMubGVuZ3RoKXtmb3IodmFyIGs9bC5zaWJsaW5ncy5iZWxvdzshKCFrfHxrLml0ZW1zLmxlbmd0aHx8ay5zaWJsaW5ncy5yaWdodCYmay5zaWJsaW5ncy5yaWdodC5pdGVtcy5sZW5ndGgpOylrPQprLnNpYmxpbmdzLmJlbG93O2s9az9rLmNvbnRlbnRZK2suaW5uZXJIZWlnaHQ6LUluZmluaXR5O3ZhciBtPWwuY29udGVudFkscD1sLmNvbnRlbnRYLHE9cCtsLmlubmVyV2lkdGgscj1uZXcgdW47ci5pZD1gJHtsLmNvbXBvdW5kS2V5fS1ib3R0b20tc3RhcnRgO3IudGV4dD1kO3IueD1sLngrKHRoaXMuZWxlbS52ZXJ0aWNhbFBvc2l0aW9uPzg6MCk7ci55PWwueSs4O3Iuc2lkZT1HbS5Cb3R0b207ci5jZWxsPWw7ci5hdHRyaWJ1dGVzPXsiYWxpZ25tZW50LWJhc2VsaW5lIjoiaGFuZ2luZyIsZmlsbDoiIzExODg0NCIsImZvbnQtc2l6ZSI6MTYsInRleHQtYW5jaG9yIjoic3RhcnQifTtyLm9mZnNldFBvc2l0aW9uPXt4Om1uLmxlZnQseTptbi50b3B9O3IuYm91bmRpbmdCb3g9e2JvdHRvbTprLGxlZnQ6cCxyaWdodDpwK2wuaW5uZXJXaWR0aCooTWF0aC5tYXgoZywuMSktLjA1KSx0b3A6bX07ci5lbGVtZW50TWFyZ2luPW1uO2EucHVzaChyKTtyPW5ldyB1bjtyLmlkPWAke2wuY29tcG91bmRLZXl9LWJvdHRvbS1lbmRgOwpyLnRleHQ9ZjtyLng9bC54K2wud2lkdGg7ci55PWwueSs4O3Iuc2lkZT1HbS5Cb3R0b207ci5jZWxsPWw7ci5hdHRyaWJ1dGVzPXsiYWxpZ25tZW50LWJhc2VsaW5lIjoiaGFuZ2luZyIsZmlsbDoiIzExODg0NCIsImZvbnQtc2l6ZSI6MTYsInRleHQtYW5jaG9yIjoiZW5kIn07ci5vZmZzZXRQb3NpdGlvbj17eDotbW4ucmlnaHQseTptbi50b3B9O3IuYm91bmRpbmdCb3g9e2JvdHRvbTprLGxlZnQ6cCtsLmlubmVyV2lkdGgqKE1hdGgubWluKGcsLjkpKy4wNSkscmlnaHQ6cSx0b3A6bX07ci5lbGVtZW50TWFyZ2luPW1uO2EucHVzaChyKX19KX19ZGV0ZXJtaW5lTGFiZWxzKCl7Y29uc3QgYT1bXTt0aGlzLmFkZFZlcnRpY2FsRmFjZXRMYWJlbHMoYSk7dGhpcy5hZGRIb3Jpem9udGFsRmFjZXRMYWJlbHMoYSk7dGhpcy5hZGRWZXJ0aWNhbFBvc2l0aW9uaW5nTGFiZWxzKGEpO3RoaXMuYWRkSG9yaXpvbnRhbFBvc2l0aW9uaW5nTGFiZWxzKGEpO3JldHVybiBhfXVwZGF0ZUNlbGxCYWNrZ3JvdW5kcygpe3ZhciBhPQp0aGlzLmdyaWQuZ2V0Q2VsbHMoKS5maWx0ZXIoYz0+Yy5pdGVtcy5sZW5ndGgpO2E9dGhpcy5jZWxsQmFja2dyb3VuZExheWVyLnNlbGVjdEFsbCgiLmNlbGwiKS5kYXRhKGEsYz0+Yy5jb21wb3VuZEtleSk7YS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiY2VsbCIpLmF0dHIoIngiLGM9PmMuY29udGVudFh8fDApLmF0dHIoInkiLGM9PmMuY29udGVudFl8fDApLmF0dHIoIndpZHRoIixjPT5jLmlubmVyV2lkdGh8fDApLmF0dHIoImhlaWdodCIsYz0+Yy5pbm5lckhlaWdodHx8MCkuYXR0cigiZmlsbCIsIiNmOGY4ZjkiKS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApLm1lcmdlKGEpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikuYXR0cigieCIsYz0+Yy5jb250ZW50WHx8MCkuYXR0cigieSIsYz0+Yy5jb250ZW50WXx8MCkuYXR0cigid2lkdGgiLGM9PmMuaW5uZXJXaWR0aHx8MCkuYXR0cigiaGVpZ2h0IixjPT5jLmlubmVySGVpZ2h0fHwKMCkuYXR0cigiZmlsbC1vcGFjaXR5IiwxKTthLmV4aXQoKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLnJlbW92ZSgpLmF0dHIoImZpbGwtb3BhY2l0eSIsMCl9dXBkYXRlQXhlcygpe2NvbnN0IGE9W107InN0YWNrZWQiIT09dGhpcy5lbGVtLnBvc2l0aW9uTW9kZSYmdGhpcy5ncmlkLmVhY2hDZWxsKGY9PntpZihmLml0ZW1zLmxlbmd0aCl7aWYodGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24pe2NvbnN0IGc9bmV3IFJtKEdtLkxlZnQsZik7YS5wdXNoKGcpfXRoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb24mJihmPW5ldyBSbShHbS5Cb3R0b20sZiksYS5wdXNoKGYpKX19KTtjb25zdCBjPXRoaXMuYXhlc0xheWVyLnNlbGVjdEFsbCgiLmF4aXMiKS5kYXRhKGEsZj0+Zi5rZXkoKSksZD1jLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJheGlzIikuYXR0cigib3BhY2l0eSIsMCk7ZC5hcHBlbmQoInBhdGgiKS5hdHRyKCJkIixmPT4KZi5wYXRoKHRoaXMuc2NhbGUpKS5hdHRyKCJzdHJva2UiLGY9PmYuc2lkZT09PUdtLkxlZnQ/IiMyMjU1YWEiOiIjMTE4ODQ0IikuYXR0cigic3Ryb2tlLXdpZHRoIixmPT5mLnN0cm9rZVdpZHRoKHRoaXMuc2NhbGUpKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMCkuYXR0cigiZmlsbCIsIm5vbmUiKTtkLm1lcmdlKGMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikuYXR0cigib3BhY2l0eSIsMSk7ZC5tZXJnZShjKS5zZWxlY3QoInBhdGgiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoImQiLGY9PmYucGF0aCh0aGlzLnNjYWxlKSk7Yy5leGl0KCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5yZW1vdmUoKS5hdHRyKCJvcGFjaXR5IiwwKX11cGRhdGVMYWJlbHMoKXtpZih0aGlzLnNjYWxlKXt0aGlzLmxhYmVscz10aGlzLmRldGVybWluZUxhYmVscygpO3ZhciBhPQp0aGlzLmxhYmVsc0xheWVyLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YSh0aGlzLmxhYmVscyxsPT5sLmlkfHxgJHtsLnNpZGV9LSR7bC50ZXh0fWApO2EuZWFjaChmdW5jdGlvbihsKXtjb25zdCBrPWQzLnNlbGVjdCh0aGlzKSxtPWsuc2VsZWN0KCIuY3VycmVudCIpO2wudGV4dCE9PW0udGV4dCgpJiYobS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApLGsuc2VsZWN0KCIub2xkIikuYXR0cigiZmlsbC1vcGFjaXR5IiwxKS50ZXh0KG0udGV4dCgpKSl9KS5zZWxlY3QoIi5jdXJyZW50IikudGV4dChsPT5sLnRleHQpO3ZhciBjPWw9Pms9PnZvaWQgMD09PWsuYXR0cmlidXRlc3x8dm9pZCAwPT09ay5hdHRyaWJ1dGVzW2xdP3RuW2xdOmsuYXR0cmlidXRlc1tsXSxkPWEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIikuYXR0cigidHJhbnNmb3JtIixsPT5gdHJhbnNsYXRlKCR7bC54fSwke2wueX0pYCksZj1kLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiZmxpcCIpLmF0dHIoInRyYW5zZm9ybSIsCiJzY2FsZSgxLC0xKSIpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwicm90YXRlIikuYXR0cigidHJhbnNmb3JtIixsPT4icm90YXRlKCIrKCJyb3RhdGUiaW4gbD9sLnJvdGF0ZTowKSsiKSIpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidW5zY2FsZSIpLmF0dHIoInRyYW5zZm9ybSIsYHNjYWxlKCR7MS90aGlzLnNjYWxlfSlgKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInBvc2l0aW9uIikuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJvcGFjaXR5IHNjYWxlIiksZz1mLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwib2xkIikuYXR0cigiZmlsbC1vcGFjaXR5IiwwKTtmPWYuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJjdXJyZW50IikuYXR0cigiZmlsbC1vcGFjaXR5IiwwKS50ZXh0KGw9PmwudGV4dCk7Zm9yKGNvbnN0IGwgaW4gdG4pdG4uaGFzT3duUHJvcGVydHkobCkmJihnLmF0dHIobCxjKGwpKSxmLmF0dHIobCxjKGwpKSk7Zz1kLm1lcmdlKGEpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikuYXR0cigidHJhbnNmb3JtIiwKbD0+YHRyYW5zbGF0ZSgke2wueH0sJHtsLnl9KWApO2cuc2VsZWN0KCIucm90YXRlIikuYXR0cigidHJhbnNmb3JtIixsPT4icm90YXRlKCIrKCJyb3RhdGUiaW4gbD9sLnJvdGF0ZTowKSsiKSIpO2cuZmlsdGVyKGw9PiEhbC5vZmZzZXRQb3NpdGlvbikuc2VsZWN0KCIucG9zaXRpb24iKS5hdHRyKCJ0cmFuc2Zvcm0iLGw9PmB0cmFuc2xhdGUoJHtsLm9mZnNldFBvc2l0aW9uLnh8fDB9LCR7bC5vZmZzZXRQb3NpdGlvbi55fHwwfSlgKTtkPWcuc2VsZWN0KCIub2xkIikuYXR0cigiZmlsbC1vcGFjaXR5IiwwKTtnPWcuc2VsZWN0KCIuY3VycmVudCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsMSk7Zm9yKGNvbnN0IGwgaW4gdG4pdG4uaGFzT3duUHJvcGVydHkobCkmJihkLmF0dHIobCxjKGwpKSxnLmF0dHIobCxjKGwpKSk7YS5leGl0KCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5yZW1vdmUoKS5zZWxlY3QoIi5jdXJyZW50IikuYXR0cigiZmlsbC1vcGFjaXR5IiwKMCl9fWRhdGFDaGFuZ2UoKXtjb25zdCBhPXRoaXMuZWxlbS5kYXRhO2lmKGEmJmEubGVuZ3RoKXt0aGlzLnJlc2l6ZUhhbmRsZXIoKTt0aGlzLnN0YXRzPWpuKGEpO2lmKHRoaXMuaXRlbXMpaWYodGhpcy5pdGVtcy5sZW5ndGghPT1hLmxlbmd0aCl0aGlzLmluaXRpYWxpemVTcHJpdGVNZXNoKCksdGhpcy51cGRhdGVJbWFnZUZpZWxkTmFtZSgpO2Vsc2UgZm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspdGhpcy5pdGVtc1tjXS5kYXRhPWFbY107ZWxzZSB0aGlzLmluaXRpYWxpemVTcHJpdGVNZXNoKCksdGhpcy5waWNrQ29sb3JCeUZpZWxkKCksdGhpcy5waWNrVGV4dERyYXdpbmdGaWVsZCgpO3RoaXMudXBkYXRlR3JpZEZhY2V0aW5nKCk7dGhpcy51cGRhdGVHcmlkSXRlbVBvc2l0aW9ucygpO3RoaXMudXBkYXRlQ29sb3JzKCl9fWluaXRpYWxpemVTcHJpdGVNZXNoKCl7dGhpcy5zcHJpdGVNZXNoJiYodGhpcy5zY2VuZS5yZW1vdmUodGhpcy5zcHJpdGVNZXNoKSx0aGlzLnNwcml0ZU1lc2guc3ByaXRlQXRsYXMuY2xlYXJRdWV1ZXMoKSwKZGVsZXRlIHRoaXMuc3ByaXRlTWVzaCk7Y29uc3QgYT10aGlzLmVsZW0uZGF0YSxjPWEubGVuZ3RoO3ZhciBkPXRoaXMuZWxlbS5zcHJpdGVJbWFnZVdpZHRoLGY9dGhpcy5lbGVtLnNwcml0ZUltYWdlSGVpZ2h0O2NvbnN0IGc9ZC9mO3RoaXMuc3ByaXRlTWVzaD1uZXcgJG0oYyxkLGYpO3RoaXMuc2NlbmUuYWRkKHRoaXMuc3ByaXRlTWVzaCk7dGhpcy5zcHJpdGVNZXNoLnNwcml0ZUF0bGFzLm9uRHJhd0ZpbmlzaGVkPSgpPT50aGlzLnF1ZXVlUmVuZGVyU2NlbmUoKTt0aGlzLml0ZW1zPVtdO2Q9TWF0aC5jZWlsKE1hdGguc3FydChjKSk7Zj1NYXRoLmNlaWwoYy9kKTtmb3IobGV0IGw9MDtsPGM7bCsrKXtjb25zdCBrPXRoaXMuc3ByaXRlTWVzaC5jcmVhdGVTcHJpdGUoKTtrLng9ZC8yO2sueT1mLzI7ay5vcGFjaXR5PTA7ay50aW1lc3RhbXA9RGF0ZS5ub3coKTtrLnJlYmFzZShrLnRpbWVzdGFtcCk7dGhpcy5pdGVtcy5wdXNoKHtzcHJpdGU6ayxkYXRhOmFbbF19KX10aGlzLmdyaWQ9Cm5ldyBRbSh0aGlzLml0ZW1zKTt0aGlzLmdyaWQuY2VsbE1hcmdpbj0xO3RoaXMuZ3JpZC5pdGVtQXNwZWN0UmF0aW89Zzt0aGlzLmdyaWQuaXRlbVBvc2l0aW9uU2V0dGVyPShsLGssbSk9Pntjb25zdCBwPURhdGUubm93KCk7bC5zcHJpdGUucmViYXNlKHApO2wuc3ByaXRlLng9aztsLnNwcml0ZS55PW07bC5zcHJpdGUub3BhY2l0eT0xO2wuc3ByaXRlLnRpbWVzdGFtcD1wK3RoaXMuZWxlbS50d2VlbkR1cmF0aW9uO3RoaXMucmVuZGVyVW50aWwobC5zcHJpdGUudGltZXN0YW1wKX19ZmlsdGVyZWREYXRhSW5kaWNlc0NoYW5nZSgpe2NvbnN0IGE9dGhpcy5lbGVtLmZpbHRlcmVkRGF0YUluZGljZXMsYz1bXTtpZihhKWZvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZj1hW2RdO2Y8dGhpcy5pdGVtcy5sZW5ndGgmJihjW2ZdPSEwKX1kPVtdO2Y9W107Y29uc3QgZz1EYXRlLm5vdygpLGw9Zyt0aGlzLmVsZW0udHdlZW5EdXJhdGlvbjtmb3IobGV0IGs9MDtrPHRoaXMuaXRlbXMubGVuZ3RoO2srKyl7Y29uc3QgbT0KdGhpcy5pdGVtc1trXTshYXx8Y1trXT8oZC5wdXNoKG0uZGF0YSksZi5wdXNoKG0pLG0uc3ByaXRlLm9wYWNpdHl8fChtLnNwcml0ZS5yZWJhc2UoZyksbS5zcHJpdGUudGltZXN0YW1wPWwsbS5zcHJpdGUub3BhY2l0eT0xKSk6MDxtLnNwcml0ZS5vcGFjaXR5JiYobS5zcHJpdGUucmViYXNlKGcpLG0uc3ByaXRlLnRpbWVzdGFtcD1sLG0uc3ByaXRlLm9wYWNpdHk9MCl9dGhpcy5yZW5kZXJVbnRpbChsKTt0aGlzLnN0YXRzPWpuKGQpO3RoaXMuZ3JpZC5pdGVtcz1mO3RoaXMudXBkYXRlR3JpZEZhY2V0aW5nKCk7dGhpcy51cGRhdGVHcmlkSXRlbVBvc2l0aW9ucygpfXBpY2tDb2xvckJ5RmllbGQoKXtsZXQgYT1udWxsLGM9SW5maW5pdHk7Zm9yKGNvbnN0IGQgaW4gdGhpcy5zdGF0cylpZih0aGlzLnN0YXRzLmhhc093blByb3BlcnR5KGQpKXtjb25zdCBmPXRoaXMuc3RhdHNbZF0sZz1NYXRoLmFicyhmLnVuaXF1ZUNvdW50LXBuLmxlbmd0aCk7MTxmLnVuaXF1ZUNvdW50JiZnPGMmJgooYT1kLGM9Zyl9aXNGaW5pdGUoYykmJmEgaW4gdGhpcy5zdGF0cyYmKHRoaXMuYXV0b0NvbG9yQnk9ITAsdGhpcy5lbGVtLnNldCgiY29sb3JCeSIsYSkpfXBpY2tUZXh0RHJhd2luZ0ZpZWxkKCl7bGV0IGE9IiIsYz0tSW5maW5pdHk7Zm9yKGNvbnN0IGYgaW4gdGhpcy5zdGF0cylpZih0aGlzLnN0YXRzLmhhc093blByb3BlcnR5KGYpKXt2YXIgZD10aGlzLnN0YXRzW2ZdO2Q9ZC5zdHJpbmdDb3VudCtkLnN0cmluZ0xlbmd0aHNDb3VudC1kLnRvdGFsQ291bnQ7ZD5jJiYoYT1mLGM9ZCl9aXNGaW5pdGUoYykmJmEgaW4gdGhpcy5zdGF0cyYmdGhpcy5lbGVtLnNldCgiaW1hZ2VGaWVsZE5hbWUiLGEpfXF1ZXVlQXRsYXNVcmxDaGFuZ2UoKXt0aGlzLmF0bGFzVXJsQ2hhbmdlVGltZXImJmNsZWFyVGltZW91dCh0aGlzLmF0bGFzVXJsQ2hhbmdlVGltZXIpO3RoaXMuYXRsYXNVcmxDaGFuZ2VUaW1lcj1zZXRUaW1lb3V0KCgpPT57dGhpcy5hdGxhc1VybENoYW5nZVRpbWVyJiZ0aGlzLmF0bGFzVXJsQ2hhbmdlKCl9LAoxMDApfWF0bGFzVXJsQ2hhbmdlKCl7Y2xlYXJUaW1lb3V0KHRoaXMuYXRsYXNVcmxDaGFuZ2VUaW1lcik7ZGVsZXRlIHRoaXMuYXRsYXNVcmxDaGFuZ2VUaW1lcjtpZih0aGlzLnNwcml0ZU1lc2gpe3ZhciBhPXRoaXMuZWxlbS5hdGxhc1VybDthJiZhLmxlbmd0aCYmYSE9PXRoaXMubGFzdEF0bGFzVXJsJiYodGhpcy5sYXN0QXRsYXNVcmw9YSx0aGlzLnJlc2V0U3ByaXRlc1RvRGVmYXVsdFRleHR1cmUoKSx0aGlzLnNwcml0ZU1lc2guc3ByaXRlQXRsYXMuc2V0QXRsYXNVcmwoYSx0aGlzLmVsZW0uY3Jvc3NPcmlnaW4sKCk9Pntjb25zdCBjPXRoaXMuZWxlbS5kYXRhLGQ9RGF0ZS5ub3coKSxmPWQrdGhpcy5lbGVtLmZhZGVEdXJhdGlvbjtmb3IobGV0IGc9MDtjJiZnPGMubGVuZ3RoO2crKyl0aGlzLnNwcml0ZU1lc2guc3dpdGNoVGV4dHVyZXMoZyxkLGYpO3RoaXMucmVuZGVyVW50aWwoZik7dGhpcy5pZ25vcmVDaGFuZ2U9ITA7dGhpcy5lbGVtLnNldCgiaW1hZ2VGaWVsZE5hbWUiLAoiIik7ZGVsZXRlIHRoaXMuaWdub3JlQ2hhbmdlO3RoaXMuYXV0b0NvbG9yQnkmJih0aGlzLmF1dG9Db2xvckJ5PSExLHRoaXMuZWxlbS5zZXQoImNvbG9yQnkiLCIiKSl9KSl9ZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hdGxhc1VybENoYW5nZS5iaW5kKHRoaXMpKX1zcHJpdGVVcmxDaGFuZ2UoKXtjb25zdCBhPXRoaXMuZWxlbS5zcHJpdGVVcmw7aWYoYSlpZih0aGlzLnNwcml0ZU1lc2gpe2NvbnN0IGM9bmV3IEltYWdlO3ZvaWQgMCE9PXRoaXMuZWxlbS5jcm9zc09yaWdpbiYmKGMuY3Jvc3NPcmlnaW49dGhpcy5lbGVtLmNyb3NzT3JpZ2luKTtjLm9ubG9hZD0oKT0+e2NvbnN0IGQ9dGhpcy5zcHJpdGVNZXNoLmRlZmF1bHRUZXh0dXJlQ2FudmFzLGY9ZC5nZXRDb250ZXh0KCIyZCIpO2YuY2xlYXJSZWN0KDAsMCxkLndpZHRoLGQuaGVpZ2h0KTtmLmRyYXdJbWFnZShjLDAsMCxkLndpZHRoLGQuaGVpZ2h0KTt0aGlzLnNwcml0ZU1lc2guZGVmYXVsdFRleHR1cmUubmVlZHNVcGRhdGU9CiEwO3RoaXMucXVldWVSZW5kZXJTY2VuZSgpfTtjLnNyYz1hfWVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuc3ByaXRlVXJsQ2hhbmdlLmJpbmQodGhpcykpfXVwZGF0ZUdyaWRTdGFja2luZygpeyJzdGFja2VkIj09PXRoaXMuZWxlbS5wb3NpdGlvbk1vZGUmJih0aGlzLmdyaWQuY29tcHV0ZUl0ZW1Qb3NpdGlvbj1ObSh0aGlzLmVsZW0udmVydGljYWxGYWNldD8ibWlkZGxlIjoiYm90dG9tIix0aGlzLmVsZW0uaG9yaXpvbnRhbEZhY2V0PyJtaWRkbGUiOiJyaWdodCIpKX11cGRhdGVHcmlkRmFjZXRpbmcoKXtpZih0aGlzLmdyaWQpe3RoaXMudXBkYXRlR3JpZFN0YWNraW5nKCk7dmFyIGE9dGhpcy52ZXJ0aWNhbEZhY2V0SW5mbz10aGlzLmdlbmVyYXRlRmFjZXRpbmdJbmZvKHRoaXMuZWxlbS52ZXJ0aWNhbEZhY2V0LHRoaXMuZWxlbS52ZXJ0aWNhbEJ1Y2tldHMsdGhpcy5lbGVtLnZlcnRpY2FsQmFnT2ZXb3JkcywhMCk7dGhpcy5ncmlkLnZlcnRpY2FsRmFjZXQ9YS5mYWNldGluZ0Z1bmN0aW9uOwp0aGlzLmdyaWQudmVydGljYWxLZXlDb21wYXJlPWEua2V5Q29tcGFyZUZ1bmN0aW9uO2E9dGhpcy5ob3Jpem9udGFsRmFjZXRJbmZvPXRoaXMuZ2VuZXJhdGVGYWNldGluZ0luZm8odGhpcy5lbGVtLmhvcml6b250YWxGYWNldCx0aGlzLmVsZW0uaG9yaXpvbnRhbEJ1Y2tldHMsdGhpcy5lbGVtLmhvcml6b250YWxCYWdPZldvcmRzLCExKTt0aGlzLmdyaWQuaG9yaXpvbnRhbEZhY2V0PWEuZmFjZXRpbmdGdW5jdGlvbjt0aGlzLmdyaWQuaG9yaXpvbnRhbEtleUNvbXBhcmU9YS5rZXlDb21wYXJlRnVuY3Rpb247dGhpcy5lbGVtLmZpdEdyaWRBc3BlY3RSYXRpb1RvVmlld3BvcnQ/KGE9dGhpcy5lbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHRoaXMuZ3JpZC50YXJnZXRHcmlkQXNwZWN0UmF0aW89YSYmYS53aWR0aCYmYS5oZWlnaHQ/YS53aWR0aC9hLmhlaWdodHx8MToxKTp0aGlzLmdyaWQudGFyZ2V0R3JpZEFzcGVjdFJhdGlvPTE7dGhpcy5ncmlkLmFycmFuZ2UoKTt0aGlzLnVwZGF0ZUNlbGxCYWNrZ3JvdW5kcygpOwp0aGlzLnVwZGF0ZUF4ZXMoKTt0aGlzLnVwZGF0ZUxhYmVscygpO3RoaXMudXBkYXRlU2VsZWN0ZWRCb3hlcygpO3RoaXMudXBkYXRlQ29tcGFyZWRCb3hlcygpO3RoaXMuZml0VG9WaWV3cG9ydCgpfX11cGRhdGVHcmlkSXRlbVBvc2l0aW9ucygpe2lmKHRoaXMuZ3JpZCl7dGhpcy51cGRhdGVHcmlkU3RhY2tpbmcoKTt2YXIgYT10aGlzLmdyaWQuY2VsbFBhZGRpbmcsYz1QbS5UaWdodCxkPVBtLlVuaWZvcm0sZj0hMTtpZigic3RhY2tlZCI9PT10aGlzLmVsZW0ucG9zaXRpb25Nb2RlKWY9dGhpcy5ncmlkLnZlcnRpY2FsR3JpZEFsaWdubWVudCE9PWN8fHRoaXMuZ3JpZC5ob3Jpem9udGFsR3JpZEFsaWdubWVudCE9PWMsdGhpcy5ncmlkLnZlcnRpY2FsR3JpZEFsaWdubWVudD1jLHRoaXMuZ3JpZC5ob3Jpem9udGFsR3JpZEFsaWdubWVudD1jLHRoaXMuZ3JpZC5jZWxsUGFkZGluZy50b3A9MCx0aGlzLmdyaWQuY2VsbFBhZGRpbmcubGVmdD0wLHRoaXMuZ3JpZC5jZWxsUGFkZGluZy5yaWdodD0KMCx0aGlzLmdyaWQuY2VsbFBhZGRpbmcuYm90dG9tPTAsdGhpcy5ncmlkLm1pbkNlbGxBc3BlY3RSYXRpbz0wLHRoaXMuZ3JpZC5tYXhDZWxsQXNwZWN0UmF0aW89SW5maW5pdHk7ZWxzZXt0aGlzLmVsZW0udmVydGljYWxQb3NpdGlvbj8oZj10aGlzLmdyaWQudmVydGljYWxHcmlkQWxpZ25tZW50IT09ZCx0aGlzLmdyaWQudmVydGljYWxHcmlkQWxpZ25tZW50PWQpOihmPXRoaXMuZ3JpZC52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQhPT1jLHRoaXMuZ3JpZC52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQ9Yyk7dGhpcy5lbGVtLmhvcml6b250YWxQb3NpdGlvbj8oZj1mfHx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQhPT1kLHRoaXMuZ3JpZC5ob3Jpem9udGFsR3JpZEFsaWdubWVudD1kKTooZj1mfHx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQhPT1jLHRoaXMuZ3JpZC5ob3Jpem9udGFsR3JpZEFsaWdubWVudD1jKTtjb25zdCBnPXRoaXMuZ2VuZXJhdGVQb3NpdGlvbkZ1bmN0aW9uKHRoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb24pfHwKTG0sbD10aGlzLmdlbmVyYXRlUG9zaXRpb25GdW5jdGlvbih0aGlzLmVsZW0udmVydGljYWxQb3NpdGlvbil8fE1tO3RoaXMuZ3JpZC5jb21wdXRlSXRlbVBvc2l0aW9uPShrLG0scCxxKT0+KHt4OmcoayxtLHAscSkseTpsKGssbSxwLHEpfSk7Yz10aGlzLmVsZW0udmVydGljYWxQb3NpdGlvbj84OjA7ZD10aGlzLmVsZW0uaG9yaXpvbnRhbFBvc2l0aW9uPzg6MDtmPWZ8fDAhPT1hLnRvcHx8YyE9PWEubGVmdHx8MCE9PWEucmlnaHR8fGQhPT1hLmJvdHRvbTt0aGlzLmdyaWQuY2VsbFBhZGRpbmcudG9wPTA7dGhpcy5ncmlkLmNlbGxQYWRkaW5nLnJpZ2h0PTA7dGhpcy5ncmlkLmNlbGxQYWRkaW5nLmxlZnQ9Yzt0aGlzLmdyaWQuY2VsbFBhZGRpbmcuYm90dG9tPWQ7dGhpcy5ncmlkLm1pbkNlbGxBc3BlY3RSYXRpbz0xO3RoaXMuZ3JpZC5tYXhDZWxsQXNwZWN0UmF0aW89Mn1mPyh0aGlzLmdyaWQuYXJyYW5nZSgpLHRoaXMudXBkYXRlQ2VsbEJhY2tncm91bmRzKCkpOnRoaXMuZ3JpZC5wb3NpdGlvbkl0ZW1zKCk7CnRoaXMudXBkYXRlQXhlcygpO3RoaXMudXBkYXRlTGFiZWxzKCk7dGhpcy51cGRhdGVTZWxlY3RlZEJveGVzKCk7dGhpcy51cGRhdGVDb21wYXJlZEJveGVzKCk7dGhpcy5maXRUb1ZpZXdwb3J0KCl9fWdldFBhbGV0dGVTb3VyY2UoKXtzd2l0Y2godGhpcy5lbGVtLnBhbGV0dGVDaG9pY2Upe2Nhc2UgIndhcm0iOnJldHVybiBybjtjYXNlICJjb29sIjpyZXR1cm4gcW47Y2FzZSAiYXNzaXN0IjpyZXR1cm4gc247ZGVmYXVsdDpyZXR1cm4gcG59fXVwZGF0ZVNjYWxhclBhbGV0dGUoKXtjb25zdCBhPXRoaXMuZWxlbS5jb2xvckJ5LGM9dGhpcy5zdGF0c1thXTt2YXIgZD10aGlzLmdyaWQuaXRlbXMsZj1kMy5yZ2IoIiNBNTI3MTQiKSxnPWQzLnNjYWxlTGluZWFyKCk7Zy5kb21haW4oW2MubnVtYmVyTWluLGMubnVtYmVyTWF4XSkucmFuZ2UoWyJ3aGl0ZSIsIiMxQzNBQTkiXSk7Y29uc3QgbD1bXTtmb3IodmFyIGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIG09ZFtrXTttPWEgaW4gbS5kYXRhPwptLmRhdGFbYV06TmFOO209Im51bWJlciIhPT10eXBlb2YgbXx8aXNOYU4obSk/ZjpkMy5yZ2IoZyhtKSk7bC5wdXNoKG0pfWQ9dGhpcy5nZW5lcmF0ZUZhY2V0aW5nSW5mbyhhLDUsITEsITEpLmxhYmVsaW5nRnVuY3Rpb247Zj1kMy5zY2FsZUxpbmVhcigpO2YuZG9tYWluKFswLDRdKS5yYW5nZShbIndoaXRlIiwiIzFDM0FBOSJdKTtnPVtdO2ZvcihrPTQ7MDw9aztrLS0pbT1kKGspLGcucHVzaCh7a2V5OmssY29sb3I6ZihrKSxjb250ZW50Om19KTsoYy5vdGhlckNvdW50fHxjLnN0cmluZ0NvdW50fHxjLnRvdGFsQ291bnQ8dGhpcy5ncmlkLml0ZW1zLmxlbmd0aCkmJmcucHVzaCh7a2V5Ok5hTixjb2xvcjoiI0E1MjcxNCIsY29udGVudDp7bGFiZWw6Im1pc3NpbmciLHNwZWNpYWw6ITB9fSk7dGhpcy5lbGVtLnNldCgicGFsZXR0ZSIsZyk7dGhpcy5ncmlkLmNlbGxJdGVtQ29tcGFyYXRvcj0ocCxxKT0+e2lmKCEoYSBpbiBwLmRhdGF8fGEgaW4gcS5kYXRhKSlyZXR1cm4gMDtpZighKGEgaW4KcC5kYXRhKSlyZXR1cm4tMTtpZighKGEgaW4gcS5kYXRhKSlyZXR1cm4gMTtwPXAuZGF0YVthXTtxPXEuZGF0YVthXTtpZihwPT09cSlyZXR1cm4gMDtjb25zdCByPSJudW1iZXIiIT09dHlwZW9mIHB8fGlzTmFOKHApLHQ9Im51bWJlciIhPT10eXBlb2YgcXx8aXNOYU4ocSk7cmV0dXJuIHImJnQ/MDpyPy0xOnQ/MTpwLXF9O3JldHVybiBsfXVwZGF0ZUNhdGVnb3JpY2FsUGFsZXR0ZShhKXtjb25zdCBjPXRoaXMuZWxlbS5jb2xvckJ5LGQ9dGhpcy5zdGF0c1tjXSxmPXRoaXMuZ3JpZC5pdGVtcyxnPU9iamVjdC5rZXlzKGQudmFsdWVIYXNoKTt0aGlzLmVsZW0uc3RhYmxlQ29sb3JzP2cuc29ydCgpOmcuc29ydCgodCx2KT0+ZC52YWx1ZUhhc2hbdl0uY291bnQtZC52YWx1ZUhhc2hbdF0uY291bnQpO2NvbnN0IGw9TWF0aC5taW4oYS5sZW5ndGgsZy5sZW5ndGgpLGs9Zy5zbGljZSgwLGwpLnJlZHVjZSgodCx2LEEpPT57dFt2XT1BO3JldHVybiB0fSx7fSksbT1kMy5yZ2IoIiNGMEYwRjAiKSwKcD1hLm1hcCh0PT5kMy5yZ2IodCkpO2xldCBxPSExO2NvbnN0IHI9W107Zm9yKGxldCB0PTA7dDxmLmxlbmd0aDt0Kyspe2NvbnN0IHY9Ym4oZlt0XS5kYXRhW2NdKTtxPXF8fCEodiBpbiBrKTtyLnB1c2gocFtrW3ZdXXx8bSl9YT1hLnNsaWNlKDAsbCkubWFwKCh0LHYpPT57dj1kLnZhbHVlSGFzaFtnW3ZdXS52YWx1ZTtyZXR1cm57a2V5OnYsY29sb3I6dCxjb250ZW50OntsYWJlbDp2KyIiLHNwZWNpYWw6Im51bWJlciIhPT10eXBlb2YgdiYmInN0cmluZyIhPT10eXBlb2Ygdnx8diBpbiBubn19fSk7cSYmYS5wdXNoKHtrZXk6bnVsbCxjb2xvcjoiI0YwRjBGMCIsY29udGVudDp7bGFiZWw6Im90aGVyIixzcGVjaWFsOiEwfX0pO3RoaXMuZWxlbS5zZXQoInBhbGV0dGUiLGEpO3RoaXMuZ3JpZC5jZWxsSXRlbUNvbXBhcmF0b3I9KHQsdik9PntpZighKGMgaW4gdC5kYXRhfHxjIGluIHYuZGF0YSkpcmV0dXJuIDA7aWYoIShjIGluIHQuZGF0YSkpcmV0dXJuIDE7aWYoIShjIGluIHYuZGF0YSkpcmV0dXJuLTE7CnQ9dC5kYXRhW2NdO3Y9di5kYXRhW2NdO2lmKHQ9PT12KXJldHVybiAwO3Q9Ym4odCk7dj1ibih2KTtyZXR1cm4gdCBpbiBrfHx2IGluIGs/dCBpbiBrP3YgaW4gaz9rW3RdLWtbdl06LTE6MTowfTtyZXR1cm4gcn11cGRhdGVDb2xvcnMoKXtpZih0aGlzLmdyaWQpe3ZhciBhPXRoaXMuZWxlbS5jb2xvckJ5O2lmKGEgaW4gdGhpcy5zdGF0cyl7YT10aGlzLnN0YXRzW2FdO3ZhciBjPXRoaXMuZ2V0UGFsZXR0ZVNvdXJjZSgpO2E9YS51bmlxdWVDb3VudD5jLmxlbmd0aCYmYS5pc051bWVyaWMoKT90aGlzLnVwZGF0ZVNjYWxhclBhbGV0dGUoKTp0aGlzLnVwZGF0ZUNhdGVnb3JpY2FsUGFsZXR0ZShjKTtjPXRoaXMuZ3JpZC5pdGVtczt2YXIgZD1EYXRlLm5vdygpLGY9ZCt0aGlzLmVsZW0udHdlZW5EdXJhdGlvbjtmb3IobGV0IGc9MDtnPGMubGVuZ3RoO2crKyl7Y29uc3QgbD1jW2ddLGs9YVtnXTtsLnNwcml0ZS5yZWJhc2UoZCk7bC5zcHJpdGUucj1rLnI7bC5zcHJpdGUuZz1rLmc7bC5zcHJpdGUuYj0Kay5iO2wuc3ByaXRlLmE9MTgwO2wuc3ByaXRlLnRpbWVzdGFtcD1mfXRoaXMucmVuZGVyVW50aWwoZik7dGhpcy51cGRhdGVHcmlkSXRlbVBvc2l0aW9uc0FmdGVyQ29sb3JDaGFuZ2UoKX1lbHNlIHRoaXMuY2xlYXJDb2xvcnMoKX19dXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnNBZnRlckNvbG9yQ2hhbmdlKCl7InN0YWNrZWQiIT09dGhpcy5lbGVtLnBvc2l0aW9uTW9kZSYmdGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24mJnRoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb258fHRoaXMudXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMoKX1jbGVhckNvbG9ycygpe2NvbnN0IGE9dGhpcy5ncmlkLml0ZW1zLGM9RGF0ZS5ub3coKSxkPWMrdGhpcy5lbGVtLnR3ZWVuRHVyYXRpb247Zm9yKGxldCBmPTA7ZjxhLmxlbmd0aDtmKyspe2NvbnN0IGc9YVtmXTtnLnNwcml0ZS5yZWJhc2UoYyk7Zy5zcHJpdGUucj0wO2cuc3ByaXRlLmc9MDtnLnNwcml0ZS5iPTA7Zy5zcHJpdGUuYT0wO2cuc3ByaXRlLnRpbWVzdGFtcD0KZH10aGlzLnJlbmRlclVudGlsKGQpO3RoaXMuZWxlbS5zZXQoInBhbGV0dGUiLFtdKTt0aGlzLmdyaWQuY2VsbEl0ZW1Db21wYXJhdG9yJiYodGhpcy5ncmlkLmNlbGxJdGVtQ29tcGFyYXRvcj1udWxsLHRoaXMudXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnNBZnRlckNvbG9yQ2hhbmdlKCkpfXJlc2V0U3ByaXRlc1RvRGVmYXVsdFRleHR1cmUoKXtjb25zdCBhPXRoaXMuZ3JpZC5pdGVtczt0aGlzLnNwcml0ZU1lc2guc3ByaXRlQXRsYXMuY2xlYXJRdWV1ZXMoKTtjb25zdCBjPURhdGUubm93KCksZD1jK3RoaXMuZWxlbS5mYWRlRHVyYXRpb247Zm9yKGxldCBmPTA7ZjxhLmxlbmd0aDtmKyspe2NvbnN0IGc9YVtmXTswPGcuc3ByaXRlLnRleHR1cmVJbmRleCYmZy5zcHJpdGUuc3dpdGNoVGV4dHVyZXMoYyxkKX10aGlzLnJlbmRlclVudGlsKGQpfXVwZGF0ZUltYWdlRmllbGROYW1lKCl7aWYoIXRoaXMuaWdub3JlQ2hhbmdlJiZ0aGlzLmdyaWQpe3RoaXMucmVzZXRTcHJpdGVzVG9EZWZhdWx0VGV4dHVyZSgpOwp2YXIgYT10aGlzLmVsZW0uaW1hZ2VGaWVsZE5hbWU7aWYoYSBpbiB0aGlzLnN0YXRzKXt2YXIgYz10aGlzLmdyaWQuaXRlbXM7Zm9yKGxldCBkPTA7ZDxjLmxlbmd0aDtkKyspe2NvbnN0IHtzcHJpdGU6ZixkYXRhOmd9PWNbZF07Zi5zZXRTcHJpdGVJbWFnZURhdGEoe3R5cGU6InRleHQiLGRhdGE6b24oZ1thXSkubGFiZWx9LCgpPT57Y29uc3QgbD1EYXRlLm5vdygpO2YuYmFzZVRleHR1cmVUaW1lc3RhbXA9bDtmLmJhc2VUZXh0dXJlSW5kZXg9MDtmLnRleHR1cmVUaW1lc3RhbXA9bCt0aGlzLmVsZW0udHdlZW5EdXJhdGlvbjtmLnRleHR1cmVJbmRleD0xO3RoaXMucmVuZGVyVW50aWwoZi50ZXh0dXJlVGltZXN0YW1wKX0pfX1lbHNlIGRlbGV0ZSB0aGlzLmxhc3RBdGxhc1VybCx0aGlzLnF1ZXVlQXRsYXNVcmxDaGFuZ2UoKX19Z2VuZXJhdGVQb3NpdGlvbkZ1bmN0aW9uKGEpe2NvbnN0IGM9dGhpcy5zdGF0c1thXTtpZighY3x8IWMuaXNOdW1lcmljKCkpcmV0dXJuIG51bGw7Y29uc3QgZD0KYy5udW1iZXJNYXgtYy5udW1iZXJNaW47cmV0dXJuIGY9PihmLmRhdGFbYV0tYy5udW1iZXJNaW4pL2R9Z2VuZXJhdGVGYWNldGluZ0luZm8oYSxjLGQsZil7aWYoIShhIGluIHRoaXMuc3RhdHMpKXJldHVybntmYWNldGluZ0Z1bmN0aW9uOigpPT5udWxsLGtleUNvbXBhcmVGdW5jdGlvbjooKT0+MCxsYWJlbGluZ0Z1bmN0aW9uOm9ufTtjb25zdCBnPXRoaXMuc3RhdHNbYV07aWYoZy53b3JkVHJlZSYmMTxnLndvcmRUcmVlLmhpZ2hlc3RMZXZlbCYmZClyZXR1cm4gdGhpcy5nZW5lcmF0ZUJhZ09mV29yZHNGYWNldGluZ0luZm8oYSxjLGYpO2lmKGcudW5pcXVlQ291bnQ8PWMpcmV0dXJue2ZhY2V0aW5nRnVuY3Rpb246az0+YSBpbiBrLmRhdGE/ay5kYXRhW2FdOm51bGwsa2V5Q29tcGFyZUZ1bmN0aW9uOmcuaXNOdW1lcmljKCk/S206Zj9KbTpJbSxsYWJlbGluZ0Z1bmN0aW9uOm9ufTtpZihnLmlzTnVtZXJpYygpJiZnLm51bWJlck1heCE9PWcubnVtYmVyTWluKXJldHVybiB0aGlzLmdlbmVyYXRlTnVtZXJpY0ZhY2V0aW5nSW5mbyhhLApjKTtkPU9iamVjdC5rZXlzKGcudmFsdWVIYXNoKTtkLnNvcnQoKGssbSk9PmcudmFsdWVIYXNoW21dLmNvdW50LWcudmFsdWVIYXNoW2tdLmNvdW50KTtjb25zdCBsPWQuc2xpY2UoMCxjKS5yZWR1Y2UoKGssbSk9PntrW21dPSEwO3JldHVybiBrfSx7fSk7cmV0dXJue2ZhY2V0aW5nRnVuY3Rpb246az0+e2lmKCEoYSBpbiBrLmRhdGEpKXJldHVybiBudWxsO2s9ay5kYXRhW2FdO3JldHVybiBibihrKWluIGw/azoiXHVmZmZjT1RIRVJcdWZmZmMifSxrZXlDb21wYXJlRnVuY3Rpb246Zj9KbTpJbSxsYWJlbGluZ0Z1bmN0aW9uOm9ufX1nZW5lcmF0ZUJhZ09mV29yZHNGYWNldGluZ0luZm8oYSxjLGQpe2NvbnN0IGY9dGhpcy5zdGF0c1thXS53b3JkVHJlZSxnPWYubGV2ZWxIYXNoO3JldHVybntmYWNldGluZ0Z1bmN0aW9uOmw9PntpZighKGEgaW4gbC5kYXRhKSlyZXR1cm4gbnVsbDtmb3IobD1mLm5vZGVIYXNoW2JuKGwuZGF0YVthXSldO2wucGFyZW50JiZsLmxldmVsPmM7KWw9bC5wYXJlbnQ7CnJldHVybiBsLmxldmVsfSxrZXlDb21wYXJlRnVuY3Rpb246KGwsayk9PntsPWdbbF07az1nW2tdO2lmKHZvaWQgMD09PWwmJnZvaWQgMD09PWspcmV0dXJuIDA7aWYodm9pZCAwPT09bClyZXR1cm4tMTtpZih2b2lkIDA9PT1rKXJldHVybiAxO2lmKGwubm9uVmFsdWVDb3VudCYmay5ub25WYWx1ZUNvdW50KXJldHVybiAwO2lmKGwubm9uVmFsdWVDb3VudClyZXR1cm4tMTtpZihrLm5vblZhbHVlQ291bnQpcmV0dXJuIDE7az1rLm9yZGVyLWwub3JkZXI7cmV0dXJuIGQ/azota30sbGFiZWxpbmdGdW5jdGlvbjpsPT57bD1nWytsXTtpZighbC5wYXJlbnQmJiFsLmNvbW1vbldvcmRzLmxlbmd0aClyZXR1cm57bGFiZWw6Im90aGVyIixzcGVjaWFsOiEwfTtpZihsLm5vblZhbHVlQ291bnQpcmV0dXJue2xhYmVsOiJub24td29yZHMiLHNwZWNpYWw6ITB9O2xldCBrPWAgJHsiXHUyMDIyIn0gJHtsLmNvbW1vbldvcmRzLmpvaW4oIiAiKX1gO2ZvcihsZXQgbT0wO208bC5jaGlsZHJlbi5sZW5ndGg7bSsrKWlmKGwuY2hpbGRyZW5bbV0ubGV2ZWw+CmMpe2srPSIgXHUyMDI2IjticmVha31mb3IoO2wucGFyZW50OylsPWwucGFyZW50LGwuY29tbW9uV29yZHMubGVuZ3RoJiYoaz1gICR7Ilx1MjAyMiJ9ICR7bC5jb21tb25Xb3Jkcy5qb2luKCIgIil9IGArayk7cmV0dXJue2xhYmVsOmt9fX19Z2VuZXJhdGVOdW1lcmljRmFjZXRpbmdJbmZvKGEsYyl7Y29uc3QgZD10aGlzLnN0YXRzW2FdLGY9ZC5udW1iZXJNYXgtZC5udW1iZXJNaW47cmV0dXJue2ZhY2V0aW5nRnVuY3Rpb246Zz0+e2lmKCEoYSBpbiBnLmRhdGEpKXJldHVybiBudWxsO2c9Zy5kYXRhW2FdO3JldHVybiJudW1iZXIiIT09dHlwZW9mIGc/Zzppc05hTihnKT9nOk1hdGgubWluKE1hdGguZmxvb3IoYyooZy1kLm51bWJlck1pbikvZiksYy0xKX0sa2V5Q29tcGFyZUZ1bmN0aW9uOkttLGxhYmVsaW5nRnVuY3Rpb246Zz0+e2lmKCJudW1iZXIiIT09dHlwZW9mIGd8fGlzTmFOKCtnKSlyZXR1cm4gb24oZyk7Y29uc3QgbD1kLm51bWJlck1heC1kLm51bWJlck1pbixrPWcvYyoKbCtkLm51bWJlck1pbjtnPSgxK2cpL2MqbCtkLm51bWJlck1pbjtyZXR1cm4gZC5pc0ludGVnZXIoKT97bGFiZWw6dGhpcy5mb3JtYXRSYW5nZShNYXRoLmNlaWwoayksTWF0aC5mbG9vcihnKSl9OntsYWJlbDp0aGlzLmZvcm1hdFJhbmdlKGssZyl9fX19Zm9ybWF0TnVtYmVyKGEpe2lmKG51bGw9PT1hKXJldHVybiJudWxsIjthPXBhcnNlRmxvYXQoYS50b1ByZWNpc2lvbigzKSk7cmV0dXJuIDFFMzw9TWF0aC5hYnMoYSk/ZDMuZm9ybWF0KCJzIikoYSk6IiIrYX1mb3JtYXRSYW5nZShhLGMpe3JldHVybmAke3RoaXMuZm9ybWF0TnVtYmVyKGEpfSBcdTIwMTQgJHt0aGlzLmZvcm1hdE51bWJlcihjKX1gfWdldEtleXMoKXtyZXR1cm4gZm4odGhpcy5lbGVtLmRhdGEpLnNvcnQoKX1yZW5kZXJVbnRpbChhKXt0aGlzLmVuZFRpbWVzdGFtcD1NYXRoLm1heCh0aGlzLmVuZFRpbWVzdGFtcCxhKTt0aGlzLnF1ZXVlUmVuZGVyU2NlbmUoKX1yZXNpemVIYW5kbGVyKCl7Y29uc3QgYT10aGlzLmVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CmEud2lkdGgmJmEuaGVpZ2h0Pyh0aGlzLmxhYmVsc0FuZEF4ZXNTVkcuYXR0cigid2lkdGgiLGEud2lkdGgpLmF0dHIoImhlaWdodCIsYS5oZWlnaHQpLHRoaXMuY2VsbEJhY2tncm91bmRTVkcuYXR0cigid2lkdGgiLGEud2lkdGgpLmF0dHIoImhlaWdodCIsYS5oZWlnaHQpLHRoaXMucmVuZGVyZXImJnRoaXMucmVuZGVyZXIuc2V0U2l6ZShhLndpZHRoLGEuaGVpZ2h0KSx0aGlzLmNhbWVyYS5yaWdodD1hLndpZHRoL3RoaXMuc2NhbGUsdGhpcy5jYW1lcmEuYm90dG9tPS1hLmhlaWdodC90aGlzLnNjYWxlLHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx0aGlzLnF1ZXVlUmVuZGVyU2NlbmUoKSk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnJlc2l6ZUhhbmRsZXIoKSl9cXVldWVSZW5kZXJTY2VuZSgpe3RoaXMucmVuZGVyUXVldWVkfHwodGhpcy5yZW5kZXJRdWV1ZWQ9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5yZW5kZXJRdWV1ZWQmJgp0aGlzLnJlbmRlclNjZW5lKCl9KSl9cmVuZGVyU2NlbmUoKXt0aGlzLnJlbmRlclF1ZXVlZD0hMTtjb25zdCBhPURhdGUubm93KCk7dGhpcy5lbmRUaW1lc3RhbXA+YSYmdGhpcy5xdWV1ZVJlbmRlclNjZW5lKCk7aWYodGhpcy5zcHJpdGVNZXNoJiYodGhpcy5zcHJpdGVNZXNoLnRpbWU9YSw4MT4rVEhSRUUuUkVWSVNJT04mJnRoaXMuc3ByaXRlTWVzaC5vbkJlZm9yZVJlbmRlcikpdGhpcy5zcHJpdGVNZXNoLm9uQmVmb3JlUmVuZGVyKCk7dGhpcy5yZW5kZXJlciYmdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSx0aGlzLmNhbWVyYSk7dGhpcy5zcHJpdGVNZXNoJiZ0aGlzLnNwcml0ZU1lc2guc3ByaXRlQXRsYXMmJnRoaXMuc3ByaXRlTWVzaC5zcHJpdGVBdGxhcy5wb3N0UmVuZGVyKCl9fQpQb2x5bWVyKHtpczoiZmFjZXRzLWRpdmUtdmlzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOkFycmF5LHZhbHVlOm51bGwsb2JzZXJ2ZXI6Il9kYXRhQ2hhbmdlIn0sZmlsdGVyZWREYXRhSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsLG9ic2VydmVyOiJfZmlsdGVyZWREYXRhSW5kaWNlc0NoYW5nZSJ9LGF0bGFzVXJsOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsLG9ic2VydmVyOiJfcXVldWVBdGxhc1VybENoYW5nZSJ9LHNwcml0ZVVybDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbCxvYnNlcnZlcjoiX3Nwcml0ZVVybENoYW5nZSJ9LGNyb3NzT3JpZ2luOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxrZXlzOnt0eXBlOkFycmF5LHZhbHVlOltdLG5vdGlmeTohMCxyZWFkT25seTohMH0sc3RhdHM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9LG5vdGlmeTohMCxyZWFkT25seTohMH0sc2NlbmVQYWRkaW5nOnt0eXBlOk51bWJlciwKdmFsdWU6OH0sdHdlZW5EdXJhdGlvbjp7dHlwZTpOdW1iZXIsdmFsdWU6NjAwfSxmYWRlRHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjIwMH0sc3ByaXRlSW1hZ2VXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NjR9LHNwcml0ZUltYWdlSGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTo2NH0sZ3JpZEZhY2V0aW5nVmVydGljYWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiIzY2NjY2NiJ9LGdyaWRGYWNldGluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiI2RkNjYyMiJ9LGl0ZW1Qb3NpdGlvbmluZ1ZlcnRpY2FsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiMyMjU1YWEifSxpdGVtUG9zaXRpb25pbmdIb3Jpem9udGFsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiMxMTg4NDQifSxmaXRHcmlkQXNwZWN0UmF0aW9Ub1ZpZXdwb3J0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHZlcnRpY2FsRmFjZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLApvYnNlcnZlcjoiX3VwZGF0ZUdyaWRGYWNldGluZyJ9LHZlcnRpY2FsQnVja2V0czp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsb2JzZXJ2ZXI6Il91cGRhdGVHcmlkRmFjZXRpbmcifSx2ZXJ0aWNhbEJhZ09mV29yZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3VwZGF0ZUdyaWRGYWNldGluZyJ9LGhvcml6b250YWxGYWNldDp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsb2JzZXJ2ZXI6Il91cGRhdGVHcmlkRmFjZXRpbmcifSxob3Jpem9udGFsQnVja2V0czp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsb2JzZXJ2ZXI6Il91cGRhdGVHcmlkRmFjZXRpbmcifSxob3Jpem9udGFsQmFnT2ZXb3Jkczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfdXBkYXRlR3JpZEZhY2V0aW5nIn0scG9zaXRpb25Nb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToiIixvYnNlcnZlcjoiX3VwZGF0ZUdyaWRJdGVtUG9zaXRpb25zIn0sdmVydGljYWxQb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsCm9ic2VydmVyOiJfdXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMifSxob3Jpem9udGFsUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJfdXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMifSxjb2xvckJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIixvYnNlcnZlcjoiX3VwZGF0ZUNvbG9ycyIsbm90aWZ5OiEwfSxpbWFnZUZpZWxkTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsb2JzZXJ2ZXI6Il91cGRhdGVJbWFnZUZpZWxkTmFtZSIsbm90aWZ5OiEwfSxwYWxldHRlOnt0eXBlOkFycmF5LHZhbHVlOltdLG5vdGlmeTohMH0scGFsZXR0ZUNob2ljZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixvYnNlcnZlcjoiX3VwZGF0ZUNvbG9ycyJ9LHNlbGVjdGVkRGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LHNlbGVjdGVkSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZEluZGljZXNVcGRhdGVkIn0sY29tcGFyZWREYXRhOnt0eXBlOkFycmF5LAp2YWx1ZTpbXSxub3RpZnk6ITB9LGNvbXBhcmVkSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9jb21wYXJlZEluZGljZXNVcGRhdGVkIn0sc3RhYmxlQ29sb3JzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il91cGRhdGVDb2xvcnMifX0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJfb25Jcm9uUmVzaXplIn0sY3JlYXRlZCgpe3RoaXMuX2JhY2tpbmc9bmV3IHZuKHRoaXMpfSxyZWFkeSgpe3RoaXMuX2JhY2tpbmcucmVhZHkoKX0sX2RhdGFDaGFuZ2UoYSl7dGhpcy5fYmFja2luZy5zY2VuZT8odGhpcy5fYmFja2luZy5kYXRhQ2hhbmdlKCksdGhpcy5fc2V0S2V5cyh0aGlzLl9iYWNraW5nLmdldEtleXMoKSksdGhpcy5fc2V0U3RhdHModGhpcy5fYmFja2luZy5zdGF0cykpOnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9kYXRhQ2hhbmdlLmJpbmQodGhpcyxhKSl9LF9maWx0ZXJlZERhdGFJbmRpY2VzQ2hhbmdlKGEpe3RoaXMuX2JhY2tpbmcuc2NlbmUmJgp0aGlzLl9iYWNraW5nLml0ZW1zPyh0aGlzLl9iYWNraW5nLmZpbHRlcmVkRGF0YUluZGljZXNDaGFuZ2UoKSx0aGlzLl9zZXRLZXlzKHRoaXMuX2JhY2tpbmcuZ2V0S2V5cygpKSx0aGlzLl9zZXRTdGF0cyh0aGlzLl9iYWNraW5nLnN0YXRzKSk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2ZpbHRlcmVkRGF0YUluZGljZXNDaGFuZ2UuYmluZCh0aGlzLGEpKX0sX3F1ZXVlQXRsYXNVcmxDaGFuZ2UoKXt0aGlzLl9iYWNraW5nLnF1ZXVlQXRsYXNVcmxDaGFuZ2UoKX0sX3Nwcml0ZVVybENoYW5nZSgpe3RoaXMuX2JhY2tpbmcuc3ByaXRlVXJsQ2hhbmdlKCl9LF91cGRhdGVHcmlkRmFjZXRpbmcoKXt0aGlzLl9iYWNraW5nLnVwZGF0ZUdyaWRGYWNldGluZygpfSxfdXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMoKXt0aGlzLl9iYWNraW5nLnVwZGF0ZUdyaWRJdGVtUG9zaXRpb25zKCl9LF91cGRhdGVDb2xvcnMoKXt0aGlzLl9iYWNraW5nLnVwZGF0ZUNvbG9ycygpfSxfdXBkYXRlSW1hZ2VGaWVsZE5hbWUoKXt0aGlzLl9iYWNraW5nLnVwZGF0ZUltYWdlRmllbGROYW1lKCl9LApfb25Jcm9uUmVzaXplKCl7dGhpcy5fYmFja2luZy5yZXNpemVIYW5kbGVyKCl9LF9zZWxlY3RlZEluZGljZXNVcGRhdGVkKCl7dGhpcy5fYmFja2luZy5zZWxlY3RlZEluZGljZXNVcGRhdGVkKCl9LF9jb21wYXJlZEluZGljZXNVcGRhdGVkKCl7dGhpcy5fYmFja2luZy5jb21wYXJlZEluZGljZXNVcGRhdGVkKCl9LGZpdFRvVmlld3BvcnQoKXt0aGlzLl9iYWNraW5nLmZpdFRvVmlld3BvcnQoKX0sem9vbUluKCl7dGhpcy5fYmFja2luZy56b29tSW4oKX0sem9vbU91dCgpe3RoaXMuX2JhY2tpbmcuem9vbU91dCgpfX0pOwo8L3NjcmlwdD4KCgo8ZG9tLW1vZHVsZSBpZD0iZmFjZXRzLWRpdmUtY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgLm1haW4tY29udHJvbHMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDYwcHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIC5vdmVyZmxvdy1ob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB9CgogICAgICAjb3ZlcmZsb3dtZW51IHsKICAgICAgICBtYXJnaW46IDAgNDBweDsKICAgICAgfQoKICAgICAgLm92ZXJmbG93LWRpdiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAub3ZlcmZsb3ctY2hlY2tib3ggewogICAgICAgIG1hcmdpbjogOHB4IDA7CiAgICAgICAgcGFkZGluZwogICAgICB9CgogICAgICAuZHJvcGRvd24taG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgICBtYXJnaW46IDAgMTBweDsKICAgICAgfQoKICAgICAgLmRyb3Bkb3duLXRyaWdnZXIgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5leHBhbmQtYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzliOWI5YjsKICAgICAgICAtLXBhcGVyLWljb24tYnV0dG9uLWluay1jb2xvcjogIzliOWI5YjsKICAgICAgfQogICAgICBwYXBlci1tZW51IHBhcGVyLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTIuNXB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMCAxNHB4OwogICAgICAgIC0tcGFwZXItaXRlbS1taW4taGVpZ2h0OiAzNnB4OwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgcGFwZXItaXRlbSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7CiAgICAgIH0KCiAgICAgICN2ZXJ0aWNhbEZhY2V0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgY29sb3I6IHZhcigtLWdyaWQtZmFjZXRpbmctdmVydGljYWwtbGFiZWwtY29sb3IpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgI2hvcml6b250YWxGYWNldCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmlkLWZhY2V0aW5nLWhvcml6b250YWwtbGFiZWwtY29sb3IpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgI3ZlcnRpY2FsUG9zaXRpb24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBjb2xvcjogdmFyKC0taXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcik7CiAgICAgICAgfTsKICAgICAgfQogICAgICAjaG9yaXpvbnRhbFBvc2l0aW9uIHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgY29sb3I6IHZhcigtLWl0ZW0tcG9zaXRpb25pbmctaG9yaXpvbnRhbC1sYWJlbC1jb2xvcik7CiAgICAgICAgfTsKICAgICAgfQogICAgICAudmVydGljYWwtZmFjZXQgewogICAgICAgIGNvbG9yOiB2YXIoLS1ncmlkLWZhY2V0aW5nLXZlcnRpY2FsLWxhYmVsLWNvbG9yKTsKICAgICAgfQogICAgICAuaG9yaXpvbnRhbC1mYWNldCB7CiAgICAgICAgY29sb3I6IHZhcigtLWdyaWQtZmFjZXRpbmctaG9yaXpvbnRhbC1sYWJlbC1jb2xvcik7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLXBvc2l0aW9uIHsKICAgICAgICBjb2xvcjogdmFyKC0taXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcik7CiAgICAgIH0KICAgICAgLmhvcml6b250YWwtcG9zaXRpb24gewogICAgICAgIGNvbG9yOiB2YXIoLS1pdGVtLXBvc2l0aW9uaW5nLWhvcml6b250YWwtbGFiZWwtY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9Im1haW4tY29udHJvbHMiPgogICAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLWhvbGRlciBob3Jpem9udGFsLWZhY2V0Ij4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9Imhvcml6b250YWxGYWNldCIgbGFiZWw9IkJpbm5pbmcgfCBYLUF4aXMiIGNsYXNzPSJmYWNldC1zZWxlY3RvciI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2hvcml6b250YWxGYWNldH19IiBhdHRyLWZvci1zZWxlY3RlZD0idmFsdWUiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KG5vbmUpPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1trZXlzXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iW1tpdGVtXV0iPltbX2JyZWFrVXBBbmRUcnVuY2F0ZShpdGVtKV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tob3Jpem9udGFsRmFjZXRdXSI+CiAgICAgICAgICA8cGFwZXItaW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjEiIG1heD0iW1tfbWF4QnVja2V0cyhob3Jpem9udGFsRmFjZXQsIGhvcml6b250YWxCYWdPZldvcmRzKV1dIiB2YWx1ZT0ie3tob3Jpem9udGFsQnVja2V0c319IiBsYWJlbD0iQ291bnQiPgogICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLWhvbGRlciB2ZXJ0aWNhbC1mYWNldCI+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9InZlcnRpY2FsRmFjZXQiIGxhYmVsPSJCaW5uaW5nIHwgWS1BeGlzIiBjbGFzcz0iZmFjZXQtc2VsZWN0b3IiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3ZlcnRpY2FsRmFjZXR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KG5vbmUpPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IltbaXRlbV1dIj5bW19icmVha1VwQW5kVHJ1bmNhdGUoaXRlbSldXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3ZlcnRpY2FsRmFjZXRdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0IHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9IltbX21heEJ1Y2tldHModmVydGljYWxGYWNldCx2ZXJ0aWNhbEJhZ09mV29yZHMpXV0iIHZhbHVlPSJ7e3ZlcnRpY2FsQnVja2V0c319IiBsYWJlbD0iQ291bnQiPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1ob2xkZXIiPgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJjb2xvckJ5IiBsYWJlbD0iQ29sb3IgQnkiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2NvbG9yQnl9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KG5vbmUpPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IltbaXRlbV1dIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24taG9sZGVyIj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iaW1hZ2VGaWVsZE5hbWUiIGxhYmVsPSJMYWJlbCBCeSI+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7aW1hZ2VGaWVsZE5hbWV9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+CiAgICAgICAgICAgICAgW1tfZ2V0SW1hZ2VGaWVsZE5hbWVEZWZhdWx0TGFiZWwoYXRsYXNVcmwpXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IltbaXRlbV1dIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24taG9sZGVyIGhvcml6b250YWwtcG9zaXRpb24iPgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJob3Jpem9udGFsUG9zaXRpb24iIGxhYmVsPSJTY2F0dGVyIHwgWC1BeGlzIiBjbGFzcz0icG9zaXRpb24tc2VsZWN0b3IiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2hvcml6b250YWxQb3NpdGlvbn19IiBhdHRyLWZvci1zZWxlY3RlZD0idmFsdWUiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iIj4oZGVmYXVsdCk8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltba2V5c11dIiBmaWx0ZXI9Il9pc0tleU51bWVyaWMiPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJbW2l0ZW1dXSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLWhvbGRlciB2ZXJ0aWNhbC1wb3NpdGlvbiI+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9InZlcnRpY2FsUG9zaXRpb24iIGxhYmVsPSJTY2F0dGVyIHwgWS1BeGlzIiBjbGFzcz0icG9zaXRpb24tc2VsZWN0b3IiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3ZlcnRpY2FsUG9zaXRpb259fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KGRlZmF1bHQpPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSIgZmlsdGVyPSJfaXNLZXlOdW1lcmljIj4KICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iW1tpdGVtXV0iPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9Im92ZXJmbG93LWhvbGRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd092ZXJmbG93TWVudShjb2xvckJ5LCB2ZXJ0aWNhbEZhY2V0LCBob3Jpem9udGFsRmFjZXQpXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZHJvcGRvd24tdHJpZ2dlciIgaWNvbj0ibW9yZS12ZXJ0IiBhbHQ9Im1vcmUtdmVydCIgaWQ9Im92ZXJmbG93YnRuIiBvbi1jbGljaz0iX29wZW5PdmVyZmxvdyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0ib3ZlcmZsb3dtZW51IiBuby1vdmVybGFwIGhvcml6b250YWwtYWxpZ249InJpZ2h0IiB2ZXJ0aWNhbC1hbGlnbj0idG9wIj4KICAgICAgICA8ZGl2IGNsYXNzPSJvdmVyZmxvdy1kaXYiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19pc0tleUNhdGVnb3JpY2FsKGNvbG9yQnkpfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1ob2xkZXIiPgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJwYWxldHRlQ2hvaWNlIiBsYWJlbD0iRGlzcGxheSB8IENvbG9yIFBhbGV0dGUiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3BhbGV0dGVDaG9pY2V9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9InN0YW5kYXJkIj5zdGFuZGFyZDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9Indhcm0iPndhcm08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJjb29sIj5jb29sPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iYXNzaXN0Ij5hc3Npc3Q8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc1dvcmRUcmVlKHZlcnRpY2FsRmFjZXQpXV0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2xhc3M9Im92ZXJmbG93LWNoZWNrYm94IiBjaGVja2VkPSJ7e3ZlcnRpY2FsQmFnT2ZXb3Jkc319Ij4KICAgICAgICAgICAgICBYLUF4aXMgQmFnIG9mIHdvcmRzCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzV29yZFRyZWUoaG9yaXpvbnRhbEZhY2V0KV1dIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJvdmVyZmxvdy1jaGVja2JveCIgY2hlY2tlZD0ie3tob3Jpem9udGFsQmFnT2ZXb3Jkc319Ij4KICAgICAgICAgICAgICBZLUF4aXMgQmFnIG9mIHdvcmRzCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9mYWNldHMtZGl2ZS9jb21wb25lbnRzL2ZhY2V0cy1kaXZlLWNvbnRyb2xzL2ZhY2V0cy1kaXZlLWNvbnRyb2xzLmpzClBvbHltZXIoe2lzOiJmYWNldHMtZGl2ZS1jb250cm9scyIscHJvcGVydGllczp7YXRsYXNVcmw6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxrZXlzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxzdGF0czp7dHlwZTpPYmplY3QsdmFsdWU6e319LHZlcnRpY2FsRmFjZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sdmVydGljYWxCdWNrZXRzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxub3RpZnk6ITB9LHZlcnRpY2FsQmFnT2ZXb3Jkczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0saG9yaXpvbnRhbEZhY2V0Ont0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LGhvcml6b250YWxCdWNrZXRzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxub3RpZnk6ITB9LGhvcml6b250YWxCYWdPZldvcmRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxwb3NpdGlvbk1vZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0UG9zaXRpb25Nb2RlKHZlcnRpY2FsUG9zaXRpb24sIGhvcml6b250YWxQb3NpdGlvbikiLApub3RpZnk6ITB9LHZlcnRpY2FsUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saG9yaXpvbnRhbFBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LGNvbG9yQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saW1hZ2VGaWVsZE5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0scGFsZXR0ZTp7dHlwZTpBcnJheSx2YWx1ZTpbXX0scGFsZXR0ZUNob2ljZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixub3RpZnk6ITB9LGdyaWRGYWNldGluZ1ZlcnRpY2FsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiM2NjY2NjYiLG9ic2VydmVyOiJfdXBkYXRlQ1NTVmFycyJ9LGdyaWRGYWNldGluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiI2RkNjYyMiIsb2JzZXJ2ZXI6Il91cGRhdGVDU1NWYXJzIn0saXRlbVBvc2l0aW9uaW5nVmVydGljYWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZywKdmFsdWU6IiMyMjU1YWEiLG9ic2VydmVyOiJfdXBkYXRlQ1NTVmFycyJ9LGl0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiIzExODg0NCIsb2JzZXJ2ZXI6Il91cGRhdGVDU1NWYXJzIn19LF9nZXRJbWFnZUZpZWxkTmFtZURlZmF1bHRMYWJlbChhKXtyZXR1cm4gYT8iKGltYWdlKSI6IihkZWZhdWx0KSJ9LF9pc01vZGVTY2F0dGVyKGEpe3JldHVybiJzY2F0dGVyIj09PWF9LF9pc0tleU51bWVyaWMoYSl7cmV0dXJuIHRoaXMuc3RhdHMmJmEgaW4gdGhpcy5zdGF0cyYmdGhpcy5zdGF0c1thXS5pc051bWVyaWMoKX0sX2lzS2V5Q2F0ZWdvcmljYWwoYSl7cmV0dXJuIHRoaXMuc3RhdHMmJmEgaW4gdGhpcy5zdGF0cyYmIXRoaXMuc3RhdHNbYV0uaXNOdW1lcmljKCl9LF91cGRhdGVDU1NWYXJzKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLWdyaWQtZmFjZXRpbmctdmVydGljYWwtbGFiZWwtY29sb3IiOnRoaXMuZ3JpZEZhY2V0aW5nVmVydGljYWxMYWJlbENvbG9yLAoiLS1ncmlkLWZhY2V0aW5nLWhvcml6b250YWwtbGFiZWwtY29sb3IiOnRoaXMuZ3JpZEZhY2V0aW5nSG9yaXpvbnRhbExhYmVsQ29sb3IsIi0taXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvciI6dGhpcy5pdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3IsIi0taXRlbS1wb3NpdGlvbmluZy1ob3Jpem9udGFsLWxhYmVsLWNvbG9yIjp0aGlzLml0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yfSl9LF9icmVha1VwQW5kVHJ1bmNhdGUoYSl7cmV0dXJuIGtuKGxuKCIiK2EpKX0sX21heEJ1Y2tldHMoYSxjKXtjb25zdCBkPXRoaXMuc3RhdHM/dGhpcy5zdGF0c1thXTpudWxsO3JldHVybiBkP2MmJnRoaXMuX2hhc1dvcmRUcmVlKGEpP01hdGgubWluKDEwMCxkLndvcmRUcmVlLmhpZ2hlc3RMZXZlbCk6TWF0aC5taW4oMTAwLGQudW5pcXVlQ291bnQrMSk6MTAwfSxfaGFzV29yZFRyZWUoYSl7YT10aGlzLnN0YXRzP3RoaXMuc3RhdHNbYV06bnVsbDsKcmV0dXJuISFhJiYhIWEud29yZFRyZWUmJjE8YS53b3JkVHJlZS5oaWdoZXN0TGV2ZWx9LF9nZXRQb3NpdGlvbk1vZGUoYSxjKXtyZXR1cm4iIj09YSYmIiI9PWM/InN0YWNrZWQiOiJzY2F0dGVyIn0sX29wZW5PdmVyZmxvdygpe3RoaXMuJC5vdmVyZmxvd21lbnUucG9zaXRpb25FbGVtZW50PXRoaXMuJC5vdmVyZmxvd2J0bjt0aGlzLiQub3ZlcmZsb3dtZW51Lm9wZW4oKX0sX3Nob3VsZFNob3dPdmVyZmxvd01lbnUoYSxjLGQpe3JldHVybiB0aGlzLl9pc0tleUNhdGVnb3JpY2FsKGEpfHx0aGlzLl9oYXNXb3JkVHJlZShjKXx8dGhpcy5faGFzV29yZFRyZWUoZCl9fSk7Cjwvc2NyaXB0PgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1kaXZlL2xpYi9pbmZvLXJlbmRlcmVycy5qcwpjb25zdCB3bj0oYSxjKT0+e2NvbnN0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGwiKTtmb3IoY29uc3QgZyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZykpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImR0Iik7Zi50ZXh0Q29udGVudD1nO2QuYXBwZW5kQ2hpbGQoZik7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkZCIpO2YudGV4dENvbnRlbnQ9YVtnXTtkLmFwcGVuZENoaWxkKGYpfWMuYXBwZW5kQ2hpbGQoZCl9Owo8L3NjcmlwdD4KCgo8ZG9tLW1vZHVsZSBpZD0iZmFjZXRzLWRpdmUtaW5mby1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbWF4LWhlaWdodDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICB9CiAgICAgIGR0IHsKICAgICAgICBjb2xvcjogIzllN2M2NTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgICAgZGQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CiAgICAgICAgY29sb3I6ICM1MTM3MjY7CiAgICAgICAgbWFyZ2luOiAwIDAgMTZweCAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0iaG9sZGVyIj48L2Rpdj4KICAgIAogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9mYWNldHMtZGl2ZS9jb21wb25lbnRzL2ZhY2V0cy1kaXZlLWluZm8tY2FyZC9mYWNldHMtZGl2ZS1pbmZvLWNhcmQuanMKUG9seW1lcih7aXM6ImZhY2V0cy1kaXZlLWluZm8tY2FyZCIscHJvcGVydGllczp7aW5mb1JlbmRlcmVyOnt0eXBlOk9iamVjdH0sc2VsZWN0ZWREYXRhOnt0eXBlOkFycmF5LHZhbHVlOltdLG9ic2VydmVyOiJfdXBkYXRlU2VsZWN0ZWQifX0scmVhZHkoKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuaG9sZGVyLCEwKX0sX3VwZGF0ZVNlbGVjdGVkKGEpe3RoaXMuJC5ob2xkZXIuaW5uZXJIVE1MPSIiO2lmKGEpe3ZhciBjPXRoaXMuaW5mb1JlbmRlcmVyfHx3bjtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZj1hW2RdLGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD0iMTAwJSI7dGhpcy4kLmhvbGRlci5hcHBlbmRDaGlsZChnKTtjKGYsZyl9fX19KTsKPC9zY3JpcHQ+CgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iZmFjZXRzLWRpdmUtbGVnZW5kIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICAubGVnZW5kIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYTlhOWE5OwogICAgICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAgIH0KCiAgICAgIC50b3BiYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiAjRTZFNkZBOwogICAgICB9CgogICAgICAuZXhwYW5kLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtYm9keSB7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNhOWE5YTk7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICB9CgogICAgICAubGVnZW5kIC5sYXlvdXQtcm93IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgICAgLmxlZ2VuZCAubGF5b3V0LXJvdyBzcGFuIHsKICAgICAgICBtYXJnaW46IDJweCAwIDAgOHB4OwogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnZW5kIHRhYmxlIHNoaW0uIFBvbHltZXIncyBkb20tcmVwZWF0IGZlYXR1cmUgaGFzIGEga25vd24gaXNzdWUgaW4KICAgICAgICogd2hpY2ggaXQgZG9lc24ndCB3b3JrIHdpdGggPHRyPiBlbGVtZW50cyBpbnNpZGUgb2YgYSA8dGFibGU+LiBTbwogICAgICAgKiBpbnN0ZWFkLCB3ZSB1c2UgQ1NTIHdpdGggY2xhc3NlZCBkaXZzIHRvIGFjaGlldmUgdGFibGUgYmVoYXZpb3IuCiAgICAgICAqLwogICAgICAubGVnZW5kLXRhYmxlIHsKICAgICAgICBkaXNwbGF5OiB0YWJsZTsKICAgICAgICBtYXJnaW4tbGVmdDogMnB4OwogICAgICB9CiAgICAgIC5sZWdlbmQtcm93IHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1jZWxsIHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29sb3IgbGVnZW5kLgogICAgICAgKi8KICAgICAgLmxlZ2VuZCAuY29sb3IgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICAubGVnZW5kIC5jb2xvciBpcm9uLWljb24gewogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxNnB4OwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTZweDsKICAgICAgICBtYXJnaW46IDAgMnB4OwogICAgICB9CiAgICAgIC5sZWdlbmQgLmNvbG9yIGlyb24taWNvbltmaWxsPSIjZmZmZmZmIl0gewogICAgICAgIGJhY2tncm91bmQ6ICNkZGRkZGQ7CiAgICAgIH0KICAgICAgLmxlZ2VuZCAuY29sb3Igc3BhbiB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIC5sZWdlbmQgLnNwZWNpYWwgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQoKICAgICAgLmxlZ2VuZCBoMiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwogICAgICAgIGNvbG9yOiAjNGY0MjNlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgICAubGVnZW5kIC5jb2xvci1ieS1maWVsZCB7CiAgICAgICAgY29sb3I6ICM5NjhlOGM7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAxMi41cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDJweCAwIDRweCAyMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hbnlDb2xvcihjb2xvckJ5LCBwYWxldHRlKV1dIj4KICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0b3BiYXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPkxlZ2VuZDwvZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJleHBhbmQtYnV0dG9uIiBvbi1jbGljaz0iX3RvZ2dsZU9wZW5lZCIgaWNvbj0iW1tfZ2V0SWNvbihfb3BlbmVkKV1dIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGlyb24tY29sbGFwc2UgaWQ9ImNvbGxhcHNlIiBvcGVuZWQ9Int7X29wZW5lZH19Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ib2R5Ij4KICAgICAgICAgICAgPGgyPkNvbG9yczwvaDI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1ieS1maWVsZCI+CiAgICAgICAgICAgICAgYnkgW1tfYnJlYWtVcEFuZFRydW5jYXRlKGNvbG9yQnkpXV0KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBwb3NpdGlvbj0idG9wIj5bW2NvbG9yQnldXTwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgPC9zcGFuPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLXRhYmxlIj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3BhbGV0dGVdXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtcm93IGNvbG9yIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNlbGwiPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iYXY6ZmliZXItbWFudWFsLXJlY29yZCIgZmlsbCQ9IltbaXRlbS5jb2xvcl1dIiBzdHlsZSQ9ImZpbGw6W1tpdGVtLmNvbG9yXV0iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNlbGwiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzJD0iW1tfc3BlY2lhbENsYXNzKGl0ZW0uY29udGVudC5zcGVjaWFsKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIFtbX2JyZWFrVXBBbmRUcnVuY2F0ZShpdGVtLmNvbnRlbnQubGFiZWwpXV0KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgcG9zaXRpb249InRvcCI+W1tpdGVtLmNvbnRlbnQubGFiZWxdXTwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1kaXZlL2NvbXBvbmVudHMvZmFjZXRzLWRpdmUtbGVnZW5kL2ZhY2V0cy1kaXZlLWxlZ2VuZC5qcwpQb2x5bWVyKHtpczoiZmFjZXRzLWRpdmUtbGVnZW5kIixwcm9wZXJ0aWVzOntjb2xvckJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIixvYnNlcnZlcjoiX29wZW4ifSxwYWxldHRlOnt0eXBlOkFycmF5LHZhbHVlOltdfSxfb3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxfYnJlYWtVcEFuZFRydW5jYXRlKGEpe3JldHVybiBrbihsbigiIithKSl9LF9hbnlDb2xvcigpe3JldHVybiEhKHRoaXMuY29sb3JCeSYmdGhpcy5wYWxldHRlJiZ0aGlzLnBhbGV0dGUubGVuZ3RoKX0sX3NwZWNpYWxDbGFzcyhhKXtyZXR1cm4gYT8ic3BlY2lhbCI6IiJ9LF9vcGVuKCl7dGhpcy5fb3BlbmVkPSEwfSxfdG9nZ2xlT3BlbmVkKCl7dGhpcy5fb3BlbmVkPSF0aGlzLl9vcGVuZWR9LF9nZXRJY29uKGEpe3JldHVybiBhPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn19KTsKPC9zY3JpcHQ+CgoKCjxkb20tbW9kdWxlIGlkPSJmYWNldHMtZGl2ZSI+CiAgPHRlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgLyoqCiAgICAgICAqIHBhcGVyLWlucHV0LWNvbnRhaW5lciB1c2VzIGFuIGVsZW1lbnQgY29udGFpbmluZyBvbmx5ICZuYnNwOyBmb3IKICAgICAgICogc3BhY2luZyBwdXJwb3Nlcy4gQWdncmVzc2l2ZSB2dWxjYW5pemVycyBzb21ldGltZXMgcmVtb3ZlIHRoaXMgY29udGVudC4KICAgICAgICogVGhpcyBDU1MgcnVsZSBmb3JjZXMgdGhlIGNvbnRhaW5pbmcgZWxlbWVudCB0byBoYXZlIHRoZSBjb3JyZWN0IGhlaWdodAogICAgICAgKiBpbiBlaXRoZXIgY2FzZS4KICAgICAgICovCiAgICAgIDpob3N0IHBhcGVyLWlucHV0LWNvbnRhaW5lciA+IC5mbG9hdGVkLWxhYmVsLXBsYWNlaG9sZGVyIHsKICAgICAgICBtaW4taGVpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuZmlsbCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5tYWluIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CiAgICAgIGZhY2V0cy1kaXZlLWNvbnRyb2xzIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2QzZDNkMzsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgaGVpZ2h0OiA2MHB4OwogICAgICB9CiAgICAgIC5yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICBmYWNldHMtZGl2ZS1sZWdlbmQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDE0cHg7CiAgICAgICAgcmlnaHQ6IDI0cHg7CiAgICAgIH0KICAgICAgLnpvb20tY29udHJvbHMgewogICAgICAgIGJvdHRvbTogMTRweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CiAgICAgIC56b29tLWNvbnRyb2xzIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U3ZTdlNzsKICAgICAgICBjbGVhcjogbGVmdDsKICAgICAgICBjb2xvcjogIzJiMmIyYjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXJnaW46IDRweCA4cHg7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgfQogICAgICBmYWNldHMtZGl2ZS1pbmZvLWNhcmQgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY4ZjQ7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYzZjNmM2OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHdpZHRoOiAyNDBweDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJmaWxsIG1haW4iPgogICAgICA8ZmFjZXRzLWRpdmUtY29udHJvbHMgaWQ9ImNvbnRyb2xzIiBhdGxhcy11cmw9IltbYXRsYXNVcmxdXSIga2V5cz0iW1tfa2V5c11dIiBzdGF0cz0iW1tzdGF0c11dIiB2ZXJ0aWNhbC1mYWNldD0ie3t2ZXJ0aWNhbEZhY2V0fX0iIHZlcnRpY2FsLWJ1Y2tldHM9Int7dmVydGljYWxCdWNrZXRzfX0iIHZlcnRpY2FsLWJhZy1vZi13b3Jkcz0ie3t2ZXJ0aWNhbEJhZ09mV29yZHN9fSIgaG9yaXpvbnRhbC1mYWNldD0ie3tob3Jpem9udGFsRmFjZXR9fSIgaG9yaXpvbnRhbC1idWNrZXRzPSJ7e2hvcml6b250YWxCdWNrZXRzfX0iIGhvcml6b250YWwtYmFnLW9mLXdvcmRzPSJ7e2hvcml6b250YWxCYWdPZldvcmRzfX0iIHBvc2l0aW9uLW1vZGU9Int7cG9zaXRpb25Nb2RlfX0iIHZlcnRpY2FsLXBvc2l0aW9uPSJ7e3ZlcnRpY2FsUG9zaXRpb259fSIgaG9yaXpvbnRhbC1wb3NpdGlvbj0ie3tob3Jpem9udGFsUG9zaXRpb259fSIgY29sb3ItYnk9Int7Y29sb3JCeX19IiBpbWFnZS1maWVsZC1uYW1lPSJ7e2ltYWdlRmllbGROYW1lfX0iIHBhbGV0dGU9IltbX3BhbGV0dGVdXSIgcGFsZXR0ZS1jaG9pY2U9Int7cGFsZXR0ZUNob2ljZX19IiBncmlkLWZhY2V0aW5nLXZlcnRpY2FsLWxhYmVsLWNvbG9yPSJbW2dyaWRGYWNldGluZ1ZlcnRpY2FsTGFiZWxDb2xvcl1dIiBncmlkLWZhY2V0aW5nLWhvcml6b250YWwtbGFiZWwtY29sb3I9IltbZ3JpZEZhY2V0aW5nSG9yaXpvbnRhbExhYmVsQ29sb3JdXSIgaXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcj0iW1tpdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3JdXSIgaXRlbS1wb3NpdGlvbmluZy1ob3Jpem9udGFsLWxhYmVsLWNvbG9yPSJbW2l0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yXV0iPjwvZmFjZXRzLWRpdmUtY29udHJvbHM+CgogICAgICA8ZGl2IGNsYXNzPSJmaWxsIHJvdyI+CiAgICAgICAgPGRpdiBjbGFzcz0iZmlsbCI+CiAgICAgICAgICA8ZmFjZXRzLWRpdmUtdmlzIGlkPSJ2aXMiIGNsYXNzPSJmaWxsIiBkYXRhPSJbW2RhdGFdXSIgZmlsdGVyZWQtZGF0YS1pbmRpY2VzPSJbW2ZpbHRlcmVkRGF0YUluZGljZXNdXSIgYXRsYXMtdXJsPSJbW2F0bGFzVXJsXV0iIHNwcml0ZS11cmw9Iltbc3ByaXRlVXJsXV0iIGNyb3NzLW9yaWdpbj0iW1tjcm9zc09yaWdpbl1dIiBrZXlzPSJ7e19rZXlzfX0iIHN0YXRzPSJ7e3N0YXRzfX0iIHNwcml0ZS1pbWFnZS13aWR0aD0iW1tzcHJpdGVJbWFnZVdpZHRoXV0iIHNwcml0ZS1pbWFnZS1oZWlnaHQ9Iltbc3ByaXRlSW1hZ2VIZWlnaHRdXSIgdmVydGljYWwtZmFjZXQ9IltbdmVydGljYWxGYWNldF1dIiB2ZXJ0aWNhbC1idWNrZXRzPSJbW3ZlcnRpY2FsQnVja2V0c11dIiB2ZXJ0aWNhbC1iYWctb2Ytd29yZHM9IltbdmVydGljYWxCYWdPZldvcmRzXV0iIGhvcml6b250YWwtZmFjZXQ9IltbaG9yaXpvbnRhbEZhY2V0XV0iIGhvcml6b250YWwtYnVja2V0cz0iW1tob3Jpem9udGFsQnVja2V0c11dIiBob3Jpem9udGFsLWJhZy1vZi13b3Jkcz0iW1tob3Jpem9udGFsQmFnT2ZXb3Jkc11dIiBwb3NpdGlvbi1tb2RlPSJbW3Bvc2l0aW9uTW9kZV1dIiB2ZXJ0aWNhbC1wb3NpdGlvbj0iW1t2ZXJ0aWNhbFBvc2l0aW9uXV0iIGhvcml6b250YWwtcG9zaXRpb249IltbaG9yaXpvbnRhbFBvc2l0aW9uXV0iIGNvbG9yLWJ5PSJ7e2NvbG9yQnl9fSIgaW1hZ2UtZmllbGQtbmFtZT0ie3tpbWFnZUZpZWxkTmFtZX19IiBwYWxldHRlPSJ7e19wYWxldHRlfX0iIHBhbGV0dGUtY2hvaWNlPSJbW3BhbGV0dGVDaG9pY2VdXSIgZ3JpZC1mYWNldGluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcj0ie3tncmlkRmFjZXRpbmdWZXJ0aWNhbExhYmVsQ29sb3J9fSIgZ3JpZC1mYWNldGluZy1ob3Jpem9udGFsLWxhYmVsLWNvbG9yPSJ7e2dyaWRGYWNldGluZ0hvcml6b250YWxMYWJlbENvbG9yfX0iIGl0ZW0tcG9zaXRpb25pbmctdmVydGljYWwtbGFiZWwtY29sb3I9Int7aXRlbVBvc2l0aW9uaW5nVmVydGljYWxMYWJlbENvbG9yfX0iIGl0ZW0tcG9zaXRpb25pbmctaG9yaXpvbnRhbC1sYWJlbC1jb2xvcj0ie3tpdGVtUG9zaXRpb25pbmdIb3Jpem9udGFsTGFiZWxDb2xvcn19IiBmaXQtZ3JpZC1hc3BlY3QtcmF0aW8tdG8tdmlld3BvcnQ9IltbZml0R3JpZEFzcGVjdFJhdGlvVG9WaWV3cG9ydF1dIiBzZWxlY3RlZC1kYXRhPSJ7e3NlbGVjdGVkRGF0YX19IiBzZWxlY3RlZC1pbmRpY2VzPSJ7e3NlbGVjdGVkSW5kaWNlc319IiBjb21wYXJlZC1kYXRhPSJ7e2NvbXBhcmVkRGF0YX19IiBjb21wYXJlZC1pbmRpY2VzPSJ7e2NvbXBhcmVkSW5kaWNlc319IiBzdGFibGUtY29sb3JzPSJbW3N0YWJsZUNvbG9yc11dIj48L2ZhY2V0cy1kaXZlLXZpcz4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ6b29tLWNvbnRyb2xzIj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgaWQ9Inpvb21JbkJ1dHRvbiI+CiAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczphZGQiPjwvaXJvbi1pY29uPgogICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgaWQ9Inpvb21PdXRCdXR0b24iPgogICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iaWNvbnM6cmVtb3ZlIj48L2lyb24taWNvbj4KICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGlkPSJmaXRCdXR0b24iPgogICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iaWNvbnM6YXNwZWN0LXJhdGlvIj48L2lyb24taWNvbj4KICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZmFjZXRzLWRpdmUtbGVnZW5kIGlkPSJsZWdlbmQiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgcGFsZXR0ZT0iW1tfcGFsZXR0ZV1dIj4KICAgICAgICAgIDwvZmFjZXRzLWRpdmUtbGVnZW5kPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWhpZGVJbmZvQ2FyZF1dIj4KICAgICAgICAgIDxmYWNldHMtZGl2ZS1pbmZvLWNhcmQgaWQ9ImluZm9DYXJkIiBzZWxlY3RlZC1kYXRhPSJbW3NlbGVjdGVkRGF0YV1dIiBpbmZvLXJlbmRlcmVyPSJbW2luZm9SZW5kZXJlcl1dIj4KICAgICAgICAgIDwvZmFjZXRzLWRpdmUtaW5mby1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9mYWNldHMtZGl2ZS9jb21wb25lbnRzL2ZhY2V0cy1kaXZlL2ZhY2V0cy1kaXZlLmpzClBvbHltZXIoe2lzOiJmYWNldHMtZGl2ZSIscHJvcGVydGllczp7ZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsLG5vdGlmeTohMH0sZmlsdGVyZWREYXRhSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfa2V5czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sc3RhdHM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9LG5vdGlmeTohMH0sYXRsYXNVcmw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGwsbm90aWZ5OiEwfSxzcHJpdGVVcmw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGwsbm90aWZ5OiEwfSxjcm9zc09yaWdpbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbCxub3RpZnk6ITB9LHNwcml0ZUltYWdlV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjY0fSxzcHJpdGVJbWFnZUhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6NjR9LGdyaWRGYWNldGluZ1ZlcnRpY2FsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiM2NjY2NjYifSxncmlkRmFjZXRpbmdIb3Jpem9udGFsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsCnZhbHVlOiIjZGQ2NjIyIn0saXRlbVBvc2l0aW9uaW5nVmVydGljYWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiIzIyNTVhYSJ9LGl0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiIzExODg0NCJ9LGZpdEdyaWRBc3BlY3RSYXRpb1RvVmlld3BvcnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sdmVydGljYWxGYWNldDp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSx2ZXJ0aWNhbEJ1Y2tldHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG5vdGlmeTohMH0sdmVydGljYWxCYWdPZldvcmRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxob3Jpem9udGFsRmFjZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saG9yaXpvbnRhbEJ1Y2tldHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG5vdGlmeTohMH0saG9yaXpvbnRhbEJhZ09mV29yZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LApwb3NpdGlvbk1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFja2VkIixub3RpZnk6ITB9LHZlcnRpY2FsUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saG9yaXpvbnRhbFBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LGNvbG9yQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saW1hZ2VGaWVsZE5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sX3BhbGV0dGU6e3R5cGU6QXJyYXksdmFsdWU6W119LHBhbGV0dGVDaG9pY2U6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFuZGFyZCIsbm90aWZ5OiEwfSxzZWxlY3RlZERhdGE6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxzZWxlY3RlZEluZGljZXM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxjb21wYXJlZERhdGE6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxjb21wYXJlZEluZGljZXM6e3R5cGU6QXJyYXksdmFsdWU6W10sCm5vdGlmeTohMH0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTpudWxsLG9ic2VydmVyOiJfdXBkYXRlSGVpZ2h0In0saW5mb1JlbmRlcmVyOnt0eXBlOk9iamVjdH0saGlkZUluZm9DYXJkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHN0YWJsZUNvbG9yczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0scmVhZHkoKXtjb25zdCBhPXRoaXMuJDthLmZpdEJ1dHRvbi5vbmNsaWNrPSgpPT5hLnZpcy5maXRUb1ZpZXdwb3J0KCk7YS56b29tSW5CdXR0b24ub25jbGljaz0oKT0+YS52aXMuem9vbUluKCk7YS56b29tT3V0QnV0dG9uLm9uY2xpY2s9KCk9PmEudmlzLnpvb21PdXQoKTt0aGlzLmhpZGVJbmZvQ2FyZCYmKGEudmlzLnN0eWxlLnJpZ2h0PSIwIik7dGhpcy5fdXBkYXRlSGVpZ2h0KCl9LF91cGRhdGVIZWlnaHQoKXtudWxsIT09dGhpcy5oZWlnaHQmJih0aGlzLnN0eWxlLmhlaWdodD0ibnVtYmVyIj09PXR5cGVvZiB0aGlzLmhlaWdodD90aGlzLmhlaWdodCsicHgiOnRoaXMuaGVpZ2h0KX19KTsKPC9zY3JpcHQ+CgoKCgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9mYWNldHMtb3ZlcnZpZXcvY29tbW9uL2ZlYXR1cmVfc3RhdGlzdGljc19nZW5lcmF0b3IuanMKY2xhc3MgeG57Y29uc3RydWN0b3IoKXt0aGlzLnZhbHM9W107dGhpcy5jb3VudHM9W119fWZ1bmN0aW9uIHluKGEpe2NvbnN0IGM9bmV3IHBpO2EuZm9yRWFjaChkPT57Y29uc3QgZj16bihkLmRhdGEpO2Yuc2V0TmFtZShkLm5hbWUpO2MuZ2V0RGF0YXNldHNMaXN0KCkucHVzaChmKX0pO3JldHVybiBjfQpmdW5jdGlvbiB6bihhKXtjb25zdCBjPXt9O2lmKG51bGw9PWEpcmV0dXJuIG5ldyBsajthLmZvckVhY2goKGQsZik9PntpZihudWxsIT1kKXt2YXIgZz1PYmplY3Qua2V5cyhkKSxsPXt9O2ZvcihsZXQgaz0wO2s8Zy5sZW5ndGg7aysrKXtjb25zdCBtPWdba10scD1kW21dO2xbbV09ITA7bSBpbiBjfHwoY1ttXT1uZXcgeG4sY1ttXS5taXNzaW5nPWYsY1ttXS5jb3VudHM9W10pOyJudW1iZXIiPT09dHlwZW9mIHB8fCJzdHJpbmciPT09dHlwZW9mIHA/KGNbbV0udmFscy5wdXNoKHApLGNbbV0uY291bnRzLnB1c2goMSkpOnAgaW5zdGFuY2VvZiBBcnJheSYmKGNbbV0uY291bnRzLnB1c2gocC5sZW5ndGgpLGNbbV0udmFscy5wdXNoKC4uLnApKX1PYmplY3Qua2V5cyhjKS5mb3JFYWNoKGs9PntrIGluIGx8fChjW2tdLm1pc3NpbmcrPTEpfSl9fSk7T2JqZWN0LmtleXMoYykuZm9yRWFjaChkPT57bGV0IGY9MCxnPTAsbD0hMTtjW2RdLnZhbHMuZm9yRWFjaChrPT57InN0cmluZyI9PT0KdHlwZW9mIGs/Zis9MTooZys9MSxsPWx8fCFBbihrKSl9KTtjW2RdLnR5cGU9Zz5mP2w/MTowOjJ9KTtyZXR1cm4gQm4oYyxhLmxlbmd0aCl9ZnVuY3Rpb24gQW4oYSl7cmV0dXJuIGE9PT0rYSYmYT09PShhfDApfWZ1bmN0aW9uIEJuKGEsYyl7Y29uc3QgZD1uZXcgbGo7ZC5zZXROdW1FeGFtcGxlcyhjKTtmb3IoY29uc3QgZiBpbiBhKXtpZighYS5oYXNPd25Qcm9wZXJ0eShmKSljb250aW51ZTtjb25zdCBnPW5ldyBuajtkLmdldEZlYXR1cmVzTGlzdCgpLnB1c2goZyk7Y29uc3QgbD1hW2ZdO2cuc2V0TmFtZShmKTtnLnNldFR5cGUobC50eXBlKTsxPT09bC50eXBlfHwwPT09bC50eXBlP2cuc2V0TnVtU3RhdHMoQ24obC52YWxzLGwuY291bnRzLGMsbC5taXNzaW5nKSk6Mj09PWwudHlwZSYmZy5zZXRTdHJpbmdTdGF0cyhEbihsLnZhbHMsbC5jb3VudHMsYyxsLm1pc3NpbmcpKX1yZXR1cm4gZH0KZnVuY3Rpb24gQ24oYSxjLGQsZil7Y29uc3QgZz1uZXcgdGo7Zy5zZXRDb21tb25TdGF0cyhFbihjLGQsZikpO2xldCBsPTAsaz0wLG09MDtjPWEuZmlsdGVyKHQ9PiJudW1iZXIiPT09dHlwZW9mIHQmJiFpc05hTih0KSkubWFwKHQ9Pit0KS5zb3J0KCh0LHYpPT50LXYpOzA8Yy5sZW5ndGgmJihnLnNldE1pbihjWzBdKSxnLnNldE1heChjW2MubGVuZ3RoLTFdKSxkPU1hdGguZmxvb3IoYy5sZW5ndGgvMiksZy5zZXRNZWRpYW4oMCE9PWMubGVuZ3RoJTI/Y1tkXTooY1tkXStjW2QtMV0pLzIpKTtjLmZvckVhY2godD0+ezA9PT10JiYobSs9MSk7bCs9dDtrKz10KnR9KTsxPGMubGVuZ3RoJiZnLnNldFN0ZERldihNYXRoLnNxcnQoKGstbCpsL2MubGVuZ3RoKS8oYy5sZW5ndGgtMSkpKTtnLnNldE1lYW4obC9hLmxlbmd0aCk7Zy5zZXROdW1aZXJvcyhtKTthPWMuZmlsdGVyKHQ9PkluZmluaXR5IT09dCYmLUluZmluaXR5IT09dCk7ZD1jLmZpbHRlcih0PT5JbmZpbml0eT09PXQpLmxlbmd0aDsKZj1jLmZpbHRlcih0PT4tSW5maW5pdHk9PT10KS5sZW5ndGg7dmFyIHA9YVswXTtjb25zdCBxPWFbYS5sZW5ndGgtMV07cD1kMy5yYW5nZShwLHEsKHEtcCkvMTApO3A9ZDMuaGlzdG9ncmFtKCkudGhyZXNob2xkcyhwKShhKTtsZXQgcj1nLmFkZEhpc3RvZ3JhbXMoKTtyLnNldFR5cGUoMCk7cC5mb3JFYWNoKHQ9Pntjb25zdCB2PXIuYWRkQnVja2V0cygpO3Yuc2V0U2FtcGxlQ291bnQodC5sZW5ndGgpO3Yuc2V0TG93VmFsdWUodC54MCk7di5zZXRIaWdoVmFsdWUodC54MSl9KTtwPXIuZ2V0QnVja2V0c0xpc3QoKTtjLmxlbmd0aCYmLUluZmluaXR5PT09Y1swXSYmKHBbMF0uc2V0TG93VmFsdWUoLUluZmluaXR5KSxwWzBdLnNldFNhbXBsZUNvdW50KHBbMF0uZ2V0U2FtcGxlQ291bnQoKStmKSk7Yy5sZW5ndGgmJkluZmluaXR5PT09Y1tjLmxlbmd0aC0xXSYmKHBbcC5sZW5ndGgtMV0uc2V0SGlnaFZhbHVlKEluZmluaXR5KSxwW3AubGVuZ3RoLTFdLnNldFNhbXBsZUNvdW50KHBbcC5sZW5ndGgtCjFdLmdldFNhbXBsZUNvdW50KCkrZCkpO3I9Zy5hZGRIaXN0b2dyYW1zKCk7Rm4ocixhKTtyZXR1cm4gZ31mdW5jdGlvbiBGbihhLGMpe3ZhciBkPVswLDEwLDIwLDMwLDQwLDUwLDYwLDcwLDgwLDkwLDEwMF07Y29uc3QgZj1kLmxlbmd0aC0xO2Q9ZC5tYXAobD0+R24oYyxsKSk7YS5zZXRUeXBlKDEpO2NvbnN0IGc9Yy5sZW5ndGgvZjtmb3IobGV0IGw9MDtsPGY7bCsrKXtjb25zdCBrPWEuYWRkQnVja2V0cygpO2suc2V0U2FtcGxlQ291bnQoZyk7ay5zZXRMb3dWYWx1ZShkW2xdKTtrLnNldEhpZ2hWYWx1ZShkW2wrMV0pfX1mdW5jdGlvbiBHbihhLGMpe2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gTmFOO2M9Yy8xMDAqKGEubGVuZ3RoLTEpO2NvbnN0IGQ9TWF0aC5mbG9vcihjKTtyZXR1cm4gZD09PWM/YVtjXTphW2RdKyhhW2QrMV0tYVtkXSkqKGMtZCl9CmZ1bmN0aW9uIERuKGEsYyxkLGYpe2NvbnN0IGc9bmV3IHZqO2cuc2V0Q29tbW9uU3RhdHMoRW4oYyxkLGYpKTtsZXQgbD0wO2NvbnN0IGs9e307YS5mb3JFYWNoKHE9PntxPVN0cmluZyhxKTtrW3FdPShrW3FdfHwwKSsxO2wrPXEubGVuZ3RofSk7MDxhLmxlbmd0aCYmZy5zZXRBdmdMZW5ndGgobC9hLmxlbmd0aCk7YT1bXTtmb3IodmFyIG0gaW4gaylrLmhhc093blByb3BlcnR5KG0pJiZhLnB1c2goe3N0cjptLGNvdW50OmtbbV19KTtnLnNldFVuaXF1ZShhLmxlbmd0aCk7YT1hLnNvcnQoKHEscik9PnIuY291bnQtcS5jb3VudCk7Y29uc3QgcD1uZXcgSWo7Zy5zZXRSYW5rSGlzdG9ncmFtKHApO2EubGVuZ3RoJiYobT1nLmFkZFRvcFZhbHVlcygpLG0uc2V0VmFsdWUoYVswXS5zdHIpLG0uc2V0RnJlcXVlbmN5KGFbMF0uY291bnQpKTthLmZvckVhY2goKHEscik9Pntjb25zdCB0PXAuYWRkQnVja2V0cygpO3Quc2V0U2FtcGxlQ291bnQocS5jb3VudCk7dC5zZXRMb3dSYW5rKHIpOwp0LnNldEhpZ2hSYW5rKHIpO3Quc2V0TGFiZWwocS5zdHIpfSk7cmV0dXJuIGd9ZnVuY3Rpb24gRW4oYSxjLGQpe2NvbnN0IGY9bmV3IEVqO2xldCBnPUluZmluaXR5LGw9MCxrPTA7YS5mb3JFYWNoKG09PnttPGcmJihnPW0pO20+bCYmKGw9bSk7ays9bX0pO2Yuc2V0TnVtTm9uTWlzc2luZyhjLWQpO2Yuc2V0TnVtTWlzc2luZyhkKTtmLnNldE1pbk51bVZhbHVlcyhnKTtmLnNldE1heE51bVZhbHVlcyhsKTswPGEubGVuZ3RoJiZmLnNldEF2Z051bVZhbHVlcyhrL2EubGVuZ3RoKTtjPW5ldyBGajtmLnNldE51bVZhbHVlc0hpc3RvZ3JhbShjKTtGbihjLGEpO3JldHVybiBmfTsKPC9zY3JpcHQ+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9mYWNldHMtb3ZlcnZpZXcvY29tbW9uL3V0aWxzLmpzCmNsYXNzIEhue31jbGFzcyBJbntjb25zdHJ1Y3RvcihhLGMsZCxmLGcsbCxrLG0pe3RoaXMuaGlzdE1hcD17fTt0aGlzLm5hbWU9YTtjJiYodGhpcy5oaXN0TWFwW0puKCExLCJTdGFuZGFyZCIpXT1jKTtkJiYodGhpcy5oaXN0TWFwW0puKCEwLCJTdGFuZGFyZCIpXT1kKTtmJiYodGhpcy5oaXN0TWFwW0puKCExLCJRdWFudGlsZXMiKV09Zik7ZyYmKHRoaXMuaGlzdE1hcFtKbighMCwiUXVhbnRpbGVzIildPWcpO2wmJih0aGlzLmhpc3RNYXBbSm4oITEsIlZhbHVlIGxpc3QgbGVuZ3RoIildPWwpO2smJih0aGlzLmhpc3RNYXBbSm4oITEsIkZlYXR1cmUgbGlzdCBsZW5ndGgiKV09ayk7bSYmT2JqZWN0LmtleXMobSkuZm9yRWFjaChwPT50aGlzLmhpc3RNYXBbcF09bVtwXSl9fQpjbGFzcyBxcHtjb25zdHJ1Y3RvcihhLGMsZCxmKXt0aGlzLm5hbWU9YTt0aGlzLnN0cmluZ1ZhbHVlPWM7dGhpcy5sb3dOdW1WYWx1ZT1kO3RoaXMuaGlnaE51bVZhbHVlPWZ9Y2xlYXIoKXt0aGlzLmhpZ2hOdW1WYWx1ZT10aGlzLmxvd051bVZhbHVlPXRoaXMuc3RyaW5nVmFsdWU9dGhpcy5uYW1lPXZvaWQgMH1lcXVhbHMoYSl7cmV0dXJuIGE/dGhpcy5uYW1lPT09YS5uYW1lJiZ0aGlzLnN0cmluZ1ZhbHVlPT09YS5zdHJpbmdWYWx1ZSYmdGhpcy5sb3dOdW1WYWx1ZT09PWEubG93TnVtVmFsdWUmJnRoaXMuaGlnaE51bVZhbHVlPT09YS5oaWdoTnVtVmFsdWU6ITF9fQpmdW5jdGlvbiBycChhKXtjb25zdCBjPXNwKGEpO2lmKDA9PT1jKXJldHVybiAwO2NvbnN0IGQ9YS5yZWR1Y2UoKGYsZyk9PntnPStnLmdldFNhbXBsZUNvdW50KCl8fDA7aWYoMD09PWcpcmV0dXJuIGY7Zy89YztyZXR1cm4gZi1nKk1hdGgubG9nKGcpfSwwKTtyZXR1cm4gMD09PWQ/MDpkL01hdGgubG9nKGEubGVuZ3RoKX1mdW5jdGlvbiB0cChhLGMpe3JldHVybiBpc0Zpbml0ZShhKSYmLTE9PT1hLnRvU3RyaW5nKCkuaW5kZXhPZigiZSIpPysoTWF0aC5yb3VuZChOdW1iZXIoYSsiZSsiK2MpKSsiZS0iK2MpOmF9ZnVuY3Rpb24gdXAoYSxjLGQpe3JldHVybihhPWEuaGlzdE1hcFtKbihjLGQpXSk/YS5nZXRCdWNrZXRzTGlzdCgpOltdfWZ1bmN0aW9uIEpuKGEsYyl7Yz1udWxsPT1jPyJTdGFuZGFyZCI6YzthJiYoYz0id2VpZ2h0ZWQiK2MpO3JldHVybiBjfQpmdW5jdGlvbiBzcChhKXtyZXR1cm4gYS5tYXAoYz0+Yy5nZXRTYW1wbGVDb3VudCgpKS5yZWR1Y2UoKGMsZCk9PigrZHx8MCkrYywwKX1mdW5jdGlvbiB2cChhKXtyZXR1cm4gYS5tYXAoYz0+c3AodXAoYywhMSkpKX1mdW5jdGlvbiB3cChhKXtjb25zdCBjPVtdO2EuZm9yRWFjaChkPT57ZC5mb3JFYWNoKGY9PntmPXhwKGYuZ2V0TGFiZWwoKSk7LTE9PT1jLmluZGV4T2YoZikmJmMucHVzaChmKX0pfSk7cmV0dXJuIGN9ZnVuY3Rpb24geHAoYSl7cmV0dXJuIG51bGw9PWF8fCIiPT09YT8iXHUwMGEwIjphfWZ1bmN0aW9uIHlwKGEpe3JldHVybiAwPT09YS5sZW5ndGh8fGlzTmFOKCthKT9hOiciJythKyciJ31mdW5jdGlvbiB6cChhKXtyZXR1cm4gbnVsbD09YT8wOiJpbmYiPT09YT9JbmZpbml0eToiLWluZiI9PT1hPy1JbmZpbml0eTorYX0KZnVuY3Rpb24gQXAoYSl7bGV0IGM9MDt2YXIgZD0wO2NvbnN0IGY9QnAoYSk7YSYmYS5nZXROdW1TdGF0cygpJiYoYT1hLmdldE51bVN0YXRzKCksYys9enAoYS5nZXROdW1aZXJvcygpKSk7ZiYmKGQ9enAoZi5nZXROdW1NaXNzaW5nKCkpLGMrPWQsZD16cChmLmdldE51bU5vbk1pc3NpbmcoKSkrZCk7cmV0dXJuIDA9PT1kPzE6Yy9kfQpmdW5jdGlvbiBDcChhKXtjb25zdCBjPWEubWFwKEE9PnVwKEEsITEpKTt2YXIgZD1udWxsO2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKWlmKDA8Y1tmXS5sZW5ndGgpe2Q9Y1tmXVswXTticmVha31pZighZClyZXR1cm4gMDtmPXZwKGEpO2Zvcih2YXIgZz0wO2c8Zi5sZW5ndGg7ZysrKWlmKDA9PT1mW2ddKXJldHVybiBJbmZpbml0eTtnPTA7aWYoZCBpbnN0YW5jZW9mIEtqKXtkPXdwKGMpO2Zvcih2YXIgbD0xO2w8YS5sZW5ndGg7bCsrKXt2YXIgaz1jWzBdLG09Y1tsXSxwPTA7Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe3ZhciByPWRbcV0sdD0wO2xldCBBPTA7Zm9yKHZhciB2PTA7djxrLmxlbmd0aDt2KyspaWYoa1t2XS5nZXRMYWJlbCgpPT09cil7dD1rW3ZdLmdldFNhbXBsZUNvdW50KCk/a1t2XS5nZXRTYW1wbGVDb3VudCgpOjA7YnJlYWt9Zm9yKHY9MDt2PG0ubGVuZ3RoO3YrKylpZihtW3ZdLmdldExhYmVsKCk9PT1yKXtBPW1bdl0uZ2V0U2FtcGxlQ291bnQoKT8KbVt2XS5nZXRTYW1wbGVDb3VudCgpOjA7YnJlYWt9cD1EcChwLHQsZlswXSxBLGZbbF0pfWc9TWF0aC5tYXgoZyxwKX19ZWxzZSBmb3IoZD0xO2Q8YS5sZW5ndGg7ZCsrKXtsPWNbMF07az1jW2RdO209MDtwPU1hdGgubWF4KGwubGVuZ3RoLGsubGVuZ3RoKTtmb3IocT0wO3E8cDtxKyspcj1xPGwubGVuZ3RoJiZsW3FdLmdldFNhbXBsZUNvdW50KCk/bFtxXS5nZXRTYW1wbGVDb3VudCgpOjAsdD1xPGsubGVuZ3RoJiZrW3FdLmdldFNhbXBsZUNvdW50KCk/a1txXS5nZXRTYW1wbGVDb3VudCgpOjAsbT1EcChtLHIsZlswXSx0LGZbZF0pO2c9TWF0aC5tYXgoZyxtKX1yZXR1cm4gZ31mdW5jdGlvbiBEcChhLGMsZCxmLGcpe2NvbnN0IGw9Yy9kLWYvZztjPWMvKGQqZCkrZi8oZypnKTtyZXR1cm4gYSsoYz9sKmwvYzowKX1mdW5jdGlvbiBFcChhLGMpe3JldHVybiBjPT09YT9jLnRvTG9jYWxlU3RyaW5nKCk6YS50b0xvY2FsZVN0cmluZygpKyIvIitjLnRvTG9jYWxlU3RyaW5nKCl9CmZ1bmN0aW9uIEZwKGEpe3JldHVybiBudWxsIT1hLmdldE51bVN0YXRzKCl9CmZ1bmN0aW9uIEdwKGEpe2EuZ2V0RGF0YXNldHNMaXN0KCkuZm9yRWFjaChjPT57Yy5nZXRGZWF0dXJlc0xpc3QoKS5mb3JFYWNoKGQ9Pnt2YXIgZj1kLmdldFBhdGgoKTtudWxsIT1mJiYoZj1mLmdldFN0ZXBMaXN0KCksbnVsbCE9ZiYmZC5zZXROYW1lKGYuam9pbigiLyIpKSk7Zj1bXTtpZihkLmdldFN0cmluZ1N0YXRzKCkpe2NvbnN0IGc9ZC5nZXRTdHJpbmdTdGF0cygpLmdldFJhbmtIaXN0b2dyYW0oKTtnJiZmLnB1c2goZyk7KGQ9ZC5nZXRTdHJpbmdTdGF0cygpLmdldFRvcFZhbHVlc0xpc3QoKSkmJmQuZm9yRWFjaChsPT57Y29uc3Qgaz1sLmdldERlcHJlY2F0ZWRGcmVxKCk7ayYmIWwuZ2V0RnJlcXVlbmN5KCkmJmwuc2V0RnJlcXVlbmN5KGspfSl9ZWxzZSBkLmdldE51bVN0YXRzKCkmJihkPWQuZ2V0TnVtU3RhdHMoKS5nZXRIaXN0b2dyYW1zTGlzdCgpKSYmKGY9Zi5jb25jYXQoZCkpO2YuZm9yRWFjaChnPT57KGc9Zy5nZXRCdWNrZXRzTGlzdCgpKSYmZy5mb3JFYWNoKGw9Pgp7Y29uc3Qgaz1sLmdldERlcHJlY2F0ZWRDb3VudCgpO2smJiFsLmdldFNhbXBsZUNvdW50KCkmJmwuc2V0U2FtcGxlQ291bnQoayl9KX0pfSl9KTtyZXR1cm4gYX0KZnVuY3Rpb24gSHAoYSl7bGV0IGM9ITA7YS5nZXREYXRhc2V0c0xpc3QoKS5mb3JFYWNoKGQ9PntkLmdldEZlYXR1cmVzTGlzdCgpLmZvckVhY2goZj0+e2xldCBnPVtdO2lmKGYuZ2V0U3RyaW5nU3RhdHMoKSl7Y29uc3QgbD1mLmdldFN0cmluZ1N0YXRzKCkuZ2V0UmFua0hpc3RvZ3JhbSgpO2wmJmcucHVzaChsKTsoZj1mLmdldFN0cmluZ1N0YXRzKCkuZ2V0VG9wVmFsdWVzTGlzdCgpKSYmZi5mb3JFYWNoKGs9PntrLmdldERlcHJlY2F0ZWRGcmVxKCkmJiFrLmdldEZyZXF1ZW5jeSgpJiYoYz0hMSl9KX1lbHNlIGYuZ2V0TnVtU3RhdHMoKSYmKGY9Zi5nZXROdW1TdGF0cygpLmdldEhpc3RvZ3JhbXNMaXN0KCkpJiYoZz1nLmNvbmNhdChmKSk7Zy5mb3JFYWNoKGw9PnsobD1sLmdldEJ1Y2tldHNMaXN0KCkpJiZsLmZvckVhY2goaz0+e2suZ2V0RGVwcmVjYXRlZENvdW50KCkmJiFrLmdldFNhbXBsZUNvdW50KCkmJihjPSExKX0pfSl9KX0pO3JldHVybiBjfQpmdW5jdGlvbiBJcChhKXtmb3IobGV0IGM9MDtjPGEuZ2V0RGF0YXNldHNMaXN0KCkubGVuZ3RoO2MrKyl7Y29uc3QgZD1hLmdldERhdGFzZXRzTGlzdCgpW2NdO2ZvcihsZXQgZj0wO2Y8ZC5nZXRGZWF0dXJlc0xpc3QoKS5sZW5ndGg7ZisrKXtjb25zdCBnPWQuZ2V0RmVhdHVyZXNMaXN0KClbZl07aWYoZy5nZXRTdHJpbmdTdGF0cygpKXtpZihnLmdldFN0cmluZ1N0YXRzKCkuZ2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cygpKXJldHVybiEwfWVsc2UgaWYoZy5nZXROdW1TdGF0cygpJiZnLmdldE51bVN0YXRzKCkuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKSlyZXR1cm4hMH19cmV0dXJuITF9CmZ1bmN0aW9uIEpwKGEpe2ZvcihsZXQgYz0wO2M8YS5nZXREYXRhc2V0c0xpc3QoKS5sZW5ndGg7YysrKXtjb25zdCBkPWEuZ2V0RGF0YXNldHNMaXN0KClbY107Zm9yKGxldCBmPTA7ZjxkLmdldEZlYXR1cmVzTGlzdCgpLmxlbmd0aDtmKyspe2NvbnN0IGc9ZC5nZXRGZWF0dXJlc0xpc3QoKVtmXS5nZXRDdXN0b21TdGF0c0xpc3QoKTtpZihudWxsIT1nJiYwPGcubGVuZ3RoKXJldHVybiEwfX1yZXR1cm4hMX1mdW5jdGlvbiBLcChhKXtmb3IobGV0IGQ9MDtkPGEuZ2V0RGF0YXNldHNMaXN0KCkubGVuZ3RoO2QrKyl7Y29uc3QgZj1hLmdldERhdGFzZXRzTGlzdCgpW2RdO2ZvcihsZXQgZz0wO2c8Zi5nZXRGZWF0dXJlc0xpc3QoKS5sZW5ndGg7ZysrKXt2YXIgYz1mLmdldEZlYXR1cmVzTGlzdCgpW2ddO2lmKChjPUJwKGMpKSYmYy5nZXRGZWF0dXJlTGlzdExlbmd0aEhpc3RvZ3JhbSgpKXJldHVybiEwfX1yZXR1cm4hMX0KZnVuY3Rpb24gTHAoYSl7aWYoIWEpcmV0dXJuITE7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYVtjXS5oaXN0TWFwW0puKCEwLCJTdGFuZGFyZCIpXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBNcChhKXtpZighYSlyZXR1cm4hMTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylpZihhW2NdLmhpc3RNYXAuUXVhbnRpbGVzKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIE5wKGEpe2lmKCFhKXJldHVybiExO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGFbY10uaGlzdE1hcFsiVmFsdWUgbGlzdCBsZW5ndGgiXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBPcChhKXtyZXR1cm4gYT9hLmdldE51bU5vbk1pc3NpbmcoKSphLmdldEF2Z051bVZhbHVlcygpOjB9CmZ1bmN0aW9uIFBwKGEpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuImludCI7Y2FzZSAxOnJldHVybiJmaXhlZC1sZW5ndGggaW50cyI7Y2FzZSAyOnJldHVybiJ2YXJpYWJsZS1sZW5ndGggaW50cyI7Y2FzZSAzOnJldHVybiJmbG9hdCI7Y2FzZSA0OnJldHVybiJmaXhlZC1sZW5ndGggZmxvYXRzIjtjYXNlIDU6cmV0dXJuInZhcmlhYmxlLWxlbmd0aCBmbG9hdHMiO2Nhc2UgNjpyZXR1cm4ic3RyaW5nIjtjYXNlIDc6cmV0dXJuImZpeGVkLWxlbmd0aCBzdHJpbmdzIjtjYXNlIDg6cmV0dXJuInZhcmlhYmxlLWxlbmd0aCBzdHJpbmdzIjtjYXNlIDk6cmV0dXJuImJ5dGVzIjtjYXNlIDEwOnJldHVybiJmaXhlZC1sZW5ndGggYnl0ZXMiO2Nhc2UgMTE6cmV0dXJuInZhcmlhYmxlLWxlbmd0aCBieXRlcyI7Y2FzZSAxMjpyZXR1cm4ic3RydWN0IjtjYXNlIDEzOnJldHVybiJmaXhlZC1sZW5ndGggc3RydWN0IjtjYXNlIDE0OnJldHVybiJ2YXJpYWJsZS1sZW5ndGggc3RydWN0IjtkZWZhdWx0OnJldHVybiJ1bmtub3duIn19CmZ1bmN0aW9uIFFwKGEsYyl7cmV0dXJuIDE1PT09YT9jOjE2PD1hfHwxNT09PWM/YTozPD1hJiY1Pj1hJiYzPD1jJiY1Pj1jfHwwPD1hJiYyPj1hJiYwPD1jJiYyPj1jfHw2PD1hJiY4Pj1hJiY2PD1jJiY4Pj1jfHw5PD1hJiYxMT49YSYmOTw9YyYmMTE+PWN8fDEyPD1hJiYxND49YSYmMTI8PWMmJjE0Pj1jP01hdGgubWF4KGEsYyk6MTZ9ZnVuY3Rpb24gUnAoYSxjKXt2YXIgZD0xNTtpZihudWxsIT1jJiYwIT09Yy5nZXROdW1Ob25NaXNzaW5nKCkpe2xldCBmPWQ9ITE7Yy5nZXRNaW5OdW1WYWx1ZXMoKT09PWMuZ2V0TWF4TnVtVmFsdWVzKCkmJigxPT09Yy5nZXRNaW5OdW1WYWx1ZXMoKT9kPSEwOmY9ITApO2Q9MT09PWE/ZD8zOmY/NDo1OjA9PT1hP2Q/MDpmPzE6MjoyPT09YT9kPzY6Zj83Ojg6Mz09PWE/ZD85OmY/MTA6MTE6ZD8xMjpmPzEzOjE0fXJldHVybiBkfWNsYXNzIFNwe31jbGFzcyBUcHt9Y2xhc3MgVXB7fQpmdW5jdGlvbiBWcChhKXtsZXQgYz0wLGQ9MDtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylhW2ZdLnJhd0J1Y2tldHMubGVuZ3RoPmMmJihjPWFbZl0ucmF3QnVja2V0cy5sZW5ndGgsZD1mKTtmPVtdO2ZvcihsZXQgZz0wO2c8YztnKyspe2NvbnN0IGw9bmV3IFVwO2wudmFsdWU9YVtkXS5yYXdCdWNrZXRzW2ddLmdldExhYmVsKCk7bC5jb3VudHM9W107Zm9yKGxldCBrPTA7azxhLmxlbmd0aDtrKyspYVtrXS5yYXdCdWNrZXRzLmxlbmd0aDw9Zz9sLmNvdW50cy5wdXNoKDApOmwuY291bnRzLnB1c2goYVtrXS5yYXdCdWNrZXRzW2ddLmdldFNhbXBsZUNvdW50KCkpO2YucHVzaChsKX1yZXR1cm4gZn0KZnVuY3Rpb24gV3AoYSxjKXtjb25zdCBkPVtdO2ZvcihsZXQgZj0wO2Y8Yy5sZW5ndGg7ZisrKXtjb25zdCBnPW5ldyBVcCxsPWNbZl07Zy52YWx1ZT1sO2cuY291bnRzPVtdO2ZvcihsZXQgaz0wO2s8YS5sZW5ndGg7aysrKXtjb25zdCBtPWFba10ucmF3QnVja2V0cztsZXQgcD0tMTtmb3IobGV0IHE9MDtxPG0ubGVuZ3RoO3ErKylpZihtW3FdLmdldExhYmVsKCk9PT1sKXtwPXE7YnJlYWt9LTE9PT1wP2cuY291bnRzLnB1c2goMCk6Zy5jb3VudHMucHVzaChtW3BdLmdldFNhbXBsZUNvdW50KCkpfWQucHVzaChnKX1yZXR1cm4gZH12YXIgWHA7KGZ1bmN0aW9uKGEpe2FbYS5ISVNUT0dSQU09MF09IkhJU1RPR1JBTSI7YVthLkJBUl9DSEFSVD0xXT0iQkFSX0NIQVJUIjthW2EuQ1VNRElTVF9DSEFSVD0yXT0iQ1VNRElTVF9DSEFSVCJ9KShYcHx8KFhwPXt9KSk7CmZ1bmN0aW9uIFlwKGEpe3JldHVybiJRdWFudGlsZXMiPT09YXx8IlZhbHVlIGxpc3QgbGVuZ3RoIj09PWF8fCJGZWF0dXJlIGxpc3QgbGVuZ3RoIj09PWF9ZnVuY3Rpb24gWnAoYSxjLGQpe2xldCBmPSEwLGc9MDthLmZvckVhY2gobD0+e2wuaGlzdE1hcFtjXSYmKGw9bC5oaXN0TWFwW2NdLmdldEJ1Y2tldHNMaXN0KCksZz1NYXRoLm1heChnLGwubGVuZ3RoKSxsLmZvckVhY2goaz0+e2suZ2V0TG93VmFsdWV8fChmPSExKX0pKX0pO3JldHVybiBmP1hwLkhJU1RPR1JBTTpnPmQ/WHAuQ1VNRElTVF9DSEFSVDpYcC5CQVJfQ0hBUlR9CmNsYXNzICRwe2NvbnN0cnVjdG9yKGEsYyxkKXt0aGlzLnN0cj1hO3RoaXMuY3NzQ2xhc3M9Yzt0aGlzLmZ1bGxTdHI9ZDt0aGlzLmZ1bGxTdHJ8fCh0aGlzLmZ1bGxTdHI9YSl9YXBwZW5kKGEsYyl7YyYmKHRoaXMuc3RyKz1jLHRoaXMuZnVsbFN0cis9Yyk7dGhpcy5zdHIrPWEuc3RyO3RoaXMuZnVsbFN0cis9YS5mdWxsU3RyO3RoaXMuY3NzQ2xhc3MrPWEuY3NzQ2xhc3N9fWZ1bmN0aW9uIGFxKGEpe2NvbnN0IGM9TWF0aC5hYnMoYSk7cmV0dXJuKC4wMT5jJiYwPGN8fDFFNDxjKSYmaXNGaW5pdGUoYSk/ZDMuZm9ybWF0KCIuM3MiKShhKS5yZXBsYWNlKC9HJC8sIkIiKTphLnRvTG9jYWxlU3RyaW5nKCl9ZnVuY3Rpb24gYnEoYSxjKXtjb25zdCBkPWFxKHRwKHpwKGEpLDFFNjxNYXRoLmFicyhhKT8wOjIpKTtjPWNxKGEsYyx2b2lkIDApO3JldHVybiBuZXcgJHAoZCxjLGEudG9Mb2NhbGVTdHJpbmcoW10se21heGltdW1GcmFjdGlvbkRpZ2l0czo5fSkpfQpmdW5jdGlvbiBkcShhLGMsZCl7YT16cChhKTthPW51bGwhPWEmJmM/YS9jOjA7Yz0uOTk5OTk5PGEmJjE+YT8ifjEwMCUiOjFFLTY+YSYmMDxhPyJ+MCUiOnRwKDEwMCphLDIpKyIlIjtkPWNxKGEsITEsZCk7cmV0dXJuIG5ldyAkcChjLGQsMTAwKmErIiUiKX1mdW5jdGlvbiBlcShhLGMsZCl7Y29uc3QgZj1hcShhKTtjPWNxKGEsYyxkKTtyZXR1cm4gbmV3ICRwKGYsYyxhLnRvTG9jYWxlU3RyaW5nKCkpfWZ1bmN0aW9uIGZxKGEsYyl7YT15cCh4cChhKSk7Yz1jcShhLGMsdm9pZCAwKTtyZXR1cm4gbmV3ICRwKGEsYyl9ZnVuY3Rpb24gY3EoYSxjLGQpe2M9Yz8iZGF0YS13ZWlnaHRlZCAiOiIiO2lmKGQmJmQoYSl8fCJudW1iZXIiPT09dHlwZW9mIGEmJiFpc0Zpbml0ZShhKSljKz0iZGF0YS1lcnJvciAiO3JldHVybiBjfQpmdW5jdGlvbiBncShhLGMsZCl7Y29uc3QgZj1bXTtmLnB1c2goZnEoImNvdW50IikpO2YucHVzaChmcSgibWlzc2luZyIpKTthPyhmLnB1c2goZnEoIm1lYW4iLGMpKSxmLnB1c2goZnEoInN0ZCBkZXYiLGMpKSxmLnB1c2goZnEoInplcm9zIikpLGYucHVzaChmcSgibWluIikpLGYucHVzaChmcSgibWVkaWFuIixjKSksZi5wdXNoKGZxKCJtYXgiKSkpOihmLnB1c2goZnEoInVuaXF1ZSIpKSxmLnB1c2goZnEoInRvcCIsYykpLGYucHVzaChmcSgiZnJlcSB0b3AiLGMpKSxmLnB1c2goZnEoImF2ZyBzdHIgbGVuIikpKTtkJiZmLnB1c2gobmV3ICRwKCJjdXN0b20iLCJkYXRhLWN1c3RvbSAiKSk7cmV0dXJuIGZ9CmZ1bmN0aW9uIEJwKGEpe3JldHVybiBhP2EuZ2V0TnVtU3RhdHMoKT9hLmdldE51bVN0YXRzKCkuZ2V0Q29tbW9uU3RhdHMoKTphLmdldFN0cmluZ1N0YXRzKCk/YS5nZXRTdHJpbmdTdGF0cygpLmdldENvbW1vblN0YXRzKCk6YS5nZXRCeXRlc1N0YXRzKCk/YS5nZXRCeXRlc1N0YXRzKCkuZ2V0Q29tbW9uU3RhdHMoKTphLmdldFN0cnVjdFN0YXRzKCk/YS5nZXRTdHJ1Y3RTdGF0cygpLmdldENvbW1vblN0YXRzKCk6bnVsbDpudWxsfWZ1bmN0aW9uIGhxKGEpe2NvbnN0IGM9W107YT8oYy5wdXNoKGVxKGEuZ2V0TnVtTm9uTWlzc2luZygpLCExLGQ9PjA+PWQpKSxjLnB1c2goZHEoYS5nZXROdW1NaXNzaW5nKCksenAoYS5nZXROdW1Ob25NaXNzaW5nKCkpK3pwKGEuZ2V0TnVtTWlzc2luZygpKSxkPT4uMDI8ZCkpKTooYy5wdXNoKGVxKDAsITEsZD0+MD49ZCkpLGMucHVzaChkcSgxLDEsZD0+LjAyPGQpKSk7cmV0dXJuIGN9CmZ1bmN0aW9uIGlxKGEsYyxkKXtjb25zdCBmPVtdO2lmKGEpKGQ9ZD9hLmdldFdlaWdodGVkTnVtZXJpY1N0YXRzKCk6bnVsbCk/KGYucHVzaChicShkLmdldE1lYW4oKSwhMCkpLGYucHVzaChicShkLmdldFN0ZERldigpLCEwKSkpOihmLnB1c2goYnEoYS5nZXRNZWFuKCkpKSxmLnB1c2goYnEoYS5nZXRTdGREZXYoKSkpKSxmLnB1c2goZHEoYS5nZXROdW1aZXJvcygpLE9wKGMpLGc9Pi4xPGcpKSxjPWpxKGEpLGYucHVzaChicShjP05hTjphLmdldE1pbigpKSksZD9mLnB1c2goYnEoZC5nZXRNZWRpYW4oKSwhMCkpOmYucHVzaChicShhLmdldE1lZGlhbigpKSksZi5wdXNoKGJxKGM/TmFOOmEuZ2V0TWF4KCkpKTtlbHNlIGZvcihhPTA7Nj5hO2ErKylmLnB1c2goZnEoIi0iKSk7cmV0dXJuIGZ9CmZ1bmN0aW9uIGpxKGEpe2lmKCFhKXJldHVybiExO2E9YS5nZXRIaXN0b2dyYW1zTGlzdCgpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWlmKDA8YVtjXS5nZXROdW1OYW4oKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBrcShhLGMpe2NvbnN0IGQ9W107aWYoYSl7Yz1jP2EuZ2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cygpOm51bGw7ZC5wdXNoKGVxKGEuZ2V0VW5pcXVlKCkpKTtjb25zdCBmPWM/Yy5nZXRUb3BWYWx1ZXNMaXN0KCk6YS5nZXRUb3BWYWx1ZXNMaXN0KCk7ZiYmMDxmLmxlbmd0aD8oZC5wdXNoKGZxKGZbMF0uZ2V0VmFsdWUoKSwhIWMpKSxkLnB1c2goYnEoZlswXS5nZXRGcmVxdWVuY3koKSwhIWMpKSk6KGQucHVzaChmcSgiLSIpKSxkLnB1c2goZnEoIi0iKSkpO2QucHVzaChicShhLmdldEF2Z0xlbmd0aCgpKSl9ZWxzZSBmb3IoYT0wOzQ+YTthKyspZC5wdXNoKGZxKCItIikpO3JldHVybiBkfQpmdW5jdGlvbiBscShhKXtjb25zdCBjPVtdO2lmKGEpYy5wdXNoKGVxKGEuZ2V0VW5pcXVlKCkpKSxjLnB1c2goZnEoIi0iKSksYy5wdXNoKGZxKCItIikpLGMucHVzaChicShhLmdldEF2Z051bUJ5dGVzKCkpKTtlbHNlIGZvcihhPTA7ND5hO2ErKyljLnB1c2goZnEoIi0iKSk7cmV0dXJuIGN9ZnVuY3Rpb24gbXEoYSl7Y29uc3QgYz1bXTtpZihhJiYwPGEubGVuZ3RoKXtjb25zdCBkPW5ldyAkcCgiIiwiZGF0YS1jdXN0b20gIik7YS5mb3JFYWNoKGY9PntpZighZi5nZXRIaXN0b2dyYW0oKSYmIWYuZ2V0UmFua0hpc3RvZ3JhbSgpKXt2YXIgZz1mLmdldE5hbWUoKTsiIiE9PWQuc3RyJiYoZz0iXG4iK2cpO2QuYXBwZW5kKGZxKGcpKTtmLmdldFN0cigpP2QuYXBwZW5kKGZxKGYuZ2V0U3RyKCkpLCI6ICIpOmQuYXBwZW5kKGJxKGYuZ2V0TnVtKCkpLCI6ICIpfX0pO2MucHVzaChkKX1lbHNlIGMucHVzaChuZXcgJHAoIi0iLCJkYXRhLWN1c3RvbSAiKSk7cmV0dXJuIGN9CmZ1bmN0aW9uIG5xKGEsYyxkKXtpZighYSlyZXR1cm5bXTtjb25zdCBmPUJwKGEpO2xldCBnPWhxKGYpO2c9YS5nZXROdW1TdGF0cygpP2cuY29uY2F0KGlxKGEuZ2V0TnVtU3RhdHMoKSxmLGMpKTphLmdldFN0cmluZ1N0YXRzKCk/Zy5jb25jYXQoa3EoYS5nZXRTdHJpbmdTdGF0cygpLGMpKTpnLmNvbmNhdChscShhLmdldEJ5dGVzU3RhdHMoKSkpO2QmJihnPWcuY29uY2F0KG1xKGEuZ2V0Q3VzdG9tU3RhdHNMaXN0KCkpKSk7cmV0dXJuIGd9CmZ1bmN0aW9uIG9xKGEpe2NvbnN0IGM9YS5tYXAoKCk9PjApO2EuZm9yRWFjaCgoZCxmKT0+e2QuZm9yRWFjaChnPT57Y1tmXSs9enAoZy5nZXRTYW1wbGVDb3VudCgpKX0pfSk7cmV0dXJuIGEubWFwKChkLGYpPT5kLm1hcChnPT57aWYoZyBpbnN0YW5jZW9mIEhqKXt2YXIgbD1uZXcgSGo7bC5zZXRTYW1wbGVDb3VudChnLmdldFNhbXBsZUNvdW50KCkvY1tmXSk7bC5zZXRMb3dWYWx1ZShnLmdldExvd1ZhbHVlKCkpO2wuc2V0SGlnaFZhbHVlKGcuZ2V0SGlnaFZhbHVlKCkpO3JldHVybiBsfWw9bmV3IEtqO2wuc2V0U2FtcGxlQ291bnQoZy5nZXRTYW1wbGVDb3VudCgpL2NbZl0pO2wuc2V0TG93UmFuayhnLmdldExvd1JhbmsoKSk7bC5zZXRIaWdoUmFuayhnLmdldEhpZ2hSYW5rKCkpO2wuc2V0TGFiZWwoZy5nZXRMYWJlbCgpKTtyZXR1cm4gbH0pKX07Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZmFjZXRzLW92ZXJ2aWV3L2NvbW1vbi9vdmVydmlld19kYXRhX21vZGVsLmpzCmNsYXNzIHBxe2NvbnN0cnVjdG9yKGEpe3RoaXMuZGF0YT1hO3RoaXMuY29sb3JTY2FsZT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcjt0aGlzLmNvbG9yU2NhbGUuZG9tYWluKGEuZ2V0RGF0YXNldHNMaXN0KCkubWFwKGM9PmMuZ2V0TmFtZSgpKSk7dGhpcy5jb2xvclNjYWxlLnJhbmdlKCIjNDI4NUY0ICNGMDkzMDAgIzBGOUQ1OCAjOUMyN0IwICM2MDdEOEIgIzBCODA0MyAjNzU3NTc1Ii5zcGxpdCgiICIpKTtpZighSHAoYSkpdGhyb3cgRXJyb3IoImlucHV0IHByb3RvIGhhcyBub3QgYmVlbiBjbGVhbmVkIik7dGhpcy5mZWF0dXJlc0J5U3BlYz10aGlzLm1ha2VGZWF0dXJlQnlTcGVjTGlzdCgpfW1ha2VGZWF0dXJlQnlTcGVjTGlzdCgpe2NvbnN0IGE9W107Zm9yKGxldCBjPTA7MTY+YztjKyspYVtjXT1bXTt0aGlzLmdldFVuaXF1ZUZlYXR1cmVzKCkuZm9yRWFjaChjPT57Y29uc3QgZD10aGlzLmdldEZlYXR1cmVTcGVjRm9yRmVhdHVyZShjLmdldE5hbWUoKSk7YVtkXS5wdXNoKGMuZ2V0TmFtZSgpKX0pOwpyZXR1cm4gYX1nZXROb25FbXB0eUZlYXR1cmVTcGVjTGlzdHMoKXtjb25zdCBhPVtdO2ZvcihsZXQgYz0wOzE2PmM7YysrKWlmKDAhPT10aGlzLmZlYXR1cmVzQnlTcGVjW2NdLmxlbmd0aCl7Y29uc3QgZD1uZXcgU3A7ZC5mZWF0dXJlcz10aGlzLmZlYXR1cmVzQnlTcGVjW2NdO2Quc3BlYz1jO2EucHVzaChkKX1yZXR1cm4gYX1nZXRGZWF0dXJlU3BlY0ZvckZlYXR1cmUoYSl7Y29uc3QgYz10aGlzLmdldERhdGFzZXROYW1lcygpO2xldCBkPTE1O2ZvcihsZXQgZz0wO2c8Yy5sZW5ndGg7ZysrKXt2YXIgZj10aGlzLmdldEZlYXR1cmUoYSxjW2ddKTtmPW51bGw9PWY/MTU6UnAoZi5nZXRUeXBlKCksdGhpcy5nZXRGZWF0dXJlQ29tbW9uU3RhdHMoYSxjW2ddKSk7ZD1RcChkLGYpfTE2PT09ZCYmKGQ9MTUpO3JldHVybiBkfWdldERhdGFzZXRGZWF0dXJlU3RhdGlzdGljcygpe3JldHVybiB0aGlzLmRhdGF9Z2V0Q29sb3JTY2FsZSgpe3JldHVybiB0aGlzLmNvbG9yU2NhbGV9Z2V0RGF0YXNldE5hbWVzKCl7cmV0dXJuIHRoaXMuZGF0YT8KdGhpcy5kYXRhLmdldERhdGFzZXRzTGlzdCgpLm1hcChhPT5hLmdldE5hbWUoKSk6W119Z2V0RGF0YXNldChhKXtpZighdGhpcy5kYXRhKXJldHVybiBudWxsO2Zvcihjb25zdCBjIG9mIHRoaXMuZGF0YS5nZXREYXRhc2V0c0xpc3QoKSlpZihjLmdldE5hbWUoKT09PWEpcmV0dXJuIGM7cmV0dXJuIG51bGx9Z2V0RmVhdHVyZShhLGMpe2lmKCFhfHwhdGhpcy5kYXRhKXJldHVybiBudWxsO2M9dGhpcy5nZXREYXRhc2V0KGMpO2lmKCFjKXJldHVybiBudWxsO2Zvcihjb25zdCBkIG9mIGMuZ2V0RmVhdHVyZXNMaXN0KCkpaWYoZC5nZXROYW1lKCk9PT1hKXJldHVybiBkO3JldHVybiBudWxsfWdldEV4dHJhSGlzdG9ncmFtTmFtZXMoYSl7aWYoIXRoaXMuZGF0YSlyZXR1cm5bXTthPWEubWFwKGQ9PmQuZ2V0TmFtZSgpKTtjb25zdCBjPXt9O2Zvcihjb25zdCBkIG9mIHRoaXMuZGF0YS5nZXREYXRhc2V0c0xpc3QoKSlmb3IoY29uc3QgZiBvZiBkLmdldEZlYXR1cmVzTGlzdCgpKWlmKC0xIT09CmEuaW5kZXhPZihmLmdldE5hbWUoKSkmJihmLmdldEN1c3RvbVN0YXRzTGlzdCgpJiZmLmdldEN1c3RvbVN0YXRzTGlzdCgpLmZvckVhY2goZz0+e2lmKGcuZ2V0SGlzdG9ncmFtKCl8fGcuZ2V0UmFua0hpc3RvZ3JhbSgpKWNbZy5nZXROYW1lKCldPSEwfSksZi5nZXROdW1TdGF0cygpKSl7Y29uc3QgZz1mLmdldE51bVN0YXRzKCkuZ2V0SGlzdG9ncmFtc0xpc3QoKTtpZihnKWZvcihsZXQgbD0wO2w8Zy5sZW5ndGg7bCsrKXtjb25zdCBrPWdbbF07ay5nZXROYW1lKCkmJihjW2suZ2V0TmFtZSgpXT0hMCl9fXJldHVybiBPYmplY3Qua2V5cyhjKX1nZXRGZWF0dXJlQ29tbW9uU3RhdHMoYSxjKXthPXRoaXMuZ2V0RmVhdHVyZShhLGMpO3JldHVybiBudWxsPT1hP251bGw6QnAoYSl9Z2V0RmVhdHVyZU5hbWVzKGEpe3JldHVybiBhJiZ0aGlzLmRhdGE/KGE9dGhpcy5nZXREYXRhc2V0KGEpKT9hLmdldEZlYXR1cmVzTGlzdCgpLm1hcChjPT5jLmdldE5hbWUoKSk6W106bnVsbH1nZXRGZWF0dXJlSW5kZXgoYSwKYyl7aWYoIXRoaXMuZGF0YSlyZXR1cm4gbnVsbDthPXRoaXMuZ2V0RGF0YXNldChhKTtpZighYSlyZXR1cm4gbnVsbDtsZXQgZD0wO2Zvcihjb25zdCBmIG9mIGEuZ2V0RmVhdHVyZXNMaXN0KCkpe2lmKGYuZ2V0TmFtZSgpPT09YylyZXR1cm4gZDsrK2R9cmV0dXJuIG51bGx9Z2V0VW5pcXVlRmVhdHVyZXMoKXtpZighdGhpcy5kYXRhKXJldHVybltdO2NvbnN0IGE9e307Zm9yKGNvbnN0IGMgb2YgdGhpcy5kYXRhLmdldERhdGFzZXRzTGlzdCgpKWZvcihjb25zdCBkIG9mIGMuZ2V0RmVhdHVyZXNMaXN0KCkpYVtkLmdldE5hbWUoKV09ZDtyZXR1cm4gT2JqZWN0LmtleXMoYSkubWFwKGM9PmFbY10pfWdldE51bVVuaXF1ZUZlYXR1cmVzQnlUeXBlKGEpe3JldHVybiB0aGlzLmdldFVuaXF1ZUZlYXR1cmVzKCkuZmlsdGVyKGM9PkZwKGMpPT09YSkubGVuZ3RofWZlYXR1cmVIYXNTaW5nbGVWYWx1ZShhKXtpZighYSlyZXR1cm4hMTtpZihhLmdldFN0cmluZ1N0YXRzKCkpe3ZhciBjPWEuZ2V0U3RyaW5nU3RhdHMoKS5nZXRVbmlxdWUoKTsKcmV0dXJuIDE9PT16cChjKX1yZXR1cm4gYS5nZXRCeXRlc1N0YXRzKCk/KGM9YS5nZXRCeXRlc1N0YXRzKCkuZ2V0VW5pcXVlKCksMT09PXpwKGMpKTphLmdldE51bVN0YXRzKCk/KGM9YS5nZXROdW1TdGF0cygpLmdldE1pbigpLGE9YS5nZXROdW1TdGF0cygpLmdldE1heCgpLG51bGw9PWMmJm51bGw9PWE/ITE6enAoYyk9PT16cChhKSk6ITF9ZmVhdHVyZUFjcm9zc0FsbERhdGFzZXRzSGFzU2luZ2xlVmFsdWUoYSl7aWYoIWF8fCF0aGlzLmRhdGEpcmV0dXJuITE7Zm9yKGNvbnN0IGMgb2YgdGhpcy5kYXRhLmdldERhdGFzZXRzTGlzdCgpKWZvcihjb25zdCBkIG9mIGMuZ2V0RmVhdHVyZXNMaXN0KCkpaWYoYT09PWQuZ2V0TmFtZSgpJiYhdGhpcy5mZWF0dXJlSGFzU2luZ2xlVmFsdWUoZCkpcmV0dXJuITE7cmV0dXJuITB9Z2V0RmVhdHVyZVNpbmdsZVZhbHVlKGEpe2lmKG51bGw9PWEpcmV0dXJuIlx4M2NudWxsXHgzZSI7aWYoYS5nZXRTdHJpbmdTdGF0cygpKXJldHVybiBhPWEuZ2V0U3RyaW5nU3RhdHMoKS5nZXRUb3BWYWx1ZXNMaXN0KCksCm51bGw9PWF8fDA9PT1hLmxlbmd0aD8iXHgzY251bGxceDNlIjphWzBdLmdldFZhbHVlKCk7aWYoYS5nZXRCeXRlc1N0YXRzKCkpcmV0dXJuIDA9PT1hLmdldEJ5dGVzU3RhdHMoKS5nZXRVbmlxdWUoKT8iXHgzY251bGxceDNlIjoiXHgzY2JpbmFyeSBkYXRhXHgzZSI7aWYoYS5nZXROdW1TdGF0cygpKXtjb25zdCBjPWEuZ2V0TnVtU3RhdHMoKS5nZXRNaW4oKTtpZihjKXJldHVybiB6cChjKS50b1N0cmluZygpO2lmKGE9YS5nZXROdW1TdGF0cygpLmdldE1heCgpKXJldHVybiB6cChhKS50b1N0cmluZygpfXJldHVybiJceDNjdW5rbm93biB0eXBlXHgzZSJ9Z2V0RGF0YXNldEhpc3RvZ3JhbXNGb3JGZWF0dXJlKGEpe2NvbnN0IGM9W107aWYodGhpcy5kYXRhKWZvcihjb25zdCBsIG9mIHRoaXMuZGF0YS5nZXREYXRhc2V0c0xpc3QoKSl7Y29uc3Qgaz1sLmdldE5hbWUoKTtsZXQgbT1udWxsLHA9bnVsbCxxPW51bGwscj1udWxsLHQ9bnVsbCx2PW51bGw7Y29uc3QgQT17fTtmb3IoY29uc3QgeSBvZiBsLmdldEZlYXR1cmVzTGlzdCgpKWlmKHkuZ2V0TmFtZSgpPT09CmEpe3ZhciBkPXRoaXMuZ2V0RmVhdHVyZUNvbW1vblN0YXRzKGEsayk7ZCYmKHQ9ZC5nZXROdW1WYWx1ZXNIaXN0b2dyYW0oKSx2PWQuZ2V0RmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW0oKSk7eS5nZXRDdXN0b21TdGF0c0xpc3QoKSYmeS5nZXRDdXN0b21TdGF0c0xpc3QoKS5mb3JFYWNoKHg9Pnt4LmdldEhpc3RvZ3JhbSgpP0FbeC5nZXROYW1lKCldPXguZ2V0SGlzdG9ncmFtKCk6eC5nZXRSYW5rSGlzdG9ncmFtKCkmJihBW3guZ2V0TmFtZSgpXT14LmdldFJhbmtIaXN0b2dyYW0oKSl9KTtpZih5LmdldE51bVN0YXRzKCkpe2lmKGQ9eS5nZXROdW1TdGF0cygpLmdldEhpc3RvZ3JhbXNMaXN0KCkpZm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBnPWRbZl07Zy5nZXROYW1lKCk/QVtnLmdldE5hbWUoKV09ZzowPT09Zy5nZXRUeXBlKCk/bT1nOnE9Z31pZih5LmdldE51bVN0YXRzKCkuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKSYmKGQ9eS5nZXROdW1TdGF0cygpLmdldFdlaWdodGVkTnVtZXJpY1N0YXRzKCkuZ2V0SGlzdG9ncmFtc0xpc3QoKSkpZm9yKGY9CjA7ZjxkLmxlbmd0aDtmKyspZz1kW2ZdLDA9PT1nLmdldFR5cGUoKT9wPWc6cj1nfWVsc2UgeS5nZXRTdHJpbmdTdGF0cygpJiYobT15LmdldFN0cmluZ1N0YXRzKCkuZ2V0UmFua0hpc3RvZ3JhbSgpLHkuZ2V0U3RyaW5nU3RhdHMoKS5nZXRXZWlnaHRlZFN0cmluZ1N0YXRzKCkmJihwPXkuZ2V0U3RyaW5nU3RhdHMoKS5nZXRXZWlnaHRlZFN0cmluZ1N0YXRzKCkuZ2V0UmFua0hpc3RvZ3JhbSgpKSk7YnJlYWt9Yy5wdXNoKG5ldyBJbihrLG0scCxxLHIsdCx2LEEpKX1yZXR1cm4gY31kb2VzQ29udGFpbldlaWdodGVkU3RhdHMoKXtudWxsPT10aGlzLmNvbnRhaW5zV2VpZ2h0ZWRTdGF0cyYmKHRoaXMuY29udGFpbnNXZWlnaHRlZFN0YXRzPUlwKHRoaXMuZGF0YSkpO3JldHVybiB0aGlzLmNvbnRhaW5zV2VpZ2h0ZWRTdGF0c31kb2VzQ29udGFpbkN1c3RvbVN0YXRzKCl7bnVsbD09dGhpcy5jb250YWluc0N1c3RvbVN0YXRzJiYodGhpcy5jb250YWluc0N1c3RvbVN0YXRzPUpwKHRoaXMuZGF0YSkpOwpyZXR1cm4gdGhpcy5jb250YWluc0N1c3RvbVN0YXRzfWRvZXNDb250YWluRmVhdHVyZUxpc3RMZW5ndGhEYXRhKCl7bnVsbD09dGhpcy5jb250YWluc0ZlYXR1cmVMaXN0TGVuZ3RoRGF0YSYmKHRoaXMuY29udGFpbnNGZWF0dXJlTGlzdExlbmd0aERhdGE9S3AodGhpcy5kYXRhKSk7cmV0dXJuIHRoaXMuY29udGFpbnNGZWF0dXJlTGlzdExlbmd0aERhdGF9Z2V0Q2hhcnRBbHBoYSgpe3JldHVybiAyPD10aGlzLmdldERhdGFzZXROYW1lcygpLmxlbmd0aD8uNDoxfWdldENoYXJ0Q29sb3JTdHJpbmcoYSl7YT10aGlzLmdldENvbG9yU2NhbGUoKS5zY2FsZSh0aGlzLmdldERhdGFzZXROYW1lcygpW2FdKTtjb25zdCBjPXRoaXMuZ2V0Q2hhcnRBbHBoYSgpO3JldHVybiBhLnJlcGxhY2UoInJnYiIsInJnYmEiKS5yZXBsYWNlKCIpIiwiLCAiK2MrIikiKX19Owo8L3NjcmlwdD4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1vdmVydmlldy9jb21tb24vcGxvdHRhYmxlX2hlbHBlcnMuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMocCl7Y29uc3QgcT1bXTtmb3IoO3AmJnAgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYocS5wdXNoKHApLHAuYXNzaWduZWRTbG90KXA9cC5hc3NpZ25lZFNsb3Q7ZWxzZSBpZihwLnBhcmVudEVsZW1lbnQpcD1wLnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCByPXAucGFyZW50Tm9kZTtwPXIgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P3IuaG9zdDpyIT09cD9yOm51bGx9cmV0dXJuIHF9ZnVuY3Rpb24gZChwKXt2YXIgcT1jKHApO3A9ZjtsZXQgcj1udWxsO2Zvcihjb25zdCB2IG9mIHEpe3E9UGxvdHRhYmxlLlV0aWxzLkRPTS5nZXRFbGVtZW50VHJhbnNmb3JtKHYpO2lmKG51bGwhPXEpe3ZhciB0PXYuY2xpZW50V2lkdGgvMjtjb25zdCBBPXYuY2xpZW50SGVpZ2h0LzI7cD1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShwLFt0LEFdKTtwPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5TWF0cml4KHAsUGxvdHRhYmxlLlV0aWxzLk1hdGguaW52ZXJ0TWF0cml4KHEpKTsKcD1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShwLFstdCwtQV0pfXE9di5zY3JvbGxMZWZ0O3Q9di5zY3JvbGxUb3A7aWYobnVsbD09PXJ8fHY9PT1yKXEtPXYub2Zmc2V0TGVmdCt2LmNsaWVudExlZnQsdC09di5vZmZzZXRUb3Ardi5jbGllbnRUb3Ascj12Lm9mZnNldFBhcmVudDtwPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKHAsW3EsdF0pfXJldHVybiBwfWNvbnN0IGY9WzEsMCwwLDEsMCwwXTtjbGFzcyBnIGV4dGVuZHMgUGxvdHRhYmxlLlV0aWxzLlRyYW5zbGF0b3J7Y29tcHV0ZVBvc2l0aW9uKHAscSl7cD17eDpwLHk6cX07cT1kKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09cT9wOlBsb3R0YWJsZS5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKHEscCl9fWNsYXNzIGwgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2V7Y29uc3RydWN0b3IocCl7c3VwZXIocCk7dGhpcy5fZXZlbnRUYXJnZXQ9cC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7CnRoaXMuX3RyYW5zbGF0b3I9bmV3IGcocC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKHApe2NvbnN0IHE9cC5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcj1xW2wuX0RJU1BBVENIRVJfS0VZXTtyfHwocj1uZXcgbChwKSxxW2wuX0RJU1BBVENIRVJfS0VZXT1yKTtyZXR1cm4gcn19Y2xhc3MgayBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Ub3VjaHtjb25zdHJ1Y3RvcihwKXtzdXBlcihwKTt0aGlzLl9ldmVudFRhcmdldD1wLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt0aGlzLl90cmFuc2xhdG9yPW5ldyBnKHAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihwKXtjb25zdCBxPXAucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHI9cVtrLl9ESVNQQVRDSEVSX0tFWV07cnx8KHI9bmV3IGsocCkscVtrLl9ESVNQQVRDSEVSX0tFWV09cik7cmV0dXJuIHJ9fWNsYXNzIG0gZXh0ZW5kcyBQbG90dGFibGUuSW50ZXJhY3Rpb25zLlBvaW50ZXJ7X2FuY2hvcigpe3RoaXMuX2lzQW5jaG9yZWQ9CiEwO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1sLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9ay5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX19YS5Qb2ludGVySW50ZXJhY3Rpb249bX0pKHdpbmRvdy5wbG90dGFibGVfaGVscGVyc3x8KHdpbmRvdy5wbG90dGFibGVfaGVscGVycz17fSkpOwo8L3NjcmlwdD4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJmYWNldHMtb3ZlcnZpZXctcm93LXN0YXRzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICogewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIC5kYXRhLWVycm9yIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIC5kYXRhLXdlaWdodGVkIHsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KICAgICAgLnRhYmxlLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIG1pbi13aWR0aDogNzBweDsKICAgICAgICBtYXgtd2lkdGg6IDcwcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLmRhdGEtY3VzdG9tIHsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIG1heC13aWR0aDogMTUwcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZTs7CiAgICAgIH0KICAgICAgI2xlZ2VuZC1ib3ggewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1yb3ciPgogICAgICA8ZGl2IGlkPSJsZWdlbmQtYm94Ij48L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZW50cmllc11dIj4KICAgICAgICA8ZGl2IGNsYXNzJD0iW1tpdGVtLmNzc0NsYXNzXV0gdGFibGUtY2VsbCIgdGl0bGU9IltbaXRlbS5mdWxsU3RyXV0iPltbaXRlbS5zdHJdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3LXJvdy1zdGF0cy9mYWNldHMtb3ZlcnZpZXctcm93LXN0YXRzLmpzClBvbHltZXIoe2lzOiJmYWNldHMtb3ZlcnZpZXctcm93LXN0YXRzIixwcm9wZXJ0aWVzOntzdGF0czpPYmplY3Qsc2hvd1dlaWdodGVkOkJvb2xlYW4saGFzQ3VzdG9tOkJvb2xlYW4sZGF0YU1vZGVsOk9iamVjdCxkYXRhc2V0SW5kZXg6TnVtYmVyLGNvbXBhcmVNb2RlOkJvb2xlYW4sX2VudHJpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRFbnRyaWVzKHN0YXRzLCBzaG93V2VpZ2h0ZWQsIGhhc0N1c3RvbSkifX0sb2JzZXJ2ZXJzOlsiX2NvbG9yTGVnZW5kQm94KGRhdGFNb2RlbCwgZGF0YXNldEluZGV4LCBjb21wYXJlTW9kZSkiXSxfZ2V0RW50cmllczpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIG5xKGEsYyxkKX0sX2NvbG9yTGVnZW5kQm94OmZ1bmN0aW9uKGEsYyxkKXtjb25zdCBmPWQzLnNlbGVjdCh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI2xlZ2VuZC1ib3giKSk7Mj5hLmdldERhdGFzZXROYW1lcygpLmxlbmd0aCYmIWQ/Zi5zdHlsZSgidmlzaWJpbGl0eSIsCiJoaWRkZW4iKTooZi5zdHlsZSgidmlzaWJpbGl0eSIsbnVsbCksZi5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsYS5nZXRDaGFydENvbG9yU3RyaW5nKGMpKSl9fSk7Cjwvc2NyaXB0PgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1vdmVydmlldy1yb3ctbGVnZW5kIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC50YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSg2MSwxNDAsMjA3LDAuMSk7CiAgICAgICAgYm9yZGVyLWxlZnQ6IHNvbGlkIDAuNXB4IHJnYmEoMCwwLDAsMC4xKTsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDIwcHggNHB4IDhweCAwOwogICAgICAgIG1pbi13aWR0aDogNjlweDsKICAgICAgICBtYXgtd2lkdGg6IDY5cHg7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgIH0KICAgICAgLmRhdGEtd2VpZ2h0ZWQgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAuZGF0YS1jdXN0b20gewogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgfQogICAgICAubGVnZW5kLXNwYWNlIHsKICAgICAgICB3aWR0aDogNnB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1yb3ciPgogICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtc3BhY2UiPjwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19lbnRyaWVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJbW2l0ZW0uY3NzQ2xhc3NdXSB0YWJsZS1jZWxsIj5bW2l0ZW0uc3RyXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1vdmVydmlldy9jb21wb25lbnRzL2ZhY2V0cy1vdmVydmlldy1yb3ctbGVnZW5kL2ZhY2V0cy1vdmVydmlldy1yb3ctbGVnZW5kLmpzClBvbHltZXIoe2lzOiJmYWNldHMtb3ZlcnZpZXctcm93LWxlZ2VuZCIscHJvcGVydGllczp7bnVtZXJpYzpCb29sZWFuLHNob3dXZWlnaHRlZDpCb29sZWFuLGhhc0N1c3RvbTpCb29sZWFuLGRhdGFNb2RlbDpPYmplY3QsX2VudHJpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRFbnRyaWVzKG51bWVyaWMsIHNob3dXZWlnaHRlZCwgaGFzQ3VzdG9tKSJ9fSxfZ2V0RW50cmllczpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGdxKGEsYyxkKX19KTsKPC9zY3JpcHQ+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1vdmVydmlldy1jaGFydCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBsb3R0YWJsZS1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnBsb3R0YWJsZS5jaGFydC1zbWFsbCB7CiAgICAgICAgaGVpZ2h0OiA0NnB4OwogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgfQogICAgICAucGxvdHRhYmxlLnhheGlzLXNtYWxsewogICAgICAgIGhlaWdodDogMzBweDsKICAgICAgICB3aWR0aDogMjUwcHg7CiAgICAgIH0KICAgICAgLnBsb3R0YWJsZS5jaGFydC1iaWcgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDU1MHB4OwogICAgICB9CiAgICAgIC5wbG90dGFibGUueGF4aXMtYmlnIHsKICAgICAgICBoZWlnaHQ6IDUwcHg7CiAgICAgICAgd2lkdGg6IDU1MHB4OwogICAgICB9CiAgICAgICNzaG93X3RhYmxlX2J1dHRvbiB7CiAgICAgICAgbWFyZ2luOiAwIDAgMCA1cHg7CiAgICAgICAgcGFkZGluZzogMCAzcHg7CiAgICAgICAgZm9udC1zaXplOiA3cHQ7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZDNkMzsKICAgICAgfQogICAgICAuZGlhbG9nLXJvdy1lbnRyeSB7CiAgICAgICAgcGFkZGluZzogMCAxMHB4IDAgMDsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7CiAgICAgIH0KICAgICAgLmRpYWxvZy1yb3csIC5kaWFsb2ctaGVhZGVyLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuZGlhbG9nLXJvdy5zZWxlY3RlZCB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2sKICAgICAgfQogICAgICAuZGlhbG9nLXJvdzpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0QwRDBEMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmRpYWxvZy10YWJsZSB7CiAgICAgICAgY2xlYXI6IGxlZnQ7CiAgICAgIH0KICAgICAgLmxhYmVsLWNlbGwgewogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICAgIG1heC13aWR0aDogOTBweDsKICAgICAgICBtaW4td2lkdGg6IDkwcHg7CiAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAubm9uLW92ZXJmbG93LWxhYmVsLWNlbGwgewogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICAgIG1heC13aWR0aDogOTBweDsKICAgICAgICBtaW4td2lkdGg6IDkwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIC5jb3VudC1jZWxsIHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDBweDsKICAgICAgICBtaW4td2lkdGg6IDEwMHB4OwogICAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLndlaWdodGVkLWNlbGwgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAuZGF0YS1saXN0LXNtYWxsIHsKICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgIH0KICAgICAgLmRhdGEtbGlzdC1iaWcgewogICAgICAgIGhlaWdodDogMTgwcHg7CiAgICAgICAgd2lkdGg6IDU1MHB4OwogICAgICB9CiAgICAgIC5oaWRlY2hhcnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNob3djaGFydCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICB9CiAgICAgICN0b29sdGlwIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b29sdGlwLWJhY2tncm91bmQsICM2MTYxNjEpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBtYXJnaW4tbGVmdDogNTBweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgICAgIHRvcDogMHB4OwogICAgICB9CiAgICAgIC50b3BsZXZlbCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZy10b3A6IDRweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRvcGxldmVsIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1N0cmluZ0NoYXJ0KF9jaGFydFR5cGUsIGNoYXJ0U2VsZWN0aW9uKV1dIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzaG93X3RhYmxlX2J1dHRvbiIgb24tY2xpY2s9Il90b2dnbGVTaG93VGFibGUiPltbX2dldFNob3dUYWJsZUJ1dHRvblRleHQoX3Nob3dUYWJsZSldXTwvcGFwZXItYnV0dG9uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzJD0iW1tfY2hhcnRDbGFzc11dIj4KICAgICAgICA8ZGl2IGlkPSJjaGFydCIgY2xhc3MkPSJbW19jaGFydFN2Z0NsYXNzXV0iPjwvZGl2PgogICAgICAgIDxkaXYgaWQ9InhheGlzIiBjbGFzcyQ9IltbX3hBeGlzU3ZnQ2xhc3NdXSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dUYWJsZV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGFibGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWhlYWRlci1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctcm93LWVudHJ5IHRhYmxlLWhlYWRlciBsYWJlbC1jZWxsIj5WYWx1ZTwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFdXSIgYXM9ImRhdGEiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1yb3ctZW50cnkgdGFibGUtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5vbi1vdmVyZmxvdy1sYWJlbC1jZWxsIj5bW2RhdGEubmFtZV1dPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxpcm9uLWxpc3QgaXRlbXM9IltbX3RhYmxlRGF0YV1dIiBhcz0iZW50cnkiIGNsYXNzJD0iW1tfdGFibGVEYXRhQ2xhc3NdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0RW50cnlSb3dDbGFzcyhlbnRyeSwgc2VsZWN0aW9uKV1dIiBvbi10YXA9Il9yb3dDbGljayIgZGF0YS12YWx1ZT0iW1tfZ2V0RW50cnlSb3dWYWx1ZShlbnRyeSldXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctcm93LWVudHJ5IGxhYmVsLWNlbGwiPltbZW50cnkudmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tlbnRyeS5jb3VudHNdXSIgYXM9ImNvdW50Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbX2dldENvdW50Q2VsbENsYXNzKHNob3dXZWlnaHRlZCldXSI+W1tjb3VudF1dPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGlyb24tbGlzdD4KICAgICAgICA8L2lyb24tbGlzdD48L2lyb24tbGlzdD48L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBpZD0idG9vbHRpcCI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9mYWNldHMtb3ZlcnZpZXcvY29tcG9uZW50cy9mYWNldHMtb3ZlcnZpZXctY2hhcnQvZmFjZXRzLW92ZXJ2aWV3LWNoYXJ0LmpzClBvbHltZXIoe2lzOiJmYWNldHMtb3ZlcnZpZXctY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfdXBkYXRlRGF0YSJ9LGRhdGFNb2RlbDpPYmplY3QsZmVhdHVyZTpTdHJpbmcsX21heEJ1Y2tldHNGb3JCYXJDaGFydDp7dHlwZTpOdW1iZXIsdmFsdWU6MTAscmVhZE9ubHk6ITB9LF9jaGFydEFscGhhOnt0eXBlOk51bWJlcix2YWx1ZToxfSxsb2dTY2FsZTpCb29sZWFuLHNob3dXZWlnaHRlZDpCb29sZWFuLHNob3dQZXJjZW50YWdlOkJvb2xlYW4sY2hhcnRTZWxlY3Rpb246e3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfdXBkYXRlQ2hhcnRTZWxlY3Rpb24ifSxzZWxlY3Rpb246e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfdXBkYXRlU2VsZWN0aW9uVmlzaWJpbGl0eSIsbm90aWZ5OiEwfSxleHBhbmRDaGFydDpCb29sZWFuLF9zZWxlY3Rpb25FbGVtOk9iamVjdCxfbWluQmFySGVpZ2h0UmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOi4wMSxyZWFkT25seTohMH0sCl9vbkNsaWNrOk9iamVjdCxfb25DbGlja0Z1bmN0aW9uOk9iamVjdCxfb25Qb2ludGVyOk9iamVjdCxfb25Qb2ludGVyRW50ZXJGdW5jdGlvbjpPYmplY3QsX29uUG9pbnRlckV4aXRGdW5jdGlvbjpPYmplY3QsX3RhYmxlRGF0YTpBcnJheSxfc2hvd1RhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jaGFydFR5cGU6T2JqZWN0LF9jaGFydENsYXNzOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldENoYXJ0Q2xhc3MoX3Nob3dUYWJsZSkifSxfY2hhcnRTdmdDbGFzczp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRDaGFydFN2Z0NsYXNzKGV4cGFuZENoYXJ0KSJ9LF94QXhpc1N2Z0NsYXNzOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldFhBeGlzU3ZnQ2xhc3MoZXhwYW5kQ2hhcnQpIn0sX3RhYmxlRGF0YUNsYXNzOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldFRhYmxlRGF0YUNsYXNzKGV4cGFuZENoYXJ0KSJ9fSxvYnNlcnZlcnM6WyJfcmVuZGVyKGRhdGEsIGxvZ1NjYWxlLCBzaG93V2VpZ2h0ZWQsIGNoYXJ0U2VsZWN0aW9uLCBfc2hvd1RhYmxlLCBleHBhbmRDaGFydCwgc2hvd1BlcmNlbnRhZ2UsIGRhdGFNb2RlbCkiXSwKX3VwZGF0ZURhdGEoKXt0aGlzLl9zaG93VGFibGU9ITF9LF91cGRhdGVDaGFydFNlbGVjdGlvbigpe3RoaXMuX3Nob3dUYWJsZT0hMX0sX2hhc1dlaWdodGVkSGlzdG9ncmFtKGEpe3JldHVybiBMcChhKX0sX2hhc1F1YW50aWxlcyhhKXtyZXR1cm4gTXAoYSl9LF9pc1N0cmluZ0NoYXJ0KGEsYyl7cmV0dXJuKGE9PT1YcC5DVU1ESVNUX0NIQVJUfHxhPT09WHAuQkFSX0NIQVJUKSYmIlZhbHVlIGxpc3QgbGVuZ3RoIiE9PWMmJiJGZWF0dXJlIGxpc3QgbGVuZ3RoIiE9PWN9LF9kaXNhYmxlTG9nQ2hlY2tib3goYSxjKXtyZXR1cm4gYXx8IlN0YW5kYXJkIiE9PWN9LF9yZW5kZXIoYSxjLGQsZixnLGwsayxtKXt0aGlzLl9vblBvaW50ZXImJih0aGlzLl9vblBvaW50ZXIub2ZmUG9pbnRlck1vdmUodGhpcy5fb25Qb2ludGVyRW50ZXJGdW5jdGlvbiksdGhpcy5fb25Qb2ludGVyLm9mZlBvaW50ZXJNb3ZlKHRoaXMuX29uUG9pbnRlckV4aXRGdW5jdGlvbikpO3RoaXMuX29uQ2xpY2smJnRoaXMuX29uQ2xpY2sub2ZmQ2xpY2sodGhpcy5fb25DbGlja0Z1bmN0aW9uKTsKYSYmKHRoaXMuX2NoYXJ0QWxwaGE9bS5nZXRDaGFydEFscGhhKCksZz1hLm1hcChwPT50aGlzLl9nZXRCdWNrZXRzKHAsZCxmKSksdGhpcy5fY2hhcnRUeXBlPVpwKGEsZix0aGlzLl9tYXhCdWNrZXRzRm9yQmFyQ2hhcnQpLGE9YS5tYXAocD0+cC5uYW1lKSwiVmFsdWUgbGlzdCBsZW5ndGgiPT09Znx8IkZlYXR1cmUgbGlzdCBsZW5ndGgiPT09Znx8IlF1YW50aWxlcyI9PT1mP3RoaXMuX3JlbmRlclF1YW50aWxlQ2hhcnQoZyxhLGMpOnRoaXMuX2NoYXJ0VHlwZT09PVhwLkhJU1RPR1JBTT90aGlzLl9yZW5kZXJIaXN0b2dyYW1DaGFydChnLGEsYyxrKTp0aGlzLl9jaGFydFR5cGU9PT1YcC5DVU1ESVNUX0NIQVJUP3RoaXMuX3JlbmRlckNkZkNoYXJ0KGcsYSxjKTp0aGlzLl9yZW5kZXJCYXJDaGFydChnLGEsYyxrKSl9LF9yZW5kZXJIaXN0b2dyYW1DaGFydChhLGMsZCxmKXtjb25zdCBnPVtdLGw9bmV3IFBsb3R0YWJsZS5QbG90cy5SZWN0YW5nbGU7bGV0IGs9SW5maW5pdHksbT0tSW5maW5pdHksCnA9MDtmJiYoYT1vcShhKSk7YS5mb3JFYWNoKCh2LEEpPT57di5mb3JFYWNoKHk9Pntjb25zdCB4PXpwKHkuZ2V0TG93VmFsdWUoKSksQz16cCh5LmdldEhpZ2hWYWx1ZSgpKTt5PXpwKHkuZ2V0U2FtcGxlQ291bnQoKSk7eDxrJiYoaz14KTtDPm0mJihtPUMpO3k+cCYmKHA9eSk7aXNGaW5pdGUoeCkmJmlzRmluaXRlKEMpJiZnLnB1c2goQy14KX0pO2wuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodix7bmFtZTpjW0FdfSkpfSk7bGV0IHE9MDxnLmxlbmd0aD9nLnJlZHVjZShmdW5jdGlvbih2LEEpe3JldHVybiB2K0F9KS9nLmxlbmd0aDowOzA9PT1xJiYocT0xKTtmPVtdO2lzRmluaXRlKGspJiYoZi5wdXNoKGspLGlzRmluaXRlKG0pJiZmLnB1c2gobSkpO2E9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyOzA8Zi5sZW5ndGgmJmEuZG9tYWluKGYpO2Y9dGhpcy5fZ2V0U2NhbGUoZCkuZG9tYWluKFswXSk7Y29uc3Qgcj1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhhLAoiYm90dG9tIiksdD1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhmLCJsZWZ0Iik7dC5mb3JtYXR0ZXIodGhpcy5fY2hhcnRBeGlzU2NhbGVGb3JtYXR0ZXIoKSk7ci5mb3JtYXR0ZXIodGhpcy5fY2hhcnRBeGlzU2NhbGVGb3JtYXR0ZXIoKSk7bC54KHY9PntsZXQgQT16cCh2LmdldExvd1ZhbHVlKCkpO2lmKC1JbmZpbml0eT09PUF8fEE9PT12LmdldEhpZ2hWYWx1ZSgpKXY9enAodi5nZXRIaWdoVmFsdWUoKSksaXNGaW5pdGUodik/QT12LXE6KEE9MCwtSW5maW5pdHk9PT12JiYoQS09cSkpO3JldHVybiBBfSxhKS54Mih2PT57bGV0IEE9enAodi5nZXRIaWdoVmFsdWUoKSk7aWYoSW5maW5pdHk9PT1BfHxBPT09di5nZXRMb3dWYWx1ZSgpKXY9enAodi5nZXRMb3dWYWx1ZSgpKSxpc0Zpbml0ZSh2KT9BPXYrcTooQT0wLEluZmluaXR5PT09diYmKEErPXEpKTtyZXR1cm4gQX0pLnkoKCk9PjAsZikueTIodj0+dGhpcy5fZ2V0Q291bnRXaXRoRmxvb3IodixwLGQpKTtsLmF0dHIoImZpbGwiLAoodixBLHkpPT55Lm1ldGFkYXRhKCkubmFtZSx0aGlzLmRhdGFNb2RlbC5nZXRDb2xvclNjYWxlKCkpLmF0dHIoIm9wYWNpdHkiLHRoaXMuX2NoYXJ0QWxwaGEpO3RoaXMuX3JlbmRlckNoYXJ0KGwscix0LG51bGwsbnVsbCx2PT5sLmVudGl0aWVzQXQodiksdj0+dHAoenAodi5nZXRMb3dWYWx1ZSgpKSwyKS50b0xvY2FsZVN0cmluZygpKyItIit0cCh6cCh2LmdldEhpZ2hWYWx1ZSgpKSwyKS50b0xvY2FsZVN0cmluZygpKyI6ICIrenAodi5nZXRTYW1wbGVDb3VudCgpKS50b0xvY2FsZVN0cmluZygpLHY9Pm5ldyBxcCh0aGlzLmZlYXR1cmUsdm9pZCAwLHpwKHYuZ2V0TG93VmFsdWUoKSksenAodi5nZXRIaWdoVmFsdWUoKSkpLHY9PnYuYXBwZW5kKCJyZWN0IikuYXR0cigic3Ryb2tlIiwiYmxhY2siKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInN0cm9rZS13aWR0aCIsIjFweCIpLCh2LEEpPT52LmF0dHIoIngiLEEucG9zaXRpb24ueC1BLnNlbGVjdGlvbi5fZ3JvdXBzWzBdWzBdLndpZHRoLmJhc2VWYWwudmFsdWUvCjIpLmF0dHIoInkiLEEucG9zaXRpb24ueS1BLnNlbGVjdGlvbi5fZ3JvdXBzWzBdWzBdLmhlaWdodC5iYXNlVmFsLnZhbHVlLzIpLmF0dHIoIndpZHRoIixBLnNlbGVjdGlvbi5fZ3JvdXBzWzBdWzBdLndpZHRoLmJhc2VWYWwudmFsdWUpLmF0dHIoImhlaWdodCIsQS5zZWxlY3Rpb24uX2dyb3Vwc1swXVswXS5oZWlnaHQuYmFzZVZhbC52YWx1ZSkpfSxfcmVuZGVyUXVhbnRpbGVDaGFydChhLGMsZCl7Y29uc3QgZj1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmUsZz1uZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7bGV0IGw9SW5maW5pdHksaz0tSW5maW5pdHk7YS5mb3JFYWNoKChxLHIpPT57Y29uc3QgdD1bXSx2PXEubGVuZ3RoO3EuZm9yRWFjaCgoQSx5KT0+e3ZhciB4PXpwKEEuZ2V0TG93VmFsdWUoKSk7Y29uc3QgQz16cChBLmdldEhpZ2hWYWx1ZSgpKTt4PGwmJihsPXgpO0M+ayYmKGs9Qyk7eD1uZXcgSG47eC5idWNrZXQ9QTt4LmRhdGFzZXRJbmRleD1yO3gucXVhbnRpbGU9MTAwKgp5L3Y7dC5wdXNoKHgpfSk7aWYoMDxxLmxlbmd0aCl7Y29uc3QgQT1uZXcgSGo7QS5zZXRMb3dWYWx1ZShxW3EubGVuZ3RoLTFdLmdldEhpZ2hWYWx1ZSgpKTtBLnNldEhpZ2hWYWx1ZShxW3EubGVuZ3RoLTFdLmdldEhpZ2hWYWx1ZSgpKTtBLnNldFNhbXBsZUNvdW50KHFbcS5sZW5ndGgtMV0uZ2V0U2FtcGxlQ291bnQoKSk7cT1uZXcgSG47cS5idWNrZXQ9QTtxLmRhdGFzZXRJbmRleD1yO3EucXVhbnRpbGU9MTAwO3QucHVzaChxKX1mLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHQse25hbWU6Y1tyXX0pKTtnLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHQse25hbWU6Y1tyXX0pKX0pO2NvbnN0IG09aXNGaW5pdGUobCkmJmlzRmluaXRlKGspP2s9PT1sPzE6KGstbCkvMTA6MDt2YXIgcD1bXTtpc0Zpbml0ZShsKSYmKHAucHVzaChsLW0pLGlzRmluaXRlKGspJiZwLnB1c2goayttKSk7ZD10aGlzLl9nZXRTY2FsZShkKTswPHAubGVuZ3RoJiZkLmRvbWFpbihwKTsKcD10aGlzLl9nZXRTY2FsZSghMSkuZG9tYWluKFstYS5sZW5ndGgrLjUsMV0pO2E9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoZCwiYm90dG9tIik7YS5mb3JtYXR0ZXIodGhpcy5fY2hhcnRBeGlzU2NhbGVGb3JtYXR0ZXIoKSk7Zi54KHE9PnpwKHEuYnVja2V0LmdldExvd1ZhbHVlKCkpLGQpLnkocT0+LTEqcS5kYXRhc2V0SW5kZXgscCk7Zy54KHE9PnpwKHEuYnVja2V0LmdldExvd1ZhbHVlKCkpLGQpLnkocT0+LXEuZGF0YXNldEluZGV4LHApLnNpemUocT0+NTA9PT1xLnF1YW50aWxlPzE1OjgpLnN5bWJvbCgoKT0+UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5jcm9zcygpKTtmLmF0dHIoInN0cm9rZSIsImdyYXkiKS5hdHRyKCJvcGFjaXR5Iix0aGlzLl9jaGFydEFscGhhKTtnLmF0dHIoImZpbGwiLChxLHIsdCk9PnQubWV0YWRhdGEoKS5uYW1lLHRoaXMuZGF0YU1vZGVsLmdldENvbG9yU2NhbGUoKSkuYXR0cigib3BhY2l0eSIsdGhpcy5fY2hhcnRBbHBoYSk7cD1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoW2YsCmddKTt0aGlzLl9yZW5kZXJDaGFydChwLGEsbnVsbCxudWxsLG51bGwscT0+Zy5lbnRpdGllc0F0KHEpLHE9PnEucXVhbnRpbGUrIiU6ICIrdHAoenAocS5idWNrZXQuZ2V0TG93VmFsdWUoKSksMikudG9Mb2NhbGVTdHJpbmcoKSxxPT5uZXcgcXAodGhpcy5mZWF0dXJlLHZvaWQgMCx6cChxLmJ1Y2tldC5nZXRMb3dWYWx1ZSgpKSx6cChxLmJ1Y2tldC5nZXRIaWdoVmFsdWUoKSkpLHE9PnEuYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwzKS5hdHRyKCJzdHJva2UiLCJibGFjayIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigic3Ryb2tlLXdpZHRoIiwiMXB4IiksKHEscik9PnEuYXR0cigiY3giLHIucG9zaXRpb24ueCkuYXR0cigiY3kiLHIucG9zaXRpb24ueSkpfSxfcmVuZGVyQmFyQ2hhcnQoYSxjLGQsZil7Y29uc3QgZz13cChhKSxsPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjt2YXIgaz1uZXcgUGxvdHRhYmxlLlNjYWxlcy5DYXRlZ29yeTtjb25zdCBtPXRoaXMuX2dldFNjYWxlKGQpOwprLmRvbWFpbihnKTtrPW5ldyBQbG90dGFibGUuQXhlcy5DYXRlZ29yeShrLCJib3R0b20iKTtjb25zdCBwPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKG0sImxlZnQiKTtwLmZvcm1hdHRlcih0aGlzLl9jaGFydEF4aXNTY2FsZUZvcm1hdHRlcigpKTtmJiYoYT1vcShhKSk7bGV0IHE9MDtmPWEubWFwKCh0LHYpPT57dC5mb3JFYWNoKHk9Pnt5PXpwKHkuZ2V0U2FtcGxlQ291bnQoKSk7eT5xJiYocT15KX0pO2NvbnN0IEE9bmV3IFRwO0EubmFtZT1jW3ZdO0EucmF3QnVja2V0cz10O3JldHVybiBBfSk7dGhpcy5fdGFibGVEYXRhPVdwKGYsZyk7Y29uc3Qgcj1uZXcgUGxvdHRhYmxlLlBsb3RzLkJhcjthLmZvckVhY2goKHQsdik9PnIuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodCx7bmFtZTpjW3ZdfSkpKTtyLngodD0+Zy5pbmRleE9mKHhwKHQuZ2V0TGFiZWwoKSkpLGwpLnkodD0+dGhpcy5fZ2V0Q291bnRXaXRoRmxvb3IodCxxLGQpLG0pO3IuYXR0cigiZmlsbCIsCih0LHYsQSk9PkEubWV0YWRhdGEoKS5uYW1lLHRoaXMuZGF0YU1vZGVsLmdldENvbG9yU2NhbGUoKSkuYXR0cigib3BhY2l0eSIsdGhpcy5fY2hhcnRBbHBoYSk7dGhpcy5fcmVuZGVyQ2hhcnQocixrLHAsbnVsbCxudWxsLHQ9PnIuZW50aXRpZXNBdCh0KSx0PT54cCh0LmdldExhYmVsKCkpKyI6ICIrenAodC5nZXRTYW1wbGVDb3VudCgpKS50b0xvY2FsZVN0cmluZygpLHQ9Pm5ldyBxcCh0aGlzLmZlYXR1cmUsdC5nZXRMYWJlbCgpKSx0PT50LmFwcGVuZCgicmVjdCIpLmF0dHIoInN0cm9rZSIsImJsYWNrIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzdHJva2Utd2lkdGgiLCIxcHgiKSwodCx2KT0+dC5hdHRyKCJ4Iix2LnBvc2l0aW9uLngtdi5zZWxlY3Rpb24uX2dyb3Vwc1swXVswXS53aWR0aC5iYXNlVmFsLnZhbHVlLzIpLmF0dHIoInkiLHYucG9zaXRpb24ueSkuYXR0cigid2lkdGgiLHYuc2VsZWN0aW9uLl9ncm91cHNbMF1bMF0ud2lkdGguYmFzZVZhbC52YWx1ZSkuYXR0cigiaGVpZ2h0IiwKdi5zZWxlY3Rpb24uX2dyb3Vwc1swXVswXS5oZWlnaHQuYmFzZVZhbC52YWx1ZSkpfSxfcmVuZGVyQ2RmQ2hhcnQoYSxjLGQpe2NvbnN0IGY9Yy5tYXAocj0+e3I9dGhpcy5kYXRhTW9kZWwuZ2V0RmVhdHVyZUNvbW1vblN0YXRzKHRoaXMuZmVhdHVyZSxyKTtyZXR1cm4gbnVsbCE9cj9yLmdldE51bU5vbk1pc3NpbmcoKSpyLmdldEF2Z051bVZhbHVlcygpOjB9KSxnPXdwKGEpLGw9e307Zy5mb3JFYWNoKChyLHQpPT57bFtyXT10fSk7Y29uc3Qgaz0obmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyKS5kb21haW4oWzBdKTtkPXRoaXMuX2dldFNjYWxlKGQpLmRvbWFpbihbMF0pO2NvbnN0IG09bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoaywiYm90dG9tIikscD1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhkLCJsZWZ0IikscT1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7YT1hLm1hcCgocix0KT0+e2NvbnN0IHY9W10sQT1bXSx5PVtdO2xldCB4PS0xO3IuZm9yRWFjaChDPT57Qz0KQy5jbG9uZU1lc3NhZ2UoKTt5LnB1c2goQyl9KTswPHQmJnkuc29ydCgoQyxGKT0+bFt4cChDLmdldExhYmVsKCkpXS1sW3hwKEYuZ2V0TGFiZWwoKSldKTt5LmZvckVhY2goKEMsRik9Pntjb25zdCBEPWxbeHAoQy5nZXRMYWJlbCgpKV07Zm9yKHZhciBCPXgrMTtCPEQ7QisrKXt2YXIgRz1uZXcgS2o7Ry5zZXRMYWJlbChnW0JdKTtHLnNldExvd1JhbmsoQik7Ry5zZXRIaWdoUmFuayhCKTswPT09di5sZW5ndGg/Ry5zZXRTYW1wbGVDb3VudCgwKTpHLnNldFNhbXBsZUNvdW50KHZbdi5sZW5ndGgtMV0uZ2V0U2FtcGxlQ291bnQoKSk7di5wdXNoKEcpO0c9bmV3IEtqO0cuc2V0TGFiZWwoZ1tCXSk7Ry5zZXRMb3dSYW5rKEIpO0cuc2V0SGlnaFJhbmsoQik7Ry5zZXRTYW1wbGVDb3VudCgwKTtBLnB1c2goRyl9eD1EO0I9Qy5jbG9uZSgpO0EucHVzaChCKTswPT09Rj9DLnNldFNhbXBsZUNvdW50KHpwKEMuZ2V0U2FtcGxlQ291bnQoKSkvZlt0XSk6KEY9MDxEP0QtMTpGLTEsQy5zZXRTYW1wbGVDb3VudCh6cChDLmdldFNhbXBsZUNvdW50KCkpLwpmW3RdK3pwKHZbRl0uZ2V0U2FtcGxlQ291bnQoKSkpKTtDLnNldExvd1JhbmsoRCk7Qy5zZXRIaWdoUmFuayhEKTt2LnB1c2goQyl9KTtyPW5ldyBUcDtyLm5hbWU9Y1t0XTtyLnBlcmNCdWNrZXRzPXY7ci5yYXdCdWNrZXRzPUE7cmV0dXJuIHJ9KTt0aGlzLl90YWJsZURhdGE9VnAoYSk7Zm9yKGNvbnN0IHIgb2YgYSlxLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHIucGVyY0J1Y2tldHMse25hbWU6ci5uYW1lfSkpO3EueChyPT56cChyLmdldExvd1JhbmsoKSksaykueShyPT56cChyLmdldFNhbXBsZUNvdW50KCkpLGQpO3EuYXR0cigic3Ryb2tlIiwocix0LHYpPT52Lm1ldGFkYXRhKCkubmFtZSx0aGlzLmRhdGFNb2RlbC5nZXRDb2xvclNjYWxlKCkpLmF0dHIoIm9wYWNpdHkiLHRoaXMuX2NoYXJ0QWxwaGEpO3RoaXMuX3JlbmRlckNoYXJ0KHEsbSxwLG51bGwsbnVsbCxyPT5xLmVudGl0aWVzQXQocikscj0+eHAoci5nZXRMYWJlbCgpKSsiOiAiK3RwKHpwKHIuZ2V0U2FtcGxlQ291bnQoKSksCjQpLnRvTG9jYWxlU3RyaW5nKCkscj0+bmV3IHFwKHRoaXMuZmVhdHVyZSxyLmdldExhYmVsKCkpLHI9PnIuYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwzKS5hdHRyKCJzdHJva2UiLCJibGFjayIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigic3Ryb2tlLXdpZHRoIiwiMXB4IiksKHIsdCk9PnIuYXR0cigiY3giLHQucG9zaXRpb24ueCkuYXR0cigiY3kiLHQucG9zaXRpb24ueSkpfSxfcmVuZGVyQ2hhcnQoYSxjLGQsZixnLGwsayxtLHAscSl7aWYoIXRoaXMuX3Nob3dUYWJsZSl7dmFyIHI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbZyxkLGFdLFtudWxsLG51bGwsbnVsbF1dKSx0PW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW251bGwsbnVsbF0sW251bGwsY11dKTtQbG90dGFibGUuUmVuZGVyQ29udHJvbGxlci5yZW5kZXJQb2xpY3koKTt2YXIgdj1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0KSxBPWQzLnNlbGVjdCh0aGlzLiQueGF4aXMpLHk9ZDMuc2VsZWN0KHRoaXMuJC50b29sdGlwKTsKdGhpcy5hc3luYygoKT0+e3Yuc2VsZWN0QWxsKCIuY29tcG9uZW50IikucmVtb3ZlKCk7QS5zZWxlY3RBbGwoIi5jb21wb25lbnQiKS5yZW1vdmUoKTtyLnJlbmRlclRvKHRoaXMuJC5jaGFydCk7dGhpcy5fc2VsZWN0aW9uRWxlbT1wKGEuZm9yZWdyb3VuZCgpKTt0aGlzLl91cGRhdGVTZWxlY3Rpb25WaXNpYmlsaXR5KHRoaXMuc2VsZWN0aW9uKTt2Lm9uKCJtb3VzZWVudGVyIiwoKT0+e3RoaXMuX29uUG9pbnRlcj1uZXcgcGxvdHRhYmxlX2hlbHBlcnMuUG9pbnRlckludGVyYWN0aW9uO3RoaXMuX29uUG9pbnRlckVudGVyRnVuY3Rpb249eD0+e3g9bCh4KTswPHgubGVuZ3RoJiYoeD14Lm1hcChDPT5udWxsPT1DLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfHwxPT09dGhpcy5kYXRhTW9kZWwuZ2V0RGF0YXNldE5hbWVzKCkubGVuZ3RoP2soQy5kYXR1bSk6Qy5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSsiOiAiK2soQy5kYXR1bSkpLmpvaW4oIlxuIikseS50ZXh0KHgpLHkuc3R5bGUoIm9wYWNpdHkiLAoiMSIpKX07dGhpcy5fb25Qb2ludGVyLm9uUG9pbnRlck1vdmUodGhpcy5fb25Qb2ludGVyRW50ZXJGdW5jdGlvbik7dGhpcy5fb25Qb2ludGVyRXhpdEZ1bmN0aW9uPWZ1bmN0aW9uKCl7eS5zdHlsZSgib3BhY2l0eSIsIjAiKX07dGhpcy5fb25Qb2ludGVyLm9uUG9pbnRlckV4aXQodGhpcy5fb25Qb2ludGVyRXhpdEZ1bmN0aW9uKTt0aGlzLl9vblBvaW50ZXIuYXR0YWNoVG8oYSk7aWYoIlZhbHVlIGxpc3QgbGVuZ3RoIiE9PXRoaXMuY2hhcnRTZWxlY3Rpb24pe3RoaXMuX29uQ2xpY2s9bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuQ2xpY2s7Y29uc3QgeD10aGlzO3RoaXMuX29uQ2xpY2tGdW5jdGlvbj1DPT57Qz1sKEMpOzA8Qy5sZW5ndGgmJihxKHguX3NlbGVjdGlvbkVsZW0sQ1swXSksQz1tKENbMF0uZGF0dW0pLHguX3NldFNlbGVjdGlvbihDKSl9O3RoaXMuX29uQ2xpY2sub25DbGljayh0aGlzLl9vbkNsaWNrRnVuY3Rpb24pO3RoaXMuX29uQ2xpY2suYXR0YWNoVG8oYSl9fSkub24oIm1vdXNlbGVhdmUiLAooKT0+e3RoaXMuX29uUG9pbnRlci5kZXRhY2hGcm9tKCk7dGhpcy5fb25DbGljay5kZXRhY2hGcm9tKCl9KTtudWxsIT1kJiZ0LmNvbHVtblBhZGRpbmcoci5jb21wb25lbnRBdCgxKS53aWR0aCgpKyhyLmNvbXBvbmVudEF0KDApP3IuY29tcG9uZW50QXQoMCkud2lkdGgoKTowKSk7dC5yZW5kZXJUbyh0aGlzLiQueGF4aXMpfSl9fSxfc2V0U2VsZWN0aW9uKGEpe2EuZXF1YWxzKHRoaXMuc2VsZWN0aW9uKSYmYS5jbGVhcigpO3RoaXMuc2VsZWN0aW9uPWE7dGhpcy5maXJlKCJmZWF0dXJlLXNlbGVjdCIse3NlbGVjdGlvbjphfSl9LF9nZXRCdWNrZXRzKGEsYyxkKXtyZXR1cm4gdXAoYSxjLGQpfSxfZ2V0U2NhbGUoYSl7cmV0dXJuIGE/bmV3IFBsb3R0YWJsZS5TY2FsZXMuTW9kaWZpZWRMb2c6bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyfSxfY2hhcnRBeGlzU2NhbGVGb3JtYXR0ZXIoKXtjb25zdCBhPVBsb3R0YWJsZS5Gb3JtYXR0ZXJzLnNob3J0U2NhbGUoKTtyZXR1cm4gYz0+CjFFMz5NYXRoLmFicyhjKT9TdHJpbmcoYyk6YShjKX0sX2dldENvdW50V2l0aEZsb29yKGEsYyxkKXthPXpwKGEuZ2V0U2FtcGxlQ291bnQoKSk7IWQmJjA8YSYmYS9jPHRoaXMuX21pbkJhckhlaWdodFJhdGlvJiYoYT1jKnRoaXMuX21pbkJhckhlaWdodFJhdGlvKTtyZXR1cm4gYX0sX3VwZGF0ZVNlbGVjdGlvblZpc2liaWxpdHkoYSl7dGhpcy5fc2VsZWN0aW9uRWxlbSYmdGhpcy5fc2VsZWN0aW9uRWxlbS5zdHlsZSgiZGlzcGxheSIsbnVsbD09YXx8YS5uYW1lIT09dGhpcy5mZWF0dXJlPyJub25lIjoiaW5saW5lIil9LF90b2dnbGVTaG93VGFibGUoKXt0aGlzLl9zaG93VGFibGU9IXRoaXMuX3Nob3dUYWJsZX0sX2dldENoYXJ0Q2xhc3MoYSl7cmV0dXJuIGE/ImhpZGVjaGFydCI6InNob3djaGFydCJ9LF9nZXRTaG93VGFibGVCdXR0b25UZXh0KGEpe3JldHVybiBhPyJzaG93IGNoYXJ0Ijoic2hvdyByYXcgZGF0YSJ9LF9nZXRDaGFydFN2Z0NsYXNzKGEpe3JldHVybiBhPyJjaGFydC1iaWciOgoiY2hhcnQtc21hbGwifSxfZ2V0WEF4aXNTdmdDbGFzcyhhKXtyZXR1cm4gYT8ieGF4aXMtYmlnIjoieGF4aXMtc21hbGwifSxfZ2V0VGFibGVEYXRhQ2xhc3MoYSl7cmV0dXJuIGE/ImRhdGEtbGlzdC1iaWciOiJkYXRhLWxpc3Qtc21hbGwifSxfcm93Q2xpY2soYSl7dGhpcy5fc2V0U2VsZWN0aW9uKG5ldyBxcCh0aGlzLmZlYXR1cmUsYS5jdXJyZW50VGFyZ2V0LmRhdGFWYWx1ZSkpfSxfZ2V0RW50cnlSb3dWYWx1ZShhKXtyZXR1cm4gYS52YWx1ZX0sX2dldEVudHJ5Um93Q2xhc3MoYSxjKXtsZXQgZD0iZGlhbG9nLXJvdyI7bnVsbCE9YyYmYy5uYW1lPT09dGhpcy5mZWF0dXJlJiZjLnN0cmluZ1ZhbHVlPT09YS52YWx1ZSYmKGQrPSIgc2VsZWN0ZWQiKTtyZXR1cm4gZH0sX2dldENvdW50Q2VsbENsYXNzKGEpe3JldHVybiJkYWlsb2ctcm93LWVudHJ5IGNvdW50LWNlbGwiKyhhPyIgd2VpZ2h0ZWQtY2VsbCI6IiIpfX0pOwo8L3NjcmlwdD4KCgo8ZG9tLW1vZHVsZSBpZD0iZmFjZXRzLW92ZXJ2aWV3LXRhYmxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmZlYXR1cmUtbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBtYXgtd2lkdGg6IDQ4MHB4OwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBtYXJnaW46IDAgMCA0cHggNHB4OwogICAgICB9CiAgICAgIC50YWJsZS1uYW1lIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHdvcmQtd3JhcDpicmVhay13b3JkOwogICAgICAgIHBhZGRpbmc6IDRweCAwIDRweCA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSg2MSwxNDAsMjA3LDAuMyk7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgIH0KICAgICAgLmZlYXR1cmUtaXJvbi1saXN0IHsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDgwMHB4OwogICAgICB9CiAgICAgIC5jaGFydC1jb2x1bW4gewogICAgICAgIHdpZHRoOiAyODBweDsKICAgICAgICBtaW4td2lkdGg6IDI4MHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQogICAgICAuY2hhcnQtY29sdW1uLmhlYWRlci1jZWxsIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDYxLDE0MCwyMDcsMC4xKTsKICAgICAgICBib3JkZXItdG9wOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMC41cHggcmdiYSgwLDAsMCwwLjEpOwogICAgICAgIGJvcmRlci1yaWdodDogc29saWQgMC41cHggcmdiYSgwLDAsMCwwLjEpOwogICAgICAgIHBhZGRpbmctbGVmdDogOHB4OwogICAgICB9CiAgICAgIC5udW1lcmljLXJvdyB7CiAgICAgICAgbWluLWhlaWdodDogODBweDsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CiAgICAgIH0KICAgICAgLmNhdGVnb3JpY2FsLXJvdyB7CiAgICAgICAgbWluLWhlaWdodDogOThweDsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMmVtOwogICAgICB9CiAgICAgIC5jaGFydC1jb2x1bW4udGFibGUtY2VsbCB7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIHBhZGRpbmc6IDEwcHggMCAwIDIwcHgKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgIH0KICAgICAgLmhlYWRlci1jZWxsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogNjBweDsKICAgICAgfQogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1zaXplOiAxMnB4OwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZzogMnB4OwogICAgICB9CiAgICAgIC5jb250cm9sLWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuY2hlY2tib3gtaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAycHg7CiAgICAgIH0KICAgICAgLmNoYXJ0LWNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICB9CiAgICAgICN3ZWlnaHRib3ggewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3MkPSJbW19nZXRUYWJsZVdyYXBwZXJDbGFzcyhmZWF0dXJlcyldXSI+CiAgICAgIDxkaXYgY2xhc3M9ImhlYWRlci1yb3ciPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlci1jZWxsIHRhYmxlLWNlbGwiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtbmFtZSI+W1tfZ2V0VGl0bGUobnVtZXJpYyldXSBGZWF0dXJlcyAoW1tfZ2V0RmVhdHVyZUNvdW50VGV4dChkYXRhTW9kZWwsIG51bWVyaWMsIGZlYXR1cmVzKV1dKQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3LXJvdy1sZWdlbmQgbnVtZXJpYz0iW1tudW1lcmljXV0iIHNob3ctd2VpZ2h0ZWQ9IltbX3Nob3dXZWlnaHRlZF1dIiBoYXMtY3VzdG9tPSJbW19oYXNDdXN0b21TdGF0cyhkYXRhTW9kZWwpXV0iIGRhdGEtbW9kZWw9IltbZGF0YU1vZGVsXV0iPgogICAgICAgICAgPC9mYWNldHMtb3ZlcnZpZXctcm93LWxlZ2VuZD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIGNoYXJ0LWNvbHVtbiBoZWFkZXItY2VsbCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJDaGFydCB0byBzaG93Ij4KICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X2NoYXJ0U2VsZWN0aW9ufX0iIGF0dHItZm9yLXNlbGVjdGVkPSJ2YWx1ZSIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jaGFydFNlbGVjdGlvblR5cGVzXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iW1tpdGVtXV0iPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3gtaG9sZGVyIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2xhc3M9ImNoYXJ0LWNoZWNrYm94IiBpZD0ibG9nYm94IiBjaGVja2VkPSJ7e19sb2dTY2FsZX19Ij5sb2c8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0iY2hhcnQtY2hlY2tib3giIGlkPSJleHBhbmRib3giIGNoZWNrZWQ9Int7X2V4cGFuZENoYXJ0c319Ij5leHBhbmQ8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzV2VpZ2h0ZWRIaXN0b2dyYW0oZmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGFydC1jaGVja2JveCIgaWQ9IndlaWdodGJveCIgY2hlY2tlZD0ie3tfc2hvd1dlaWdodGVkfX0iPndlaWdodGVkPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVEYXRhc2V0cyhkYXRhTW9kZWwpXV0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGFydC1jaGVja2JveCIgaWQ9InBlcmNlbnRib3giIGNoZWNrZWQ9Int7X3Nob3dQZXJjZW50YWdlfX0iIGRpc2FibGVkPSJbW19jaGFydFNlbGVjdGlvbkhhc1F1YW50aWxlcyhfY2hhcnRTZWxlY3Rpb24pXV0iPnBlcmNlbnRhZ2VzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGlyb24tbGlzdCBpdGVtcz0iW1tmZWF0dXJlc11dIiBhcz0iZmVhdHVyZSIgY2xhc3M9ImZlYXR1cmUtaXJvbi1saXN0Ij4KICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0VGFibGVSb3dDbGFzcyhudW1lcmljKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lIj5bW19nZXRGZWF0dXJlTmFtZShmZWF0dXJlKV1dPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZ2V0RGF0YXNldHMoZGF0YU1vZGVsKV1dIiBhcz0iZGF0YXNldCIgaW5kZXgtYXM9ImRhdGFzZXRJbmRleCI+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3LXJvdy1zdGF0cyBzdGF0cz0iW1tfZ2V0U3RhdHMoZGF0YU1vZGVsLCBkYXRhc2V0LCBmZWF0dXJlKV1dIiBjdXN0b20tc3RhdHM9IltbX2dldEFsbEN1c3RvbVN0YXRzKGRhdGFNb2RlbCwgZmVhdHVyZSldXSIgc2hvdy13ZWlnaHRlZD0iW1tfc2hvd1dlaWdodGVkXV0iIGhhcy1jdXN0b209IltbX2hhc0N1c3RvbVN0YXRzKGRhdGFNb2RlbCldXSIgZGF0YS1tb2RlbD0iW1tkYXRhTW9kZWxdXSIgZGF0YXNldC1pbmRleD0iW1tkYXRhc2V0SW5kZXhdXSIgY29tcGFyZS1tb2RlPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgICAgICAgICAgICA8L2ZhY2V0cy1vdmVydmlldy1yb3ctc3RhdHM+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbX2dldENoYXJ0Q2xhc3MoX2V4cGFuZENoYXJ0cyldXSI+CiAgICAgICAgICAgICAgPGZhY2V0cy1vdmVydmlldy1jaGFydCBkYXRhPSJbW19nZXRDaGFydERhdGEoZGF0YU1vZGVsLCBmZWF0dXJlKV1dIiBkYXRhLW1vZGVsPSJbW2RhdGFNb2RlbF1dIiBmZWF0dXJlPSJbW19nZXRGZWF0dXJlTmFtZShmZWF0dXJlKV1dIiBzZWxlY3Rpb249Int7ZmVhdHVyZVNsaWNlU2VsZWN0aW9ufX0iIGxvZy1zY2FsZT0iW1tfbG9nU2NhbGVdXSIgc2hvdy13ZWlnaHRlZD0iW1tfc2hvd1dlaWdodGVkXV0iIHNob3ctcGVyY2VudGFnZT0iW1tfc2hvd1BlcmNlbnRhZ2VdXSIgY2hhcnQtc2VsZWN0aW9uPSJbW19jaGFydFNlbGVjdGlvbl1dIiBleHBhbmQtY2hhcnQ9IltbX2V4cGFuZENoYXJ0c11dIj4KICAgICAgICAgICAgICA8L2ZhY2V0cy1vdmVydmlldy1jaGFydD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2lyb24tbGlzdD4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1vdmVydmlldy9jb21wb25lbnRzL2ZhY2V0cy1vdmVydmlldy10YWJsZS9mYWNldHMtb3ZlcnZpZXctdGFibGUuanMKUG9seW1lcih7aXM6ImZhY2V0cy1vdmVydmlldy10YWJsZSIscHJvcGVydGllczp7ZGF0YU1vZGVsOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX2hhbmRsZVJlc2l6ZSJ9LGZlYXR1cmVzOnt0eXBlOkFycmF5LG9ic2VydmVyOiJfaGFuZGxlUmVzaXplIn0sZmVhdHVyZVNsaWNlU2VsZWN0aW9uOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG51bWVyaWM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY29tcGFyZU1vZGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2xvZ1NjYWxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9leHBhbmRDaGFydHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hhbmRsZVJlc2l6ZSJ9LF9zaG93V2VpZ2h0ZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3Nob3dQZXJjZW50YWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jaGFydFNlbGVjdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6IlN0YW5kYXJkIn0sX2VuYWJsZUxvZ1NjYWxlOnt0eXBlOkJvb2xlYW4sCnZhbHVlOiEwfSxfY2hhcnRTZWxlY3Rpb25UeXBlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVDaGFydFNlbGVjdGlvblR5cGVzKG51bWVyaWMsIGRhdGFNb2RlbCwgZmVhdHVyZXMpIn0sX21heEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6ODAwLHJlYWRPbmx5OiEwfSxfZXhwYW5kZWRSb3dIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjMzMCxyZWFkT25seTohMH0sX3Jvd0hlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwLHJlYWRPbmx5OiEwfX0sX2hhbmRsZVJlc2l6ZSgpe2NvbnN0IGE9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImlyb24tbGlzdCIpO2EmJnRoaXMuX2V4cGFuZGVkUm93SGVpZ2h0JiZ0aGlzLl9yb3dIZWlnaHQmJnRoaXMuX21heEhlaWdodCYmdGhpcy5mZWF0dXJlcyYmKGEuc3R5bGUuaGVpZ2h0PU1hdGgubWluKCh0aGlzLmZlYXR1cmVzP3RoaXMuZmVhdHVyZXMubGVuZ3RoOjApKih0aGlzLl9leHBhbmRDaGFydHM/dGhpcy5fZXhwYW5kZWRSb3dIZWlnaHQ6CnRoaXMuX3Jvd0hlaWdodCksdGhpcy5fbWF4SGVpZ2h0KSsicHgiLGEuZmlyZSgiaXJvbi1yZXNpemUiKSl9LF9jb21wdXRlQ2hhcnRTZWxlY3Rpb25UeXBlcyhhLGMsZCl7Y29uc3QgZj1bIlN0YW5kYXJkIl07YSYmZi5wdXNoKCJRdWFudGlsZXMiKTswIT09ZC5sZW5ndGgmJk5wKHRoaXMuX2dldENoYXJ0RGF0YShjLGRbMF0pKSYmZi5wdXNoKCJWYWx1ZSBsaXN0IGxlbmd0aCIpO2MuZG9lc0NvbnRhaW5GZWF0dXJlTGlzdExlbmd0aERhdGEoKSYmZi5wdXNoKCJGZWF0dXJlIGxpc3QgbGVuZ3RoIik7cmV0dXJuIGYuY29uY2F0KGMuZ2V0RXh0cmFIaXN0b2dyYW1OYW1lcyhkKSl9LGF0dGFjaGVkKCl7c2V0VGltZW91dCgoKT0+e3RoaXMuX2hhbmRsZVJlc2l6ZSgpfSwxRTMpfSxfY2hhcnRTZWxlY3Rpb25IYXNRdWFudGlsZXMoYSl7cmV0dXJuIFlwKGEpfSxfZ2V0VGl0bGUoYSl7cmV0dXJuIGE/Ik51bWVyaWMiOiJDYXRlZ29yaWNhbCJ9LF9nZXRGZWF0dXJlTmFtZShhKXtyZXR1cm4gYS5nZXROYW1lKCl9LApfaGFzQ3VzdG9tU3RhdHMoYSl7cmV0dXJuIG51bGw9PWE/ITE6YS5kb2VzQ29udGFpbkN1c3RvbVN0YXRzKCl9LF9oYXNNdWx0aXBsZURhdGFzZXRzKGEpe3JldHVybiBudWxsPT1hPyExOjE8YS5nZXREYXRhc2V0TmFtZXMoKS5sZW5ndGh9LF9nZXRBbGxDdXN0b21TdGF0cyhhLGMpe2NvbnN0IGQ9W10sZj17fTthLmdldERhdGFzZXRGZWF0dXJlU3RhdGlzdGljcygpLmdldERhdGFzZXRzTGlzdCgpLmZvckVhY2goZz0+e2NvbnN0IGw9YS5nZXRGZWF0dXJlSW5kZXgoZy5nZXROYW1lKCksYy5nZXROYW1lKCkpO251bGwhPWwmJihnPWcuZ2V0RmVhdHVyZXNMaXN0KClbbF0uZ2V0Q3VzdG9tU3RhdHNMaXN0KCkpJiZnLmZvckVhY2goaz0+e2Zbay5nZXROYW1lKCldfHwoZltrLmdldE5hbWUoKV09ITAsZC5wdXNoKGspKX0pfSk7cmV0dXJuIGR9LF9nZXREYXRhc2V0cyhhKXtyZXR1cm4gYT9hLmdldERhdGFzZXRGZWF0dXJlU3RhdGlzdGljcygpLmdldERhdGFzZXRzTGlzdCgpOm51bGx9LApfZ2V0U3RhdHMoYSxjLGQpe3JldHVybiBhJiZjJiZkP2EuZ2V0RmVhdHVyZShkLmdldE5hbWUoKSxjLmdldE5hbWUoKSk6bnVsbH0sX2dldENoYXJ0RGF0YShhLGMpe3JldHVybiBhJiZjP2EuZ2V0RGF0YXNldEhpc3RvZ3JhbXNGb3JGZWF0dXJlKGMuZ2V0TmFtZSgpKTpbXX0sX2dldEZlYXR1cmVDb3VudFRleHQoYSxjLGQpe2E9YT9hLmdldE51bVVuaXF1ZUZlYXR1cmVzQnlUeXBlKGMpOjA7cmV0dXJuIEVwKGQubGVuZ3RoLGEpfSxfaGFzV2VpZ2h0ZWRIaXN0b2dyYW0oYSl7cmV0dXJuIDA9PT1hLmxlbmd0aD8hMTpMcCh0aGlzLl9nZXRDaGFydERhdGEodGhpcy5kYXRhTW9kZWwsYVswXSkpfSxfZ2V0Q2hhcnRDbGFzcyhhKXtsZXQgYz0iY2hhcnQtY29sdW1uICI7YXx8KGMrPSJ0YWJsZS1jZWxsICIpO3JldHVybiBjfSxfZ2V0VGFibGVXcmFwcGVyQ2xhc3MoYSl7cmV0dXJuIGEmJjAhPT1hLmxlbmd0aD8iIjoiaGlkZGVuIn0sX2dldFRhYmxlUm93Q2xhc3MoYSl7cmV0dXJuIGE/CiJudW1lcmljLXJvdyI6ImNhdGVnb3JpY2FsLXJvdyJ9fSk7Cjwvc2NyaXB0PgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi9pcm9uLXZhbGlkYXRvci1iZWhhdmlvci9pcm9uLXZhbGlkYXRvci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblZhbGlkYXRvckJlaGF2aW9yPXtyZWFkeTpmdW5jdGlvbigpe25ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJ2YWxpZGF0b3IiLGtleTp0aGlzLmlzfHx0aGlzLmNvbnN0cnVjdG9yLmlzLHZhbHVlOnRoaXN9KX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXt9fTsKPC9zY3JpcHQ+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L2ZhY2V0cy1vdmVydmlldy9jb21wb25lbnRzL2ZhY2V0cy1vdmVydmlldy9mYWNldHMtb3ZlcnZpZXctZmlsdGVyLXZhbGlkYXRvci5odG1sLmpzClBvbHltZXIoe2lzOiJmYWNldHMtb3ZlcnZpZXctZmlsdGVyLXZhbGlkYXRvciIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0b3JCZWhhdmlvcl0sdmFsaWRhdGU6ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiBuZXcgUmVnRXhwKGEpLCEwfWNhdGNoKGMpe3JldHVybiExfX19KTsKPC9zY3JpcHQ+CgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1vdmVydmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZQogICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgICAgfQogICAgICAuY29udHJvbHMgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM0LDIzNCwyMzQsMC4yKTsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMik7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4OwoKICAgICAgfQogICAgICAuZmVhdHVyZS1jaGVja2JveGVzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzNCwyMzQsMjM0LDAuMik7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMC41cHggcmdiYSgwLDAsMCwwLjIpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIHBhZGRpbmc6ICA4cHggMCA4cHggMjBweDsKICAgICAgfQogICAgICAuZmVhdHVyZS1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAxNnB4OwogICAgICB9CiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgICAgLmlucHV0LWNvbnRyb2wgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfTsKICAgICAgfQogICAgICAuZmVhdHVyZXMtdGV4dCB7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcGFkZGluZzogMXB4IDAgMCAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICAubGVmdC1kcm9wZG93biB7CiAgICAgICAgcGFkZGluZzogMCAxMHB4IDAgMDsKICAgICAgfQogICAgICAubWlkZGxlLWNoZWNrYm94IHsKICAgICAgICBtYXJnaW4tdG9wOiAzMHB4OwogICAgICAgIHBhZGRpbmc6IDAgMTBweDsKICAgICAgfQogICAgICAucmlnaHQtaW5wdXQgewogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICAgIH0KICAgICAgLmZlYXR1cmUtaXJvbi1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiA4MDBweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQogICAgICAuZmVhdHVyZS1jb2x1bW4gewogICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQogICAgICAubGVnZW5kLWNvbHVtbiB7CiAgICAgICAgd2lkdGg6IDEyMHB4OwogICAgICB9CiAgICAgIC5zdGF0cy1jb2x1bW4gewogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgICAgLmNoYXJ0LWNvbHVtbiB7CiAgICAgICAgd2lkdGg6IDU4MHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQogICAgICAudGFibGUtcm93IHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICBwYWRkaW5nOiAxMHB4IDVweCAwCiAgICAgIH0KICAgICAgLmNoYXJ0LWNvbHVtbi50YWJsZS1jZWxsIHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgcGFkZGluZzogMTBweCAwIDAgMjBweAogICAgICB9CiAgICAgIC5oZWFkZXItcm93IHsKICAgICAgICBjbGVhcjogYm90aDsKICAgICAgfQogICAgICAuaGVhZGVyLXJvdyA+IC50YWJsZS1jZWxsIHsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgcGFkZGluZzogMCA1cHggMDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7CiAgICAgIH0KICAgICAgLnN0YXRzLWhlYWRlci10ZXh0IHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQogICAgICAuY2hhcnQtaGVhZGVyLXRleHQgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQogICAgICAudGFibGUtaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHB4OwogICAgICB9CiAgICAgIC50YWJsZS1sZWZ0IHsKICAgICAgICBtYXJnaW46IDIwcHggMjBweCAwIDA7CiAgICAgIH0KICAgICAgLnRhYmxlLXJpZ2h0IHsKICAgICAgICBtYXJnaW46IDIwcHggMCAwIDA7CiAgICAgIH0KICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubGVnZW5kLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW46IDhweCAwIDAgMzhweDsKICAgICAgfQogICAgICAubGVnZW5kLWJveCB7CiAgICAgICAgd2lkdGg6IDhweDsKICAgICAgICBoZWlnaHQ6IDhweDsKICAgICAgICBtYXJnaW4tdG9wOiA2cHg7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1uYW1lIHsKICAgICAgICBtYXJnaW46IDNweCAxMHB4IDAgNXB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQogICAgICAvKiBHaXZlIG1pbiBoZWlnaHQgdG8gcGxhY2Vob2xkZXIgaW4gcGFwZXItaW5wdXQgdG8gZ2V0IGFyb3VuZCBjb2xhYiBlbWJlZGRpbmcKICAgICAgICogYWxpZ25tZW50IGlzc3VlLgogICAgICAgKi8KICAgICAgOmhvc3QgcGFwZXItaW5wdXQtY29udGFpbmVyID4gLmZsb2F0ZWQtbGFiZWwtcGxhY2Vob2xkZXIgewogICAgICAgIG1pbi1oZWlnaHQ6IDIwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFNb2RlbF1dIj4KICAgICAgPGRpdiBjbGFzcyQ9IltbX2dldENvbnRyb2xzV3JhcHBlckNsYXNzKF9kYXRhTW9kZWwpXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGNsYXNzPSJsZWZ0LWRyb3Bkb3duIGlucHV0LWNvbnRyb2wiIGxhYmVsPSJTb3J0IGJ5Ij4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zb3J0T3JkZXJ9fSIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc29ydE9wdGlvbnNdXSIgYXM9Im9wdGlvbiI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW29wdGlvbi5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPHBhcGVyLWNoZWNrYm94IG5vaW5rIGNsYXNzPSJtaWRkbGUtY2hlY2tib3giIGNoZWNrZWQ9Int7X3JldmVyc2VPcmRlcn19Ij4KICAgICAgICAgICAgUmV2ZXJzZSBvcmRlcgogICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDxwYXBlci1pbnB1dCBjbGFzcz0icmlnaHQtaW5wdXQgaW5wdXQtY29udHJvbCIgbGFiZWw9IkZlYXR1cmUgc2VhcmNoIChyZWdleCBlbmFibGVkKSIgdmFsdWU9Int7c2VhcmNoU3RyaW5nfX0iIGF1dG8tdmFsaWRhdGU9InRydWUiIHZhbGlkYXRvcj0iZmlsdGVyLXZhbGlkYXRvciI+CiAgICAgICAgICAgIDxmYWNldHMtb3ZlcnZpZXctZmlsdGVyLXZhbGlkYXRvciB2YWxpZGF0b3ItbmFtZT0iZmlsdGVyLXZhbGlkYXRvciI+CiAgICAgICAgICAgIDwvZmFjZXRzLW92ZXJ2aWV3LWZpbHRlci12YWxpZGF0b3I+CiAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtY2hlY2tib3hlcyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlcy10ZXh0Ij5GZWF0dXJlczogPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19mZWF0dXJlU3BlY0FycmF5XV0iIGFzPSJzcGVjQW5kTGlzdCI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggbm9pbmsgY2hlY2tlZD0idHJ1ZSIgY2xhc3M9ImZlYXR1cmUtY2hlY2tib3giIGlkPSJbW19nZXRTcGVjQ2hlY2tib3hJZChzcGVjQW5kTGlzdCldXSIgb24tY2hhbmdlPSJfZmVhdHVyZVNwZWNDaGVjayI+CiAgICAgICAgICAgICAgW1tfZ2V0U3BlY0NoZWNrYm94VGV4dChzcGVjQW5kTGlzdCldXQogICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVEYXRhc2V0cyhfZGF0YU1vZGVsKV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtaG9sZGVyIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2dldERhdGFzZXRzKF9kYXRhTW9kZWwpXV0iIGFzPSJkYXRhc2V0IiBpbmRleC1hcz0iZGF0YXNldEluZGV4Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWJveCIgc3R5bGU9IltbX2dldExlZ2VuZEJveFN0eWxlKF9kYXRhTW9kZWwsIGRhdGFzZXRJbmRleCldXSI+PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLW5hbWUiPltbX2dldERhdGFzZXROYW1lKF9kYXRhTW9kZWwsIGRhdGFzZXRJbmRleCldXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhvbGRlciI+CiAgICAgICAgPGZhY2V0cy1vdmVydmlldy10YWJsZSBmZWF0dXJlcz0iW1tfZ2V0TnVtZXJpY0ZlYXR1cmVMaXN0SXRlbXMoX2RhdGFNb2RlbCwgc2VhcmNoU3RyaW5nLCBfc29ydE9yZGVyLCBfcmV2ZXJzZU9yZGVyLCBfZmVhdHVyZVNwZWNDaGVja2JveGVzKV1dIiBkYXRhLW1vZGVsPSJbW19kYXRhTW9kZWxdXSIgZmVhdHVyZS1zbGljZS1zZWxlY3Rpb249Int7ZmVhdHVyZVNsaWNlU2VsZWN0aW9ufX0iIG51bWVyaWM9InRydWUiIGNsYXNzPSJ0YWJsZS1sZWZ0IiBjb21wYXJlLW1vZGU9IltbY29tcGFyZU1vZGVdXSI+CiAgICAgICAgPC9mYWNldHMtb3ZlcnZpZXctdGFibGU+CiAgICAgICAgPGZhY2V0cy1vdmVydmlldy10YWJsZSBmZWF0dXJlcz0iW1tfZ2V0Tm9uTnVtZXJpY0ZlYXR1cmVMaXN0SXRlbXMoX2RhdGFNb2RlbCwgc2VhcmNoU3RyaW5nLCBfc29ydE9yZGVyLCBfcmV2ZXJzZU9yZGVyLCBfZmVhdHVyZVNwZWNDaGVja2JveGVzKV1dIiBkYXRhLW1vZGVsPSJbW19kYXRhTW9kZWxdXSIgZmVhdHVyZS1zbGljZS1zZWxlY3Rpb249Int7ZmVhdHVyZVNsaWNlU2VsZWN0aW9ufX0iIGNsYXNzPSJ0YWJsZS1yaWdodCIgY29tcGFyZS1tb2RlPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgIDwvZmFjZXRzLW92ZXJ2aWV3LXRhYmxlPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3L2ZhY2V0cy1vdmVydmlldy5qcwpQb2x5bWVyKHtpczoiZmFjZXRzLW92ZXJ2aWV3Iixwcm9wZXJ0aWVzOntzZWFyY2hTdHJpbmc6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3NvcnRPcHRpb25zOkFycmF5LF9yZXZlcnNlT3JkZXI6Qm9vbGVhbixfc29ydE9yZGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxwcm90b0lucHV0Ont0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZSJ9LGZlYXR1cmVTbGljZVNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxjb21wYXJlTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZGF0YU1vZGVsOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfZmVhdHVyZVNwZWNBcnJheTp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEZlYXR1cmVTcGVjQXJyYXkoX2RhdGFNb2RlbCkifSxfZmVhdHVyZVNwZWNDaGVja2JveGVzOkFycmF5fSxfZ2V0RmVhdHVyZVNwZWNBcnJheShhKXtpZighYSlyZXR1cm5bXTtjb25zdCBjPVtdO2ZvcihsZXQgZD0wOzE2PmQ7ZCsrKWMucHVzaCghMCk7CnRoaXMuX2ZlYXR1cmVTcGVjQ2hlY2tib3hlcz1jO3JldHVybiBhLmdldE5vbkVtcHR5RmVhdHVyZVNwZWNMaXN0cygpfSxfZ2V0U3BlY0NoZWNrYm94VGV4dChhKXtyZXR1cm4gUHAoYS5zcGVjKSsiKCIrYS5mZWF0dXJlcy5sZW5ndGgrIikifSxfZ2V0U3BlY0NoZWNrYm94SWQoYSl7cmV0dXJuIFN0cmluZyhhLnNwZWMpfSxfZmVhdHVyZVNwZWNDaGVjayhhKXtpZihhKXtjb25zdCBjPVtdLGQ9K2EudGFyZ2V0LmlkO2ZvcihsZXQgZj0wOzE2PmY7ZisrKWQ9PT1mP2MucHVzaChhLnRhcmdldC5jaGVja2VkKTpjLnB1c2godGhpcy5fZmVhdHVyZVNwZWNDaGVja2JveGVzW2ZdKTt0aGlzLl9mZWF0dXJlU3BlY0NoZWNrYm94ZXM9Y319LF9jb252ZXJ0SW5wdXRUb1Byb3RvKGEpe2lmKCFhfHxhLmNvbnN0cnVjdG9yPT09T2JqZWN0JiYwPT09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXJldHVybiBudWxsO2lmKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBOaihhKTtpZigic3RyaW5nIj09PQp0eXBlb2YgYXx8YSBpbnN0YW5jZW9mIFN0cmluZyl7YT1hdG9iKGEpO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgpO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKWNbZF09YS5jaGFyQ29kZUF0KGQpO3JldHVybiBOaihjKX1yZXR1cm4gYS5jb25zdHJ1Y3Rvcj09PU9iamVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBwaS5mcm9tT2JqZWN0P3BpLmZyb21PYmplY3QoYSk6YX0sX3VwZGF0ZSgpe3RoaXMuZmVhdHVyZVNsaWNlU2VsZWN0aW9uPW51bGw7bGV0IGE7e2NvbnN0IGY9dGhpcy5fY29udmVydElucHV0VG9Qcm90byh0aGlzLnByb3RvSW5wdXQpO2lmKCFmKXt0aGlzLl9kYXRhTW9kZWw9bnVsbDtyZXR1cm59YT1uZXcgcHEoR3AoZikpfXRoaXMuc2V0KCJfc29ydE9wdGlvbnMiLFt7bmFtZToiRmVhdHVyZSBvcmRlciIsbWFwOnt9fSx7bmFtZToiTm9uLXVuaWZvcm1pdHkiLG1hcDp7fX0se25hbWU6IkFscGhhYmV0aWNhbCIsbWFwOnt9fSx7bmFtZToiQW1vdW50IG1pc3NpbmcvemVybyIsCm1hcDp7fX1dKTtjb25zdCBjPWEuZ2V0RGF0YXNldEZlYXR1cmVTdGF0aXN0aWNzKCkuZ2V0RGF0YXNldHNMaXN0KCksZD0xPGMubGVuZ3RoO2QmJnRoaXMucHVzaCgiX3NvcnRPcHRpb25zIix7bmFtZToiRGlzdHJpYnV0aW9uIGRpc3RhbmNlIixtYXA6e319KTthLmdldFVuaXF1ZUZlYXR1cmVzKCkuZm9yRWFjaCgoZixnKT0+e3RoaXMuX3NvcnRPcHRpb25zWzBdLm1hcFtmLmdldE5hbWUoKV09ZztnPWEuZ2V0RGF0YXNldEhpc3RvZ3JhbXNGb3JGZWF0dXJlKGYuZ2V0TmFtZSgpKTt0aGlzLl9zb3J0T3B0aW9uc1sxXS5tYXBbZi5nZXROYW1lKCldPWcucmVkdWNlKChsLGspPT57az1rLmhpc3RNYXAuU3RhbmRhcmQ/cnAoay5oaXN0TWFwLlN0YW5kYXJkLmdldEJ1Y2tldHNMaXN0KCkpOjE7cmV0dXJuIE1hdGgubWluKGwsayl9LDEpO3RoaXMuX3NvcnRPcHRpb25zWzJdLm1hcFtmLmdldE5hbWUoKV09Zi5nZXROYW1lKCk7dGhpcy5fc29ydE9wdGlvbnNbM10ubWFwW2YuZ2V0TmFtZSgpXT0KYy5yZWR1Y2UoKGwsayk9PntrPXRoaXMuX2dldFN0YXRzKGEsayxmKTtrPS0xKkFwKGspO3JldHVybiBNYXRoLm1pbihsLGspfSwwKTtkJiYodGhpcy5fc29ydE9wdGlvbnNbNF0ubWFwW2YuZ2V0TmFtZSgpXT0tMSpDcChnKSl9LHRoaXMpO3RoaXMuX2RhdGFNb2RlbD1hfSxfZ2V0U3RhdHMoYSxjLGQpe3JldHVybiBhJiZjJiZkP2EuZ2V0RmVhdHVyZShkLmdldE5hbWUoKSxjLmdldE5hbWUoKSk6bnVsbH0sX2dldFNvcnRGdW5jdGlvbihhLGMpe2NvbnN0IGQ9dGhpcy5fc29ydE9wdGlvbnNbYV0ubWFwLGY9Yz8tMToxO3JldHVybihnLGwpPT57Zz1kW2cuZ2V0TmFtZSgpXTtsPWRbbC5nZXROYW1lKCldO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZ3x8InVuZGVmaW5lZCI9PXR5cGVvZiBsPzA6ZiooZzxsPy0xOjEpfX0sX2dldEZpbHRlcihhKXtpZihhKXRyeXtjb25zdCBjPW5ldyBSZWdFeHAoYSwiaSIpO3JldHVybiBkPT5jLnRlc3QoZC5nZXROYW1lKCkpfWNhdGNoKGMpe3JldHVybiBudWxsfWVsc2UgcmV0dXJuIG51bGx9LApfZ2V0TnVtZXJpY0ZlYXR1cmVMaXN0SXRlbXMoYSxjLGQsZixnKXtyZXR1cm4gdGhpcy5fZ2V0RmVhdHVyZUxpc3RJdGVtcyhhLGMsZCxmLGcsITApfSxfZ2V0Tm9uTnVtZXJpY0ZlYXR1cmVMaXN0SXRlbXMoYSxjLGQsZixnKXtyZXR1cm4gdGhpcy5fZ2V0RmVhdHVyZUxpc3RJdGVtcyhhLGMsZCxmLGcsITEpfSxfZ2V0RmVhdHVyZUxpc3RJdGVtcyhhLGMsZCxmLGcsbCl7aWYoIWEpcmV0dXJuW107Y29uc3Qgaz10aGlzLl9nZXRGaWx0ZXIoYyk7Yz1hLmdldFVuaXF1ZUZlYXR1cmVzKCk7Yz1rP2MuZmlsdGVyKG09PmsobSkmJmdbYS5nZXRGZWF0dXJlU3BlY0ZvckZlYXR1cmUobS5nZXROYW1lKCkpXSk6Yy5maWx0ZXIobT0+Z1thLmdldEZlYXR1cmVTcGVjRm9yRmVhdHVyZShtLmdldE5hbWUoKSldKTtjPWMuZmlsdGVyKG09Pmw/RnAobSk6IUZwKG0pKTtyZXR1cm4gYy5zbGljZSgpLnNvcnQodGhpcy5fZ2V0U29ydEZ1bmN0aW9uKGQsZikpfSxfZ2V0Q29udHJvbHNXcmFwcGVyQ2xhc3MoYSl7cmV0dXJuIWF8fAoxPj1hLmdldFVuaXF1ZUZlYXR1cmVzKCkubGVuZ3RoPyJoaWRkZW4iOiIifSxfZ2V0RGF0YXNldE5hbWUoYSxjKXtyZXR1cm4gYS5nZXREYXRhc2V0TmFtZXMoKVtjXX0sX2dldExlZ2VuZEJveFN0eWxlKGEsYyl7cmV0dXJuImJhY2tncm91bmQtY29sb3I6IithLmdldENoYXJ0Q29sb3JTdHJpbmcoYyl9LF9nZXREYXRhc2V0cyhhKXtyZXR1cm4gYT9hLmdldERhdGFzZXRGZWF0dXJlU3RhdGlzdGljcygpLmdldERhdGFzZXRzTGlzdCgpOm51bGx9LF9oYXNNdWx0aXBsZURhdGFzZXRzKGEpe3JldHVybiBudWxsPT1hPyExOjE8YS5nZXREYXRhc2V0TmFtZXMoKS5sZW5ndGh9LGdldFN0YXRzUHJvdG8oYSl7cmV0dXJuIHluKGEpfX0pOwo8L3NjcmlwdD4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZ6LWV4YW1wbGUtdmlld2VyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaWQ9ImxpbnRlci1wYXBlci1idXR0b24tc3R5bGUiPgogICAgICAvKioKICAgICAgICogVGhpcyBzdHlsZSBwcmVzZXJ2ZXMgdGhlIHN0eWxpbmcgcHJldmlvdXMgdG8KICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9wYXBlci1idXR0b24vcHVsbC8xMTUKICAgICAgICogVGhpcyBjaGFuZ2UgY2FuIGJyZWFrIHRoZSBsYXlvdXQgb2YgcGFwZXItYnV0dG9uIGNvbnRlbnQuCiAgICAgICAqIFJlbW92ZSB0aGlzIHN0eWxlIHRvIGFwcGx5IHRoZSBjaGFuZ2UsIG1vcmUgZGV0YWlscyBhdCBiLzcwNTI4MzU2LgogICAgICAgKi8KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5zZXEtZmVhdCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC52YWx1ZS1saXN0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnNsaWRlci1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbGFiZWwgewogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICB9CgogICAgICAjc2FsaWVuY3lMZWdlbmQgewogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICBoZWlnaHQ6IDUwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgICAgfQoKICAgICAgLnNhbGllbmN5LWNvbnRyb2xzLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgICAgfQoKICAgICAgLmhpZGUtc2FsaWVuY3ktY29udHJvbHMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zYWxpZW5jeS1sZWdlbmQtbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgfQoKICAgICAgLm91dGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgLmltYWdlIHsKICAgICAgICAvKiA8aW1nPiBlbGVtZW50cyBhcmUgdXNlZCB0byBsb2FkIHRvIGEgY2FudmFzIHNvIHRoZXkgYXJlbid0IGRpc3BsYXllZC4gKi8KICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAuZmxleC1jb250cm9scyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC52YWx1ZS1waWxscy1ob2xkZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LWJhc2lzOiAxMDAlOwogICAgICB9CgogICAgICBpcm9uLWF1dG9ncm93LXRleHRhcmVhIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmZmZmZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE6IHsKICAgICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS52YWx1ZS1zYW1lIHsKICAgICAgICAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE6IHsKICAgICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS52YWx1ZS1kaWZmZXJlbnQgewogICAgICAgIC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYTogewogICAgICAgICAgY29sb3I6ICMzNGE4NTM7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLnZhbHVlLXBpbGwgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgbWFyZ2luOiA0cHg7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgfQoKICAgICAgLnZhbHVlLXBpbGw6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNmOGY5ZmE7CiAgICAgIH0KCiAgICAgIC52YWx1ZS1waWxsW2ZvY3VzZWRdIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmZlYjNiOwogICAgICAgIGJhY2tncm91bmQ6ICNmOGY5ZmE7CiAgICAgIH0KCiAgICAgIC52YWx1ZS1jb21wYXJlIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICAgIH0KCiAgICAgIC52YWx1ZS1waWxsLXN0YWNrZWQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogNHB4IDRweCA0cHggMDsKICAgICAgICBwYWRkaW5nOiAycHg7CiAgICAgIH0KCiAgICAgIC52YWx1ZS1waWxsLWdyaWQgewogICAgICAgIHdpZHRoOiAxMjBweDsKICAgICAgICBtYXJnaW46IDRweCA4cHggNHB4IDA7CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLW5hbWUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA0cHg7CiAgICAgICAgbWFyZ2luOiA0cHggMjBweCA0cHggOHB4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBjb2xvcjogIzgwODY4YjsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtbmFtZS10ZXh0IHsKICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzMDBweDsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNmVtOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogOHB4OwogICAgICB9CgogICAgICAuZmVhdHVyZS1uYW1lLWhlYWRlci10ZXh0IHsKICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzMDBweDsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIGNvbG9yOiAjMjAyMTI0OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBsaW5lLWhlaWdodDogMS44ZW07CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtbmFtZS5mZWF0dXJlLW5hbWUtaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiA0cHggNHB4IDBweCA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgICAgICBtYXJnaW46IDBweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U4ZWFlZDsKICAgICAgfQoKICAgICAgLnNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItaW5wdXQ6IHsKICAgICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5oaWRlLWNvbnRyb2xzIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAuaW5kZW50IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgfQoKICAgICAgLnNjYWxlLWxhYmVsIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgfQoKICAgICAgLndpbmRvd2luZy1sYWJlbCB7CiAgICAgICAgd2lkdGg6IDExMHB4OwogICAgICB9CgogICAgICAuY29udHJvbC10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuZXhwYW5kLWJ1dHRvbi1ob2xkZXIgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KCiAgICAgIC5kZWxldGUtdmFsdWUtYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZTYwMzsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgIG1heC13aWR0aDogMjRweDsKICAgICAgICBtYXgtaGVpZ2h0OiAyNHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zOwogICAgICB9CgogICAgICAuZGVsZXRlLXZhbHVlLWJ1dHRvbi5kZWxldGUtdmFsdWUtYnV0dG9uLWhpZGRlbiB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcywgdmlzaWJpbGl0eSAyMDBtczsKICAgICAgfQoKICAgICAgLmRlbGV0ZS1mZWF0dXJlLWJ1dHRvbiB7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW4tbGVmdDogNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDBweDsKICAgICAgfQoKICAgICAgLmFkZC12YWx1ZS1idXR0b24gewogICAgICAgIG1hcmdpbi10b3A6IDJweDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBtaW4taGVpZ2h0OiAyMHB4OwogICAgICAgIG1pbi13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGNvbG9yOiAjODA4NjhiOwogICAgICB9CgogICAgICAuYWRkLWZlYXR1cmUtYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CgogICAgICAudXBsb2FkLWltYWdlLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiAwIDAgMCA1cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuaW1hZ2VjYXJkIHsKICAgICAgICBtYXJnaW46IDRweDsKICAgICAgfQoKICAgICAgLmltYWdlLXNjYWxlLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAuc2FsaWVuY3ktbGVnZW5kLWxhYmVsIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLWRpYWxvZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAuZmVhdHVyZS1kaWFsb2ctYnV0dG9uIHsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaW1hZ2UtYm90dG9tLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogIzNjNDA0MzsKICAgICAgfQoKICAgICAgLmltYWdlLXVwbG9hZC1pbnB1dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLnNwYWNlLWZvci1tb3JlLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC52YWx1ZS1oZWFkZXItdGV4dCB7CiAgICAgICAgbWluLXdpZHRoOiAxMzBweDsKICAgICAgICB3aWR0aDogMTMwcHg7CiAgICAgICAgY29sb3I6ICMyMDIxMjQ7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjhlbTsKICAgICAgfQoKICAgICAgcGFwZXItZGlhbG9nIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICB9CgogICAgICAuY29udHJvbC1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkYWRjZTA7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLW9yYW5nZS1kYXJrKTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgY29sb3I6ICNkYWRjZTA7CiAgICAgIH0KCiAgICAgIC52YWx1ZS10ZXh0IHsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgI2ZmZWIzYjsKICAgICAgfQoKICAgICAgLmNvbXBhcmUtdmFsdWUtdGV4dCB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzNGE4NTM7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJvdXRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93U2VhcmNoQm94XV0iPgogICAgICAgIDxwYXBlci1pbnB1dCB2YWx1ZT0ie3tmZWF0dXJlU2VhcmNoVmFsdWV9fSIgbGFiZWw9IlNlYXJjaCIgY2xhc3M9ImZpbHRlci1pbnB1dCIgbm8tbGFiZWwtZmxvYXQ+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOnNlYXJjaCIgcHJlZml4PjwvaXJvbi1pY29uPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtbmFtZSBmZWF0dXJlLW5hbWUtaGVhZGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLW5hbWUtaGVhZGVyLXRleHQiPkZlYXR1cmU8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ2YWx1ZS1waWxscy1ob2xkZXIgZmxleC1jb250cm9scyB2YWx1ZS1oZWFkZXItdGV4dCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ2YWx1ZS10ZXh0Ij5WYWx1ZShzKTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb21wYXJlTW9kZV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciBmbGV4LWNvbnRyb2xzIHZhbHVlLWhlYWRlci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29tcGFyZS12YWx1ZS10ZXh0Ij5bW2NvbXBhcmVUaXRsZV1dPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNwYWNlLWZvci1tb3JlLWJ1dHRvbiI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2ZpbHRlcmVkRmVhdHVyZXNMaXN0XV0iIGFzPSJmZWF0Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXNJbWFnZShmZWF0Lm5hbWUpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idmFsdWUtcGlsbHMtaG9sZGVyIj4KICAgICAgICAgICAgICA8cGFwZXItY2FyZCBpZD0iW1tnZXRJbWFnZUNhcmRJZChmZWF0Lm5hbWUpXV0iIGNsYXNzPSJpbWFnZWNhcmQiPgogICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iaW1hZ2UiIHNyYyQ9IltbZ2V0SW1hZ2VTcmMoZmVhdC5uYW1lKV1dIiBpZD0iW1tnZXRJbWFnZUlkKGZlYXQubmFtZSldXSI+CiAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJbW2dldENhbnZhc0lkKGZlYXQubmFtZSldXSIgZGF0YS1mZWF0dXJlPSJbW2ZlYXQubmFtZV1dIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93SW1hZ2VDb250cm9scyhoYXNJbWFnZSwgYWxsb3dJbWFnZUNvbnRyb2xzKV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdj5JbWFnZSB3aW5kb3dpbmcgKGNvbnRyYXN0KTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItaG9sZGVyIGluZGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWxhYmVsIHdpbmRvd2luZy1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICBXaW5kb3cgY2VudGVyOgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3M9InNsaWRlciIgZWRpdGFibGU9InRydWUiIG1heD0iMjU1IiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93Q2VudGVyfX0iIHZhbHVlPSJbW3dpbmRvd0NlbnRlcl1dIj4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1ob2xkZXIgaW5kZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbGFiZWwgd2luZG93aW5nLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3aWR0aDoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGNsYXNzPSJzbGlkZXIiIGVkaXRhYmxlPSJ0cnVlIiBtYXg9IjUxMiIgbWluPSIxIiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93V2lkdGh9fSIgdmFsdWU9Iltbd2luZG93V2lkdGhdXSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY2FsZS1sYWJlbCI+SW1hZ2Ugc2NhbGUgcGVyY2VudGFnZTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgdHlwZT0ibnVtYmVyIiBtaW49IjEwIiBtYXg9IjUwMCIgdmFsdWU9Int7aW1hZ2VTY2FsZVBlcmNlbnRhZ2V9fSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpbWFnZS1zY2FsZS1idXR0b24iIG9uLWNsaWNrPSJ1cGRhdGVJbWFnZXMiPgogICAgICAgICAgICAgICAgICAgICAgc2V0CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWJvdHRvbS1iYXIiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3MkPSJbW2dldFVwbG9hZEltYWdlQ2xhc3MocmVhZG9ubHkpXV0iIGljb249ImZpbGUtdXBsb2FkIiBvbi1jbGljaz0idXBsb2FkSW1hZ2VDbGlja2VkIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIHRpdGxlPSJVcGxvYWQgaW1hZ2UiPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImltYWdlLXVwbG9hZC1pbnB1dCIgdHlwZT0iZmlsZSIgb24tY2hhbmdlPSJoYW5kbGVJbWFnZVVwbG9hZCIgZGF0YS1mZWF0dXJlPSJbW2ZlYXQubmFtZV1dIiBkYXRhLWluZGV4PSJbW2luZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItY2FyZCBpZD0iW1tnZXRDb21wYXJlSW1hZ2VDYXJkSWQoZmVhdC5uYW1lKV1dIiBjbGFzcz0iaW1hZ2VjYXJkIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iaW1hZ2UiIHNyYyQ9IltbZ2V0Q29tcGFyZUltYWdlU3JjKGZlYXQubmFtZSldXSIgaWQ9IltbZ2V0Q29tcGFyZUltYWdlSWQoZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgICAgPGNhbnZhcyBpZD0iW1tnZXRDb21wYXJlQ2FudmFzSWQoZmVhdC5uYW1lKV1dIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWFnZS1ib3R0b20tYmFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Im1vcmUtaG9yaXoiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIiBvbi1jbGljaz0iZmVhdHVyZU1vcmVDbGlja2VkIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgaWQ9IltbZ2V0RmVhdHVyZURpYWxvZ0lkKGZlYXQubmFtZSldXSIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtZGlhbG9nIj4KICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24gZGF0YS1mZWF0dXJlPSJbW2ZlYXQubmFtZV1dIiBvbi1jbGljaz0iZGVsZXRlRmVhdHVyZSIgY2xhc3M9ImZlYXR1cmUtZGlhbG9nLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIERlbGV0ZSBmZWF0dXJlCiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaXNJbWFnZShmZWF0Lm5hbWUpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1jb250cm9scyB2YWx1ZS1waWxscy1ob2xkZXIiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0V4cGFuZGVkKGZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRGZWF0dXJlVmFsdWVzKGZlYXQubmFtZSldXSIgYXM9InZhbHVlIj4KICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKGZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBvbi1pbnB1dD0ib25WYWx1ZUNoYW5nZWQiIG9uLWZvY3VzPSJvbklucHV0Rm9jdXMiIG9uLWJsdXI9Im9uSW5wdXRCbHVyIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIGRhdGEtaW5kZXg9IltbaW5kZXhdXSIgdmFsdWU9IltbdmFsdWVdXSI+CiAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzRXhwYW5kZWQoZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICA8aXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSBjbGFzcyQ9IltbZ2V0SW5wdXRQaWxsQ2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSldXSIgcmVhZG9ubHkkPSJbW3JlYWRvbmx5XV0iIG9uLWlucHV0PSJvblZhbHVlQ2hhbmdlZCIgb24tZm9jdXM9Im9uSW5wdXRGb2N1cyIgb24tYmx1cj0ib25JbnB1dEJsdXIiIGRhdGEtZmVhdHVyZT0iW1tmZWF0Lm5hbWVdXSIgZGF0YS1pbmRleD0iW1t6ZXJvSW5kZXhdXSIgdmFsdWU9IltbZ2V0Rmlyc3RGZWF0dXJlVmFsdWUoZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tmZWF0dXJlSGFzTXVsdGlwbGVWYWx1ZXMoZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJleHBhbmRGZWF0dXJlIiBjbGFzcyQ9IltbZ2V0SW5wdXRQaWxsQ2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSldXSI+CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY29udHJvbHMgdmFsdWUtcGlsbHMtaG9sZGVyIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0V4cGFuZGVkKGZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldENvbXBhcmVGZWF0dXJlVmFsdWVzKGZlYXQubmFtZSldXSIgYXM9InZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSBjbGFzcyQ9IltbZ2V0Q29tcGFyZUlucHV0Q2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSwgaW5kZXgpXV0iIHJlYWRvbmx5IHZhbHVlPSJbW3ZhbHVlXV0iPgogICAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzRXhwYW5kZWQoZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICAgIDxpcm9uLWF1dG9ncm93LXRleHRhcmVhIGNsYXNzJD0iW1tnZXRDb21wYXJlSW5wdXRDbGFzcyhmZWF0Lm5hbWUsIGRpc3BsYXlNb2RlLCB6ZXJvSW5kZXgpXV0iIHJlYWRvbmx5IHZhbHVlPSJbW2dldEZpcnN0Q29tcGFyZUZlYXR1cmVWYWx1ZShmZWF0Lm5hbWUpXV0iPgogICAgICAgICAgICAgICAgICA8L2lyb24tYXV0b2dyb3ctdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb21wYXJlRmVhdHVyZUhhc011bHRpcGxlVmFsdWVzKGZlYXQubmFtZSldXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJleHBhbmRGZWF0dXJlIiBjbGFzcyQ9IltbZ2V0Q29tcGFyZUlucHV0Q2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ibW9yZS1ob3JpeiIgY2xhc3MkPSJbW2dldEFkZFZhbHVlQnV0dG9uQ2xhc3MocmVhZG9ubHkpXV0iIG9uLWNsaWNrPSJmZWF0dXJlTW9yZUNsaWNrZWQiIGRhdGEtZmVhdHVyZT0iW1tmZWF0Lm5hbWVdXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iW1tnZXRGZWF0dXJlRGlhbG9nSWQoZmVhdC5uYW1lKV1dIiBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1kaWFsb2ciPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJkZWxldGVGZWF0dXJlIiBjbGFzcz0iZmVhdHVyZS1kaWFsb2ctYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgRGVsZXRlIGZlYXR1cmUKICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJhZGRWYWx1ZSIgY2xhc3M9ImZlYXR1cmUtZGlhbG9nLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIEFkZCBmZWF0dXJlIHZhbHVlCiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXNTZXFFeGFtcGxlKG1heFNlcU51bWJlcildXSI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbGFiZWwiPlNlcXVlbmNlIE51bWJlcjo8L2Rpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3M9InNsaWRlciIgZWRpdGFibGU9InRydWUiIG1heD0iW1ttYXhTZXFOdW1iZXJdXSIgdmFsdWU9Int7c2VxTnVtYmVyfX0iPgogICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tmaWx0ZXJlZFNlcUZlYXR1cmVzTGlzdF1dIiBhcz0ic2VxZmVhdCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZXFmZWF0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzSW1hZ2Uoc2VxZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLW5hbWUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbc2VxZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1jYXJkIGlkPSJbW2dldEltYWdlQ2FyZElkKHNlcWZlYXQubmFtZSldXSIgY2xhc3M9ImltYWdlY2FyZCI+CiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iaW1hZ2UiIHNyYyQ9IltbZ2V0U2VxSW1hZ2VTcmMoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iIGlkPSJbW2dldEltYWdlSWQoc2VxZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJbW2dldENhbnZhc0lkKHNlcWZlYXQubmFtZSldXSIgZGF0YS1mZWF0dXJlPSJbW3NlcWZlYXQubmFtZV1dIiBkYXRhLXNlcS1udW09Iltbc2VxTnVtYmVyXV0iPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93SW1hZ2VDb250cm9scyhoYXNJbWFnZSwgYWxsb3dJbWFnZUNvbnRyb2xzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5JbWFnZSB3aW5kb3dpbmcgKGNvbnRyYXN0KTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItaG9sZGVyIGluZGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWxhYmVsIHdpbmRvd2luZy1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3cgY2VudGVyOgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3M9InNsaWRlciIgZWRpdGFibGU9InRydWUiIG1heD0iMjU1IiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93Q2VudGVyfX0iIHZhbHVlPSJbW3dpbmRvd0NlbnRlcl1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1ob2xkZXIgaW5kZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbGFiZWwgd2luZG93aW5nLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3aWR0aDoKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGNsYXNzPSJzbGlkZXIiIGVkaXRhYmxlPSJ0cnVlIiBtYXg9IjUxMiIgbWluPSIxIiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93V2lkdGh9fSIgdmFsdWU9Iltbd2luZG93V2lkdGhdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY2FsZS1sYWJlbCI+SW1hZ2Ugc2NhbGUgcGVyY2VudGFnZTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgdHlwZT0ibnVtYmVyIiBtaW49IjEwIiBtYXg9IjUwMCIgdmFsdWU9Int7aW1hZ2VTY2FsZVBlcmNlbnRhZ2V9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpbWFnZS1zY2FsZS1idXR0b24iIG9uLWNsaWNrPSJ1cGRhdGVJbWFnZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWFnZS1ib3R0b20tYmFyIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcyQ9IltbZ2V0VXBsb2FkSW1hZ2VDbGFzcyhyZWFkb25seSldXSIgaWNvbj0iZmlsZS11cGxvYWQiIG9uLWNsaWNrPSJ1cGxvYWRJbWFnZUNsaWNrZWQiIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgdGl0bGU9IlVwbG9hZCBpbWFnZSI+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbWFnZS11cGxvYWQtaW5wdXQiIHR5cGU9ImZpbGUiIG9uLWNoYW5nZT0iaGFuZGxlSW1hZ2VVcGxvYWQiIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgZGF0YS1pbmRleD0iW1tpbmRleF1dIiBkYXRhLXNlcS1udW09Iltbc2VxTnVtYmVyXV0iPgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY29tcGFyZU1vZGVdXSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNhcmQgaWQ9IltbZ2V0Q29tcGFyZUltYWdlQ2FyZElkKHNlcWZlYXQubmFtZSldXSIgY2xhc3M9ImltYWdlY2FyZCI+CiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPSJpbWFnZSIgc3JjJD0iW1tnZXRDb21wYXJlU2VxSW1hZ2VTcmMoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iIGlkPSJbW2dldENvbXBhcmVJbWFnZUlkKHNlcWZlYXQubmFtZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJbW2dldENvbXBhcmVDYW52YXNJZChzZXFmZWF0Lm5hbWUpXV0iIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgZGF0YS1zZXEtbnVtPSJbW3NlcU51bWJlcl1dIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWJvdHRvbS1iYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Im1vcmUtaG9yaXoiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJkZWxldGVGZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICBEZWxldGUgZmVhdHVyZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzSW1hZ2Uoc2VxZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLW5hbWUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbc2VxZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY29udHJvbHMgdmFsdWUtcGlsbHMtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzRXhwYW5kZWQoc2VxZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRTZXFGZWF0dXJlVmFsdWVzKHNlcWZlYXQubmFtZSwgc2VxTnVtYmVyKV1dIiBhcz0ic2VxdmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBvbi1pbnB1dD0ib25WYWx1ZUNoYW5nZWQiIG9uLWZvY3VzPSJvbklucHV0Rm9jdXMiIG9uLWJsdXI9Im9uSW5wdXRCbHVyIiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIGRhdGEtaW5kZXg9IltbaW5kZXhdXSIgZGF0YS1zZXEtbnVtPSJbW3NlcU51bWJlcl1dIiB2YWx1ZT0iW1tzZXF2YWx1ZV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzRXhwYW5kZWQoc2VxZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBvbi1pbnB1dD0ib25WYWx1ZUNoYW5nZWQiIG9uLWZvY3VzPSJvbklucHV0Rm9jdXMiIG9uLWJsdXI9Im9uSW5wdXRCbHVyIiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIGRhdGEtaW5kZXg9IltbemVyb0luZGV4XV0iIGRhdGEtc2VxLW51bT0iW1tzZXFOdW1iZXJdXSIgdmFsdWU9IltbZ2V0Rmlyc3RTZXFGZWF0dXJlVmFsdWUoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2VxRmVhdHVyZUhhc011bHRpcGxlVmFsdWVzKHNlcWZlYXQubmFtZSwgc2VxTnVtYmVyKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24gZGF0YS1mZWF0dXJlPSJbW3NlcWZlYXQubmFtZV1dIiBvbi1jbGljaz0iZXhwYW5kRmVhdHVyZSIgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb21wYXJlTW9kZV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1jb250cm9scyB2YWx1ZS1waWxscy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0V4cGFuZGVkKHNlcWZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRDb21wYXJlU2VxRmVhdHVyZVZhbHVlcyhzZXFmZWF0Lm5hbWUsIHNlcU51bWJlcildXSIgYXM9InNlcXZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldFNlcUNvbXBhcmVJbnB1dENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUsIHNlcU51bWJlciwgaW5kZXgpXV0iIHJlYWRvbmx5IHZhbHVlPSJbW3NlcXZhbHVlXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2lyb24tYXV0b2dyb3ctdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFpc0V4cGFuZGVkKHNlcWZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldFNlcUNvbXBhcmVJbnB1dENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUsIHNlcU51bWJlciwgemVyb0luZGV4KV1dIiByZWFkb25seSB2YWx1ZT0iW1tnZXRGaXJzdENvbXBhcmVTZXFGZWF0dXJlVmFsdWUoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWF1dG9ncm93LXRleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVTZXFGZWF0dXJlSGFzTXVsdGlwbGVWYWx1ZXMoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgb24tY2xpY2s9ImV4cGFuZEZlYXR1cmUiIGNsYXNzJD0iW1tnZXRTZXFDb21wYXJlSW5wdXRDbGFzcyhzZXFmZWF0Lm5hbWUsIGRpc3BsYXlNb2RlLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Im1vcmUtaG9yaXoiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJkZWxldGVGZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICBEZWxldGUgZmVhdHVyZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIGRhdGEtc2VxLW51bT0iW1tzZXFOdW1iZXJdXSIgb24tY2xpY2s9ImFkZFZhbHVlIiBjbGFzcz0iZmVhdHVyZS1kaWFsb2ctYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgICBBZGQgZmVhdHVyZSB2YWx1ZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIG9uLWNsaWNrPSJvcGVuQWRkRmVhdHVyZURpYWxvZyIgaWNvbj0iYWRkIiB0aXRsZT0iQWRkIGZlYXR1cmUiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIj4KICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0U2FsaWVuY3lDb250cm9sc0hvbGRlckNsYXNzKHNhbGllbmN5KV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzYWxpZW5jeS1sZWdlbmQtbGFiZWwiPkF0dHJpYnV0aW9uIGxlZ2VuZDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY29udHJvbHMiPgogICAgICAgICAgPHN2ZyBpZD0ic2FsaWVuY3lMZWdlbmQiPjwvc3ZnPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHBhcGVyLWljb24tYnV0dG9uIGlkPSJkZWxldGV2YWx1ZSIgaWNvbj0iZGVsZXRlIiBjbGFzcyQ9IltbZ2V0RGVsZXRlVmFsdWVCdXR0b25DbGFzcyhyZWFkb25seSwgc2hvd0RlbGV0ZVZhbHVlQnV0dG9uKV1dIiBkYXRhLWZlYXR1cmU9IltbZm9jdXNlZEZlYXR1cmVOYW1lXV0iIGRhdGEtaW5kZXg9IltbZm9jdXNlZEZlYXR1cmVWYWx1ZUluZGV4XV0iIGRhdGEtc2VxLW51bT0iW1tmb2N1c2VkU2VxTnVtYmVyXV0iIG9uLWNsaWNrPSJkZWxldGVWYWx1ZSIgdGl0bGU9IkRlbGV0ZSB2YWx1ZSI+CiAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iYWRkRmVhdHVyZURpYWxvZyI+CiAgICAgIDxoMj5BZGQgRmVhdHVyZTwvaDI+CiAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iRmVhdHVyZSBuYW1lIiB2YWx1ZT0ie3tuZXdGZWF0dXJlTmFtZX19Ij48L3BhcGVyLWlucHV0PgogICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7bmV3RmVhdHVyZVR5cGV9fSI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJpbnQiPkludDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZmxvYXQiPkZsb2F0PC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJieXRlcyI+Qnl0ZXM8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctZGlzbWlzcyBjbGFzcz0iY29udHJvbC1idXR0b24iIG9uLWNsaWNrPSJhZGRGZWF0dXJlIiBkaXNhYmxlZD0iW1shc2hvdWxkRW5hYmxlQWRkRmVhdHVyZShuZXdGZWF0dXJlTmFtZSldXSI+CiAgICAgICAgQ3JlYXRlCiAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgPC9wYXBlci1kaWFsb2c+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdnotZXhhbXBsZS12aWV3ZXIvdnotZXhhbXBsZS12aWV3ZXIuanMKdmFyIHFxOwooZnVuY3Rpb24oKXtjb25zdCBhPWQzLmludGVycG9sYXRlUmdiLGM9L15pbWFnZVwvKFteXC9dK1wvKSplbmNvZGVkJC8sZD1bMSwyMF07UG9seW1lcih7aXM6InZ6LWV4YW1wbGUtdmlld2VyIixwcm9wZXJ0aWVzOntleGFtcGxlOnt0eXBlOk9iamVjdH0sc2VyaWFsaXplZEV4YW1wbGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJ1cGRhdGVFeGFtcGxlIn0sc2VyaWFsaXplZFNlcUV4YW1wbGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJ1cGRhdGVTZXFFeGFtcGxlIn0sanNvbjp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6ImNyZWF0ZUV4YW1wbGVzRnJvbUpzb24ifSxzYWxpZW5jeTp7dHlwZTpPYmplY3QsdmFsdWU6e319LHNhbGllbmN5SnNvblN0cmluZzp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6ImhhdmVTYWxpZW5jeUpzb24ifSxyZWFkb25seTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzZXFOdW1iZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjAsb2JzZXJ2ZXI6Im5ld1NlcU51bSJ9LGlzU2VxdWVuY2U6Qm9vbGVhbiwKY2hhbmdlQ2FsbGJhY2tUaW1lcjpOdW1iZXIsaWdub3JlQ2hhbmdlOkJvb2xlYW4sbWluU2FsOnt0eXBlOk51bWJlcix2YWx1ZTowfSxtYXhTYWw6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNob3dTYWxpZW5jeTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxpbWFnZUluZm86e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSx3aW5kb3dXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MjU2fSx3aW5kb3dDZW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjEyOH0sc2FsaWVuY3lDdXRvZmY6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhhc0ltYWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LGFsbG93SW1hZ2VDb250cm9sczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbWFnZVNjYWxlUGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwfSxmZWF0dXJlczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6ImdldEZlYXR1cmVzKGV4YW1wbGUpIn0sZmVhdHVyZXNMaXN0Ont0eXBlOk9iamVjdCxjb21wdXRlZDoiZ2V0RmVhdHVyZXNMaXN0KGZlYXR1cmVzLCBjb21wYXJlRmVhdHVyZXMpIn0sCnNlcUZlYXR1cmVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiZ2V0U2VxRmVhdHVyZXMoZXhhbXBsZSkifSxzZXFGZWF0dXJlc0xpc3Q6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJnZXRGZWF0dXJlc0xpc3Qoc2VxRmVhdHVyZXMsIGNvbXBhcmVTZXFGZWF0dXJlcykifSxtYXhTZXFOdW1iZXI6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJnZXRNYXhTZXFOdW1iZXIoc2VxRmVhdHVyZXNMaXN0KSJ9LGNvbG9yczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6ImdldENvbG9ycyhzYWxpZW5jeSkiLG9ic2VydmVyOiJjcmVhdGVMZWdlbmQifSxkaXNwbGF5TW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImdyaWQifSxmZWF0dXJlU2VhcmNoVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sZmlsdGVyZWRGZWF0dXJlc0xpc3Q6e3R5cGU6T2JqZWN0fSxmaWx0ZXJlZFNlcUZlYXR1cmVzTGlzdDp7dHlwZTpPYmplY3R9LGZvY3VzZWRGZWF0dXJlTmFtZTpTdHJpbmcsZm9jdXNlZEZlYXR1cmVWYWx1ZUluZGV4Ok51bWJlciwKZm9jdXNlZFNlcU51bWJlcjpOdW1iZXIsc2hvd0RlbGV0ZVZhbHVlQnV0dG9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGV4cGFuZGVkRmVhdHVyZXM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxleHBhbmRBbGxGZWF0dXJlczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx6ZXJvSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGNvbXBhcmVKc29uOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiY3JlYXRlQ29tcGFyZUV4YW1wbGVzRnJvbUpzb24ifSxjb21wYXJlRXhhbXBsZTp7dHlwZTpPYmplY3R9LGNvbXBhcmVGZWF0dXJlczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6ImdldEZlYXR1cmVzKGNvbXBhcmVFeGFtcGxlKSIsb2JzZXJ2ZXI6InVwZGF0ZUNvbXBhcmVNb2RlIn0sY29tcGFyZVNlcUZlYXR1cmVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiZ2V0U2VxRmVhdHVyZXMoY29tcGFyZUV4YW1wbGUpIixvYnNlcnZlcjoidXBkYXRlQ29tcGFyZU1vZGUifSxjb21wYXJlTW9kZTpCb29sZWFuLApjb21wYXJlSW1hZ2VJbmZvOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sY29tcGFyZVRpdGxlOlN0cmluZ30sb2JzZXJ2ZXJzOlsiaGF2ZVNhbGllbmN5KGZpbHRlcmVkRmVhdHVyZXNMaXN0LCBzYWxpZW5jeSwgY29sb3JzLCBzaG93U2FsaWVuY3ksIHNhbGllbmN5Q3V0b2ZmKSIsInNlcVNhbGllbmN5KHNlcU51bWJlciwgc2VxRmVhdHVyZXNMaXN0LCBzYWxpZW5jeSwgY29sb3JzLCBzaG93U2FsaWVuY3ksIHNhbGllbmN5Q3V0b2ZmKSIsInNldEZpbHRlcmVkRmVhdHVyZXNMaXN0KGZlYXR1cmVzTGlzdCwgZmVhdHVyZVNlYXJjaFZhbHVlLCBzYWxpZW5jeSkiLCJzZXRGaWx0ZXJlZFNlcUZlYXR1cmVzTGlzdChzZXFGZWF0dXJlc0xpc3QsIGZlYXR1cmVTZWFyY2hWYWx1ZSwgc2FsaWVuY3kpIl0saXNFeHBhbmRlZDpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5leHBhbmRBbGxGZWF0dXJlc3x8dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZilpbiB0aGlzLmV4cGFuZGVkRmVhdHVyZXN9LHVwZGF0ZUV4YW1wbGU6ZnVuY3Rpb24oKXt0aGlzLmRlc2VyaWFsaXplRXhhbXBsZSh0aGlzLnNlcmlhbGl6ZWRFeGFtcGxlLAppaSl9LHVwZGF0ZVNlcUV4YW1wbGU6ZnVuY3Rpb24oKXt0aGlzLmRlc2VyaWFsaXplRXhhbXBsZSh0aGlzLnNlcmlhbGl6ZWRTZXFFeGFtcGxlLG1pKX0sc3RyaW5nVG9VaW50OEFycmF5OmZ1bmN0aW9uKGYpe3JldHVybihuZXcgd2luZG93LlRleHRFbmNvZGVyKS5lbmNvZGUoZil9LGRlc2VyaWFsaXplRXhhbXBsZTpmdW5jdGlvbihmLGcpe3RoaXMuaWdub3JlQ2hhbmdlfHwoZj10aGlzLmRlY29kZWRTdHJpbmdUb0NoYXJDb2RlcyhhdG9iKGYpKSx0aGlzLmV4YW1wbGU9ZyhmKSl9LGdldEZlYXR1cmVzOmZ1bmN0aW9uKGYpe3RoaXMuaW1hZ2VJbmZvPXt9O3RoaXMuaGFzSW1hZ2U9ITE7aWYobnVsbD09ZilyZXR1cm4gbmV3IE1hcChbXSk7aWYoZiBpbnN0YW5jZW9mIGZpKXJldHVybiB0aGlzLmlzU2VxdWVuY2U9ITEsZi5oYXNGZWF0dXJlcygpfHxmLnNldEZlYXR1cmVzKG5ldyBZZyksZi5nZXRGZWF0dXJlcygpLmdldEZlYXR1cmVNYXAoKTt0aGlzLmlzU2VxdWVuY2U9ITA7Zi5oYXNDb250ZXh0KCl8fApmLnNldENvbnRleHQobmV3IFlnKTtyZXR1cm4gZi5nZXRDb250ZXh0KCkuZ2V0RmVhdHVyZU1hcCgpfSxnZXRGZWF0dXJlc0xpc3Q6ZnVuY3Rpb24oZixnKXtpZihudWxsPT1mKXJldHVybltdO2NvbnN0IGw9W10saz17fTtsZXQgbT1mLmtleXMoKTtpZihtKXtsZXQgcD1tLm5leHQoKTtmb3IoOyFwLmRvbmU7KWwucHVzaCh7bmFtZTpwLnZhbHVlLGZlYXR1cmU6Zi5nZXQocC52YWx1ZSl9KSxrW3AudmFsdWVdPSEwLHA9bS5uZXh0KCl9aWYobnVsbD09ZylyZXR1cm4gbDtpZihtPWcua2V5cygpKWZvcihmPW0ubmV4dCgpOyFmLmRvbmU7KWYudmFsdWUgaW4ga3x8KGwucHVzaCh7bmFtZTpmLnZhbHVlLGZlYXR1cmU6Zy5nZXQoZi52YWx1ZSl9KSxrW2YudmFsdWVdPSEwKSxmPW0ubmV4dCgpO3JldHVybiBsfSxnZXRTZXFGZWF0dXJlczpmdW5jdGlvbihmKXtyZXR1cm4gbnVsbD09Znx8ZiBpbnN0YW5jZW9mIGZpP25ldyBNYXAoW10pOnRoaXMuZXhhbXBsZS5nZXRGZWF0dXJlTGlzdHMoKS5nZXRGZWF0dXJlTGlzdE1hcCgpfSwKc2V0RmlsdGVyZWRGZWF0dXJlc0xpc3Q6ZnVuY3Rpb24oZixnLGwpe3RoaXMuZmlsdGVyZWRGZWF0dXJlc0xpc3Q9W107dGhpcy5maWx0ZXJlZEZlYXR1cmVzTGlzdD10aGlzLmdldEZpbHRlcmVkRmVhdHVyZXNMaXN0KGYsZyxsKX0sc2V0RmlsdGVyZWRTZXFGZWF0dXJlc0xpc3Q6ZnVuY3Rpb24oZixnLGwpe3RoaXMuZmlsdGVyZWRTZXFGZWF0dXJlc0xpc3Q9W107dGhpcy5maWx0ZXJlZFNlcUZlYXR1cmVzTGlzdD10aGlzLmdldEZpbHRlcmVkRmVhdHVyZXNMaXN0KGYsZyxsKX0sZ2V0RmlsdGVyZWRGZWF0dXJlc0xpc3Q6ZnVuY3Rpb24oZixnLGwpe2lmKG51bGwhPWYpe3ZhciBrPWYsbT1sJiYwPE9iamVjdC5rZXlzKGwpLmxlbmd0aCxwPW0/T2JqZWN0LmFzc2lnbih7fSwuLi5PYmplY3Qua2V5cyhsKS5tYXAocT0+KHtbcV06Im51bWJlciI9PXR5cGVvZiBsW3FdP2xbcV06bFtxXS5yZWR1Y2UoKHIsdCk9PnIrdCwwKX0pKSk6e307aWYoIiIhPWcpe2NvbnN0IHE9bmV3IFJlZ0V4cChnLAoiaSIpO2s9Zi5maWx0ZXIocj0+cS50ZXN0KHIubmFtZSkpfXJldHVybiBrLnNvcnQoKHEscik9PntpZih0aGlzLmlzSW1hZ2UocS5uYW1lKSYmIXRoaXMuaXNJbWFnZShyLm5hbWUpKXJldHVybi0xO2lmKHRoaXMuaXNJbWFnZShyLm5hbWUpJiYhdGhpcy5pc0ltYWdlKHEubmFtZSkpcmV0dXJuIDE7aWYobSl7aWYocS5uYW1lIGluIGwmJiEoci5uYW1lIGluIGwpKXJldHVybi0xO2lmKHIubmFtZSBpbiBsJiYhKHEubmFtZSBpbiBsKSlyZXR1cm4gMTt7Y29uc3QgdD1wW3IubmFtZV0tcFtxLm5hbWVdO2lmKDAhPXQpcmV0dXJuIHR9fXJldHVybiBxLm5hbWUubG9jYWxlQ29tcGFyZShyLm5hbWUpfSl9fSxnZXRNYXhTZXFOdW1iZXI6ZnVuY3Rpb24oKXtsZXQgZj0tMTtmb3IoY29uc3QgZyBvZiB0aGlzLnNlcUZlYXR1cmVzTGlzdCl7Y29uc3QgbD1nLmZlYXR1cmU7bCYmbC5nZXRGZWF0dXJlTGlzdCgpLmxlbmd0aC0xPmYmJihmPWwuZ2V0RmVhdHVyZUxpc3QoKS5sZW5ndGgtMSl9cmV0dXJuIGZ9LApoYXZlU2FsaWVuY3lKc29uOmZ1bmN0aW9uKCl7dGhpcy5zYWxpZW5jeT1KU09OLnBhcnNlKHRoaXMuc2FsaWVuY3lKc29uU3RyaW5nKX0sZ2V0Q29sb3JzOmZ1bmN0aW9uKCl7W3RoaXMubWluU2FsLHRoaXMubWF4U2FsXT10aGlzLmdldE1pbk1heFNhbGllbmN5KHRoaXMuc2FsaWVuY3kpO3JldHVybiBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbdGhpcy5taW5TYWwsMCx0aGlzLm1heFNhbF0pLmludGVycG9sYXRlKGEpLmNsYW1wKCEwKS5yYW5nZShbIiNGRjg0N0MiLCIjZmZmIiwiIzAwN0I4MyJdKX0sc2VsZWN0QWxsOmZ1bmN0aW9uKGYpe3JldHVybiBkMy5zZWxlY3RBbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKGYpKX0saGF2ZVNhbGllbmN5OmZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9oYXZlU2FsaWVuY3lJbXBsKCkpfSxfaGF2ZVNhbGllbmN5SW1wbDpmdW5jdGlvbigpe3RoaXMuc2VsZWN0QWxsKCIudmFsdWUtcGlsbCIpLnN0eWxlKCJiYWNrZ3JvdW5kIiwKIiNmZmYiKTtpZih0aGlzLmZpbHRlcmVkRmVhdHVyZXNMaXN0JiZ0aGlzLnNhbGllbmN5JiYwIT09T2JqZWN0LmtleXModGhpcy5zYWxpZW5jeSkubGVuZ3RoJiZ0aGlzLmNvbG9ycylmb3IoY29uc3QgZyBvZiB0aGlzLmZpbHRlcmVkRmVhdHVyZXNMaXN0KXtjb25zdCBsPXRoaXMuc2FsaWVuY3lbZy5uYW1lXTtpZihsKXt2YXIgZj1BcnJheS5pc0FycmF5KGwpPyhrLG0pPT50aGlzLmdldENvbG9yRm9yU2FsaWVuY3kobFttXSk6KCk9PnRoaXMuZ2V0Q29sb3JGb3JTYWxpZW5jeShsKTt0aGlzLnNlbGVjdEFsbChgLiR7dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZy5uYW1lKX0udmFsdWUtcGlsbGApLnN0eWxlKCJiYWNrZ3JvdW5kIix0aGlzLnNob3dTYWxpZW5jeT9mOigpPT4iI2ZmZiIpO2lmKEFycmF5LmlzQXJyYXkobCkpe2Y9bDtjb25zdCBrPXRoaXMuc2VsZWN0QWxsKGBwYXBlci1idXR0b24uJHt0aGlzLnNhbml0aXplRmVhdHVyZShnLm5hbWUpfS52YWx1ZS1waWxsYCk7bGV0IG09CjA7Zm9yKGxldCBwPTE7cDxmLmxlbmd0aDtwKyspTWF0aC5hYnMoZltwXSk+TWF0aC5hYnMobSkmJihtPWZbcF0pO2suc3R5bGUoImJhY2tncm91bmQiLHRoaXMuc2hvd1NhbGllbmN5PygpPT50aGlzLmdldENvbG9yRm9yU2FsaWVuY3kobSk6KCk9PiIjZmZmIil9fX19LG5ld1NlcU51bTpmdW5jdGlvbigpe3RoaXMuc2VxU2FsaWVuY3koKX0sc2VxU2FsaWVuY3k6ZnVuY3Rpb24oKXtpZih0aGlzLnNlcUZlYXR1cmVzTGlzdCYmdGhpcy5zYWxpZW5jeSYmMCE9PU9iamVjdC5rZXlzKHRoaXMuc2FsaWVuY3kpLmxlbmd0aCYmdGhpcy5jb2xvcnMpaWYodGhpcy5zZWxlY3RBbGwoIi52YWx1ZSBpbnB1dCIpLnNpemUoKTx0aGlzLnNlcUZlYXR1cmVzTGlzdC5sZW5ndGgpcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnNlcVNhbGllbmN5KCkpO2Vsc2UgZm9yKGNvbnN0IGcgb2YgdGhpcy5zZXFGZWF0dXJlc0xpc3Qpe3ZhciBmPXRoaXMuc2FsaWVuY3lbZy5uYW1lXTtpZighZiljb250aW51ZTsKY29uc3QgbD1mW3RoaXMuc2VxTnVtYmVyXTtmPUFycmF5LmlzQXJyYXkobCk/KGssbSk9PnRoaXMuZ2V0Q29sb3JGb3JTYWxpZW5jeShsW21dKTooKT0+dGhpcy5nZXRDb2xvckZvclNhbGllbmN5KGwpO3RoaXMuc2VsZWN0QWxsKGAuJHt0aGlzLnNhbml0aXplRmVhdHVyZShnLm5hbWUpfSBpbnB1dGApLnN0eWxlKCJjb2xvciIsdGhpcy5zaG93U2FsaWVuY3k/ZjooKT0+ImJsYWNrIil9fSxnZXRNaW5NYXhTYWxpZW5jeTpmdW5jdGlvbihmKXtsZXQgZz1JbmZpbml0eSxsPS1JbmZpbml0eTtjb25zdCBrPW09PntpZihBcnJheS5pc0FycmF5KG0pKWZvcihjb25zdCBwIG9mIG0payhwKTtlbHNlIG08ZyYmKGc9bSksbT5sJiYobD1tKX07Zm9yKGNvbnN0IG0gaW4gZilmLmhhc093blByb3BlcnR5KG0pJiZrKGZbbV0pO2c9Ljk1Kk1hdGgubWluKDAsZyk7bD0uOTUqTWF0aC5tYXgoMCxsKTswPmcmJmw+TWF0aC5hYnMoZyk/Zz0tMSpsOjA8bCYmTWF0aC5hYnMoZyk+bCYmKGw9LTEqZyk7CnJldHVybltnLGxdfSxnZXRGZWF0dXJlVmFsdWVzOmZ1bmN0aW9uKGYsZyxsLGspe3JldHVybihmPWs/dGhpcy5jb21wYXJlRmVhdHVyZXMuZ2V0KGYpOnRoaXMuZmVhdHVyZXMuZ2V0KGYpKT9mLmdldEJ5dGVzTGlzdCgpP2c/Zi5nZXRCeXRlc0xpc3QoKS5nZXRWYWx1ZUxpc3QoKS5zbGljZSgpOmYuZ2V0Qnl0ZXNMaXN0KCkuZ2V0VmFsdWVMaXN0X2FzVTgoKS5tYXAobT0+dGhpcy5kZWNvZGVCeXRlc0xpc3RTdHJpbmcobSxsKSk6Zi5nZXRJbnQ2NExpc3QoKT9mLmdldEludDY0TGlzdCgpLmdldFZhbHVlTGlzdCgpLnNsaWNlKCk6Zi5nZXRGbG9hdExpc3QoKT9mLmdldEZsb2F0TGlzdCgpLmdldFZhbHVlTGlzdCgpLnNsaWNlKCk6W106W119LGdldENvbXBhcmVGZWF0dXJlVmFsdWVzOmZ1bmN0aW9uKGYsZyxsKXtyZXR1cm4gdGhpcy5nZXRGZWF0dXJlVmFsdWVzKGYsZyxsLCEwKX0sZ2V0Rmlyc3RGZWF0dXJlVmFsdWU6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuZ2V0RmVhdHVyZVZhbHVlcyhmKVswXX0sCmdldEZpcnN0Q29tcGFyZUZlYXR1cmVWYWx1ZTpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5nZXRDb21wYXJlRmVhdHVyZVZhbHVlcyhmKVswXX0sZmVhdHVyZUhhc011bHRpcGxlVmFsdWVzOmZ1bmN0aW9uKGYpe3JldHVybiAxPHRoaXMuZ2V0RmVhdHVyZVZhbHVlcyhmKS5sZW5ndGh9LGNvbXBhcmVGZWF0dXJlSGFzTXVsdGlwbGVWYWx1ZXM6ZnVuY3Rpb24oZil7cmV0dXJuIDE8dGhpcy5nZXRDb21wYXJlRmVhdHVyZVZhbHVlcyhmKS5sZW5ndGh9LGdldFNlcUZlYXR1cmVWYWx1ZXM6ZnVuY3Rpb24oZixnLGwsayxtKXtmPW0/dGhpcy5jb21wYXJlU2VxRmVhdHVyZXMuZ2V0KGYpOnRoaXMuc2VxRmVhdHVyZXMuZ2V0KGYpO2lmKCFmKXJldHVybltdO2Y9Zi5nZXRGZWF0dXJlTGlzdCgpO3JldHVybiFmfHxmLmxlbmd0aDw9Zz9bXTooZz1mW2ddKT9nLmdldEJ5dGVzTGlzdCgpP2w/Zy5nZXRCeXRlc0xpc3QoKS5nZXRWYWx1ZUxpc3QoKTpnLmdldEJ5dGVzTGlzdCgpLmdldFZhbHVlTGlzdF9hc1U4KCkubWFwKHA9Pgp0aGlzLmRlY29kZUJ5dGVzTGlzdFN0cmluZyhwLGspKTpnLmdldEludDY0TGlzdCgpP2cuZ2V0SW50NjRMaXN0KCkuZ2V0VmFsdWVMaXN0KCk6Zy5nZXRGbG9hdExpc3QoKT9nLmdldEZsb2F0TGlzdCgpLmdldFZhbHVlTGlzdCgpOltdOltdfSxnZXRDb21wYXJlU2VxRmVhdHVyZVZhbHVlczpmdW5jdGlvbihmLGcsbCxrKXtyZXR1cm4gdGhpcy5nZXRTZXFGZWF0dXJlVmFsdWVzKGYsZyxsLGssITApfSxnZXRGaXJzdFNlcUZlYXR1cmVWYWx1ZTpmdW5jdGlvbihmLGcpe3JldHVybiB0aGlzLmdldFNlcUZlYXR1cmVWYWx1ZXMoZixnKVswXX0sZ2V0Rmlyc3RTZXFDb21wYXJlRmVhdHVyZVZhbHVlOmZ1bmN0aW9uKGYsZyl7cmV0dXJuIHRoaXMuZ2V0Q29tcGFyZVNlcUZlYXR1cmVWYWx1ZXMoZixnKVswXX0sc2VxRmVhdHVyZUhhc011bHRpcGxlVmFsdWVzOmZ1bmN0aW9uKGYsZyl7cmV0dXJuIDE8dGhpcy5nZXRTZXFGZWF0dXJlVmFsdWVzKGYsZykubGVuZ3RofSxjb21wYXJlU2VxRmVhdHVyZUhhc011bHRpcGxlVmFsdWVzOmZ1bmN0aW9uKGYsCmcpe3JldHVybiAxPHRoaXMuZ2V0Q29tcGFyZVNlcUZlYXR1cmVWYWx1ZXMoZixnKS5sZW5ndGh9LGRlY29kZUJ5dGVzTGlzdFN0cmluZzpmdW5jdGlvbihmLGcpe3JldHVybiAzMjc2OEUzPGYubGVuZ3RoPyJTdHJpbmcgdG9vIGxhcmdlIHRvIGRpc3BsYXkiOmc/dGhpcy5kZWNvZGVCeXRlc0xpc3RUb1N0cmluZyhmKToobmV3IHdpbmRvdy5UZXh0RGVjb2RlcikuZGVjb2RlKGYpfSxpc0J5dGVzRmVhdHVyZTpmdW5jdGlvbihmKXtjb25zdCBnPXRoaXMuZmVhdHVyZXMuZ2V0KGYpO3JldHVybiBnJiZnLmhhc0J5dGVzTGlzdCgpPyEwOihmPXRoaXMuc2VxRmVhdHVyZXMuZ2V0KGYpKSYmZi5nZXRGZWF0dXJlTGlzdCgpWzBdLmhhc0J5dGVzTGlzdCgpPyEwOiExfSxnZXRKc29uRmVhdHVyZTpmdW5jdGlvbihmKXtpZighdGhpcy5qc29uKXJldHVybiBudWxsO2lmKHRoaXMuanNvbi5mZWF0dXJlcyYmdGhpcy5qc29uLmZlYXR1cmVzLmZlYXR1cmUpe3ZhciBnPXRoaXMuanNvbi5mZWF0dXJlcy5mZWF0dXJlW2ZdOwppZihnKXJldHVybiBnfXJldHVybiB0aGlzLmpzb24uY29udGV4dCYmdGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZSYmKGc9dGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZVtmXSk/Zzp0aGlzLmpzb24uZmVhdHVyZUxpc3RzJiZ0aGlzLmpzb24uZmVhdHVyZUxpc3RzLmZlYXR1cmVMaXN0P3RoaXMuanNvbi5mZWF0dXJlTGlzdHMuZmVhdHVyZUxpc3RbZl06bnVsbH0sZ2V0SnNvblZhbHVlTGlzdDpmdW5jdGlvbihmLGcpe2Y9dGhpcy5nZXRKc29uRmVhdHVyZShmKTtpZighZilyZXR1cm4gbnVsbDtpc05hTihnKXx8KGY9Zi5mZWF0dXJlW2ddKTtyZXR1cm4oZz1mLmJ5dGVzTGlzdHx8Zi5pbnQ2NExpc3R8fGYuZmxvYXRMaXN0KT9nLnZhbHVlOm51bGx9LGdldERhdGFGcm9tRXZlbnQ6ZnVuY3Rpb24oZil7Zm9yKGY9Zi50YXJnZXQ7bnVsbD09Zi5kYXRhRmVhdHVyZTspe2lmKCFmLnBhcmVudEVsZW1lbnQpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGFuY2VzdG9yIGNvbnRyb2wgZWxlbWVudCIpOwpmPWYucGFyZW50RWxlbWVudH1yZXR1cm57ZmVhdHVyZTpmLmRhdGFGZWF0dXJlLHZhbHVlSW5kZXg6Zi5kYXRhSW5kZXgsc2VxTnVtOmYuZGF0YVNlcU51bX19LGdldEZlYXR1cmVGcm9tRGF0YTpmdW5jdGlvbihmKXtpZihpc05hTihmLnNlcU51bSkpcmV0dXJuIHRoaXMuZmVhdHVyZXMuZ2V0KGYuZmVhdHVyZSk7dmFyIGc9dGhpcy5zZXFGZWF0dXJlcy5nZXQoZi5mZWF0dXJlKTtpZihnKXJldHVybihnPWcuZ2V0RmVhdHVyZUxpc3QoKSk/Z1tmLnNlcU51bV06dm9pZCAwfSxnZXRWYWx1ZUxpc3RGcm9tRGF0YTpmdW5jdGlvbihmKXtyZXR1cm4gaXNOYU4oZi5zZXFOdW0pP3RoaXMuZ2V0RmVhdHVyZVZhbHVlcyhmLmZlYXR1cmUsITApOnRoaXMuZ2V0U2VxRmVhdHVyZVZhbHVlcyhmLmZlYXR1cmUsZi5zZXFOdW0sITApfSxzZXRGZWF0dXJlVmFsdWVzOmZ1bmN0aW9uKGYsZyl7Y29uc3QgbD1mLmdldEJ5dGVzTGlzdCgpLGs9Zi5nZXRJbnQ2NExpc3QoKTtmPWYuZ2V0RmxvYXRMaXN0KCk7Cmw/bC5zZXRWYWx1ZUxpc3QoZyk6az9rLnNldFZhbHVlTGlzdChnKTpmJiZmLnNldFZhbHVlTGlzdChnKX0sb25WYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oZil7Y29uc3QgZz1mLnRhcmdldDtmPXRoaXMuZ2V0RGF0YUZyb21FdmVudChmKTtjb25zdCBsPXRoaXMuZ2V0RmVhdHVyZUZyb21EYXRhKGYpLGs9dGhpcy5nZXRWYWx1ZUxpc3RGcm9tRGF0YShmKTtpZihsKXtpZih0aGlzLmlzQnl0ZXNGZWF0dXJlKGYuZmVhdHVyZSkpe3ZhciBtPXRoaXMuc3RyaW5nVG9VaW50OEFycmF5KGcudmFsdWUpO2tbZi52YWx1ZUluZGV4XT1tOyhtPXRoaXMuZ2V0SnNvblZhbHVlTGlzdChmLmZlYXR1cmUsZi5zZXFOdW0pKSYmKG1bZi52YWx1ZUluZGV4XT1idG9hKGcudmFsdWUpKX1lbHNlIGtbZi52YWx1ZUluZGV4XT0rZy52YWx1ZSwobT10aGlzLmdldEpzb25WYWx1ZUxpc3QoZi5mZWF0dXJlLGYuc2VxTnVtKSkmJihtW2YudmFsdWVJbmRleF09K2cudmFsdWUpO3RoaXMuc2V0RmVhdHVyZVZhbHVlcyhsLAprKTt0aGlzLmV4YW1wbGVDaGFuZ2VkKCl9fSxvbklucHV0Rm9jdXM6ZnVuY3Rpb24oZil7Y29uc3QgZz1mLnRhcmdldDtmPXRoaXMuZ2V0RGF0YUZyb21FdmVudChmKTt0aGlzLmZvY3VzZWRGZWF0dXJlTmFtZT1mLmZlYXR1cmU7dGhpcy5mb2N1c2VkRmVhdHVyZVZhbHVlSW5kZXg9Zi52YWx1ZUluZGV4O3RoaXMuZm9jdXNlZFNlcU51bWJlcj1mLnNlcU51bTt0aGlzLiQuZGVsZXRldmFsdWUuc3R5bGUudG9wPWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLTI1KyJweCI7dGhpcy4kLmRlbGV0ZXZhbHVlLnN0eWxlLnJpZ2h0PXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQtZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCszMCsicHgiO3RoaXMuc2hvd0RlbGV0ZVZhbHVlQnV0dG9uPSEwfSxvbklucHV0Qmx1cjpmdW5jdGlvbigpe3RoaXMuc2hvd0RlbGV0ZVZhbHVlQnV0dG9uPSExfSxkZWxldGVGZWF0dXJlOmZ1bmN0aW9uKGYpe2Y9CnRoaXMuZ2V0RGF0YUZyb21FdmVudChmKTt0aGlzLmZlYXR1cmVzLmRlbCYmdGhpcy5mZWF0dXJlcy5kZWwoZi5mZWF0dXJlKTt0aGlzLnNlcUZlYXR1cmVzLmRlbCYmdGhpcy5zZXFGZWF0dXJlcy5kZWwoZi5mZWF0dXJlKTt0aGlzLmRlbGV0ZUpzb25GZWF0dXJlKGYuZmVhdHVyZSk7dGhpcy5leGFtcGxlQ2hhbmdlZCgpO3RoaXMucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKX0sZGVsZXRlSnNvbkZlYXR1cmU6ZnVuY3Rpb24oZil7dGhpcy5qc29uJiYodGhpcy5qc29uLmZlYXR1cmVzJiZ0aGlzLmpzb24uZmVhdHVyZXMuZmVhdHVyZSYmZGVsZXRlIHRoaXMuanNvbi5mZWF0dXJlcy5mZWF0dXJlW2ZdLHRoaXMuanNvbi5jb250ZXh0JiZ0aGlzLmpzb24uY29udGV4dC5mZWF0dXJlJiZkZWxldGUgdGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZVtmXSx0aGlzLmpzb24uZmVhdHVyZUxpc3RzJiZ0aGlzLmpzb24uZmVhdHVyZUxpc3RzLmZlYXR1cmVMaXN0JiZkZWxldGUgdGhpcy5qc29uLmZlYXR1cmVMaXN0cy5mZWF0dXJlTGlzdFtmXSl9LApkZWxldGVWYWx1ZTpmdW5jdGlvbihmKXtmPXRoaXMuZ2V0RGF0YUZyb21FdmVudChmKTtjb25zdCBnPXRoaXMuZ2V0RmVhdHVyZUZyb21EYXRhKGYpLGw9dGhpcy5nZXRWYWx1ZUxpc3RGcm9tRGF0YShmKTtpZihnKXtpZih0aGlzLmlzQnl0ZXNGZWF0dXJlKGYuZmVhdHVyZSkpe2NvbnN0IGs9dGhpcy5nZXRKc29uVmFsdWVMaXN0KGYuZmVhdHVyZSxmLnNlcU51bSk7ayYmay5zcGxpY2UoZi52YWx1ZUluZGV4LDEpfWwuc3BsaWNlKGYudmFsdWVJbmRleCwxKTt0aGlzLnNldEZlYXR1cmVWYWx1ZXMoZyxsKTt0aGlzLmV4YW1wbGVDaGFuZ2VkKCk7dGhpcy5yZWZyZXNoRXhhbXBsZVZpZXdlcigpfX0sb3BlbkFkZEZlYXR1cmVEaWFsb2c6ZnVuY3Rpb24oKXt0aGlzLiQuYWRkRmVhdHVyZURpYWxvZy5vcGVuKCl9LGFkZEZlYXR1cmU6ZnVuY3Rpb24oKXtpZih0aGlzLmpzb24pe3ZhciBmPW5ldyBXZztpZigiaW50Ij09PXRoaXMubmV3RmVhdHVyZVR5cGUpe3ZhciBnPVtdO3ZhciBsPW5ldyBVZzsKbC5zZXRWYWx1ZUxpc3QoZyk7Zi5zZXRJbnQ2NExpc3QobCk7Zz17aW50NjRMaXN0Ont2YWx1ZTpnfX19ZWxzZSJmbG9hdCI9PT10aGlzLm5ld0ZlYXR1cmVUeXBlPyhnPVtdLGw9bmV3IFNnLGwuc2V0VmFsdWVMaXN0KGcpLGYuc2V0RmxvYXRMaXN0KGwpLGc9e2Zsb2F0TGlzdDp7dmFsdWU6Z319KTooZz1bXSxsPW5ldyBRZyxsLnNldFZhbHVlTGlzdChnKSxmLnNldEJ5dGVzTGlzdChsKSxnPXtieXRlc0xpc3Q6e3ZhbHVlOmd9fSk7dGhpcy5mZWF0dXJlcy5zZXQodGhpcy5uZXdGZWF0dXJlTmFtZSxmKTt0aGlzLmFkZEpzb25GZWF0dXJlKHRoaXMubmV3RmVhdHVyZU5hbWUsZyk7dGhpcy5uZXdGZWF0dXJlTmFtZT0iIjt0aGlzLmV4YW1wbGVDaGFuZ2VkKCk7dGhpcy5yZWZyZXNoRXhhbXBsZVZpZXdlcigpfX0sYWRkSnNvbkZlYXR1cmU6ZnVuY3Rpb24oZixnKXt0aGlzLmpzb24mJnRoaXMuanNvbi5mZWF0dXJlcyYmdGhpcy5qc29uLmZlYXR1cmVzLmZlYXR1cmU/dGhpcy5qc29uLmZlYXR1cmVzLmZlYXR1cmVbZl09Cmc6dGhpcy5qc29uJiZ0aGlzLmpzb24uY29udGV4dCYmdGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZSYmKHRoaXMuanNvbi5jb250ZXh0LmZlYXR1cmVbZl09Zyl9LGFkZFZhbHVlOmZ1bmN0aW9uKGYpe2Y9dGhpcy5nZXREYXRhRnJvbUV2ZW50KGYpO2NvbnN0IGc9dGhpcy5nZXRGZWF0dXJlRnJvbURhdGEoZiksbD10aGlzLmdldFZhbHVlTGlzdEZyb21EYXRhKGYpO2cmJih0aGlzLmlzQnl0ZXNGZWF0dXJlKGYuZmVhdHVyZSk/bC5wdXNoKCIiKTpsLnB1c2goMCksdGhpcy5zZXRGZWF0dXJlVmFsdWVzKGcsbCksdGhpcy5leGFtcGxlQ2hhbmdlZCgpLHRoaXMucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKSl9LHJlZnJlc2hFeGFtcGxlVmlld2VyOmZ1bmN0aW9uKCl7Y29uc3QgZj10aGlzLmV4YW1wbGU7dGhpcy5pZ25vcmVDaGFuZ2U9ITA7dGhpcy5leGFtcGxlPW5ldyBmaTt0aGlzLmlnbm9yZUNoYW5nZT0hMTtzZXRUaW1lb3V0KCgpPT57dGhpcy5leGFtcGxlPWY7dGhpcy5oYXZlU2FsaWVuY3koKX0sCjApfSxleGFtcGxlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZXhhbXBsZS1jaGFuZ2UiLHtleGFtcGxlOnRoaXMuZXhhbXBsZX0pO2NsZWFyVGltZW91dCh0aGlzLmNoYW5nZUNhbGxiYWNrVGltZXIpO3RoaXMuY2hhbmdlQ2FsbGJhY2tUaW1lcj1zZXRUaW1lb3V0KHRoaXMuY2hhbmdlQ2FsbGJhY2suYmluZCh0aGlzKSwxRTMpfSxjaGFuZ2VDYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuaWdub3JlQ2hhbmdlPSEwO3RoaXMuaXNTZXF1ZW5jZSYmdGhpcy5zZXJpYWxpemVkU2VxRXhhbXBsZT90aGlzLnNlcmlhbGl6ZWRTZXFFeGFtcGxlPWJ0b2EodGhpcy5kZWNvZGVCeXRlc0xpc3RTdHJpbmcodGhpcy5leGFtcGxlLnNlcmlhbGl6ZUJpbmFyeSgpLCEwKSk6dGhpcy5zZXJpYWxpemVkRXhhbXBsZSYmKHRoaXMuc2VyaWFsaXplZEV4YW1wbGU9YnRvYSh0aGlzLmRlY29kZUJ5dGVzTGlzdFN0cmluZyh0aGlzLmV4YW1wbGUuc2VyaWFsaXplQmluYXJ5KCksITApKSk7dGhpcy5pZ25vcmVDaGFuZ2U9CiExfSxnZXRJbnB1dFBpbGxDbGFzczpmdW5jdGlvbihmLGcpe3JldHVybiB0aGlzLnNhbml0aXplRmVhdHVyZShmKSsiIHZhbHVlLXBpbGwiKygiZ3JpZCI9PWc/IiB2YWx1ZS1waWxsLWdyaWQiOiIgdmFsdWUtcGlsbC1zdGFja2VkIil9LGdldENvbXBhcmVJbnB1dENsYXNzOmZ1bmN0aW9uKGYsZyxsKXtnPSJ2YWx1ZS1jb21wYXJlIisoImdyaWQiPT1nPyIgdmFsdWUtcGlsbC1ncmlkIjoiIHZhbHVlLXBpbGwtc3RhY2tlZCIpO2lmKG51bGwhPWwpe2NvbnN0IGs9dGhpcy5nZXRGZWF0dXJlVmFsdWVzKGYsITApO2Y9dGhpcy5nZXRDb21wYXJlRmVhdHVyZVZhbHVlcyhmLCEwKTtnPWw+PWsubGVuZ3RofHxsPj1mLmxlbmd0aHx8a1tsXSE9ZltsXT9nKyIgdmFsdWUtZGlmZmVyZW50IjpnKyIgdmFsdWUtc2FtZSJ9cmV0dXJuIGd9LGdldFNlcUNvbXBhcmVJbnB1dENsYXNzOmZ1bmN0aW9uKGYsZyxsLGspe2c9InZhbHVlLWNvbXBhcmUiKygiZ3JpZCI9PWc/IiB2YWx1ZS1waWxsLWdyaWQiOgoiIHZhbHVlLXBpbGwtc3RhY2tlZCIpO2lmKG51bGwhPWspe2NvbnN0IG09dGhpcy5nZXRTZXFGZWF0dXJlVmFsdWVzKGYsbCwhMCk7Zj10aGlzLmdldENvbXBhcmVTZXFGZWF0dXJlVmFsdWVzKGYsbCwhMCk7Zz1rPj1tLmxlbmd0aHx8az49Zi5sZW5ndGh8fG1ba10hPWZba10/ZysiIHZhbHVlLWRpZmZlcmVudCI6ZysiIHZhbHVlLXNhbWUifXJldHVybiBnfSxzYW5pdGl6ZUZlYXR1cmU6ZnVuY3Rpb24oZil7Zj1mLnRyaW0oKTtmLm1hdGNoKC9eW0EtWmEtel0uKiQvKXx8KGY9Il8iK2YpO3JldHVybiBmLnJlcGxhY2UoL1tcL1wuI10vZywiXyIpfSxpc1NlcUV4YW1wbGU6ZnVuY3Rpb24oZil7cmV0dXJuIDA8PWZ9LHNob3VsZFNob3dTYWxpZW5jeUxlZ2VuZDpmdW5jdGlvbihmKXtyZXR1cm4gZiYmMDxPYmplY3Qua2V5cyhmKS5sZW5ndGh9LGdldFNhbGllbmN5Q29udHJvbHNIb2xkZXJDbGFzcyhmKXtyZXR1cm4gdGhpcy5zaG91bGRTaG93U2FsaWVuY3lMZWdlbmQoZik/InNhbGllbmN5LWNvbnRyb2xzLWhvbGRlciI6CiJoaWRlLXNhbGllbmN5LWNvbnRyb2xzIn0sY3JlYXRlTGVnZW5kOmZ1bmN0aW9uKCl7ZDMuc2VsZWN0KHRoaXMuJC5zYWxpZW5jeUxlZ2VuZCkuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7Y29uc3QgZj1kMy5zZWxlY3QodGhpcy4kLnNhbGllbmN5TGVnZW5kKS5hcHBlbmQoImciKSxnPWYuYXBwZW5kKCJkZWZzIikuYXBwZW5kKCJsaW5lYXJHcmFkaWVudCIpLmF0dHIoImlkIiwidnpleGFtcGxldmlld2VyZ3JhZGllbnQiKS5hdHRyKCJ4MSIsIjAlIikuYXR0cigieTEiLCIwJSIpLmF0dHIoIngyIiwiMTAwJSIpLmF0dHIoInkyIiwiMCUiKS5hdHRyKCJzcHJlYWRNZXRob2QiLCJwYWQiKTt2YXIgbD1bXTswPnRoaXMubWluU2FsJiZsLnB1c2goIiNGRjg0N0MiKTtsLnB1c2goIiNmZmYiKTswPHRoaXMubWF4U2FsJiZsLnB1c2goIiMwMDdCODMiKTtjb25zdCBrPSgobSxwLHEpPT57Y29uc3Qgcj1bXSx0PShwLW0pLyhxLTEpO2xldCB2PTA7Zm9yKDt2PHEtMTspci5wdXNoKG0rdip0KSwKdisrO3IucHVzaChwKTtyZXR1cm4gcn0pKDAsMTAwLGwubGVuZ3RoKS5tYXAobT0+TWF0aC5yb3VuZChtKSsiJSIpO2QzLnppcChrLGwpLmZvckVhY2gobT0+e2cuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixtWzBdKS5hdHRyKCJzdG9wLWNvbG9yIixtWzFdKS5hdHRyKCJzdG9wLW9wYWNpdHkiLDEpfSk7Zi5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4MSIsMCkuYXR0cigieTEiLDApLmF0dHIoIndpZHRoIiwyNjApLmF0dHIoImhlaWdodCIsMjApLnN0eWxlKCJmaWxsIiwidXJsKCN2emV4YW1wbGV2aWV3ZXJncmFkaWVudCkiKTtsPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFt0aGlzLm1pblNhbCx0aGlzLm1heFNhbF0pLnJhbmdlKFswLDI2MF0pO2w9ZDMuYXhpc0JvdHRvbShsKS50aWNrcygpO2YuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsZWdlbmQgYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLDIwKSIpLmNhbGwobCl9LGlzSW1hZ2U6ZnVuY3Rpb24oZil7cmV0dXJuIGMudGVzdChmKX0sCmdldEltYWdlU3JjOmZ1bmN0aW9uKGYpe3RoaXMuc2V0dXBPbmxvYWRDYWxsYmFjayhmKTtyZXR1cm4gdGhpcy5nZXRJbWFnZVNyY0ZvckRhdGEoZix0aGlzLmdldEZlYXR1cmVWYWx1ZXMoZiwhMSwhMClbMF0pfSxnZXRDb21wYXJlSW1hZ2VTcmM6ZnVuY3Rpb24oZil7dGhpcy5zZXR1cE9ubG9hZENhbGxiYWNrKGYsITApO3JldHVybiB0aGlzLmdldEltYWdlU3JjRm9yRGF0YShmLHRoaXMuZ2V0Q29tcGFyZUZlYXR1cmVWYWx1ZXMoZiwhMSwhMClbMF0sITApfSxnZXRTZXFJbWFnZVNyYzpmdW5jdGlvbihmLGcpe3RoaXMuc2V0dXBPbmxvYWRDYWxsYmFjayhmKTtyZXR1cm4gdGhpcy5nZXRJbWFnZVNyY0ZvckRhdGEoZix0aGlzLmdldFNlcUZlYXR1cmVWYWx1ZXMoZixnLCExLCEwKVswXSl9LGdldENvbXBhcmVTZXFJbWFnZVNyYzpmdW5jdGlvbihmLGcpe3RoaXMuc2V0dXBPbmxvYWRDYWxsYmFjayhmLCEwKTtyZXR1cm4gdGhpcy5nZXRJbWFnZVNyY0ZvckRhdGEoZix0aGlzLmdldENvbXBhcmVTZXFGZWF0dXJlVmFsdWVzKGYsCmcsITEsITApWzBdLCEwKX0sc2V0dXBPbmxvYWRDYWxsYmFjazpmdW5jdGlvbihmLGcpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2NvbnN0IGw9dGhpcy4kJCgiIyIrdGhpcy5nZXRJbWFnZUlkKGYsZykpO2wub25sb2FkPXRoaXMuZ2V0T25Mb2FkRm9ySW1hZ2UoZixsLGcpfSl9LGdldEltYWdlU3JjRm9yRGF0YTpmdW5jdGlvbihmLGcsbCl7Zj1jLmV4ZWMoZik7aWYobnVsbD09ZilyZXR1cm4gbnVsbDtmPWZbMV18fCIiO2w9bD90aGlzLmdldENvbXBhcmVGZWF0dXJlVmFsdWVzKCJpbWFnZSIrZisiL2Zvcm1hdCIsITEpOnRoaXMuZ2V0RmVhdHVyZVZhbHVlcygiaW1hZ2UiK2YrIi9mb3JtYXQiLCExKTtmPSJqcGVnIjswPGwubGVuZ3RoJiYoZj1sWzBdLnRvTG93ZXJDYXNlKCkpO3JldHVybiJkYXRhOmltYWdlLyIrZisiO2Jhc2U2NCwiK2J0b2EoZGVjb2RlVVJJQ29tcG9uZW50KGVuY29kZVVSSUNvbXBvbmVudChnKSkpfSxnZXRJdGVyTGVuZ3RoOmZ1bmN0aW9uKGYpe2xldCBnPQowO2lmKGYpe2xldCBsPWYubmV4dCgpO2Zvcig7IWwuZG9uZTspZysrLGw9Zi5uZXh0KCl9cmV0dXJuIGd9LHVwZGF0ZUNvbXBhcmVNb2RlOmZ1bmN0aW9uKCl7bGV0IGY9ITE7aWYodGhpcy5jb21wYXJlRmVhdHVyZXMmJjA8dGhpcy5nZXRJdGVyTGVuZ3RoKHRoaXMuY29tcGFyZUZlYXR1cmVzLmtleXMoKSl8fHRoaXMuY29tcGFyZVNlcUZlYXR1cmVzJiYwPHRoaXMuZ2V0SXRlckxlbmd0aCh0aGlzLmNvbXBhcmVTZXFGZWF0dXJlcy5rZXlzKCkpKWY9ITA7dGhpcy5jb21wYXJlTW9kZT1mfSxjcmVhdGVFeGFtcGxlc0Zyb21Kc29uOmZ1bmN0aW9uKGYpe3RoaXMuZXhhbXBsZT10aGlzLmNyZWF0ZUV4YW1wbGVzRnJvbUpzb25IZWxwZXIoZik7dGhpcy5jb21wYXJlSnNvbj17fX0sY3JlYXRlQ29tcGFyZUV4YW1wbGVzRnJvbUpzb246ZnVuY3Rpb24oZil7ZiYmKHRoaXMuY29tcGFyZUV4YW1wbGU9dGhpcy5jcmVhdGVFeGFtcGxlc0Zyb21Kc29uSGVscGVyKGYpKX0sY3JlYXRlRXhhbXBsZXNGcm9tSnNvbkhlbHBlcjpmdW5jdGlvbihmKXtpZighZilyZXR1cm4gbnVsbDsKInN0cmluZyI9PT10eXBlb2YgdGhpcy5qc29uJiYoZj1KU09OLnBhcnNlKHRoaXMuanNvbikpO2lmKGYuZmVhdHVyZXMpe3ZhciBnPW5ldyBmaTtnLnNldEZlYXR1cmVzKHRoaXMucGFyc2VGZWF0dXJlcyhmLmZlYXR1cmVzKSk7cmV0dXJuIGd9cmV0dXJuIGYuY29udGV4dHx8Zi5mZWF0dXJlTGlzdHM/KGc9bmV3IGdpLGYuY29udGV4dCYmZy5zZXRDb250ZXh0KHRoaXMucGFyc2VGZWF0dXJlcyhmLmNvbnRleHQpKSxmLmZlYXR1cmVMaXN0cyYmZy5zZXRGZWF0dXJlTGlzdHModGhpcy5wYXJzZUZlYXR1cmVMaXN0cyhmLmZlYXR1cmVMaXN0cykpLGcpOm5ldyBmaX0scGFyc2VGZWF0dXJlczpmdW5jdGlvbihmKXtjb25zdCBnPW5ldyBZZztmb3IoY29uc3QgbCBpbiBmLmZlYXR1cmUpaWYoZi5mZWF0dXJlLmhhc093blByb3BlcnR5KGwpKXtjb25zdCBrPWYuZmVhdHVyZVtsXTtnLmdldEZlYXR1cmVNYXAoKS5zZXQobCx0aGlzLnBhcnNlRmVhdHVyZShrLHRoaXMuaXNJbWFnZShsKSkpfXJldHVybiBnfSwKcGFyc2VGZWF0dXJlTGlzdHM6ZnVuY3Rpb24oZil7Y29uc3QgZz1uZXcgS2g7Zm9yKGNvbnN0IGwgaW4gZi5mZWF0dXJlTGlzdClpZihmLmZlYXR1cmVMaXN0Lmhhc093blByb3BlcnR5KGwpKXtjb25zdCBrPWYuZmVhdHVyZUxpc3RbbF0sbT1uZXcgWmcscD1bXTtmb3IoY29uc3QgcSBpbiBrLmZlYXR1cmUpay5mZWF0dXJlLmhhc093blByb3BlcnR5KHEpJiZwLnB1c2godGhpcy5wYXJzZUZlYXR1cmUoay5mZWF0dXJlW3FdLHRoaXMuaXNJbWFnZShsKSkpO20uc2V0RmVhdHVyZUxpc3QocCk7Zy5nZXRGZWF0dXJlTGlzdE1hcCgpLnNldChsLG0pfXJldHVybiBnfSxwYXJzZUZlYXR1cmU6ZnVuY3Rpb24oZil7Y29uc3QgZz1uZXcgV2c7aWYoZi5mbG9hdExpc3Qpe3ZhciBsPW5ldyBTZztsLnNldFZhbHVlTGlzdChmLmZsb2F0TGlzdC52YWx1ZSk7Zy5zZXRGbG9hdExpc3QobCl9ZWxzZSBmLmJ5dGVzTGlzdD8obD1uZXcgUWcsZi5ieXRlc0xpc3QudmFsdWUmJmwuc2V0VmFsdWVMaXN0KGYuYnl0ZXNMaXN0LnZhbHVlKSwKZy5zZXRCeXRlc0xpc3QobCkpOmYuaW50NjRMaXN0JiYobD1uZXcgVWcsbC5zZXRWYWx1ZUxpc3QoZi5pbnQ2NExpc3QudmFsdWUpLGcuc2V0SW50NjRMaXN0KGwpKTtyZXR1cm4gZ30sZ2V0SW1hZ2VJZDpmdW5jdGlvbihmLGcpe3JldHVybiBnP3RoaXMuZ2V0Q29tcGFyZUltYWdlSWQoZik6dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZikrIl9pbWFnZSJ9LGdldENhbnZhc0lkOmZ1bmN0aW9uKGYsZyl7cmV0dXJuIGc/dGhpcy5nZXRDb21wYXJlQ2FudmFzSWQoZik6dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZikrIl9jYW52YXMifSxnZXRJbWFnZUNhcmRJZDpmdW5jdGlvbihmLGcpe3JldHVybiBnP3RoaXMuZ2V0Q29tcGFyZUltYWdlQ2FyZElkKGYpOnRoaXMuc2FuaXRpemVGZWF0dXJlKGYpKyJfY2FyZCJ9LGdldENvbXBhcmVJbWFnZUlkOmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLnNhbml0aXplRmVhdHVyZShmKSsiX2ltYWdlX2NvbXBhcmUifSxnZXRDb21wYXJlQ2FudmFzSWQ6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuc2FuaXRpemVGZWF0dXJlKGYpKwoiX2NhbnZhc19jb21wYXJlIn0sZ2V0Q29tcGFyZUltYWdlQ2FyZElkOmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLnNhbml0aXplRmVhdHVyZShmKSsiX2NhcmRfY29tcGFyZSJ9LGdldEZlYXR1cmVEaWFsb2dJZDpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5zYW5pdGl6ZUZlYXR1cmUoZikrIl9kaWFsb2cifSxmZWF0dXJlTW9yZUNsaWNrZWQ6ZnVuY3Rpb24oZil7Zj1mLnNyY0VsZW1lbnQ7Y29uc3QgZz10aGlzLiQkKCIjIit0aGlzLnNhbml0aXplRmVhdHVyZShmLmRhdGFGZWF0dXJlKSsiX2RpYWxvZyIpO2cucG9zaXRpb25UYXJnZXQ9ZjtnLm9wZW4oKX0sZXhwYW5kRmVhdHVyZTpmdW5jdGlvbihmKXt0aGlzLnNldCgiZXhwYW5kZWRGZWF0dXJlcy4iK3RoaXMuc2FuaXRpemVGZWF0dXJlKGYuc3JjRWxlbWVudC5kYXRhRmVhdHVyZSksITApO3RoaXMucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKX0sZGVjb2RlZFN0cmluZ1RvQ2hhckNvZGVzOmZ1bmN0aW9uKGYpe2NvbnN0IGc9bmV3IFVpbnQ4QXJyYXkoZi5sZW5ndGgpOwpmb3IobGV0IGw9MDtsPGYubGVuZ3RoOysrbClnW2xdPWYuY2hhckNvZGVBdChsKTtyZXR1cm4gZ30saGFuZGxlSW1hZ2VVcGxvYWQ6ZnVuY3Rpb24oZil7dGhpcy5oYW5kbGVGaWxlU2VsZWN0KGYsdGhpcyl9LHVwbG9hZEltYWdlQ2xpY2tlZDpmdW5jdGlvbihmKXtmPXRoaXMuZ2V0RGF0YUZyb21FdmVudChmKTtjb25zdCBnPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgicGFwZXItaW5wdXQiKTtsZXQgbD1udWxsO2ZvcihsZXQgaz0wO2s8Zy5sZW5ndGg7aysrKWlmKGdba10uZGF0YUZlYXR1cmU9PWYuZmVhdHVyZSl7bD1nW2tdO2JyZWFrfWwmJmwucXVlcnlTZWxlY3RvcigiaW5wdXQiKS5jbGljaygpfSxoYW5kbGVGaWxlU2VsZWN0OmZ1bmN0aW9uKGYsZyl7Zi5zdG9wUHJvcGFnYXRpb24oKTtmLnByZXZlbnREZWZhdWx0KCk7Y29uc3QgbD1uZXcgRmlsZVJlYWRlcixrPWYuZGF0YVRyYW5zZmVyP2YuZGF0YVRyYW5zZmVyLmZpbGVzOmYudGFyZ2V0LmZpbGVzOwowIT09ay5sZW5ndGgmJihsLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCgpPT57Y29uc3QgbT1sLnJlc3VsdC5zdWJzdHJpbmcoK2wucmVzdWx0LmluZGV4T2YoImJhc2U2NCwiKSs3KTt2YXIgcD1nLmRlY29kZWRTdHJpbmdUb0NoYXJDb2RlcyhhdG9iKG0pKTtjb25zdCBxPWcuZ2V0RGF0YUZyb21FdmVudChmKSxyPWcuZ2V0RmVhdHVyZUZyb21EYXRhKHEpLHQ9Zy5nZXRWYWx1ZUxpc3RGcm9tRGF0YShxKTtpZihyKXt0WzBdPXA7ci5nZXRCeXRlc0xpc3QoKS5zZXRWYWx1ZUxpc3QodCk7KHA9Zy5nZXRKc29uVmFsdWVMaXN0KHEuZmVhdHVyZSxxLnNlcU51bSkpJiYocFswXT1tKTtjb25zdCB2PW5ldyBJbWFnZTtnLmFkZEltYWdlRWxlbWVudChxLmZlYXR1cmUsdik7di5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2cuZ2V0T25Mb2FkRm9ySW1hZ2UocS5mZWF0dXJlLHYpO3ZhciBBPWMuZXhlYyhxLmZlYXR1cmUpWzFdfHwiIjtjb25zdCB5PSJpbWFnZSIrQSsiL3dpZHRoIjsKQT0iaW1hZ2UiK0ErIi9oZWlnaHQiO2NvbnN0IHg9Zy5nZXRGZWF0dXJlVmFsdWVzKHksITEpLEM9Zy5nZXRGZWF0dXJlVmFsdWVzKEEsITEpOzA8eC5sZW5ndGgmJih4WzBdPSt2LndpZHRoLGcuZmVhdHVyZXMuZ2V0KHkpLmdldEludDY0TGlzdCgpLnNldFZhbHVlTGlzdCh4KSk7MDxDLmxlbmd0aCYmKENbMF09K3YuaGVpZ2h0LGcuZmVhdHVyZXMuZ2V0KEEpLmdldEludDY0TGlzdCgpLnNldFZhbHVlTGlzdChDKSk7Zy5leGFtcGxlQ2hhbmdlZCgpfSk7di5zcmM9bC5yZXN1bHR9fSwhMSksbC5yZWFkQXNEYXRhVVJMKGtbMF0pKX0sYWRkRHJhZ0Ryb3BCZWhhdmlvclRvQ2FudmFzOmZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGcobSl7bS5zdG9wUHJvcGFnYXRpb24oKTttLnByZXZlbnREZWZhdWx0KCk7bS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD0iY29weSJ9ZnVuY3Rpb24gbChtKXtrLmhhbmRsZUZpbGVTZWxlY3QobSxrKX1jb25zdCBrPXRoaXM7IXRoaXMucmVhZG9ubHkmJmYmJihmLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIiwKZywhMSksZi5hZGRFdmVudExpc3RlbmVyKCJkcm9wIixsLCExKSl9LGdldE9uTG9hZEZvckltYWdlOmZ1bmN0aW9uKGYsZyxsKXtjb25zdCBrPShtLHAscSk9Pntjb25zdCByPXRoaXMuJCQoIiMiK3RoaXMuZ2V0Q2FudmFzSWQobSxxKSk7cXx8dGhpcy5hZGREcmFnRHJvcEJlaGF2aW9yVG9DYW52YXMocik7aWYocCYmcil7Y29uc3QgdD1yLmdldENvbnRleHQoIjJkIik7bGV0IHY9dGhpcy5pbWFnZVNjYWxlUGVyY2VudGFnZS8xMDA7aWYoIXRoaXMuYWxsb3dJbWFnZUNvbnRyb2xzKXtsZXQgeD10aGlzLiQkKCIjIit0aGlzLmdldEltYWdlQ2FyZElkKG0scSkpLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgvMjsxNjx4JiYoeC09MTYpO3g8cC53aWR0aCYmKHY9eC9wLndpZHRoKX1yLndpZHRoPXAud2lkdGgqdjtyLmhlaWdodD1wLmhlaWdodCp2O2NvbnN0IEE9eD0+e3Quc2F2ZSgpO3QuY2xlYXJSZWN0KDAsMCxyLndpZHRoLHIuaGVpZ2h0KTt0LnRyYW5zbGF0ZSh4LngsCngueSk7dC5zY2FsZSh4LmsseC5rKTt0aGlzLnJlbmRlckltYWdlT25DYW52YXModCxyLndpZHRoLHIuaGVpZ2h0LG0scSk7dC5yZXN0b3JlKCl9LHk9ZDMuem9vbSgpLnNjYWxlRXh0ZW50KGQpLm9uKCJ6b29tIiwoKT0+e3RoaXMuYWRkSW1hZ2VUcmFuc2Zvcm0obSxkMy5ldmVudC50cmFuc2Zvcm0scSk7QShkMy5ldmVudC50cmFuc2Zvcm0pfSk7ZDMuc2VsZWN0KHIpLmNhbGwoeSkub24oImRibGNsaWNrLnpvb20iLCgpPT5kMy5zZWxlY3QocikuY2FsbCh5LnRyYW5zZm9ybSxkMy56b29tSWRlbnRpdHkpKTt0LnNhdmUoKTt0LnNjYWxlKHYsdik7dC5kcmF3SW1hZ2UocCwwLDApO3QucmVzdG9yZSgpO3RoaXMuc2V0SW1hZ2VEYXR1bSh0LHIud2lkdGgsci5oZWlnaHQsbSxxKTt0aGlzLnJlbmRlckltYWdlT25DYW52YXModCxyLndpZHRoLHIuaGVpZ2h0LG0scSk7cT90aGlzLmNvbXBhcmVJbWFnZUluZm9bbV0udHJhbnNmb3JtJiZBKHRoaXMuY29tcGFyZUltYWdlSW5mb1ttXS50cmFuc2Zvcm0pOgp0aGlzLmltYWdlSW5mb1ttXS50cmFuc2Zvcm0mJkEodGhpcy5pbWFnZUluZm9bbV0udHJhbnNmb3JtKX1lbHNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+ayhtLHAscSkpfTt0aGlzLmFkZEltYWdlRWxlbWVudChmLGcsbCk7dGhpcy5hZGRJbWFnZU9uTG9hZChmLGssbCk7cmV0dXJuIGsuYXBwbHkodGhpcyxbZixnLGxdKX0sYWRkSW1hZ2VPbkxvYWQ6ZnVuY3Rpb24oZixnLGwpe3RoaXMuaGFzSW1hZ2U9ITA7bD8odGhpcy5jb21wYXJlSW1hZ2VJbmZvW2ZdfHwodGhpcy5jb21wYXJlSW1hZ2VJbmZvW2ZdPXt9KSx0aGlzLmNvbXBhcmVJbWFnZUluZm9bZl0ub25sb2FkPWcpOih0aGlzLmltYWdlSW5mb1tmXXx8KHRoaXMuaW1hZ2VJbmZvW2ZdPXt9KSx0aGlzLmltYWdlSW5mb1tmXS5vbmxvYWQ9Zyl9LGFkZEltYWdlRGF0YTpmdW5jdGlvbihmLGcsbCl7bD8odGhpcy5jb21wYXJlSW1hZ2VJbmZvW2ZdfHwodGhpcy5jb21wYXJlSW1hZ2VJbmZvW2ZdPXt9KSx0aGlzLmNvbXBhcmVJbWFnZUluZm9bZl0uaW1hZ2VEYXRhPQpnKToodGhpcy5pbWFnZUluZm9bZl18fCh0aGlzLmltYWdlSW5mb1tmXT17fSksdGhpcy5pbWFnZUluZm9bZl0uaW1hZ2VEYXRhPWcpfSxhZGRJbWFnZUVsZW1lbnQ6ZnVuY3Rpb24oZixnLGwpe2w/KHRoaXMuY29tcGFyZUltYWdlSW5mb1tmXXx8KHRoaXMuY29tcGFyZUltYWdlSW5mb1tmXT17fSksdGhpcy5jb21wYXJlSW1hZ2VJbmZvW2ZdLmltYWdlRWxlbWVudD1nKToodGhpcy5pbWFnZUluZm9bZl18fCh0aGlzLmltYWdlSW5mb1tmXT17fSksdGhpcy5pbWFnZUluZm9bZl0uaW1hZ2VFbGVtZW50PWcpfSxhZGRJbWFnZUdyYXlzY2FsZURhdGE6ZnVuY3Rpb24oZixnKXt0aGlzLmltYWdlSW5mb1tmXXx8KHRoaXMuaW1hZ2VJbmZvW2ZdPXt9KTt0aGlzLmltYWdlSW5mb1tmXS5pbWFnZUdyYXlzY2FsZURhdGE9Z30sYWRkSW1hZ2VUcmFuc2Zvcm06ZnVuY3Rpb24oZixnLGwpe2w/KHRoaXMuY29tcGFyZUltYWdlSW5mb1tmXXx8KHRoaXMuY29tcGFyZUltYWdlSW5mb1tmXT17fSksdGhpcy5jb21wYXJlSW1hZ2VJbmZvW2ZdLnRyYW5zZm9ybT0KZyk6KHRoaXMuaW1hZ2VJbmZvW2ZdfHwodGhpcy5pbWFnZUluZm9bZl09e30pLHRoaXMuaW1hZ2VJbmZvW2ZdLnRyYW5zZm9ybT1nKX0sc2V0SW1hZ2VEYXR1bTpmdW5jdGlvbihmLGcsbCxrLG0pe2lmKGcmJmwmJihmPWYuZ2V0SW1hZ2VEYXRhKDAsMCxnLGwpLGY9VWludDhDbGFtcGVkQXJyYXkuZnJvbShmLmRhdGEpLHRoaXMuYWRkSW1hZ2VEYXRhKGssZixtKSx0aGlzLnNhbGllbmN5JiZ0aGlzLnNob3dTYWxpZW5jeSYmdGhpcy5zYWxpZW5jeVtrXSYmIW0pKXttPVVpbnQ4Q2xhbXBlZEFycmF5LmZyb20oZik7Zm9yKGc9MDtnPGYubGVuZ3RoO2crPTQpbD0oZltnXStmW2crMV0rZltnKzJdKS8zLG1bZ109bCxtW2crMV09bCxtW2crMl09bDt0aGlzLmFkZEltYWdlR3JheXNjYWxlRGF0YShrLG0pfX0sY29udHJhc3RJbWFnZTpmdW5jdGlvbihmLGcsbCl7Zz1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbbC0uNS1nLzIsbC0uNSsoZy0xKS8yXSkuY2xhbXAoITApLnJhbmdlKFswLDI1NV0pOwpmb3IobD0wO2w8Zi5sZW5ndGg7bCsrKTMhPT1sJTQmJihmW2xdPWcoZltsXSkpfSxzaG93U2FsaWVuY3lGb3JWYWx1ZTpmdW5jdGlvbihmKXtyZXR1cm4gTWF0aC5hYnMoZik+PU1hdGguYWJzKDA8PWY/dGhpcy5tYXhTYWw6dGhpcy5taW5TYWwpKnRoaXMuc2FsaWVuY3lDdXRvZmYvMTAwfSxnZXRDb2xvckZvclNhbGllbmN5OmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLnNob3dTYWxpZW5jeUZvclZhbHVlKGYpP3RoaXMuY29sb3JzKGYpOiIjZmZmIn0sYWRkU2FsaWVuY3lUb0ltYWdlOmZ1bmN0aW9uKGYsZyl7QXJyYXkuaXNBcnJheShnKSYmMDxnLmxlbmd0aCYmQXJyYXkuaXNBcnJheShnWzBdKSYmKGc9Z1t0aGlzLnNlcU51bWJlcl0pO2NvbnN0IGw9MS9NYXRoLnBvdyh0aGlzLmltYWdlU2NhbGVQZXJjZW50YWdlLzEwMCwyKTtmb3IobGV0IG09MDttPGYubGVuZ3RoO20rPTQpe3ZhciBrPU1hdGguZmxvb3IobS80KmwpO2s9QXJyYXkuaXNBcnJheShnKT9nLmxlbmd0aD5rP2dba106CjA6Zztjb25zdCBwPS41Kih0aGlzLnNob3dTYWxpZW5jeUZvclZhbHVlKGspPzA8PWs/MD09PXRoaXMubWF4U2FsPzA6ay90aGlzLm1heFNhbDprL3RoaXMubWluU2FsOjApLHtyOnEsZzpyLGI6dH09ZDMucmdiKDA8az8iIzAwN0I4MyI6IiNGRjg0N0MiKTtmW21dPWZbbV0qKDEtcCkrcSpwO2ZbbSsxXT1mW20rMV0qKDEtcCkrcipwO2ZbbSsyXT1mW20rMl0qKDEtcCkrdCpwfX0scmVuZGVySW1hZ2VPbkNhbnZhczpmdW5jdGlvbihmLGcsbCxrLG0pe2lmKGcmJmwpe3ZhciBwPWYuZ2V0SW1hZ2VEYXRhKDAsMCxnLGwpO20/cC5kYXRhLnNldCh0aGlzLmNvbXBhcmVJbWFnZUluZm9ba10uaW1hZ2VEYXRhKTpwLmRhdGEuc2V0KHRoaXMuc2FsaWVuY3kmJnRoaXMuc2hvd1NhbGllbmN5JiZ0aGlzLnNhbGllbmN5W2tdP3RoaXMuaW1hZ2VJbmZvW2tdLmltYWdlR3JheXNjYWxlRGF0YTp0aGlzLmltYWdlSW5mb1trXS5pbWFnZURhdGEpOzI1Nj09PXRoaXMud2luZG93V2lkdGgmJjEyOD09PQp0aGlzLndpbmRvd0NlbnRlcnx8dGhpcy5jb250cmFzdEltYWdlKHAuZGF0YSx0aGlzLndpbmRvd1dpZHRoLHRoaXMud2luZG93Q2VudGVyKTshbSYmdGhpcy5zYWxpZW5jeSYmdGhpcy5zaG93U2FsaWVuY3kmJnRoaXMuc2FsaWVuY3lba10mJnRoaXMuYWRkU2FsaWVuY3lUb0ltYWdlKHAuZGF0YSx0aGlzLnNhbGllbmN5W2tdKTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2sud2lkdGg9ZztrLmhlaWdodD1sO2suZ2V0Q29udGV4dCgiMmQiKS5wdXRJbWFnZURhdGEocCwwLDApO2YuY2xlYXJSZWN0KDAsMCxnLGwpO2YuZHJhd0ltYWdlKGssMCwwKX19LHNob3dTYWxDaGVja2JveENoYW5nZTpmdW5jdGlvbigpe3RoaXMuc2hvd1NhbGllbmN5PXRoaXMuJC5zYWxDaGVja2JveC5jaGVja2VkfSx1cGRhdGVJbWFnZXM6ZnVuY3Rpb24oKXtmb3IoY29uc3QgZiBpbiB0aGlzLmltYWdlSW5mbylpZih0aGlzLmltYWdlSW5mby5oYXNPd25Qcm9wZXJ0eShmKSl0aGlzLmltYWdlSW5mb1tmXS5vbmxvYWQoZiwKdGhpcy5pbWFnZUluZm9bZl0uaW1hZ2VFbGVtZW50KX0sc2hvdWxkU2hvd0ltYWdlQ29udHJvbHM6ZnVuY3Rpb24oZixnKXtyZXR1cm4gZiYmZ30sc2hvdWxkRW5hYmxlQWRkRmVhdHVyZTpmdW5jdGlvbihmKXtyZXR1cm4gMDxmLmxlbmd0aH0sZ2V0RGVsZXRlVmFsdWVCdXR0b25DbGFzczpmdW5jdGlvbihmLGcpe3JldHVybiBmfHwhZz8iZGVsZXRlLXZhbHVlLWJ1dHRvbiBkZWxldGUtdmFsdWUtYnV0dG9uLWhpZGRlbiI6ImRlbGV0ZS12YWx1ZS1idXR0b24ifSxnZXREZWxldGVGZWF0dXJlQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oZil7cmV0dXJuIGY/ImhpZGUtY29udHJvbHMiOiJkZWxldGUtZmVhdHVyZS1idXR0b24ifSxnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzOmZ1bmN0aW9uKGYpe3JldHVybiBmPyJoaWRlLWNvbnRyb2xzIjoiYWRkLXZhbHVlLWJ1dHRvbiJ9LGdldEFkZEZlYXR1cmVCdXR0b25DbGFzczpmdW5jdGlvbihmKXtyZXR1cm4gZj8iaGlkZS1jb250cm9scyI6ImFkZC1mZWF0dXJlLWJ1dHRvbiJ9LApnZXRVcGxvYWRJbWFnZUNsYXNzOmZ1bmN0aW9uKGYpe3JldHVybiBmPyJoaWRlLWNvbnRyb2xzIjoidXBsb2FkLWltYWdlLWJ1dHRvbiJ9LGRlY29kZUJ5dGVzTGlzdFRvU3RyaW5nOmZ1bmN0aW9uKGYpe2xldCBnPSIiLGw7Zm9yKGw9MDtsPGYubGVuZ3RoLzE2Mzg0O2wrKylnKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZi5zbGljZSgxNjM4NCpsLDE2Mzg0KihsKzEpKSk7cmV0dXJuIGcrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmLnNsaWNlKDE2Mzg0KmwpKX19KX0pKHFxfHwocXE9e30pKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtaW50ZXJhY3RpdmUtaW5mZXJlbmNlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGlkPSJsaW50ZXItcGFwZXItYnV0dG9uLXN0eWxlIj4KICAgICAgLyoqCiAgICAgICAqIFRoaXMgc3R5bGUgcHJlc2VydmVzIHRoZSBzdHlsaW5nIHByZXZpb3VzIHRvCiAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyRWxlbWVudHMvcGFwZXItYnV0dG9uL3B1bGwvMTE1CiAgICAgICAqIFRoaXMgY2hhbmdlIGNhbiBicmVhayB0aGUgbGF5b3V0IG9mIHBhcGVyLWJ1dHRvbiBjb250ZW50LgogICAgICAgKiBSZW1vdmUgdGhpcyBzdHlsZSB0byBhcHBseSB0aGUgY2hhbmdlLCBtb3JlIGRldGFpbHMgYXQgYi83MDUyODM1Ni4KICAgICAgICovCiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgJ05vdG8nLCBzYW5zLXNlcmlmOwogICAgICAgIC0tcGFwZXItdGFiLWluazogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICAgIC0td2l0LWNvbG9yLWdyYXkzMDA6ICNkYWRjZTA7CiAgICAgIH0KCiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgICNjbGFzc2lmaWNhdGlvbiB7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgfQoKICAgICAgLmV4YW1wbGUtaG9sZGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmluZmVyZW5jZS1zZWN0aW9uLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW4tdG9wOiA2cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA2cHg7CiAgICAgIH0KCiAgICAgIC5pbmZlcmVuY2Utc2VjdGlvbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICB9CgogICAgICAuaW5mZXJlbmNlLXZpZXdlciB7CiAgICAgICAgbWF4LWhlaWdodDogMzUlOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgLmNvbXBhcmUtaW5mZXJlbmNlLXZpZXdlciB7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgIH0KCiAgICAgIC50Zi1vcHRpb24tc2VsZWN0b3ItMCAuY29udGVudC13cmFwcGVyLnRmLW9wdGlvbi1zZWxlY3RvciA+ICogewogICAgICAgIHdpZHRoOiA0MCU7CiAgICAgIH0KCiAgICAgICNzcGlubmVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA5NXB4OwogICAgICAgIGxlZnQ6IDEwcHg7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KCiAgICAgIC5ub2V4YW1wbGVzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA3NXB4OwogICAgICAgIGxlZnQ6IDMwcHg7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmluZm8tdGV4dCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjI1cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luOiAxMnB4IGF1dG87CiAgICAgIH0KCiAgICAgIC5wZC1pbmZvLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgICBwYWRkaW5nLXRvcDogMTJweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMnB4OwogICAgICB9CgogICAgICAucGQtbm8tZmVhdHVyZXMtdGV4dCB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIHBhZGRpbmc6IDEycHggNDhweDsKICAgICAgfQoKICAgICAgLmFjY2VwdC1idXR0b24taG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfQoKICAgICAgLnNldHRpbmdzLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAuZGF0YXBvaW50LXJpZ2h0LWNvbnRyb2xzLWhvbGRlciAuY29udHJvbCB7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW46IDEwcHggMCAwIDA7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKICAgICAgfQoKICAgICAgLmlucHV0LWFuZC10b29sdGlwIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAubGFiZWwtdm9jYWItcGF0aC1pbnB1dCB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAudGhyZXNob2xkLWRyb3Bkb3duIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5jb3VudGVyZmFjdHVhbC1kcm9wZG93biB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICBtaW4td2lkdGg6IDUwcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogNXB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgfQoKICAgICAgLmZhY2V0LWxhYmVsIHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci11bmRlcmxpbmU6IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLnNsaWRlciB7CiAgICAgICAgd2lkdGg6IDI4MHB4OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWlucHV0OiB7CiAgICAgICAgICB3aWR0aDogODBweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbW9kZWwtb25lIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiAjMTJiNWNlOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogIzEyYjVjZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1tb2RlbC10d28gewogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6ICNmYTc4MTc7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiAjZmE3ODE3OwogICAgICB9CgogICAgICAucHItbGluZS1jaGFydCB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDI4MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgcGFwZXItZGlhbG9nLmluZmVyZW5jZS1zZXR0aW5ncyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICB3aWR0aDogNDAlOwogICAgICAgIG1heC13aWR0aDogNDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgfQoKICAgICAgLmRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICB3aWR0aDogNjAlOwogICAgICB9CgogICAgICAuc2lkZS1ob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogNDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5zaWRlLWNvbnRlbnQgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAxMHB4KTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5zaWRlLXRhYnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA1MHB4KTsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC10YWIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC5jb25maWctdGFiIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuY29uZmlnLXNpZGUtY29udGVudCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgLmNvbmZpZy1tYWluLWNvbnRlbnQgewogICAgICAgIHdpZHRoOiA3MCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGJhY2tncm91bmQ6ICNmOGY5ZmE7CiAgICAgIH0KCiAgICAgIC5zdGF0cy10YWIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC5wZC10YWIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgICB9CgogICAgICAucGQtcGxvdHMtaGVhZGVyIHsKICAgICAgICBoZWlnaHQ6IDUycHg7CiAgICAgICAgbWluLWhlaWdodDogNTJweDsKICAgICAgICBtYXgtaGVpZ2h0OiA1MnB4OwogICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDJweCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5wZHBsb3RzLWhvbGRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG92ZXJmbG93LXk6IG92ZXJsYXk7CiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgICAgfQoKICAgICAgLnBkLXJhbmdlLWh5cGhlbiB7CiAgICAgICAgcGFkZGluZy1yaWdodDogNnB4OwogICAgICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIC5wZC1yYW5nZS1jb250cm9sIHsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2ZjYzkzNDsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKICAgICAgICBoZWlnaHQ6IDM2cHg7CiAgICAgICAgd2lkdGg6IDEwNHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogNnB4OwogICAgICB9CgogICAgICAjb3ZlcnZpZXcgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuaW5mZXJlbmNlLWhlYWRlci5oZWFkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTRmN2ZiOwogICAgICB9CgogICAgICAucmlnaHQtc2lkZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIHsKICAgICAgICBtYXJnaW46IDRweDsKICAgICAgfQoKICAgICAgdGYtY29uZnVzaW9uLW1hdHJpeCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5jb25mLW1hdHJpeC1ob2xkZXIgewogICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMThweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5jb25mLW1hdHJpeCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMThweDsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1jb250cm9scy1ob2xkZXIuZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9ucy1ob2xkZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CgogICAgICAuZGF0YXBvaW50LWNvbnRyb2xzLWhvbGRlci5kYXRhcG9pbnQtY29udHJvbC1zZWFyY2gtaG9sZGVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5kYXRhcG9pbnQtY29udHJvbHMtaG9sZGVyIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBtYXJnaW4tbGVmdDogMXB4OwogICAgICB9CgogICAgICAuZGF0YXBvaW50LWxlZnQtY29udHJvbHMtaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1yaWdodC1jb250cm9scy1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC50Zi1jYXRlZ29yeS1wYW5lIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC50Zi1jYXRlZ29yeS1wYW5lLWNvbnRlbnQgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgfQoKICAgICAgOmhvc3QgdnotbGluZS1jaGFydDIgewogICAgICAgIG1hcmdpbjogMTJweCAxMnB4IDEycHggMjRweDsKICAgICAgICBoZWlnaHQ6IDE4MHB4OwogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IHZ6LWJhci1jaGFydCB7CiAgICAgICAgbWFyZ2luOiAxMnB4IDEycHggMTJweCAyNHB4OwogICAgICAgIGhlaWdodDogMjQwcHg7CiAgICAgICAgd2lkdGg6IDQ1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLnBkLWlucHV0LWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIHBhZGRpbmc6IDEycHggNDhweCAyNHB4IDI0cHg7CiAgICAgICAgYmFja2dyb3VuZDogI2ZlZjdlMDsKICAgICAgICBib3JkZXI6IHNvbGlkIDFweCAjZmRlMjkzOwogICAgICB9CgogICAgICAuc3R5bGUtaW5wdXQgewogICAgICAgIHdpZHRoOiA1MHB4OwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICB9CgogICAgICAuZmVhdHVyZS1jb250YWluZXItaG9sZGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAuZGF0YXBvaW50LWNvbnRyb2wtZmlsdGVyLWlucHV0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgbWF4LXdpZHRoOiA2MCU7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDRweCA2cHggMnB4IDRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICM4MDg2OGI7CiAgICAgICAgfQogICAgICB9CgogICAgICAuZGF0YXBvaW50LWNvbnRyb2wtZmlsdGVyLWlucHV0IGlyb24taWNvbiB7CiAgICAgICAgY29sb3I6ICM5YmEwYTY7CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLXNlYXJjaC1pbnB1dCB7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLW9yYW5nZS1kYXJrKTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNDsKICAgICAgfQoKICAgICAgLm1haW4tYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2UtZGFyayk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgfQoKICAgICAgLm1haW4tYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTsKICAgICAgICBjb2xvcjogZ3JheTsKICAgICAgfQoKICAgICAgLm9wdGltaXplLXRocmVzaG9sZC1idXR0b24gewogICAgICAgIG1hcmdpbjogNXB4IDA7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNnB4OwogICAgICB9CgogICAgICAuY2xvc2UtcGFydGlhbC1kZXBzLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiAxMHB4OwogICAgICB9CgogICAgICBwYXBlci10YWJzIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2UtZGFyayk7CiAgICAgIH0KCiAgICAgIHBhcGVyLXRhYiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjFweDsKICAgICAgfQoKICAgICAgcGFwZXItdGFiOm5vdCguaXJvbi1zZWxlY3RlZCkgewogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICB9CgogICAgICBwYXBlci10YWIuaXJvbi1zZWxlY3RlZCB7CiAgICAgICAgY29sb3I6ICMyMDIxMjQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmN1cnZlcy1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuY3VydmUtaG9sZGVyIHsKICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgaGVpZ2h0OiAyMzVweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMjBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5yb2MteC1sYWJlbCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAxMjBweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CgogICAgICAucm9jLXktbGFiZWwgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAtMzZweDsKICAgICAgICBib3R0b206IDExMHB4OwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgfQoKICAgICAgLnByLXgtbGFiZWwgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMTQwcHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgfQoKICAgICAgLnByLXktbGFiZWwgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAtMTRweDsKICAgICAgICBib3R0b206IDExMHB4OwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgfQoKICAgICAgLmZsZXggewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5zcGFjZS1iZXR3ZWVuIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5mbGV4LXdyYXAgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAub3B0aW1pemUtdGV4dCB7CiAgICAgICAgbWFyZ2luOiA1cHggMDsKICAgICAgICBjb2xvcjogZ3JleTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC50aHJlc2hvbGQtY29zdC1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNnB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGNvbG9yOiAjODA4NjhiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmJvbGQgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5pbmRlbnQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CgogICAgICAuZmVhdHVyZS1icmVha2Rvd24gewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMnB4OwogICAgICB9CgogICAgICAub3B0aW1pemUtc2VsZWN0aW9uLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAucmVnLXRhYmxlLWNhdGVnb3J5IHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAucmVnLXRhYmxlLXZhbHVlIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1YmZlYXR1cmUtdGFibGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CgogICAgICAuY291bnRlcmZhY3R1YWwtYnV0dG9uLWludHJvIHsKICAgICAgICBwYWRkaW5nOiA3cHggMCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC5tYWluLXZlcnRpY2FsIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm1haW4tYm90dG9tLWJhciB7CiAgICAgICAgaGVpZ2h0OiA1MnB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDUycHg7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgLyogYm94LXNoYWRvdzogMCAycHggNXB4IGdyZXk7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogM3B4OyAqLwogICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjZGFkY2UwOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLm1haW4tY29udGVudCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuZGlzdC1zd2l0Y2ggewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQoKICAgICAgLmRpc3RhbmNlLXZpcy1kcm9wZG93biB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQoKICAgICAgI2Rpc3RhbmNlZGlhbG9nIHsKICAgICAgICB3aWR0aDogMzAlOwogICAgICB9CgogICAgICAjZGlzdGFuY2VkaWFsb2cgLmJ1dHRvbnMgewogICAgICAgIGNvbG9yOiAjZjU3YzAwOwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yOiAjM2M0MDQzOwogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1pbmstY29sb3I6ICMzYzQwNDM7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvcjogIzNjNDA0MzsKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvcjogIzNjNDA0MzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiAjOWFhMGE2OwogICAgICB9CgogICAgICAucmVzaXplciB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA4cHg7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLmV4YW1wbGUtc3RhdHVzIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHBhZGRpbmctdG9wOiAyMHB4OwogICAgICB9CgogICAgICAuZXhhbXBsZS1pZC1sYWJlbCB7CiAgICAgICAgcGFkZGluZzogOXB4IDVweCA5cHggMDsKICAgICAgfQoKICAgICAgLmV4YW1wbGUtaWQtaW5wdXQgewogICAgICAgIHdpZHRoOiA3MHB4OwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nLWFuZC1jYXJkIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICAgIHBhZGRpbmctdG9wOiAxcHg7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItaGVhZGluZy1hbmQtY2FyZCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdy15OiBvdmVybGF5OwogICAgICB9CgogICAgICAuaGVhZGluZyB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDEwcHggOHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWY3ZTA7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5jYXJkIHsKICAgICAgICBwYWRkaW5nOiAwIDEwcHggNXB4OwogICAgICB9CgogICAgICAubm8tcGFkZGluZy1jYXJkIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9vbHRpcCB7CiAgICAgICAgLS1wYXBlci10b29sdGlwOiB7CiAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQ6IDIwMDBtczsKICAgICAgfQoKICAgICAgLmNvbW1lbnQtaWNvbiB7CiAgICAgICAgd2lkdGg6IDMwcHg7CiAgICAgICAgaGVpZ2h0OiAzMHB4OwogICAgICAgIG1pbi13aWR0aDogMzBweDsKICAgICAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLW9yYW5nZS1kYXJrKTsKICAgICAgfQoKICAgICAgLmFycm93LWljb24gewogICAgICAgIHdpZHRoOiA1MHB4OwogICAgICAgIGhlaWdodDogNTBweDsKICAgICAgICBtaW4td2lkdGg6IDUwcHg7CiAgICAgICAgbWluLWhlaWdodDogNTBweDsKICAgICAgICBjb2xvcjogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICB9CgogICAgICAucGQtYXJyb3ctaWNvbiB7CiAgICAgICAgd2lkdGg6IDQwcHg7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgIG1pbi13aWR0aDogNDBweDsKICAgICAgICBtaW4taGVpZ2h0OiA0MHB4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgICBjb2xvcjogZ3JleTsKICAgICAgfQoKICAgICAgLnBkLXRvZ2dsZSB7CiAgICAgICAgbWFyZ2luOiAwIDhweCAwIDIwcHg7CiAgICAgIH0KCiAgICAgIC5wZC1lbnRyeS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5pbmZvLWljb24gewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBtaW4td2lkdGg6IDIwcHg7CiAgICAgICAgbWluLWhlaWdodDogMjBweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGNvbG9yOiBncmV5OwogICAgICB9CgogICAgICAuaW5mby1pY29uLmNmLWluZm8taWNvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgfQoKICAgICAgLmluZm8taWNvbi50aHJlc2gtaW5mby1pY29uIHsKICAgICAgICBtYXJnaW4tdG9wOiAtM3B4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC5pbmZvLWljb24ucGQtaW5mby1pY29uIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CgogICAgICAuaW5mby1pY29uLnRocmVzaG9sZC1pbmZvLWljb24gewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgICB9CgogICAgICAuaW5mby1pY29uLnBlcmZvcm1hbmNlLWluZm8taWNvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMThweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5uby1wYWRkaW5nIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAucmVzaXplLWljb24gewogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBjb2xvcjogZ3JleTsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgICAgbWluLXdpZHRoOiAxMHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLXRleHQgewogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwMHB4OwogICAgICB9CgogICAgICAuaGVscC10aXRsZSB7CiAgICAgICAgY29sb3I6ICMwMDdiN2M7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgfQoKICAgICAgLmhlbHAtdGl0bGUtbWFyZ2luIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNHB4OwogICAgICB9CgogICAgICAuaGVscC10aXRsZS1tYXJnaW4tYnV0dG9uIHsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLXRpdGxlLW1hcmdpbi10aXRsZSB7CiAgICAgICAgbWFyZ2luLXRvcDogN3B4OwogICAgICB9CgogICAgICAuZGlhbG9nLWxpbmsgewogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAucm9jLXRleHQgewogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBtYXJnaW4tbGVmdDogNDRweDsKICAgICAgfQoKICAgICAgLmNvbmYtdGV4dCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctdGV4dCB7CiAgICAgICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAudGl0bGUtd2lkdGggewogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OwogICAgICB9CgogICAgICAuZGF0YXBvaW50LWluZm8taG9sZGVyIHsKICAgICAgICBtYXJnaW46IDI0cHggYXV0bzsKICAgICAgICBtYXgtd2lkdGg6IDM4MHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5vbmJvYXJkaW5nLWhlYWRlciB7CiAgICAgICAgY29sb3I6ICMyMDIxMjQ7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI4cHg7CiAgICAgIH0KCiAgICAgIC5vbmJvYXJkaW5nLXRleHQgewogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICB9CgogICAgICAuY29udHJvbC1pbmZvLWhlYWRlciB7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY29udHJvbC1pbmZvLXRleHQgewogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICAgIG1heC13aWR0aDogNDYwcHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24tcHJlZml4LWxhYmVsIHsKICAgICAgICBtYXJnaW46IDEycHggMCAwIDEycHg7CiAgICAgICAgY29sb3I6IGdyZXk7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICAuYm9yZGVyLXJpZ2h0IHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRpYWxvZyB7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICBtYXgtd2lkdGg6IDYwMHB4OwogICAgICB9CgogICAgICAubWFpbi1idXR0b24ucnVuLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgLmRvYy1pbWFnZSB7CiAgICAgICAgd2lkdGg6IDEyOHB4OwogICAgICAgIGhlaWdodDogOTZweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWRpdmlkZXIgewogICAgICAgIG1hcmdpbjogNXB4IDAgNXB4IDVweDsKICAgICAgICB3aWR0aDogNXB4OwogICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICB9CgogICAgICAub3B0aW1pemF0aW9uLXJhZGlvIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA3cHg7CiAgICAgIH0KCiAgICAgIC5vcHRpbWl6YXRpb24tcmFkaW8tZ3JvdXAgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5pbmZlci1pbmZvIHsKICAgICAgICBtYXJnaW4tbGVmdDogMzBweDsKICAgICAgfQoKICAgICAgLnNjcm9sbC14IHsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAucGVyZi10YWJsZS1jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnBlcmYtdGFibGUtdGl0bGUtcm93IHsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgbWluLWhlaWdodDogNTJweDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtdGl0bGUgewogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLXNvcnQtbWVudSB7CiAgICAgICAgbWFyZ2luLXRvcDogLTEwcHg7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAjODA4NjhiOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogMTZweDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4yNTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgbWluLWhlaWdodDogbWluLWNvbnRlbnQ7CiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDRweDsKICAgICAgfQoKICAgICAgLnBlcmYtdGFibGUtZW50cmllcy1ob2xkZXIgewogICAgICAgIG92ZXJmbG93LXk6IG92ZXJsYXk7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAucGVyZi10YWJsZS1lbnRyeSB7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLWVudHJ5LWV4cGFuZGVkIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBtYXJnaW46IDAgMTJweDsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLnBlcmYtdGFibGUtcm93IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLnBlcmYtdGFibGUtcm93LWV4cGFuZGVkIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSg2MCwgNjQsIDY3LCAwLjMpLAogICAgICAgICAgMCAxcHggM3B4IDFweCByZ2JhKDYwLCA2NCwgNjcsIDAuMTUpOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLnBlcmYtdGFibGUtdGV4dC1lbnRyeSB7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgIHBhZGRpbmctdG9wOiAxNnB4OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLW51bS1lbnRyeSB7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgIHBhZGRpbmctdG9wOiAxNnB4OwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLWFycm93IHsKICAgICAgICBtaW4td2lkdGg6IDQwcHg7CiAgICAgICAgd2lkdGg6IDQwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogOHB4OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLXZhbCB7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1jb3VudCB7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtbW9kZWwgewogICAgICAgIG1pbi13aWR0aDogMTAwcHg7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLW1vZGVsLXNpbmdsZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAucGVyZi10YWJsZS10aHJlc2hvbGQgewogICAgICAgIHdpZHRoOiAyODBweDsKICAgICAgICBtaW4td2lkdGg6IDI4MHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1lcnJvciB7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1zcS1lcnJvciB7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtZnAgewogICAgICAgIHdpZHRoOiAxNSU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtZm4gewogICAgICAgIHdpZHRoOiAxNSU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtYWNjIHsKICAgICAgICB3aWR0aDogMTUlOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1hcmdpbi1yaWdodDogMjBweDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1mMSB7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgIH0KICAgICAgLnBlcmYtYnV0dG9uIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAucGVyZi1zb3J0LWJveCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KICAgICAgLmNvdW50ZXJmYWN0dWFsLXRvZ2dsZSB7CiAgICAgICAgbWFyZ2luOiA0cHggNHB4IDRweCA2cHg7CiAgICAgICAgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyLWNvbG9yOiAjODFjOTk1OwogICAgICB9CiAgICAgIC5kYXRhcG9pbnQtYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIwMjEyNDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmRlMjkzOwogICAgICB9CiAgICAgIC5pbmZlci1idXR0b24gewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTI4ZWFmOwogICAgICB9CiAgICAgIC5mbGV4LWdyb3cgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuZmxleC1yb3ctcmV2ZXJzZSB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CiAgICAgIC50aHJlc2hvbGQtaW5mby1ob2xkZXIgewogICAgICAgIG1hcmdpbi10b3A6IC0ycHg7CiAgICAgIH0KICAgICAgLnRhYnMgewogICAgICAgIHBhZGRpbmctbGVmdDogMzJweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgfQogICAgICAucm90YXRlZC1pY29uIHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgICB9CiAgICAgIC5kYXRhcG9pbnQtY29udHJvbC1idXR0b24gewogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CiAgICAgIC5wZC1ob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgIH0KICAgICAgLnBkLXktbGFiZWwgewogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBsZWZ0OiAtMjBweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogODBweDsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgICB9CiAgICAgIC5wZC14LWxhYmVsIHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZzogMCAwIDAgNDBweDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgICAgcGFwZXItdG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLWNvbG9yOiAjM2M0MDQzOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLXBsdWdpbi1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtcGx1Z2luLWRpYWxvZz4KICAgIDxwYXBlci1kaWFsb2cgaWQ9ImluZmVyZW5jZXNldHRpbmdzIiBjbGFzcz0iaW5mZXJlbmNlLXNldHRpbmdzIiBvcGVuZWQ9IltbIWxvY2FsXV0iPgogICAgICA8dGYtaW5mZXJlbmNlLXBhbmVsIGluZmVyZW5jZS1hZGRyZXNzPSJ7e2luZmVyZW5jZUFkZHJlc3N9fSIgbW9kZWwtbmFtZT0ie3ttb2RlbE5hbWV9fSIgZXhhbXBsZXMtcGF0aD0ie3tleGFtcGxlc1BhdGh9fSIgbW9kZWwtdHlwZT0ie3ttb2RlbFR5cGV9fSIgbW9kZWwtdmVyc2lvbj0ie3ttb2RlbFZlcnNpb259fSIgbW9kZWwtc2lnbmF0dXJlPSJ7e21vZGVsU2lnbmF0dXJlfX0iIG1heC1leGFtcGxlcz0ie3ttYXhFeGFtcGxlc319IiBsYWJlbC12b2NhYi1wYXRoPSJ7e2xhYmVsVm9jYWJQYXRofX0iIG11bHRpLWNsYXNzPSJ7e211bHRpQ2xhc3N9fSIgc2FtcGxpbmctb2Rkcz0ie3tzYW1wbGluZ09kZHN9fSIgc2VxdWVuY2UtZXhhbXBsZXM9Int7c2VxdWVuY2VFeGFtcGxlc319IiBtYXgtY2xhc3Nlcy10by1kaXNwbGF5PSJ7e21heEluZmVyZW5jZUVudHJpZXNQZXJSdW59fSIgdXNlLXByZWRpY3QtYXBpPSJ7e3VzZVByZWRpY3RBcGl9fSIgcHJlZGljdC1vdXRwdXQtdGVuc29yPSJ7e3ByZWRpY3RPdXRwdXRUZW5zb3J9fSIgcHJlZGljdC1pbnB1dC10ZW5zb3I9Int7cHJlZGljdElucHV0VGVuc29yfX0iPgogICAgICA8L3RmLWluZmVyZW5jZS1wYW5lbD4KICAgICAgPGRpdiBjbGFzcz0iYWNjZXB0LWJ1dHRvbi1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJnZXRFeGFtcGxlc0FuZENsb3NlU2V0dGluZ3NfIiBjbGFzcz0ibWFpbi1idXR0b24iIGRpc2FibGVkJD0iW1tzaG91bGREaXNhYmxlR2V0RXhhbXBsZXNCdXR0b25fKGV4YW1wbGVzUGF0aCwgbWF4RXhhbXBsZXMpXV0iPgogICAgICAgICAgQWNjZXB0CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctZGlzbWlzcyBjbGFzcz0iY29udHJvbC1idXR0b24iPkNhbmNlbDwvcGFwZXItYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGVsZXRlZGlhbG9nIj4KICAgICAgPHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgc2VsZWN0ZWQgZGF0YXBvaW50PwogICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGRpYWxvZy1kaXNtaXNzIGNsYXNzPSJjb250cm9sLWJ1dHRvbiI+Q2FuY2VsPC9wYXBlci1idXR0b24+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctY29uZmlybSBhdXRvZm9jdXMgb24tdGFwPSJkZWxldGVEYXRhcG9pbnRfIiBjbGFzcz0ibWFpbi1idXR0b24iPkRlbGV0ZTwvcGFwZXItYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGlzdGFuY2VkaWFsb2ciPgogICAgICA8aDI+U2hvdyBzaW1pbGFyaXR5IHRvIHNlbGVjdGVkIGRhdGFwb2ludDwvaDI+CiAgICAgIDxwYXBlci1pbnB1dCB2YWx1ZT0ie3tmYWNldERpc3RGZWF0dXJlTmFtZX19IiBsYWJlbD0iTWV0cmljIG5hbWUiIGNsYXNzPSJkYXRhcG9pbnQtY29udHJvbC1maWx0ZXItaW5wdXQiPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGNsYXNzPSJyYWRpb2xhYmVsIj5EaXN0YW5jZSB0eXBlPC9kaXY+CiAgICAgIDxwYXBlci1yYWRpby1ncm91cCBjbGFzcz0iZGlzdC1zd2l0Y2giIHNlbGVjdGVkPSJ7e2ZhY2V0RGlzdFN3aXRjaH19Ij4KICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGNsYXNzPSJkaXN0LXJhZGlvIiBuYW1lPSJMMSI+TDE8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGNsYXNzPSJkaXN0LXJhZGlvIiBuYW1lPSJMMiI+TDI8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkFwcGx5IHRvIGRhdGFwb2ludHMgdmlzdWFsaXphdGlvbiIgY2xhc3M9InRocmVzaG9sZC1kcm9wZG93biBkaXN0YW5jZS12aXMtZHJvcGRvd24iPgogICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2ZhY2V0RGlzdFNldHRpbmd9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iY29sb3JCeSI+Q29sb3IgQnk8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuYW1lPSJob3Jpem9udGFsRmFjZXQiPlgtQXhpcyBCaW5uaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0idmVydGljYWxGYWNldCI+WS1BeGlzIEJpbm5pbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuYW1lPSJob3Jpem9udGFsUG9zaXRpb24iPlgtQXhpcyBTY2F0dGVyPC9wYXBlci1pdGVtPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0idmVydGljYWxQb3NpdGlvbiI+WS1BeGlzIFNjYXR0ZXI8L3BhcGVyLWl0ZW0+CiAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbnMiPgogICAgICAgIDxwYXBlci1idXR0b24gZGlhbG9nLWRpc21pc3MgY2xhc3M9ImNvbnRyb2wtYnV0dG9uIj5DYW5jZWw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8cGFwZXItYnV0dG9uIGRpYWxvZy1jb25maXJtIGF1dG9mb2N1cyBvbi10YXA9ImFkZERpc3RhbmNlTWV0cmljIiBjbGFzcz0ibWFpbi1idXR0b24iPkFwcGx5PC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtbGF5b3V0Ij4KICAgICAgPGRpdiBjbGFzcz0ibWFpbi12ZXJ0aWNhbCI+CiAgICAgICAgPGRpdiBjbGFzcz0ibWFpbi1jb250ZW50Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1haW4tYm90dG9tLWJhciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGFwb2ludC1sZWZ0LWNvbnRyb2xzLWhvbGRlciI+CiAgICAgICAgICAgICAgPHBhcGVyLXRhYnMgY2xhc3M9InRhYnMiIG5vaW5rIHNlbGVjdGVkPSJ7e3NpZGVUYWJTZWxlY3RlZH19Ij4KICAgICAgICAgICAgICAgIDxwYXBlci10YWI+RGF0YXBvaW50IGVkaXRvcjwvcGFwZXItdGFiPgogICAgICAgICAgICAgICAgPHBhcGVyLXRhYj5bW2dldFBlcmZvcm1hbmNlVGFiVGl0bGUobW9kZWxUeXBlLCBtdWx0aUNsYXNzKV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgICA8cGFwZXItdGFiPkZlYXR1cmVzPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgPC9wYXBlci10YWJzPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YXBvaW50LXJpZ2h0LWNvbnRyb2xzLWhvbGRlciI+CiAgICAgICAgICAgICAgPGEgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJjb250cm9sIiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC90cmVlL21hc3Rlci90ZW5zb3Jib2FyZC9wbHVnaW5zL2ludGVyYWN0aXZlX2luZmVyZW5jZS9SRUFETUUubWQiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIiBjbGFzcz0ic2V0dGluZ3MtYnV0dG9uIiB0aXRsZT0iV2hhdC1JZiBUb29sIGRvY3VtZW50YXRpb24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncyIgb24tdGFwPSJzZXR0aW5nc0NsaWNrZWRfIiBjbGFzcz0ic2V0dGluZ3MtYnV0dG9uIGNvbnRyb2wiIHRpdGxlPSJXaGF0LUlmIFRvb2wgc2V0dGluZ3MiIGRpc2FibGVkJD0iW1tsb2NhbF1dIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUtc3RhdHVzIj5bW2V4YW1wbGVTdGF0dXNTdHJdXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGlyb24tcGFnZXMgY2xhc3M9InNpZGUtdGFicyIgc2VsZWN0ZWQ9Int7c2lkZVRhYlNlbGVjdGVkfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtdGFiIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlLWhvbGRlciIgaWQ9InNpZGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZS1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1hbmQtY2FyZCI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iaGVhZGluZyIgb24tdGFwPSJ0b2dnbGVDb250ZXh0VG9vbHMiPgogICAgICAgICAgICAgICAgICAgICAgVmlzdWFsaXplCiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyaWdodC1zaWRlIHJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJbW2dldEV4cGFuZENvbGxhcHNlSWNvbihvcGVuZWRDb250ZXh0VG9vbHMpXV0iIGNsYXNzPSJleHBhbmQtY29sbGFwc2UtYnV0dG9uIj48L2lyb24taWNvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWNvbGxhcHNlIGNsYXNzPSJuby1wYWRkaW5nLWNhcmQiIGlkPSJjb2xsYXBzZWNvbnRleHR0b29scyIgb3BlbmVkPSJ7e29wZW5lZENvbnRleHRUb29sc319Ij4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3t2aXNNb2RlfX0iPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImRpdmUiPkRhdGFwb2ludHM8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJwZCI+UGFydGlhbCBkZXBlbmRlbmNlIHBsb3RzPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFpc1JlZ3Jlc3Npb25fKG1vZGVsVHlwZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlNlbGVjdCBhIGRhdGFwb2ludCB0byB1c2UgdGhpcyBmZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNsYXNzPSJjb3VudGVyZmFjdHVhbC10b2dnbGUiIGNoZWNrZWQ9Int7c2hvd05lYXJlc3RDb3VudGVyZmFjdHVhbH19IiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgbmVhcmVzdCBjb3VudGVyZmFjdHVhbCBkYXRhcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7bmVhcmVzdENvdW50ZXJmYWN0dWFsRGlzdH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iTDEiPkwxPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkwyIj5MMjwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9Ik1vZGVsOiIgbm8tbGFiZWwtZmxvYXQgY2xhc3M9ImNvdW50ZXJmYWN0dWFsLWRyb3Bkb3duIiBoaWRkZW4kPSJbW3Nob3VsZEhpZGVDb3VudGVyZmFjdHVhbE1vZGVsU2VsZWN0b3JfKHBhcnNlZE1vZGVsTmFtZXMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e25lYXJlc3RDb3VudGVyZmFjdHVhbE1vZGVsSW5kZXh9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbcGFyc2VkTW9kZWxOYW1lc11dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2dldENvdW50ZXJmYWN0dWFsTW9kZWxOYW1lXyhpdGVtKV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIGNmLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lYXJlc3QgY291bnRlcmZhY3R1YWwgKG5laWdoYm9yIG9mIGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZXMgdGhlIHNlbGVjdGVkIGRhdGFwb2ludCB3aXRoIGl0cyBuZWFyZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yIGZyb20gYSBkaWZmZXJlbnQgY2xhc3NpZmljYXRpb24gdXNpbmcgTDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTDIgZGlzdGFuY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iU2VsZWN0IGEgZGF0YXBvaW50IHRvIHVzZSB0aGlzIGZlYXR1cmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJjb250cm9sLWJ1dHRvbiBkYXRhcG9pbnQtYnV0dG9uIiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSIgb24tdGFwPSJzaG93RGlzdGFuY2VDbGlja2VkXyIgYWx0PSJTaG93IHNpbWlsYXJpdHkgdG8gc2VsZWN0ZWQgZGF0YXBvaW50IiB0aXRsZT0iU2hvdyBzaW1pbGFyaXR5IHRvIHNlbGVjdGVkIGRhdGFwb2ludCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IHNpbWlsYXJpdHkgdG8gc2VsZWN0ZWQgZGF0YXBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiBjZi1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJhdXRvIiB2ZXJ0aWNhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IHNpbWlsYXJpdHkgdG8gc2VsZWN0ZWQgZGF0YXBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFwb2ludCBhbmQgYWxsIG90aGVyIGRhdGFwb2ludHMgYW5kIHNob3dzIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGRhdGFwb2ludHMgdmlzdWFsaXphdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctYW5kLWNhcmQgZWRpdG9yLWhlYWRpbmctYW5kLWNhcmQiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImhlYWRpbmciPgogICAgICAgICAgICAgICAgICAgICAgW1tnZXREYXRhcG9pbnRFZGl0b3JUaXRsZShzZWxlY3RlZEV4YW1wbGVOdW0sCiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZEluZGljZXMpXV0KICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1wYWRkaW5nLWNhcmQiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2xzLWhvbGRlciBkYXRhcG9pbnQtY29udHJvbC1idXR0b25zLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGFwb2ludC1sZWZ0LWNvbnRyb2xzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJkYXRhcG9pbnQtY29udHJvbC1idXR0b24iIGljb249ImNoZXZyb24tbGVmdCIgZGlzYWJsZWQkPSJbWyFoYXNTZWxlY3RlZChzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UpXV0iIG9uLXRhcD0ic2VsZWN0UHJldkRhdGFwb2ludF8iIGFsdD0ic2VsZWN0IHByZXZpb3VzIGRhdGFwb2ludCIgdGl0bGU9IlNlbGVjdCBwcmV2aW91cyBkYXRhcG9pbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJkYXRhcG9pbnQtY29udHJvbC1idXR0b24iIGljb249ImNoZXZyb24tcmlnaHQiIGRpc2FibGVkJD0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIiBvbi10YXA9InNlbGVjdE5leHREYXRhcG9pbnRfIiBhbHQ9InNlbGVjdCBuZXh0IGRhdGFwb2ludCIgdGl0bGU9IlNlbGVjdCBuZXh0IGRhdGFwb2ludCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJFZGl0IGEgZGF0YXBvaW50IHRvIHVzZSB0aGlzIGZlYXR1cmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJkYXRhcG9pbnQtY29udHJvbC1idXR0b24iIGljb249Imhpc3RvcnkiIG9uLXRhcD0icmVzZXREYXRhcG9pbnRfIiBhbHQ9InVuZG8gY2hhbmdlcyIgdGl0bGU9IlVuZG8gY2hhbmdlcyIgZGlzYWJsZWQkPSJbW3Nob3VsZERpc2FibGVSZXNldF8oc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLmNoYW5nZWQpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJTZWxlY3QgYSBkYXRhcG9pbnQgdG8gdXNlIHRoaXMgZmVhdHVyZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImRhdGFwb2ludC1jb250cm9sLWJ1dHRvbiIgaWNvbj0iY29udGVudC1jb3B5IiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSIgb24tdGFwPSJjb3B5RGF0YXBvaW50XyIgYWx0PSJkdXBsaWNhdGUgZGF0YXBvaW50IiB0aXRsZT0iRHVwbGljYXRlIGRhdGFwb2ludCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlNlbGVjdCBhIGRhdGFwb2ludCB0byB1c2UgdGhpcyBmZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9uIiBpY29uPSJkZWxldGUiIGRpc2FibGVkJD0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIiBvbi10YXA9ImRlbGV0ZURhdGFwb2ludERpYWxvZ18iIGFsdD0iZGVsZXRlIGRhdGFwb2ludCIgdGl0bGU9IkRlbGV0ZSBkYXRhcG9pbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWRpdmlkZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCB2YWx1ZT0ie3tmZWF0dXJlU2VhcmNoVmFsdWV9fSIgbGFiZWw9IlNlYXJjaCBmZWF0dXJlcyIgY2xhc3M9ImRhdGFwb2ludC1jb250cm9sLWZpbHRlci1pbnB1dCBmZWF0dXJlLXNlYXJjaC1pbnB1dCIgZGlzYWJsZWQkPSJbWyFoYXNTZWxlY3RlZChzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UpXV0iIG5vLWxhYmVsLWZsb2F0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczpzZWFyY2giIHNsb3Q9InByZWZpeCI+PC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGFwb2ludC1yaWdodC1jb250cm9scy1ob2xkZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXhhbXBsZS1hbmQtaW5mZXJlbmNlLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWV4YW1wbGUtdmlld2VyIGNsYXNzPSJleGFtcGxlLWhvbGRlciIganNvbj0ie3tzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuZXhhbXBsZX19IiBjb21wYXJlLWpzb249Int7Y291bnRlcmZhY3R1YWxFeGFtcGxlQW5kSW5mZXJlbmNlLmV4YW1wbGV9fSIgb24tZXhhbXBsZS1jaGFuZ2U9ImV4YW1wbGVDaGFuZ2VfIiBpZD0idmlld2VyIiBkaXNwbGF5LW1vZGU9IltbZXhhbXBsZURpc3BsYXlNb2RlXV0iIGZlYXR1cmUtc2VhcmNoLXZhbHVlPSJ7e2ZlYXR1cmVTZWFyY2hWYWx1ZX19IiBjb21wYXJlLXRpdGxlPSJbW2NvbXBhcmVUaXRsZV1dIiBzYWxpZW5jeT0iW1thdHRyaWJ1dGlvbl1dIiBzaG93LXNhbGllbmN5IHJlYWRvbmx5PSJbWyFhcmVFeGFtcGxlc0VkaXRhYmxlXyhtb2RlbE5hbWUsIGluZmVyZW5jZUFkZHJlc3MpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdnotZXhhbXBsZS12aWV3ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YXBvaW50LWluZm8taG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtaW5mby1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXggc3BhY2UtYmV0d2VlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9uYm9hcmRpbmctaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgYSBkYXRhcG9pbnQgdG8gYmVnaW4gZXhwbG9yaW5nIG1vZGVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IgZm9yIHlvdXIgc2VsZWN0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ib25ib2FyZGluZy10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJvbGQiPkVkaXQgYW5kIEluZmVyOjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCB5b3VyIGRhdGFwb2ludCBoZXJlIGFuZCBydW4gaW5mZXJlbmNlIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZlciB0YWJsZSB0byBzZWUgZGlmZmVyZW5jZXMgaW4gbW9kZWwgYmVoYXZpb3IuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9uYm9hcmRpbmctdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJib2xkIj5WaXN1YWxpemU6PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2ggYmV0d2VlbiB2aXN1YWxpemluZyBkYXRhcG9pbnRzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsb3JpbmcgcGFydGlhbCBkZXBlbmRlbmNlIHBsb3RzIHRvIGdhaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWdodHMgaW50byB5b3VyIG1vZGVsJ3MgYmVoYXZpb3IuIEV4cGxvcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcmZhY3R1YWxzIG9yIHNlZSBob3cgc2ltaWxhciAob3IgZGlmZmVyZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdCBvZiB5b3VyIGRhdGFzZXQgaXMgZnJvbSB5b3VyIHNlbGVjdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmZlcmVuY2Utc2VjdGlvbi1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZmVyZW5jZS1zZWN0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImluZmVyZW5jZS1oZWFkZXIgaGVhZGluZyIgb24tdGFwPSJ0b2dnbGVJbmZlcmVuY2VSZXN1bHRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0SW5mZXJUaXRsZShzZWxlY3RlZEV4YW1wbGVOdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZEluZGljZXMpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyaWdodC1zaWRlIHJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iW1tnZXRFeHBhbmRDb2xsYXBzZUljb24ob3BlbmVkSW5mZXJlbmNlUmVzdWx0cyldXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9Im5vLXBhZGRpbmctY2FyZCIgaWQ9ImNvbGxhcHNlaW5mZXJlbmNlIiBvcGVuZWQ9Int7b3BlbmVkSW5mZXJlbmNlUmVzdWx0c319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iRWRpdCBhIGRhdGFwb2ludCB0byB1c2UgdGhpcyBmZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iaW5mZXJDbGlja2VkXyIgY2xhc3M9ImNvbnRyb2wtYnV0dG9uIGluZmVyLWJ1dHRvbiBmbGV4LWdyb3ciIGRpc2FibGVkJD0iW1tzaG91bGREaXNhYmxlSW5mZXJCdXR0b25fKGV4YW1wbGVzQW5kSW5mZXJlbmNlcywgbW9kZWxOYW1lLCBpbmZlcmVuY2VBZGRyZXNzLCB1cGRhdGVkRXhhbXBsZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW4gaW5mZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1pbmZlcmVuY2Utdmlld2VyIGNsYXNzPSJpbmZlcmVuY2Utdmlld2VyIiBpbmZlcmVuY2VzPSJbW3NlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5pbmZlcmVuY2VzXV0iIGlkJD0iW1tnZXRJbmZlcmVuY2VIb2xkZXJJZF8oKV1dIiBtb2RlbC10eXBlPSJbW21vZGVsVHlwZV1dIiBtb2RlbC1uYW1lcz0iW1twYXJzZWRNb2RlbE5hbWVzXV0iIG1heC1lbnRyaWVzLXBlci1ydW49IltbbWF4SW5mZXJlbmNlRW50cmllc1BlclJ1bl1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtaW5mZXJlbmNlLXZpZXdlcj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb3VudGVyZmFjdHVhbEV4YW1wbGVBbmRJbmZlcmVuY2VdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGYtaW5mZXJlbmNlLXZpZXdlciBjbGFzcz0iaW5mZXJlbmNlLXZpZXdlciBjb21wYXJlLWluZmVyZW5jZS12aWV3ZXIiIGluZmVyZW5jZXM9IltbY291bnRlcmZhY3R1YWxFeGFtcGxlQW5kSW5mZXJlbmNlLmluZmVyZW5jZXNdXSIgbW9kZWwtdHlwZT0iW1ttb2RlbFR5cGVdXSIgbW9kZWwtbmFtZXM9IltbcGFyc2VkTW9kZWxOYW1lc11dIiBtYXgtZW50cmllcy1wZXItcnVuPSJbW21heEluZmVyZW5jZUVudHJpZXNQZXJSdW5dXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RmLWluZmVyZW5jZS12aWV3ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXNpemVyIiBpZD0icmVzaXplciI+CiAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iYXY6cGF1c2UiIGNsYXNzPSJyZXNpemUtaWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNlbnRlciI+CiAgICAgICAgICAgICAgICA8ZmFjZXRzLWRpdmUgaWQ9ImRpdmUiIGRhdGE9IltbdmlzZGF0YV1dIiBzZWxlY3RlZC1pbmRpY2VzPSJbW3NlbGVjdGVkXV0iIGNvbXBhcmVkLWluZGljZXM9IltbY29tcGFyZWRJbmRpY2VzXV0iIG9uLXNlbGVjdGVkLWluZGljZXMtY2hhbmdlZD0ic2VsZWN0ZWRJbmRpY2VzQ2hhbmdlZF8iIG9uLXN0YXRzLWNoYW5nZWQ9InN0YXRzQ2hhbmdlZF8iIGhpZGUtaW5mby1jYXJkPSJ0cnVlIiBzcHJpdGUtaW1hZ2Utd2lkdGg9IjMyIiBzcHJpdGUtaW1hZ2UtaGVpZ2h0PSIzMiIgZml0LWdyaWQtYXNwZWN0LXJhdGlvLXRvLXZpZXdwb3J0PSJ0cnVlIiBzdGFibGUtY29sb3JzPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDwvZmFjZXRzLWRpdmU+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJub2V4YW1wbGVzIiBjbGFzcz0ibm9leGFtcGxlcyBpbmZvLXRleHQiPgogICAgICAgICAgICAgICAgICBEYXRhcG9pbnRzIGFuZCB0aGVpciBpbmZlcmVuY2UgcmVzdWx0cyB3aWxsIGJlIGRpc3BsYXllZCBoZXJlLgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGlkPSJzcGlubmVyIiBoaWRkZW49Iltbc3Bpbm5lckhpZGRlbl9dXSIgYWN0aXZlPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1jb250YWluZXItaG9sZGVyIiBpZD0icGFydGlhbHBsb3Rob2xkZXIiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZC1wbG90cy1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGQtaW5mby10ZXh0Ij5QYXJ0aWFsIERlcGVuZGVuY2UgUGxvdHM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gcGQtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5QYXJ0aWFsIERlcGVuZGVuY2UgUGxvdHM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWFsIGRlcGVuZGVuY2UgcGxvdHMgdmlzdWFsaXplIHRoZSBjaGFuZ2UgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcmVuY2UgcmVzdWx0cyBmb3IgZXZlcnkgZmVhdHVyZSwgYXMgdGhlIHZhbHVlIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZmVhdHVyZSBpcyBjaGFuZ2VkIHRvIGRpZmZlcmVudCB2YWxpZCB2YWx1ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBudW1lcmljIGZlYXR1cmVzLCB5b3UgY2FuIHNldCB0aGUgbWluaW11bSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtIHZhbHVlcyB0byBwbG90LgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBGb3Igc3RyaW5nIGZlYXR1cmVzLCB0aGUgbW9zdCBwb3B1bGFyIGZlYXR1cmUgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHNob3duIGFzIGFsdGVybmF0aXZlcyB0byB0aGUgZmVhdHVyZSB2YWx1ZSBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgZGF0YXBvaW50LgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZmVhdHVyZXMgd2l0aCBtdWx0aXBsZSBmZWF0dXJlIHZhbHVlcyBwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcG9pbnQsIGEgc2luZ2xlIHBsb3QgaXMgc2hvd24gZm9yIGZvciBlYWNoIGZlYXR1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0aGUgc2VsZWN0ZWQgZGF0YXBvaW50LiBZb3UgY2FuIG92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggZmVhdHVyZSB2YWx1ZXMgaGF2ZSBwbG90cyBjcmVhdGVkIGZvciB0aGVtIGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeWluZyB0aGUgaW5kaWNlcyB0byBzaG93biBwYXJ0aWFsIGRlcGVuZGVuY2UKICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90cyBmb3IsIGlmIHRoZSBkYXRhcG9pbnQgY29udGFpbnMgbXVsdGlwbGUgZmVhdHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBmb3IgYSBmZWF0dXJlLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIHRoZSBnbG9iYWwgdG9nZ2xlIGlzIHR1cm5lZCBvbiwgdGhlIHBsb3RzIHNob3cKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXZlcmFnZSBlZmZlY3Qgb2YgcmVwZWF0ZWRseSBjaGFuZ2luZyBhIHNpbmdsZQogICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgYWNyb3NzIGFsbCBkYXRhcG9pbnRzLiBXaGVuIGl0IGlzIHR1cm5lZCBvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBsb3RzIHNob3cgdGhlIGVmZmVjdCBvZiBhIHJlcGVhdGVkbHkgY2hhbmdpbmcgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBmZWF0dXJlIG9uIHRoZSBzZWxlY3RlZCBkYXRhcG9pbnQuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InBkLXRvZ2dsZSIgY2hlY2tlZD0ie3tnbG9iYWxQZFBsb3RzfX0iIG9uLWNoYW5nZT0iaGlkZUFsbFBkRWxlbWVudHNfIiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgcGFydGlhbCBkZXBlbmRlbmNlIHBsb3RzCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhcmVUaGVyZVBkUGxvdEZlYXR1cmVzXyhwYXJ0aWFsRGVwUGxvdEVsaWdpYmxlRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBkLW5vLWZlYXR1cmVzLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgVGhlIGxvYWRlZCBkYXRhc2V0IGhhcyBubyBmZWF0dXJlcyB0byBzaG93IHBhcnRpYWwKICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2UgcGxvdHMgZm9yLgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZHBsb3RzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1twYXJ0aWFsRGVwUGxvdEVsaWdpYmxlRmVhdHVyZXNdXSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWNvbnRhaW5lciIgZGF0YS1mZWF0dXJlLW5hbWUkPSJbW2l0ZW0ubmFtZV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyeSBwZXJmLXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hcnJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9InBkLXJvdy1hcnJvdyByb3RhdGVkLWljb24iIGljb249ImFycm93LWRyb3AtZG93biIgb24tdGFwPSJjYXRlZ29yeVBhbmVDbGlja2VkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdmFsIHBlcmYtdGFibGUtY2xpY2thYmxlIHRmLWNhdGVnb3J5LXBhbmUgcGVyZi10YWJsZS10ZXh0LWVudHJ5IiBvbi10YXA9ImNhdGVnb3J5UGFuZUNsaWNrZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tpdGVtLm5hbWVdXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGQtZW50cnktY29udGFpbmVyIHBlcmYtdGFibGUtZW50cnktZXhwYW5kZWQiIGhpZGRlbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZC1pbnB1dC1jb250YWluZXIiIGhpZGRlbiQ9Iltbc2hvdWxkSGlkZVBkSW5wdXRDb250YWluZXIoaXRlbS5zYW1wbGVzLCBpdGVtLm5hbWUsIHNlbGVjdGVkKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJhbmdlLWlucHV0LWNvbnRhaW5lciIgaGlkZGVuJD0iW1tpdGVtLnNhbXBsZXNdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZm8tdGV4dCIgdGl0bGU9IlRoZSByYW5nZSBvZiB2YWx1ZXMgdG8gdGVzdCAoZGVmYXVsdCB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQpLiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHJhbmdlIG9mIHZhbHVlcyB0byB0ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ic3R5bGUtaW5wdXQgeC1taW4gcGQtcmFuZ2UtY29udHJvbCIgdmFsdWU9IltbaXRlbS5vYnNlcnZlZE1pbl1dIiB0aXRsZT0iVGhlIG1pbmltdW0gdmFsdWUgdG8gdGVzdCAoZGVmYXVsdCB2YWx1ZSBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkKS4iIG9uLWlucHV0PSJwZElucHV0Q2hhbmdlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGQtcmFuZ2UtaHlwaGVuIj4tPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9InN0eWxlLWlucHV0IHgtbWF4IHBkLXJhbmdlLWNvbnRyb2wiIHZhbHVlPSJbW2l0ZW0ub2JzZXJ2ZWRNYXhdXSIgdGl0bGU9IlRoZSBtYXhpbXVtIHZhbHVlIHRvIHRlc3QgKGRlZmF1bHQgdmFsdWUgaXMgYXV0b21hdGljYWxseSBpbmZlcnJlZCkuIiBvbi1pbnB1dD0icGRJbnB1dENoYW5nZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1pbmRleC1jb250YWluZXIiIGhpZGRlbiQ9Iltbc2hvdWxkSGlkZUZlYXR1cmVJbmRpY2VzU2VsZWN0b3IoaXRlbS5uYW1lLCBzZWxlY3RlZCldXSIgdGl0bGU9IkFuIG9wdGlvbmFsIHByaW50ZXItcGFnZS1zdHlsZSBwYXR0ZXJuIGxpa2UgJzAsMiw0LTYnIHRvIHNlbGVjdCB0aGUgaW5kaWNlcyBvZiB0aGUgZmVhdHVyZSB2YWx1ZXMgdG8gZ2VuZXJhdGUgcGxvdHMgZm9yLiBVc2VmdWwgZm9yIGZlYXR1cmVzIHdpdGggbWFueSByZXBlYXRlZCBmaWVsZHMuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5mby10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgZmVhdHVyZSBpbmRpY2VzIDxpPihvcHRpb25hbCk8L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9InN0eWxlLWlucHV0IGZlYXR1cmUtaW5kZXgtcGF0dGVybiBwZC1yYW5nZS1jb250cm9sIiBvbi1pbnB1dD0icGRJbnB1dENoYW5nZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGYtY2F0ZWdvcnktcGFuZS1jb250ZW50Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLXRhYiI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLXNpZGUtY29udGVudCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWFuZC1jYXJkIj4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iaW5mZXJlbmNlLWhlYWRlciBoZWFkaW5nIiBvbi10YXA9InRvZ2dsZVRydWVMYWJlbFNldHVwIj4KICAgICAgICAgICAgICAgICAgICBDb25maWd1cmUKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyaWdodC1zaWRlIHJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIj4KICAgICAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iW1tnZXRFeHBhbmRDb2xsYXBzZUljb24ob3BlbmVkVHJ1ZUxhYmVsKV1dIiBjbGFzcz0iZXhwYW5kLWNvbGxhcHNlLWJ1dHRvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBjbGFzcz0iY2FyZCIgaWQ9ImNvbGxhcHNldHJ1ZWxhYmVsIiBvcGVuZWQ9Int7b3BlbmVkVHJ1ZUxhYmVsfX0iPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93TGFiZWxEcm9wZG93bl8oc3RhdHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJHcm91bmQgVHJ1dGggRmVhdHVyZSIgY2xhc3M9InRocmVzaG9sZC1kcm9wZG93biI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWRMYWJlbEZlYXR1cmV9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRGZWF0dXJlTGlzdF8oc3RhdHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuYW1lPSJbW2l0ZW1dXSI+W1tnZXRGZWF0dXJlTmFtZV8oaXRlbSldXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC10aXRsZSBoZWxwLXRpdGxlLW1hcmdpbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0IGlzIGdyb3VuZCB0cnV0aD8KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZlYXR1cmUgdGhhdCB5b3VyIG1vZGVsIGlzIHRyeWluZyB0byBwcmVkaWN0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlhbG9nLWxpbmsiIG9uLXRhcD0ib3BlbkRpYWxvZyI+TW9yZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdW5kIFRydXRoIEZlYXR1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGRhdGFwb2ludHMgY29udGFpbiBhIGZlYXR1cmUgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBncm91bmQgdHJ1dGggZm9yIHdoYXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsIGlzIGF0dGVtcHRpbmcgdG8gcHJlZGljdCwgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RpbmcgdGhhdCBmZWF0dXJlIGhlcmUgYWxsb3dzIHRoZSB0b29sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGludmVzdGlnYXRlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgbW9kZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgY29tcGFyaW5nIHRoZSBtb2RlbCdzIHJlc3VsdHMgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VuZCB0cnV0aCBmZWF0dXJlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3VsZFNob3dDb3N0UmF0aW9fKHNlbGVjdGVkTGFiZWxGZWF0dXJlLCBtb2RlbFR5cGUsIG11bHRpQ2xhc3MpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgdmFsdWU9Int7aW5jb3JyZWN0UHJlZENvc3RSYXRpb319IiBsYWJlbD0iQ29zdCBSYXRpbyAoRlAvRk4pIiB0eXBlPSJudW1iZXIiIGNsYXNzPSJ0aHJlc2hvbGQtY29zdC1pbnB1dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC10aXRsZSBoZWxwLXRpdGxlLW1hcmdpbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgaXMgY29zdCByYXRpbz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY29zdCBvZiBmYWxzZSBwb3NpdGl2ZXMgcmVsYXRpdmUgdG8gZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZXMuIFJlcXVpcmVkIGZvciBvcHRpbWl6YXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpYWxvZy1saW5rIiBvbi10YXA9Im9wZW5EaWFsb2ciPk1vcmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgaXMgY29zdCByYXRpbz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0ZWxscyB0aGUgdG9vbCBob3cgdG8gb3B0aW1pemUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24gdGhyZXNob2xkcyB3aGVuIHlvdSB1c2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uIHN0cmF0ZWd5IGNvbnRyb2xzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwID0gZmFsc2UgcG9zaXRpdmVzIGFyZSBlcXVhbGx5IGFzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdGx5IGFzIGZhbHNlIG5lZ2F0aXZlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMCA9IGZhbHNlIHBvc2l0aXZlcyBhcmUgNCB0aW1lcyBtb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdGx5IHRoYW4gZmFsc2UgbmVnYXRpdmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUgPSBmYWxzZSBuZWdhdGl2ZXMgYXJlIDQgdGltZXMgbW9yZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3RseSB0aGFuIGZhbHNlIHBvc2l0aXZlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93RmVhdHVyZURyb3Bkb3duXyhzdGF0cyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJTbGljZSBieSIgY2xhc3M9InRocmVzaG9sZC1kcm9wZG93biI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmV9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldEZlYXR1cmVMaXN0XyhzdGF0cyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iW1tpdGVtXV0iPltbZ2V0RmVhdHVyZU5hbWVfKGl0ZW0pXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLXRpdGxlIGhlbHAtdGl0bGUtbWFyZ2luIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdCBkb2VzIHNsaWNpbmcgZG8/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlbHAtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd3MgcGVyZm9ybWFuY2UgZm9yIGVhY2ggdmFsdWUgb2YgdGhlIHNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93U2Vjb25kRmVhdHVyZURyb3Bkb3duXyhzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IlNsaWNlIGJ5IChzZWNvbmRhcnkpIiBjbGFzcz0idGhyZXNob2xkLWRyb3Bkb3duIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJuYW1lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldEZlYXR1cmVMaXN0XyhzdGF0cyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuYW1lPSJbW2l0ZW1dXSI+W1tnZXRGZWF0dXJlTmFtZV8oaXRlbSldXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzQmluYXJ5Q2xhc3NpZmljYXRpb25fKG1vZGVsVHlwZSwgbXVsdGlDbGFzcyldXSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctYW5kLWNhcmQiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImluZmVyZW5jZS1oZWFkZXIgaGVhZGluZyIgb24tdGFwPSJ0b2dnbGVFeHBsb3JlclNldHVwIj4KICAgICAgICAgICAgICAgICAgICAgIEZhaXJuZXNzCiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyaWdodC1zaWRlIHJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJbW2dldEV4cGFuZENvbGxhcHNlSWNvbihvcGVuZWRFeHBsb3JlcildXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9ImNhcmQiIGlkPSJjb2xsYXBzZWV4cGxvcmVyIiBvcGVuZWQ9Int7b3BlbmVkRXhwbG9yZXJ9fSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd0ZlYXR1cmVEcm9wZG93bl8oc3RhdHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWluZm8taGVhZGVyIGhlbHAtdGl0bGUtbWFyZ2luLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbHkgYW4gb3B0aW1pemF0aW9uIHN0cmF0ZWd5CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWluZm8tdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGEgc3RyYXRlZ3kgdG8gc2V0IGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMKICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgc2V0IGNvc3QgcmF0aW8gYW5kIGRhdGEgc2xpY2VzLiBNYW51YWxseQogICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyaW5nIHRocmVzaG9sZHMgb3IgY2hhbmdpbmcgY29zdCByYXRpbyB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBiYWNrIHRvIGN1c3RvbSB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJvcHRpbWl6YXRpb24tcmFkaW8tZ3JvdXAiIHNlbGVjdGVkPSJ7e29wdGltaXphdGlvblNlbGVjdGVkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VzdG9tIiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIiBpZD0iY3VzdG9tdGhyZXNoIj5DdXN0b20gdGhyZXNob2xkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2gtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkN1c3RvbSB0aHJlc2hvbGRzPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHlvdXIgb3duIHRocmVzaG9sZHMgdXNpbmcgdGhlIHRocmVzaG9sZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ1bmF3YXJlIiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIj5TaW5nbGUgdGhyZXNob2xkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+U2luZ2xlIHRocmVzaG9sZDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXplIGEgc2luZ2xlIHRocmVzaG9sZCBmb3IgYWxsIGRhdGFwb2ludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGNvc3QgcmF0aW8uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJkZW1vcGFyaXR5IiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIiBkaXNhYmxlZCQ9IltbIXNob3VsZFNob3dGZWF0dXJlUHJDaGFydHNfKHNlbGVjdGVkTGFiZWxGZWF0dXJlLCBzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsIGluZmVyZW5jZXMpXV0iPkRlbW9ncmFwaGljIHBhcml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2gtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkRlbW9ncmFwaGljIHBhcml0eTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXplIGEgdGhyZXNob2xkIHBlciBzbGljZSBiYXNlZCBvbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgY29zdCByYXRpbywgZW5zdXJpbmcgdGhlIGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlcyBhY2hpZXZlIGRlbW9ncmFwaGljIHBhcnR5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW1vZ3JhcGhpYyBwYXJpdHkgbWVhbnMgdGhhdCBzaW1pbGFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZXMgb2YgZGF0YXBvaW50cyBmcm9tIGVhY2ggc2xpY2UgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkIGFzIHBvc2l0aXZlIGNsYXNzaWZpY2F0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImVxdWFsb3BwIiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIiBkaXNhYmxlZCQ9IltbIXNob3VsZFNob3dGZWF0dXJlUHJDaGFydHNfKHNlbGVjdGVkTGFiZWxGZWF0dXJlLCBzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsIGluZmVyZW5jZXMpXV0iPkVxdWFsIG9wcG9ydHVuaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+RXF1YWwgb3Bwb3J0dW5pdHk8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSBhIHRocmVzaG9sZCBwZXIgc2xpY2UgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGNvc3QgcmF0aW8sIGVuc3VyaW5nIHRoZSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZXMgYWNoaWV2ZSBlcXVhbCBvcHBvcnR1bml0eS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXF1YWwgb3Bwb3J0dW5pdHkgbWVhbnMgdGhhdCBhbW9uZyB0aG9zZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZCBhcyBwb3NpdGl2ZSBjbGFzc2lmaWNhdGlvbnMsIHRoZXJlIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW1pbGFyIHBlcmNlbnRhZ2Ugb2YgY29ycmVjdCBwcmVkaWN0aW9ucyBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2xpY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJlcXVhbGFjYyIgY2xhc3M9Im9wdGltaXphdGlvbi1yYWRpbyIgZGlzYWJsZWQkPSJbWyFzaG91bGRTaG93RmVhdHVyZVByQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj5FcXVhbCBhY2N1cmFjeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2gtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkVxdWFsIGFjY3VyYWN5PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemUgYSB0aHJlc2hvbGQgcGVyIHNsaWNlIGJhc2VkIG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb3N0IHJhdGlvLCBlbnN1cmluZyB0aGUgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzIGFjaGlldmUgZXF1YWwgYWNjdXJhY3kuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVxdWFsIGFjY3VyYWN5IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBzaW1pbGFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSBvZiBjb3JyZWN0IHByZWRpY3Rpb25zIGluIGVhY2ggc2xpY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJncm91cCIgY2xhc3M9Im9wdGltaXphdGlvbi1yYWRpbyIgZGlzYWJsZWQkPSJbWyFzaG91bGRTaG93RmVhdHVyZVByQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj5Hcm91cCB0aHJlc2hvbGRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+R3JvdXAgdGhyZXNob2xkczwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXplIGEgc2VwYXJhdGUgdGhyZXNob2xkIGZvciBlYWNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBjb3N0IHJhdGlvLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb25maWctbWFpbi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyhtb2RlbFR5cGUsIG11bHRpQ2xhc3MpXV0iIHJlc3RhbXA+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdGl0bGUtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4Ij4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICBbW2dldFBlcmZUYWJsZVRpdGxlKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlLCBvcHRpbWl6YXRpb25TZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkcyldXQogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHBlcmZvcm1hbmNlLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJhdXRvIiB2ZXJ0aWNhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NpZmljYXRpb24gUGVyZm9ybWFuY2UgVGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBncm91bmQgdHJ1dGggZmVhdHVyZSB0byBleHBsb3JlIG1vZGVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UgaW5jbHVkaW5nIFJPQyBjdXJ2ZXMgYW5kIGNvbmZ1c2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpY2VzLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZSB0aGUgZGF0YXNldCBieSBmZWF0dXJlcyBhbmQgZXhwbG9yZSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlIGJ5IHNsaWNlLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIGZhaXJuZXNzIG9wdGltaXphdGlvbiBzdHJhdGVnaWVzIGFuZCBzZWUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wYWN0IG9uIHRoZSB0aHJlc2hvbGRzIGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpdmlkdWFsIHNsaWNlcy4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXNvcnQtYm94Ij4KICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJ1bmZvbGQtbW9yZSIgY2xhc3M9InBlcmYtYnV0dG9uIiBvbi10YXA9ImV4cGFuZEFsbFBlcmZvcm1hbmNlIiBhbHQ9ImV4cGFuZCBhbGwgc2xpY2VzIiB0aXRsZT0iRXhwYW5kIGFsbCBzbGljZXMiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0idW5mb2xkLWxlc3MiIGNsYXNzPSJwZXJmLWJ1dHRvbiIgb24tdGFwPSJjb2xsYXBzZUFsbFBlcmZvcm1hbmNlIiBhbHQ9ImNvbGxhcHNlIGFsbCBzbGljZXMiIHRpdGxlPSJDb2xsYXBzZSBhbGwgc2xpY2VzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IlNvcnQgYnkiIGNsYXNzPSJ0aHJlc2hvbGQtZHJvcGRvd24gcGVyZi10YWJsZS1zb3J0LW1lbnUiPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEZlYXR1cmVTb3J0fX0iIGF0dHItZm9yLXNlbGVjdGVkPSJuYW1lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldEZlYXR1cmVTb3J0QnkobW9kZWxUeXBlLCBtdWx0aUNsYXNzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9IltbaXRlbV1dIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hcnJvdyI+CiAgICAgICAgICAgICAgICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJleHBhbmQtY29sbGFwc2UtYnV0dG9uIj48L2lyb24taWNvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXZhbCI+RmVhdHVyZSBWYWx1ZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQiPkNvdW50PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgTW9kZWwKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRocmVzaG9sZCBmbGV4Ij4KICAgICAgICAgICAgICAgICAgICAgIDxkaXY+VGhyZXNob2xkPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aHJlc2hvbGQtaW5mby1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaG9sZC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9yaW5nIENsYXNzaWZpY2F0aW9uIFBlcmZvcm1hbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGlzIHNsaWRlciB0byBhZGp1c3QgdGhlIGNsYXNzaWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoaXMgc2xpY2UuIEluZmVyZW5jZSB2YWx1ZXMgYXQgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIHRoaXMgdGhyZXNob2xkIGFyZSBjb25zaWRlcmVkIGEgcG9zaXRpdmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uLCB3aGlsZSBpbmZlcmVuY2UgdmFsdWVzIGJlbG93IHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCBhcmUgY29uc2lkZXJlZCBhIG5lZ2F0aXZlIGNsYXNzaWZpY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZnAiPkZhbHNlIFBvc2l0aXZlcyAoJSk8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWZuIj5GYWxzZSBOZWdhdGl2ZXMgKCUpPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hY2MiPkFjY3VyYWN5ICglKTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZjEiPkYxPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJpZXMtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2ZlYXR1cmVWYWx1ZVRocmVzaG9sZHNdXSIgYXM9ImZlYXR1cmVWYWx1ZVRocmVzaG9sZCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlUm93Q2xhc3MoZmVhdHVyZVZhbHVlVGhyZXNob2xkLm9wZW5lZCldXSIgZGF0YS1pbmRleCQ9IltbaW5kZXhdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hcnJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3MkPSJbW2dldEV4cGFuZENvbGxhcHNlUGVyZkljb25DbGFzcyhmZWF0dXJlVmFsdWVUaHJlc2hvbGQub3BlbmVkKV1dIiBpY29uPSJhcnJvdy1kcm9wLWRvd24iIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXZhbCBwZXJmLXRhYmxlLWNsaWNrYWJsZSBwZXJmLXRhYmxlLXRleHQtZW50cnkiIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldFByaW50YWJsZVZhbHVlXyhmZWF0dXJlVmFsdWVUaHJlc2hvbGQpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWNvdW50IHBlcmYtdGFibGUtY2xpY2thYmxlIHBlcmYtdGFibGUtbnVtLWVudHJ5IiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRGZWF0dXJlVmFsdWVDb3VudChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdGV4dC1lbnRyeSBwZXJmLXRhYmxlLWNsaWNrYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRNb2RlbE5hbWVfKGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRocmVzaG9sZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3MkPSJbW2dldFNsaWRlckNsYXNzKGluZGV4KV1dIiBlZGl0YWJsZT0idHJ1ZSIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMDEiIGltbWVkaWF0ZS12YWx1ZT0ie3tpdGVtLnRocmVzaG9sZH19IiB2YWx1ZT0iW1tpdGVtLnRocmVzaG9sZF1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJyZWZyZXNoSW5mZXJlbmNlc05vUmVnZW5fIiBvbi1pbW1lZGlhdGUtdmFsdWUtY2hhbmdlZD0icmVmcmVzaEluZmVyZW5jZXNOb1JlZ2VuXyIgb24tZG93bj0icmVzZXRPcHRpbWl6YXRpb25TZWxlY3RlZF8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1mcCBwZXJmLXRhYmxlLWNsaWNrYWJsZSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7ZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1udW0tZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0RlBNb2RlbEluZGV4KGluZmVyZW5jZVN0YXRzXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkLCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGQpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZm4gcGVyZi10YWJsZS1jbGlja2FibGUiIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEZOTW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFjYyBwZXJmLXRhYmxlLWNsaWNrYWJsZSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7ZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1udW0tZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0QWNjdXJhY3lNb2RlbEluZGV4KGluZmVyZW5jZVN0YXRzXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkLCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGQpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZjEgcGVyZi10YWJsZS1jbGlja2FibGUiIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEYxTW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tmZWF0dXJlVmFsdWVUaHJlc2hvbGQub3BlbmVkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJ5LWV4cGFuZGVkIGZsZXgtcm93LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93RmVhdHVyZVByQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYtbWF0cml4LWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYtdGV4dCI+Q29uZnVzaW9uIG1hdHJpeDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRmLWNvbmZ1c2lvbi1tYXRyaXggY291bnRzPSJbW2dldENvbmZ1c2lvbkNvdW50c01vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLCBmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkLCBpbmRleCwgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dIiBsYWJlbD0iW1tnZXRDb25mdXNpb25NYXRyaXhMYWJlbChpbmRleCwgbnVtTW9kZWxzKV1dIiBiYWNrZ3JvdW5kPSJbW2dldENvbmZ1c2lvbk1hdHJpeENvbG9yKGluZGV4KV1dIiBhbGwtaXRlbXM9IltbYWxsQ29uZk1hdHJpeExhYmVsc11dIiBjbGFzcz0iY29uZi1tYXRyaXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtY29uZnVzaW9uLW1hdHJpeD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3VydmVzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImN1cnZlLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm9jLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9DIGN1cnZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaG9sZC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPlJPQyBjdXJ2ZTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcmVjZWl2ZXIgb3BlcmF0aW5nIGNoYXJhY3RlcmlzdGljIChST0MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmUgcGxvdHMgdGhlIHRydWUgcG9zaXRpdmUgcmF0ZSAoVFBSKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnYWluc3QgdGhlIGZhbHNlIHBvc2l0aXZlIHJhdGUgKEZQUikgYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm9jLXgtbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UgcG9zaXRpdmUgcmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvYy15LWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUgcG9zaXRpdmUgcmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBpZD0iW1tnZXRSb2NDaGFydElkKGluZGV4KV1dIiBjbGFzcz0icHItbGluZS1jaGFydCIgeC1heGlzLWZvcm1hdHRlcj0iW1tnZXRTaW1wbGVBeGlzRm9ybWF0dGVyKGF4aXNQcmVjaXNpb24pXV0iIHktYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Z6LWxpbmUtY2hhcnQyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3VydmUtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb2MtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUiBjdXJ2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2hvbGQtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249InJpZ2h0IiB2ZXJ0aWNhbC1hbGlnbj0iYm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5QUiBjdXJ2ZTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcHJlY2lzaW9uLXJlY2FsbCAoUFIpIGN1cnZlIHBsb3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uIGFnYWluc3QgcmVjYWxsIGF0IHZhcmlvdXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByLXgtbGFiZWwiPlJlY2FsbDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByLXktbGFiZWwiPlByZWNpc2lvbjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBpZD0iW1tnZXRQckNoYXJ0SWQoaW5kZXgpXV0iIGNsYXNzPSJwci1saW5lLWNoYXJ0IiB4LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSIgeS1heGlzLWZvcm1hdHRlcj0iW1tnZXRTaW1wbGVBeGlzRm9ybWF0dGVyKGF4aXNQcmVjaXNpb24pXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdnotbGluZS1jaGFydDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd092ZXJhbGxUaHJlc2hvbGRlcl8oc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXJvdy1leHBhbmRlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hcnJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iYXJyb3ctZHJvcC1kb3duIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciIGRpc2FibGVkPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwgcGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBkYXRhcG9pbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1jb3VudCBwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEZlYXR1cmVWYWx1ZUNvdW50KGluZmVyZW5jZVN0YXRzXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxUaHJlc2hvbGRzKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvdmVyYWxsVGhyZXNob2xkc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldE1vZGVsTmFtZV8oaW5kZXgpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdGhyZXNob2xkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7b3ZlcmFsbFRocmVzaG9sZHN9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3MkPSJbW2dldFNsaWRlckNsYXNzKGluZGV4KV1dIiBlZGl0YWJsZT0idHJ1ZSIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMDEiIGltbWVkaWF0ZS12YWx1ZT0ie3tpdGVtLnRocmVzaG9sZH19IiB2YWx1ZT0iW1tpdGVtLnRocmVzaG9sZF1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJyZWZyZXNoSW5mZXJlbmNlc05vUmVnZW5fIiBvbi1pbW1lZGlhdGUtdmFsdWUtY2hhbmdlZD0icmVmcmVzaEluZmVyZW5jZXNOb1JlZ2VuXyIgb24tZG93bj0icmVzZXRPcHRpbWl6YXRpb25TZWxlY3RlZF8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1mcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e292ZXJhbGxUaHJlc2hvbGRzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRGUE1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxUaHJlc2hvbGRzLCBpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1mbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e292ZXJhbGxUaHJlc2hvbGRzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRGTk1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxUaHJlc2hvbGRzLCBpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hY2MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvdmVyYWxsVGhyZXNob2xkc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1udW0tZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0QWNjdXJhY3lNb2RlbEluZGV4KGluZmVyZW5jZVN0YXRzXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsVGhyZXNob2xkcywgaW5kZXgpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZjEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvdmVyYWxsVGhyZXNob2xkc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1udW0tZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0RjFNb2RlbEluZGV4KGluZmVyZW5jZVN0YXRzXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsVGhyZXNob2xkcywgaW5kZXgpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyeS1leHBhbmRlZCBmbGV4LXJvdy1yZXZlcnNlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3VsZFNob3dPdmVyYWxsUHJDaGFydF8oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwgaW5mZXJlbmNlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZi1tYXRyaXgtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYtdGV4dCI+Q29uZnVzaW9uIG1hdHJpeDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvdmVyYWxsVGhyZXNob2xkc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRmLWNvbmZ1c2lvbi1tYXRyaXggY291bnRzPSJbW2dldENvbmZ1c2lvbkNvdW50c01vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLCBvdmVyYWxsVGhyZXNob2xkcywgaW5kZXgpXV0iIGxhYmVsPSJbW2dldENvbmZ1c2lvbk1hdHJpeExhYmVsKGluZGV4LCBudW1Nb2RlbHMpXV0iIGJhY2tncm91bmQ9IltbZ2V0Q29uZnVzaW9uTWF0cml4Q29sb3IoaW5kZXgpXV0iIGFsbC1pdGVtcz0iW1thbGxDb25mTWF0cml4TGFiZWxzXV0iIGNsYXNzPSJjb25mLW1hdHJpeCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtY29uZnVzaW9uLW1hdHJpeD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3VydmVzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjdXJ2ZS1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb2MtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9DIGN1cnZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2hvbGQtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5ST0MgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcmVjZWl2ZXIgb3BlcmF0aW5nIGNoYXJhY3RlcmlzdGljIChST0MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlIHBsb3RzIHRoZSB0cnVlIHBvc2l0aXZlIHJhdGUgKFRQUikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdhaW5zdCB0aGUgZmFsc2UgcG9zaXRpdmUgcmF0ZSAoRlBSKSBhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvYy14LWxhYmVsIj5GYWxzZSBwb3NpdGl2ZSByYXRlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvYy15LWxhYmVsIj5UcnVlIHBvc2l0aXZlIHJhdGU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJyb2NjaGFydCIgY2xhc3M9InByLWxpbmUtY2hhcnQiIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdnotbGluZS1jaGFydDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImN1cnZlLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvYy10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUiBjdXJ2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249InJpZ2h0IiB2ZXJ0aWNhbC1hbGlnbj0iYm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+UFIgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcHJlY2lzaW9uLXJlY2FsbCAoUFIpIGN1cnZlIHBsb3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiBhZ2FpbnN0IHJlY2FsbCBhdCB2YXJpb3VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByLXgtbGFiZWwiPlJlY2FsbDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwci15LWxhYmVsIj5QcmVjaXNpb248L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJwcmNoYXJ0IiBjbGFzcz0icHItbGluZS1jaGFydCIgeC1heGlzLWZvcm1hdHRlcj0iW1tnZXRTaW1wbGVBeGlzRm9ybWF0dGVyKGF4aXNQcmVjaXNpb24pXV0iIHktYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzTXVsdGlDbGFzc18obW9kZWxUeXBlLCBtdWx0aUNsYXNzKV1dIiByZXN0YW1wPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXROb1RocmVzaG9sZFBlcmZUYWJsZVRpdGxlKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGRzKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gcGVyZm9ybWFuY2UtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWNhdGlvbiBQZXJmb3JtYW5jZSBUYWJsZQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGdyb3VuZCB0cnV0aCBmZWF0dXJlIHRvIGV4cGxvcmUgbW9kZWwKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBpbmNsdWRpbmcgY29uZnVzaW9uIG1hdHJpY2VzLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZSB0aGUgZGF0YXNldCBhbmQgZXhwbG9yZSBtb2RlbCBwZXJmb3JtYW5jZSBieQogICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtc29ydC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InVuZm9sZC1tb3JlIiBjbGFzcz0icGVyZi1idXR0b24iIG9uLXRhcD0iZXhwYW5kQWxsUGVyZm9ybWFuY2UiIGFsdD0iZXhwYW5kIGFsbCBzbGljZXMiIHRpdGxlPSJFeHBhbmQgYWxsIHNsaWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJ1bmZvbGQtbGVzcyIgY2xhc3M9InBlcmYtYnV0dG9uIiBvbi10YXA9ImNvbGxhcHNlQWxsUGVyZm9ybWFuY2UiIGFsdD0iY29sbGFwc2UgYWxsIHNsaWNlcyIgdGl0bGU9IkNvbGxhcHNlIGFsbCBzbGljZXMiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgY2xhc3M9InRocmVzaG9sZC1kcm9wZG93biBwZXJmLXRhYmxlLXNvcnQtbWVudSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkRmVhdHVyZVNvcnR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZ2V0RmVhdHVyZVNvcnRCeShtb2RlbFR5cGUsIG11bHRpQ2xhc3MpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iW1tpdGVtXV0iPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXZhbCI+RmVhdHVyZSBWYWx1ZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQiPkNvdW50PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgTW9kZWwKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFjYyI+QWNjdXJhY3k8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cmllcy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZmVhdHVyZVZhbHVlVGhyZXNob2xkc11dIiBhcz0iZmVhdHVyZVZhbHVlVGhyZXNob2xkIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRQZXJmVGFibGVSb3dDbGFzcyhmZWF0dXJlVmFsdWVUaHJlc2hvbGQub3BlbmVkKV1dIiBkYXRhLWluZGV4JD0iW1tpbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcyQ9IltbZ2V0RXhwYW5kQ29sbGFwc2VQZXJmSWNvbkNsYXNzKGZlYXR1cmVWYWx1ZVRocmVzaG9sZC5vcGVuZWQpXV0iIGljb249ImFycm93LWRyb3AtZG93biIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdmFsIHBlcmYtdGFibGUtY2xpY2thYmxlIHBlcmYtdGFibGUtdGV4dC1lbnRyeSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0UHJpbnRhYmxlVmFsdWVfKGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQgcGVyZi10YWJsZS1udW0tZW50cnkgcGVyZi10YWJsZS1jbGlja2FibGUgcGVyZi10YWJsZS10ZXh0LWVudHJ5IiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRNdWx0aUNsYXNzRmVhdHVyZVZhbHVlQ291bnQoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdGV4dC1lbnRyeSBwZXJmLXRhYmxlLWNsaWNrYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRNb2RlbE5hbWVfKGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFjYyBwZXJmLXRhYmxlLWNsaWNrYWJsZSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7ZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10ZXh0LWVudHJ5IHBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldE11bHRpQ2xhc3NBY2N1cmFjeU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBmZWF0dXJlVmFsdWVUaHJlc2hvbGQpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC5vcGVuZWR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnktZXhwYW5kZWQgZmxleC1yb3ctcmV2ZXJzZSBzY3JvbGwteCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93RmVhdHVyZVByQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZi1tYXRyaXgtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb25mLXRleHQiPkNvbmZ1c2lvbiBtYXRyaXg8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2luZmVyZW5jZVN0YXRzX11dIiBhcz0iaW5mZXJlbmNlU3RhdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGYtY29uZnVzaW9uLW1hdHJpeCBjb3VudHM9IltbZ2V0TXVsdGlDbGFzc0NvbmZNYXRyaXgoaW5mZXJlbmNlU3RhdHNfLCBpbmRleCwgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dIiBsYWJlbD0iW1tnZXRDb25mdXNpb25NYXRyaXhMYWJlbChpbmRleCwgbnVtTW9kZWxzKV1dIiBiYWNrZ3JvdW5kPSJbW2dldENvbmZ1c2lvbk1hdHJpeENvbG9yKGluZGV4KV1dIiBhbGwtaXRlbXM9IltbYWxsQ29uZk1hdHJpeExhYmVsc11dIiBjbGFzcz0iY29uZi1tYXRyaXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1jb25mdXNpb24tbWF0cml4PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd092ZXJhbGxUaHJlc2hvbGRlcl8oc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXJvdy1leHBhbmRlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hcnJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iYXJyb3ctZHJvcC1kb3duIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciIGRpc2FibGVkPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwgcGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBkYXRhcG9pbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1jb3VudCBwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldE11bHRpQ2xhc3NGZWF0dXJlVmFsdWVDb3VudChpbmZlcmVuY2VTdGF0c18pXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRQZXJmVGFibGVNb2RlbENsYXNzKG51bU1vZGVscyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e292ZXJhbGxUaHJlc2hvbGRzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0TW9kZWxOYW1lXyhpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hY2MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tpbmZlcmVuY2VTdGF0c19dXSIgYXM9ImluZmVyZW5jZVN0YXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRleHQtZW50cnkgcGVyZi10YWJsZS1udW0tZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0TXVsdGlDbGFzc0FjY3VyYWN5TW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyeS1leHBhbmRlZCBmbGV4LXJvdy1yZXZlcnNlIHNjcm9sbC14Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3VsZFNob3dPdmVyYWxsUHJDaGFydF8oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwgaW5mZXJlbmNlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZi1tYXRyaXgtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYtdGV4dCI+Q29uZnVzaW9uIG1hdHJpeDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tpbmZlcmVuY2VTdGF0c19dXSIgYXM9ImluZmVyZW5jZVN0YXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGYtY29uZnVzaW9uLW1hdHJpeCBjb3VudHM9IltbZ2V0TXVsdGlDbGFzc0NvbmZNYXRyaXgoaW5mZXJlbmNlU3RhdHNfLCBpbmRleCldXSIgbGFiZWw9IltbZ2V0Q29uZnVzaW9uTWF0cml4TGFiZWwoaW5kZXgsIG51bU1vZGVscyldXSIgYmFja2dyb3VuZD0iW1tnZXRDb25mdXNpb25NYXRyaXhDb2xvcihpbmRleCldXSIgYWxsLWl0ZW1zPSJbW2FsbENvbmZNYXRyaXhMYWJlbHNdXSIgY2xhc3M9ImNvbmYtbWF0cml4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1jb25mdXNpb24tbWF0cml4PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc1JlZ3Jlc3Npb25fKG1vZGVsVHlwZSldXSIgcmVzdGFtcD4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10aXRsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0Tm9UaHJlc2hvbGRQZXJmVGFibGVUaXRsZShzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkcyldXQogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHBlcmZvcm1hbmNlLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJhdXRvIiB2ZXJ0aWNhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVncmVzc2lvbiBQZXJmb3JtYW5jZSBUYWJsZQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGdyb3VuZCB0cnV0aCBmZWF0dXJlIHRvIGV4cGxvcmUgbW9kZWwKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2UgdGhlIGRhdGFzZXQgYW5kIGV4cGxvcmUgbW9kZWwgcGVyZm9ybWFuY2UgYnkKICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZS4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgY2xhc3M9InRocmVzaG9sZC1kcm9wZG93biBwZXJmLXRhYmxlLXNvcnQtbWVudSI+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEZlYXR1cmVTb3J0fX0iIGF0dHItZm9yLXNlbGVjdGVkPSJuYW1lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRGZWF0dXJlU29ydEJ5KG1vZGVsVHlwZSwgbXVsdGlDbGFzcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iW1tpdGVtXV0iPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXZhbCI+RmVhdHVyZSBWYWx1ZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQiPkNvdW50PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lcnJvciI+TWVhbiBlcnJvcjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZXJyb3IiPk1lZGlhbiBlcnJvcjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZXJyb3IiPk1lYW4gYWJzb2x1dGUgZXJyb3I8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVycm9yIj5NZWRpYW4gYWJzb2x1dGUgZXJyb3I8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXNxLWVycm9yIj5NZWFuIHNxdWFyZWQgZXJyb3I8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXNxLWVycm9yIj5NZWRpYW4gc3F1YXJlZCBlcnJvcjwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyaWVzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tyZWdyZXNzaW9uRW50cmllc19dXSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYXJyb3ciPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdmFsIHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW0ubmFtZV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1jb3VudCBwZXJmLXRhYmxlLW51bS1lbnRyeSBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tpdGVtLmNvdW50XV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVycm9yIHBlcmYtdGFibGUtbnVtLWVudHJ5IHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2Zvcm1hdEVycm9yKGl0ZW0ubWVhbkVycm9yKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lcnJvciBwZXJmLXRhYmxlLW51bS1lbnRyeSBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tmb3JtYXRFcnJvcihpdGVtLm1lZGlhbkVycm9yKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lcnJvciBwZXJmLXRhYmxlLW51bS1lbnRyeSBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tmb3JtYXRFcnJvcihpdGVtLm1lYW5BYnNFcnJvcildXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtc3EtZXJyb3IgcGVyZi10YWJsZS1udW0tZW50cnkgcGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZm9ybWF0RXJyb3IoaXRlbS5tZWRpYW5BYnNFcnJvcildXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZXJyb3IgcGVyZi10YWJsZS1udW0tZW50cnkgcGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZm9ybWF0RXJyb3IoaXRlbS5tZWFuU3F1YXJlZEVycm9yKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1zcS1lcnJvciBwZXJmLXRhYmxlLW51bS1lbnRyeSBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tmb3JtYXRFcnJvcihpdGVtLm1lZGlhblNxdWFyZWRFcnJvcildXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXRzLXRhYiI+CiAgICAgICAgICAgICAgPGZhY2V0cy1vdmVydmlldyBpZD0ib3ZlcnZpZXciIHNlYXJjaC1zdHJpbmc9Int7ZmVhdHVyZVNlYXJjaFZhbHVlfX0iPjwvZmFjZXRzLW92ZXJ2aWV3PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvaXJvbi1wYWdlcz4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWludGVyYWN0aXZlLWluZmVyZW5jZS1kYXNoYm9hcmQvdGYtaW50ZXJhY3RpdmUtaW5mZXJlbmNlLWRhc2hib2FyZC5odG1sLmpzCmZ1bmN0aW9uIHJxKGEpe2EmJmEucGFyZW50RWxlbWVudCYmYS5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEpfQooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtaW50ZXJhY3RpdmUtaW5mZXJlbmNlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFBrLkNhbmNlbGxlcn0sZXhhbXBsZXNQYXRoOnt0eXBlOlN0cmluZ30sbW9kZWxOYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoibW9kZWxOYW1lQ2hhbmdlZF8ifSxwYXJzZWRNb2RlbE5hbWVzOnt0eXBlOlN0cmluZ30saW5mZXJlbmNlQWRkcmVzczp7dHlwZTpTdHJpbmd9LG1vZGVsVHlwZTp7dHlwZTpTdHJpbmd9LG1vZGVsU2lnbmF0dXJlOnt0eXBlOlN0cmluZ30sbW9kZWxWZXJzaW9uOnt0eXBlOlN0cmluZ30sbWF4RXhhbXBsZXM6e3R5cGU6TnVtYmVyfSxsYWJlbFZvY2FiUGF0aDp7dHlwZTpTdHJpbmd9LG1heEluZmVyZW5jZUVudHJpZXNQZXJSdW46TnVtYmVyLGluZmVyZW5jZXM6e3R5cGU6T2JqZWN0LApvYnNlcnZlcjoibmV3SW5mZXJlbmNlc18iLHZhbHVlOigpPT4oe30pfSxhdHRyaWJ1dGlvbnM6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJuZXdBdHRyaWJ1dGlvbnNfIn0sZXhhbXBsZXNBbmRJbmZlcmVuY2VzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoiY29tcHV0ZVNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSJ9LHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZTp7dHlwZTpPYmplY3R9LGNvdW50ZXJmYWN0dWFsRXhhbXBsZUFuZEluZmVyZW5jZTp7dHlwZTpPYmplY3R9LHZpc2RhdGE6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxzZWxlY3RlZDp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10sb2JzZXJ2ZXI6ImNvbXB1dGVTZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UifSxjb21wYXJlZEluZGljZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxsYWJlbFZvY2FiOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sdXBkYXRlZEV4YW1wbGU6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITF9LGltYWdlRmVhdHVyZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbWFnZS9lbmNvZGVkIixyZWFkb25seTohMH0sc3RhdHM6T2JqZWN0LHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsb2JzZXJ2ZXI6ImJyZWFrZG93bkZlYXR1cmVTZWxlY3RlZF8ifSxzZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJicmVha2Rvd25GZWF0dXJlU2VsZWN0ZWRfIn0sc2VsZWN0ZWRMYWJlbEZlYXR1cmU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJsYWJlbEZlYXR1cmVTZWxlY3RlZF8ifSxuZWFyZXN0Q291bnRlcmZhY3R1YWxNb2RlbEluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowfSxpbmZlcmVuY2VTdGF0c186e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxmZWF0dXJlVmFsdWVUaHJlc2hvbGRzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sZmVhdHVyZVZhbHVlVGhyZXNob2xkc01hcDpPYmplY3QsCmRlZmF1bHRJbmZlcmVuY2VMYWJlbDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoicmVmcmVzaEluZmVyZW5jZXNfIn0sb3ZlcmFsbFRocmVzaG9sZHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxzaWRlVGFiU2VsZWN0ZWQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsb2JzZXJ2ZXI6InNpZGVUYWJTZWxlY3RlZENoYW5nZWRfIn0sbG9jYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoibG9jYWxDaGFuZ2VkXyJ9LGxvY2FsQXRsYXNVcmw6U3RyaW5nLHBhcnRpYWxEZXBQbG90RWxpZ2libGVGZWF0dXJlczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10sb2JzZXJ2ZXI6InBhcnRpYWxEZXBQbG90RWxpZ2libGVGZWF0dXJlc1NldCJ9LHBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sZXhhbXBsZURpc3BsYXlNb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RhY2tlZCJ9LGZlYXR1cmVTZWFyY2hWYWx1ZTpTdHJpbmcsaW5jb3JyZWN0UHJlZENvc3RSYXRpbzp7dHlwZTpOdW1iZXIsCnZhbHVlOjEsb2JzZXJ2ZXI6ImNvc3RSYXRpb0NoYW5nZWRfIn0sbXVsdGlDbGFzczp7dHlwZTpCb29sZWFufSxzZXF1ZW5jZUV4YW1wbGVzOnt0eXBlOkJvb2xlYW59LHNhbXBsaW5nT2Rkczp7dHlwZTpOdW1iZXJ9LHVzZVByZWRpY3RBcGk6e3R5cGU6Qm9vbGVhbn0scHJlZGljdE91dHB1dFRlbnNvcjp7dHlwZTpTdHJpbmd9LHByZWRpY3RJbnB1dFRlbnNvcjp7dHlwZTpTdHJpbmd9LGF4aXNQcmVjaXNpb246e3R5cGU6TnVtYmVyLHZhbHVlOjJ9LGRpc3RhbmNlU3RhdHNfOnt0eXBlOk9iamVjdH0sZmFjZXREaXN0U3dpdGNoOnt0eXBlOlN0cmluZyx2YWx1ZToiTDEifSxmYWNldERpc3RGZWF0dXJlTmFtZTp7dHlwZTpTdHJpbmd9LGZhY2V0RGlzdEZlYXR1cmVOYW1lczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LGZhY2V0RGlzdFNldHRpbmc6e3R5cGU6U3RyaW5nLHZhbHVlOiJjb2xvckJ5In0sZXhhbXBsZVN0YXR1c1N0cjp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vIGRhdGFwb2ludHMgbG9hZGVkIHlldCJ9LApzZWxlY3RlZEV4YW1wbGVOdW06e3R5cGU6TnVtYmVyLHZhbHVlOiIiLG9ic2VydmVyOiJzZWxlY3RlZEV4YW1wbGVJbnB1dENoYW5nZWRfIn0sc2VsZWN0ZWRFeGFtcGxlTWF4Ok51bWJlcixvcGVuZWRDb250ZXh0VG9vbHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sb3BlbmVkUGVyZm9ybWFuY2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sb3BlbmVkVHJ1ZUxhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LG9wZW5lZEV4cGxvcmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LG9wZW5lZEluZmVyZW5jZVJlc3VsdHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0scmVncmVzc2lvbkVudHJpZXNfOnt0eXBlOkFycmF5fSxuZWFyZXN0Q291bnRlcmZhY3R1YWxEaXN0Ont0eXBlOlN0cmluZyx2YWx1ZToiTDEifSx2aXNNb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToiZGl2ZSIsb2JzZXJ2ZXI6InZpc01vZGVDaGFuZ2VkXyJ9LG9wdGltaXphdGlvblNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZToiY3VzdG9tIiwKb2JzZXJ2ZXI6Im9wdGltaXphdGlvblNlbGVjdGVkQ2hhbmdlZF8ifSxjb21wYXJlVGl0bGU6U3RyaW5nLGF0dHJpYnV0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sZ2xvYmFsUGRQbG90czp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxudW1Nb2RlbHM6e3R5cGU6TnVtYmVyLHJlYWRPbmx5OiEwfSxzaG93TmVhcmVzdENvdW50ZXJmYWN0dWFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGVkRmVhdHVyZVNvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb3VudCIsb2JzZXJ2ZXI6InNlbGVjdGVkRmVhdHVyZVNvcnRDaGFuZ2VkXyJ9LHBkUGxvdENvbG9yczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W2QzLmNvbG9yKCJyZ2IoMzEsIDExOSwgMTgwKSIpLGQzLmNvbG9yKCJyZ2IoMjU1LCAxMjcsIDE0KSIpLGQzLmNvbG9yKCJyZ2IoNDQsIDE2MCwgNDQpIiksZDMuY29sb3IoInJnYigyMTQsIDM5LCA0MCkiKSxkMy5jb2xvcigicmdiKDE0OCwgMTAzLCAxODkpIiksZDMuY29sb3IoInJnYigxNDAsIDg2LCA3NSkiKSwKZDMuY29sb3IoInJnYigyMjcsIDExOSwgMTk0KSIpLGQzLmNvbG9yKCJyZ2IoMTI3LCAxMjcsIDEyNykiKSxkMy5jb2xvcigicmdiKDE4OCwgMTg5LCAzNCkiKSxkMy5jb2xvcigicmdiKDIzLCAxOTAsIDIwNykiKV19LHBkUGxvdFRyYW5zcGFyZW50Q29sb3JzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bZDMuY29sb3IoInJnYmEoMzEsIDExOSwgMTgwLCAwLjMpIiksZDMuY29sb3IoInJnYmEoMjU1LCAxMjcsIDE0LCAwLjMpIiksZDMuY29sb3IoInJnYmEoNDQsIDE2MCwgNDQsIDAuMykiKSxkMy5jb2xvcigicmdiYSgyMTQsIDM5LCA0MCwgMC4zKSIpLGQzLmNvbG9yKCJyZ2JhKDE0OCwgMTAzLCAxODksIDAuMykiKSxkMy5jb2xvcigicmdiYSgxNDAsIDg2LCA3NSwgMC4zKSIpLGQzLmNvbG9yKCJyZ2JhKDIyNywgMTE5LCAxOTQsIDAuMykiKSxkMy5jb2xvcigicmdiYSgxMjcsIDEyNywgMTI3LCAwLjMpIiksZDMuY29sb3IoInJnYmEoMTg4LCAxODksIDM0LCAwLjMpIiksZDMuY29sb3IoInJnYmEoMjMsIDE5MCwgMjA3LCAwLjMpIildfSwKcm9jQ3VydmVDb2xvcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltkMy5jb2xvcigicmdiKDE4LCAxODEsIDIwNikiKSxkMy5jb2xvcigicmdiKDI1MCwgMTIwLCAyMykiKV19LHJvY0N1cnZlTGluZUNvbG9yczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W2QzLmNvbG9yKCJyZ2JhKDE4LCAxODEsIDIwNiwgMC42KSIpLGQzLmNvbG9yKCJyZ2JhKDI1MCwgMTIwLCAyMywgMC42KSIpXX0sY29uZk1hdHJpeENvbG9yczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W2QzLmNvbG9yKCJyZ2IoMTgsIDE4MSwgMjA2KSIpLGQzLmNvbG9yKCJyZ2IoMjUwLCAxMjAsIDIzKSIpXX0sYWxsQ29uZk1hdHJpeExhYmVsczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LHNwaW5uZXJIaWRkZW5fOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxvYnNlcnZlcnM6WyJzZXRGYWNldERpc3RGZWF0dXJlTmFtZShmYWNldERpc3RTd2l0Y2gsIHNlbGVjdGVkKSIsIm5lYXJlc3RDb3VudGVyZmFjdHVhbFN0YXR1c0NoYW5nZWRfKHNob3dOZWFyZXN0Q291bnRlcmZhY3R1YWwsIG5lYXJlc3RDb3VudGVyZmFjdHVhbE1vZGVsSW5kZXgsIG5lYXJlc3RDb3VudGVyZmFjdHVhbERpc3QpIl0sCnJlbG9hZDpmdW5jdGlvbigpe30sb3BlbkRpYWxvZzpmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpO2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCJwYXBlci1kaWFsb2ciKS5vcGVuKCl9LHJlYWR5OmZ1bmN0aW9uKCl7Y29uc3QgYT1kMy5zZWxlY3QodGhpcy4kLnNpZGUpLGM9ZDMuc2VsZWN0KHRoaXMuJC5jZW50ZXIpLGQ9ZDMuc2VsZWN0KHRoaXMuJC5yZXNpemVyKSxmPXRoaXMsZz1kMy5kcmFnKCkub24oImRyYWciLCgpPT57bGV0IGw9ZDMubW91c2UodGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUpWzBdL3RoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm9mZnNldFdpZHRoKjEwMDtsPU1hdGgubWF4KGwsMjApO2Muc3R5bGUoIndpZHRoIiwxMDAtbCsiJSIpO2Euc3R5bGUoIndpZHRoIixsKyIlIik7Zi4kLmRpdmUuJC52aXMuX3VwZGF0ZUdyaWRGYWNldGluZygpO2YuJC5kaXZlLiQudmlzLl9vbklyb25SZXNpemUoKX0pOwpkLmNhbGwoZyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChQay5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGE9Pnsid2hhdGlmImluIGE/dGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKToodGhpcy4kLmluZmVyZW5jZXNldHRpbmdzLmNsb3NlKCksdGhpcy4kLmluaXRpYWxEaWFsb2cub3Blbk5vVGVuc29yRmxvd0RpYWxvZygpKX0pfSxzZXR0aW5nc0NsaWNrZWRfOmZ1bmN0aW9uKCl7dGhpcy4kLmluZmVyZW5jZXNldHRpbmdzLnRvZ2dsZSgpfSxsb2NhbENoYW5nZWRfOmZ1bmN0aW9uKCl7dGhpcy5sb2NhbCYmdGhpcy5jbG9zZVNldHRpbmdzXygpfSxtb2RlbE5hbWVDaGFuZ2VkXzpmdW5jdGlvbigpe3RoaXMucGFyc2VkTW9kZWxOYW1lcz10aGlzLm1vZGVsTmFtZS5zcGxpdCgiLCIpLm1hcChhPT5hLnRyaW0oKSk7Zm9yKGxldCBhPTA7YTx0aGlzLnBhcnNlZE1vZGVsTmFtZXMubGVuZ3RoO2ErKyl7Y29uc3QgYz0KdGhpcy5wYXJzZWRNb2RlbE5hbWVzW2FdO2ZvcihsZXQgZD1hKzE7ZDx0aGlzLnBhcnNlZE1vZGVsTmFtZXMubGVuZ3RoO2QrKyl0aGlzLnBhcnNlZE1vZGVsTmFtZXNbZF09PWMmJih0aGlzLnBhcnNlZE1vZGVsTmFtZXNbYV09YysiICIrKGErMSksdGhpcy5wYXJzZWRNb2RlbE5hbWVzW2RdPWMrIiAiKyhkKzEpKX19LGNsb3NlU2V0dGluZ3NfOmZ1bmN0aW9uKCl7dGhpcy4kLmluZmVyZW5jZXNldHRpbmdzLmNsb3NlKCl9LHNob3dEaXN0YW5jZUNsaWNrZWRfOmZ1bmN0aW9uKCl7dGhpcy4kLmRpc3RhbmNlZGlhbG9nLnRvZ2dsZSgpfSxhZGREaXN0YW5jZU1ldHJpYzpmdW5jdGlvbigpe3RoaXMuZmFjZXREaXN0RmVhdHVyZU5hbWVzLnB1c2godGhpcy5mYWNldERpc3RGZWF0dXJlTmFtZSk7Y29uc3QgYT10aGlzLnNlbGVjdGVkWzBdLGM9IkwyIj09dGhpcy5mYWNldERpc3RTd2l0Y2g7Zm9yKGxldCBkPTA7ZDx0aGlzLnZpc2RhdGEubGVuZ3RoO2QrKyl7bGV0IGY9dGhpcy5nZXREaXN0KHRoaXMudmlzZGF0YVthXSwKdGhpcy52aXNkYXRhW2RdLGMpO3RoaXMudmlzZGF0YVtkXVt0aGlzLmZhY2V0RGlzdEZlYXR1cmVOYW1lXT1mfXRoaXMucmVmcmVzaERpdmVfKCk7ImNvbG9yQnkiPT10aGlzLmZhY2V0RGlzdFNldHRpbmc/dGhpcy4kLmRpdmUuY29sb3JCeT10aGlzLmZhY2V0RGlzdEZlYXR1cmVOYW1lOiJ2ZXJ0aWNhbEZhY2V0Ij09dGhpcy5mYWNldERpc3RTZXR0aW5nP3RoaXMuJC5kaXZlLnZlcnRpY2FsRmFjZXQ9dGhpcy5mYWNldERpc3RGZWF0dXJlTmFtZToiaG9yaXpvbnRhbEZhY2V0Ij09dGhpcy5mYWNldERpc3RTZXR0aW5nP3RoaXMuJC5kaXZlLmhvcml6b250YWxGYWNldD10aGlzLmZhY2V0RGlzdEZlYXR1cmVOYW1lOiJ2ZXJ0aWNhbFBvc2l0aW9uIj09dGhpcy5mYWNldERpc3RTZXR0aW5nP3RoaXMuJC5kaXZlLnZlcnRpY2FsUG9zaXRpb249dGhpcy5mYWNldERpc3RGZWF0dXJlTmFtZToiaG9yaXpvbnRhbFBvc2l0aW9uIj09dGhpcy5mYWNldERpc3RTZXR0aW5nJiYodGhpcy4kLmRpdmUuaG9yaXpvbnRhbFBvc2l0aW9uPQp0aGlzLmZhY2V0RGlzdEZlYXR1cmVOYW1lKX0sc2V0RmFjZXREaXN0RmVhdHVyZU5hbWU6ZnVuY3Rpb24oYSxjKXt0aGlzLmZhY2V0RGlzdEZlYXR1cmVOYW1lPSIgIithKyIgZGlzdGFuY2UgdG8gZGF0YXBvaW50ICIrY1swXX0sbmVhcmVzdENvdW50ZXJmYWN0dWFsU3RhdHVzQ2hhbmdlZF86ZnVuY3Rpb24oYSl7YT90aGlzLmZpbmRDbG9zZXN0Q291bnRlcmZhY3R1YWxfKCk6KHRoaXMuY29tcGFyZWRJbmRpY2VzPVtdLHRoaXMuY291bnRlcmZhY3R1YWxFeGFtcGxlQW5kSW5mZXJlbmNlPW51bGwsYT10aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSx0aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZT1udWxsLHRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlPWEpfSxmaW5kQ2xvc2VzdENvdW50ZXJmYWN0dWFsXzpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5zZWxlY3RlZFswXSxjPXRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLHRoaXMubmVhcmVzdENvdW50ZXJmYWN0dWFsTW9kZWxJbmRleCk7CmxldCBkPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxmPS0xO2ZvcihsZXQgZz0wO2c8dGhpcy52aXNkYXRhLmxlbmd0aDtnKyspe2lmKHRoaXMudmlzZGF0YVthXVtjXT09dGhpcy52aXNkYXRhW2ddW2NdKWNvbnRpbnVlO2xldCBsPXRoaXMuZ2V0RGlzdCh0aGlzLnZpc2RhdGFbYV0sdGhpcy52aXNkYXRhW2ddLCJMMiI9PXRoaXMubmVhcmVzdENvdW50ZXJmYWN0dWFsRGlzdCk7bDxkJiYoZD1sLGY9Zyl9LTEhPWYmJih0aGlzLmNvbXBhcmVkSW5kaWNlcz1bZl0sdGhpcy5jb3VudGVyZmFjdHVhbEV4YW1wbGVBbmRJbmZlcmVuY2U9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbZl0sdGhpcy5jb21wYXJlVGl0bGU9IkNvdW50ZXJmYWN0dWFsIHZhbHVlKHMpIil9LGdldERpc3Q6ZnVuY3Rpb24oYSxjLGQpe2xldCBmPTA7Y29uc3QgZz1bLi4ubmV3IFNldChbLi4uT2JqZWN0LmtleXMoYSksLi4uT2JqZWN0LmtleXMoYyldKV07Zm9yKGxldCBrPTA7azxnLmxlbmd0aDtrKyspe3ZhciBsPQpnW2tdO2lmKHRoaXMuaXNDb21wdXRlZEtleVN0cl8obCl8fGw9PXRoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmV8fHRoaXMuc3RhdHNbbF0udW5pcXVlQ291bnQ9PXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aCljb250aW51ZTtsZXQgbT1hW2xdLHA9Y1tsXTtBcnJheS5pc0FycmF5KG0pfHwobT1bbV0pO0FycmF5LmlzQXJyYXkocCl8fChwPVtwXSk7Y29uc3QgcT1NYXRoLm1heChtLmxlbmd0aCxwLmxlbmd0aCk7bGV0IHI9MDtmb3IobGV0IHQ9MDt0PHE7dCsrKXI9bnVsbCE9dGhpcy5kaXN0YW5jZVN0YXRzX1tsXS5zdGREZXY/cit0aGlzLmdldE51bWVyaWNEaXN0KG1bdF0scFt0XSx0aGlzLmRpc3RhbmNlU3RhdHNfW2xdKTpyK3RoaXMuZ2V0Q2F0ZWdvcmljYWxEaXN0KG1bdF0scFt0XSx0aGlzLmRpc3RhbmNlU3RhdHNfW2xdKTtsPXIvcTtkJiYobCo9bCk7Zis9bH1yZXR1cm4gZn0sZ2V0TnVtZXJpY0Rpc3Q6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBudWxsPT1hfHwKbnVsbD09Yz8xOmQuc3RkRGV2P01hdGguYWJzKChhLWMpL2Quc3RkRGV2KTowfSxnZXRDYXRlZ29yaWNhbERpc3Q6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBudWxsPT1hfHxudWxsPT1jPzE6YT09Yz8wOmQucHJvYlNhbWVWYWx1ZX0sdmlzTW9kZUNoYW5nZWRfOmZ1bmN0aW9uKGEpeyJkaXZlIj09YT90aGlzLmhpZGVQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzXygpOnRoaXMuc2hvd1BhcnRpYWxEZXBlbmRlbmNlUGxvdHNfKCl9LGhpZGVQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzXzpmdW5jdGlvbigpe3RoaXMuJC5wYXJ0aWFscGxvdGhvbGRlci5zdHlsZS5kaXNwbGF5PSJub25lIn0sc2hvd1BhcnRpYWxEZXBlbmRlbmNlUGxvdHNfOmZ1bmN0aW9uKCl7dGhpcy4kLnBhcnRpYWxwbG90aG9sZGVyLnN0eWxlLmRpc3BsYXk9ImZsZXgiO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy5wb3B1bGF0ZVBkVGFicygpKX0sYXJlVGhlcmVQZFBsb3RGZWF0dXJlc186ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJgowPGEubGVuZ3RofSxzZWxlY3RlZEluZGljZXNDaGFuZ2VkXzpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdGVkPWEuZGV0YWlsLnZhbHVlO3RoaXMuc2V0QXR0cmlidXRpb25zKCk7dGhpcy5zZWxlY3RlZERhdGFVcGRhdGVkXygpO3RoaXMuc2hvd05lYXJlc3RDb3VudGVyZmFjdHVhbCYmMCE9dGhpcy5zZWxlY3RlZC5sZW5ndGg/dGhpcy5maW5kQ2xvc2VzdENvdW50ZXJmYWN0dWFsXygpOnRoaXMuY29tcGFyZWRJbmRpY2VzPVtdfSxzZWxlY3ROZXh0RGF0YXBvaW50XzpmdW5jdGlvbigpe3RoaXMuJC5kaXZlLnNlbGVjdGVkSW5kaWNlcz1bKHRoaXMuc2VsZWN0ZWRbMF0rMSkldGhpcy52aXNkYXRhLmxlbmd0aF19LHNlbGVjdFByZXZEYXRhcG9pbnRfOmZ1bmN0aW9uKCl7dGhpcy4kLmRpdmUuc2VsZWN0ZWRJbmRpY2VzPVsoKHRoaXMuc2VsZWN0ZWRbMF0tMSkldGhpcy52aXNkYXRhLmxlbmd0aCt0aGlzLnZpc2RhdGEubGVuZ3RoKSV0aGlzLnZpc2RhdGEubGVuZ3RoXX0sc2VsZWN0ZWRFeGFtcGxlSW5wdXRDaGFuZ2VkXzpmdW5jdGlvbihhKXtudWxsIT0KYSYmIiIhPWEmJihhPSthLGlzTmFOKGEpfHwwPmF8fGE+PXRoaXMudmlzZGF0YS5sZW5ndGh8fCh0aGlzLiQuZGl2ZS5zZWxlY3RlZEluZGljZXM9W2FdKSl9LHNldEV4YW1wbGVDb2xsYXBzZWRfOmZ1bmN0aW9uKCl7dGhpcy5leGFtcGxlRGlzcGxheU1vZGU9ImdyaWQiO3RoaXMuJCQoIiN2aWV3ZXIiKS5leHBhbmRlZEZlYXR1cmVzPXt9O3RoaXMuJCQoIiN2aWV3ZXIiKS5leHBhbmRBbGxGZWF0dXJlcz0hMTt0aGlzLiQkKCIjdmlld2VyIikucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKX0sc2V0RXhhbXBsZVNob3dfOmZ1bmN0aW9uKCl7dGhpcy5leGFtcGxlRGlzcGxheU1vZGU9ImdyaWQiO3RoaXMuJCQoIiN2aWV3ZXIiKS5leHBhbmRBbGxGZWF0dXJlcz0hMH0sc2V0RXhhbXBsZUV4cGFuZGVkXzpmdW5jdGlvbigpe3RoaXMuZXhhbXBsZURpc3BsYXlNb2RlPSJzdGFja2VkIjt0aGlzLiQkKCIjdmlld2VyIikuZXhwYW5kQWxsRmVhdHVyZXM9ITB9LHN0YXRzQ2hhbmdlZF86ZnVuY3Rpb24oYSl7dGhpcy5zdGF0cz0KYS5kZXRhaWwudmFsdWV9LGlzQmluYXJ5Q2xhc3NpZmljYXRpb25fOmZ1bmN0aW9uKGEsYyl7cmV0dXJuImNsYXNzaWZpY2F0aW9uIj09YSYmIWN9LGlzTXVsdGlDbGFzc186ZnVuY3Rpb24oYSxjKXtyZXR1cm4iY2xhc3NpZmljYXRpb24iPT1hJiZjfSxpc1JlZ3Jlc3Npb25fOmZ1bmN0aW9uKGEpe3JldHVybiJyZWdyZXNzaW9uIj09YX0sc2hvdWxkU2hvd0ZlYXR1cmVEcm9wZG93bl86ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJjA8T2JqZWN0LmtleXMoYSkubGVuZ3RofSxzaG91bGRTaG93U2Vjb25kRmVhdHVyZURyb3Bkb3duXzpmdW5jdGlvbihhKXtyZXR1cm4iIiE9YX0sc2hvdWxkU2hvd0xhYmVsRHJvcGRvd25fOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYwPE9iamVjdC5rZXlzKGEpLmxlbmd0aH0sc2hvdWxkSGlkZUNvdW50ZXJmYWN0dWFsTW9kZWxTZWxlY3Rvcl86ZnVuY3Rpb24oYSl7cmV0dXJuIShhJiYxPGEubGVuZ3RoKX0sc2hvdWxkU2hvd092ZXJhbGxQckNoYXJ0XzpmdW5jdGlvbihhLApjLGQpe3JldHVybiIiIT1hJiYiIj09YyYmbnVsbCE9ZH0sc2hvdWxkU2hvd0ZlYXR1cmVQckNoYXJ0c186ZnVuY3Rpb24oYSxjLGQpe3JldHVybiIiIT1hJiYiIiE9YyYmbnVsbCE9ZH0sc2hvdWxkU2hvd0Nvc3RSYXRpb186ZnVuY3Rpb24oYSxjLGQpe3JldHVybiIiIT1hJiZ0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKGMsZCl9LGFyZVBhcnRpYWxEZXBlbmRlbmNlUGxvdHNFbmFibGVkXzpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuaGFzU2VsZWN0ZWQoYSkmJnRoaXMuYXJlRXhhbXBsZXNFZGl0YWJsZV8oYyxkKX0saGFzU2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWF9LGdldEZlYXR1cmVMaXN0XzpmdW5jdGlvbihhKXthPU9iamVjdC5rZXlzKGEpLmZpbHRlcihjPT4hdGhpcy5pc0NvbXB1dGVkS2V5U3RyXyhjKSkuc29ydCgpO2EucHVzaCgiIik7cmV0dXJuIGF9LHN0clN0YXJ0c1dpdGhfOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDA9PWEubGFzdEluZGV4T2YoYywKMCl9LGdldE1vZGVsTmFtZV86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucGFyc2VkTW9kZWxOYW1lc1thXX0sc3RyV2l0aE1vZGVsTmFtZV86ZnVuY3Rpb24oYSxjKXtyZXR1cm4gMTx0aGlzLm51bU1vZGVscz9hKyIgIit0aGlzLmdldE1vZGVsTmFtZV8oYyk6YX0sdXBkYXRlTnVtYmVyT2ZNb2RlbHM6ZnVuY3Rpb24oKXt0aGlzLl9zZXROdW1Nb2RlbHModGhpcy5tb2RlbE5hbWUuc3BsaXQoIiwiKS5sZW5ndGgpO3RoaXMuc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlPXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlPXRoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmU9IiI7Y29uc3QgYT1bXTtmb3IobGV0IGM9MDtjPHRoaXMubnVtTW9kZWxzO2MrKylhLnB1c2goe3RocmVzaG9sZDouNX0pO3RoaXMuc2V0KCJvdmVyYWxsVGhyZXNob2xkcyIsYSk7dGhpcy5zaG91bGREaXNhYmxlSW5mZXJCdXR0b25fKHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLHRoaXMubW9kZWxOYW1lLAp0aGlzLmluZmVyZW5jZUFkZHJlc3MsdGhpcy51cGRhdGVkRXhhbXBsZSl8fHRoaXMuaW5mZXJDbGlja2VkXygpfSxpc0NvbXB1dGVkS2V5U3RyXzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdHJTdGFydHNXaXRoXyhhLCIgSW5mZXJlbmNlIHZhbHVlIil8fHRoaXMuc3RyU3RhcnRzV2l0aF8oYSwiIEluZmVyZW5jZSBsYWJlbCIpfHx0aGlzLnN0clN0YXJ0c1dpdGhfKGEsIiBJbmZlcmVuY2UgY29ycmVjdCIpfHx0aGlzLnN0clN0YXJ0c1dpdGhfKGEsIiBJbmZlcmVuY2UgZXJyb3IiKXx8dGhpcy5zdHJTdGFydHNXaXRoXyhhLCIgSW5mZXJlbmNlIHNjb3JlIil8fHRoaXMuc3RyU3RhcnRzV2l0aF8oYSwiIEluZmVyZW5jZSBhYnNvbHV0ZSBlcnJvciIpfHx0aGlzLnN0clN0YXJ0c1dpdGhfKGEsIiBJbmZlcmVuY2Ugc3F1YXJlZCBlcnJvciIpfHwiIERhdGFwb2ludCBJRCI9PWF8fC0xIT10aGlzLmZhY2V0RGlzdEZlYXR1cmVOYW1lcy5pbmRleE9mKGEpfSxicmVha2Rvd25GZWF0dXJlU2VsZWN0ZWRfOmZ1bmN0aW9uKCl7dGhpcy5yZXNldE9wdGltaXphdGlvblNlbGVjdGVkXygpOwpjb25zdCBhPXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlOyIiPT1hJiYodGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmU9IiIpO2NvbnN0IGM9dGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUsZD1bXSxmPXt9O2lmKDAhPT1hLmxlbmd0aCl7bGV0IG09dGhpcy5zdGF0c1thXS52YWx1ZUhhc2g7dGhpcy5zdGF0c1thXS50b3RhbENvdW50IT10aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcy5sZW5ndGgmJihtPU9iamVjdC5hc3NpZ24oe30sbSx7dW5kZWZpbmVkOiIifSkpO2xldCBwPXt1bmRlZmluZWQ6IiJ9OzAhPWMubGVuZ3RoJiYocD10aGlzLnN0YXRzW2NdLnZhbHVlSGFzaCx0aGlzLnN0YXRzW2NdLnRvdGFsQ291bnQhPXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aCYmKHA9T2JqZWN0LmFzc2lnbih7fSxwLHt1bmRlZmluZWQ6IiJ9KSkpO2Zvcih2YXIgZyBpbiBtKWlmKG0uaGFzT3duUHJvcGVydHkoZykpZm9yKHZhciBsIGluIHApaWYocC5oYXNPd25Qcm9wZXJ0eShsKSl7Y29uc3QgcT0KInVuZGVmaW5lZCI9PWc/dm9pZCAwOnRoaXMuc3RhdHNbYV0udmFsdWVIYXNoW2ddLnZhbHVlLHI9InVuZGVmaW5lZCI9PWw/dm9pZCAwOnRoaXMuc3RhdHNbY10udmFsdWVIYXNoW2xdLnZhbHVlO3ZhciBrPVtdO2ZvcihsZXQgdD0wO3Q8dGhpcy5vdmVyYWxsVGhyZXNob2xkcy5sZW5ndGg7dCsrKWsucHVzaCh7dGhyZXNob2xkOnRoaXMub3ZlcmFsbFRocmVzaG9sZHNbdF0udGhyZXNob2xkfSk7az17dmFsdWU6cSx2YWx1ZTI6cix0aHJlc2hvbGQ6ayxvcGVuZWQ6ITF9O2QucHVzaChrKTtmW3RoaXMuY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ18ocSxyKV09a319dGhpcy5zZXQoImZlYXR1cmVWYWx1ZVRocmVzaG9sZHMiLGQpO3RoaXMuc2V0KCJmZWF0dXJlVmFsdWVUaHJlc2hvbGRzTWFwIixmKTt0aGlzLnJlZnJlc2hJbmZlcmVuY2VzXyghMSl9LGxhYmVsRmVhdHVyZVNlbGVjdGVkXzpmdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMudXBkYXRlSW5mZXJlbmNlU3RhdHNfKCEwKTsKdGhpcy5yZWZyZXNoRGl2ZV8oKX0pfSxzaWRlVGFiU2VsZWN0ZWRDaGFuZ2VkXzpmdW5jdGlvbihhKXtpZigxPT1hKXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMudXBkYXRlSW5mZXJlbmNlU3RhdHNfKCEwKX0pO2Vsc2UgaWYoMj09YSl7YT10aGlzLiQub3ZlcnZpZXcucXVlcnlTZWxlY3RvckFsbCgiZmFjZXRzLW92ZXJ2aWV3LXRhYmxlIik7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXS5faGFuZGxlUmVzaXplKCl9fSx1cGRhdGVJbmZlcmVuY2VTdGF0c186ZnVuY3Rpb24oYSl7aWYodGhpcy5pbmZlcmVuY2VTdGF0c18mJnRoaXMudmlzZGF0YSYmIiIhPXRoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmUmJjAhPXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aCYmbnVsbCE9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbMF0uaW5mZXJlbmNlcyYmdGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbMF0uaW5mZXJlbmNlc1swXS5sZW5ndGg9PXRoaXMubnVtTW9kZWxzJiYKKHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aD09dGhpcy5udW1Nb2RlbHN8fGEpKXtpZihhKXt2YXIgYz1bXSxkPVtdO2Zvcih2YXIgZj0wO2Y8dGhpcy5udW1Nb2RlbHM7ZisrKXt2YXIgZz17fTtpZih0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykpe2cudGhyZXNob2xkcz1bXTtmb3IodmFyIGw9MDsxMDE+bDtsKyspZy50aHJlc2hvbGRzLnB1c2goe1RQOjAsRlA6MCxGTjowLFROOjB9KTtnLmZhY2V0ZWQ9e307Zm9yKGw9MDtsPHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aDtsKyspe3ZhciBrPXRoaXMudmlzZGF0YVtsXSxtPW51bGw7aWYoIiIhPXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlKXt2YXIgcD10aGlzLmNyZWF0ZUNvbWJpbmVkVmFsdWVTdHJpbmdfKGtbdGhpcy5zZWxlY3RlZEJyZWFrZG93bkZlYXR1cmVdLGtbdGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmVdKTttPWcuZmFjZXRlZFtwXTsKaWYoIW0pe2cuZmFjZXRlZFtwXT1bXTtmb3IobT0wOzEwMT5tO20rKylnLmZhY2V0ZWRbcF0ucHVzaCh7VFA6MCxGUDowLEZOOjAsVE46MH0pO209Zy5mYWNldGVkW3BdfX1wPXRoaXMuZ2V0Q2xhc3NpZmljYXRpb25CZXN0Tm9uWmVybyhsLGYpO2Zvcih2YXIgcT0wOzEwMD49cSYmIShxPjEwMCpwLnNjb3JlKTtxKyspK2tbdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV09PStwLmxhYmVsPyhnLnRocmVzaG9sZHNbcV0uVFArPTEsbSYmKG1bcV0uVFArPTEpKTooZy50aHJlc2hvbGRzW3FdLkZQKz0xLG0mJihtW3FdLkZQKz0xKSk7Zm9yKDsxMDA+PXE7cSsrKW51bGw9PWtbdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV18fDA9PStrW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdPyhnLnRocmVzaG9sZHNbcV0uVE4rPTEsbSYmKG1bcV0uVE4rPTEpKTooZy50aHJlc2hvbGRzW3FdLkZOKz0xLG0mJihtW3FdLkZOKz0xKSl9dGhpcy5hbGxDb25mTWF0cml4TGFiZWxzPVtdO3RoaXMuY2FsY1RocmVzaG9sZFN0YXRzKGcudGhyZXNob2xkcyk7CmZvcih2YXIgciBpbiBnLmZhY2V0ZWQpZy5mYWNldGVkLmhhc093blByb3BlcnR5KHIpJiZ0aGlzLmNhbGNUaHJlc2hvbGRTdGF0cyhnLmZhY2V0ZWRbcl0pfWVsc2UgaWYodGhpcy5pc011bHRpQ2xhc3NfKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykpe2cucmVzdWx0cz17fTtnLmZhY2V0ZWQ9e307bD1uZXcgU2V0O2ZvcihrPTA7azx0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcy5sZW5ndGg7aysrKXttPXRoaXMudmlzZGF0YVtrXTtwPW51bGw7IiIhPXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlJiYocT10aGlzLmNyZWF0ZUNvbWJpbmVkVmFsdWVTdHJpbmdfKG1bdGhpcy5zZWxlY3RlZEJyZWFrZG93bkZlYXR1cmVdLG1bdGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmVdKSxwPWcuZmFjZXRlZFtxXSxwfHwoZy5mYWNldGVkW3FdPXt9LHA9Zy5mYWNldGVkW3FdKSk7dmFyIHQ9Zy5yZXN1bHRzW21bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV1dOwp0fHwoZy5yZXN1bHRzW21bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV1dPXt9LHQ9Zy5yZXN1bHRzW21bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV1dKTtxPXRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLGYpO2xldCB2PXRbbVtxXV07bC5hZGQoU3RyaW5nKG1bcV0pKTtsLmFkZChTdHJpbmcobVt0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlXSkpO3RbbVtxXV09bnVsbD09dj8xOnRbbVtxXV0rMTtwJiYodD1wW21bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV1dLHR8fChwW21bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV1dPXt9LHQ9cFttW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdXSksdFttW3FdXT1udWxsPT10W21bcV1dPzE6dFttW3FdXSsxKX10aGlzLmFsbENvbmZNYXRyaXhMYWJlbHM9QXJyYXkuZnJvbShsLnZhbHVlcygpKX1lbHNle2cucmVzdWx0cz17ZXJyb3JzOltdfTtnLmZhY2V0ZWQ9e307Zm9yKGw9MDtsPHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aDtsKyspbT0KdGhpcy52aXNkYXRhW2xdLGs9bnVsbCwiIiE9dGhpcy5zZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUmJihwPXRoaXMuY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ18obVt0aGlzLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZV0sbVt0aGlzLnNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZV0pLGs9Zy5mYWNldGVkW3BdLGt8fChnLmZhY2V0ZWRbcF09e2Vycm9yczpbXX0saz1nLmZhY2V0ZWRbcF0pKSxtPW1bdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsZildLW1bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV0sZy5yZXN1bHRzLmVycm9ycy5wdXNoKG0pLGsmJmsuZXJyb3JzLnB1c2gobSk7ZC5wdXNoKHRoaXMuZmlsbEluUmVncmVzc2lvblN0YXRzKGcucmVzdWx0cyx0aGlzLmZvcm1hdENoYXJ0S2V5KCJBbGwgZGF0YXBvaW50cyIsZix0aGlzLm51bU1vZGVscykpKTtmb3IobGV0IHYgaW4gZy5mYWNldGVkKWQucHVzaCh0aGlzLmZpbGxJblJlZ3Jlc3Npb25TdGF0cyhnLmZhY2V0ZWRbdl0sCnRoaXMuZm9ybWF0Q2hhcnRLZXkodixmLHRoaXMubnVtTW9kZWxzKSkpfWMucHVzaChnKX1kPXRoaXMuc29ydFJlZ3Jlc3Npb25FbnRyaWVzKGQpO3RoaXMucmVncmVzc2lvbkVudHJpZXNfPVtdO3RoaXMucmVncmVzc2lvbkVudHJpZXNfPWQ7dGhpcy5pbmZlcmVuY2VTdGF0c189Y31jPXRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkczt0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHM9W107dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzPXRoaXMuc29ydEZlYXR1cmVWYWx1ZXMoYyk7aWYodGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpKXtmb3IoYz0wO2M8dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzLmxlbmd0aDtjKyspe2Q9W107Zj1bXTtnPXRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1tjXS50aHJlc2hvbGQ7Zm9yKHI9MDtyPGcubGVuZ3RoO3IrKylkLnB1c2godGhpcy5pbmZlcmVuY2VTdGF0c19bcl0uZmFjZXRlZFt0aGlzLmNyZWF0ZUNvbWJpbmVkVmFsdWVTdHJpbmdfKHRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1tjXS52YWx1ZSwKdGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzW2NdLnZhbHVlMildKSxmLnB1c2goZ1tyXS50aHJlc2hvbGQpO3RoaXMucGxvdENoYXJ0KHRoaXMuJCQoIiMiK3RoaXMuZ2V0Um9jQ2hhcnRJZChjKSksZCxmLGEsITApO3RoaXMucGxvdENoYXJ0KHRoaXMuJCQoIiMiK3RoaXMuZ2V0UHJDaGFydElkKGMpKSxkLGYsYSwhMSl9Yz1bXTtkPVtdO2ZvcihmPTA7Zjx0aGlzLmluZmVyZW5jZVN0YXRzXy5sZW5ndGg7ZisrKWMucHVzaCh0aGlzLmluZmVyZW5jZVN0YXRzX1tmXS50aHJlc2hvbGRzKSxkLnB1c2godGhpcy5vdmVyYWxsVGhyZXNob2xkc1tmXS50aHJlc2hvbGQpO3RoaXMucGxvdENoYXJ0KHRoaXMuJCQoIiNyb2NjaGFydCIpLGMsZCxhLCEwKTt0aGlzLnBsb3RDaGFydCh0aGlzLiQkKCIjcHJjaGFydCIpLGMsZCxhLCExKX10aGlzLnVwZGF0ZUNvcnJlY3RuZXNzXygpfX0sc29ydEZlYXR1cmVWYWx1ZXM6ZnVuY3Rpb24oYSl7Y29uc3QgYz10aGlzLmluZmVyZW5jZVN0YXRzX1swXTsKYT1hLmZpbHRlcihkPT50aGlzLmlzUmVncmVzc2lvbl8odGhpcy5tb2RlbFR5cGUpPzA8dGhpcy5nZXRSZWdyZXNzaW9uQ291bnQoYyxkKTp0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcyk/MDx0aGlzLmdldEJpbmFyeUNsYXNzaWZpY2F0aW9uQ291bnQoYyxkKTowPHRoaXMuZ2V0TXVsdGljbGFzc0NsYXNzaWZpY2F0aW9uQ291bnQoYyxkKSk7cmV0dXJuIGEuc29ydCgoZCxmKT0+e2lmKCJDb3VudCI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gdGhpcy5pc1JlZ3Jlc3Npb25fKHRoaXMubW9kZWxUeXBlKT90aGlzLmdldFJlZ3Jlc3Npb25Db3VudChjLGYpLXRoaXMuZ2V0UmVncmVzc2lvbkNvdW50KGMsZCk6dGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpP3RoaXMuZ2V0QmluYXJ5Q2xhc3NpZmljYXRpb25Db3VudChjLGYpLXRoaXMuZ2V0QmluYXJ5Q2xhc3NpZmljYXRpb25Db3VudChjLApkKTp0aGlzLmdldE11bHRpY2xhc3NDbGFzc2lmaWNhdGlvbkNvdW50KGMsZiktdGhpcy5nZXRNdWx0aWNsYXNzQ2xhc3NpZmljYXRpb25Db3VudChjLGQpO2lmKCJBbHBoYWJldGljYWwiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuIHRoaXMuZ2V0UHJpbnRhYmxlVmFsdWVfKGQpLmxvY2FsZUNvbXBhcmUodGhpcy5nZXRQcmludGFibGVWYWx1ZV8oZikpO2lmKCJBY2N1cmFjeSI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gdGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpPyt0aGlzLmdldEFjY3VyYWN5TW9kZWxJbmRleCh0aGlzLmluZmVyZW5jZVN0YXRzXyxmLnRocmVzaG9sZCwwLGYpLSt0aGlzLmdldEFjY3VyYWN5TW9kZWxJbmRleCh0aGlzLmluZmVyZW5jZVN0YXRzXyxkLnRocmVzaG9sZCwwLGQpOit0aGlzLmdldE11bHRpQ2xhc3NBY2N1cmFjeU1vZGVsSW5kZXgodGhpcy5pbmZlcmVuY2VTdGF0c18sCjAsZiktK3RoaXMuZ2V0TXVsdGlDbGFzc0FjY3VyYWN5TW9kZWxJbmRleCh0aGlzLmluZmVyZW5jZVN0YXRzXywwLGQpO2lmKCJGYWxzZSBwb3NpdGl2ZXMiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuK3RoaXMuZ2V0RlBNb2RlbEluZGV4KHRoaXMuaW5mZXJlbmNlU3RhdHNfLGYudGhyZXNob2xkLDAsZiktK3RoaXMuZ2V0RlBNb2RlbEluZGV4KHRoaXMuaW5mZXJlbmNlU3RhdHNfLGQudGhyZXNob2xkLDAsZCk7aWYoIkZhbHNlIG5lZ2F0aXZlcyI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gdGhpcy5nZXRGTk1vZGVsSW5kZXgoK3RoaXMuaW5mZXJlbmNlU3RhdHNfLGYudGhyZXNob2xkLDAsZiktK3RoaXMuZ2V0Rk5Nb2RlbEluZGV4KHRoaXMuaW5mZXJlbmNlU3RhdHNfLGQudGhyZXNob2xkLDAsZCl9KX0sc29ydFJlZ3Jlc3Npb25FbnRyaWVzOmZ1bmN0aW9uKGEpe3JldHVybiBhLnNvcnQoKGMsZCk9PntpZigiQ291bnQiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuIGQuY291bnQtCmMuY291bnQ7aWYoIkFscGhhYmV0aWNhbCI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gYy5uYW1lLmxvY2FsZUNvbXBhcmUoZC5uYW1lKTtpZigiTWVhbiBlcnJvciI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gZC5tZWFuRXJyb3ItYy5tZWFuRXJyb3I7aWYoIk1lYW4gYWJzb2x1dGUgZXJyb3IiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuIGQubWVhbkFic0Vycm9yLWMubWVhbkFic0Vycm9yO2lmKCJNZWFuIHNxdWFyZWQgZXJyb3IiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuIGQubWVhblNxdWFyZWRFcnJvci1jLm1lYW5TcXVhcmVkRXJyb3I7aWYoIk1lZGlhbiBlcnJvciI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gZC5tZWRpYW5FcnJvci1jLm1lZGlhbkVycm9yO2lmKCJNZWRpYW4gYWJzb2x1dGUgZXJyb3IiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuIGQubWVkaWFuQWJzRXJyb3ItYy5tZWRpYW5BYnNFcnJvcjsKaWYoIk1lZGlhbiBzcXVhcmVkIGVycm9yIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiBkLm1lZGlhblNxdWFyZWRFcnJvci1jLm1lZGlhblNxdWFyZWRFcnJvcn0pfSxmaWxsSW5SZWdyZXNzaW9uU3RhdHM6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGspe3JldHVybiBrLnJlZHVjZSgobSxwKT0+bStwLDApL2subGVuZ3RofWZ1bmN0aW9uIGYoayl7aWYoMD09ay5sZW5ndGgpcmV0dXJuIE5hTjtrPWsuc29ydCgocCxxKT0+cC1xKTtjb25zdCBtPWsubGVuZ3RoLzI7cmV0dXJuIDE9PWsubGVuZ3RoP2tbMF06MD09ay5sZW5ndGglMj9rW21dOihrW01hdGguZmxvb3IobSldK2tbTWF0aC5jZWlsKG0pXSkvMn1jb25zdCBnPWEuZXJyb3JzLm1hcChrPT5NYXRoLmFicyhrKSksbD1hLmVycm9ycy5tYXAoaz0+ayprKTtyZXR1cm57bmFtZTpjLG1lYW5FcnJvcjpkKGEuZXJyb3JzKSxtZWFuQWJzRXJyb3I6ZChnKSxtZWFuU3F1YXJlZEVycm9yOmQobCksbWVkaWFuRXJyb3I6ZihhLmVycm9ycyksCm1lZGlhbkFic0Vycm9yOmYoZyksbWVkaWFuU3F1YXJlZEVycm9yOmYobCksY291bnQ6YS5lcnJvcnMubGVuZ3RofX0scGxvdENoYXJ0OmZ1bmN0aW9uKGEsYyxkLGYsZyl7aWYoYyYmY1swXSYmYSl7dmFyIGw9W10saz1bXSxtPWc/IkZQUiI6IlRQUiIscD1nPyJUUFIiOiJQUFYiLHE9Zz8iRlBSIjoiUmVjYWxsIixyPWc/IlRQUiI6IlByZWNpc2lvbiI7Zm9yKGxldCB0PTA7dDxjLmxlbmd0aDt0Kyspe2xldCB2PW51bGw7Y29uc3QgQT1jW3RdLm1hcCgoeSx4KT0+ey41PngtMTAwKmRbdF0mJih2PXtzdGVwOnlbbV0sc2NhbGFyOnlbcF0sdGhyZXNob2xkOngvMTAwfSk7cmV0dXJue3N0ZXA6eVttXSxzY2FsYXI6eVtwXSx0aHJlc2hvbGQ6eC8xMDB9fSkucmV2ZXJzZSgpO2Euc2V0U2VyaWVzRGF0YSh0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCJUaHJlc2hvbGQgc2V0Iix0KSxbdl0pO2YmJihhLnNldFNlcmllc0RhdGEodGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiUk9DIix0KSxBKSxsLnB1c2godGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiUk9DIiwKdCkpLGwucHVzaCh0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCJUaHJlc2hvbGQgc2V0Iix0KSksay5wdXNoKHRoaXMucm9jQ3VydmVMaW5lQ29sb3JzW3RdKSxrLnB1c2godGhpcy5yb2NDdXJ2ZUNvbG9yc1t0XSkpfWlmKGYpe2NvbnN0IHQ9ZDMuZm9ybWF0KCIuMmYiKTthLnhBeGlzRm9ybWF0dGVyPWQzLmZvcm1hdCgiLjJmIik7Y29uc3Qgdj1kMy5mb3JtYXQoIiwuMSIpO2Y9W3t0aXRsZToiVGhyZXNob2xkIixldmFsdWF0ZTpmdW5jdGlvbihBKXtyZXR1cm4gdChBLmRhdHVtLnRocmVzaG9sZCl9fSx7dGl0bGU6cixldmFsdWF0ZTpmdW5jdGlvbihBKXtyZXR1cm4gZz92KEEuZGF0dW0uc2NhbGFyKTp0KEEuZGF0dW0uc2NhbGFyKX19LHt0aXRsZTpxLGV2YWx1YXRlOmZ1bmN0aW9uKEEpe3JldHVybiBnP3YoQS5kYXR1bS5zdGVwKTp0KEEuZGF0dW0uc3RlcCl9fV07MTxjLmxlbmd0aCYmZi5wdXNoKHt0aXRsZToiTW9kZWwiLGV2YWx1YXRlOmZ1bmN0aW9uKEEpe0E9QS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZS5zcGxpdCgiICIpOwpyZXR1cm4gQVtBLmxlbmd0aC0xXX19KTthLnRvb2x0aXBDb2x1bW5zPWY7YS5jb2xvclNjYWxlPShuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2Uoayk7YS5jb2xvclNjYWxlLmRvbWFpbihsKTthLnNldFZpc2libGVTZXJpZXMobCl9fX0sY2FsY1RocmVzaG9sZFN0YXRzOmZ1bmN0aW9uKGEpe2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uVFBSPTA8YVtjXS5UUCthW2NdLkZOP2FbY10uVFAvKGFbY10uVFArYVtjXS5GTik6MCxhW2NdLkZQUj0wPGFbY10uRlArYVtjXS5UTj9hW2NdLkZQLyhhW2NdLkZQK2FbY10uVE4pOjAsYVtjXS5QUFY9MDxhW2NdLlRQK2FbY10uRlA/YVtjXS5UUC8oYVtjXS5UUCthW2NdLkZQKTowfSxvcHRpbWl6YXRpb25TZWxlY3RlZENoYW5nZWRfOmZ1bmN0aW9uKGEpeyJjdXN0b20iIT1hJiYoInVuYXdhcmUiPT1hP3RoaXMub3B0aW1pemVUaHJlc2hvbGRDbGlja2VkXygpOiJncm91cCI9PWE/dGhpcy5vcHRpbWl6ZUZhY2V0ZWRUaHJlc2hvbGRzQ2xpY2tlZF8oKToKImRlbW9wYXJpdHkiPT1hP3RoaXMuZGVtb1Bhcml0eUNsaWNrZWRfKCk6ImVxdWFsYWNjIj09YT90aGlzLmVxdWFsQWNjQ2xpY2tlZF8oKToiZXF1YWxvcHAiPT1hJiZ0aGlzLmVxdWFsT3Bwb0NsaWNrZWRfKCksdGhpcy51cGRhdGVJbmZlcmVuY2VTdGF0c18oITApKX0sY29zdFJhdGlvQ2hhbmdlZF86ZnVuY3Rpb24oKXt0aGlzLnJlc2V0T3B0aW1pemF0aW9uU2VsZWN0ZWRfKCl9LHJlc2V0T3B0aW1pemF0aW9uU2VsZWN0ZWRfOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLiQkKCIjY3VzdG9tdGhyZXNoIik7bnVsbCE9YSYmYS5jbGljaygpfSxvcHRpbWl6ZVRocmVzaG9sZENsaWNrZWRfOmZ1bmN0aW9uKCl7Zm9yKGxldCBhPTA7YTx0aGlzLmluZmVyZW5jZVN0YXRzXy5sZW5ndGg7YSsrKXtjb25zdCBjPXRoaXMuZmluZE9wdGltYWxUaHJlc2hvbGRfKHRoaXMuaW5mZXJlbmNlU3RhdHNfW2FdLnRocmVzaG9sZHMpO3RoaXMuc2V0KCJvdmVyYWxsVGhyZXNob2xkcy4iK2ErIi50aHJlc2hvbGQiLApjKTtpZih0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMpZm9yKGxldCBkPTA7ZDx0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubGVuZ3RoO2QrKyl0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkcy4iK2QrIi50aHJlc2hvbGQuIithKyIudGhyZXNob2xkIixjKX19LG9wdGltaXplRmFjZXRlZFRocmVzaG9sZHNDbGlja2VkXzpmdW5jdGlvbigpe2ZvcihsZXQgYT0wO2E8dGhpcy5pbmZlcmVuY2VTdGF0c18ubGVuZ3RoO2ErKyl7Y29uc3QgYz1PYmplY3Qua2V5cyh0aGlzLmluZmVyZW5jZVN0YXRzX1thXS5mYWNldGVkKTtmb3IobGV0IGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkcy4iK2QrIi50aHJlc2hvbGQuIithKyIudGhyZXNob2xkIix0aGlzLmZpbmRPcHRpbWFsVGhyZXNob2xkXyh0aGlzLmluZmVyZW5jZVN0YXRzX1thXS5mYWNldGVkW2NbZF1dKSl9fSxmaW5kT3B0aW1hbFRocmVzaG9sZF86ZnVuY3Rpb24oYSl7bGV0IGM9Ck51bWJlci5QT1NJVElWRV9JTkZJTklUWSxkPTA7Zm9yKGxldCBmPTA7ZjxhLmxlbmd0aDtmKyspe2NvbnN0IGc9dGhpcy5nZXRDb3N0KGFbZl0pO2c8PWMmJihjPWcsZD1mKX1yZXR1cm4gZC8xMDB9LGVxdWFsT3Bwb0NsaWNrZWRfOmZ1bmN0aW9uKCl7dGhpcy5nZXRCZXN0VGhyZXNob2xkc0J5RmFpcm5lc3NNZWFzdXJlXyhhPT5hLlRQLyhhLlRQK2EuRk4pKX0sZXF1YWxBY2NDbGlja2VkXzpmdW5jdGlvbigpe3RoaXMuZ2V0QmVzdFRocmVzaG9sZHNCeUZhaXJuZXNzTWVhc3VyZV8oYT0+KGEuVFArYS5UTikvKGEuVFArYS5GUCthLlROK2EuRk4pKX0sZGVtb1Bhcml0eUNsaWNrZWRfOmZ1bmN0aW9uKCl7dGhpcy5nZXRCZXN0VGhyZXNob2xkc0J5RmFpcm5lc3NNZWFzdXJlXyhhPT4oYS5UUCthLkZQKS8oYS5UUCthLkZQK2EuVE4rYS5GTikpfSxnZXRCZXN0VGhyZXNob2xkc0J5RmFpcm5lc3NNZWFzdXJlXzpmdW5jdGlvbihhKXtmb3IobGV0IGY9MDtmPHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aDtmKyspe3ZhciBjPQpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZD1udWxsO2NvbnN0IGc9dGhpcy5pbmZlcmVuY2VTdGF0c19bZl0sbD1PYmplY3Qua2V5cyhnLmZhY2V0ZWQpLGs9Zy5mYWNldGVkW2xbMF1dO2ZvcihsZXQgbT0wO208ay5sZW5ndGg7bSsrKXtjb25zdCBwPWEoa1ttXSkscT1bbV07bGV0IHI9dGhpcy5nZXRDb3N0KGtbbV0pO2ZvcihsZXQgdD0xO3Q8bC5sZW5ndGg7dCsrKXtjb25zdCB2PWcuZmFjZXRlZFtsW3RdXSxBPXRoaXMudGhyZXNob2xkQ2xvc2VzdFRvTWVhc3VyZSh2LHAsYSk7cS5wdXNoKEEpO3IrPXRoaXMuZ2V0Q29zdCh2W0FdKX1yPD1jJiYoYz1yLGQ9cSl9Zm9yKGM9MDtjPGwubGVuZ3RoO2MrKyl0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkc01hcC4iK2xbY10rIi50aHJlc2hvbGQuIitmKyIudGhyZXNob2xkIixkW2NdLzEwMCk7Zm9yKGQ9MDtkPHRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkcy5sZW5ndGg7ZCsrKXRoaXMuc2V0KCJmZWF0dXJlVmFsdWVUaHJlc2hvbGRzLiIrCmQrIi50aHJlc2hvbGQuIitmKyIudGhyZXNob2xkIix0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHNbZF0udGhyZXNob2xkW2ZdLnRocmVzaG9sZCl9fSxnZXRDb3N0OmZ1bmN0aW9uKGEpe3JldHVybiBhLkZQKnRoaXMuaW5jb3JyZWN0UHJlZENvc3RSYXRpbythLkZOfSx0aHJlc2hvbGRDbG9zZXN0VG9NZWFzdXJlOmZ1bmN0aW9uKGEsYyxkKXtsZXQgZj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZz0wO2ZvcihsZXQgaz0wO2s8YS5sZW5ndGg7aysrKXt2YXIgbD1kKGFba10pO2w9TWF0aC5hYnMobC1jKTtsPD1mJiYoZz1rLGY9bCl9cmV0dXJuIGd9LGdldENsYXNzaWZpY2F0aW9uQmVzdE5vblplcm86ZnVuY3Rpb24oYSxjKXtsZXQgZD0wO2NvbnN0IGY9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbYV0uaW5mZXJlbmNlcy5sZW5ndGgtMTtmb3IobGV0IGc9MDtnPHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2FdLmluZmVyZW5jZXNbZl1bY10ubGVuZ3RoO2crKylpZigwIT09Cit0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1thXS5pbmZlcmVuY2VzW2ZdW2NdW2ddLmxhYmVsKXtkPWc7YnJlYWt9cmV0dXJuIHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2FdLmluZmVyZW5jZXNbZl1bY11bZF19LGdldENvbmZ1c2lvbkNvdW50c01vZGVsSW5kZXg6ZnVuY3Rpb24oYSxjLGQsZil7cmV0dXJuIHRoaXMub3ZlcmFsbFRocmVzaG9sZHMubGVuZ3RoIT10aGlzLm51bU1vZGVsc3x8dGhpcy5pbmZlcmVuY2VTdGF0c18ubGVuZ3RoIT10aGlzLm51bU1vZGVscz97fTp0aGlzLmdldENvbmZ1c2lvbkNvdW50cyh0aGlzLmluZmVyZW5jZVN0YXRzX1tkXSxjW2RdLnRocmVzaG9sZCxmKX0sZ2V0VG90YWxFbnRyaWVzSW5Db25mQ291bnRzOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpcmV0dXJuIDA7bGV0IGM9MDtjb25zdCBkPU9iamVjdC5rZXlzKGEpO2ZvcihsZXQgZj0wO2Y8ZC5sZW5ndGg7ZisrKXtjb25zdCBnPWFbZFtmXV0sbD1PYmplY3Qua2V5cyhnKTtmb3IobGV0IGs9CjA7azxsLmxlbmd0aDtrKyspYys9Z1tsW2tdXX1yZXR1cm4gY30sZ2V0RlBNb2RlbEluZGV4OmZ1bmN0aW9uKGEsYyxkLGYpe2E9dGhpcy5nZXRDb25mdXNpb25Db3VudHNNb2RlbEluZGV4KGEsYyxkLGYpO2lmKDA9PU9iamVjdC5rZXlzKGEpLmxlbmd0aClyZXR1cm4gbnVsbDtjPWEuTm8uWWVzO3JldHVybiBkMy5mb3JtYXQoIiwuMWYiKShjL3RoaXMuZ2V0VG90YWxFbnRyaWVzSW5Db25mQ291bnRzKGEpKjEwMCl9LGdldEZOTW9kZWxJbmRleDpmdW5jdGlvbihhLGMsZCxmKXthPXRoaXMuZ2V0Q29uZnVzaW9uQ291bnRzTW9kZWxJbmRleChhLGMsZCxmKTtpZigwPT1PYmplY3Qua2V5cyhhKS5sZW5ndGgpcmV0dXJuIDA7Yz1hLlllcy5ObztyZXR1cm4gZDMuZm9ybWF0KCIsLjFmIikoYy90aGlzLmdldFRvdGFsRW50cmllc0luQ29uZkNvdW50cyhhKSoxMDApfSxnZXRBY2N1cmFjeU1vZGVsSW5kZXg6ZnVuY3Rpb24oYSxjLGQsZil7YT10aGlzLmdldENvbmZ1c2lvbkNvdW50c01vZGVsSW5kZXgoYSwKYyxkLGYpO2lmKDA9PU9iamVjdC5rZXlzKGEpLmxlbmd0aClyZXR1cm4gMDtjPWEuWWVzLlllcythLk5vLk5vO3JldHVybiBkMy5mb3JtYXQoIiwuMWYiKShjL3RoaXMuZ2V0VG90YWxFbnRyaWVzSW5Db25mQ291bnRzKGEpKjEwMCl9LGdldEYxTW9kZWxJbmRleDpmdW5jdGlvbihhLGMsZCxmKXtjb25zdCBnPWQzLmZvcm1hdCgiLC4yZiIpO2Q9dGhpcy5nZXRDb25mdXNpb25Db3VudHNNb2RlbEluZGV4KGEsYyxkLGYpO2lmKDA9PU9iamVjdC5rZXlzKGQpLmxlbmd0aClyZXR1cm4gMDthPWQuWWVzLlllcztjPWQuTm8uWWVzO2Q9ZC5ZZXMuTm87aWYoMD09YSlyZXR1cm4gMCE9Y3x8MCE9ZD9nKDApOmcoMSk7Yz1hLyhhK2MpO2EvPWErZDtyZXR1cm4gZygyKmMqYS8oYythKSl9LGdldEZlYXR1cmVWYWx1ZUNvdW50OmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5nZXRUb3RhbEVudHJpZXNJbkNvbmZDb3VudHModGhpcy5nZXRDb25mdXNpb25Db3VudHNNb2RlbEluZGV4KGEsYywwLApkKSl9LGdldENvbmZ1c2lvbk1hdHJpeExhYmVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDI+Yz8iIjp0aGlzLmdldE1vZGVsTmFtZV8oYSl9LGdldENvbmZ1c2lvbk1hdHJpeENvbG9yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbmZNYXRyaXhDb2xvcnNbYV19LGdldENvbmZ1c2lvbkNvdW50cyhhLGMsZCl7bGV0IGY9bnVsbCxnPW51bGw7bnVsbCE9ZCYmKGY9ZC52YWx1ZSxnPWQudmFsdWUyKTtyZXR1cm57Tm86e05vOnRoaXMuZ2V0Q29uZk1hdHJpeFZhbHVlKGEsYywiVE4iLGYsZyksWWVzOnRoaXMuZ2V0Q29uZk1hdHJpeFZhbHVlKGEsYywiRlAiLGYsZyl9LFllczp7Tm86dGhpcy5nZXRDb25mTWF0cml4VmFsdWUoYSxjLCJGTiIsZixnKSxZZXM6dGhpcy5nZXRDb25mTWF0cml4VmFsdWUoYSxjLCJUUCIsZixnKX19fSxnZXRDb25mTWF0cml4VmFsdWU6ZnVuY3Rpb24oYSxjLGQsZixnKXtjPU1hdGguZmxvb3IoMTAwKmMpO2lmKCFhLnRocmVzaG9sZHMpcmV0dXJuIDA7aWYobnVsbD09PQpmKXJldHVybiBhLnRocmVzaG9sZHNbY11bZF07Zj10aGlzLmNyZWF0ZUNvbWJpbmVkVmFsdWVTdHJpbmdfKGYsZyk7cmV0dXJuIG51bGw9PWEuZmFjZXRlZFtmXT8wOmEuZmFjZXRlZFtmXVtjXVtkXX0sZ2V0TXVsdGlDbGFzc0NvbmZNYXRyaXg6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiAwPT1hLmxlbmd0aD97fTpudWxsPT1kP2FbY10ucmVzdWx0czphW2NdLmZhY2V0ZWRbdGhpcy5nZXRQcmludGFibGVWYWx1ZV8oZCldfSxnZXRNdWx0aUNsYXNzRmVhdHVyZVZhbHVlQ291bnQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRUb3RhbEVudHJpZXNJbkNvbmZDb3VudHModGhpcy5nZXRNdWx0aUNsYXNzQ29uZk1hdHJpeChhLDAsYykpfSxnZXRNdWx0aUNsYXNzQWNjdXJhY3lNb2RlbEluZGV4OmZ1bmN0aW9uKGEsYyxkKXthPXRoaXMuZ2V0TXVsdGlDbGFzc0NvbmZNYXRyaXgoYSxjLGQpO2lmKG51bGw9PWEpcmV0dXJuIG51bGw7Yz0wO2Q9T2JqZWN0LmtleXMoYSk7Zm9yKGxldCBmPQowO2Y8ZC5sZW5ndGg7ZisrKXtjb25zdCBnPWFbZFtmXV0sbD1PYmplY3Qua2V5cyhnKTtmb3IobGV0IGs9MDtrPGwubGVuZ3RoO2srKylkW2ZdPT1sW2tdJiYoYys9Z1tsW2tdXSl9cmV0dXJuIGQzLmZvcm1hdCgiLC4xZiIpKGMvdGhpcy5nZXRUb3RhbEVudHJpZXNJbkNvbmZDb3VudHMoYSkqMTAwKX0sZ2V0SW5mZXJlbmNlU3RhdDpmdW5jdGlvbihhLGMsZCxmKXthPWM/YS5mYWNldGVkW3RoaXMuZ2V0UHJpbnRhYmxlVmFsdWVfKGMpXTphLnJlc3VsdHM7aWYoIWEpcmV0dXJuIG51bGw7ZD1kKGEpO3JldHVybiBmP2YoZCk6ZH0sZ2V0UmVncmVzc2lvbk1lYW46ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRJbmZlcmVuY2VTdGF0KGEsYyxkPT5kLm1lYW4sZDMuZm9ybWF0KCIuM2YiKSl9LGdldFJlZ3Jlc3Npb25BYnNNZWFuOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0SW5mZXJlbmNlU3RhdChhLGMsZD0+ZC5hYnNNZWFuLGQzLmZvcm1hdCgiLjNmIikpfSxnZXRSZWdyZXNzaW9uU3F1YXJlZE1lYW46ZnVuY3Rpb24oYSwKYyl7cmV0dXJuIHRoaXMuZ2V0SW5mZXJlbmNlU3RhdChhLGMsZD0+ZC5zcXVhcmVkTWVhbixkMy5mb3JtYXQoIi4zZiIpKX0sZ2V0UmVncmVzc2lvbkNvdW50OmZ1bmN0aW9uKGEsYyl7YT10aGlzLmdldEluZmVyZW5jZVN0YXQoYSxjLGQ9PmQuZXJyb3JzLmxlbmd0aCxudWxsKTtyZXR1cm4gbnVsbD09YT8wOmF9LGdldEJpbmFyeUNsYXNzaWZpY2F0aW9uQ291bnQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRJbmZlcmVuY2VTdGF0KGEsYyxkPT5PYmplY3QudmFsdWVzKGRbMF0pLnJlZHVjZSgoZixnKT0+ZitnKSxudWxsKX0sZ2V0TXVsdGljbGFzc0NsYXNzaWZpY2F0aW9uQ291bnQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRJbmZlcmVuY2VTdGF0KGEsYyxkPT5PYmplY3QudmFsdWVzKGQpLnJlZHVjZSgoZixnKT0+e2xldCBsPTA7Y29uc3Qgaz1PYmplY3Qua2V5cyhnKTtmb3IobGV0IG09MDttPGsubGVuZ3RoO20rKylsKz1nW2tbbV1dO3JldHVybiBmK2x9LDApLApudWxsKX0sZ2V0Um9jQ2hhcnRJZDpmdW5jdGlvbihhKXtyZXR1cm4icm9jY2hhcnQiK2F9LGdldFByQ2hhcnRJZDpmdW5jdGlvbihhKXtyZXR1cm4icHJjaGFydCIrYX0sZ2V0UHJpbnRhYmxlVmFsdWVfOmZ1bmN0aW9uKGEpe2xldCBjO2M9YS52YWx1ZXx8MD09PWEudmFsdWU/U3RyaW5nKGEudmFsdWUpOiJceDNjZmVhdHVyZSB2YWx1ZSBtaXNzaW5nXHgzZSI7aWYoIiI9PXRoaXMuc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlKXJldHVybiBjO2MrPSIvIjtyZXR1cm4gYz1hLnZhbHVlMnx8MD09PWEudmFsdWUyP2MrYS52YWx1ZTI6YysiXHgzY2ZlYXR1cmUgdmFsdWUgbWlzc2luZ1x4M2UifSxnZXRGZWF0dXJlTmFtZV86ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1hLmxlbmd0aD8iXHgzY25vbmVceDNlIjphfSxnZXRDb3VudGVyZmFjdHVhbE1vZGVsTmFtZV86ZnVuY3Rpb24oYSl7cmV0dXJuIk1vZGVsOiAiK2F9LGdldENsYXNzTmFtZV86ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT0KYS5sZW5ndGg/Ilx4M2Nub25lXHgzZSI6YX0sc2hvdWxkU2hvd092ZXJhbGxUaHJlc2hvbGRlcl86ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1hLmxlbmd0aH0sY29tcHV0ZVNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZTpmdW5jdGlvbigpe3RoaXMuY291bnRlcmZhY3R1YWxFeGFtcGxlQW5kSW5mZXJlbmNlPW51bGw7dGhpcy5zZWxlY3RlZCYmdGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXM/KHRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlPTA8dGhpcy5zZWxlY3RlZC5sZW5ndGg/dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbdGhpcy5zZWxlY3RlZFswXV06bnVsbCxudWxsPT10aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZT90aGlzLmdsb2JhbFBkUGxvdHM9ITA6KHRoaXMuZ2xvYmFsUGRQbG90cz0hMSwiZGl2ZSIhPXRoaXMudmlzTW9kZSYmdGhpcy5zaG93UGFydGlhbERlcGVuZGVuY2VQbG90c18oKSkpOnRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlPQpudWxsfSxzZXRBdHRyaWJ1dGlvbnM6ZnVuY3Rpb24oKXtjb25zdCBhPXt9LGM9dGhpcy52aXNkYXRhW3RoaXMuc2VsZWN0ZWRbMF1dLGQ9L2F0dHJpYnV0aW9uc19fKC4qKS8sZj0vYXR0cmlidXRpb25zX18oLiopX2tleXMvO2ZvcihsZXQgbCBpbiBjKXt2YXIgZz1kLmV4ZWMobCk7aWYoZyl7Zz1uZXcgUmVnRXhwKCJeKGZlYXR1cmVzX18pPyIrZ1sxXSsiJCIpO2ZvcihsZXQgayBpbiBjKWlmKGcudGVzdChrKSl7YVtrXT1jW2xdO2JyZWFrfX1pZihnPWYuZXhlYyhsKSl7Zz1uZXcgUmVnRXhwKCJeKGZlYXR1cmVzX18pPyIrZ1sxXSsiJCIpO2ZvcihsZXQgayBpbiBjKWlmKGcudGVzdChrKSl7Zz1jW2xdO2NvbnN0IG09Y1tsLnJlcGxhY2UoIl9rZXlzIiwiX3ZhbHVlcyIpXSxwPUFycmF5LmFwcGx5KG51bGwsQXJyYXkoQXJyYXkuaXNBcnJheShjW2tdKT9jW2tdLmxlbmd0aDoxKSkubWFwKE51bWJlci5wcm90b3R5cGUudmFsdWVPZiwwKTtmb3IobGV0IHE9MDtxPGcubGVuZ3RoO3ErKyl7bGV0IHI9CmNba10uaW5kZXhPZihnW3FdKTstMSE9ciYmKHBbcl09bVtxXSl9YVtrXT1wO2JyZWFrfX19dGhpcy5hdHRyaWJ1dGlvbj1hfSxzaG91bGREaXNhYmxlR2V0RXhhbXBsZXNCdXR0b25fOmZ1bmN0aW9uKGEpe3JldHVybiAwPT1hLmxlbmd0aH0sc2hvdWxkRGlzYWJsZUluZmVyQnV0dG9uXzpmdW5jdGlvbihhLGMsZCxmKXtyZXR1cm4gMD09YS5sZW5ndGh8fDA9PWMubGVuZ3RofHwwPT1kLmxlbmd0aHx8IWZ9LGFyZUV4YW1wbGVzRWRpdGFibGVfOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDAhPWEubGVuZ3RoJiYwIT1jLmxlbmd0aH0sbmV3SW5mZXJlbmNlc186ZnVuY3Rpb24oKXt0aGlzLnNwaW5uZXJIaWRkZW5fPSEwO3RoaXMudXBkYXRlSW5mZXJlbmNlc18oITApO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy51cGRhdGVJbmZlcmVuY2VTdGF0c18oITApKX0scmVmcmVzaEluZmVyZW5jZXNOb1JlZ2VuXzpmdW5jdGlvbigpe3RoaXMucmVmcmVzaEluZmVyZW5jZXNfKCEwKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pgp0aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghMCkpfSxyZWZyZXNoSW5mZXJlbmNlc186ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVJbmZlcmVuY2VzXyghMSk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghYSkpfSx1cGRhdGVJbmZlcmVuY2VzXzpmdW5jdGlvbihhKXtpZih0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcyYmdGhpcy5pbmZlcmVuY2VzLmluZGljZXMmJjAhPXRoaXMuaW5mZXJlbmNlcy5pbmRpY2VzLmxlbmd0aCYmdGhpcy5pbmZlcmVuY2VzLnJlc3VsdHMubGVuZ3RoPT10aGlzLm51bU1vZGVscyl7dmFyIGM9e30sZD0hIXRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzWzBdLmNsYXNzaWZpY2F0aW9uUmVzdWx0O2ZvcihsZXQgaz0wO2s8dGhpcy5pbmZlcmVuY2VzLmluZGljZXMubGVuZ3RoO2srKylpZihkKXtjW3RoaXMuaW5mZXJlbmNlcy5pbmRpY2VzW2tdXT1bXTtmb3IodmFyIGY9MDtmPHRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzLmxlbmd0aDtmKyspe2NvbnN0IG09CnRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzW2ZdLmNsYXNzaWZpY2F0aW9uUmVzdWx0O2ZvcihsZXQgcD0wO3A8bS5jbGFzc2lmaWNhdGlvbnNba10uY2xhc3Nlcy5sZW5ndGg7cCsrKSIiPT1tLmNsYXNzaWZpY2F0aW9uc1trXS5jbGFzc2VzW3BdLmxhYmVsJiYobS5jbGFzc2lmaWNhdGlvbnNba10uY2xhc3Nlc1twXS5sYWJlbD1wLnRvU3RyaW5nKCkpO2NbdGhpcy5pbmZlcmVuY2VzLmluZGljZXNba11dW2ZdPW0uY2xhc3NpZmljYXRpb25zW2tdLmNsYXNzZXMuc29ydCgocCxxKT0+cS5zY29yZS1wLnNjb3JlKX19ZWxzZSBmb3IoY1t0aGlzLmluZmVyZW5jZXMuaW5kaWNlc1trXV09W10sZj0wO2Y8dGhpcy5pbmZlcmVuY2VzLnJlc3VsdHMubGVuZ3RoO2YrKyljW3RoaXMuaW5mZXJlbmNlcy5pbmRpY2VzW2tdXVtmXT1be2xhYmVsOiIiLHNjb3JlOnRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzW2ZdLnJlZ3Jlc3Npb25SZXN1bHQucmVncmVzc2lvbnNba10udmFsdWV9XTt0aGlzLnNldCgiZXhhbXBsZXNBbmRJbmZlcmVuY2VzIiwKdGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubWFwKGZ1bmN0aW9uKGssbSl7bGV0IHA9ay5pbmZlcmVuY2VzP2suaW5mZXJlbmNlczpbXTtjW21dJiZhJiYocD1wLmNvbmNhdChbY1ttXV0pKTtyZXR1cm57ZXhhbXBsZTprLmV4YW1wbGUsaW5mZXJlbmNlczpwLGNoYW5nZWQ6ay5jaGFuZ2VkLG9yaWc6ay5vcmlnfX0pKTt2YXIgZz10aGlzLGw9ITE7dGhpcy52aXNkYXRhLmZvckVhY2goZnVuY3Rpb24oayxtKXtpZihkKWcuc2V0SXRlbUluZmVyZW5jZVZhbHVlKGssbSxnLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSxnLnNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZSk7ZWxzZSBmb3IodmFyIHA9MDtwPGcubnVtTW9kZWxzO3ArKylrW2cuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLHApXT1nLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1ttXS5pbmZlcmVuY2VzW2cuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW21dLmluZmVyZW5jZXMubGVuZ3RoLTFdW3BdWzBdLnNjb3JlOwppZihkJiYwPGcubGFiZWxWb2NhYi5sZW5ndGgpe2ZvcihwPTA7cDxnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1ttXS5pbmZlcmVuY2VzLmxlbmd0aDtwKyspZm9yKGxldCBxPTA7cTxnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1ttXS5pbmZlcmVuY2VzW3BdLmxlbmd0aDtxKyspZm9yKGxldCByPTA7cjxnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1ttXS5pbmZlcmVuY2VzW3BdW3FdLmxlbmd0aDtyKyspZy5leGFtcGxlc0FuZEluZmVyZW5jZXNbbV0uaW5mZXJlbmNlc1twXVtxXVtyXS52b2NhYkxhYmVsPWcubGFiZWxWb2NhYltnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1ttXS5pbmZlcmVuY2VzW3BdW3FdW3JdLmxhYmVsXTtmb3IobT0wO208Zy5udW1Nb2RlbHM7bSsrKWtbZy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBsYWJlbCIsbSldPWcubGFiZWxWb2NhYltrW2cuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLG0pXV07bD0hMH19KTt0aGlzLnVwZGF0ZUNvcnJlY3RuZXNzXygpOwp0aGlzLnJlZnJlc2hEaXZlXygpO3RoaXMuaW5mZXJlbmNlcy5pbmRpY2VzLmxlbmd0aD09dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoJiYodGhpcy4kLmRpdmUuY29sb3JCeT1sP3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgbGFiZWwiLDApOnRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLDApLHRoaXMuaXNSZWdyZXNzaW9uXyh0aGlzLm1vZGVsVHlwZSk/KHRoaXMuJC5kaXZlLmhvcml6b250YWxQb3NpdGlvbj10aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIiwwKSwxPHRoaXMubnVtTW9kZWxzJiYodGhpcy4kLmRpdmUudmVydGljYWxQb3NpdGlvbj10aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIiwxKSkpOnRoaXMuaXNCaW5hcnlDbGFzc2lmaWNhdGlvbl8odGhpcy5tb2RlbFR5cGUsdGhpcy5tdWx0aUNsYXNzKSYmKDE9PXRoaXMubnVtTW9kZWxzP3RoaXMuJC5kaXZlLnZlcnRpY2FsUG9zaXRpb249CnRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2Ugc2NvcmUiLDApOih0aGlzLiQuZGl2ZS5ob3Jpem9udGFsUG9zaXRpb249dGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBzY29yZSIsMCksdGhpcy4kLmRpdmUudmVydGljYWxQb3NpdGlvbj10aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHNjb3JlIiwxKSkpKTt0aGlzLnVwZGF0ZWRFeGFtcGxlPSExfX0sbmV3QXR0cmlidXRpb25zXzpmdW5jdGlvbihhKXtpZigwIT1PYmplY3Qua2V5cyhhKS5sZW5ndGgpe2ZvcihsZXQgYz0wO2M8YS5pbmRpY2VzLmxlbmd0aDtjKyspe2NvbnN0IGQ9YS5pbmRpY2VzW2NdLGY9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpc2RhdGFbZF0pLGc9bnVsbD09YS5hdHRyaWJ1dGlvbnNbMF0/e306YS5hdHRyaWJ1dGlvbnNbMF1bY10sbD1PYmplY3Qua2V5cyhnKTtmb3IobGV0IGs9MDtrPGwubGVuZ3RoO2srKylBcnJheS5pc0FycmF5KGdbbFtrXV0pJiYyPT1nW2xba11dLmxlbmd0aCYmCkFycmF5LmlzQXJyYXkoZ1tsW2tdXVswXSk/KGZbImF0dHJpYnV0aW9uc19fIitsW2tdKyJfa2V5cyJdPWdbbFtrXV1bMF0sZlsiYXR0cmlidXRpb25zX18iK2xba10rIl92YWx1ZXMiXT1nW2xba11dWzFdKTpmWyJhdHRyaWJ1dGlvbnNfXyIrbFtrXV09Z1tsW2tdXTt0aGlzLnNldChgdmlzZGF0YS4ke2R9YCxmKX10aGlzLnNldEF0dHJpYnV0aW9ucygpO3RoaXMucmVmcmVzaERpdmVfKCl9fSxzZXRJdGVtSW5mZXJlbmNlVmFsdWU6ZnVuY3Rpb24oYSxjLGQsZil7dmFyIGc9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbY10uaW5mZXJlbmNlcy5sZW5ndGgtMTtpZih0aGlzLm11bHRpQ2xhc3MpZm9yKGQ9MDtkPHRoaXMubnVtTW9kZWxzO2QrKylhW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLGQpXT10aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tjXS5pbmZlcmVuY2VzW2ddW2RdWzBdLmxhYmVsO2Vsc2UgZm9yKGc9dGhpcy5vdmVyYWxsVGhyZXNob2xkcywKMCE9PWQubGVuZ3RoJiYoZz10aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHNNYXBbdGhpcy5jcmVhdGVDb21iaW5lZFZhbHVlU3RyaW5nXyhhW2RdLGFbZl0pXS50aHJlc2hvbGQpLGQ9MDtkPHRoaXMubnVtTW9kZWxzO2QrKylmPXRoaXMuZ2V0Q2xhc3NpZmljYXRpb25CZXN0Tm9uWmVybyhjLGQpLGFbdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBzY29yZSIsZCldPWYuc2NvcmUsYVt0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixkKV09Zi5zY29yZT49Z1tkXS50aHJlc2hvbGQ/Zi5sYWJlbDp0aGlzLmRlZmF1bHRJbmZlcmVuY2VMYWJlbC50b1N0cmluZygpfSxjcmVhdGVDb21iaW5lZFZhbHVlU3RyaW5nXzpmdW5jdGlvbihhLGMpe2E9bnVsbD09YT8iIjphO3JldHVybiBudWxsPT1jfHwiIj09Yz9hOmErKCIvIitjKX0sdXBkYXRlQ29ycmVjdG5lc3NfOmZ1bmN0aW9uKCl7aWYodGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZSYmdGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMpZm9yKGxldCBhPQowO2E8dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoO2ErKyl7Y29uc3QgYz10aGlzLnZpc2RhdGFbYV07Zm9yKGxldCBkPTA7ZDx0aGlzLm51bU1vZGVscztkKyspImNsYXNzaWZpY2F0aW9uIj09dGhpcy5tb2RlbFR5cGU/Y1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIGNvcnJlY3QiLGQpXT1jW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdPT1jW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLGQpXT8iY29ycmVjdCI6ImluY29ycmVjdCI6KGNbdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBlcnJvciIsZCldPWNbdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsZCldLWNbdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV0sY1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIGFic29sdXRlIGVycm9yIixkKV09TWF0aC5hYnMoY1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIGVycm9yIiwKZCldKSxjW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2Ugc3F1YXJlZCBlcnJvciIsZCldPWNbdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBlcnJvciIsZCldKmNbdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBlcnJvciIsZCldKX19LGluZmVyQ2xpY2tlZF86ZnVuY3Rpb24oKXtjb25zdCBhPXtpbmZlcmVuY2VfYWRkcmVzczp0aGlzLmluZmVyZW5jZUFkZHJlc3MsbW9kZWxfbmFtZTp0aGlzLm1vZGVsTmFtZSxtb2RlbF90eXBlOnRoaXMubW9kZWxUeXBlLG1vZGVsX3ZlcnNpb246dGhpcy5tb2RlbFZlcnNpb24sbW9kZWxfc2lnbmF0dXJlOnRoaXMubW9kZWxTaWduYXR1cmUsbGFiZWxfdm9jYWJfcGF0aDp0aGlzLmxhYmVsVm9jYWJQYXRoLHVzZV9wcmVkaWN0OnRoaXMudXNlUHJlZGljdEFwaSxwcmVkaWN0X291dHB1dF90ZW5zb3I6dGhpcy5wcmVkaWN0T3V0cHV0VGVuc29yLHByZWRpY3RfaW5wdXRfdGVuc29yOnRoaXMucHJlZGljdElucHV0VGVuc29yfTsKdGhpcy5zcGlubmVySGlkZGVuXz0hMTtpZighdGhpcy5sb2NhbCl7Y29uc3QgYz10aGlzLm1ha2VVcmxfKCIvZGF0YS9wbHVnaW4vd2hhdGlmL2luZmVyIixhKTt0aGlzLm1ha2VBc3luY1JlcXVlc3RfKGMsZD0+e3RoaXMuc3Bpbm5lckhpZGRlbl89ITA7dGhpcy5sYWJlbFZvY2FiPUpTT04ucGFyc2UoZC52YWx1ZS52b2NhYik7dGhpcy5pbmZlcmVuY2VzPUpTT04ucGFyc2UoZC52YWx1ZS5pbmZlcmVuY2VzKX0sbnVsbCwibW9kZWwgaW5mZXJlbmNlIil9dGhpcy5maXJlKCJpbmZlci1leGFtcGxlcyIsYSl9LGV4YW1wbGVDaGFuZ2VfOmZ1bmN0aW9uKGEpe3ZhciBjPTA9PXRoaXMuc2VsZWN0ZWQubGVuZ3RoPzA6dGhpcy5zZWxlY3RlZFswXTt0aGlzLnNldCgic2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLmNoYW5nZWQiLCEwKTt0aGlzLnVwZGF0ZUV4YW1wbGVfKEpTT04uc3RyaW5naWZ5KGEudGFyZ2V0Lmpzb24pLGMpO3RoaXMuJCQoIiMiK3RoaXMuZ2V0SW5mZXJlbmNlSG9sZGVySWRfKCkpLmluZmVyZW5jZT0KbnVsbDt0aGlzLnZpc2RhdGFbY109dGhpcy5leGFtcGxlVG9EYXRhUG9pbnRfKGEudGFyZ2V0Lmpzb24sYyk7dGhpcy5zaG93TmVhcmVzdENvdW50ZXJmYWN0dWFsPSExO3RoaXMucmVmcmVzaERpdmVfKCk7dGhpcy51cGRhdGVkRXhhbXBsZT0hMDt0aGlzLnNlbGVjdGVkRGF0YVVwZGF0ZWRfKCl9LHJlZnJlc2hEaXZlSW1wbF86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpc2RhdGE7dGhpcy52aXNkYXRhPVtdO3RoaXMudmlzZGF0YT1hO3RoaXMuc2VsZWN0ZWRFeGFtcGxlTWF4PXRoaXMudmlzZGF0YS5sZW5ndGgtMTt0aGlzLiQub3ZlcnZpZXcucHJvdG9JbnB1dD10aGlzLiQub3ZlcnZpZXcuZ2V0U3RhdHNQcm90byhbe25hbWU6IiIsZGF0YTphfV0pO3RoaXMuY2FsY3VsYXRlRGlzdGFuY2VTdGF0c18odGhpcy4kLm92ZXJ2aWV3LnByb3RvSW5wdXQudG9PYmplY3QoKSk7YT10aGlzLiQuZGl2ZS5zZWxlY3RlZERhdGE7dGhpcy4kLmRpdmUuc2VsZWN0ZWREYXRhPVtdO3RoaXMuJC5kaXZlLnNlbGVjdGVkRGF0YT0KYTt0aGlzLnVwZGF0ZVNwcml0ZSgpfSxyZWZyZXNoRGl2ZV86ZnVuY3Rpb24oKXt0aGlzLmRlYm91bmNlKCJyZWZyZXNoRGl2ZURlYm91bmNlIiwoKT0+dGhpcy5yZWZyZXNoRGl2ZUltcGxfKCksNTAwKX0sY2FsY3VsYXRlRGlzdGFuY2VTdGF0c186ZnVuY3Rpb24oYSl7dGhpcy5kaXN0YW5jZVN0YXRzXz17fTtmb3IobGV0IGM9MDtjPGEuZGF0YXNldHNMaXN0WzBdLmZlYXR1cmVzTGlzdC5sZW5ndGg7YysrKXtjb25zdCBkPWEuZGF0YXNldHNMaXN0WzBdLmZlYXR1cmVzTGlzdFtjXSxmPWQubmFtZTt0aGlzLmRpc3RhbmNlU3RhdHNfW2ZdPXt9O2lmKGQubnVtU3RhdHMpdGhpcy5kaXN0YW5jZVN0YXRzX1tmXS5zdGREZXY9ZC5udW1TdGF0cy5zdGREZXY7ZWxzZXtsZXQgZz0wO2NvbnN0IGw9ZC5zdHJpbmdTdGF0cy5yYW5rSGlzdG9ncmFtLmJ1Y2tldHNMaXN0O2ZvcihsZXQgaz0wO2s8bC5sZW5ndGg7aysrKXtjb25zdCBtPWxba10uc2FtcGxlQ291bnQvZC5zdHJpbmdTdGF0cy5jb21tb25TdGF0cy5udW1Ob25NaXNzaW5nOwpnKz1tKm19dGhpcy5kaXN0YW5jZVN0YXRzX1tmXS5wcm9iU2FtZVZhbHVlPWd9fX0sdXBkYXRlRXhhbXBsZV86ZnVuY3Rpb24oYSxjKXt0aGlzLmZpcmUoInVwZGF0ZS1leGFtcGxlIix7ZXhhbXBsZTphLGluZGV4OmN9KTtpZighdGhpcy5sb2NhbCl7dmFyIGQ9dGhpcy5tYWtlVXJsXygiL2RhdGEvcGx1Z2luL3doYXRpZi91cGRhdGVfZXhhbXBsZSIsbnVsbCk7dGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhkLG51bGwse2V4YW1wbGU6YSxpbmRleDpjfSwiZGF0YXBvaW50IHVwZGF0ZSIpfX0sZ2V0SW5mZXJlbmNlSG9sZGVySWRfOmZ1bmN0aW9uKCl7cmV0dXJuImluZmVyZW5jZV8ifSxtYWtlVXJsXzpmdW5jdGlvbihhLGMpe2MmJihhKz0iPyIrT2JqZWN0LmtleXMoYykubWFwKGQ9PmQrIlx4M2QiK2VuY29kZVVSSUNvbXBvbmVudChjW2RdKSkuam9pbigiXHgyNiIpKTtyZXR1cm4gYX0sc2hvd1RvYXN0XzpmdW5jdGlvbihhKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci10b2FzdCIpOwpjLmR1cmF0aW9uPTFFNDtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpO2MudGV4dD1hO2Muc2hvdygpO2NvbnNvbGUuZXJyb3IoYSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuc2hvd1RvYXN0XyhhKTt0aGlzLmV4YW1wbGVTdGF0dXNTdHI9YTt0aGlzLnNwaW5uZXJIaWRkZW5fPSEwfSxtYWtlQXN5bmNSZXF1ZXN0XzpmdW5jdGlvbihhLGMsZCxmLGc9KCk9Pnt9KXtjb25zdCBsPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShrPT57ay5jYW5jZWxsZWR8fChrLnZhbHVlJiZrLnZhbHVlLmVycm9yPyh0aGlzLmhhbmRsZUVycm9yKGsudmFsdWUuZXJyb3IpLG51bGwhPWcmJmcoKSk6YyYmYyhrKSl9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEsZCkudGhlbihsKS5jYXRjaChrPT57dGhpcy5oYW5kbGVFcnJvcihgUmVxdWVzdCBmb3IgJHtmfSBmYWlsZWQ6ICR7a31gKTtudWxsIT1nJiZnKCl9KX0sZGF0YVBvaW50VmFsdWVGcm9tRmVhdHVyZV86ZnVuY3Rpb24oYSwKYyl7bGV0IGQ9bnVsbDthLmludDY0TGlzdD9kPWEuaW50NjRMaXN0LnZhbHVlOmEuZmxvYXRMaXN0P2Q9YS5mbG9hdExpc3QudmFsdWU6YS5ieXRlc0xpc3QmJmEuYnl0ZXNMaXN0LnZhbHVlJiYoZD1hLmJ5dGVzTGlzdC52YWx1ZS5tYXAoZj0+e2lmKDFFNTxmLmxlbmd0aClyZXR1cm4iRVJST1I6IHN0cmluZyBub3QgZGVjb2RlZCBkdWUgdG8gbGVuZ3RoIjt0cnl7cmV0dXJuIGF0b2IoZil9Y2F0Y2goZyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIGRlY29kaW5nIHN0cmluZzogIitnKSwiRVJST1I6IGVycm9yIGRlY29kaW5nIHN0cmluZyJ9fSkpO3JldHVybiBjJiZkJiYxPT1kLmxlbmd0aD8oYT1kWzBdLGlzTmFOKGEpP2E6TnVtYmVyKGEpKTpkfSxleGFtcGxlVG9EYXRhUG9pbnRfOmZ1bmN0aW9uKGEsYyl7Y29uc3QgZD17fTt2YXIgZj1hLmZlYXR1cmVzfHxhLmNvbnRleHQsZz1mJiYiZmVhdHVyZSJpbiBmP09iamVjdC5rZXlzKGYuZmVhdHVyZSk6W107Zm9yKHZhciBsIGluIGcpe3ZhciBrPQpnWytsXTtpZihrIT10aGlzLmltYWdlRmVhdHVyZU5hbWUpe3ZhciBtPXRoaXMuZGF0YVBvaW50VmFsdWVGcm9tRmVhdHVyZV8oZi5mZWF0dXJlW2tdLCEwKTtudWxsIT1tJiYoZFtrXT1tKX19Zj0iZmVhdHVyZUxpc3RzImluIGE/T2JqZWN0LmtleXMoYS5mZWF0dXJlTGlzdHMuZmVhdHVyZUxpc3QpOltdO2Zvcihjb25zdCBwIGluIGYpe2c9ZlsrcF07bD1hLmZlYXR1cmVMaXN0cy5mZWF0dXJlTGlzdFtnXS5mZWF0dXJlO2s9W107Zm9yKG09MDttPGwubGVuZ3RoO20rKyl7Y29uc3QgcT10aGlzLmRhdGFQb2ludFZhbHVlRnJvbUZlYXR1cmVfKGxbbV0sITEpO3EmJihrPWsuY29uY2F0KHEpKX1kW2ddPWt9ZFsiIERhdGFwb2ludCBJRCJdPWM7cmV0dXJuIGR9LGdldEV4YW1wbGVzQW5kQ2xvc2VTZXR0aW5nc186ZnVuY3Rpb24oKXt0aGlzLnNldHRpbmdzQ2xpY2tlZF8oKTt0aGlzLnVwZGF0ZU51bWJlck9mTW9kZWxzKCk7dGhpcy5nZXRFeGFtcGxlc18oKX0sc2hvd01vZGVsTnVtYmVyc186ZnVuY3Rpb24oKXtyZXR1cm4gMT49CnRoaXMubnVtTW9kZWxzfSx1cGRhdGVFeGFtcGxlQ29udGVudHM6ZnVuY3Rpb24oYSxjKXt0aGlzLmV4YW1wbGVTdGF0dXNTdHI9YS5sZW5ndGgrIiBkYXRhcG9pbnRzIGxvYWRlZCI7dGhpcy4kLm5vZXhhbXBsZXMuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5zcGlubmVySGlkZGVuXz0hMDt0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcz1hLm1hcChmdW5jdGlvbihmKXtyZXR1cm57ZXhhbXBsZTpKU09OLnBhcnNlKGYpLGNoYW5nZWQ6ITEsb3JpZzpKU09OLnBhcnNlKGYpfX0pO3RoaXMudXBkYXRlZEV4YW1wbGU9ITA7Y29uc3QgZD10aGlzO3RoaXMudmlzZGF0YT10aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcy5tYXAoZnVuY3Rpb24oZixnKXtyZXR1cm4gZC5leGFtcGxlVG9EYXRhUG9pbnRfKGYuZXhhbXBsZSxnKX0pO3RoaXMuJC5kaXZlLmF0bGFzVXJsPSIiO3RoaXMuJC5kaXZlLmltYWdlRmllbGROYW1lPSIiO3RoaXMuaGFzU3ByaXRlPWM7dGhpcy5yZWZyZXNoRGl2ZV8oKTsKdGhpcy5zaG91bGREaXNhYmxlSW5mZXJCdXR0b25fKHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLHRoaXMubW9kZWxOYW1lLHRoaXMuaW5mZXJlbmNlQWRkcmVzcyx0aGlzLnVwZGF0ZWRFeGFtcGxlKXx8dGhpcy5pbmZlckNsaWNrZWRfKCk7dGhpcy5zZXRJbmZlcmVuY2VGcm9tRXhhbXBsZURhdGEoKX0sc2V0SW5mZXJlbmNlRnJvbUV4YW1wbGVEYXRhOmZ1bmN0aW9uKCl7aWYoMDx0aGlzLnZpc2RhdGEubGVuZ3RoKWlmKG51bGwhPXRoaXMudmlzZGF0YVswXS5wcmVkaWN0aW9uc19fcHJvYmFiaWxpdGllcyl7dmFyIGE9e30sYz1BcnJheS5hcHBseShudWxsLHtsZW5ndGg6dGhpcy52aXNkYXRhLmxlbmd0aH0pLm1hcChOdW1iZXIuY2FsbCxOdW1iZXIpO2EuaW5kaWNlcz1jO2EucmVzdWx0cz1be2NsYXNzaWZpY2F0aW9uUmVzdWx0OntjbGFzc2lmaWNhdGlvbnM6W119fV07Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYS5yZXN1bHRzWzBdLmNsYXNzaWZpY2F0aW9uUmVzdWx0LmNsYXNzaWZpY2F0aW9uc1tkXT0Ke2NsYXNzZXM6W3tsYWJlbDoiMCIsc2NvcmU6dGhpcy52aXNkYXRhW2RdLnByZWRpY3Rpb25zX19wcm9iYWJpbGl0aWVzWzBdfSx7bGFiZWw6IjEiLHNjb3JlOnRoaXMudmlzZGF0YVtkXS5wcmVkaWN0aW9uc19fcHJvYmFiaWxpdGllc1sxXX1dfTt0aGlzLmluZmVyZW5jZXM9YX1lbHNlIGlmKG51bGwhPXRoaXMudmlzZGF0YVswXS5wcmVkaWN0aW9ucyl7YT17fTtjPUFycmF5LmFwcGx5KG51bGwse2xlbmd0aDp0aGlzLnZpc2RhdGEubGVuZ3RofSkubWFwKE51bWJlci5jYWxsLE51bWJlcik7YS5pbmRpY2VzPWM7YS5yZXN1bHRzPVt7cmVncmVzc2lvblJlc3VsdDp7cmVncmVzc2lvbnM6W119fV07Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylhLnJlc3VsdHNbMF0ucmVncmVzc2lvblJlc3VsdC5yZWdyZXNzaW9uc1tkXT17dmFsdWU6dGhpcy52aXNkYXRhW2RdLnByZWRpY3Rpb25zfTt0aGlzLmluZmVyZW5jZXM9YX19LGdldEV4YW1wbGVzXzpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWFrZVVybF8oIi9kYXRhL3BsdWdpbi93aGF0aWYvZXhhbXBsZXNfZnJvbV9wYXRoIiwKe2V4YW1wbGVzX3BhdGg6dGhpcy5leGFtcGxlc1BhdGgsbWF4X2V4YW1wbGVzOnRoaXMubWF4RXhhbXBsZXMsc2FtcGxpbmdfb2Rkczp0aGlzLnNhbXBsaW5nT2RkcyxzZXF1ZW5jZV9leGFtcGxlczp0aGlzLnNlcXVlbmNlRXhhbXBsZXN9KTt0aGlzLmV4YW1wbGVTdGF0dXNTdHI9IkxvYWRpbmcgZGF0YXBvaW50cy4uLiI7dGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhhLGM9Pnt0aGlzLnVwZGF0ZUV4YW1wbGVDb250ZW50cyhjLnZhbHVlLmV4YW1wbGVzLGMudmFsdWUuc3ByaXRlKX0sbnVsbCwiZGF0YXBvaW50IGxvYWQiKTt0aGlzLnNwaW5uZXJIaWRkZW5fPSExfSx1cGRhdGVTcHJpdGU6ZnVuY3Rpb24oKXt0aGlzLmhhc1Nwcml0ZSYmKHRoaXMuJC5kaXZlLmF0bGFzVXJsPW51bGwsdGhpcy4kLmRpdmUuYXRsYXNVcmw9dGhpcy5sb2NhbD90aGlzLmxvY2FsQXRsYXNVcmw6dGhpcy5tYWtlVXJsXygiL2RhdGEvcGx1Z2luL3doYXRpZi9zcHJpdGUiLHt9KSl9LHNlbGVjdGVkRGF0YVVwZGF0ZWRfOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEV4YW1wbGVOdW09CjA8dGhpcy5zZWxlY3RlZC5sZW5ndGg/dGhpcy5zZWxlY3RlZFswXToiIjt0aGlzLnZpc2RhdGEmJjA8dGhpcy52aXNkYXRhLmxlbmd0aCYmKHRoaXMucGFydGlhbERlcFBsb3RQZW5kaW5nRmVhdHVyZXM9W10pfSxjb3B5RGF0YXBvaW50XzpmdW5jdGlvbigpe3ZhciBhPUpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLmV4YW1wbGUpO2E9e2V4YW1wbGU6SlNPTi5wYXJzZShhKSxjaGFuZ2VkOiExLG9yaWc6SlNPTi5wYXJzZShhKX07dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMucHVzaChhKTt0aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZT1hO3RoaXMudmlzZGF0YS5wdXNoKHRoaXMuZXhhbXBsZVRvRGF0YVBvaW50XyhhLmV4YW1wbGUsdGhpcy52aXNkYXRhLmxlbmd0aCkpO2E9dGhpcy5zZWxlY3RlZFswXTt0aGlzLnNob3dOZWFyZXN0Q291bnRlcmZhY3R1YWw9ITE7dGhpcy5zZWxlY3RlZFswXT10aGlzLnZpc2RhdGEubGVuZ3RoLQoxO3RoaXMuc2VsZWN0ZWREYXRhVXBkYXRlZF8oKTt0aGlzLnVwZGF0ZWRFeGFtcGxlPSEwO3RoaXMuZmlyZSgiZHVwbGljYXRlLWV4YW1wbGUiLHtpbmRleDphfSk7dGhpcy5sb2NhbD90aGlzLnJlZnJlc2hEaXZlXygpOihhPXRoaXMubWFrZVVybF8oIi9kYXRhL3BsdWdpbi93aGF0aWYvZHVwbGljYXRlX2V4YW1wbGUiLHtpbmRleDphfSksdGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhhLCgpPT57dGhpcy5yZWZyZXNoRGl2ZV8oKX0sbnVsbCwiZGF0YXBvaW50IGR1cGxpY2F0aW9uIikpfSxkZWxldGVEYXRhcG9pbnREaWFsb2dfOmZ1bmN0aW9uKCl7dGhpcy4kLmRlbGV0ZWRpYWxvZy5vcGVuKCl9LGRlbGV0ZURhdGFwb2ludF86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlbGVjdGVkWzBdO3RoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLnNwbGljZShhLDEpO3RoaXMudmlzZGF0YS5zcGxpY2UoYSwxKTtmb3IobGV0IGM9YTtjPHRoaXMudmlzZGF0YS5sZW5ndGg7YysrKXRoaXMudmlzZGF0YVtjXVsiIERhdGFwb2ludCBJRCJdPQpjO3RoaXMuY29tcGFyZWRJbmRpY2VzPVtdO3RoaXMuc2VsZWN0ZWQ9W107dGhpcy5zZWxlY3RlZERhdGFVcGRhdGVkXygpO3RoaXMuZmlyZSgiZGVsZXRlLWV4YW1wbGUiLHtpbmRleDphfSk7dGhpcy4kLmRpdmUuc2VsZWN0ZWRJbmRpY2VzPVtdO3RoaXMubG9jYWw/dGhpcy5yZWZyZXNoRGl2ZV8oKTooYT10aGlzLm1ha2VVcmxfKCIvZGF0YS9wbHVnaW4vd2hhdGlmL2RlbGV0ZV9leGFtcGxlIix7aW5kZXg6YX0pLHRoaXMubWFrZUFzeW5jUmVxdWVzdF8oYSwoKT0+e3RoaXMucmVmcmVzaERpdmVfKCl9LG51bGwsImRhdGFwb2ludCBkZWxldGUiKSl9LHNob3VsZERpc2FibGVSZXNldF86ZnVuY3Rpb24oYSl7cmV0dXJuIWF9LHJlc2V0RGF0YXBvaW50XzpmdW5jdGlvbigpe3RoaXMuc2V0KCJzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuZXhhbXBsZSIse30pO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLmNoYW5nZWQ9CiExO2NvbnN0IGE9SlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2Uub3JpZyk7dGhpcy5zZXQoInNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5leGFtcGxlIixKU09OLnBhcnNlKGEpKTt0aGlzLnZpc2RhdGFbdGhpcy5zZWxlY3RlZFswXV09dGhpcy5leGFtcGxlVG9EYXRhUG9pbnRfKHRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLmV4YW1wbGUsdGhpcy5zZWxlY3RlZFswXSk7dGhpcy51cGRhdGVkRXhhbXBsZT0hMDt0aGlzLnVwZGF0ZUV4YW1wbGVfKGEsdGhpcy5zZWxlY3RlZFswXSk7dGhpcy5yZWZyZXNoRGl2ZV8oKX0pfSxhZGRDaGFydDpmdW5jdGlvbihhLGMsZCl7bGV0IGYsZz1kO2lmKHRoaXMuaXNNdWx0aUNsYXNzXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpKXtnPVtdO2ZvcihsZXQgaz0wO2s8ZC5sZW5ndGg7aysrKXtsZXQgbT17fTtpZihPYmplY3Qua2V5cyhkW2tdKS5sZW5ndGg+TnVtYmVyKHRoaXMubWF4SW5mZXJlbmNlRW50cmllc1BlclJ1bikpe3ZhciBsPQp0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1t0aGlzLnNlbGVjdGVkJiYwPHRoaXMuc2VsZWN0ZWQubGVuZ3RoP3RoaXMuc2VsZWN0ZWRbMF06MF07bD1sLmluZmVyZW5jZXNbbC5pbmZlcmVuY2VzLmxlbmd0aC0xXVtrXS5zbGljZSgwLHRoaXMubWF4SW5mZXJlbmNlRW50cmllc1BlclJ1bik7Zm9yKGxldCBwPTA7cDxsLmxlbmd0aDtwKyspe2NvbnN0IHE9bFtwXS5sYWJlbDttW3FdPWRba11bcV19fWVsc2UgbT1kW2tdO2cucHVzaChtKX19Im51bWVyaWMiPT1hP2Y9dGhpcy5tYWtlTGluZUNoYXJ0KGMsZyk6ImNhdGVnb3JpY2FsIj09YT9mPXRoaXMubWFrZUJhckNoYXJ0KGMsZyk6Y29uc29sZS5lcnJvcigiVW5rbm93biBjaGFydFR5cGU6ICIrYSk7YT10aGlzLmZlYXR1cmVDb250YWluZXJCeU5hbWUoYykucXVlcnlTZWxlY3RvcigiLnRmLWNhdGVnb3J5LXBhbmUtY29udGVudCIpO1BvbHltZXIuZG9tKGEpLmFwcGVuZENoaWxkKGYpO2M9dGhpcy5wYXJ0aWFsRGVwUGxvdFBlbmRpbmdGZWF0dXJlcy5pbmRleE9mKGMpOwotMTxjJiZ0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLnNwbGljZShjLDEpfSxnZXRTaW1wbGVBeGlzRm9ybWF0dGVyOmZ1bmN0aW9uKGEpe3JldHVybiBQbG90dGFibGUuRm9ybWF0dGVycy5nZW5lcmFsKGEpfSxtYWtlQmFyQ2hhcnQ6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKHIsdCl7cmV0dXJue3g6ci5zdGVwPT10P3Iuc3RlcCsiIC0gb3JpZ2luYWwgdmFsdWUiOnIuc3RlcCx5OnIuc2NhbGFyfX1mdW5jdGlvbiBmKHIsdCx2KXtyZXR1cm57eDpyLnN0ZXA9PXQ/ci5zdGVwKyIgLSBvcmlnaW5hbCB2YWx1ZSI6ci5zdGVwLHNjYWxhcjpyLnNjYWxhcix5OnZ9fWxldCBnPSIiO3ZhciBsPWNbMF07IXRoaXMuZ2xvYmFsUGRQbG90cyYmKGE9dGhpcy5jcmVhdGVQZEVudHJ5Rm9yQ3VycmVudFZhbHVlKGEsbCwwKSkmJihnPWEuc3RlcCk7Y29uc3Qgaz17fSxtPXt9O18uZm9yRWFjaChjLChyLHQpPT57Xy5mb3JFYWNoKHIsKHYsQSk9PnttW3RoaXMuZm9ybWF0Q2hhcnRLZXkoQSwKdCxjLmxlbmd0aCldPV8ubWFwKHYseT0+ZCh5LGcpKS5zb3J0KCh5LHgpPT54LnkteS55KTt0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykmJihrW3RoaXMuZm9ybWF0Q2hhcnRLZXkoQSx0LGMubGVuZ3RoKV09Xy5tYXAodix5PT5mKHksZyx0aGlzLm92ZXJhbGxUaHJlc2hvbGRzW3RdLnRocmVzaG9sZCkpLnNvcnQoKHkseCk9Pnguc2NhbGFyLXkuc2NhbGFyKSl9KX0pO2NvbnN0IHA9Ym0ubXVsdGlzY2FsZUZvcm1hdHRlcihibS5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTik7bD1be3RpdGxlOiJJbmZlcmVuY2UgdmFsdWUiLGV2YWx1YXRlOnI9PntyPXRoaXMuc3BsaXRDaGFydEtleShyLmtleSxjLmxlbmd0aCkubGFiZWw7aWYoIWlzTmFOKHIpJiYwPHIubGVuZ3RoJiZ0aGlzLmxhYmVsVm9jYWIpe2NvbnN0IHQ9K3I7dDx0aGlzLmxhYmVsVm9jYWIubGVuZ3RoJiYwPD10JiYocis9IiAoIit0aGlzLmxhYmVsVm9jYWJbdF0rCiIpIil9cmV0dXJuIHJ9fSx7dGl0bGU6IkZlYXR1cmUgdmFsdWUiLGV2YWx1YXRlOnI9PnIudmFsdWUueH0se3RpdGxlOiJTY29yZSIsZXZhbHVhdGU6cj0+cChyLnZhbHVlLnkpfV07Mjw9Yy5sZW5ndGgmJmwucHVzaCh7dGl0bGU6Ik1vZGVsIixldmFsdWF0ZTpyPT50aGlzLnNwbGl0Q2hhcnRLZXkoci5rZXksYy5sZW5ndGgpLm1vZGVsfSk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmNsYXNzTGlzdC5hZGQoInBkLWhvbGRlciIpO2NvbnN0IHE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidnotYmFyLWNoYXJ0Iik7cS5jb2xvclNjYWxlPShuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UodGhpcy5wZFBsb3RDb2xvcnMpO3EubGluZXNDb2xvclNjYWxlPShuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UodGhpcy5wZFBsb3RUcmFuc3BhcmVudENvbG9ycyk7cS5kYXRhPW07cS5saW5lcz1rO3EudG9vbHRpcENvbHVtbnM9bDthLmFwcGVuZENoaWxkKHEpOwpsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgicGQteS1sYWJlbCIpO2wuaW5uZXJUZXh0PXRoaXMuaXNSZWdyZXNzaW9uXyh0aGlzLm1vZGVsVHlwZSk/IkluZmVyZW5jZSB2YWx1ZSI6IkluZmVyZW5jZSBzY29yZSI7YS5hcHBlbmRDaGlsZChsKTtyZXR1cm4gYX0sc3BsaXRDaGFydEtleTpmdW5jdGlvbihhLGMpe2xldCBkPWEsZj0iIjsyPD1jJiYoYz1hLmluZGV4T2YoIihtb2RlbCIpLGQ9YS5zdWJzdHJpbmcoMCxjKSxmPWEuc3Vic3RyaW5nKGMrNyxhLmxhc3RJbmRleE9mKCIpIikpKTtyZXR1cm57bGFiZWw6ZCxtb2RlbDpmfX0sZm9ybWF0Q2hhcnRLZXk6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiAxPT1kP2E6YSsiIChtb2RlbCAiK3RoaXMuZ2V0TW9kZWxOYW1lXyhjKSsiKSJ9LG1ha2VMaW5lQ2hhcnQ6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKHYpe3JldHVybiBOdW1iZXIuaXNOYU4odik/Ik5hTiI6bSh2KX1jb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpmLmNsYXNzTGlzdC5hZGQoInBkLWhvbGRlciIpO2NvbnN0IGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidnotbGluZS1jaGFydDIiKSxsPVtdO3ZhciBrPVtdO2NvbnN0IG09Ym0ubXVsdGlzY2FsZUZvcm1hdHRlcihibS5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTik7ImNsYXNzaWZpY2F0aW9uIj09dGhpcy5tb2RlbFR5cGUmJihnLmRlZmF1bHRZUmFuZ2U9WzAsMV0pO3ZhciBwPVt7dGl0bGU6IkluZmVyZW5jZSB2YWx1ZSIsZXZhbHVhdGU6dj0+e3Y9dGhpcy5zcGxpdENoYXJ0S2V5KHYuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUsYy5sZW5ndGgpLmxhYmVsO2lmKCFpc05hTih2KSYmMDx2Lmxlbmd0aCYmdGhpcy5sYWJlbFZvY2FiKXtjb25zdCBBPSt2O0E8dGhpcy5sYWJlbFZvY2FiLmxlbmd0aCYmMDw9QSYmKHYrPSIgKCIrdGhpcy5sYWJlbFZvY2FiW0FdKyIpIil9cmV0dXJuIHZ9fSx7dGl0bGU6IkZlYXR1cmUgdmFsdWUiLGV2YWx1YXRlOnY9PmQodi5kYXR1bS5zdGVwKX0sCnt0aXRsZToiU2NvcmUiLGV2YWx1YXRlOnY9PmQodi5kYXR1bS5zY2FsYXIpfV07Mjw9Yy5sZW5ndGgmJnAucHVzaCh7dGl0bGU6Ik1vZGVsIixldmFsdWF0ZTp2PT50aGlzLnNwbGl0Q2hhcnRLZXkodi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSxjLmxlbmd0aCkubW9kZWx9KTtnLnRvb2x0aXBDb2x1bW5zPXA7Y29uc3QgcT1bXTtsZXQgcj0wO2ZvcihsZXQgdj0wO3Y8Yy5sZW5ndGg7disrKXtjb25zdCBBPWNbdl07cD1fLmtleXMoQSk7cj12KnAubGVuZ3RoO3AuZm9yRWFjaCh5PT57bC5wdXNoKHRoaXMucGRQbG90Q29sb3JzW3IrK10pO2NvbnN0IHg9dGhpcy5mb3JtYXRDaGFydEtleSh5LHYsYy5sZW5ndGgpO2cuc2V0U2VyaWVzRGF0YSh4LEFbeV0pO3EucHVzaCh4KX0pO3I9dipwLmxlbmd0aDtpZighdGhpcy5nbG9iYWxQZFBsb3RzJiYocD10aGlzLmNyZWF0ZVBkRW50cnlGb3JDdXJyZW50VmFsdWUoYSxBLHYpKSl7dmFyIHQ9dGhpcy5mb3JtYXRDaGFydEtleShfLmtleXMoQSlbMF0rCiIgLSBvcmlnaW5hbCB2YWx1ZSAiLHYsYy5sZW5ndGgpO2cuc2V0U2VyaWVzRGF0YSh0LFtwXSk7cS5wdXNoKHQpO2wucHVzaCh0aGlzLnBkUGxvdENvbG9yc1tyXS5icmlnaHRlcigpKX10aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykmJihwPXRoaXMuZm9ybWF0Q2hhcnRLZXkoImNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZCIsdixjLmxlbmd0aCksdD1jWzBdW18ua2V5cyhjWzBdKV0ubWFwKHk9Pih7c3RlcDp5LnN0ZXAsc2NhbGFyOnRoaXMub3ZlcmFsbFRocmVzaG9sZHNbdl0udGhyZXNob2xkfSkpLGwucHVzaCh0aGlzLnBkUGxvdFRyYW5zcGFyZW50Q29sb3JzW3JdKSxnLnNldFNlcmllc0RhdGEocCx0KSxrLnB1c2gocCkscS5wdXNoKHApKX1nLmNvbG9yU2NhbGU9KG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZShsKTtnLnhBeGlzRm9ybWF0dGVyPXRoaXMuZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcih0aGlzLmF4aXNQcmVjaXNpb24pOwpnLnlBeGlzRm9ybWF0dGVyPXRoaXMuZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcih0aGlzLmF4aXNQcmVjaXNpb24pO2cuc2VyaWVzV2l0aG91dFRvb2x0aXBzPWs7Zy5jb2xvclNjYWxlLmRvbWFpbihxKTtnLnNldFZpc2libGVTZXJpZXMocSk7Zi5hcHBlbmRDaGlsZChnKTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2suY2xhc3NMaXN0LmFkZCgicGQteS1sYWJlbCIpO2suaW5uZXJUZXh0PXRoaXMuaXNSZWdyZXNzaW9uXyh0aGlzLm1vZGVsVHlwZSk/IkluZmVyZW5jZSB2YWx1ZSI6IkluZmVyZW5jZSBzY29yZSI7Zi5hcHBlbmRDaGlsZChrKTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2suY2xhc3NMaXN0LmFkZCgicGQteC1sYWJlbCIpO2suaW5uZXJUZXh0PWE7Zi5hcHBlbmRDaGlsZChrKTtyZXR1cm4gZn0sY3JlYXRlUGRFbnRyeUZvckN1cnJlbnRWYWx1ZTpmdW5jdGlvbihhLGMsZCl7dmFyIGY9Xy5rZXlzKGMpWzBdO2NvbnN0IGc9Zi5pbmRleE9mKCJpbmRleCIpOwpjPStmO3ZhciBsPTA7LTE8ZyYmKGM9K2Yuc3Vic3RyaW5nKDAsZi5pbmRleE9mKCIgIikpLGw9K2Yuc3Vic3RyaW5nKGcrNixmLmluZGV4T2YoIikiKSkpO2E9dGhpcy52aXNkYXRhW3RoaXMuc2VsZWN0ZWRbMF1dW2FdO0FycmF5LmlzQXJyYXkoYSkmJihhPWFbbF0pO2Q9dGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuaW5mZXJlbmNlc1t0aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5pbmZlcmVuY2VzLmxlbmd0aC0xXVtkXTtsPS0xO2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspaWYoZFtmXS5sYWJlbD09Yy50b1N0cmluZygpfHwiIj09ZFtmXS5sYWJlbCl7bD1kW2ZdLnNjb3JlO2JyZWFrfXJldHVybi0xPT1sP251bGw6e3N0ZXA6YSxzY2FsYXI6bH19LGRlbGV0ZVBkUGxvdFNwaW5uZXI6ZnVuY3Rpb24oYSl7YT10aGlzLmZlYXR1cmVDb250YWluZXJCeU5hbWUoYSk7cnEoYS5xdWVyeVNlbGVjdG9yKCJwYXBlci1zcGlubmVyLWxpdGUiKSl9LG1ha2VDaGFydEZvckZlYXR1cmU6ZnVuY3Rpb24oYSwKYyxkKXt0aGlzLmRlbGV0ZVBkUGxvdFNwaW5uZXIoYyk7ZC5mb3JFYWNoKGY9PnRoaXMuYWRkQ2hhcnQoYSxjLGYpKX0sZ2V0SW5mZXJlbmNlVmlzdWFsaXphdGlvbjpmdW5jdGlvbihhLGMpe2M9e2ZlYXR1cmVfbmFtZTphLGluZmVyZW5jZV9hZGRyZXNzOnRoaXMuaW5mZXJlbmNlQWRkcmVzcyxtb2RlbF9uYW1lOnRoaXMubW9kZWxOYW1lLG1vZGVsX3R5cGU6dGhpcy5tb2RlbFR5cGUsbW9kZWxfdmVyc2lvbjp0aGlzLm1vZGVsVmVyc2lvbixtb2RlbF9zaWduYXR1cmU6dGhpcy5tb2RlbFNpZ25hdHVyZSx4X21pbjp0aGlzLmdldFVuaXF1ZUJ5RXZlbnQoYywiLngtbWluIikudmFsdWUseF9tYXg6dGhpcy5nZXRVbmlxdWVCeUV2ZW50KGMsIi54LW1heCIpLnZhbHVlLGZlYXR1cmVfaW5kZXhfcGF0dGVybjp0aGlzLmdldFVuaXF1ZUJ5RXZlbnQoYywiLmZlYXR1cmUtaW5kZXgtcGF0dGVybiIpLnZhbHVlLGV4YW1wbGVfaW5kZXg6dGhpcy5nbG9iYWxQZFBsb3RzPy0xOnRoaXMuc2VsZWN0ZWRbMF0sCnVzZV9wcmVkaWN0OnRoaXMudXNlUHJlZGljdEFwaSxwcmVkaWN0X291dHB1dF90ZW5zb3I6dGhpcy5wcmVkaWN0T3V0cHV0VGVuc29yLHByZWRpY3RfaW5wdXRfdGVuc29yOnRoaXMucHJlZGljdElucHV0VGVuc29yfTt0aGlzLmxvY2FsP3RoaXMuZmlyZSgiaW5mZXItbXV0YW50cyIsYyk6KGM9UGsuYWRkUGFyYW1zKCIvZGF0YS9wbHVnaW4vd2hhdGlmL2luZmVyX211dGFudHMiLGMpLHRoaXMubWFrZUFzeW5jUmVxdWVzdF8oYywoZj0+dGhpcy5tYWtlQ2hhcnRGb3JGZWF0dXJlKGYudmFsdWUuY2hhcnRUeXBlLGEsZi52YWx1ZS5kYXRhKSkuYmluZCh0aGlzKSxudWxsLCJwbG90IGNyZWF0aW9uIiwoKCk9PnRoaXMuaGFuZGxlQ2hhcnRFcnJvckZvckZlYXR1cmUoYSkpLmJpbmQodGhpcykpKTtjPXRoaXMuZmVhdHVyZUNvbnRhaW5lckJ5TmFtZShhKS5xdWVyeVNlbGVjdG9yKCIudGYtY2F0ZWdvcnktcGFuZS1jb250ZW50Iik7Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1zcGlubmVyLWxpdGUiKTsKZC5zZXRBdHRyaWJ1dGUoImFjdGl2ZSIsITApO1BvbHltZXIuZG9tKGMpLmFwcGVuZENoaWxkKGQpfSxoYW5kbGVDaGFydEVycm9yRm9yRmVhdHVyZTpmdW5jdGlvbihhKXtjb25zdCBjPXRoaXMucGFydGlhbERlcFBsb3RQZW5kaW5nRmVhdHVyZXMuaW5kZXhPZihhKTstMTxjJiZ0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLnNwbGljZShjLDEpO3RoaXMuZGVsZXRlUGRQbG90U3Bpbm5lcihhKX0sc2hvdWxkSGlkZUZlYXR1cmVJbmRpY2VzU2VsZWN0b3I6ZnVuY3Rpb24oYSxjKXtyZXR1cm4hY3x8MD09Yy5sZW5ndGh8fCF0aGlzLnZpc2RhdGF8fHRoaXMudmlzZGF0YS5sZW5ndGg8PWNbMF0/ITA6IUFycmF5LmlzQXJyYXkodGhpcy52aXNkYXRhW2NbMF1dW2FdKX0sc2hvdWxkSGlkZVBkSW5wdXRDb250YWluZXI6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLnNob3VsZEhpZGVGZWF0dXJlSW5kaWNlc1NlbGVjdG9yKGMsZCkmJmE/ITA6ITF9LGZlYXR1cmVDb250YWluZXJCeU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJCQoJ1tkYXRhLWZlYXR1cmUtbmFtZVx4M2QiJysKYSsnIl0nKX0sZmVhdHVyZUNvbnRhaW5lckJ5RXZlbnQ6ZnVuY3Rpb24oYSl7Zm9yKGE9YS50YXJnZXQ7IWEuY2xhc3NMaXN0LmNvbnRhaW5zKCJmZWF0dXJlLWNvbnRhaW5lciIpOylhPWEucGFyZW50Tm9kZTtyZXR1cm4gYX0sZ2V0VW5pcXVlQnlFdmVudChhLGMpe3JldHVybiB0aGlzLmZlYXR1cmVDb250YWluZXJCeUV2ZW50KGEpLnF1ZXJ5U2VsZWN0b3IoYyl9LHBhcnRpYWxEZXBQbG90RWxpZ2libGVGZWF0dXJlc1NldDpmdW5jdGlvbihhKXthJiYwIT1hLmxlbmd0aCYmc2V0VGltZW91dCgoKT0+e3RoaXMuJCQoIi5wZC1lbnRyeS1jb250YWluZXIiKS5oaWRkZW4mJnRoaXMuJCQoIi50Zi1jYXRlZ29yeS1wYW5lIikuY2xpY2soKX0sMTAwKX0sY2F0ZWdvcnlQYW5lQ2xpY2tlZDpmdW5jdGlvbihhKXtjb25zdCBjPXRoaXMuZmVhdHVyZUNvbnRhaW5lckJ5RXZlbnQoYSk7Yy5xdWVyeVNlbGVjdG9yKCIucGQtZW50cnktY29udGFpbmVyIikuaGFzQXR0cmlidXRlKCJoaWRkZW4iKT8KKHRoaXMuZHJhd1BkQ2hhcnRzXyhhKSx0aGlzLnNob3dQZEVsZW1lbnRfKGMpKTp0aGlzLmhpZGVQZEVsZW1lbnRfKGMpfSxkcmF3UGRDaGFydHNfOmZ1bmN0aW9uKGEpe2NvbnN0IGM9YS5tb2RlbC5nZXQoIml0ZW0iKS5uYW1lOy0xPHRoaXMucGFydGlhbERlcFBsb3RQZW5kaW5nRmVhdHVyZXMuaW5kZXhPZihjKXx8KHRoaXMucGFydGlhbERlcFBsb3RQZW5kaW5nRmVhdHVyZXMucHVzaChjKSx0aGlzLmdldEluZmVyZW5jZVZpc3VhbGl6YXRpb24oYyxhKSl9LGNsZWFyUGRFbGVtZW50Q2hhcnRzXzpmdW5jdGlvbihhKXthLnF1ZXJ5U2VsZWN0b3JBbGwoIi5wZC1ob2xkZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JxKGMpfSl9LGhpZGVQZEVsZW1lbnRfOmZ1bmN0aW9uKGEpe3ZhciBjPWEucXVlcnlTZWxlY3RvcigiLnBkLWVudHJ5LWNvbnRhaW5lciIpO3RoaXMuY2xlYXJQZEVsZW1lbnRDaGFydHNfKGMpO2Muc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTtjPWEucXVlcnlTZWxlY3RvcigiLnBkLXJvdy1hcnJvdyIpOwpjLmNsYXNzTGlzdC5yZW1vdmUoIm5vcm1hbC1pY29uIik7Yy5jbGFzc0xpc3QuYWRkKCJyb3RhdGVkLWljb24iKTthPWEucXVlcnlTZWxlY3RvcigiLnBlcmYtdGFibGUtZW50cnkiKTthLmNsYXNzTGlzdC5hZGQoInBlcmYtdGFibGUtcm93Iik7YS5jbGFzc0xpc3QucmVtb3ZlKCJwZXJmLXRhYmxlLXJvdy1leHBhbmRlZCIpfSxzaG93UGRFbGVtZW50XzpmdW5jdGlvbihhKXthLnF1ZXJ5U2VsZWN0b3IoIi5wZC1lbnRyeS1jb250YWluZXIiKS5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpO2NvbnN0IGM9YS5xdWVyeVNlbGVjdG9yKCIucGQtcm93LWFycm93Iik7Yy5jbGFzc0xpc3QuYWRkKCJub3JtYWwtaWNvbiIpO2MuY2xhc3NMaXN0LnJlbW92ZSgicm90YXRlZC1pY29uIik7YT1hLnF1ZXJ5U2VsZWN0b3IoIi5wZXJmLXRhYmxlLWVudHJ5Iik7YS5jbGFzc0xpc3QucmVtb3ZlKCJwZXJmLXRhYmxlLXJvdyIpO2EuY2xhc3NMaXN0LmFkZCgicGVyZi10YWJsZS1yb3ctZXhwYW5kZWQiKX0sCmhpZGVBbGxQZEVsZW1lbnRzXzpmdW5jdGlvbigpe2NvbnN0IGE9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIuZmVhdHVyZS1jb250YWluZXIiKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLmhpZGVQZEVsZW1lbnRfKGFbY10pfSxwZElucHV0Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLmRlYm91bmNlKCJwZElucHV0Q2hhbmdlZERlYm91bmNlIiwoKT0+dGhpcy5wZElucHV0Q2hhbmdlZEltcGwoYSksNTAwKX0scGRJbnB1dENoYW5nZWRJbXBsOmZ1bmN0aW9uKGEpe3RoaXMuY2xlYXJQZEVsZW1lbnRDaGFydHNfKHRoaXMuZ2V0VW5pcXVlQnlFdmVudChhLCIudGYtY2F0ZWdvcnktcGFuZS1jb250ZW50IikpO3RoaXMuZHJhd1BkQ2hhcnRzXyhhKX0scG9wdWxhdGVQZFRhYnM6ZnVuY3Rpb24oKXt0aGlzLmhpZGVBbGxQZEVsZW1lbnRzXygpO2lmKHRoaXMubG9jYWwpdGhpcy5maXJlKCJnZXQtZWxpZ2libGUtZmVhdHVyZXMiKTtlbHNle2NvbnN0IGE9ClBrLmFkZFBhcmFtcygiL2RhdGEvcGx1Z2luL3doYXRpZi9lbGlnaWJsZV9mZWF0dXJlcyIse30pO3RoaXMubWFrZUFzeW5jUmVxdWVzdF8oYSxjPT57dGhpcy5zZXQoInBhcnRpYWxEZXBQbG90RWxpZ2libGVGZWF0dXJlcyIsYy52YWx1ZSl9LG51bGwsInBsb3Qgc2V0dXAiKX19LHRvZ2dsZVRydWVMYWJlbFNldHVwOmZ1bmN0aW9uKCl7dGhpcy4kLmNvbGxhcHNldHJ1ZWxhYmVsLnRvZ2dsZSgpfSx0b2dnbGVFeHBsb3JlclNldHVwOmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2NvbGxhcHNlZXhwbG9yZXIiKS50b2dnbGUoKX0sdG9nZ2xlQ29udGV4dFRvb2xzOmZ1bmN0aW9uKCl7dGhpcy4kLmNvbGxhcHNlY29udGV4dHRvb2xzLnRvZ2dsZSgpfSx0b2dnbGVQZXJmb3JtYW5jZTpmdW5jdGlvbigpe3RoaXMuJC5jb2xsYXBzZXBlcmZvcm1hbmNlLnRvZ2dsZSgpfSx0b2dnbGVJbmZlcmVuY2VSZXN1bHRzOmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2NvbGxhcHNlaW5mZXJlbmNlIikudG9nZ2xlKCl9LApnZXRFeHBhbmRDb2xsYXBzZUljb246ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxnZXRFeHBhbmRDb2xsYXBzZVBlcmZJY29uQ2xhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/Im5vcm1hbC1pY29uIjoicm90YXRlZC1pY29uIn0sZ2V0UGVyZlRhYmxlUm93Q2xhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InBlcmYtdGFibGUtcm93LWV4cGFuZGVkIjoicGVyZi10YWJsZS1yb3cifSxnZXRQZXJmVGFibGVNb2RlbENsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiAyPmE/InBlcmYtdGFibGUtbW9kZWwtc2luZ2xlIjoicGVyZi10YWJsZS1tb2RlbCJ9LGdldERhdGFwb2ludEVkaXRvclRpdGxlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0U2VjdGlvblRpdGxlKCJFZGl0IixhLGMpfSxnZXRJbmZlclRpdGxlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0U2VjdGlvblRpdGxlKCJJbmZlciIsYSxjKX0sZ2V0U2VjdGlvblRpdGxlOmZ1bmN0aW9uKGEsCmMsZCl7bnVsbCE9YyYmIiIhPT1jJiYoYT1udWxsIT1kJiYwPGQubGVuZ3RoP2ErKCIgLSBEYXRhcG9pbnRzICIrYysiIGFuZCAiK2RbMF0pOmErKCIgLSBEYXRhcG9pbnQgIitjKSk7cmV0dXJuIGF9LHRvZ2dsZVBlcmZSb3c6ZnVuY3Rpb24oYSl7Zm9yKGE9YS50YXJnZXQ7bnVsbCE9YSYmIWEuZGF0YXNldC5pbmRleDspYT1hLnBhcmVudE5vZGU7bnVsbCE9YSYmKGE9YS5kYXRhc2V0LmluZGV4LHRoaXMuc2V0KCJmZWF0dXJlVmFsdWVUaHJlc2hvbGRzLiIrYSsiLm9wZW5lZCIsIXRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1thXS5vcGVuZWQpLHRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1thXS5vcGVuZWQmJnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy51cGRhdGVJbmZlcmVuY2VTdGF0c18oITApKSl9LGdldFBlcmZvcm1hbmNlVGFiVGl0bGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyhhLGMpPyJQZXJmb3JtYW5jZSBceDI2IEZhaXJuZXNzIjoKIlBlcmZvcm1hbmNlIn0sZ2V0UGVyZlRhYmxlVGl0bGU6ZnVuY3Rpb24oYSxjLGQsZil7bGV0IGc9dGhpcy5nZXRQcmludGFibGVPcHRpbWl6YXRpb25OYW1lKGQpO2lmKG51bGw9PWF8fDA9PWEubGVuZ3RoKXJldHVybiJjdXN0b20iPT1kPyJFeHBsb3JlIG92ZXJhbGwgcGVyZm9ybWFuY2UiOmc7bnVsbCE9YyYmMCE9Yy5sZW5ndGgmJihhKz0iLyIrYyk7cmV0dXJuIGcrIiBmb3IgIitmLmxlbmd0aCsiIHZhbHVlcyBvZiAiK2F9LGdldE5vVGhyZXNob2xkUGVyZlRhYmxlVGl0bGU6ZnVuY3Rpb24oYSxjLGQpe2lmKG51bGw9PWF8fDA9PWEubGVuZ3RoKXJldHVybiJFeHBsb3JlIG92ZXJhbGwgcGVyZm9ybWFuY2UiO251bGwhPWMmJjAhPWMubGVuZ3RoJiYoYSs9Ii8iK2MpO3JldHVybiBhKyIgKCIrZC5sZW5ndGgrIiB2YWx1ZXMpIn0sZ2V0UHJpbnRhYmxlT3B0aW1pemF0aW9uTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4iY3VzdG9tIj09YT8iQ3VzdG9tIHRocmVzaG9sZHMiOiJ1bmF3YXJlIj09CmE/Ik9wdGltYWwgc2luZ2xlIHRocmVzaG9sZCI6ImRlbW9wYXJpdHkiPT1hPyJEZW1vZ3JhcGhpYyBwYXJpdHkgdGhyZXNob2xkcyI6ImVxdWFsb3BwIj09YT8iRXF1YWwgb3Bwb3J0dW5pdHkgdGhyZXNob2xkcyI6ImVxdWFsYWNjIj09YT8iRXF1YWwgYWNjdXJhY3kgdGhyZXNob2xkcyI6Ik9wdGltYWwgZ3JvdXAgdGhyZXNob2xkcyJ9LGdldEZlYXR1cmVTb3J0Qnk6ZnVuY3Rpb24oYSxjKXtsZXQgZD1bIkNvdW50IiwiQWxwaGFiZXRpY2FsIl07cmV0dXJuIGQ9dGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyhhLGMpP2QuY29uY2F0KFsiQWNjdXJhY3kiLCJGYWxzZSBwb3NpdGl2ZXMiLCJGYWxzZSBuZWdhdGl2ZXMiXSk6dGhpcy5pc011bHRpQ2xhc3NfKGEsYyk/ZC5jb25jYXQoWyJBY2N1cmFjeSJdKTpkLmNvbmNhdCgiTWVhbiBlcnJvcjtNZWRpYW4gZXJyb3I7TWVhbiBhYnNvbHV0ZSBlcnJvcjtNZWRpYW4gYWJzb2x1dGUgZXJyb3I7TWVhbiBzcXVhcmVkIGVycm9yO01lZGlhbiBzcXVhcmVkIGVycm9yIi5zcGxpdCgiOyIpKX0sCnNlbGVjdGVkRmVhdHVyZVNvcnRDaGFuZ2VkXzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkczt0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHM9W107dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzPXRoaXMuc29ydEZlYXR1cmVWYWx1ZXMoYSk7bnVsbCE9dGhpcy5yZWdyZXNzaW9uRW50cmllc18mJihhPXRoaXMucmVncmVzc2lvbkVudHJpZXNfLHRoaXMucmVncmVzc2lvbkVudHJpZXNfPVtdLHRoaXMucmVncmVzc2lvbkVudHJpZXNfPXRoaXMuc29ydFJlZ3Jlc3Npb25FbnRyaWVzKGEpKX0sZ2V0U2xpZGVyQ2xhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuInNsaWRlciAiKygwPT1hPyJzbGlkZXItbW9kZWwtb25lIjoic2xpZGVyLW1vZGVsLXR3byIpfSxmb3JtYXRFcnJvcjpmdW5jdGlvbihhKXtyZXR1cm4gZDMuZm9ybWF0KCIuM2YiKShhKX0sZXhwYW5kQWxsUGVyZm9ybWFuY2U6ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMpe2ZvcihsZXQgYT0KMDthPHRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkcy5sZW5ndGg7YSsrKXRoaXMuc2V0KCJmZWF0dXJlVmFsdWVUaHJlc2hvbGRzLiIrYSsiLm9wZW5lZCIsITApO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy51cGRhdGVJbmZlcmVuY2VTdGF0c18oITApKX19LGNvbGxhcHNlQWxsUGVyZm9ybWFuY2U6ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMpZm9yKGxldCBhPTA7YTx0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubGVuZ3RoO2ErKyl0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkcy4iK2ErIi5vcGVuZWQiLCExKX19KTskbC5yZWdpc3RlckRhc2hib2FyZCh7cGx1Z2luOiJ3aGF0aWYiLGVsZW1lbnROYW1lOiJ0Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkIix0YWJOYW1lOiJXaGF0LUlmIFRvb2wifSl9KSgpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ocGFyYW1zLXV0aWxzL3RmLWhwYXJhbXMtdXRpbHMuaHRtbC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKEIpe3JldHVybiIiIT09Qi5kaXNwbGF5TmFtZSYmdm9pZCAwIT09Qi5kaXNwbGF5TmFtZT9CLmRpc3BsYXlOYW1lOkIubmFtZX1mdW5jdGlvbiBnKEIpe2lmKCIiIT09Qi5kaXNwbGF5TmFtZSYmdm9pZCAwIT09Qi5kaXNwbGF5TmFtZSlyZXR1cm4gQi5kaXNwbGF5TmFtZTtsZXQgRz1CLm5hbWUuZ3JvdXA7Qj1CLm5hbWUudGFnO3ZvaWQgMD09PUcmJihHPSIiKTt2b2lkIDA9PT1CJiYoQj0iIik7cmV0dXJuIiI9PT1HP0I6RysiLiIrQn1mdW5jdGlvbiBsKEIpe3JldHVybiBCLmhwYXJhbUNvbHVtbnMubGVuZ3RofWZ1bmN0aW9uIGsoQil7cmV0dXJuIEIubWV0cmljQ29sdW1ucy5sZW5ndGh9ZnVuY3Rpb24gbShCLEcpe3JldHVybiBCW0ddfWZ1bmN0aW9uIHAoQixHKXtyZXR1cm4gQi5maW5kKEs9Pl8uaXNFcXVhbChLLm5hbWUsRykpfWZ1bmN0aW9uIHEoQixHLEspe3JldHVybiBHLmhwYXJhbXNbQi5ocGFyYW1Db2x1bW5zW0tdLmhwYXJhbUluZm8ubmFtZV19CmZ1bmN0aW9uIHIoQixHLEspe0I9cChHLm1ldHJpY1ZhbHVlcyxCLm1ldHJpY0NvbHVtbnNbS10ubWV0cmljSW5mby5uYW1lKTtyZXR1cm4gdm9pZCAwPT09Qj92b2lkIDA6Qi52YWx1ZX1mdW5jdGlvbiB0KEIsRyxLKXtyZXR1cm4gSzxCLmhwYXJhbUNvbHVtbnMubGVuZ3RoP3EoQixHLEspOnIoQixHLEstQi5ocGFyYW1Db2x1bW5zLmxlbmd0aCl9ZnVuY3Rpb24gdihCKXtyZXR1cm4gQi5ocGFyYW1JbmZvcy5sZW5ndGh9ZnVuY3Rpb24gQShCKXtyZXR1cm4gQi5tZXRyaWNJbmZvcy5sZW5ndGh9ZnVuY3Rpb24geShCLEcsSyl7cmV0dXJuIEcuaHBhcmFtc1tCLmhwYXJhbUluZm9zW0tdLm5hbWVdfWZ1bmN0aW9uIHgoQixHLEspe0I9cChHLm1ldHJpY1ZhbHVlcyxCLm1ldHJpY0luZm9zW0tdLm5hbWUpO3JldHVybiB2b2lkIDA9PT1CP3ZvaWQgMDpCLnZhbHVlfWZ1bmN0aW9uIEMoQixHLEspe3JldHVybiBLPEIuaHBhcmFtSW5mb3MubGVuZ3RoP3koQixHLEspOngoQixHLEstQi5ocGFyYW1JbmZvcy5sZW5ndGgpfQpmdW5jdGlvbiBGKEIpe3JldHVybiBfLmlzTnVtYmVyKEIpP0IudG9QcmVjaXNpb24oNSk6dm9pZCAwPT09Qj8iIjpCLnRvU3RyaW5nKCl9ZnVuY3Rpb24gRChCLEcpe3JldHVybiBCKkIrRypHfWQuaHBhcmFtTmFtZT1mO2QubWV0cmljTmFtZT1nO2Quc2NoZW1hQ29sdW1uTmFtZT1mdW5jdGlvbihCLEcpe3JldHVybiBHPEIuaHBhcmFtQ29sdW1ucy5sZW5ndGg/ZihCLmhwYXJhbUNvbHVtbnNbR10uaHBhcmFtSW5mbyk6ZyhCLm1ldHJpY0NvbHVtbnNbRy1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoXS5tZXRyaWNJbmZvKX07ZC5udW1IUGFyYW1zPWw7ZC5udW1NZXRyaWNzPWs7ZC5udW1Db2x1bW5zPWZ1bmN0aW9uKEIpe3JldHVybiBsKEIpK2soQil9O2QuaHBhcmFtVmFsdWVCeU5hbWU9bTtkLm1ldHJpY1ZhbHVlQnlOYW1lPXA7ZC5ocGFyYW1WYWx1ZUJ5SW5kZXg9cTtkLm1ldHJpY1ZhbHVlQnlJbmRleD1yO2QuY29sdW1uVmFsdWVCeUluZGV4PXQ7ZC5udW1lcmljQ29sdW1uRXh0ZW50PQpmdW5jdGlvbihCLEcsSyl7cmV0dXJuIGQzLmV4dGVudChHLEw9PnQoQixMLEspKX07ZC5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4PWZ1bmN0aW9uKEIsRyxLKXtpZihLPEcuaHBhcmFtSW5mb3MubGVuZ3RoKUI9Qi5ocGFyYW1Db2x1bW5zLmZpbmRJbmRleChMPT5MLmhwYXJhbUluZm8ubmFtZT09PUcuaHBhcmFtSW5mb3NbS10ubmFtZSk7ZWxzZXtjb25zdCBMPUcubWV0cmljSW5mb3NbSy1HLmhwYXJhbUluZm9zLmxlbmd0aF0ubmFtZTtCPUIuaHBhcmFtQ29sdW1ucy5sZW5ndGgrQi5tZXRyaWNDb2x1bW5zLmZpbmRJbmRleChKPT5KLm1ldHJpY0luZm8ubmFtZT09PUwpfWNvbnNvbGUuYXNzZXJ0KC0xIT09Qik7cmV0dXJuIEJ9O2Quc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWU9ZnVuY3Rpb24oQixHKXtyZXR1cm4gRzxCLmhwYXJhbUluZm9zLmxlbmd0aD9mKEIuaHBhcmFtSW5mb3NbR10pOmcoQi5tZXRyaWNJbmZvc1tHLUIuaHBhcmFtSW5mb3MubGVuZ3RoXSl9O2QubnVtVmlzaWJsZUhQYXJhbXM9CnY7ZC5udW1WaXNpYmxlTWV0cmljcz1BO2QubnVtVmlzaWJsZUNvbHVtbnM9ZnVuY3Rpb24oQil7cmV0dXJuIHYoQikrQShCKX07ZC52aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudD1mdW5jdGlvbihCLEcsSyl7cmV0dXJuIGQzLmV4dGVudChHLEw9PkMoQixMLEspKX07ZC5wcmV0dHlQcmludEhQYXJhbVZhbHVlQnlOYW1lPWZ1bmN0aW9uKEIsRyl7cmV0dXJuIEYobShCLEcpKX07ZC5wcmV0dHlQcmludE1ldHJpY1ZhbHVlQnlOYW1lPWZ1bmN0aW9uKEIsRyl7cmV0dXJuIEYocChCLEcpKX07ZC5zZXNzaW9uR3JvdXBXaXRoTmFtZT1mdW5jdGlvbihCLEcpe3JldHVybiBCLmZpbmQoSz0+Sy5uYW1lPT09Ryl9O2QuaHBhcmFtVmFsdWVCeVZpc2libGVJbmRleD15O2QubWV0cmljVmFsdWVCeVZpc2libGVJbmRleD14O2QuY29sdW1uVmFsdWVCeVZpc2libGVJbmRleD1DO2QucHJldHR5UHJpbnQ9RjtkLmwyTm9ybVNxdWFyZWQ9RDtkLmV1Y2xpZGVhbkRpc3Q9ZnVuY3Rpb24oQixHLEssTCl7cmV0dXJuIE1hdGguc3FydChEKEItCkssRy1MKSl9O2QucG9pbnRUb1JlY3RhbmdsZURpc3Q9ZnVuY3Rpb24oQixHLEssTCxKLFApe2lmKEI8SyYmRzxMKXJldHVybiBkLmV1Y2xpZGVhbkRpc3QoQixHLEssTCk7aWYoSzw9QiYmQjxKJiZHPEwpcmV0dXJuIEwtRztpZihKPD1CJiZHPEwpcmV0dXJuIGQuZXVjbGlkZWFuRGlzdChCLEcsSixMKTtpZihCPEsmJkw8PUcmJkc8UClyZXR1cm4gSy1CO2lmKEs8PUImJkI8SiYmTDw9RyYmRzxQKXJldHVybiAwO2lmKEo8PUImJkw8PUcmJkc8UClyZXR1cm4gQi1KO2lmKEI8SyYmUDw9RylyZXR1cm4gZC5ldWNsaWRlYW5EaXN0KEIsRyxLLFApO2lmKEs8PUImJkI8SiYmUDw9RylyZXR1cm4gRy1QO2lmKEo8PUImJlA8PUcpcmV0dXJuIGQuZXVjbGlkZWFuRGlzdChCLEcsSixQKTt0aHJvdyJQb2ludCAoeCx5KSBtdXN0IGJlIGluIG9uZSBvZiB0aGUgcmVnaW9ucyBkZWZpbmVkIGFib3ZlLiI7fTtkLnRyYW5zbGF0ZVN0cj1mdW5jdGlvbihCLEcpe3JldHVybiB2b2lkIDA9PT1HPyJ0cmFuc2xhdGUoIisKQisiKSI6InRyYW5zbGF0ZSgiK0IrIiwiK0crIikifTtkLnJvdGF0ZVN0cj1mdW5jdGlvbihCLEcpe2xldCBLPSJyb3RhdGUoOTAiO3ZvaWQgMCE9PUImJnZvaWQgMCE9PUcmJihLPUsrIiwiK0IrIiwiK0cpO3JldHVybiBLKyIpIn07ZC5pc051bGxPclVuZGVmaW5lZD1mdW5jdGlvbihCKXtyZXR1cm4gbnVsbD09PUJ8fHZvaWQgMD09PUJ9O2QucXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdD1mdW5jdGlvbihCLEcsSyxMLEosUCl7Qi52aXNpdCgoUyxOLFQsWSxhYSk9PntpZih2b2lkIDA9PT1TLmxlbmd0aCl7ZG8gTj1CLngoKShTLmRhdGEpLFQ9Qi55KCkoUy5kYXRhKSxHPD1OJiZOPEwmJks8PVQmJlQ8SiYmUChTLmRhdGEpO3doaWxlKFM9Uy5uZXh0KTtyZXR1cm4hMH1yZXR1cm4gTj49THx8WTw9R3x8VD49Snx8YWE8PUt9KX07ZC5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrPWZ1bmN0aW9uKEIsRyxLLEwsSil7Qi52aXNpdCgoUCxTLE4sVCxZKT0+e2lmKHZvaWQgMD09PVAubGVuZ3RoKXtkbyBTPQpCLngoKShQLmRhdGEpLE49Qi55KCkoUC5kYXRhKSxTPWQuZXVjbGlkZWFuRGlzdChHLEssUyxOKSxTPD1MJiZKKFAuZGF0YSxTKTt3aGlsZShQPVAubmV4dCk7cmV0dXJuITB9cmV0dXJuIGQucG9pbnRUb1JlY3RhbmdsZURpc3QoRyxLLFMsTixULFkpPkx9KX07ZC5maWx0ZXJTZXQ9ZnVuY3Rpb24oQixHKXtjb25zdCBLPW5ldyBTZXQ7Qi5mb3JFYWNoKEw9PntHKEwpJiZLLmFkZChMKX0pO3JldHVybiBLfTtkLnNldEFycmF5T2JzZXJ2YWJseT1mdW5jdGlvbihCLEcpe2NvbnN0IEs9Qi5nZXQoInNlc3Npb25Hcm91cHMiLEIpO0FycmF5LmlzQXJyYXkoSyk/Qi5zcGxpY2UuYXBwbHkoQixbInNlc3Npb25Hcm91cHMiLDAsSy5sZW5ndGhdLmNvbmNhdChHKSk6Qi5zZXQoInNlc3Npb25Hcm91cHMiLEcpfTtkLmhhc2hPZlN0cmluZz1mdW5jdGlvbihCKXtsZXQgRz0wO2ZvcihsZXQgSz0wO0s8Qi5sZW5ndGg7KytLKUc9MzEqRytCLmNoYXJDb2RlQXQoSykmNDI5NDk2NzI5NTtyZXR1cm4gRysKTWF0aC5wb3coMiwzMSl9fSkoYy51dGlsc3x8KGMudXRpbHM9e30pKX0pKGEuaHBhcmFtc3x8KGEuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwo8L3NjcmlwdD4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLXNwbGl0LWxheW91dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICB9CgogICAgICA6aG9zdChbdmVydGljYWxdKSB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKCopIHsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QgPiAjc3BsaXR0ZXIgewogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgICAgbWluLXdpZHRoOiA4cHg7CiAgICAgICAgbWluLWhlaWdodDogOHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IsICNjY2MpOwogICAgICAgIGZpbGw6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvciwgI2ZmZik7CiAgICAgICAgQGFwcGx5IC0tdmFhZGluLXNwbGl0LWxheW91dC1zcGxpdHRlcjsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbdmVydGljYWxdKSkgPiAjc3BsaXR0ZXIgewogICAgICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgICB9CgogICAgICA6aG9zdChbdmVydGljYWxdKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBucy1yZXNpemU7CiAgICAgIH0KCiAgICAgICNoYW5kbGUsCiAgICAgICNzcGxpdHRlciA6OnNsb3R0ZWQoW3Nsb3Q9aGFuZGxlXSkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyICNoYW5kbGUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHJvdGF0ZSg5MGRlZyk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2xvdCBpZD0icHJpbWFyeSIgbmFtZT0icHJpbWFyeSI+PC9zbG90PgogICAgPGRpdiBpZD0ic3BsaXR0ZXIiIG9uLXRyYWNrPSJfb25IYW5kbGVUcmFjayIgb24tZG93bj0iX3ByZXZlbnREZWZhdWx0Ij4KICAgICAgPHNsb3QgbmFtZT0iaGFuZGxlIj4KICAgICAgICA8c3ZnIGlkPSJoYW5kbGUiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCI+CiAgICAgICAgICA8cmVjdCB4PSIxOSIgeT0iOCIgd2lkdGg9IjIiIGhlaWdodD0iMjQiPjwvcmVjdD4KICAgICAgICA8L3N2Zz4KICAgICAgPC9zbG90PgogICAgPC9kaXY+CiAgICA8c2xvdCBpZD0ic2Vjb25kYXJ5IiBuYW1lPSJzZWNvbmRhcnkiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdmFhZGluLXNwbGl0LWxheW91dC92YWFkaW4tc3BsaXQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1zcGxpdC1sYXlvdXQiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxfcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50czpTdHJpbmcsX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50czpTdHJpbmd9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX3Byb2Nlc3NDaGlsZHJlbil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpfSxfcHJvY2Vzc0NoaWxkcmVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3QuY29udGFpbnMoInNwbGl0dGVyLWhhbmRsZSIpPwooUG9seW1lci5kb20oYSkuc2V0QXR0cmlidXRlKCJzbG90IiwiaGFuZGxlIiksITEpOiEwfSkuZm9yRWFjaChmdW5jdGlvbihhLGMpezA9PT1jPyh0aGlzLl9wcmltYXJ5Q2hpbGQ9YSxQb2x5bWVyLmRvbShhKS5zZXRBdHRyaWJ1dGUoInNsb3QiLCJwcmltYXJ5IikpOjE9PWM/KHRoaXMuX3NlY29uZGFyeUNoaWxkPWEsUG9seW1lci5kb20oYSkuc2V0QXR0cmlidXRlKCJzbG90Iiwic2Vjb25kYXJ5IikpOlBvbHltZXIuZG9tKGEpLnJlbW92ZUF0dHJpYnV0ZSgic2xvdCIpfS5iaW5kKHRoaXMpKX0sX3NldEZsZXhCYXNpczpmdW5jdGlvbihhLGMsZCl7Yz1NYXRoLm1heCgwLE1hdGgubWluKGMsZCkpOzA9PT1jJiYoYz0xRS02KTthLnN0eWxlLmZsZXg9IjEgMSAiK2MrInB4In0sX29uSGFuZGxlVHJhY2s6ZnVuY3Rpb24oYSl7aWYodGhpcy5fcHJpbWFyeUNoaWxkJiZ0aGlzLl9zZWNvbmRhcnlDaGlsZCl7dmFyIGM9dGhpcy52ZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiOyJzdGFydCI9PT0KYS5kZXRhaWwuc3RhdGU/KHRoaXMuX3N0YXJ0U2l6ZT17Y29udGFpbmVyOnRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbY10tdGhpcy4kLnNwbGl0dGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2NdLHByaW1hcnk6dGhpcy5fcHJpbWFyeUNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2NdLHNlY29uZGFyeTp0aGlzLl9zZWNvbmRhcnlDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtjXX0sdGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cz10aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHM9dGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsdGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpOihjPXRoaXMudmVydGljYWw/YS5kZXRhaWwuZHk6CmEuZGV0YWlsLmR4LHRoaXMuX3NldEZsZXhCYXNpcyh0aGlzLl9wcmltYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnByaW1hcnkrYyx0aGlzLl9zdGFydFNpemUuY29udGFpbmVyKSx0aGlzLl9zZXRGbGV4QmFzaXModGhpcy5fc2Vjb25kYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnNlY29uZGFyeS1jLHRoaXMuX3N0YXJ0U2l6ZS5jb250YWluZXIpLHRoaXMubm90aWZ5UmVzaXplKCksImVuZCI9PT1hLmRldGFpbC5zdGF0ZSYmKGRlbGV0ZSB0aGlzLl9zdGFydFNpemUsdGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9dGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cyx0aGlzLl9zZWNvbmRhcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPXRoaXMuX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50cykpfX0sX3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9InBhbmUiPgogICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0iaHlwZXJwYXJhbWV0ZXJzLW1ldHJpY3Mtc3RhdHVzZXMiPgogICAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9Imh5cGVycGFyYW1ldGVycy1tZXRyaWNzIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBoeXBlcnBhcmFtZXRlcnMiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPkh5cGVycGFyYW1ldGVyczwvZGl2PgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X2hwYXJhbXN9fSIgYXM9ImhwYXJhbSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJocGFyYW0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tocGFyYW0uZGlzcGxheWVkfX0iIGNsYXNzPSJocGFyYW0tY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5kb21haW5EaXNjcmV0ZV1dIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tpdGVtLmNoZWNrZWR9fSIgY2xhc3M9ImRpc2NyZXRlLXZhbHVlLWNoZWNrYm94IiBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIFtbX3ByZXR0eVByaW50KGl0ZW0udmFsdWUpXV0KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWluIiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLmludGVydmFsLm1pbi52YWx1ZX19IiBhbGxvd2VkX3BhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWRdXSIgcGxhY2Vob2xkZXI9Ii1pbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXgudmFsdWV9fSIgYWxsb3dlZF9wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkXV0iIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5yZWdleHBdXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJSZWd1bGFyIGV4cHJlc3Npb24iIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIucmVnZXhwfX0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIG1ldHJpY3MiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk1ldHJpY3M8L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19tZXRyaWNzfX0iIGFzPSJtZXRyaWMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e21ldHJpYy5kaXNwbGF5ZWR9fSIgY2xhc3M9Im1ldHJpYy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNaW4iIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5taW4uaW52YWxpZH19IiBwbGFjZWhvbGRlcj0iLWluZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWF4IiBhbGxvd2VkLXBhdHRlcm49IlswLTkuZVwtXSIgdmFsdWU9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5tYXgudmFsdWV9fSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LmludmFsaWR9fSIgcGxhY2Vob2xkZXI9IitpbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gc3RhdHVzIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U3RhdHVzPC9kaXY+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3N0YXR1c2VzXV0iIGFzPSJzdGF0dXMiPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e3N0YXR1cy5hbGxvd2VkfX0iIG9uLWNoYW5nZT0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgICAgIFtbc3RhdHVzLmRpc3BsYXlOYW1lXV0KICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJzb3J0aW5nLXBhZ2luZyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHNvcnRpbmciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Tb3J0aW5nPC9kaXY+CiAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJTb3J0IGJ5IiBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zb3J0QnlJbmRleH19IiBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19ocGFyYW1zXV0iIGFzPSJocGFyYW0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19tZXRyaWNzXV0iIGFzPSJtZXRyaWMiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpYy5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJEaXJlY3Rpb24iIG9uLXNlbGVjdGVkLWl0ZW0tY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBob3Jpem9udGFsLWFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NvcnREaXJlY3Rpb259fSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5Bc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5EZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHBhZ2luZyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlBhZ2luZzwvZGl2PgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIE51bWJlciBvZiBtYXRjaGluZyBzZXNzaW9uIGdyb3VwczogW1tfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHJdXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQgcGFnZS1udW1iZXItaW5wdXQiPgogICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUGFnZSAjIiB2YWx1ZT0ie3tfcGFnZU51bWJlcklucHV0LnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbX3BhZ2VOdW1iZXJJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICA8ZGl2IHNsb3Q9InN1ZmZpeCIgY2xhc3M9InBhZ2Utc3VmZml4Ij4vIFtbX3BhZ2VDb3VudFN0cl1dPC9kaXY+CiAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2Utc2l6ZS1pbnB1dCI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXggIyBvZiBzZXNzaW9uIGdyb3VwcyBwZXIgcGFnZToiIHZhbHVlPSJ7e19wYWdlU2l6ZUlucHV0LnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbX3BhZ2VTaXplSW5wdXQuaW52YWxpZF1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogNXB4IDEwcHggNXB4IDEwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogN3B4OwogICAgICB9CiAgICAgICNoeXBlcnBhcmFtZXRlcnMtbWV0cmljcy1zdGF0dXNlcyB7CiAgICAgICAgZmxleC1iYXNpczogNzAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAjaHlwZXJwYXJhbWV0ZXJzLW1ldHJpY3MgewogICAgICAgIGZsZXgtYmFzaXM6IDkwJTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLmh5cGVycGFyYW1ldGVycyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLm1ldHJpY3MgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5zdGF0dXNlcyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgI3NvcnRpbmctcGFnaW5nIHsKICAgICAgICBmbGV4LWJhc2lzOiAzMCU7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgIC5zb3J0aW5nIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAucGFnaW5nIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3gsCiAgICAgIC5tZXRyaWMtY2hlY2tib3gsCiAgICAgIC5ocGFyYW0tY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5kaXNjcmV0ZS12YWx1ZS1jaGVja2JveCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgICAgIH0KICAgICAgLmhwYXJhbSwKICAgICAgLm1ldHJpYyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmlubGluZS1lbGVtZW50IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgICAucGFnZS1udW1iZXItaW5wdXQgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgIH0KICAgICAgLnBhZ2Utc2l6ZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDYwJTsKICAgICAgfQogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItbGlzdGJveCB7CiAgICAgICAgbWF4LWhlaWdodDogMTVlbTsKICAgICAgfQogICAgICAucGFnZS1zdWZmaXggewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaHBhcmFtcy1xdWVyeS1wYW5lL3RmLWhwYXJhbXMtcXVlcnktcGFuZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUiLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyxjb25maWd1cmF0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2hlbWE6e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX0sY29sdW1uc1Zpc2liaWxpdHk6W10sdmlzaWJsZVNjaGVtYTp7aHBhcmFtSW5mb3M6W10sbWV0cmljSW5mb3M6W119fSkscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxzZXNzaW9uR3JvdXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxyZWFkT25seTohMCxub3RpZnk6ITB9LF9leHBlcmltZW50Ok9iamVjdCxfaHBhcmFtczpBcnJheSxfbWV0cmljczpBcnJheSxfc3RhdHVzZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7dmFsdWU6IlNUQVRVU19VTktOT1dOIixkaXNwbGF5TmFtZToiVW5rbm93biIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfU1VDQ0VTUyIsZGlzcGxheU5hbWU6IlN1Y2Nlc3MiLAphbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19GQUlMVVJFIixkaXNwbGF5TmFtZToiRmFpbHVyZSIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfUlVOTklORyIsZGlzcGxheU5hbWU6IlJ1bm5pbmciLGFsbG93ZWQ6ITB9XX0sX2dldEV4cGVyaW1lbnRSZXNvbHZlZDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoYT0+e3RoaXMuX3Jlc29sdmVHZXRFeHBlcmltZW50PWF9KX19LF9yZXNvbHZlR2V0RXhwZXJpbWVudDpGdW5jdGlvbixfbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUGsuQ2FuY2VsbGVyfSxfc29ydEJ5SW5kZXg6TnVtYmVyLF9zb3J0RGlyZWN0aW9uOk51bWJlcixfcGFnZVNpemVJbnB1dDp7dHlwZTpPYmplY3QsdmFsdWU6e3ZhbHVlOiIxMDAiLGludmFsaWQ6ITF9fSxfcGFnZU51bWJlcklucHV0Ont0eXBlOk9iamVjdCx2YWx1ZTp7dmFsdWU6IjEiLGludmFsaWQ6ITF9fSwKX3BhZ2VDb3VudFN0cjp7dHlwZTpTdHJpbmcsdmFsdWU6Ij8ifSxfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHI6U3RyaW5nfSxvYnNlcnZlcnM6WyJfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoYmFja2VuZCwgZXhwZXJpbWVudE5hbWUpIiwiX3VwZGF0ZUNvbmZpZ3VyYXRpb24oX2hwYXJhbXMuKiwgX21ldHJpY3MuKikiXSxyZWxvYWQoKXt0aGlzLl9xdWVyeVNlcnZlcigpfSxfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoKXtjb25zdCBhPXRmLmhwYXJhbXMudXRpbHM7YS5pc051bGxPclVuZGVmaW5lZCh0aGlzLmJhY2tlbmQpfHxhLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZXhwZXJpbWVudE5hbWUpfHx0aGlzLmJhY2tlbmQuZ2V0RXhwZXJpbWVudCh7ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZX0pLnRoZW4oYz0+e18uaXNFcXVhbChjLHRoaXMuX2V4cGVyaW1lbnQpfHwodGhpcy5zZXQoIl9leHBlcmltZW50IixjKSx0aGlzLl9jb21wdXRlSFBhcmFtcygpLAp0aGlzLl9jb21wdXRlTWV0cmljcygpLHRoaXMuX3F1ZXJ5U2VydmVyKCksdGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQoKSl9KX0sX2NvbXB1dGVIUGFyYW1zKCl7Y29uc3QgYT1bXTt0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmZvckVhY2goKGMsZCk9Pntjb25zdCBmPXtpbmZvOmMsZGlzcGxheWVkOjU+ZCxmaWx0ZXI6e319O2YuaW5mby5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluRGlzY3JldGUiKT8oZi5maWx0ZXIuZG9tYWluRGlzY3JldGU9W10sZi5pbmZvLmRvbWFpbkRpc2NyZXRlLmZvckVhY2goZz0+e2YuZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOmcsY2hlY2tlZDohMH0pfSkpOiJEQVRBX1RZUEVfQk9PTCI9PT1mLmluZm8udHlwZT9mLmZpbHRlci5kb21haW5EaXNjcmV0ZT1be3ZhbHVlOiExLGNoZWNrZWQ6ITB9LHt2YWx1ZTohMCxjaGVja2VkOiEwfV06IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWYuaW5mby50eXBlP2YuZmlsdGVyLmludGVydmFsPXttaW46e3ZhbHVlOiIiLAppbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fToiREFUQV9UWVBFX1NUUklORyI9PT1mLmluZm8udHlwZT9mLmZpbHRlci5yZWdleHA9IiI6Y29uc29sZS53YXJuKCJ1bmtub3duIGhwYXJhbS5pbmZvLnR5cGU6ICVzIixmLmluZm8udHlwZSk7YS5wdXNoKGYpfSk7dGhpcy5zZXQoIl9ocGFyYW1zIixhKX0sX2NvbXB1dGVNZXRyaWNzKCl7Y29uc3QgYT1bXTt0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmZvckVhY2goKGMsZCk9PnthLnB1c2goe2luZm86YyxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19fSxkaXNwbGF5ZWQ6NT5kfSl9KTt0aGlzLnNldCgiX21ldHJpY3MiLGEpfSxfY29tcHV0ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1Db2x1bW5zOnRoaXMuX2hwYXJhbXMubWFwKGE9Pih7aHBhcmFtSW5mbzphLmluZm99KSksbWV0cmljQ29sdW1uczp0aGlzLl9tZXRyaWNzLm1hcChhPT4KKHttZXRyaWNJbmZvOmEuaW5mb30pKX06e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX19LF91cGRhdGVDb25maWd1cmF0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX3VwZGF0ZUNvbmZpZ3VyYXRpb24iLCgpPT57dGhpcy5fc2V0Q29uZmlndXJhdGlvbih7c2NoZW1hOnRoaXMuX2NvbXB1dGVTY2hlbWEoKSxjb2x1bW5zVmlzaWJpbGl0eTp0aGlzLl9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKSx2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9KX0pfSxfY29tcHV0ZUNvbHVtbnNWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3M/dGhpcy5faHBhcmFtcy5tYXAoYT0+YS5kaXNwbGF5ZWQpLmNvbmNhdCh0aGlzLl9tZXRyaWNzLm1hcChhPT5hLmRpc3BsYXllZCkpOltdfSxfY29tcHV0ZVZpc2libGVTY2hlbWEoKXtpZighdGhpcy5faHBhcmFtc3x8IXRoaXMuX21ldHJpY3MpcmV0dXJue2hwYXJhbUluZm9zOltdLAptZXRyaWNJbmZvczpbXX07Y29uc3QgYT10aGlzLl9ocGFyYW1zLmZpbHRlcihkPT5kLmRpc3BsYXllZCkubWFwKGQ9PmQuaW5mbyksYz10aGlzLl9tZXRyaWNzLmZpbHRlcihkPT5kLmRpc3BsYXllZCkubWFwKGQ9PmQuaW5mbyk7cmV0dXJue2hwYXJhbUluZm9zOmEsbWV0cmljSW5mb3M6Y319LF9xdWVyeVNlcnZlcigpe3RoaXMuZGVib3VuY2UoInF1ZXJ5U2VydmVyIiwoKT0+dGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCksMTAwKX0sX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe3JldHVybiB0aGlzLl9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCkudGhlbih0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxsYWJsZSgoe3ZhbHVlOmEsY2FuY2VsbGVkOmN9KT0+e2N8fCgwPD1hLnRvdGFsU2l6ZT8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwoYS50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsCmEudG90YWxTaXplKSk6KHRoaXMuc2V0KCJfcGFnZUNvdW50U3RyIiwiPyIpLHRoaXMuc2V0KCJfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHIiLCJVbmtub3duIikpLHRmLmhwYXJhbXMudXRpbHMuc2V0QXJyYXlPYnNlcnZhYmx5KHRoaXMsYS5zZXNzaW9uR3JvdXBzKSl9KSl9LF9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCl7Y29uc3QgYT10aGlzLl9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpO2lmKG51bGwhPT1hKXJldHVybiB0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLmJhY2tlbmQubGlzdFNlc3Npb25Hcm91cHMoYSl9LF9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2Z1bmN0aW9uIGEocCl7dmFyIHE9ZC5nZXQocCsiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PXEpO3E9IiI9PT1xPyItSW5maW5pdHkiOitxO2Quc2V0KHArIi5taW4uaW52YWxpZCIsaXNOYU4ocSkpO2Y9ZiYmIWlzTmFOKHEpOwp2YXIgcj1kLmdldChwKyIubWF4LnZhbHVlIik7Y29uc29sZS5hc3NlcnQodm9pZCAwIT09cik7cj0iIj09PXI/IkluZmluaXR5IjorcjtkLnNldChwKyIubWF4LmludmFsaWQiLGlzTmFOKHIpKTtmPWYmJiFpc05hTihyKTtyZXR1cm4gaXNOYU4ocSl8fGlzTmFOKHIpP251bGw6e21pblZhbHVlOnEsbWF4VmFsdWU6cn19ZnVuY3Rpb24gYyhwKXt2YXIgcT1kLmdldChwKyIudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1xKTtxPStxO2NvbnN0IHI9TnVtYmVyLmlzSW50ZWdlcihxKSYmMDxxO2Quc2V0KHArIi5pbnZhbGlkIiwhcik7Zj1mJiZyO3JldHVybiByP3E6bnVsbH1jb25zdCBkPXRoaXM7bGV0IGY9ITA7Y29uc3QgZz10aGlzLl9zdGF0dXNlcy5maWx0ZXIocD0+cC5hbGxvd2VkKS5tYXAocD0+cC52YWx1ZSk7bGV0IGw9W107dGhpcy5faHBhcmFtcy5mb3JFYWNoKChwLHEpPT57bGV0IHI9e2hwYXJhbTpwLmluZm8ubmFtZX07aWYocC5maWx0ZXIuZG9tYWluRGlzY3JldGUpci5maWx0ZXJEaXNjcmV0ZT0KW10scC5maWx0ZXIuZG9tYWluRGlzY3JldGUuZm9yRWFjaCh0PT57dC5jaGVja2VkJiZyLmZpbHRlckRpc2NyZXRlLnB1c2godC52YWx1ZSl9KTtlbHNlIGlmKHAuZmlsdGVyLmludGVydmFsKXIuZmlsdGVySW50ZXJ2YWw9YSgiX2hwYXJhbXMuIitxKyIuZmlsdGVyLmludGVydmFsIik7ZWxzZSBpZihwLmZpbHRlci5yZWdleHApci5maWx0ZXJSZWdleHA9cC5maWx0ZXIucmVnZXhwO2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoImhwYXJhbS5maWx0ZXIgd2l0aCBubyBkb21haW5EaXNjcmV0ZSwgaW50ZXJ2YWwgb3IgcmVnZXhwIHByb3BlcnRpZXMgc2V0OiAlcyIscCksbnVsbDtsLnB1c2gocil9KTt0aGlzLl9tZXRyaWNzLmZvckVhY2goKHAscSk9PntwPXttZXRyaWM6cC5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6YSgiX21ldHJpY3MuIitxKyIuZmlsdGVyLmludGVydmFsIil9O2wucHVzaChwKX0pO2lmKHZvaWQgMCE9PXRoaXMuX3NvcnRCeUluZGV4JiZ2b2lkIDAhPT10aGlzLl9zb3J0RGlyZWN0aW9uKXtpZighKHRoaXMuX3NvcnRCeUluZGV4IGluCmwpKXJldHVybiBjb25zb2xlLmVycm9yKCJObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzIix0aGlzLl9zb3J0QnlJbmRleCksbnVsbDtsW3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlcj0wPT09dGhpcy5fc29ydERpcmVjdGlvbj8iT1JERVJfQVNDIjoiT1JERVJfREVTQyJ9Y29uc3Qgaz1jKCJfcGFnZU51bWJlcklucHV0IiksbT1jKCJfcGFnZVNpemVJbnB1dCIpO3JldHVybiBmP3tleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLGFsbG93ZWRTdGF0dXNlczpnLGNvbFBhcmFtczpsLHN0YXJ0SW5kZXg6bSooay0xKSxzbGljZVNpemU6bX06bnVsbH0sX21ldHJpY1NvcnRCeUluZGV4KGEpe3JldHVybiBhK3RoaXMuX2hwYXJhbXMubGVuZ3RofSxfaHBhcmFtTmFtZTp0Zi5ocGFyYW1zLnV0aWxzLmhwYXJhbU5hbWUsX21ldHJpY05hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lLF9wcmV0dHlQcmludDp0Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWhlYWRlci1wYW5lbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgI21haW5QYW5lbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1ib2R5OwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2Nyb2xsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXI7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IGNvdmVyCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5QYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc3RhbmRhcmQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXN0YW5kYXJkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNlYW1lZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2VhbWVkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zZWFtZWQtY29udGFpbmVyOwogICAgICB9CgoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbC10YWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGwtdGFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLXRhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93Lmhhcy1zaGFkb3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyID4gOjpzbG90dGVkKC5maXQpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBpZD0iaGVhZGVyU2xvdCIgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0ibWFpblBhbmVsIj4KICAgICAgPGRpdiBpZD0ibWFpbkNvbnRhaW5lciIgY2xhc3MkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3BhcGVyLWhlYWRlci1wYW5lbC9wYXBlci1oZWFkZXItcGFuZWwuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT17c2Nyb2xsOiEwfSxjPXtzdGFuZGFyZDoyLHdhdGVyZmFsbDoxLCJ3YXRlcmZhbGwtdGFsbCI6MX0sZD17IndhdGVyZmFsbC10YWxsIjohMH07UG9seW1lcih7aXM6InBhcGVyLWhlYWRlci1wYW5lbCIscHJvcGVydGllczp7bW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixvYnNlcnZlcjoiX21vZGVDaGFuZ2VkIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHNoYWRvdzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx0YWxsQ2xhc3M6e3R5cGU6U3RyaW5nLHZhbHVlOiJ0YWxsIn0sYXRUb3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb2JzZXJ2ZXJzOlsiX2NvbXB1dGVEcm9wU2hhZG93SGlkZGVuKGF0VG9wLCBtb2RlLCBzaGFkb3cpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hZGRMaXN0ZW5lcigpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKCl9LApyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsSGFuZGxlcj10aGlzLl9zY3JvbGwuYmluZCh0aGlzKTtjb25zb2xlLndhcm4odGhpcy5pcywiaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBhcHAtbGF5b3V0IGluc3RlYWQhIil9LGdldCBoZWFkZXIoKXtyZXR1cm4gUG9seW1lci5kb20odGhpcy4kLmhlYWRlclNsb3QpLmdldERpc3RyaWJ1dGVkTm9kZXMoKVswXX0sZ2V0IHNjcm9sbGVyKCl7cmV0dXJuIHRoaXMuX2dldFNjcm9sbGVyRm9yTW9kZSh0aGlzLm1vZGUpfSxnZXQgdmlzaWJsZVNoYWRvdygpe3JldHVybiB0aGlzLiQuZHJvcFNoYWRvdy5jbGFzc0xpc3QuY29udGFpbnMoImhhcy1zaGFkb3ciKX0sX2NvbXB1dGVEcm9wU2hhZG93SGlkZGVuOmZ1bmN0aW9uKGYsZyl7Zz1jW2ddO3RoaXMuc2hhZG93P3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToyPT09Zz90aGlzLnRvZ2dsZUNsYXNzKCJoYXMtc2hhZG93IiwhMCx0aGlzLiQuZHJvcFNoYWRvdyk6CjEhPT1nfHxmP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCExLHRoaXMuJC5kcm9wU2hhZG93KTp0aGlzLnRvZ2dsZUNsYXNzKCJoYXMtc2hhZG93IiwhMCx0aGlzLiQuZHJvcFNoYWRvdyl9LF9jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKGYpe3ZhciBnPXt9O2cuZmxleD0iY292ZXIiIT09ZjtyZXR1cm4gT2JqZWN0LmtleXMoZykuZmlsdGVyKGZ1bmN0aW9uKGwpe3JldHVybiBnW2xdfSkuam9pbigiICIpfSxfYWRkTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxlci5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuc2Nyb2xsSGFuZGxlcil9LF9tb2RlQ2hhbmdlZDpmdW5jdGlvbihmLGcpe3ZhciBsPXRoaXMuaGVhZGVyO2wmJihkW2ddJiYhZFtmXT8obC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMudGFsbENsYXNzKSwKdGhpcy5hc3luYyhmdW5jdGlvbigpe2wuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0ZSIpfSwyMDApKTp0aGlzLnRvZ2dsZUNsYXNzKCJhbmltYXRlIixkW2ZdLGwpKTt0aGlzLl9rZWVwU2Nyb2xsaW5nU3RhdGUoKX0sX2tlZXBTY3JvbGxpbmdTdGF0ZTpmdW5jdGlvbigpe3ZhciBmPXRoaXMuc2Nyb2xsZXIsZz10aGlzLmhlYWRlcjt0aGlzLl9zZXRBdFRvcCgwPT09Zi5zY3JvbGxUb3ApO2cmJnRoaXMudGFsbENsYXNzJiZkW3RoaXMubW9kZV0mJnRoaXMudG9nZ2xlQ2xhc3ModGhpcy50YWxsQ2xhc3MsdGhpcy5hdFRvcHx8Zy5jbGFzc0xpc3QuY29udGFpbnModGhpcy50YWxsQ2xhc3MpJiZmLnNjcm9sbEhlaWdodDx0aGlzLm9mZnNldEhlaWdodCxnKX0sX3Njcm9sbDpmdW5jdGlvbigpe3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpO3RoaXMuZmlyZSgiY29udGVudC1zY3JvbGwiLHt0YXJnZXQ6dGhpcy5zY3JvbGxlcn0se2J1YmJsZXM6ITF9KX0sX2dldFNjcm9sbGVyRm9yTW9kZTpmdW5jdGlvbihmKXtyZXR1cm4gYVtmXT8KdGhpczp0aGlzLiQubWFpbkNvbnRhaW5lcn19KX0pKCk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRvb2xiYXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodDogdmFyKC0tcGFwZXItdG9vbGJhci1oZWlnaHQsIDY0cHgpOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodDogdmFyKC0tcGFwZXItdG9vbGJhci1zbS1oZWlnaHQsIDU2cHgpOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXRvb2xiYXItYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b29sYmFyLWNvbG9yLCB2YXIoLS1kYXJrLXRoZW1lLXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyOwogICAgICB9CgogICAgICA6aG9zdCguYW5pbWF0ZSkgewogICAgICAgIHRyYW5zaXRpb246IHZhcigtLXBhcGVyLXRvb2xiYXItdHJhbnNpdGlvbiwgaGVpZ2h0IDAuMThzIGVhc2UtaW4pOwogICAgICB9CgogICAgICA6aG9zdCgubWVkaXVtLXRhbGwpIHsKICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCkgKiAyKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLW1lZGl1bTsKICAgICAgfQoKICAgICAgOmhvc3QoLnRhbGwpIHsKICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCkgKiAzKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLXRhbGw7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIFRPRE86IFdoZXJlIHNob3VsZCBtZWRpYSBxdWVyeSBicmVha3BvaW50cyBsaXZlIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGVsZW1lbnRzPwogICAgICAgKi8KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQoKICAgICAgICA6aG9zdCgubWVkaXVtLXRhbGwpIHsKICAgICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KSAqIDIpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLnRhbGwpIHsKICAgICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KSAqIDMpOwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItdG9vbHMgewogICAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICN0b3BCYXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLyogbWlkZGxlIGJhciAqLwogICAgICAjbWlkZGxlQmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSAjbWlkZGxlQmFyLAogICAgICA6aG9zdCgubWVkaXVtLXRhbGwpICNtaWRkbGVCYXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMCUpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgfQoKICAgICAgLyogYm90dG9tIGJhciAqLwogICAgICAjYm90dG9tQmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1ha2UgZWxlbWVudHMgKGUuZy4gYnV0dG9ucykgcmVzcG9uZCB0byBtb3VzZS90b3VjaCBldmVudHMKICAgICAgICoKICAgICAgICogYC50b29sYmFyLXRvb2xzYCBkaXNhYmxlcyB0b3VjaCBldmVudHMgc28gbXVsdGlwbGUgdG9vbGJhcnMgY2FuIHN0YWNrIGFuZCBub3QKICAgICAgICogYWJzb3JiIGV2ZW50cy4gQWxsIGNoaWxkcmVuIG11c3QgaGF2ZSBwb2ludGVyIGV2ZW50cyByZS1lbmFibGVkIHRvIHdvcmsgYXMKICAgICAgICogZXhwZWN0ZWQuCiAgICAgICAqLwogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgqOm5vdChbZGlzYWJsZWRdKSkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgudGl0bGUpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDU2cHg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKHBhcGVyLWljb24tYnV0dG9uICsgLnRpdGxlKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBUaGUgLS1wYXBlci10b29sYmFyLXRpdGxlIG1peGluIGlzIGFwcGxpZWQgaGVyZSBpbnN0ZWFkIG9mIGFib3ZlIHRvCiAgICAgICAqIGZpeCB0aGUgaXNzdWUgd2l0aCBtYXJnaW4tbGVmdCBiZWluZyBpZ25vcmVkIGR1ZSB0byBjc3Mgb3JkZXJpbmcuCiAgICAgICAqLwogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgudGl0bGUpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLXRpdGxlOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbltpY29uPW1lbnVdKSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyNHB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCguZml0KSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogYXV0bzsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC8qIFRPRE8obm9tcyk6IFVudGlsIHdlIGhhdmUgYSBiZXR0ZXIgc29sdXRpb24gZm9yIGNsYXNzZXMgdGhhdCBkb24ndCB1c2UKICAgICAgICogL2RlZXAvIGNyZWF0ZSBvdXIgb3duLgogICAgICAgKi8KICAgICAgLnN0YXJ0LWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmNlbnRlci1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICB9CgogICAgICAuZW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtYXJvdW5kLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWp1c3RpZmllZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b3BCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKGp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJ0b3AiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9Im1pZGRsZUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMobWlkZGxlSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9Im1pZGRsZSI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iYm90dG9tQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3Nlcyhib3R0b21KdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0iYm90dG9tIj48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vcGFwZXItdG9vbGJhci9wYXBlci10b29sYmFyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRvb2xiYXIiLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0b29sYmFyIn0scHJvcGVydGllczp7Ym90dG9tSnVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxtaWRkbGVKdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn19LHJlYWR5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKHRoaXMuaXMsImlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYXBwLWxheW91dCBpbnN0ZWFkISIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmUodGhpcyk7dGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpfSxfb2JzZXJ2ZTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCl9LmJpbmQodGhpcykpOwpjLm9ic2VydmUoYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KTtyZXR1cm4gY30sX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5OmZ1bmN0aW9uKCl7UG9seW1lci5kb20uZmx1c2goKTtmb3IodmFyIGE9W10sYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoInNsb3QiKSkuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiY29udGVudCIpKSksZCxmPTA7ZD1jW2ZdO2YrKyl7ZD1Qb2x5bWVyLmRvbShkKS5nZXREaXN0cmlidXRlZE5vZGVzKCk7Zm9yKHZhciBnLGw9MDtnPWRbbF07bCsrKWlmKGcuY2xhc3NMaXN0JiZnLmNsYXNzTGlzdC5jb250YWlucygidGl0bGUiKSlpZihnLmlkKWEucHVzaChnLmlkKTtlbHNle3ZhciBrPSJwYXBlci10b29sYmFyLWxhYmVsLSIrTWF0aC5mbG9vcigxRTQqTWF0aC5yYW5kb20oKSk7Zy5pZD1rO2EucHVzaChrKX19MDwKYS5sZW5ndGgmJnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGEuam9pbigiICIpKX0sX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/YSsoImp1c3RpZmllZCI9PT1hPyIiOiItanVzdGlmaWVkIik6IiJ9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250cm9sLXBhbmVsIj4KICAgICAgCiAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJDb2xvciBieSIgaWQ9ImNvbG9yQnlEcm9wRG93bk1lbnUiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tvcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleH19IiBpZD0iY29sb3JCeUxpc3RCb3giPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tvcHRpb25zLmNvbHVtbnNdXSIgYXM9ImNvbHVtbiIgaWQ9ImNvbG9yQnlDb2x1bW5UZW1wbGF0ZSI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIGRpc2FibGVkPSJbWyFfaXNOdW1lcmljQ29sdW1uKGNvbHVtbi5pbmRleCldXSI+CiAgICAgICAgICAgICAgW1tjb2x1bW4ubmFtZV1dCiAgICAgICAgICAgIDwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iY29sdW1ucy1jb250YWluZXIiPgogICAgICAgIAogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7b3B0aW9ucy5jb2x1bW5zfX0iIGFzPSJjb2x1bW4iPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc051bWVyaWNDb2x1bW4oY29sdW1uLmluZGV4KV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sdW1uIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4tdGl0bGUiPgogICAgICAgICAgICAgICAgW1tjb2x1bW4ubmFtZV1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBjbGFzcz0ic2NhbGUtcmFkaW8tZ3JvdXAiIHNlbGVjdGVkPSJ7e2NvbHVtbi5zY2FsZX19Ij4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJMSU5FQVIiPgogICAgICAgICAgICAgICAgICAgIExpbmVhcgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImxvZ1NjYWxlQnV0dG9uX1tbY29sdW1uLm5hbWVdXSIgbmFtZT0iTE9HIiBkaXNhYmxlZD0iW1shX2FsbG93TG9nU2NhbGUoY29sdW1uLCBzZXNzaW9uR3JvdXBzLiopXV0iPgogICAgICAgICAgICAgICAgICAgIExvZ2FyaXRobWljCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IlFVQU5USUxFIj4KICAgICAgICAgICAgICAgICAgICBRdWFudGlsZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5jb250cm9sLXBhbmVsIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQogICAgICAuY29sdW1uIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggZGFya2dyYXk7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICB9CiAgICAgIC5jb2x1bW4tdGl0bGUgewogICAgICAgIC8qIEZpdCBldmVyeSB0aXRsZSBpbiBvbmUgbGluZSBzbyB0aGUgcmFkaW8gYm94ZXMgYWxpZ24gdmVydGljYWxseS4gKi8KICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CiAgICAgIC5jb2x1bW5zLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CiAgICAgIC5zY2FsZS1yYWRpby1ncm91cCBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICBwYXBlci1saXN0Ym94IHsKICAgICAgICBtYXgtaGVpZ2h0OiAxNWVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scy90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyIscHJvcGVydGllczp7Y29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxvcHRpb25zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9jb25maWd1cmF0aW9uQ2hhbmdlZChjb25maWd1cmF0aW9uLiopIiwiX3Vuc2VsZWN0RGlzYWJsZWRMb2dTY2FsZXMoc2Vzc2lvbkdyb3Vwcy4qKSJdLF9jb25maWd1cmF0aW9uQ2hhbmdlZCgpe2NvbnN0IGE9dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsYz10aGlzLmNvbmZpZ3VyYXRpb24uc2NoZW1hLGQ9e2NvbHVtbnM6YS5ocGFyYW1JbmZvcy5tYXAoKGYsZyk9Pih7bmFtZTp0Zi5ocGFyYW1zLnV0aWxzLmhwYXJhbU5hbWUoZiksaW5kZXg6ZyxhYnNvbHV0ZUluZGV4OnRmLmhwYXJhbXMudXRpbHMuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleChjLGEsZyksc2NhbGU6dGhpcy5faXNOdW1lcmljQ29sdW1uKGcpPwoiTElORUFSIjoiTk9OX05VTUVSSUMifSkpLmNvbmNhdChhLm1ldHJpY0luZm9zLm1hcCgoZixnKT0+e2crPWEuaHBhcmFtSW5mb3MubGVuZ3RoO3JldHVybntzY2FsZToiTElORUFSIixuYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZShmKSxpbmRleDpnLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGMsYSxnKX19KSksbWluQ29sb3I6IiMwMDAwRkYiLG1heENvbG9yOiIjRkYwMDAwIixjb25maWd1cmF0aW9uOnRoaXMuY29uZmlndXJhdGlvbn07dGhpcy5zZXQoIm9wdGlvbnMiLGQpO1BvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5zZXQoIm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4Iix0aGlzLl9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCkpfSxfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcygpe251bGwhPT10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYT0+e2NvbnN0IGM9Im9wdGlvbnMuY29sdW1ucy4iKwphLmluZGV4O3RoaXMuX2FsbG93TG9nU2NhbGUoYSl8fCJMT0ciIT09YS5zY2FsZXx8dGhpcy5zZXQoYysiLnNjYWxlIiwiTElORUFSIil9KX0sX2FsbG93TG9nU2NhbGUoYSl7aWYoIXRoaXMuX2lzTnVtZXJpY0NvbHVtbihhLmluZGV4KXx8IXRoaXMuc2Vzc2lvbkdyb3VwcylyZXR1cm4hMTtjb25zdCBbYyxkXT10Zi5ocGFyYW1zLnV0aWxzLnZpc2libGVOdW1lcmljQ29sdW1uRXh0ZW50KHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLHRoaXMuc2Vzc2lvbkdyb3VwcyxhLmluZGV4KTtyZXR1cm4gMDxjfHwwPmR9LF9pc051bWVyaWNDb2x1bW4oYSl7cmV0dXJuIGE+PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aHx8IkRBVEFfVFlQRV9GTE9BVDY0Ij09PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zW2FdLnR5cGV9LF9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCl7aWYoMDx0aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGgpcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aDsKY29uc3QgYT10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5maW5kSW5kZXgoYz0+IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWMudHlwZSk7aWYoLTEhPT1hKXJldHVybiBhfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3dbYWN0aXZlXSAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktcm93LWFjdGl2ZS1jZWxsKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmVJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LGxpc3RlbmVyczp7ImNlbGwtYWN0aXZhdGUiOiJfYWN0aXZhdGVJdGVtIn0sb2JzZXJ2ZXJzOlsiX2FjdGl2ZUl0ZW1DaGFuZ2VkKGFjdGl2ZUl0ZW0pIl0sX2FjdGl2YXRlSXRlbTpmdW5jdGlvbihhKXt2YXIgYz1hLmRldGFpbC5tb2RlbC5pdGVtO3RoaXMuYWN0aXZlSXRlbT10aGlzLmFjdGl2ZUl0ZW0hPT1jP2M6bnVsbDthLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxfYWN0aXZlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMuX3VwZGF0ZUl0ZW0oYSxhLml0ZW0pfS5iaW5kKHRoaXMpKX19Owo8L3NjcmlwdD4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXNjcm9sbC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI3RhYmxlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIHotaW5kZXg6IC0yOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtpb3NdICN0YWJsZSB7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gI3RhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdmFhZGluLWdyaWQtdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgewogICAgICAgIHotaW5kZXg6IC0xOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gewogICAgICAgIC8qIEFueSB2YWx1ZSBvdGhlciB0aGFuIOKAmG5vbmXigJkgZm9yIHRoZSB0cmFuc2Zvcm0gcmVzdWx0cyBpbiB0aGUgY3JlYXRpb24gb2YgYm90aCBhIHN0YWNraW5nIGNvbnRleHQgYW5kCiAgICAgICAgYSBjb250YWluaW5nIGJsb2NrLiBUaGUgb2JqZWN0IGFjdHMgYXMgYSBjb250YWluaW5nIGJsb2NrIGZvciBmaXhlZCBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzLiAqLwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2ZpeGVkLXNlY3Rpb25zXSB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5I2l0ZW1zIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtc2Nyb2xsLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlU2Nyb2xsQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntfdmlkeE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saW9zOnt0eXBlOkJvb2xlYW4sdmFsdWU6bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpob25lfGFkOyg/OiBVOyk/IENQVSkgT1MgKFxkKykvKSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGZpeGVkU2VjdGlvbnM6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsY29tcHV0ZWQ6Il9oYXNGaXhlZFNlY3Rpb25zKHNjcm9sbGJhcldpZHRoKSJ9LF9mcm96ZW5DZWxsczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sc2Nyb2xsaW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbFRhcmdldD10aGlzLiQudGFibGV9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5saXN0ZW4odGhpcy5zY3JvbGxUYXJnZXQsIndoZWVsIiwKIl9vbldoZWVsIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLnNjcm9sbFRhcmdldCwid2hlZWwiLCJfb25XaGVlbCIpfSxzY3JvbGxUb1NjYWxlZEluZGV4OmZ1bmN0aW9uKGEpe3RoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4PW51bGw7dGhpcy4kLml0ZW1zLnN0eWxlLmJvcmRlclRvcFdpZHRofHwodGhpcy5fcGVuZGluZ1Njcm9sbFRvU2NhbGVkSW5kZXg9YSk7YT1NYXRoLm1pbihNYXRoLm1heChhLDApLHRoaXMuc2l6ZS0xKTt0aGlzLiQudGFibGUuc2Nyb2xsVG9wPWEvdGhpcy5zaXplKnRoaXMuJC50YWJsZS5zY3JvbGxIZWlnaHQ7dGhpcy5fc2Nyb2xsSGFuZGxlcigpO3RoaXMuc2Nyb2xsVG9JbmRleChhLXRoaXMuX3ZpZHhPZmZzZXQpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fc2Nyb2xsUG9zaXRpb24pO3RoaXMuX3Njcm9sbEhhbmRsZXIoKTt0aGlzLl92aWR4T2Zmc2V0K3RoaXMubGFzdFZpc2libGVJbmRleD09PXRoaXMuc2l6ZS0KMSYmKHRoaXMuJC50YWJsZS5zY3JvbGxUb3A9dGhpcy4kLnRhYmxlLnNjcm9sbEhlaWdodC10aGlzLiQudGFibGUub2Zmc2V0SGVpZ2h0LHRoaXMuX3Njcm9sbEhhbmRsZXIoKSl9LF9oYXNGaXhlZFNlY3Rpb25zOmZ1bmN0aW9uKGEpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9FZGdlLykmJjA9PT1hfSxfb25XaGVlbDpmdW5jdGlvbihhKXtpZighYS5jdHJsS2V5JiYhdGhpcy5faGFzU2Nyb2xsZWRBbmNlc3RvcihhLnRhcmdldCxhLmRlbHRhWCxhLmRlbHRhWSkpe3ZhciBjPXRoaXMuJC50YWJsZSxkPWEuZGVsdGFZOzE9PT1hLmRlbHRhTW9kZSYmKGQqPWdyaWQuJC5zY3JvbGxlci5fcGh5c2ljYWxBdmVyYWdlKTt2YXIgZj1NYXRoLmFicyhhLmRlbHRhWCkrTWF0aC5hYnMoZCk7dGhpcy5fY2FuU2Nyb2xsKGMsYS5kZWx0YVgsZCk/KGEucHJldmVudERlZmF1bHQoKSxjLnNjcm9sbFRvcCs9ZCxjLnNjcm9sbExlZnQrPWEuZGVsdGFYLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSwKdGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMCx0aGlzLl9pZ25vcmVOZXdXaGVlbD10aGlzLmRlYm91bmNlKCJpZ25vcmUtbmV3LXdoZWVsIixmdW5jdGlvbigpe3RoaXMuX2lnbm9yZU5ld1doZWVsPW51bGx9LDUwMCkpOnRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW0mJmY8PXRoaXMuX3ByZXZpb3VzTW9tZW50dW18fHRoaXMuX2lnbm9yZU5ld1doZWVsP2EucHJldmVudERlZmF1bHQoKTpmPnRoaXMuX3ByZXZpb3VzTW9tZW50dW0mJih0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtPSExKTt0aGlzLl9wcmV2aW91c01vbWVudHVtPWZ9fSxfaGFzU2Nyb2xsZWRBbmNlc3RvcjpmdW5jdGlvbihhLGMsZCl7aWYodGhpcy5fY2FuU2Nyb2xsKGEsYyxkKSlyZXR1cm4hMDtpZigidmFhZGluLWdyaWQtY2VsbC1jb250ZW50IiE9PWEubG9jYWxOYW1lJiZhIT09dGhpcyYmYS5wYXJlbnRFbGVtZW50KXJldHVybiB0aGlzLl9oYXNTY3JvbGxlZEFuY2VzdG9yKGEucGFyZW50RWxlbWVudCxjLGQpfSwKX2NhblNjcm9sbDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIDA8ZCYmYS5zY3JvbGxUb3A8YS5zY3JvbGxIZWlnaHQtYS5vZmZzZXRIZWlnaHR8fDA+ZCYmMDxhLnNjcm9sbFRvcHx8MDxjJiZhLnNjcm9sbExlZnQ8YS5zY3JvbGxXaWR0aC1hLm9mZnNldFdpZHRofHwwPmMmJjA8YS5zY3JvbGxMZWZ0fSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe3ZhciBhPU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5fbWF4U2Nyb2xsVG9wLHRoaXMuX3Njcm9sbFRvcCkpLGM9YS10aGlzLl9zY3JvbGxQb3NpdGlvbixkPXRoaXMuX3JhdGlvLGY9MCxnPXRoaXMuX2hpZGRlbkNvbnRlbnRTaXplLGw9ZCxrPVtdO3RoaXMuX3Njcm9sbFBvc2l0aW9uPWE7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO3ZhciBtPXRoaXMuX3Njcm9sbEJvdHRvbTt2YXIgcD10aGlzLl9waHlzaWNhbEJvdHRvbTtpZihNYXRoLmFicyhjKT50aGlzLl9waHlzaWNhbFNpemUpdGhpcy5fcGh5c2ljYWxUb3ArPQpjLGY9TWF0aC5yb3VuZChjL3RoaXMuX3BoeXNpY2FsQXZlcmFnZSk7ZWxzZSBpZigwPmMpe3ZhciBxPWEtdGhpcy5fcGh5c2ljYWxUb3A7az10aGlzLl92aXJ0dWFsU3RhcnQ7dmFyIHI9W107dmFyIHQ9dGhpcy5fcGh5c2ljYWxFbmQ7Zm9yKGw9cS9nO2w8ZCYmZjx0aGlzLl9waHlzaWNhbENvdW50JiYwPGstZiYmcC10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodCk+bTspcT10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodCksbCs9cS9nLHAtPXEsci5wdXNoKHQpLGYrKyx0PTA9PT10P3RoaXMuX3BoeXNpY2FsQ291bnQtMTp0LTE7az1yO2Y9LWZ9ZWxzZSBpZigwPGMpe3ZhciB2PXRoaXMuX3ZpcnR1YWxFbmQsQT10aGlzLl92aXJ0dWFsQ291bnQtMTtyPVtdO3Q9dGhpcy5fcGh5c2ljYWxTdGFydDtmb3IobD0ocC1tKS9nO2w8ZCYmZjx0aGlzLl9waHlzaWNhbENvdW50JiZ2K2Y8QSYmdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHQpPAphOylxPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh0KSxsKz1xL2csdGhpcy5fcGh5c2ljYWxUb3ArPXEsci5wdXNoKHQpLGYrKyx0PSh0KzEpJXRoaXMuX3BoeXNpY2FsQ291bnR9dGhpcy5fdmlydHVhbENvdW50PHRoaXMuc2l6ZSYmdGhpcy5fYWRqdXN0VmlydHVhbEluZGV4T2Zmc2V0KGMpOzA9PT1mPyhwPG18fHRoaXMuX3BoeXNpY2FsVG9wPmEpJiZ0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgpOih0aGlzLl92aXJ0dWFsU3RhcnQrPWYsdGhpcy5fcGh5c2ljYWxTdGFydCs9Zix0aGlzLl91cGRhdGUocixrKSk7dGhpcy5fdHJhbnNsYXRlU3RhdGlvbmFyeUVsZW1lbnRzKCk7dGhpcy5oYXNBdHRyaWJ1dGUoInJlb3JkZXJpbmciKXx8KHRoaXMuc2Nyb2xsaW5nPSEwKTt0aGlzLmRlYm91bmNlKCJ2YWFkaW4tZ3JpZC1zY3JvbGxpbmciLGZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxpbmc9ITE7dGhpcy5fcmVvcmRlclJvd3MoKX0sMTAwKX0sX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldDpmdW5jdGlvbihhKXtpZigxRTQ8Ck1hdGguYWJzKGEpKXRoaXMuX25vU2NhbGU/dGhpcy5fbm9TY2FsZT0hMTooYT1NYXRoLnJvdW5kKHRoaXMuX3Njcm9sbFBvc2l0aW9uL3RoaXMuX3Njcm9sbEhlaWdodCoxRTMpLzFFMyx0aGlzLl92aWR4T2Zmc2V0PU1hdGgucm91bmQoYSp0aGlzLnNpemUtYSp0aGlzLl92aXJ0dWFsQ291bnQpLDA9PT10aGlzLl9zY3JvbGxUb3AmJnRoaXMuc2Nyb2xsVG9JbmRleCgwKSk7ZWxzZXthPXRoaXMuX3ZpZHhPZmZzZXR8fDA7MD09PXRoaXMuX3Njcm9sbFRvcD8odGhpcy5fdmlkeE9mZnNldD0wLGEhPT10aGlzLl92aWR4T2Zmc2V0JiZ0aGlzLnNjcm9sbFRvSW5kZXgoMCkpOjFFMz50aGlzLmZpcnN0VmlzaWJsZUluZGV4JiYwPHRoaXMuX3ZpZHhPZmZzZXQmJih0aGlzLl92aWR4T2Zmc2V0LT1NYXRoLm1pbih0aGlzLl92aWR4T2Zmc2V0LDEwMCksdGhpcy5zY3JvbGxUb0luZGV4KHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrKGEtdGhpcy5fdmlkeE9mZnNldCkrMSksdGhpcy5fbm9TY2FsZT0KITApO3ZhciBjPXRoaXMuc2l6ZS10aGlzLl92aXJ0dWFsQ291bnQ7dGhpcy5fc2Nyb2xsVG9wPj10aGlzLl9tYXhTY3JvbGxUb3A/KHRoaXMuX3ZpZHhPZmZzZXQ9YyxhIT09dGhpcy5fdmlkeE9mZnNldCYmdGhpcy5zY3JvbGxUb0luZGV4KHRoaXMuX3ZpcnR1YWxDb3VudCkpOnRoaXMuZmlyc3RWaXNpYmxlSW5kZXg+dGhpcy5fdmlydHVhbENvdW50LTFFMyYmdGhpcy5fdmlkeE9mZnNldDxjJiYodGhpcy5fdmlkeE9mZnNldCs9TWF0aC5taW4oYy10aGlzLl92aWR4T2Zmc2V0LDEwMCksdGhpcy5zY3JvbGxUb0luZGV4KHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgtKHRoaXMuX3ZpZHhPZmZzZXQtYSkpLHRoaXMuX25vU2NhbGU9ITApfX0sX3Jlb3JkZXJSb3dzOmZ1bmN0aW9uKCl7dmFyIGE9UG9seW1lci5kb20odGhpcy4kLml0ZW1zKSxjPWEucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdyIpLGQ9Yy5sZW5ndGgtKGNbMF0uaW5kZXgtKHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl92aWR4T2Zmc2V0KSk7CmlmKGQ8Yy5sZW5ndGgvMilmb3IodmFyIGY9MDtmPGQ7ZisrKWEuYXBwZW5kQ2hpbGQoY1tmXSk7ZWxzZSBmb3IoO2Q8Yy5sZW5ndGg7ZCsrKWEuaW5zZXJ0QmVmb3JlKGNbZF0sY1swXSl9LF9mcm96ZW5DZWxsc0NoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRlYm91bmNlKCJjYWNoZS1lbGVtZW50cyIsZnVuY3Rpb24oKXtQb2x5bWVyLmRvbSh0aGlzLmRvbUhvc3Qucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLWNlbGwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Euc3R5bGUudHJhbnNmb3JtPSIifSk7dGhpcy5fZnJvemVuQ2VsbHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5kb21Ib3N0LnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoIltmcm96ZW5dIikpO3RoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpfSk7dGhpcy5fdXBkYXRlTGFzdEZyb3plbigpfSxfdXBkYXRlTGFzdEZyb3plbjpmdW5jdGlvbigpe2lmKHRoaXMuY29sdW1uVHJlZSl7dmFyIGE9CnRoaXMuY29sdW1uVHJlZVt0aGlzLmNvbHVtblRyZWUubGVuZ3RoLTFdLnNsaWNlKDApO2Euc29ydChmdW5jdGlvbihkLGYpe3JldHVybiBkLl9vcmRlci1mLl9vcmRlcn0pO3ZhciBjPWEucmVkdWNlKGZ1bmN0aW9uKGQsZixnKXtmLl9sYXN0RnJvemVuPSExO3JldHVybiBmLmZyb3plbiYmIWYuaGlkZGVuP2c6ZH0sdm9pZCAwKTt2b2lkIDAhPT1jJiYoYVtjXS5fbGFzdEZyb3plbj0hMCl9fSxfdHJhbnNsYXRlU3RhdGlvbmFyeUVsZW1lbnRzOmZ1bmN0aW9uKCl7dGhpcy5maXhlZFNlY3Rpb25zPyh0aGlzLiQuaXRlbXMuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgtdGhpcy5fc2Nyb2xsTGVmdHx8MCwtdGhpcy5fc2Nyb2xsVG9wfHwwKSx0aGlzLiQuZm9vdGVyLnN0eWxlLnRyYW5zZm9ybT10aGlzLiQuaGVhZGVyLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXRoaXMuX3Njcm9sbExlZnR8fDAsMCkpOnRoaXMuJC5mb290ZXIuc3R5bGUudHJhbnNmb3JtPQp0aGlzLiQuaGVhZGVyLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoMCx0aGlzLl9zY3JvbGxUb3ApO2Zvcih2YXIgYT10aGlzLl9nZXRUcmFuc2xhdGUodGhpcy5fc2Nyb2xsTGVmdCwwKSxjPTA7Yzx0aGlzLl9mcm96ZW5DZWxscy5sZW5ndGg7YysrKXRoaXMuX2Zyb3plbkNlbGxzW2NdLnN0eWxlLnRyYW5zZm9ybT1hfSxfZ2V0VHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuInRyYW5zbGF0ZSgiK2ErInB4LCIrYysicHgpIn19O3ZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlU2Nyb2xsQmVoYXZpb3I9W1BvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlU2Nyb2xsQmVoYXZpb3JJbXBsXTsKPC9zY3JpcHQ+CgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY2VsbC1jbGljay1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcj17bGlzdGVuZXJzOntjbGljazoiX29uQ2xpY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGEpe2EudGFyZ2V0IT09dGhpcy5fY2VsbENvbnRlbnQmJnRoaXMuZmlyZSgiY2VsbC1jb250ZW50LWZvY3VzIix7Y2VsbDp0aGlzfSl9LmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fY2VsbENvbnRlbnRGb2N1c0hhbmRsZXIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyLCEwKX0sX29uQ2xpY2s6ZnVuY3Rpb24oYSl7InZhYWRpbi1ncmlkLXNvcnRlciIhPT10aGlzLmxvY2FsTmFtZSYmdGhpcy5maXJlKCJjZWxsLWZvY3VzIix7Y2VsbDp0aGlzfSk7aWYodGhpcy5fY2VsbENsaWNrKXt2YXIgYz1Qb2x5bWVyLmRvbShhKS5sb2NhbFRhcmdldDsKYy5nZXREaXN0cmlidXRlZE5vZGVzJiYoYz1Qb2x5bWVyLmRvbShjKS5nZXREaXN0cmlidXRlZE5vZGVzKClbMF0pO3ZhciBkPVBvbHltZXIuZG9tKGEpLnBhdGg7ZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkLDAsZC5pbmRleE9mKGMpKzEpO2MuY29udGFpbnModGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LnJvb3QuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl8fGQuc29tZSh0aGlzLl9pc0ZvY3VzYWJsZSl8fHRoaXMuX2NlbGxDbGljayhhKX19LF9pc0ZvY3VzYWJsZTpmdW5jdGlvbihhKXt2YXIgYz1Qb2x5bWVyLmRvbShhKS5wYXJlbnROb2RlO2M9LTEhPT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGMpLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0YWJpbmRleF0sIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIG9iamVjdCwgaWZyYW1lLCBsYWJlbCwgYVtocmVmXSwgYXJlYVtocmVmXSIpLGEpO3JldHVybiFhLmRpc2FibGVkJiYKY319Owo8L3NjcmlwdD4KCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtY2VsbCI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIj48L2RvbS1tb2R1bGU+Cjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIj48L2RvbS1tb2R1bGU+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtY2VsbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBhPXtwcm9wZXJ0aWVzOntjb2x1bW46T2JqZWN0LGV4cGFuZGVkOkJvb2xlYW4sZmxleEdyb3c6TnVtYmVyLGNvbFNwYW46TnVtYmVyLGZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGZyb3plbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saGlkZGVuOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxpbnN0YW5jZTpPYmplY3QsaW5kZXg6TnVtYmVyLGl0ZW06T2JqZWN0LHNlbGVjdGVkOkJvb2xlYW4sdGVtcGxhdGU6T2JqZWN0LHRhcmdldDpPYmplY3Qsd2lkdGg6U3RyaW5nLG9yZGVyOk51bWJlcixyZW9yZGVyU3RhdHVzOnt0eXBlOlN0cmluZyxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9jaGlsZENvbHVtbnM6QXJyYXksX2NlbGxDb250ZW50Ok9iamVjdCxfaW5zZXJ0aW9uUG9pbnQ6T2JqZWN0LApfdGVtcGxhdGl6ZXI6T2JqZWN0fSxvYnNlcnZlcnM6Il9jb2x1bW5DaGFuZ2VkKGNvbHVtbik7X2NlbGxBdHRhY2hlZChjb2x1bW4sIGlzQXR0YWNoZWQpO19leHBhbmRlZENoYW5nZWQoZXhwYW5kZWQsIGluc3RhbmNlKTtfZmxleEdyb3dDaGFuZ2VkKGZsZXhHcm93KTtfaW5kZXhDaGFuZ2VkKGluZGV4LCBpbnN0YW5jZSk7X2l0ZW1DaGFuZ2VkKGl0ZW0sIGluc3RhbmNlKTtfaW5zdGFuY2VDaGFuZ2VkKGluc3RhbmNlLCB0YXJnZXQpO19zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQsIGluc3RhbmNlKTtfdG9nZ2xlQ29udGVudChpc0F0dGFjaGVkLCBfY2VsbENvbnRlbnQsIF9pbnNlcnRpb25Qb2ludCk7X3RvZ2dsZUluc3RhbmNlKGlzQXR0YWNoZWQsIF90ZW1wbGF0aXplciwgaW5zdGFuY2UpO193aWR0aENoYW5nZWQod2lkdGgpO19vcmRlckNoYW5nZWQob3JkZXIpO192aXNpYmxlQ2hpbGRDb2x1bW5zQ2hhbmdlZChfdmlzaWJsZUNoaWxkQ29sdW1ucyk7X2NoaWxkQ29sdW1uc0NoYW5nZWQoX2NoaWxkQ29sdW1ucykiLnNwbGl0KCI7IiksCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZC1jZWxsIik7ITE9PT1Qb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyYmKHRoaXMuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSx0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkIikpfSxfY29sdW1uQ2hhbmdlZDpmdW5jdGlvbihjKXt0aGlzLmZsZXhHcm93PWMuZmxleEdyb3c7dGhpcy5mcm96ZW49Yy5mcm96ZW47dGhpcy5sYXN0RnJvemVuPWMuX2xhc3RGcm96ZW47dGhpcy5oZWFkZXJUZW1wbGF0ZT1jLmhlYWRlclRlbXBsYXRlO3RoaXMuZm9vdGVyVGVtcGxhdGU9Yy5mb290ZXJUZW1wbGF0ZTt0aGlzLnRlbXBsYXRlPWMudGVtcGxhdGU7dGhpcy53aWR0aD1jLndpZHRoO3RoaXMuaGlkZGVuPWMuaGlkZGVuO3RoaXMucmVzaXphYmxlPWMucmVzaXphYmxlO3RoaXMuX2NoaWxkQ29sdW1ucz1jLl9jaGlsZENvbHVtbnM7dGhpcy5vcmRlcj1jLl9vcmRlcjtjLmNvbFNwYW4mJih0aGlzLmNvbFNwYW49CmMuY29sU3Bhbik7dGhpcy5saXN0ZW4oYywicHJvcGVydHktY2hhbmdlZCIsIl9jb2x1bW5Qcm9wQ2hhbmdlZCIpfSxfY2VsbEF0dGFjaGVkOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmKGQ/dGhpcy5saXN0ZW4oYywicHJvcGVydHktY2hhbmdlZCIsIl9jb2x1bW5Qcm9wQ2hhbmdlZCIpOnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWR8fHRoaXMudW5saXN0ZW4oYywicHJvcGVydHktY2hhbmdlZCIsIl9jb2x1bW5Qcm9wQ2hhbmdlZCIpfSkpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYyl7Yy50YXJnZXQ9PXRoaXMuY29sdW1uJiYodGhpc1tjLmRldGFpbC5wYXRoXT1jLmRldGFpbC52YWx1ZSl9LF9leHBhbmRlZENoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiYoZC5fX2V4cGFuZGVkX189YyxkLmV4cGFuZGVkPWMpfSxfZmxleEdyb3dDaGFuZ2VkOmZ1bmN0aW9uKGMpe3RoaXMuc3R5bGUuZmxleEdyb3c9CmN9LF9pbmRleENoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiYoZC5pbmRleD1jKX0sX2l0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmKGQuaXRlbT1jKX0sX3NlbGVjdGVkQ2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJihkLl9fc2VsZWN0ZWRfXz1jLGQuc2VsZWN0ZWQ9Yyl9LF9jaGlsZENvbHVtbnNDaGFuZ2VkOmZ1bmN0aW9uKGMpe3RoaXMuY29sU3Bhbj1jLmxlbmd0aH0sX3RvZ2dsZUNvbnRlbnQ6ZnVuY3Rpb24oYyxkLGYpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihjPyhQb2x5bWVyLmRvbShkKS5wYXJlbnROb2RlIT09dGhpcy50YXJnZXQmJlBvbHltZXIuZG9tKHRoaXMudGFyZ2V0KS5hcHBlbmRDaGlsZChkKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChmKSk6dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZHx8UG9seW1lci5kb20oZCkucGFyZW50Tm9kZSE9PQp0aGlzLnRhcmdldHx8UG9seW1lci5kb20odGhpcy50YXJnZXQpLnJlbW92ZUNoaWxkKGQpfSkpfSxfdG9nZ2xlSW5zdGFuY2U6ZnVuY3Rpb24oYyxkLGYpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihjP2QuYWRkSW5zdGFuY2UoZik6ZC5yZW1vdmVJbnN0YW5jZShmKSl9LF93aWR0aENoYW5nZWQ6ZnVuY3Rpb24oYyl7dGhpcy5zdHlsZS53aWR0aD1jfSxfb3JkZXJDaGFuZ2VkOmZ1bmN0aW9uKGMpe3RoaXMuc3R5bGUub3JkZXI9Y30sX3RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihjKXt0aGlzLmluc3RhbmNlPWMudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKTt0aGlzLl90ZW1wbGF0aXplcj1jLnRlbXBsYXRpemVyfSxfaW5zdGFuY2VDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmKHRoaXMuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuX2NlbGxDb250ZW50PXRoaXMuX2NlbGxDb250ZW50fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiKSwKYz0idmFhZGluLWdyaWQtY2VsbC1jb250ZW50LSIrKHZhYWRpbi5lbGVtZW50cy5ncmlkLl9jb250ZW50SW5kZXg9dmFhZGluLmVsZW1lbnRzLmdyaWQuX2NvbnRlbnRJbmRleCsxfHwwKSx0aGlzLl9jZWxsQ29udGVudC5pbm5lckhUTUw9IiIsUG9seW1lci5kb20odGhpcy5fY2VsbENvbnRlbnQpLmFwcGVuZENoaWxkKHRoaXMuaW5zdGFuY2Uucm9vdCksdGhpcy5fY2VsbENvbnRlbnQuc2V0QXR0cmlidXRlKCJpZCIsYyksUG9seW1lci5FbGVtZW50Pyh0aGlzLl9jZWxsQ29udGVudC5zZXRBdHRyaWJ1dGUoInNsb3QiLGMpLHRoaXMuX2luc2VydGlvblBvaW50PXRoaXMuX2luc2VydGlvblBvaW50fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzbG90IiksdGhpcy5faW5zZXJ0aW9uUG9pbnQuc2V0QXR0cmlidXRlKCJuYW1lIixjKSk6KHRoaXMuX2luc2VydGlvblBvaW50PXRoaXMuX2luc2VydGlvblBvaW50fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjb250ZW50IiksdGhpcy5faW5zZXJ0aW9uUG9pbnQuc2V0QXR0cmlidXRlKCJzZWxlY3QiLAoiIyIrYykpKX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1jZWxsIixiZWhhdmlvcnM6W2EsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl90ZW1wbGF0ZUNoYW5nZWQodGVtcGxhdGUpIl0sX2NlbGxDbGljazpmdW5jdGlvbihjKXtjLmRlZmF1bHRQcmV2ZW50ZWR8fHRoaXMuZmlyZSgiY2VsbC1hY3RpdmF0ZSIse21vZGVsOnRoaXMuaW5zdGFuY2V9KX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiLHByb3BlcnRpZXM6e2hlYWRlclRlbXBsYXRlOk9iamVjdCxyZXNpemFibGU6Qm9vbGVhbixjb2x1bW5SZXNpemluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGJlaGF2aW9yczpbYSx2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2hlYWRlclRlbXBsYXRlQ2hhbmdlZChoZWFkZXJUZW1wbGF0ZSkiLCJfaXNFbXB0eUNoYW5nZWQoX2lzRW1wdHksIGlzQXR0YWNoZWQpIiwKIl9yZXNpemFibGVDaGFuZ2VkKHJlc2l6YWJsZSkiXSxsaXN0ZW5lcnM6e21vdXNlZG93bjoiX2NhbmNlbE1vdXNlRG93bk9uUmVzaXplIixtb3VzZW1vdmU6Il9lbmFibGVEcmFnIixtb3VzZW91dDoiX2Rpc2FibGVEcmFnIix0b3VjaHN0YXJ0OiJfb25Ub3VjaFN0YXJ0Iix0b3VjaG1vdmU6Il9vblRvdWNoTW92ZSIsdG91Y2hlbmQ6Il9vblRvdWNoRW5kIixjb250ZXh0bWVudToiX29uQ29udGV4dE1lbnUifSxfb25Db250ZXh0TWVudTpmdW5jdGlvbihjKXt0aGlzLl9yZW9yZGVyR2hvc3QmJmMucHJldmVudERlZmF1bHQoKX0sX29uVG91Y2hTdGFydDpmdW5jdGlvbihjKXtjLnRhcmdldCE9PXRoaXMuX3Jlc2l6ZUhhbmRsZSYmdGhpcy50YXJnZXQuY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQmJih0aGlzLl9zdGFydFJlb3JkZXJUaW1lb3V0PXNldFRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyLmJpbmQodGhpcyxjKSwxMDApKX0sX3N0YXJ0UmVvcmRlcjpmdW5jdGlvbihjKXt0aGlzLl9yZW9yZGVyR2hvc3Q9CnRoaXMuX2dldEdob3N0KCk7dGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiO3ZhciBkPW5ldyBDdXN0b21FdmVudCgiZHJhZ3N0YXJ0Iix7YnViYmxlczohMH0pO3RoaXMuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQoZCk7dGhpcy5fcmVvcmRlclhZPXt4OmMudG91Y2hlc1swXS5jbGllbnRYLXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCx5OmMudG91Y2hlc1swXS5jbGllbnRZLXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wfTt0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKGMudG91Y2hlc1swXS5jbGllbnRYLGMudG91Y2hlc1swXS5jbGllbnRZKX0sX29uVG91Y2hNb3ZlOmZ1bmN0aW9uKGMpe2lmKHRoaXMuX3Jlb3JkZXJHaG9zdCl7Yy5wcmV2ZW50RGVmYXVsdCgpO3ZhciBkPW5ldyBDdXN0b21FdmVudCgiZHJhZ292ZXIiLHtidWJibGVzOiEwfSk7ZC5jbGllbnRYPWMudG91Y2hlc1swXS5jbGllbnRYO2QuY2xpZW50WT0KYy50b3VjaGVzWzBdLmNsaWVudFk7dmFyIGY9dGhpcy5fY29udGVudEZyb21Qb2ludChkLmNsaWVudFgsZC5jbGllbnRZKTtmJiZmLmRpc3BhdGNoRXZlbnQoZCk7dGhpcy5fdXBkYXRlR2hvc3RQb3NpdGlvbihjLnRvdWNoZXNbMF0uY2xpZW50WCxjLnRvdWNoZXNbMF0uY2xpZW50WSl9ZWxzZSBjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dCl9LF91cGRhdGVHaG9zdFBvc2l0aW9uOmZ1bmN0aW9uKGMsZCl7Yy09dGhpcy5fcmVvcmRlclhZLng7ZD1kLXRoaXMuX3Jlb3JkZXJYWS55LTUwO3ZhciBmPXBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS5sZWZ0fHwwKSxnPXBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS50b3B8fDApLGw9dGhpcy5fcmVvcmRlckdob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS5sZWZ0PWYtKGwubGVmdC1jKSsicHgiO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS50b3A9CmctKGwudG9wLWQpKyJweCJ9LF9vblRvdWNoRW5kOmZ1bmN0aW9uKGMpe2NsZWFyVGltZW91dCh0aGlzLl9zdGFydFJlb3JkZXJUaW1lb3V0KTt0aGlzLl9yZW9yZGVyR2hvc3QmJihjLnByZXZlbnREZWZhdWx0KCksYz1uZXcgQ3VzdG9tRXZlbnQoImRyYWdlbmQiLHtidWJibGVzOiEwfSksdGhpcy5kaXNwYXRjaEV2ZW50KGMpLHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLHRoaXMuX3Jlb3JkZXJHaG9zdD1udWxsKX0sX2NvbnRlbnRGcm9tUG9pbnQ6ZnVuY3Rpb24oYyxkKXtpZihQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyl7dmFyIGY9dGhpcy50YXJnZXQuJC5zY3JvbGxlcjtmLnRvZ2dsZUF0dHJpYnV0ZSgibm8tY29udGVudC1wb2ludGVyLWV2ZW50cyIsITApO2M9dGhpcy5kb21Ib3N0LnJvb3QuZWxlbWVudEZyb21Qb2ludChjLGQpO2YudG9nZ2xlQXR0cmlidXRlKCJuby1jb250ZW50LXBvaW50ZXItZXZlbnRzIiwhMSk7aWYoYyYmYy5nZXRDb250ZW50Q2hpbGRyZW4pcmV0dXJuIGMuZ2V0Q29udGVudENoaWxkcmVuKFBvbHltZXIuRWxlbWVudD8KInNsb3QiOiJjb250ZW50IilbMF19ZWxzZSByZXR1cm4gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjLGQpfSxfZ2V0R2hvc3Q6ZnVuY3Rpb24oKXt2YXIgYz10aGlzLnRhcmdldC4kLnNjcm9sbGVyLiQucmVvcmRlcmdob3N0O2MuaW5uZXJUZXh0PXRoaXMuX2NlbGxDb250ZW50LmlubmVyVGV4dDt2YXIgZD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9jZWxsQ29udGVudCk7ImJveFNpemluZyBkaXNwbGF5IHdpZHRoIGhlaWdodCBiYWNrZ3JvdW5kIGFsaWduSXRlbXMgcGFkZGluZyBib3JkZXIgZmxleC1kaXJlY3Rpb24gb3ZlcmZsb3ciLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihmKXtjLnN0eWxlW2ZdPWRbZl19LHRoaXMpO3JldHVybiBjfSxfZW5hYmxlRHJhZzpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50LmRyYWdnYWJsZT10aGlzLnRhcmdldC5jb2x1bW5SZW9yZGVyaW5nQWxsb3dlZCYmIXdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpfSxfZGlzYWJsZURyYWc6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudC5kcmFnZ2FibGU9CiExfSxfY2FuY2VsTW91c2VEb3duT25SZXNpemU6ZnVuY3Rpb24oYyl7Yy50YXJnZXQ9PT10aGlzLl9yZXNpemVIYW5kbGUmJmMucHJldmVudERlZmF1bHQoKX0sX3Jlc2l6YWJsZUNoYW5nZWQ6ZnVuY3Rpb24oYyl7Yz8odGhpcy5fcmVzaXplSGFuZGxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuX3Jlc2l6ZUhhbmRsZS5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSIpLHRoaXMubGlzdGVuKHRoaXMuX3Jlc2l6ZUhhbmRsZSwidHJhY2siLCJfb25UcmFjayIpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuX3Jlc2l6ZUhhbmRsZSkpOnRoaXMuX3Jlc2l6ZUhhbmRsZSYmKHRoaXMudW5saXN0ZW4odGhpcy5fcmVzaXplSGFuZGxlLCJ0cmFjayIsIl9vblRyYWNrIiksUG9seW1lci5kb20odGhpcykucmVtb3ZlQ2hpbGQodGhpcy5fcmVzaXplSGFuZGxlKSl9LF9vblRyYWNrOmZ1bmN0aW9uKGMpe3RoaXMuY29sdW1uUmVzaXppbmc9CiEwO3ZhciBkPXRoaXMuY29sdW1uOyJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiPT09ZC5sb2NhbE5hbWUmJihkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGQuX2NoaWxkQ29sdW1ucywwKS5zb3J0KGZ1bmN0aW9uKGwsayl7cmV0dXJuIGwuX29yZGVyLWsuX29yZGVyfSkuZmlsdGVyKGZ1bmN0aW9uKGwpe3JldHVybiFsLmhpZGRlbn0pLnBvcCgpKTt2YXIgZj10aGlzLl9nZXRIZWFkZXJDZWxsQnlDb2x1bW4oZCk7aWYoZi5vZmZzZXRXaWR0aCl7dmFyIGc9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZi5fY2VsbENvbnRlbnQpO2Qud2lkdGg9TWF0aC5tYXgoMTArcGFyc2VJbnQoZy5wYWRkaW5nTGVmdCkrcGFyc2VJbnQoZy5wYWRkaW5nUmlnaHQpLGYub2Zmc2V0V2lkdGgrYy5kZXRhaWwueC1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSsicHgiO2QuZmxleEdyb3c9MH1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdzpsYXN0LWNoaWxkIC52YWFkaW4tZ3JpZC1jZWxsIikpLnNvcnQoZnVuY3Rpb24obCwKayl7cmV0dXJuIGwuY29sdW1uLl9vcmRlci1rLmNvbHVtbi5fb3JkZXJ9KS5mb3JFYWNoKGZ1bmN0aW9uKGwsayxtKXtrPG0uaW5kZXhPZihmKSYmKGwuY29sdW1uLndpZHRoPWwub2Zmc2V0V2lkdGgrInB4IixsLmNvbHVtbi5mbGV4R3Jvdz0wKX0pO3RoaXMuY29sdW1uUmVzaXppbmcmJiJlbmQiPT09Yy5kZXRhaWwuc3RhdGUmJih0aGlzLmNvbHVtblJlc2l6aW5nPSExKTt0aGlzLmZpcmUoImNvbHVtbi1yZXNpemluZyIpfSxfZ2V0SGVhZGVyQ2VsbEJ5Q29sdW1uOmZ1bmN0aW9uKGMpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3c6bGFzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCIpLGZ1bmN0aW9uKGQpe3JldHVybiBkLmNvbHVtbj09PWN9KVswXX0sX2hlYWRlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihjKXt2b2lkIDAhPT0KYyYmKG51bGw9PT1jfHwhdGhpcy5faXNDb2x1bW5Sb3cmJiJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiIT09dGhpcy5jb2x1bW4ubG9jYWxOYW1lPyh0aGlzLmluc3RhbmNlPXtyb290OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfSx0aGlzLl9pc0VtcHR5PSEwKToodGhpcy5pbnN0YW5jZT1jLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCksdGhpcy5fdGVtcGxhdGl6ZXI9Yy50ZW1wbGF0aXplcix0aGlzLl9pc0VtcHR5PSExKSl9LF9pc0VtcHR5Q2hhbmdlZDpmdW5jdGlvbihjLGQpe2QmJnRoaXMuZmlyZSgiY2VsbC1lbXB0eS1jaGFuZ2VkIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIixwcm9wZXJ0aWVzOntmb290ZXJUZW1wbGF0ZTpPYmplY3R9LGJlaGF2aW9yczpbYSx2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZChmb290ZXJUZW1wbGF0ZSkiLAoiX2lzRW1wdHlDaGFuZ2VkKF9pc0VtcHR5LCBpc0F0dGFjaGVkKSJdLF9mb290ZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYyl7dm9pZCAwIT09YyYmKG51bGw9PT1jfHwhdGhpcy5faXNDb2x1bW5Sb3cmJiJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiIT09dGhpcy5jb2x1bW4ubG9jYWxOYW1lPyh0aGlzLmluc3RhbmNlPXtyb290OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfSx0aGlzLl9pc0VtcHR5PSEwKToodGhpcy5pbnN0YW5jZT1jLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCksdGhpcy5fdGVtcGxhdGl6ZXI9Yy50ZW1wbGF0aXplcix0aGlzLl9pc0VtcHR5PSExKSl9LF9pc0VtcHR5Q2hhbmdlZDpmdW5jdGlvbihjLGQpe2QmJnRoaXMuZmlyZSgiY2VsbC1lbXB0eS1jaGFuZ2VkIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXNpemVyLWNlbGwiLGJlaGF2aW9yczpbYV19KX0pKCk7Cjwvc2NyaXB0PgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5jZWxsIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBsaW5lLWhlaWdodDogMDsKICAgICAgICBmb250LXNpemU6IDFweDsKICAgICAgICBtYXJnaW4tdG9wOiAtMWVtOwogICAgICB9CgogICAgICAuY2VsbFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NvbHVtbnNdXSIgYXM9ImNvbHVtbiI+CiAgICAgIDx2YWFkaW4tZ3JpZC1zaXplci1jZWxsIGNsYXNzPSJjZWxsIiBjb2x1bW49IltbY29sdW1uXV0iPiZuYnNwOzwvdmFhZGluLWdyaWQtc2l6ZXItY2VsbD4KICAgIDwvdGVtcGxhdGU+CgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNpemVyLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXNpemVyIixwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRvcDpOdW1iZXIsX2NvbHVtbnM6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlKSIsIl90b3BDaGFuZ2VkKHRvcCkiXSxfY29sdW1uVHJlZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5fY29sdW1ucz1hW2EubGVuZ3RoLTFdfSxfdG9wQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLnN0eWxlLnRvcD1hKyJweCJ9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbcGFzc3Rocm91Z2hdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpb3NdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB6LWluZGV4OiAtMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc11bc2Nyb2xsaW5nXSkgewogICAgICAgIHotaW5kZXg6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1vdXRlci1zY3JvbGxlci5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1vdXRlci1zY3JvbGxlciIscHJvcGVydGllczp7c2Nyb2xsVGFyZ2V0Ont0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3Njcm9sbFRhcmdldENoYW5nZWQifSxwYXNzdGhyb3VnaDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMH19LGxpc3RlbmVyczp7c2Nyb2xsOiJfc3luY1Njcm9sbFRhcmdldCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5saXN0ZW4odGhpcy5kb21Ib3N0LCJtb3VzZW1vdmUiLCJfb25Nb3VzZU1vdmUiKTt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPSJ0b3VjaCJ9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLmRvbUhvc3QsIm1vdXNlbW92ZSIsIl9vbk1vdXNlTW92ZSIpfSxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihhLGMpe2MmJnRoaXMudW5saXN0ZW4oYywic2Nyb2xsIiwiX3N5bmNPdXRlclNjcm9sbGVyIik7dGhpcy5saXN0ZW4oYSwKInNjcm9sbCIsIl9zeW5jT3V0ZXJTY3JvbGxlciIpfSxfb25Nb3VzZU1vdmU6ZnVuY3Rpb24oYSl7dGhpcy5wYXNzdGhyb3VnaD1hLm9mZnNldFk8PXRoaXMuY2xpZW50SGVpZ2h0JiZhLm9mZnNldFg8PXRoaXMuY2xpZW50V2lkdGh9LF9zeW5jT3V0ZXJTY3JvbGxlcjpmdW5jdGlvbigpe3RoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXR8fCh0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcj0hMCx0aGlzLnNjcm9sbFRvcD10aGlzLmRvbUhvc3QuX3Njcm9sbFRvcCx0aGlzLnNjcm9sbExlZnQ9dGhpcy5kb21Ib3N0Ll9zY3JvbGxMZWZ0KTt0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0PSExfSxfc3luY1Njcm9sbFRhcmdldDpmdW5jdGlvbigpe3RoaXMuX3N5bmNpbmdPdXRlclNjcm9sbGVyfHwodGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldD0hMCx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3AsdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdD10aGlzLnNjcm9sbExlZnQsCnRoaXMuZG9tSG9zdC5fc2Nyb2xsSGFuZGxlcigpKTt0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcj0hMX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1mb2N1c2FibGUtY2VsbC1jb250YWluZXItYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yPXtwcm9wZXJ0aWVzOntmb2N1c2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfZm9jdXNlZFJvdzpPYmplY3QsX2ZvY3VzZWRSb3dJbmRleDpOdW1iZXIsX2ZvY3VzZWRDZWxsOk9iamVjdCxfZm9jdXNlZENlbGxJbmRleDpOdW1iZXIsX2xhc3RGb2N1c2VkQ2VsbDpPYmplY3R9LG9ic2VydmVyczpbIl9hbm5vdW5jZUZvY3VzZWRDZWxsKF9mb2N1c2VkQ2VsbCwgZm9jdXNlZCkiLCJfZGlzcGF0Y2hFdmVudHMoX2ZvY3VzZWRDZWxsLCBmb2N1c2VkKSIsIl9mb2N1c2VkQ2VsbENoYW5nZWQoX2ZvY3VzZWRSb3dJbmRleCwgX2ZvY3VzZWRDZWxsSW5kZXgpIl0sX2Fubm91bmNlRm9jdXNlZENlbGw6ZnVuY3Rpb24oYSxjKXt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1jJiZ0aGlzLmRvbUhvc3QubmF2aWdhdGluZyYmYyYmKGM9UG9seW1lci5FbGVtZW50P2EuX2NlbGxDb250ZW50LmdldEF0dHJpYnV0ZSgic2xvdCIpOgphLl9jZWxsQ29udGVudC5pZCwidmFhZGluLWdyaWQtdGFibGUtYm9keSIhPT10aGlzLmlzfHxhLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKXx8KGE9QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChQb2x5bWVyLmRvbShhLnBhcmVudEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1jZWxsIiksYSksYz10aGlzLmRvbUhvc3QuJC5oZWFkZXIubGFzdEVsZW1lbnRDaGlsZC5jaGlsZHJlblthXS5fY2VsbENvbnRlbnQuaWQrIiAiK2MpLHRoaXMuZG9tSG9zdC4kLmZvb3RlckZvY3VzVHJhcC5hY3RpdmVUYXJnZXQ9Yyl9LF9kaXNwYXRjaEV2ZW50czpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWMmJih0aGlzLl9sYXN0Rm9jdXNlZENlbGwmJih0aGlzLl9sYXN0Rm9jdXNlZENlbGwuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3Vzb3V0IikpLHRoaXMuX2xhc3RGb2N1c2VkQ2VsbD12b2lkIDApLApjJiYoYS5fY2VsbENvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNlbGwtZm9jdXNpbiIpKSx0aGlzLl9sYXN0Rm9jdXNlZENlbGw9YSkpfSxfZm9jdXNlZENlbGxDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChQb2x5bWVyLmRvbSh0aGlzKS5jaGlsZHJlbixmdW5jdGlvbihkLGYpe2QuZm9jdXNlZD1mPT09YTtkLmZvY3VzZWQmJih0aGlzLl9mb2N1c2VkUm93PWQsdGhpcy5fZm9jdXNlZENlbGxJbmRleD1NYXRoLm1pbihjLGQuY2hpbGRyZW4ubGVuZ3RoLTEpLHRoaXMuX2ZvY3VzZWRDZWxsPWQuY2hpbGRyZW5bdGhpcy5fZm9jdXNlZENlbGxJbmRleF0pO2QuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihnLGwpe2cuZm9jdXNlZD1sPT09dGhpcy5fZm9jdXNlZENlbGxJbmRleH0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfSxmb2N1c0xlZnQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fZm9jdXNlZENlbGwuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpKXt2YXIgYT0KdGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxhLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YVtNYXRoLm1heCgwLGEuaW5kZXhPZih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4KS0xKV0pfX0sZm9jdXNEb3duOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWluKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCsxLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLTEpfSxfdmlzaWJsZUNlbGxJbmRleGVzOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5fZm9jdXNlZFJvdyYmdGhpcy5fZm9jdXNlZFJvdy5jaGlsZHJlbil7Zm9yKHZhciBjPXRoaXMuX2ZvY3VzZWRSb3cuY2hpbGRyZW4sZD0wO2Q8Yy5sZW5ndGg7ZCsrKWNbZF0uaGlkZGVufHxjW2RdPT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx8fGEucHVzaChkKTthLnNvcnQoZnVuY3Rpb24oZixnKXtyZXR1cm4gY1tmXS5jb2x1bW4uX29yZGVyPGNbZ10uY29sdW1uLl9vcmRlcj8tMToxfSl9cmV0dXJuIGF9LApmb2N1c1BhZ2VEb3duOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWluKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCsxMCx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKX0sZm9jdXNQYWdlVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMTApfSxmb2N1c1JpZ2h0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGE9dGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxhLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YVtNYXRoLm1pbihhLmluZGV4T2YodGhpcy5fZm9jdXNlZENlbGxJbmRleCkrMSxhLmxlbmd0aC0xKV0pfX0sZm9jdXNVcDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1heCgwLHRoaXMuX2ZvY3VzZWRSb3dJbmRleC0xKX0sZm9jdXNIb21lOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGE9CnRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8YS5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWFbMF0pfX0sZm9jdXNFbmQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fZm9jdXNlZENlbGwuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpKXt2YXIgYT10aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGEubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1hW2EubGVuZ3RoLTFdKX19LGZvY3VzRmlyc3Q6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9MDt0aGlzLmZvY3VzSG9tZSgpfSxmb2N1c0xhc3Q6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9dGhpcy5jaGlsZHJlbi5sZW5ndGgtMTt0aGlzLmZvY3VzRW5kKCl9fTsKPC9zY3JpcHQ+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1mb290ZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT17cHJvcGVydGllczp7Y29sdW1uVHJlZTpBcnJheSx0YXJnZXQ6T2JqZWN0LF9yb3dzOkFycmF5fSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSwgdGFyZ2V0KSIsIl9yb3dzQ2hhbmdlZChfcm93cykiXSxfY29sdW1uVHJlZUNoYW5nZWQ6ZnVuY3Rpb24oYyxkKXtpZih2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kKXt0aGlzLl9yb3dzJiZ0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24oayl7UG9seW1lci5kb20oaykuaW5uZXJIVE1MPSIifSk7Zm9yKHZhciBmPVtdLGc9MDtnPGMubGVuZ3RoO2crKyl7dmFyIGw9dGhpcy5fY3JlYXRlUm93KCk7bC50YXJnZXQ9ZDtsLl9pc0NvbHVtblJvdz1nPT1jLmxlbmd0aC0xO2wuY29sdW1ucz1jW2ddO2YucHVzaChsKX10aGlzLl9yb3dzPSJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiPT09dGhpcy5sb2NhbE5hbWU/ZjpmLnJldmVyc2UoKX19LF9yb3dzQ2hhbmdlZDpmdW5jdGlvbihjKXtQb2x5bWVyLmRvbSh0aGlzKS5pbm5lckhUTUw9CiIiO2MuZm9yRWFjaChmdW5jdGlvbihkKXtQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChkKX0uYmluZCh0aGlzKSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIixiZWhhdmlvcnM6W2EsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1yb3ciKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtYm9keSIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLG9ic2VydmVyczpbIl9hbm5vdW5jZUZvY3VzZWRSb3coX2ZvY3VzZWRSb3cpIl0sX2Fubm91bmNlRm9jdXNlZFJvdzpmdW5jdGlvbihjKXt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0OiJSb3cgIisoYy5pbmRleCsxKSsiIG9mICIrCnRoaXMuZG9tSG9zdC5zaXplfSl9LF9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZENlbGwuZm9jdXNlZD0hMTt0aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbC5mb2N1c2VkPSEwO3RoaXMuX2ZvY3VzZWRDZWxsPXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfSxfZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsJiZ0aGlzLl9mb2N1c2VkQ2VsbCE9PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfSxmb2N1c0Rvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGwoKT90aGlzLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCk6dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWluKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCsxLHRoaXMuZG9tSG9zdC5zaXplLTEpfSxmb2N1c1VwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvdyYmCnRoaXMuX2ZvY3VzZWRDZWxsPT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGw/dGhpcy5fZm9jdXNlZENlbGxDaGFuZ2VkKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCx0aGlzLl9mb2N1c2VkQ2VsbEluZGV4KToodGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEpLHRoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpJiZ0aGlzLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCkpfSxmb2N1c0xhc3Q6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9dGhpcy5kb21Ib3N0LnNpemUtMTt0aGlzLmZvY3VzRW5kKCl9LF9mb2N1c2VkQ2VsbENoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe2YuZm9jdXNlZD1mLmluZGV4PT09YztmLmluZGV4PT09YyYmKHRoaXMuX2ZvY3VzZWRSb3c9CmYsdGhpcy5fZm9jdXNlZENlbGw9Zi5jaGlsZHJlbltkXSk7Zi5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24oZyxsKXtnLmZvY3VzZWQ9bD09PWR9KX0uYmluZCh0aGlzKSl9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciIsYmVoYXZpb3JzOlthLHZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sX2NyZWF0ZVJvdzpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93Iil9fSl9KSgpOwo8L3NjcmlwdD4KCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgOmhvc3QgewogICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgei1pbmRleDogLTM7CiAgICAgICBoZWlnaHQ6IDA7CiAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgIH0KCiAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAucHJpbWFyeTpmb2N1cywKICAgICA6OnNsb3R0ZWQoLnByaW1hcnk6Zm9jdXMpLAogICAgIC5zZWNvbmRhcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5zZWNvbmRhcnk6Zm9jdXMpIHsKICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgfQogICAgPC9zdHlsZT4KCiAgICAKICAgIDxkaXYgY2xhc3M9InByaW1hcnkiIHRhYmluZGV4PSIwIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic2Vjb25kYXJ5IiB0YWJpbmRleD0iLTEiIHJvbGU9ImdyaWRjZWxsIiBvbi1mb2N1cz0iX29uQmFpdEZvY3VzIiBvbi1ibHVyPSJfb25CYWl0Qmx1ciI+PGRpdiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+PC9kaXY+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWZvY3VzLXRyYXAuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImdyaWRjZWxsIn0scHJvcGVydGllczp7YWN0aXZlVGFyZ2V0Ont0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2FjdGl2ZVRhcmdldENoYW5nZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9wcmltYXJ5PVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigiLnByaW1hcnkiKTt0aGlzLl9zZWNvbmRhcnk9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKCIuc2Vjb25kYXJ5Iik7aWYoUG9seW1lci5TZXR0aW5ncy51c2VOYXRpdmVTaGFkb3d8fFBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93KVBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuX3NlY29uZGFyeSksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fcHJpbWFyeSl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZCE9PXRoaXMuX3ByaW1hcnk/dGhpcy5fcHJpbWFyeS5mb2N1cygpOgp0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKX0sX29uQmFpdEZvY3VzOmZ1bmN0aW9uKGEpe3RoaXMuX2ZvY3VzZWQ9YS50YXJnZXQ7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5fHwodGhpcy5maXJlKCJmb2N1cy1nYWluZWQiKSx0aGlzLl9wcmltYXJ5LnRhYkluZGV4PS0xKX0sX29uQmFpdEJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHl8fCh0aGlzLmZpcmUoImZvY3VzLWxvc3QiKSx0aGlzLl9wcmltYXJ5LnRhYkluZGV4PTApfSxfYWN0aXZlVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITA7dGhpcy5fZm9jdXNlZD09PXRoaXMuX3ByaW1hcnk/KHRoaXMuX3NlY29uZGFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYSksdGhpcy5fc2Vjb25kYXJ5LmZvY3VzKCkpOih0aGlzLl9wcmltYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixhKSx0aGlzLl9wcmltYXJ5LmZvY3VzKCkpOwp0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITF9LF9yZWFubm91bmNlOmZ1bmN0aW9uKCl7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSEwO3RoaXMuX2ZvY3VzZWQ9PT10aGlzLl9wcmltYXJ5Pyh0aGlzLl9zZWNvbmRhcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLHRoaXMuYWN0aXZlVGFyZ2V0KSx0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKSk6KHRoaXMuX3ByaW1hcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLHRoaXMuYWN0aXZlVGFyZ2V0KSx0aGlzLl9wcmltYXJ5LmZvY3VzKCkpO3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI+PC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXJvdy5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBhPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LGNvbHVtbnM6QXJyYXksaW5kZXg6TnVtYmVyLGNlbGxzOnt2YWx1ZTpbXX0sdGFyZ2V0Ok9iamVjdCxleHBhbmRlZDp7dmFsdWU6ITF9LGZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGl0ZW06T2JqZWN0LHNlbGVjdGVkOntyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9yb3dEZXRhaWxzQ2VsbDpPYmplY3Qscm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdH0sb2JzZXJ2ZXJzOiJfY29sdW1uc0NoYW5nZWQoY29sdW1ucywgdGFyZ2V0KTtfaW5kZXhDaGFuZ2VkKGluZGV4LCBjZWxscyk7X2l0ZW1DaGFuZ2VkKGl0ZW0sIGNlbGxzKTtfaXRlbUNoYW5nZWRGb3JEZXRhaWxzKGl0ZW0sIF9yb3dEZXRhaWxzQ2VsbCk7X3Jvd0RldGFpbHNDaGFuZ2VkKGV4cGFuZGVkLCByb3dEZXRhaWxzVGVtcGxhdGUsIHRhcmdldCk7X3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkKF9yb3dEZXRhaWxzQ2VsbCwgaW5kZXgpO19yb3dEZXRhaWxzQ2VsbENoYW5nZWQoX3Jvd0RldGFpbHNDZWxsLCB0YXJnZXQpO19zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQsIGNlbGxzKTtfc2VsZWN0ZWRDaGFuZ2VkRm9yRGV0YWlscyhzZWxlY3RlZCwgX3Jvd0RldGFpbHNDZWxsKSIuc3BsaXQoIjsiKSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLXJvdyIpOyExPT09UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cmJih0aGlzLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksdGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZCIpKX0saXRlcmF0ZUNlbGxzOmZ1bmN0aW9uKGMpe3RoaXMuY2VsbHMuZm9yRWFjaChjKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmYyh0aGlzLl9yb3dEZXRhaWxzQ2VsbCl9LF9yb3dEZXRhaWxzQ2hhbmdlZDpmdW5jdGlvbihjLGQsZil7aWYodm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmdm9pZCAwIT09Zil7aWYoYyl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpO2cuc2V0QXR0cmlidXRlKCJkZXRhaWxzY2VsbCIsITApO2cuZnJvemVuPSEwO2cudGFyZ2V0PWY7Zy50ZW1wbGF0ZT1kO2cudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIiwhMCk7UG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChnKTsKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbD1nfWVsc2UgdGhpcy5fcm93RGV0YWlsc0NlbGwmJihQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnJlbW92ZUNoaWxkKHRoaXMuX3Jvd0RldGFpbHNDZWxsKSx0aGlzLl9yb3dEZXRhaWxzQ2VsbD1udWxsKTt0aGlzLml0ZXJhdGVDZWxscyhmdW5jdGlvbihsKXtsLmV4cGFuZGVkPWN9KTt0aGlzLnRhcmdldC4kLnNjcm9sbGVyLl9mcm96ZW5DZWxsc0NoYW5nZWQoKX19LF91cGRhdGVSb3dWaXNpYmlsaXR5OmZ1bmN0aW9uKCl7dGhpcy5oaWRkZW49dGhpcy5jZWxscy5ldmVyeShmdW5jdGlvbihjKXtyZXR1cm4gYy5faXNFbXB0eX0pfSxfcm93RGV0YWlsc0NlbGxDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmZC4kLnNjcm9sbGVyLl91cGRhdGUoKX0sX3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmKGM/KGMuaW5kZXg9CmQsUG9seW1lci5kb20uZmx1c2goKSx0aGlzLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpKTp0aGlzLnN0eWxlLnBhZGRpbmdCb3R0b209IiIpfSx1cGRhdGVSb3dEZXRhaWxzQ2VsbE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmKHRoaXMudGFyZ2V0JiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXImJnRoaXMudGFyZ2V0Ll9vYnNlcnZlci5mbHVzaCYmdGhpcy50YXJnZXQuX29ic2VydmVyLmZsdXNoKCksdGhpcy5fcm93RGV0YWlsc0NlbGwuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuc3R5bGUucGFkZGluZ0JvdHRvbT10aGlzLl9yb3dEZXRhaWxzQ2VsbC5zdHlsZS5oZWlnaHQ9dGhpcy5fcm93RGV0YWlsc0NlbGwuY2xpZW50SGVpZ2h0KyJweCIpfSxfY29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oYyxkKXtpZih2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kKXtQb2x5bWVyLmRvbSh0aGlzKS5pbm5lckhUTUw9IiI7dmFyIGY9W107Yy5mb3JFYWNoKGZ1bmN0aW9uKGcpe3ZhciBsPQoiXyIrdGhpcy5pcy5yZXBsYWNlKC8tL2csIl8iKSsiX2NlbGxzIjtsPWdbbF09Z1tsXXx8W107dmFyIGs9bC5maWx0ZXIoZnVuY3Rpb24ocCl7cmV0dXJuIVBvbHltZXIuZG9tKHApLnBhcmVudE5vZGV9KVswXTtpZighayl7az10aGlzLl9jcmVhdGVDZWxsKCk7dmFyIG09QXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbCh0aGlzLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJkb20tcmVwZWF0IiksZnVuY3Rpb24ocCl7cmV0dXJuIXAucmVzdGFtcH0pOyhtPW18fCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93Ij09PXRoaXMuaXN8fCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93Ij09PXRoaXMuaXMpfHxsLnB1c2goayl9ay5pbmRleD10aGlzLmluZGV4O2sudGFyZ2V0PXRoaXMudGFyZ2V0O2suX2lzQ29sdW1uUm93PXRoaXMuX2lzQ29sdW1uUm93O2suY29sdW1uPWc7ay5leHBhbmRlZD10aGlzLmV4cGFuZGVkO1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGspO2YucHVzaChrKX0uYmluZCh0aGlzKSk7CnRoaXMuY2VsbHM9Zn19LF9pbmRleENoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiZkLmZvckVhY2goZnVuY3Rpb24oZil7Zi5pbmRleD1jfSl9LF9pdGVtQ2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJmQuZm9yRWFjaChmdW5jdGlvbihmKXtmLml0ZW09Y30pfSxfaXRlbUNoYW5nZWRGb3JEZXRhaWxzOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmZCYmKGQuaXRlbT1jKX0sX3NlbGVjdGVkQ2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJmQuZm9yRWFjaChmdW5jdGlvbihmKXtmLnNlbGVjdGVkPWN9KX0sX3NlbGVjdGVkQ2hhbmdlZEZvckRldGFpbHM6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiZkJiYoZC5zZWxlY3RlZD1jKX0sdXBkYXRlTGFzdENvbHVtbjpmdW5jdGlvbigpe3RoaXMuY2VsbHMuc2xpY2UoMCkuc29ydChmdW5jdGlvbihjLApkKXtyZXR1cm4gYy5jb2x1bW4uX29yZGVyLWQuY29sdW1uLl9vcmRlcn0pLmZvckVhY2goZnVuY3Rpb24oYyxkLGYpe2MudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIixkPT09Zi5sZW5ndGgtMSl9KX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciLGJlaGF2aW9yczpbYV0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93IixiZWhhdmlvcnM6W2FdLG9ic2VydmVyczpbIl91cGRhdGVSb3dWaXNpYmlsaXR5KGNvbHVtbnMpIl0sbGlzdGVuZXJzOnsiY2VsbC1lbXB0eS1jaGFuZ2VkIjoiX3VwZGF0ZVJvd1Zpc2liaWxpdHkifSxfY3JlYXRlQ2VsbDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93IiwKYmVoYXZpb3JzOlthXSxvYnNlcnZlcnM6WyJfdXBkYXRlUm93VmlzaWJpbGl0eShjb2x1bW5zKSJdLGxpc3RlbmVyczp7ImNlbGwtZW1wdHktY2hhbmdlZCI6Il91cGRhdGVSb3dWaXNpYmlsaXR5In0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiKX19KX0pKCk7Cjwvc2NyaXB0PgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1mdW5jdGlvbigpe307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyPVBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10ZW1wbGF0aXplciIsYmVoYXZpb3JzOltQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlSW5zdGFuY2VzQ2hhbmdlZChfdGVtcGxhdGVJbnN0YW5jZXMuKiwgX3BhcmVudFBhdGhWYWx1ZXMuKikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50TW9kZWw9ITA7dGhpcy5faW5zdGFuY2VQcm9wcz17ZXhwYW5kZWQ6ITAsaW5kZXg6ITAsaXRlbTohMCxzZWxlY3RlZDohMH19LGNyZWF0ZUluc3RhbmNlOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTt2YXIgYT10aGlzLnN0YW1wKHt9KTsKdGhpcy5hZGRJbnN0YW5jZShhKTtyZXR1cm4gYX0sYWRkSW5zdGFuY2U6ZnVuY3Rpb24oYSl7LTE9PT10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGEpJiZ0aGlzLnB1c2goIl90ZW1wbGF0ZUluc3RhbmNlcyIsYSl9LHJlbW92ZUluc3RhbmNlOmZ1bmN0aW9uKGEpe3RoaXMuc3BsaWNlKCJfdGVtcGxhdGVJbnN0YW5jZXMiLHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmluZGV4T2YoYSksMSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe3RoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkfHwodGhpcy50ZW1wbGF0ZS5fdGVtcGxhdGl6ZWQ9ITAsdGhpcy50ZW1wbGF0aXplKHRoaXMudGVtcGxhdGUpLHRoaXMuX3BhcmVudFByb3BzPXRoaXMuX3BhcmVudFByb3BzfHx7fSxQb2x5bWVyLkVsZW1lbnR8fE9iamVjdC5rZXlzKHRoaXMuX3BhcmVudFByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uKCl7fSx0aGlzKSl9LF9mb3J3YXJkSW5zdGFuY2VQcm9wOmZ1bmN0aW9uKGEsYyxkKXt2b2lkIDAhPT0KYVsiX18iK2MrIl9fIl0mJmFbIl9fIitjKyJfXyJdIT09ZCYmdGhpcy5maXJlKCJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIix7cHJvcDpjLHZhbHVlOmQsaW5zdDphfSl9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKGEsYyxkKXswIT09Yy5pbmRleE9mKCJpdGVtLiIpfHx0aGlzLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudHx8dGhpcy5maXJlKCJpdGVtLWNoYW5nZWQiLHtpdGVtOmEuaXRlbSxwYXRoOmMuc3Vic3RyaW5nKDUpLHZhbHVlOmR9KX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKGEsYyxkKXt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQcm9wKGEsYyxkKTt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQYXRoKGEsYyxkKX0sX2ZvcndhcmRQYXJlbnRQcm9wOmZ1bmN0aW9uKGEsYyl7dGhpcy5fcGFyZW50UGF0aFZhbHVlc1thXT1jO3RoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5zZXQoYSxjKX0sdGhpcyl9LF9mb3J3YXJkUGFyZW50UGF0aDpmdW5jdGlvbihhLApjKXt0aGlzLnNldChbIl9wYXJlbnRQYXRoVmFsdWVzIixhXSxjKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Qubm90aWZ5UGF0aChhLGMpfSx0aGlzKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKGEsYyl7dGhpcy5fZm9yd2FyZFBhcmVudFByb3AoYSxjKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcyYmdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLm5vdGlmeVBhdGgoYSxjKX0sdGhpcyl9LF90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQ6ZnVuY3Rpb24oYSl7aWYoIl90ZW1wbGF0ZUluc3RhbmNlcyI9PT1hLnBhdGgpe3ZhciBjPTA7dmFyIGQ9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMubGVuZ3RofWVsc2UgaWYoIl90ZW1wbGF0ZUluc3RhbmNlcy5zcGxpY2VzIj09PWEucGF0aCljPWEudmFsdWUuaW5kZXgsZD1hLnZhbHVlLmFkZGVkQ291bnQ7ZWxzZSByZXR1cm47T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8Cnt9KS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Zvcih2YXIgZz1jO2c8YytkO2crKyl0aGlzLl90ZW1wbGF0ZUluc3RhbmNlc1tnXS5zZXQoZix0aGlzLl9wYXJlbnRQYXRoVmFsdWVzW2ZdKX0sdGhpcyl9fSk7Cjwvc2NyaXB0PgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2RldGFpbHNjZWxsXSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAudmFhZGluLWdyaWQtY2VsbFtkZXRhaWxzY2VsbF0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctZGV0YWlscy1jZWxsKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcj17cHJvcGVydGllczp7ZXhwYW5kZWRJdGVtczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7InRlbXBsYXRlLWluc3RhbmNlLWNoYW5nZWQiOiJfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRFeHBhbmRlZCJ9LG9ic2VydmVyczpbIl9leHBhbmRlZEl0ZW1zQ2hhbmdlZChleHBhbmRlZEl0ZW1zLiosIGRhdGFQcm92aWRlcikiLCJfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZChfcm93RGV0YWlsc1RlbXBsYXRlKSJdLF9leHBhbmRlZEl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWMmJih0aGlzLl9mbHVzaEl0ZW1zRGVib3VuY2VyKCksdGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLmV4cGFuZGVkPXRoaXMuX2lzRXhwYW5kZWQoZC5pdGVtKX0uYmluZCh0aGlzKSkpfSwKX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9bmV3IHZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyO2MuZGF0YUhvc3Q9dGhpcy5kYXRhSG9zdDtjLl9pbnN0YW5jZVByb3BzPXtleHBhbmRlZDohMCxpbmRleDohMCxpdGVtOiEwLHNlbGVjdGVkOiEwfTtQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKGMpO2MudGVtcGxhdGU9YTthLnRlbXBsYXRpemVyPWN9LF9pc0V4cGFuZGVkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmV4cGFuZGVkSXRlbXMmJi0xIT09dGhpcy5leHBhbmRlZEl0ZW1zLmluZGV4T2YoYSl9LGV4cGFuZEl0ZW06ZnVuY3Rpb24oYSl7dGhpcy5faXNFeHBhbmRlZChhKXx8dGhpcy5wdXNoKCJleHBhbmRlZEl0ZW1zIixhKX0sY29sbGFwc2VJdGVtOmZ1bmN0aW9uKGEpe3RoaXMuX2lzRXhwYW5kZWQoYSkmJnRoaXMuc3BsaWNlKCJleHBhbmRlZEl0ZW1zIix0aGlzLmV4cGFuZGVkSXRlbXMuaW5kZXhPZihhKSwxKX0sCl90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZEV4cGFuZGVkOmZ1bmN0aW9uKGEpeyJleHBhbmRlZCI9PT1hLmRldGFpbC5wcm9wJiYoYS5kZXRhaWwudmFsdWU/dGhpcy5leHBhbmRJdGVtKGEuZGV0YWlsLmluc3QuaXRlbSk6dGhpcy5jb2xsYXBzZUl0ZW0oYS5kZXRhaWwuaW5zdC5pdGVtKSxhLnN0b3BQcm9wYWdhdGlvbigpKX19Owo8L3NjcmlwdD4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogQW5pbSAqLwogICAgICBAa2V5ZnJhbWVzIHZhYWRpbi1ncmlkLXNwaW4tMzYwIHsKICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI3NwaW5uZXIgewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXByaW1hcnktY29sb3IsICMwM0E5RjQpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC04cHg7CiAgICAgICAgbWFyZ2luLXRvcDogLThweDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1sb2FkaW5nLXNwaW5uZXIpOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNzcGlubmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiB2YWFkaW4tZ3JpZC1zcGluLTM2MCA0MDBtcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiB2YWFkaW4tZ3JpZC1zcGluLTM2MCA0MDBtcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtsb2FkaW5nXSkgI2l0ZW1zIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcj17bGlzdGVuZXJzOnsiaXRlbS1jaGFuZ2VkIjoiX3RlbXBsYXRlSXRlbUNoYW5nZWQifSxwcm9wZXJ0aWVzOntwYWdlU2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAsb2JzZXJ2ZXI6Il9wYWdlU2l6ZUNoYW5nZWQifSxkYXRhUHJvdmlkZXI6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2RhdGFQcm92aWRlckNoYW5nZWQifSxfbG9hZGluZzpCb29sZWFuLF9jYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9wZW5kaW5nUmVxdWVzdHM6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sX3RlbXBsYXRlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9YS5kZXRhaWwuaXRlbTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcykuY2hpbGRyZW4sZnVuY3Rpb24oZCl7ZC5pdGVtPT09YyYmZC5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24oZil7Zi5fdGVtcGxhdGl6ZXIuX3N1cHByZXNzSXRlbUNoYW5nZUV2ZW50PQohMDtmLmluc3RhbmNlLm5vdGlmeVBhdGgoIml0ZW0uIithLmRldGFpbC5wYXRoLGEuZGV0YWlsLnZhbHVlKTtmLl90ZW1wbGF0aXplci5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnQ9ITF9KX0pfSxfZ2V0Q2FjaGVkSXRlbTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9nZXRQYWdlRm9ySW5kZXgoYSksZD10aGlzLl9jYWNoZSYmdGhpcy5fY2FjaGVbY107cmV0dXJuIGQ/ZFthLWMqdGhpcy5wYWdlU2l6ZV06bnVsbH0sX2dldEl0ZW06ZnVuY3Rpb24oYSxjKXt0aGlzLl91cGRhdGVJdGVtKGMsdGhpcy5fZ2V0Q2FjaGVkSXRlbShhKSk7dGhpcy5fZWFnZXJseUxvYWRQYWdlcygpO3ZhciBkPXRoaXMuX3VuY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCk7MDxkLmxlbmd0aCYmKHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5kZWJvdW5jZSgibG9hZCIsZnVuY3Rpb24oKXtkLmZvckVhY2goZnVuY3Rpb24oZil7dGhpcy5fbG9hZFBhZ2UoZil9LmJpbmQodGhpcykpfSwxMDApKX0sX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMCE9PQp0aGlzLl9jYWNoZSYmdm9pZCAwIT09dGhpcy5fY2FjaGVbYV19LmJpbmQodGhpcykpfSxfdW5jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDAhPT10aGlzLl9jYWNoZSYmdm9pZCAwPT09dGhpcy5fY2FjaGVbYV19LmJpbmQodGhpcykpfSxfZWFnZXJseUxvYWRQYWdlczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLnNsaWNlKDApO2lmKDA8YS5sZW5ndGgpe2Euc29ydChmdW5jdGlvbihkLGYpe3JldHVybiBkPmZ9KTt2YXIgYz1NYXRoLm1pbihhW2EubGVuZ3RoLTFdKzEsTWF0aC5tYXgoMCxNYXRoLmZsb29yKHRoaXMuc2l6ZS90aGlzLnBhZ2VTaXplKS0xKSk7dGhpcy5fbG9hZFBhZ2UoTWF0aC5tYXgoMCxhWzBdLTEpKTt0aGlzLl9sb2FkUGFnZShjKX19LF9wYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5fZ2V0UGFnZUZvckluZGV4KHRoaXMuJC5zY3JvbGxlci5maXJzdFZpc2libGVJbmRleCsKdGhpcy4kLnNjcm9sbGVyLl92aWR4T2Zmc2V0KV0uY29uY2F0KHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5kZXh9KS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2dldFBhZ2VGb3JJbmRleChhLmluZGV4KX0uYmluZCh0aGlzKSkpLnJlZHVjZShmdW5jdGlvbihhLGMpey0xPT09YS5pbmRleE9mKGMpJiZhLnB1c2goYyk7cmV0dXJuIGF9LFtdKX0sX3VwZGF0ZUl0ZW1zOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPTA7ZDx0aGlzLnBhZ2VTaXplO2QrKyl7dmFyIGY9dGhpcy4kLnNjcm9sbGVyLl92aXJ0dWFsSW5kZXhUb0l0ZW1bYSp0aGlzLnBhZ2VTaXplK2RdO2YmJih0aGlzLl91cGRhdGVJdGVtKGYsY1tkXSksdGhpcy5kZWJvdW5jZSgidXBkYXRlLWhlaWdodHMiLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVNZXRyaWNzKCk7dGhpcy4kLnNjcm9sbGVyLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVTY3JvbGxlclNpemUoKX0sCjEpKX19LF9sb2FkUGFnZTpmdW5jdGlvbihhLGMpe2M9Y3x8dGhpcy5fdXBkYXRlSXRlbXMuYmluZCh0aGlzKTtpZighdGhpcy5fY2FjaGVbYV0mJiF0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYV0mJnRoaXMuZGF0YVByb3ZpZGVyKXt0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYV09ITA7dmFyIGQ9e3BhZ2U6YSxwYWdlU2l6ZTp0aGlzLnBhZ2VTaXplLHNvcnRPcmRlcnM6dGhpcy5fbWFwU29ydGVycygpLGZpbHRlcnM6dGhpcy5fbWFwRmlsdGVycygpfTt0aGlzLmRhdGFQcm92aWRlcihkLGZ1bmN0aW9uKGYpe3RoaXMuX2NhY2hlW2FdPWY7ZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1thXTtjKGEsZik7dGhpcy5fbG9hZGluZz0wPHRoaXMuX3BlbmRpbmdSZXF1ZXN0cy5sZW5ndGg7dGhpcy5kZWJvdW5jZSgiY2hlY2stc2l6ZSIsdGhpcy5fY2hlY2tTaXplLDJFMyl9LmJpbmQodGhpcykpfX0sX2dldFBhZ2VGb3JJbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5mbG9vcihhL3RoaXMucGFnZVNpemUpfSwKY2xlYXJDYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NhY2hlPXt9O3RoaXMuX3BlbmRpbmdSZXF1ZXN0cz17fTt0aGlzLiQuc2Nyb2xsZXIuaGFzRGF0YSYmdGhpcy4kLnNjcm9sbGVyLl91cGRhdGUoKTt0aGlzLl9mbHVzaEl0ZW1zRGVib3VuY2VyKCl9LF9mbHVzaEl0ZW1zRGVib3VuY2VyOmZ1bmN0aW9uKCl7dGhpcy5mbHVzaERlYm91bmNlcigibG9hZCIpfSxfcGFnZVNpemVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YyYmYSE9PWMmJnRoaXMuY2xlYXJDYWNoZSgpfSxfY2hlY2tTaXplOmZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5zaXplJiZjb25zb2xlLndhcm4oJ1RoZSBceDNjdmFhZGluLWdyaWRceDNlIG5lZWRzIGEgdmFsdWUgZm9yICJzaXplIiBwcm9wZXJ0eSBpbiBvcmRlciB0byBkaXNwbGF5IHJvd3MuJyl9LF9kYXRhUHJvdmlkZXJDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YyYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGF8fAoodGhpcy5fbG9hZGluZz0hMCx0aGlzLl9sb2FkUGFnZSgwLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGE9ITB9LmJpbmQodGhpcykpKX19Owo8L3NjcmlwdD4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zZWxlY3Rpb24tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3NlbGVjdGVkSXRlbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl9zZWxlY3RlZEl0ZW1zQ2hhbmdlZChzZWxlY3RlZEl0ZW1zLiopIl0sbGlzdGVuZXJzOnsidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCI6Il90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZFNlbGVjdGlvbiJ9LF90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZFNlbGVjdGlvbjpmdW5jdGlvbihhKXtpZigic2VsZWN0ZWQiPT09YS5kZXRhaWwucHJvcCl7dmFyIGM9YS5kZXRhaWwuaW5zdC5pdGVtOyh0aGlzLl9pc1NlbGVjdGVkKGMpP3RoaXMuZGVzZWxlY3RJdGVtOnRoaXMuc2VsZWN0SXRlbSkuYmluZCh0aGlzKShjKTt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0Oih0aGlzLl9pc1NlbGVjdGVkKGMpPyJTZWxlY3RlZCI6IkRlc2VsZWN0ZWQiKSsiIFJvdyAiKwooYS5kZXRhaWwuaW5zdC5pbmRleCsxKSsiIG9mICIrdGhpcy5zaXplfSk7YS5zdG9wUHJvcGFnYXRpb24oKX19LF9pc1NlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNlbGVjdGVkSXRlbXMmJi0xPHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGEpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGEpe2E9dGhpcy5fdGFrZUl0ZW0oYSk7dGhpcy5faXNTZWxlY3RlZChhKXx8dGhpcy5wdXNoKCJzZWxlY3RlZEl0ZW1zIixhKX0sZGVzZWxlY3RJdGVtOmZ1bmN0aW9uKGEpe2E9dGhpcy5fdGFrZUl0ZW0oYSk7YT10aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihhKTstMTxhJiZ0aGlzLnNwbGljZSgic2VsZWN0ZWRJdGVtcyIsYSwxKX0sX3RvZ2dsZUl0ZW06ZnVuY3Rpb24oYSl7YT10aGlzLl90YWtlSXRlbShhKTstMT09PXRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGEpP3RoaXMuc2VsZWN0SXRlbShhKTp0aGlzLmRlc2VsZWN0SXRlbShhKX0sX3Rha2VJdGVtOmZ1bmN0aW9uKGEpe3JldHVybiJudW1iZXIiPT09CnR5cGVvZiBhJiYwPD1hJiZ0aGlzLml0ZW1zJiZ0aGlzLml0ZW1zLmxlbmd0aD5hP3RoaXMuaXRlbXNbYV06YX0sX3NlbGVjdGVkSXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGEpeyF0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXN8fCJzZWxlY3RlZEl0ZW1zIiE9PWEucGF0aCYmInNlbGVjdGVkSXRlbXMuc3BsaWNlcyIhPT1hLnBhdGh8fHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2Muc2VsZWN0ZWQ9dGhpcy5faXNTZWxlY3RlZChjLml0ZW0pfS5iaW5kKHRoaXMpKX19Owo8L3NjcmlwdD4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3dbc2VsZWN0ZWRdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDAsIHJnYigyNDMsIDI0MywgMjQzKSk7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctc2VsZWN0ZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLW5hdmlnYXRpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KDpmb2N1cyksCiAgICAgICN0YWJsZTpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW25hdmlnYXRpbmddOm5vdChbaW50ZXJhY3RpbmddKSkgW2ZvY3VzZWRdID4gLnZhYWRpbi1ncmlkLXJvd1tmb2N1c2VkXSA+IFtmb2N1c2VkXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb2N1c2VkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1rZXlib2FyZC1uYXZpZ2F0aW9uLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvckltcGw9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJhcHBsaWNhdGlvbiIsdGFiaW5kZXg6MH0sa2V5QmluZGluZ3M6eyJjdHJsK2hvbWUiOiJfb25DdHJsSG9tZSIsImN0cmwrZW5kIjoiX29uQ3RybEVuZCIsZG93bjoiX29uQXJyb3dEb3duIixlbmQ6Il9vbkVuZCIsZW50ZXI6Il9vbkVudGVyIixlc2M6Il9vbkVzY2FwZSIsZjI6Il9vbkYyIixob21lOiJfb25Ib21lIixsZWZ0OiJfb25BcnJvd0xlZnQiLHBhZ2Vkb3duOiJfb25QYWdlRG93biIscGFnZXVwOiJfb25QYWdlVXAiLHJpZ2h0OiJfb25BcnJvd1JpZ2h0IixzcGFjZToiX29uU3BhY2UiLHRhYjoiX29uVGFiIix1cDoiX29uQXJyb3dVcCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5KCl9LHByb3BlcnRpZXM6e192aXJ0dWFsRm9jdXM6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfdmlydHVhbEZvY3VzQ2hhbmdlZCJ9LAppbnRlcmFjdGluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0sbmF2aWdhdGluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX19LGxpc3RlbmVyczp7Zm9jdXM6Il9vbkZvY3VzIiwiY2VsbC1mb2N1cyI6Il9vbkNlbGxGb2N1cyIsImNlbGwtY29udGVudC1mb2N1cyI6Il9vbkNlbGxDb250ZW50Rm9jdXMifSxyZWFkeTpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGEpezk9PT1hLmtleUNvZGUmJih0aGlzLl90YWJiZWQ9ITApOzk9PT1hLmtleUNvZGUmJmEuc2hpZnRLZXkmJih0aGlzLl9zaGlmdFRhYmJlZD0hMCl9LmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixmdW5jdGlvbihhKXs5PT09YS5rZXlDb2RlJiYodGhpcy5fdGFiYmVkPSExKTs5PT09YS5rZXlDb2RlJiZhLnNoaWZ0S2V5JiYodGhpcy5fc2hpZnRUYWJiZWQ9CiExKX0uYmluZCh0aGlzKSwhMCl9LF9pc0Zvb3RlclZpc2libGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLiQuZm9vdGVyLl9yb3dzLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4hYS5oaWRkZW59KS5sZW5ndGh9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fdGFiYmVkJiYhdGhpcy5fc2hpZnRUYWJiZWQmJnRoaXMuX2FjdGl2YXRlTmF2aWdhdGlvbigpfSxfYWN0aXZhdGVOYXZpZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy4kLmZvb3RlckZvY3VzVHJhcC5mb2N1cygpfSxfb25Gb2N1c291dDpmdW5jdGlvbigpe3RoaXMuaW50ZXJhY3Rpbmc9dGhpcy5uYXZpZ2F0aW5nPSExfSxfb25Gb290ZXJGb2N1czpmdW5jdGlvbigpe3RoaXMubmF2aWdhdGluZz0hMDt0aGlzLmludGVyYWN0aW5nPSExO3RoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLl92aXJ0dWFsRm9jdXN8fCh0aGlzLl9zaGlmdFRhYmJlZD90aGlzLl9pc0Zvb3RlclZpc2libGUoKT90aGlzLiQuZm9vdGVyOnRoaXMuJC5pdGVtczoKdGhpcy4kLmhlYWRlcil9LF92aXJ0dWFsRm9jdXNDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7YyYmKGMuZm9jdXNlZD0hMSk7YSYmKGEuX2ZvY3VzZWRDZWxsSW5kZXg9YS5fZm9jdXNlZENlbGxJbmRleHx8MCxhLl9mb2N1c2VkUm93SW5kZXg9YS5fZm9jdXNlZFJvd0luZGV4fHwwLGEuZm9jdXNlZD0hMCxhPT09dGhpcy4kLml0ZW1zJiZ0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25UYWI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuaW50ZXJhY3RpbmcmJnRoaXMuX3ZpcnR1YWxGb2N1cylpZih0aGlzLm5hdmlnYXRpbmcpaWYoYS5kZXRhaWwua2V5Ym9hcmRFdmVudC5zaGlmdEtleSlzd2l0Y2godGhpcy5fdmlydHVhbEZvY3VzKXtjYXNlIHRoaXMuJC5mb290ZXI6dGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5pdGVtczthLnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSB0aGlzLiQuaXRlbXM6dGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5oZWFkZXI7YS5wcmV2ZW50RGVmYXVsdCgpOwpicmVhaztjYXNlIHRoaXMuJC5oZWFkZXI6dGhpcy5mb2N1cygpLHRoaXMuX3ZpcnR1YWxGb2N1cz1udWxsfWVsc2Ugc3dpdGNoKHRoaXMuX3ZpcnR1YWxGb2N1cyl7Y2FzZSB0aGlzLiQuaGVhZGVyOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaXRlbXM7YS5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgdGhpcy4kLml0ZW1zOnRoaXMuX2lzRm9vdGVyVmlzaWJsZSgpPyh0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLmZvb3RlcixhLnByZXZlbnREZWZhdWx0KCkpOnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH0sMSk7YnJlYWs7Y2FzZSB0aGlzLiQuZm9vdGVyOnRoaXMuX3ZpcnR1YWxGb2N1cz1udWxsfWVsc2UgdGhpcy5fYWN0aXZhdGVOYXZpZ2F0aW9uKCksYS5wcmV2ZW50RGVmYXVsdCgpfSxfaXNBYm92ZVZpZXdwb3J0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmZpcnN0VmlzaWJsZUluZGV4PmF9LF9vbkFycm93RG93bjpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwKKGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzRG93bigpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9zY3JvbGxQYWdlRG93bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz10aGlzLiQuZm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbFRvcCs9Yy50b3AtYS5ib3R0b207dGhpcy4kLnNjcm9sbGVyLl9zY3JvbGxIYW5kbGVyKCl9LF9vblBhZ2VEb3duOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcz8oYT10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleCx0aGlzLl9zY3JvbGxQYWdlRG93bigpLHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4Kz0KdGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXgtYXx8dGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXgtdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgsdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKTp0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNQYWdlRG93bigpKX0sX3Njcm9sbFBhZ2VVcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz10aGlzLiQuZm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbFRvcC09Yy50b3AtYS5ib3R0b207dGhpcy4kLnNjcm9sbGVyLl9zY3JvbGxIYW5kbGVyKCl9LF9vblBhZ2VVcDpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXM/KGE9dGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXgsCnRoaXMuX3Njcm9sbFBhZ2VVcCgpLHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LT1hLXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4fHx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpOnRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1BhZ2VVcCgpKX0sX29uQXJyb3dVcDpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNVcCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vbkFycm93UmlnaHQ6ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZ3x8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUmlnaHQoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSwKX29uQXJyb3dMZWZ0OmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0xlZnQoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25Ib21lOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0hvbWUoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25FbmQ6ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZ3x8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzRW5kKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX21vdmVGb2N1c1RvRm9jdXNUYXJnZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsLl9jZWxsQ29udGVudDsKKGE9YS5xdWVyeVNlbGVjdG9yKCJbZm9jdXMtdGFyZ2V0XSIpfHxhLmZpcnN0RWxlbWVudENoaWxkKSYmYS5mb2N1cygpfSxfb25FbnRlcjpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nPyJpbnB1dCI9PT1hLmRldGFpbC5rZXlib2FyZEV2ZW50LnRhcmdldC5sb2NhbE5hbWUmJiJ0ZXh0Ij09PWEuZGV0YWlsLmtleWJvYXJkRXZlbnQudGFyZ2V0LnR5cGUmJnRoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKTooYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX21vdmVGb2N1c1RvRm9jdXNUYXJnZXQoKSl9LF9vbkVzY2FwZTpmdW5jdGlvbigpe3RoaXMuaW50ZXJhY3Rpbmc/dGhpcy4kLmZvb3RlckZvY3VzVHJhcC5mb2N1cygpOnRoaXMubmF2aWdhdGluZyYmKHRoaXMubmF2aWdhdGluZz0hMSl9LF9vbkYyOmZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTt0aGlzLmludGVyYWN0aW5nP3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKTp0aGlzLl9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0KCl9LApfb25DdHJsSG9tZTpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNGaXJzdCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vbkN0cmxFbmQ6ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZ3x8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzTGFzdCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vblNwYWNlOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmludGVyYWN0aW5nKXthLnByZXZlbnREZWZhdWx0KCk7YT10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsO3ZhciBjPWEuZ2V0Q29udGVudENoaWxkcmVuKFBvbHltZXIuRWxlbWVudD8ic2xvdCI6ImNvbnRlbnQiKVswXS5maXJzdEVsZW1lbnRDaGlsZDtjP2MuY2xpY2soKTp0aGlzLm5hdmlnYXRpbmcmJgp0aGlzLmZpcmUoImNlbGwtYWN0aXZhdGUiLHttb2RlbDphLmluc3RhbmNlfSl9fSxfb25DZWxsQ29udGVudEZvY3VzOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmc9ITA7dGhpcy5fb25DZWxsRm9jdXMoYSl9LF9vbkNlbGxGb2N1czpmdW5jdGlvbihhKXthPWEuZGV0YWlsLmNlbGw7dmFyIGM9YS5wYXJlbnRFbGVtZW50LGQ9Yy5wYXJlbnRFbGVtZW50LGY9QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChQb2x5bWVyLmRvbShkKS5jaGlsZHJlbixjKTtkPT09dGhpcy4kLml0ZW1zJiYoZj1jLmluZGV4KTtkLl9mb2N1c2VkUm93SW5kZXg9ZjtkLl9mb2N1c2VkQ2VsbEluZGV4PUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oYykuY2hpbGRyZW4sYSk7dGhpcy5fdmlydHVhbEZvY3VzPWQ7YS5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikmJihkLl9mb2N1c2VkQ2VsbEluZGV4PTAsZC5fbW92ZUZvY3VzVG9EZXRhaWxzQ2VsbCgpKX0sX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy4kLnNjcm9sbGVyLl92aWR4T2Zmc2V0K3RoaXMuJC5zY3JvbGxlci5fdmlydHVhbFN0YXJ0LGM9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXg7dGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zJiYoYzxhfHxjPmErdGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbENvdW50KSYmKHRoaXMuJC5zY3JvbGxlci5zY3JvbGxUb1NjYWxlZEluZGV4KGMpLHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGxDaGFuZ2VkKGMsdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbEluZGV4KSk7dGhpcy5fZW5zdXJlRWxlbWVudEluVmlld3BvcnQodGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbCl9LF9lbnN1cmVFbGVtZW50SW5WaWV3cG9ydDpmdW5jdGlvbihhKXt2YXIgYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKHRoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcyl7dmFyIGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AsCmY9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207Yy5ib3R0b20+ZD90aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWMuYm90dG9tLWQ6Yy50b3A8ZiYmKHRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbFRvcCs9Yy50b3AtZil9aWYoIWEuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpKXthPXRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0O2Q9dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtpZihmPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvdy5xdWVyeVNlbGVjdG9yKCJbbGFzdC1mcm96ZW5dIikpZD1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0O2MucmlnaHQ+YT90aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxMZWZ0Kz1jLnJpZ2h0LWE6Yy5sZWZ0PGQmJih0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxMZWZ0Kz0KYy5sZWZ0LWQpfX19O3ZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvcj1bdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9ySW1wbCxQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yXTsKPC9zY3JpcHQ+Cgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtY29sdW1uLXJlb3JkZXJpbmctdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW3Jlb3JkZXJpbmddIC52YWFkaW4tZ3JpZC1jZWxsIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CgogICAgICA6aG9zdChbcmVvcmRlcmluZ10pIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbcmVvcmRlcmluZ10gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgIH0KCiAgICAgICNzY3JvbGxlciAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iYWxsb3dlZCJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImRyYWdnaW5nIl0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktY29sb3IsICMwMDApOwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImRyYWdnaW5nIl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIG9wYWNpdHk6IDAuOTU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntjb2x1bW5SZW9yZGVyaW5nQWxsb3dlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX19Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcj17cHJvcGVydGllczp7X29yZGVyQmFzZVNjb3BlOnt0eXBlOk51bWJlcix2YWx1ZToxRTd9fSxsaXN0ZW5lcnM6e2RyYWdzdGFydDoiX29uRHJhZ1N0YXJ0IixkcmFnb3ZlcjoiX29uRHJhZ092ZXIiLGRyYWdlbmQ6Il9vbkRyYWdFbmQifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3JkZXJzKGNvbHVtblRyZWUsIGNvbHVtblRyZWUuKikiXSxfdXBkYXRlT3JkZXJzOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmYVswXS5mb3JFYWNoKGZ1bmN0aW9uKGQsZil7ZC5fb3JkZXI9KGYrMSkqdGhpcy5fb3JkZXJCYXNlU2NvcGV9LHRoaXMpfSxfb25EcmFnU3RhcnQ6ZnVuY3Rpb24oYSl7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCI9PT1hLnRhcmdldC5sb2NhbE5hbWUpe3ZhciBjPXRoaXMuX2dldENlbGxCeUNlbGxDb250ZW50KGEudGFyZ2V0KTtjJiYodGhpcy50b2dnbGVBdHRyaWJ1dGUoInJlb3JkZXJpbmciLAohMCksdGhpcy5fZHJhZ2dlZENvbHVtbj1jLmNvbHVtbix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiYWxsb3dlZCIpLHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXM9ImRyYWdnaW5nIixhLmRhdGFUcmFuc2ZlciYmKGEuZGF0YVRyYW5zZmVyLnNldERhdGEoInRleHQiLCIiKSxhLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPSJtb3ZlIiksdGhpcy5fYXV0b1Njcm9sbGVyKCkpfX0sX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1czpmdW5jdGlvbihhLGMpe0FycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbShQb2x5bWVyLmRvbShhKS5wYXJlbnROb2RlKS5jaGlsZHJlbixmdW5jdGlvbihkKXtyZXR1cm4vY29sdW1uLy50ZXN0KGQubG9jYWxOYW1lKSYmdGhpcy5faXNTd2FwQWxsb3dlZChkLGEpfSx0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuX3Jlb3JkZXJTdGF0dXM9Y30pfSxfb25EcmFnT3ZlcjpmdW5jdGlvbihhKXtpZih0aGlzLl9kcmFnZ2VkQ29sdW1uKXt2YXIgYz0KKFBvbHltZXIuRWxlbWVudD9hLmNvbXBvc2VkUGF0aCgpOlBvbHltZXIuZG9tKGEpLnBhdGgpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4idmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWQubG9jYWxOYW1lfSlbMF07YyYmKGEucHJldmVudERlZmF1bHQoKSxjPXRoaXMuX2dldENlbGxCeUNlbGxDb250ZW50KGMpLChjPXRoaXMuX2dldFRhcmdldENvbHVtbihjLHRoaXMuX2RyYWdnZWRDb2x1bW4pKSYmdGhpcy5faXNTd2FwQWxsb3dlZCh0aGlzLl9kcmFnZ2VkQ29sdW1uLGMpJiZ0aGlzLl9pc1N3YXBwYWJsZUJ5UG9zaXRpb24oYyxhLmNsaWVudFgpJiZ0aGlzLl9zd2FwQ29sdW1uT3JkZXJzKHRoaXMuX2RyYWdnZWRDb2x1bW4sYyksdGhpcy5fbGFzdERyYWdDbGllbnRYPWEuY2xpZW50WCl9fSxfYXV0b1Njcm9sbGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5fbGFzdERyYWdDbGllbnRYKXt2YXIgYT10aGlzLl9sYXN0RHJhZ0NsaWVudFgtdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCsKNTAsYz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdGhpcy5fbGFzdERyYWdDbGllbnRYKzUwOzA8YT90aGlzLiQudGFibGUuc2Nyb2xsTGVmdCs9YS8xMDowPGMmJih0aGlzLiQudGFibGUuc2Nyb2xsTGVmdC09Yy8xMCk7dGhpcy5fc2Nyb2xsSGFuZGxlcigpfXRoaXMuX2RyYWdnZWRDb2x1bW4mJnRoaXMuYXN5bmModGhpcy5fYXV0b1Njcm9sbGVyLDEwKX0sX29uRHJhZ0VuZDpmdW5jdGlvbigpe3RoaXMuX2RyYWdnZWRDb2x1bW4mJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsITEpLHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXM9IiIsdGhpcy5fc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzKHRoaXMuX2RyYWdnZWRDb2x1bW4sIiIpLHRoaXMuX2xhc3REcmFnQ2xpZW50WD10aGlzLl9kcmFnZ2VkQ29sdW1uPW51bGwpfSxfaXNTd2FwQWxsb3dlZDpmdW5jdGlvbihhLGMpe2lmKGEmJmMpe3ZhciBkPWEucGFyZW50RWxlbWVudD09PWMucGFyZW50RWxlbWVudCwKZj1hLmZyb3plbj09PWMuZnJvemVuO3JldHVybiBhIT09YyYmZCYmZn19LF9pc1N3YXBwYWJsZUJ5UG9zaXRpb246ZnVuY3Rpb24oYSxjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcy4kLmhlYWRlcikucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLWNlbGwiKSxmdW5jdGlvbihnKXtyZXR1cm4gZy5jb2x1bW49PT1hfSlbMF0sZj10aGlzLiQuaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoIltyZW9yZGVyLXN0YXR1c1x4M2RkcmFnZ2luZ10iKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0PmYubGVmdD9jPmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQtZi53aWR0aDpjPGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCtmLndpZHRofSxfZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQ6ZnVuY3Rpb24oYSl7aWYoUG9seW1lci5FbGVtZW50KXJldHVybiBhLmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlOwphPVBvbHltZXIuZG9tKGEpLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzKClbMF07cmV0dXJuIFBvbHltZXIuZG9tKGEpLnBhcmVudE5vZGV9LF9zd2FwQ29sdW1uT3JkZXJzOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5fb3JkZXI7YS5fb3JkZXI9Yy5fb3JkZXI7Yy5fb3JkZXI9ZDt0aGlzLl91cGRhdGVMYXN0RnJvemVuKCk7dGhpcy5fdXBkYXRlTGFzdENvbHVtbigpfSxfZ2V0VGFyZ2V0Q29sdW1uOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYyl7Zm9yKHZhciBkPWEuY29sdW1uO2QucGFyZW50RWxlbWVudCE9PWMucGFyZW50RWxlbWVudCYmZCE9PXRoaXMudGFyZ2V0OylkPWQucGFyZW50RWxlbWVudDtyZXR1cm4gZC5wYXJlbnRFbGVtZW50PT09Yy5wYXJlbnRFbGVtZW50P2Q6YS5jb2x1bW59fX07Cjwvc2NyaXB0PgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL2lyb24tbGlzdC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9ySW1wbD1mdW5jdGlvbigpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLyksYz1hJiY4PD1hWzFdO3JldHVybntpczoiaXJvbi1saXN0Iixwcm9wZXJ0aWVzOnttYXhQaHlzaWNhbENvdW50Ont0eXBlOk51bWJlcix2YWx1ZTo1MDB9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9fSxfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9waHlzaWNhbEluZGV4Rm9yS2V5Om51bGwsX2VzdFNjcm9sbEhlaWdodDowLF9zY3JvbGxIZWlnaHQ6MCxfdmlld3BvcnRIZWlnaHQ6MCxfdmlld3BvcnRXaWR0aDowLApfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2xhc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfY29sbGVjdGlvbjpudWxsLF9pdGVtc1JlbmRlcmVkOiExLF9sYXN0UGFnZTpudWxsLF9tYXhQYWdlczozLF9pdGVtc1BlclJvdzoxLF9pdGVtV2lkdGg6MCxfcm93SGVpZ2h0OjAsZ2V0IF9waHlzaWNhbEJvdHRvbSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9waHlzaWNhbFNpemV9LGdldCBfc2Nyb2xsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX3ZpcnR1YWxFbmQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMX0sZ2V0IF9oaWRkZW5Db250ZW50U2l6ZSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFNpemUtdGhpcy5fdmlld3BvcnRIZWlnaHR9LGdldCBfbWF4U2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2VzdFNjcm9sbEhlaWdodC0KdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wfSxfbWluVmlydHVhbFN0YXJ0OjAsZ2V0IF9tYXhWaXJ0dWFsU3RhcnQoKXtyZXR1cm4gTWF0aC5tYXgoMCx0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudCl9LF92aXJ0dWFsU3RhcnRWYWw6MCxzZXQgX3ZpcnR1YWxTdGFydChkKXt0aGlzLl92aXJ0dWFsU3RhcnRWYWw9TWF0aC5taW4odGhpcy5fbWF4VmlydHVhbFN0YXJ0LE1hdGgubWF4KHRoaXMuX21pblZpcnR1YWxTdGFydCxkKSl9LGdldCBfdmlydHVhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydFZhbHx8MH0sX3BoeXNpY2FsU3RhcnRWYWw6MCxzZXQgX3BoeXNpY2FsU3RhcnQoZCl7dGhpcy5fcGh5c2ljYWxTdGFydFZhbD1kJXRoaXMuX3BoeXNpY2FsQ291bnQ7MD50aGlzLl9waHlzaWNhbFN0YXJ0VmFsJiYodGhpcy5fcGh5c2ljYWxTdGFydFZhbD10aGlzLl9waHlzaWNhbENvdW50K3RoaXMuX3BoeXNpY2FsU3RhcnRWYWwpOwp0aGlzLl9waHlzaWNhbEVuZD0odGhpcy5fcGh5c2ljYWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LGdldCBfcGh5c2ljYWxTdGFydCgpe3JldHVybiB0aGlzLl9waHlzaWNhbFN0YXJ0VmFsfHwwfSxfcGh5c2ljYWxDb3VudFZhbDowLHNldCBfcGh5c2ljYWxDb3VudChkKXt0aGlzLl9waHlzaWNhbENvdW50VmFsPWQ7dGhpcy5fcGh5c2ljYWxFbmQ9KHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxnZXQgX3BoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxDb3VudFZhbH0sX3BoeXNpY2FsRW5kOjAsZ2V0IF9vcHRQaHlzaWNhbFNpemUoKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRIZWlnaHQqdGhpcy5fbWF4UGFnZXN9LGdldCBfb3B0UGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9lc3RSb3dzSW5WaWV3KnRoaXMuX2l0ZW1zUGVyUm93KnRoaXMuX21heFBhZ2VzfSwKZ2V0IF9pc1Zpc2libGUoKXtyZXR1cm4gdGhpcy5zY3JvbGxUYXJnZXQmJiEoIXRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldFdpZHRoJiYhdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7aWYobnVsbD09PXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsKXt2YXIgZD1NYXRoLmZsb29yKHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcCk7dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGYsZyl7ZCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGYpO2lmKGQ+dGhpcy5fc2Nyb2xsUG9zaXRpb24pcmV0dXJuIGd9KXx8MH1yZXR1cm4gdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWx9LGdldCBsYXN0VmlzaWJsZUluZGV4KCl7aWYobnVsbD09PXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWwpe3ZhciBkPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihmLApnKXtpZihkPHRoaXMuX3Njcm9sbEJvdHRvbSl0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPWc7ZWxzZSByZXR1cm4hMDtkKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZil9KX1yZXR1cm4gdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbH0sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpO3RoaXMuX3JlbmRlcigpO3RoaXMubGlzdGVuKHRoaXMsImlyb24tcmVzaXplIiwKIl9yZXNpemVIYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5faXRlbXNSZW5kZXJlZD0hMTt0aGlzLnVubGlzdGVuKHRoaXMsImlyb24tcmVzaXplIiwiX3Jlc2l6ZUhhbmRsZXIiKX0sdXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wPXRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcz8wOnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpWyJwYWRkaW5nLXRvcCJdfHwwLDEwKTt0aGlzLl92aWV3cG9ydEhlaWdodD10aGlzLl9zY3JvbGxUYXJnZXRIZWlnaHR9LF91cGRhdGU6ZnVuY3Rpb24oZCxmKXt0aGlzLl9hc3NpZ25Nb2RlbHMoZCk7dGhpcy5fdXBkYXRlTWV0cmljcyhkKTtpZihmKWZvcig7Zi5sZW5ndGg7KWQ9Zi5wb3AoKSx0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGQpO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKTsKdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoKX0sX2luY3JlYXNlUG9vbElmTmVlZGVkOmZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuX3ZpZXdwb3J0SGVpZ2h0KXJldHVybiExO3ZhciBkPXRoaXMuX3BoeXNpY2FsU2l6ZXMucmVkdWNlKGZ1bmN0aW9uKGcsbCl7cmV0dXJuIGcrKGx8fDEwMCl9LDApLGY9ZD50aGlzLl92aWV3cG9ydEhlaWdodDtpZihkPj10aGlzLl9vcHRQaHlzaWNhbFNpemUmJmYpcmV0dXJuITE7ZD1NYXRoLmZsb29yKHRoaXMuX3BoeXNpY2FsU2l6ZS90aGlzLl92aWV3cG9ydEhlaWdodCk7MD09PWQ/dGhpcy5fZGVib3VuY2VUZW1wbGF0ZSh0aGlzLl9pbmNyZWFzZVBvb2wuYmluZCh0aGlzLE1hdGgucm91bmQoLjUqdGhpcy5fcGh5c2ljYWxDb3VudCkpKTp0aGlzLl9sYXN0UGFnZSE9PWQmJmY/UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UoIl9kZWJvdW5jZVRlbXBsYXRlIix0aGlzLl9pbmNyZWFzZVBvb2wuYmluZCh0aGlzLHRoaXMuX2l0ZW1zUGVyUm93KSwKMTYpKTp0aGlzLl9kZWJvdW5jZVRlbXBsYXRlKHRoaXMuX2luY3JlYXNlUG9vbC5iaW5kKHRoaXMsTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0Lyh0aGlzLl9waHlzaWNhbFNpemUvdGhpcy5fcGh5c2ljYWxDb3VudCkqdGhpcy5fbWF4UGFnZXMtdGhpcy5fcGh5c2ljYWxDb3VudCl8fDEpKTt0aGlzLl9sYXN0UGFnZT1kO3JldHVybiEwfSxfZGVib3VuY2VUZW1wbGF0ZTpmdW5jdGlvbihkKXtQb2x5bWVyLmRvbS5hZGREZWJvdW5jZXIodGhpcy5kZWJvdW5jZSgiX2RlYm91bmNlVGVtcGxhdGUiLGQpKX0sX2luY3JlYXNlUG9vbDpmdW5jdGlvbihkKXt2YXIgZj10aGlzLl9waHlzaWNhbENvdW50O2Q9TWF0aC5taW4odGhpcy5fcGh5c2ljYWxDb3VudCtkLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsTWF0aC5tYXgodGhpcy5tYXhQaHlzaWNhbENvdW50LDI1KSktZjswPj1kfHwoW10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbEl0ZW1zLHRoaXMuX2NyZWF0ZVBvb2woZCkpLApbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsU2l6ZXMsQXJyYXkoZCkpLHRoaXMuX3BoeXNpY2FsQ291bnQ9ZitkLHRoaXMuX3VwZGF0ZSgpKX0sX3JlbmRlcjpmdW5jdGlvbigpe3ZhciBkPTA8dGhpcy5fdmlydHVhbENvdW50fHwwPHRoaXMuX3BoeXNpY2FsQ291bnQ7dGhpcy5pc0F0dGFjaGVkJiYhdGhpcy5faXRlbXNSZW5kZXJlZCYmdGhpcy5faXNWaXNpYmxlJiZkJiYodGhpcy5fbGFzdFBhZ2U9MCx0aGlzLl91cGRhdGUoKSx0aGlzLl9pdGVtc1JlbmRlcmVkPSEwKX0sX2l0ZXJhdGVJdGVtczpmdW5jdGlvbihkLGYpe3ZhciBnLGw7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgmJmYpZm9yKGw9MDtsPGYubGVuZ3RoO2wrKyl7dmFyIGs9ZltsXTt2YXIgbT10aGlzLl9jb21wdXRlVmlkeChrKTtpZihudWxsIT0oZz1kLmNhbGwodGhpcyxrLG0pKSlyZXR1cm4gZ31lbHNle2s9dGhpcy5fcGh5c2ljYWxTdGFydDtmb3IobT10aGlzLl92aXJ0dWFsU3RhcnQ7azx0aGlzLl9waHlzaWNhbENvdW50O2srKywKbSsrKWlmKG51bGwhPShnPWQuY2FsbCh0aGlzLGssbSkpKXJldHVybiBnO2ZvcihrPTA7azx0aGlzLl9waHlzaWNhbFN0YXJ0O2srKyxtKyspaWYobnVsbCE9KGc9ZC5jYWxsKHRoaXMsayxtKSkpcmV0dXJuIGd9fSxfY29tcHV0ZVZpZHg6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ+PXRoaXMuX3BoeXNpY2FsU3RhcnQ/dGhpcy5fdmlydHVhbFN0YXJ0KyhkLXRoaXMuX3BoeXNpY2FsU3RhcnQpOnRoaXMuX3ZpcnR1YWxTdGFydCsodGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl9waHlzaWNhbFN0YXJ0KStkfSxfdXBkYXRlTWV0cmljczpmdW5jdGlvbihkKXt0aGlzLnNjcm9sbGluZyYmUG9seW1lci5kb20uZmx1c2goKTt2YXIgZj0wLGc9MCxsPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LGs9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihtKXtnKz10aGlzLl9waHlzaWNhbFNpemVzW21dfHwwO3RoaXMuX3BoeXNpY2FsU2l6ZXNbbV09dGhpcy5fcGh5c2ljYWxJdGVtc1ttXS5vZmZzZXRIZWlnaHQ7CmYrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbV07dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbV0/MTowfSxkKTt0aGlzLl92aWV3cG9ydEhlaWdodD10aGlzLl9zY3JvbGxUYXJnZXRIZWlnaHQ7dGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZStmLWc7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1sJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKGsqbCtmKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfcG9zaXRpb25JdGVtczpmdW5jdGlvbigpe3RoaXMuX2FkanVzdFNjcm9sbFBvc2l0aW9uKCk7dmFyIGQ9dGhpcy5fcGh5c2ljYWxUb3A7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGYpe3RoaXMuX3BoeXNpY2FsSXRlbXNbZl0uc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgwLGQpO2QrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbZl19KX0sX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudDpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTaXplc1tkXX0sCl9zaG91bGRSZW5kZXJOZXh0Um93OmZ1bmN0aW9uKGQpe3JldHVybiBkJXRoaXMuX2l0ZW1zUGVyUm93PT09dGhpcy5faXRlbXNQZXJSb3ctMX0sX2FkanVzdFNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGQ9MD09PXRoaXMuX3ZpcnR1YWxTdGFydD90aGlzLl9waHlzaWNhbFRvcDpNYXRoLm1pbih0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl9waHlzaWNhbFRvcCwwKTtkJiYodGhpcy5fcGh5c2ljYWxUb3AtPWQsY3x8MD09PXRoaXMuX3BoeXNpY2FsVG9wfHx0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3Njcm9sbFRvcC1kKSl9LF9yZXNldFNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKGQpe3RoaXMuc2Nyb2xsVGFyZ2V0JiYodGhpcy5fc2Nyb2xsUG9zaXRpb249dGhpcy5fc2Nyb2xsVG9wPWQpfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKGQpe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtCnRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fdmlydHVhbFN0YXJ0LDApKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtpZigoZD0oZD1kfHwwPT09dGhpcy5fc2Nyb2xsSGVpZ2h0KXx8dGhpcy5fc2Nyb2xsUG9zaXRpb24+PXRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9waHlzaWNhbFNpemUpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fb3B0UGh5c2ljYWxTaXplKXRoaXMuJC5pdGVtcy5zdHlsZS5oZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KyJweCIsdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodH0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbihkKXtQb2x5bWVyLmRvbS5mbHVzaCgpO2Q9TWF0aC5taW4oTWF0aC5tYXgoZCwwKSx0aGlzLl92aXJ0dWFsQ291bnQtMSk7aWYoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZChkKXx8ZD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KXRoaXMuX3ZpcnR1YWxTdGFydD0KZC0xO3RoaXMuX2Fzc2lnbk1vZGVscygpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoKTt0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2Zvcih2YXIgZj10aGlzLl9waHlzaWNhbFN0YXJ0LGc9dGhpcy5fdmlydHVhbFN0YXJ0LGw9MCxrPXRoaXMuX2hpZGRlbkNvbnRlbnRTaXplO2c8ZCYmbDw9azspbCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGYpLGY9KGYrMSkldGhpcy5fcGh5c2ljYWxDb3VudCxnKys7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCEwKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3ArbCk7dGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoKTt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPQpudWxsfSxfcmVzZXRBdmVyYWdlOmZ1bmN0aW9uKCl7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQ9dGhpcy5fcGh5c2ljYWxBdmVyYWdlPTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UoIl9kZWJvdW5jZVRlbXBsYXRlIixmdW5jdGlvbigpe3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5fcmVuZGVyKCk7dGhpcy5faXRlbXNSZW5kZXJlZCYmdGhpcy5fcGh5c2ljYWxJdGVtcyYmdGhpcy5faXNWaXNpYmxlJiYodGhpcy5fcmVzZXRBdmVyYWdlKCksdGhpcy5zY3JvbGxUb0luZGV4KHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgpKX0uYmluZCh0aGlzKSwxKSl9LHVwZGF0ZVNpemVGb3JJdGVtOmZ1bmN0aW9uKGQpe2Q9dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleVtkXTtudWxsIT1kJiYodGhpcy5fdXBkYXRlTWV0cmljcyhbZF0pLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSl9LF9pc0luZGV4UmVuZGVyZWQ6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ+PQp0aGlzLl92aXJ0dWFsU3RhcnQmJmQ8PXRoaXMuX3ZpcnR1YWxFbmR9LF9pc0luZGV4VmlzaWJsZTpmdW5jdGlvbihkKXtyZXR1cm4gZD49dGhpcy5maXJzdFZpc2libGVJbmRleCYmZDw9dGhpcy5sYXN0VmlzaWJsZUluZGV4fX19KCk7dmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvcj1bUG9seW1lci5UZW1wbGF0aXplcixQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9ySW1wbF07Cjwvc2NyaXB0PgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIEBrZXlmcmFtZXMgYXBwZWFyIHsKICAgICAgICB0byB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBhbmltYXRpb246IDFtcyBhcHBlYXI7CiAgICAgIH0KCiAgICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWF4LWRldmljZS1waXhlbC1yYXRpbzogMSkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgfQogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI2l0ZW1zIHsKICAgICAgICBib3JkZXItdG9wOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1ib3R0b206IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgICNpdGVtcyA+IC52YWFkaW4tZ3JpZC1yb3cgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtY2VsbCwKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1jZWxsIHsKICAgICAgICB0b3A6IDA7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY2VsbCA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlOjpiZWZvcmUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDM1cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgICB9CgogICAgICBbbGFzdGNvbHVtbl0gLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlOjpiZWZvcmUsCiAgICAgIFtsYXN0LWZyb3plbl0gLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlOjpiZWZvcmUgewogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2NvbHVtbi1yZW9yZGVyaW5nLWFsbG93ZWRdICNoZWFkZXIsCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2NvbHVtbi1yZXNpemluZ10gewogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2NvbHVtbi1yZXNpemluZ10gewogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLXJvdzpub3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBbZnJvemVuXSB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW25vLWNvbnRlbnQtcG9pbnRlci1ldmVudHNdIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KFtpb3NdW2NvbHVtbi1yZXNpemluZ10pICNvdXRlcnNjcm9sbGVyIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAjZml4ZWRzaXplciwKICAgICAgI291dGVyc2l6ZXIgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI3RhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgI3RhYmxlW292ZXJmbG93LWhpZGRlbl0sCiAgICAgICNvdXRlcnNjcm9sbGVyW292ZXJmbG93LWhpZGRlbl0gewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXNpemVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzaXplcndyYXBwZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAtMTAwOwogICAgICB9CgogICAgICAjcmVvcmRlcmdob3N0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNvbHVtbiksCiAgICAgIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIC8qIERlZmF1bHQgYm9yZGVycyAqLwogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIgLnZhYWRpbi1ncmlkLXJvdzpsYXN0LWNoaWxkIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciAudmFhZGluLWdyaWQtcm93OmZpcnN0LWNoaWxkIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgLnZhYWRpbi1ncmlkLXJvdzpub3QoW2xhc3Ryb3ddKSAudmFhZGluLWdyaWQtY2VsbCA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICBbbGFzdC1mcm96ZW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgLyogQ29sdW1uIHJlc2l6ZSBoYW5kbGUgKi8KCiAgICAgIC52YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGUpOwogICAgICB9CgogICAgICAvKiBDZWxscyAqLwogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWNlbGwpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtaGVhZGVyLWNlbGwpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtZm9vdGVyLWNlbGwpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LWNlbGwpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IFtvZGRdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctb2RkLWNlbGwpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKVtsYXN0LWZyb3plbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWNlbGwtbGFzdC1mcm96ZW4pOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZTpub3QoW3Njcm9sbGluZ10pIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgLnZhYWRpbi1ncmlkLXJvdzpob3ZlciAudmFhZGluLWdyaWQtY2VsbCA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctaG92ZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGwudmFhZGluLWdyaWQtY2VsbFtsYXN0Y29sdW1uXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICB9CgogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUiPgogIDx0ZW1wbGF0ZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXNjcm9sbC1zdHlsZXMiPjwvc3R5bGU+CiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zdHlsZXMiPjwvc3R5bGU+CgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CgogICAgICA8ZGl2IGlkPSJzcGlubmVyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idGFibGUiIHRhYmluZGV4PSItMSIgb3ZlcmZsb3ctaGlkZGVuJD0iW1tfaGlkZVRhYmxlT3ZlcmZsb3coc2Nyb2xsYmFyV2lkdGgsIHNhZmFyaSldXSI+CiAgICAgICAgPGRpdiBpZD0ic2l6ZXJ3cmFwcGVyIj4KICAgICAgICAgIDx2YWFkaW4tZ3JpZC1zaXplciBpZD0iZml4ZWRzaXplciIgdG9wPSJbW19lc3RTY3JvbGxIZWlnaHRdXSIgY29sdW1uLXRyZWU9IltbY29sdW1uVHJlZV1dIj48L3ZhYWRpbi1ncmlkLXNpemVyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxzbG90IG5hbWU9ImhlYWRlciI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9Iml0ZW1zIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iZm9vdGVyIj48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBpZD0icmVvcmRlcmdob3N0Ij48L2Rpdj4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIGlkPSJvdXRlcnNjcm9sbGVyIiBzY3JvbGwtdGFyZ2V0PSJbW3Njcm9sbFRhcmdldF1dIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlT3V0ZXJTY3JvbGxlcihzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIiBpb3MkPSJbW2lvc11dIiBzY3JvbGxpbmckPSJbW3Njcm9sbGluZ11dIj4KICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJvdXRlcnNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICA8L3ZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyPgogICAgPHNsb3Q+PC9zbG90PgogICAgPHNsb3QgbmFtZT0iZm9vdGVyRm9jdXNUcmFwIj48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlIixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcixQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntzaXplOk51bWJlcixjb2x1bW5UcmVlOkFycmF5LGJpbmREYXRhOkZ1bmN0aW9uLHJvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3QsY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHNhZmFyaTp7dHlwZTpCb29sZWFuLHZhbHVlOi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LHNjcm9sbGJhcldpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwphLnN0eWxlLndpZHRoPSIxMDBweCI7YS5zdHlsZS5oZWlnaHQ9IjEwMHB4IjthLnN0eWxlLm92ZXJmbG93PSJzY3JvbGwiO2Euc3R5bGUucG9zaXRpb249ImFic29sdXRlIjthLnN0eWxlLnRvcD0iLTk5OTlweCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTt2YXIgYz1hLm9mZnNldFdpZHRoLWEuY2xpZW50V2lkdGg7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtyZXR1cm4gY319LHRhcmdldDpPYmplY3QsaGFzRGF0YTpCb29sZWFufSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSwgX3BoeXNpY2FsSXRlbXMsIF9waHlzaWNhbENvdW50VmFsKSIsIl9zaXplQ2hhbmdlZChzaXplLCBiaW5kRGF0YSwgaGFzRGF0YSkiLCJfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZChyb3dEZXRhaWxzVGVtcGxhdGUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwKYW5pbWF0aW9uZW5kOiJfb25BbmltYXRpb25FbmQiLCJjb2x1bW4tcmVzaXppbmciOiJfb25Db2x1bW5SZXNpemUifSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuJD10aGlzLiR8fHt9O3RoaXMuJC5oZWFkZXI9dGhpcy5kb21Ib3N0LiQuaGVhZGVyO3RoaXMuJC5pdGVtcz10aGlzLmRvbUhvc3QuJC5pdGVtczt0aGlzLiQuZm9vdGVyPXRoaXMuZG9tSG9zdC4kLmZvb3Rlcn0sX29uQ29sdW1uUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImNvbHVtbi1yZXNpemluZyIsdGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yKCJbY29sdW1uLXJlc2l6aW5nXSIpKTt0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfb25BbmltYXRpb25FbmQ6ZnVuY3Rpb24oYSl7L2FwcGVhci8udGVzdChhLmFuaW1hdGlvbk5hbWUpJiYodGhpcy5fcmVuZGVyKCksdGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljcygpLGEuc3RvcFByb3BhZ2F0aW9uKCkpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYSl7ImhlYWRlclRlbXBsYXRlIj09PQphLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmhlYWRlcik7ImZvb3RlclRlbXBsYXRlIj09PWEuZGV0YWlsLnBhdGgmJnRoaXMudG9nZ2xlQXR0cmlidXRlKCJoYXMtdGVtcGxhdGVzIiwhMCx0aGlzLiQuZm9vdGVyKTsvZnJvemVufGhpZGRlbi8udGVzdChhLmRldGFpbC5wYXRoKSYmdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCk7ImhpZGRlbiI9PT1hLmRldGFpbC5wYXRoJiZ0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfaGlkZU91dGVyU2Nyb2xsZXI6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gMD09PWEmJiFjfSxfaGlkZVRhYmxlT3ZlcmZsb3c6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gMD09PWEmJmN9LF9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyxkKXt2b2lkIDAhPT1hJiZjJiZ2b2lkIDAhPT1kJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZil7Zi5yb3dEZXRhaWxzVGVtcGxhdGU9CmF9KX0sX2NvbHVtblRyZWVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyxkKXt2b2lkIDAhPT1hJiZjJiZ2b2lkIDAhPT1kJiYoUG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsdGhpcy5fdXBkYXRlKSx0aGlzLl9mcm96ZW5DZWxsc0NoYW5nZWQoKSx0aGlzLl9oYXNUZW1wbGF0ZXNDaGFuZ2VkKGEpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYyxmdW5jdGlvbihmKXtmLmNvbHVtbnM9YVthLmxlbmd0aC0xXX0pLHRoaXMuX2dyaWRSZXNpemVIYW5kbGVyKCksUG9seW1lci5kb20uZmx1c2godGhpcyksdGhpcy5fdXBkYXRlTGFzdENvbHVtbigpKX0sX3VwZGF0ZUxhc3RDb2x1bW46ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93IiksZnVuY3Rpb24oYSl7YS51cGRhdGVMYXN0Q29sdW1uKCl9KX0sX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbFNpemVzJiYKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYygpO1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLiQuaGVhZGVyLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCYmdGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4KX0uYmluZCh0aGlzKSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJC5oZWFkZXIuY2xpZW50SGVpZ2h0KyJweCIsYz10aGlzLiQuZm9vdGVyLmNsaWVudEhlaWdodCsicHgiO1t0aGlzLiQub3V0ZXJzaXplcix0aGlzLiQuZml4ZWRzaXplcix0aGlzLiQuaXRlbXNdLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5zdHlsZS5ib3JkZXJUb3BXaWR0aD1hO2Quc3R5bGUuYm9yZGVyQm90dG9tV2lkdGg9CmN9KX0sX2hhc1RlbXBsYXRlc0NoYW5nZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9ITEsZD0hMTthLmZvckVhY2goZnVuY3Rpb24oZil7cmV0dXJuIGYuZm9yRWFjaChmdW5jdGlvbihnKXtjPWN8fGcuaGVhZGVyVGVtcGxhdGU7ZD1kfHxnLmZvb3RlclRlbXBsYXRlfSl9KTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsYyx0aGlzLiQuaGVhZGVyKTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsZCx0aGlzLiQuZm9vdGVyKX0sX2NyZWF0ZVBvb2w6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPUFycmF5KGEpLGQ9MDtkPGE7ZCsrKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciKTtmLnRhcmdldD10aGlzLmRvbUhvc3Q7Y1tkXT1mO2Yuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCIiKTtQb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLmFwcGVuZENoaWxkKGYpfXJldHVybiBjfSxfc2l6ZUNoYW5nZWQ6ZnVuY3Rpb24oYSwKYyxkKXtpZih2b2lkIDAhPT1hJiZ2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kKXt2YXIgZj10aGlzLl9zY3JvbGxUb3AsZz10aGlzLmZpcnN0VmlzaWJsZUluZGV4K3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbENvdW50PU1hdGgubWluKGEsMUU1KTt0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5PXt9O3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl92aWR4T2Zmc2V0PTA7dGhpcy5fcGh5c2ljYWxJdGVtc3x8KHRoaXMuX3BoeXNpY2FsQ291bnQ9TWF0aC5tYXgoMSxNYXRoLm1pbigyNSx0aGlzLl92aXJ0dWFsQ291bnQpKSx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX2NyZWF0ZVBvb2wodGhpcy5fcGh5c2ljYWxDb3VudCksdGhpcy5fcGh5c2ljYWxTaXplcz1BcnJheSh0aGlzLl9waHlzaWNhbENvdW50KSk7dGhpcy5faXRlbXNSZW5kZXJlZD0hMTt0aGlzLl9kZWJvdW5jZVRlbXBsYXRlKGZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyKCk7CnRoaXMuX3ZpZXdwb3J0SGVpZ2h0JiYodGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KE1hdGgubWluKGcsdGhpcy5zaXplKSksdGhpcy5fc2Nyb2xsVG9wPWYsdGhpcy5fc2Nyb2xsSGFuZGxlcigpLHRoaXMuZmx1c2hEZWJvdW5jZXIoInZhYWRpbi1ncmlkLXNjcm9sbGluZyIpKX0pfX0sX2Fzc2lnbk1vZGVsczpmdW5jdGlvbihhKXt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW09dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtfHx7fTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oYyxkKXtjPXRoaXMuX3BoeXNpY2FsSXRlbXNbY107Yy5pbmRleCYmZGVsZXRlIHRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbVtjLmluZGV4XTtjLmluZGV4PWQrdGhpcy5fdmlkeE9mZnNldDt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bYy5pbmRleF09YztjLnRvZ2dsZUF0dHJpYnV0ZSgib2RkIixjLmluZGV4JTIpO2MudG9nZ2xlQXR0cmlidXRlKCJsYXN0cm93IixjLmluZGV4PT09dGhpcy5zaXplLTEpO2MudG9nZ2xlQXR0cmlidXRlKCJoaWRkZW4iLApjLmluZGV4Pj10aGlzLnNpemUpO3RoaXMuYmluZERhdGEoYy5pbmRleCxjKX0sYSl9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKTt0aGlzLl9waHlzaWNhbFNpemVzJiYodGhpcy5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EudXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzKCl9KSx0aGlzLmRlYm91bmNlKCJ2YWFkaW4tZ3JpZC1yZXNpemluZyIsZnVuY3Rpb24oKXt0aGlzLl91cGRhdGUoKX0uYmluZCh0aGlzKSwxKSl9fSk7Cjwvc2NyaXB0PgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3Jlc2l6YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOmZ1bmN0aW9uKCl7aWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmxvY2FsTmFtZSl7dmFyIGE9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTtyZXR1cm4gYSYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1hLmxvY2FsTmFtZT9hLnJlc2l6YWJsZXx8ITE6ITF9fX0saGVhZGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxmb290ZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0saGlkZGVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX29yZGVyOk51bWJlcixfcmVvcmRlclN0YXR1czpCb29sZWFufSxvYnNlcnZlcnM6WyJfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkKGZvb3RlclRlbXBsYXRlKSIsCiJfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkKGhlYWRlclRlbXBsYXRlKSIsIl9sYXN0RnJvemVuQ2hhbmdlZChfbGFzdEZyb3plbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShjKXswPD1jLmFkZGVkTm9kZXMubGVuZ3RoJiYodGhpcy5oZWFkZXJUZW1wbGF0ZT10aGlzLl9wcmVwYXJlSGVhZGVyVGVtcGxhdGUoKSx0aGlzLmZvb3RlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVGb290ZXJUZW1wbGF0ZSgpLHRoaXMudGVtcGxhdGU9dGhpcy5fcHJlcGFyZUJvZHlUZW1wbGF0ZSgpKX10aGlzLl90ZW1wbGF0ZU9ic2VydmVyPVBvbHltZXIuRWxlbWVudD9uZXcgUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyKHRoaXMsYSk6UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKGEpfSxfcHJlcGFyZUhlYWRlclRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlLmhlYWRlciIpfHxudWxsLAp7fSl9LF9wcmVwYXJlRm9vdGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuZm9vdGVyIil8fG51bGwse30pfSxfcHJlcGFyZUJvZHlUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZTpub3QoLmhlYWRlcik6bm90KC5mb290ZXIpIix7fSkpfSxfcHJlcGFyZVRlbXBsYXRpemVyOmZ1bmN0aW9uKGEsYyl7aWYoYSYmIWEudGVtcGxhdGl6ZXIpe3ZhciBkPW5ldyB2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcjtkLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Q7ZC5faW5zdGFuY2VQcm9wcz1jfHxkLl9pbnN0YW5jZVByb3BzO2QudGVtcGxhdGU9YTthLnRlbXBsYXRpemVyPWR9cmV0dXJuIGF9LF9zZWxlY3RGaXJzdFRlbXBsYXRlOmZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvckFsbChhKSwKZnVuY3Rpb24oYyl7cmV0dXJuIFBvbHltZXIuZG9tKGMpLnBhcmVudE5vZGU9PT10aGlzfS5iaW5kKHRoaXMpKVswXX0sX2ZpbmRUZW1wbGF0ZTpmdW5jdGlvbihhKXsoYT10aGlzLl9zZWxlY3RGaXJzdFRlbXBsYXRlKGEpKSYmdGhpcy5kYXRhSG9zdCYmKGEuX3Jvb3REYXRhSG9zdD10aGlzLmRhdGFIb3N0Ll9yb290RGF0YUhvc3R8fHRoaXMuZGF0YUhvc3QpO3JldHVybiBhfSxfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhlYWRlclRlbXBsYXRlIix2YWx1ZTphfSl9LF9mb290ZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiZm9vdGVyVGVtcGxhdGUiLHZhbHVlOmF9KX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmbGV4R3JvdyIsdmFsdWU6YX0pfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJ3aWR0aCIsdmFsdWU6YX0pfSxfbGFzdEZyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoibGFzdEZyb3plbiIsdmFsdWU6YX0pfX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7d2lkdGg6e3R5cGU6U3RyaW5nLHZhbHVlOiIxMDBweCJ9LGZsZXhHcm93Ont0eXBlOk51bWJlcix2YWx1ZToxfSx0ZW1wbGF0ZTp7dHlwZTpPYmplY3R9fSxvYnNlcnZlcnM6Il9mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3cpO193aWR0aENoYW5nZWQod2lkdGgpO190ZW1wbGF0ZUNoYW5nZWQodGVtcGxhdGUpO19mcm96ZW5DaGFuZ2VkKGZyb3plbiwgaXNBdHRhY2hlZCk7X2hpZGRlbkNoYW5nZWQoaGlkZGVuKTtfb3JkZXJDaGFuZ2VkKF9vcmRlcik7X3Jlb3JkZXJTdGF0dXNDaGFuZ2VkKF9yZW9yZGVyU3RhdHVzKTtfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIi5zcGxpdCgiOyIpLF9mcm96ZW5DaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmKHZvaWQgMD09PXRoaXMuX29sZEZyb3plbiYmITE9PT1hfHx0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLAp7cGF0aDoiZnJvemVuIix2YWx1ZTphfSksdGhpcy5fb2xkRnJvemVuPWEpfSxfdGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe2EmJmEudGVtcGxhdGl6ZXImJlBvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoYS50ZW1wbGF0aXplcik7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoidGVtcGxhdGUiLHZhbHVlOmF9LHtidWJibGVzOiExfSl9LF9oaWRkZW5DaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhpZGRlbiIsdmFsdWU6YX0pfSxfb3JkZXJDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6Im9yZGVyIix2YWx1ZTphfSl9LF9yZW9yZGVyU3RhdHVzQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJyZW9yZGVyU3RhdHVzIix2YWx1ZTphfSl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJyZXNpemFibGUiLHZhbHVlOmF9KX19O3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9yPVt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsXTsKPC9zY3JpcHQ+Cgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtY29sdW1uIj4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLmh0bWwtMi5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtY29sdW1uIixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9yXX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWFycmF5LWRhdGEtcHJvdmlkZXItYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQXJyYXlEYXRhUHJvdmlkZXJCZWhhdmlvcj17cHJvcGVydGllczp7aXRlbXM6QXJyYXl9LG9ic2VydmVyczpbIl9pdGVtc0NoYW5nZWQoaXRlbXMsIGl0ZW1zLiopIl0sX2l0ZW1zQ2hhbmdlZDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWMmJih0aGlzLnNpemU9KGF8fFtdKS5sZW5ndGgsdGhpcy5kYXRhUHJvdmlkZXI9dGhpcy5kYXRhUHJvdmlkZXJ8fHRoaXMuX2FycmF5RGF0YVByb3ZpZGVyLHRoaXMuY2xlYXJDYWNoZSgpKX0sX2FycmF5RGF0YVByb3ZpZGVyOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9KHRoaXMuaXRlbXN8fFtdKS5zbGljZSgwKTt0aGlzLl9jaGVja1BhdGhzKHRoaXMuX2ZpbHRlcnMsImZpbHRlcmluZyIsZCkmJihkPXRoaXMuX2ZpbHRlcihkKSk7dGhpcy5zaXplPWQubGVuZ3RoO2Euc29ydE9yZGVycy5sZW5ndGgmJnRoaXMuX2NoZWNrUGF0aHModGhpcy5fc29ydGVycywic29ydGluZyIsZCkmJihkPWQuc29ydCh0aGlzLl9tdWx0aVNvcnQuYmluZCh0aGlzKSkpOwp2YXIgZj1hLnBhZ2UqYS5wYWdlU2l6ZTtjKGQuc2xpY2UoZixmK2EucGFnZVNpemUpLGQubGVuZ3RoKX0sX2NoZWNrUGF0aHM6ZnVuY3Rpb24oYSxjLGQpe2lmKCFkLmxlbmd0aClyZXR1cm4hMTt2YXIgZj0hMCxnO2ZvcihnIGluIGEpe3ZhciBsPWFbZ10ucGF0aDtpZihsJiYtMSE9PWwuaW5kZXhPZigiLiIpKXt2YXIgaz1sLnJlcGxhY2UoL1wuW15cLl0qJC8sIiIpO3ZvaWQgMD09PVBvbHltZXIuQmFzZS5nZXQoayxkWzBdKSYmKGNvbnNvbGUud2FybignUGF0aCAiJytsKyciIHVzZWQgZm9yICcrYysiIGRvZXMgbm90IGV4aXN0IGluIGFsbCBvZiB0aGUgaXRlbXMsICIrYysiIGlzIGRpc2FibGVkLiIpLGY9ITEpfX1yZXR1cm4gZn0sX211bHRpU29ydDpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLl9zb3J0ZXJzLm1hcChmdW5jdGlvbihkKXtyZXR1cm4iYXNjIj09PWQuZGlyZWN0aW9uP3RoaXMuX2NvbXBhcmUoUG9seW1lci5CYXNlLmdldChkLnBhdGgsYSksUG9seW1lci5CYXNlLmdldChkLnBhdGgsCmMpKToiZGVzYyI9PT1kLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKFBvbHltZXIuQmFzZS5nZXQoZC5wYXRoLGMpLFBvbHltZXIuQmFzZS5nZXQoZC5wYXRoLGEpKTowfSx0aGlzKS5yZWR1Y2UoZnVuY3Rpb24oZCxmKXtyZXR1cm4gZD9kOmZ9LDApfSxfbm9ybWFsaXplRW1wdHlWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gMDw9W3ZvaWQgMCxudWxsXS5pbmRleE9mKGEpPyIiOmlzTmFOKGEpP2EudG9TdHJpbmcoKTphfSxfY29tcGFyZTpmdW5jdGlvbihhLGMpe2E9dGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShhKTtjPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoYyk7cmV0dXJuIGE8Yz8tMTphPmM/MTowfSxfZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gMD09PXRoaXMuX2ZpbHRlcnMuZmlsdGVyKGZ1bmN0aW9uKGQpe3JldHVybi0xPT09dGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShQb2x5bWVyLkJhc2UuZ2V0KGQucGF0aCxjKSkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZC52YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpfS5iaW5kKHRoaXMpKS5sZW5ndGh9LAp0aGlzKX19Owo8L3NjcmlwdD4KCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1keW5hbWljLWNvbHVtbnMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcj17cmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9hZGROb2RlT2JzZXJ2ZXIoKX0sX2hhc0NvbHVtbkdyb3VwczpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWFbY10ubG9jYWxOYW1lKXJldHVybiEwO3JldHVybiExfSxfZ2V0Q2hpbGRDb2x1bW5zOmZ1bmN0aW9uKGEpe3JldHVybiBQb2x5bWVyLmRvbShhKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIil9LF9mbGF0dGVuQ29sdW1uR3JvdXBzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1hcChmdW5jdGlvbihjKXtyZXR1cm4idmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWMubG9jYWxOYW1lP3RoaXMuX2dldENoaWxkQ29sdW1ucyhjKTpbY119LHRoaXMpLnJlZHVjZShmdW5jdGlvbihjLApkKXtyZXR1cm4gYy5jb25jYXQoZCl9LFtdKX0sX2dldENvbHVtblRyZWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYz10aGlzLnF1ZXJ5QWxsRWZmZWN0aXZlQ2hpbGRyZW4oInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIik7Oyl7YS5wdXNoKGMpO2lmKCF0aGlzLl9oYXNDb2x1bW5Hcm91cHMoYykpYnJlYWs7Yz10aGlzLl9mbGF0dGVuQ29sdW1uR3JvdXBzKGMpfXJldHVybiBhfSxfdXBkYXRlQ29sdW1uVHJlZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyhhLHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT1hKX0sX2FkZE5vZGVPYnNlcnZlcjpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGQpe3JldHVybiBkLm5vZGVUeXBlPT09Ck5vZGUuRUxFTUVOVF9OT0RFJiYvXnZhYWRpbi1ncmlkLShjb2x1bW58c2VsZWN0aW9uKS9pLnRlc3QoZC5sb2NhbE5hbWUpfSgwPGEuYWRkZWROb2Rlcy5maWx0ZXIoYykubGVuZ3RofHwwPGEucmVtb3ZlZE5vZGVzLmZpbHRlcihjKS5sZW5ndGgpJiZ0aGlzLl91cGRhdGVDb2x1bW5UcmVlKCk7KFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93fHxQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdykmJlBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuJC5mb290ZXJGb2N1c1RyYXApO3RoaXMuZGVib3VuY2UoImNoZWNrLWltcG9ydHMiLHRoaXMuX2NoZWNrSW1wb3J0cywyRTMpfS5iaW5kKHRoaXMpKX0sX2FycmF5RXF1YWxzOmZ1bmN0aW9uKGEsYyl7aWYoIWF8fCFjfHxhLmxlbmd0aCE9Yy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBkPTAsZj1hLmxlbmd0aDtkPGY7ZCsrKWlmKGFbZF1pbnN0YW5jZW9mIEFycmF5JiZjW2RdaW5zdGFuY2VvZiBBcnJheSl7aWYoIXRoaXMuX2FycmF5RXF1YWxzKGFbZF0sCmNbZF0pKXJldHVybiExfWVsc2UgaWYoYVtkXSE9Y1tkXSlyZXR1cm4hMTtyZXR1cm4hMH0sX2NoZWNrSW1wb3J0czpmdW5jdGlvbigpe1sidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiwidmFhZGluLWdyaWQtc29ydGVyIiwidmFhZGluLWdyaWQtZmlsdGVyIiwidmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGM9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcihhKTshY3x8KFBvbHltZXIuaXNJbnN0YW5jZT9Qb2x5bWVyLmlzSW5zdGFuY2UoYyk6YyBpbnN0YW5jZW9mIFBvbHltZXIuRWxlbWVudCl8fGNvbnNvbGUud2FybigiTWFrZSBzdXJlIHlvdSBoYXZlIGltcG9ydGVkIHRoZSByZXF1aXJlZCBtb2R1bGUgZm9yIFx4M2MiK2ErIlx4M2UgZWxlbWVudC4iKX0sdGhpcyl9fTsKPC9zY3JpcHQ+CgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNvcnQtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuU29ydEJlaGF2aW9yPXtwcm9wZXJ0aWVzOnttdWx0aVNvcnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3NvcnRlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9wcmV2aW91c1NvcnRlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxsaXN0ZW5lcnM6eyJzb3J0ZXItY2hhbmdlZCI6Il9vblNvcnRlckNoYW5nZWQifSxyZWFkeTpmdW5jdGlvbigpe1BvbHltZXIuRWxlbWVudCYmIVBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93JiZ0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dmFyIGE9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvckFsbCgidmFhZGluLWdyaWQtc29ydGVyIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGZ1bmN0aW9uKGMpe2MuZmlyZSYmYy5maXJlKCJzb3J0ZXItY2hhbmdlZCIpfSl9KX0sX29uU29ydGVyQ2hhbmdlZDpmdW5jdGlvbihhKXt2YXIgYz0KYS50YXJnZXQ7dGhpcy5fcmVtb3ZlQXJyYXlJdGVtKHRoaXMuX3NvcnRlcnMsYyk7Yy5fb3JkZXI9bnVsbDt0aGlzLm11bHRpU29ydD8oYy5kaXJlY3Rpb24mJnRoaXMuX3NvcnRlcnMudW5zaGlmdChjKSx0aGlzLl9zb3J0ZXJzLmZvckVhY2goZnVuY3Rpb24oZCxmKXtkLl9vcmRlcj0xPHRoaXMuX3NvcnRlcnMubGVuZ3RoP2Y6bnVsbH0sdGhpcykpOih0aGlzLl9zb3J0ZXJzLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5fb3JkZXI9bnVsbDtkLmRpcmVjdGlvbj1udWxsfSksYy5kaXJlY3Rpb24mJih0aGlzLl9zb3J0ZXJzPVtjXSkpO2Euc3RvcFByb3BhZ2F0aW9uKCk7dGhpcy5kYXRhUHJvdmlkZXImJkpTT04uc3RyaW5naWZ5KHRoaXMuX3ByZXZpb3VzU29ydGVycykhPT1KU09OLnN0cmluZ2lmeSh0aGlzLl9tYXBTb3J0ZXJzKCkpJiZ0aGlzLmNsZWFyQ2FjaGUoKTt0aGlzLl9wcmV2aW91c1NvcnRlcnM9dGhpcy5fbWFwU29ydGVycygpfSxfbWFwU29ydGVyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3J0ZXJzLm1hcChmdW5jdGlvbihhKXtyZXR1cm57cGF0aDphLnBhdGgsCmRpcmVjdGlvbjphLmRpcmVjdGlvbn19KX0sX3JlbW92ZUFycmF5SXRlbTpmdW5jdGlvbihhLGMpe2M9YS5pbmRleE9mKGMpOy0xPGMmJmEuc3BsaWNlKGMsMSl9fTsKPC9zY3JpcHQ+Cgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZmlsdGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsiZmlsdGVyLWNoYW5nZWQiOiJfZmlsdGVyQ2hhbmdlZCJ9LF9maWx0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGEpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKGEudGFyZ2V0KSYmdGhpcy5fZmlsdGVycy5wdXNoKGEudGFyZ2V0KTthLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX21hcEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsdGVycy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJue3BhdGg6YS5wYXRoLHZhbHVlOmEudmFsdWV9fSl9fTsKPC9zY3JpcHQ+CgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IsICNmZmYpOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgICNzY3JvbGxlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC10YWJsZS1zdHlsZXMiPjwvc3R5bGU+CgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLW5hdmlnYXRpb24tdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtY29sdW1uLXJlb3JkZXJpbmctdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgoKICAgIDx2YWFkaW4tZ3JpZC10YWJsZSBpZD0ic2Nyb2xsZXIiIGxvYWRpbmckPSJbW19sb2FkaW5nXV0iIGJpbmQtZGF0YT0iW1tfYmluZERhdGFdXSIgc2l6ZT0iW1tzaXplXV0iIGNvbHVtbi10cmVlPSJbW19jb2x1bW5UcmVlXV0iIHJvdy1kZXRhaWxzLXRlbXBsYXRlPSJbW19yb3dEZXRhaWxzVGVtcGxhdGVdXSIgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZD0iW1tjb2x1bW5SZW9yZGVyaW5nQWxsb3dlZF1dIj4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciBpZD0iaGVhZGVyIiBzbG90PSJoZWFkZXIiIHRhcmdldD0iW1tfZ2V0Q29udGVudFRhcmdldCgpXV0iIGNvbHVtbi10cmVlPSJbW19jb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyPgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtYm9keSBpZD0iaXRlbXMiIHNsb3Q9Iml0ZW1zIj48L3ZhYWRpbi1ncmlkLXRhYmxlLWJvZHk+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgaWQ9ImZvb3RlciIgc2xvdD0iZm9vdGVyIiB0YXJnZXQ9IltbX2dldENvbnRlbnRUYXJnZXQoKV1dIiBjb2x1bW4tdHJlZT0iW1tfY29sdW1uVHJlZV1dIj48L3ZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlcj4KCiAgICAgIAogICAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KCiAgICAgIAogICAgICAKICAgICAgPHNsb3Q+PC9zbG90PgoKICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWZvY3VzLXRyYXAgaWQ9ImZvb3RlckZvY3VzVHJhcCIgc2xvdD0iZm9vdGVyRm9jdXNUcmFwIiBvbi1mb2N1cy1nYWluZWQ9Il9vbkZvb3RlckZvY3VzIiBvbi1mb2N1cy1sb3N0PSJfb25Gb2N1c291dCI+CiAgICAgIDwvdmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcD4KICAgIDwvdmFhZGluLWdyaWQtdGFibGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkIixwcm9wZXJ0aWVzOntfY29sdW1uVHJlZTp7dHlwZTpBcnJheSxub3RpZnk6ITB9LHNpemU6TnVtYmVyLF9yb3dEZXRhaWxzVGVtcGxhdGU6T2JqZWN0LF9iaW5kRGF0YTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0SXRlbS5iaW5kKHRoaXMpfX19LGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5BY3RpdmVJdGVtQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuUm93RGV0YWlsc0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkRhdGFQcm92aWRlckJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkR5bmFtaWNDb2x1bW5zQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQXJyYXlEYXRhUHJvdmlkZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5TZWxlY3Rpb25CZWhhdmlvciwKdmFhZGluLmVsZW1lbnRzLmdyaWQuU29ydEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkZpbHRlckJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JdLGxpc3RlbmVyczp7InByb3BlcnR5LWNoYW5nZWQiOiJfY29sdW1uUHJvcENoYW5nZWQiLCJpcm9uLXJlc2l6ZSI6Il9ncmlkUmVzaXplSGFuZGxlciJ9LF91cGRhdGVJdGVtOmZ1bmN0aW9uKGEsYyl7YS5zdHlsZS5taW5IZWlnaHQ9Yz8iIjp0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQXZlcmFnZSsicHgiO2EuaXRlbT1jO2Euc2VsZWN0ZWQ9dGhpcy5faXNTZWxlY3RlZChjKTthLmV4cGFuZGVkPXRoaXMuX2lzRXhwYW5kZWQoYyk7YS5hY3RpdmU9bnVsbCE9PWMmJmM9PXRoaXMuYWN0aXZlSXRlbTthLmZvY3VzZWQ9YS5pbmRleD09PXRoaXMuJC5pdGVtcy5fZm9jdXNlZFJvd0luZGV4fSxfZ2V0Q29udGVudFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDb2x1bW5UcmVlKCk7dGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlLnJvdy1kZXRhaWxzIil8fHZvaWQgMDt0aGlzLiQuc2Nyb2xsZXIudGFyZ2V0PXRoaXM7bnVsbD09PWRvY3VtZW50LmRvY3R5cGUmJmNvbnNvbGUud2FybignXHgzY3ZhYWRpbi1ncmlkXHgzZSByZXF1aXJlcyB0aGUgInN0YW5kYXJkcyBtb2RlIiBkZWNsYXJhdGlvbi4gUGxlYXNlIGFkZCBceDNjIURPQ1RZUEUgaHRtbFx4M2UgdG8gdGhlIEhUTUwgZG9jdW1lbnQuJyl9LF9jb2x1bW5Qcm9wQ2hhbmdlZDpmdW5jdGlvbihhKXsiX2NoaWxkQ29sdW1ucyI9PT1hLmRldGFpbC5wYXRoJiZ0aGlzLl91cGRhdGVDb2x1bW5UcmVlKCk7YS5zdG9wUHJvcGFnYXRpb24oKX0sX2dyaWRSZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLl9ncmlkUmVzaXplSGFuZGxlcigpfX0pOwo8L3NjcmlwdD4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFzZXNzaW9uR3JvdXBdXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIHNlc3Npb24gZ3JvdXAgc2VsZWN0ZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBzZWxlY3QgYSBzZXNzaW9uIGdyb3VwIHRvIHNlZSBpdHMgbWV0cmljLWdyYXBocyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLHZpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cDpPYmplY3QsX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpibS5YVHlwZS5TVEVQfSxfbm9NdWx0aUV4cGVyaW1lbnRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbmRleE9mU2Vzc2lvbjpPYmplY3QsX3Nlc3Npb25Hcm91cE5hbWVIYXNoOk51bWJlcixfcmVxdWVzdERhdGE6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oe3RhZzphLHJ1bjpjfSk9PnRoaXMuYmFja2VuZC5saXN0TWV0cmljRXZhbHMoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsc2Vzc2lvbk5hbWU6YyxtZXRyaWNOYW1lOmF9KX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntzY2FsZTphPT57YT1KU09OLnBhcnNlKGEpWzFdOwphPXRoaXMuX2luZGV4T2ZTZXNzaW9uLmdldChhKTtjb25zdCBjPVpsLnN0YW5kYXJkO3JldHVybiBjWyh0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaCthKSVjLmxlbmd0aF19fX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6InJlZHJhdyJ9LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cC4qKSJdLHJlZHJhdygpe1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGE9PmEucmVkcmF3KCkpfSxfc2Vzc2lvbkdyb3VwQ2hhbmdlZCgpe3RoaXMuc2Vzc2lvbkdyb3VwPyh0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwKHRoaXMuc2Vzc2lvbkdyb3VwLnNlc3Npb25zLm1hcCgoYSxjKT0+W2EubmFtZSxjXSkpLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPXRmLmhwYXJhbXMudXRpbHMuaGFzaE9mU3RyaW5nKHRoaXMuc2Vzc2lvbkdyb3VwLm5hbWUpKToKKHRoaXMuX2luZGV4T2ZTZXNzaW9uPW5ldyBNYXAsdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9MCk7UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYT0+e2NvbnN0IGM9YS5nZXQoInRhZyIpO2Euc2V0KCJ0YWciLCIiKTthLnNldCgidGFnIixjKX0pfSxfaGF2ZU1ldHJpY3MoKXtyZXR1cm4gdGhpcy52aXNpYmxlU2NoZW1hJiZBcnJheS5pc0FycmF5KHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcykmJjA8dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aH0sX2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwJiZ0aGlzLl9oYXZlTWV0cmljcygpfSxfY29tcHV0ZVNlcmllc0ZvclNlc3Npb25Hcm91cE1ldHJpYyhhLGMpe3JldHVybiBudWxsPT09YXx8bnVsbD09PWM/W106YS5zZXNzaW9ucy5maWx0ZXIoZD0+dm9pZCAwIT09dGYuaHBhcmFtcy51dGlscy5tZXRyaWNWYWx1ZUJ5TmFtZShkLm1ldHJpY1ZhbHVlcywKYy5uYW1lKSkubWFwKGQ9Pih7dGFnOmMubmFtZSxydW46ZC5uYW1lfSkpfSxfY29tcHV0ZVRhZ01ldGFkYXRhKGEpe3JldHVybntkaXNwbGF5TmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUoYSksZGVzY3JpcHRpb246YS5kZXNjcmlwdGlvbnx8IiJ9fX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy10YWJsZS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8dmFhZGluLWdyaWQgY2xhc3M9InNlc3Npb24tZ3JvdXAtdGFibGUiIGlkPSJzZXNzaW9uR3JvdXBzVGFibGUiIGNvbHVtbi1yZW9yZGVyaW5nLWFsbG93ZWQgaXRlbXM9Iltbc2Vzc2lvbkdyb3Vwc11dIj4KICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjAiIHdpZHRoPSIxMGVtIiByZXNpemFibGU+CiAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPlRyaWFsIElEPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj5bW2l0ZW0ubmFtZV1dPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlbmFibGVTaG93TWV0cmljc11dIj4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgd2lkdGg9IjVlbSIgcmVzaXphYmxlPgogICAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+U2hvdyBNZXRyaWNzPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2xhc3M9InRhYmxlLWNlbGwiIGNoZWNrZWQ9Int7ZXhwYW5kZWR9fSI+CiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3Zpc2libGVTY2hlbWEuaHBhcmFtSW5mb3NdXSIgYXM9ImhwYXJhbUluZm8iIGluZGV4LWFzPSJocGFyYW1JbmRleCI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbUluZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBIUGFyYW0oaXRlbSwgaHBhcmFtSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zfX0iIGFzPSJtZXRyaWNJbmZvIiBpbmRleC1hcz0ibWV0cmljSW5kZXgiPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIyIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPgogICAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWNJbmZvKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfc2Vzc2lvbkdyb3VwTWV0cmljKGl0ZW0sIG1ldHJpY0luZm8ubmFtZSldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0icm93LWRldGFpbHMiPgogICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIHNlc3Npb24tZ3JvdXA9IltbaXRlbV1dIiB2aXNpYmxlLXNjaGVtYT0iW1t2aXNpYmxlU2NoZW1hXV0iIGNsYXNzPSJzZXNzaW9uLWdyb3VwLWRldGFpbHMiPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3ZhYWRpbi1ncmlkPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC50YWJsZS1jZWxsIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLnRhYmxlLWhlYWRlciB7CiAgICAgICAgLyogbGluZS1icmVhayBvdmVyZmxvd2luZyBjb2x1bW4gaGVhZGVycyAqLwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAuc2Vzc2lvbi1ncm91cC10YWJsZSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLWRldGFpbHMgewogICAgICAgIGhlaWdodDogMzYwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaHBhcmFtcy10YWJsZS12aWV3L3RmLWhwYXJhbXMtdGFibGUtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciLHByb3BlcnRpZXM6e3Zpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXksZW5hYmxlU2hvd01ldHJpY3M6Qm9vbGVhbixiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmd9LG9ic2VydmVyczpbIl92aXNpYmxlU2NoZW1hT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCh2aXNpYmxlU2NoZW1hLiosIHNlc3Npb25Hcm91cHMuKikiXSxfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtjb25zdCBhPXRoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuZ2V0KCJleHBhbmRlZEl0ZW1zIik7dGhpcy4kLnNlc3Npb25Hcm91cHNUYWJsZS5zZXQoImV4cGFuZGVkSXRlbXMiLFtdKTtQb2x5bWVyLmRvbS5mbHVzaCgpO2NvbnN0IGM9bmV3IE1hcDt0aGlzLnNlc3Npb25Hcm91cHMuZm9yRWFjaChkPT57Yy5zZXQoZC5uYW1lLGQpfSk7dGhpcy4kLnNlc3Npb25Hcm91cHNUYWJsZS5zZXQoImV4cGFuZGVkSXRlbXMiLAphLm1hcChkPT5jLmdldChkLm5hbWUpKS5maWx0ZXIoQm9vbGVhbikpfSxfaHBhcmFtTmFtZTp0Zi5ocGFyYW1zLnV0aWxzLmhwYXJhbU5hbWUsX21ldHJpY05hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lLF9zZXNzaW9uR3JvdXBIUGFyYW0oYSxjKXtyZXR1cm4gbnVsbCE9YSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEuaHBhcmFtcyxjKT90Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50KGEuaHBhcmFtc1tjXSk6IiJ9LF9zZXNzaW9uR3JvdXBNZXRyaWMoYSxjKXtpZihudWxsPT1hKXJldHVybiBudWxsO2ZvcihsZXQgZD0wO2Q8YS5tZXRyaWNWYWx1ZXMubGVuZ3RoOysrZCl7bGV0IGY9YS5tZXRyaWNWYWx1ZXNbZF07aWYoZi5uYW1lLmdyb3VwPT09Yy5ncm91cCYmZi5uYW1lLnRhZz09Yy50YWcpcmV0dXJuIHRmLmhwYXJhbXMudXRpbHMucHJldHR5UHJpbnQoZi52YWx1ZSl9cmV0dXJuIiJ9LF9yb3dOdW1iZXIoYSl7cmV0dXJuIGErMX19KTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Byb3BlcnRpZXNBcmVQb3B1bGF0ZWQodmlzaWJsZVNjaGVtYSwgc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgCiAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgdmlzaWJsZS1zY2hlbWE9IltbdmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tfc2luZ2xldG9uU2Vzc2lvbkdyb3VwcyhzZXNzaW9uR3JvdXApXV0iPgogICAgICA8L3RmLWhwYXJhbXMtdGFibGUtdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIDxkaXY+CiAgICAgICAgQ2xpY2sgb3IgaG92ZXIgb3ZlciBhIHNlc3Npb24gZ3JvdXAgdG8gZGlzcGxheSBpdHMgdmFsdWVzIGhlcmUuCiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzL3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyIscHJvcGVydGllczp7c2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSx2aXNpYmxlU2NoZW1hOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfX0sX3Byb3BlcnRpZXNBcmVQb3B1bGF0ZWQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdm9pZCAwIT09YSYmbnVsbCE9PWEmJnZvaWQgMCE9PWMmJm51bGwhPT1jfSxfc2luZ2xldG9uU2Vzc2lvbkdyb3VwczpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWF8fHZvaWQgMD09PWE/W106W2FdfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvdXRpbHMuaHRtbC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKGcsbCxrKXtmdW5jdGlvbiBtKCl7aWYoMD09PWcubGVuZ3RoKXJldHVyblsxLDJdO2NvbnN0IFtwLHFdPWQzLmV4dGVudChnKTtyZXR1cm4gcCE9PXE/W3AscV06MDxwP1suNSpwLDEuNSpwXTowPnA/WzEuNSpwLC41KnBdOlstMSwxXX1pZigiTElORUFSIj09PWspcmV0dXJuIGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKG0oKSkucmFuZ2UoW2wsMF0pO2lmKCJMT0ciPT09aylyZXR1cm4gaz1tKCksMD49a1swXSYmMDw9a1sxXT9mKGcsbCwiTElORUFSIik6ZDMuc2NhbGVMb2coKS5kb21haW4oaykucmFuZ2UoW2wsMF0pO2lmKCJRVUFOVElMRSI9PT1rKXJldHVybiBrPWQzLnJhbmdlKDIwKS5tYXAocD0+bC1wKmwvMTkpLDA9PT1nLmxlbmd0aCYmKGc9WzFdKSxkMy5zY2FsZVF1YW50aWxlKCkuZG9tYWluKF8udW5pcShnKSkucmFuZ2Uoayk7aWYoIk5PTl9OVU1FUklDIj09PWspcmV0dXJuIGQzLnNjYWxlUG9pbnQoKS5kb21haW4oXy51bmlxKGcuc29ydCgpKSkucmFuZ2UoW2wsCjBdKS5wYWRkaW5nKC4xKTt0aHJvdyBSYW5nZUVycm9yKCJVbmtub3duIHNjYWxlOiAiK2spO31kLmZpbmRDbG9zZXN0UGF0aD1mdW5jdGlvbihnLGwsayl7ZnVuY3Rpb24gbSh5LHgsQyxGKXtjb25zdCBEPXktQyxCPXgtRjtDPXAtQztGPXEtRjtjb25zdCBHPShEKkMrQipGKS8oRCpEK0IqQik7cmV0dXJuIDA+PUc/YS5ocGFyYW1zLnV0aWxzLmwyTm9ybVNxdWFyZWQoQyxGKToxPD1HP2EuaHBhcmFtcy51dGlscy5sMk5vcm1TcXVhcmVkKHktcCx4LXEpOmEuaHBhcmFtcy51dGlscy5sMk5vcm1TcXVhcmVkKEMtRypELEYtRypCKX1pZigyPmwubGVuZ3RoKXJldHVybiBjb25zb2xlLmVycm9yKCJMZXNzIHRoYW4gdHdvIGF4ZXMgaW4gcGFyYWxsZWwgY29vcmRpbmF0ZXMgcGxvdC4iKSxudWxsO2NvbnN0IHA9a1swXSxxPWtbMV07aWYocDw9bFswXXx8cD49bFtsLmxlbmd0aC0xXSlyZXR1cm4gbnVsbDtjb25zdCByPV8uc29ydGVkSW5kZXgobCxwKTtjb25zb2xlLmFzc2VydCgwPHIpOwpjb25zb2xlLmFzc2VydChyPGwubGVuZ3RoKTtjb25zdCB0PXItMTtsZXQgdj1udWxsLEE9bnVsbDtnLmZvckVhY2goeT0+e2NvbnN0IHg9bSh5LmNvbnRyb2xQb2ludHNbdF1bMF0seS5jb250cm9sUG9pbnRzW3RdWzFdLHkuY29udHJvbFBvaW50c1tyXVswXSx5LmNvbnRyb2xQb2ludHNbcl1bMV0pOzEwMDx4fHwhKG51bGw9PT12fHx4PHYpfHwodj14LEE9eSl9KTtyZXR1cm4gQX07ZC5wb2ludFNjYWxlSW52ZXJzZUltYWdlPWZ1bmN0aW9uKGcsbCxrKXtyZXR1cm4gZy5kb21haW4oKS5maWx0ZXIobT0+e209ZyhtKTtyZXR1cm4gbDw9bSYmbTw9a30pfTtkLnF1YW50aWxlU2NhbGVJbnZlcnNlSW1hZ2U9ZnVuY3Rpb24oZyxsLGspe2NvbnN0IG09Zy5yYW5nZSgpLHA9bS5maWx0ZXIocT0+bDw9cSYmcTw9aykubWFwKHE9Pntjb25zdCByPWcuaW52ZXJ0RXh0ZW50KHEpO3JldHVybiBxPT09bVttLmxlbmd0aC0xXT9bclswXSxyWzFdKzFdOnJ9KTtyZXR1cm4gMD09cC5sZW5ndGg/WzAsCjBdOmQzLmV4dGVudChkMy5tZXJnZShwKSl9O2QuY29udGludW91c1NjYWxlSW52ZXJzZUltYWdlPWZ1bmN0aW9uKGcsbCxrKXtyZXR1cm5bZy5pbnZlcnQobCksZy5pbnZlcnQoayldLnNvcnQoKG0scCk9Pm0tcCl9O2QuY3JlYXRlQXhpc1NjYWxlPWZ9KShjLnBhcmFsbGVsX2Nvb3Jkc19wbG90fHwoYy5wYXJhbGxlbF9jb29yZHNfcGxvdD17fSkpfSkoYS5ocGFyYW1zfHwoYS5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0PgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICBzdmcgewogICAgICAgIGZvbnQ6IDEwcHggc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgcGF0aCB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2U6ICNkZGQ7CiAgICAgICAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzOwogICAgICB9CgogICAgICAuZm9yZWdyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAwLjc7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxOwogICAgICB9CgogICAgICAvKiBXaWxsIGJlIHNldCBvbiBmb3JlZ3JvdW5kIHBhdGhzIHRoYXQgYXJlIG5vdCAiY29udGFpbmVkIiBpbiB0aGUgY3VycmVudAogICAgICAgICBheGVzIGJydXNoZXMuIElmIG5vIGJydXNoZXMgYXJlIHNldCwgbm8gcGF0aCB3aWxsIGhhdmUgdGhpcyBjbGFzcy4gKi8KICAgICAgLmZvcmVncm91bmQgLmludmlzaWJsZS1wYXRoIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBTdHlsZSBmb3IgdGhlIHBhdGggY2xvc2VzdCB0byB0aGUgbW91c2UgcG9pbnRlciAodHlwaWNhbGx5IHdpbGwgYmVjb21lCiAgICAgIHRoZSBzZWxlY3RlZCBwYXRoIHdoZW4gdGhlIHVzZXIgY2xpY2tzKS4gKi8KICAgICAgLmZvcmVncm91bmQgLnBlYWtlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDM7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGF0aCBjbGFzcy4gV2UgdXNlICFpbXBvcnRhbnQgdG8gb3ZlcnJpZGUgdGhlCiAgICAgICAgIGlubGluZSBzdHlsZSB0aGF0IHNldHMgdGhlIHJlZ3VsYXIgY29sb3Igb2YgYSBwYXRoLiAqLwogICAgICAuZm9yZWdyb3VuZCAuc2VsZWN0ZWQtcGF0aCB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlOiAjMGYwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgICNjb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5heGlzIHRleHQgewogICAgICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNmZmYsIDFweCAwIDAgI2ZmZiwgMCAtMXB4IDAgI2ZmZiwgLTFweCAwIDAgI2ZmZjsKICAgICAgICBmaWxsOiAjMDAwOwogICAgICAgIGN1cnNvcjogbW92ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC9heGVzLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYocil7cmV0dXJuIG51bGwhPT1yLnNvdXJjZUV2ZW50fWxldCBnOyhmdW5jdGlvbihyKXtyLkxJTkVBUj0iTElORUFSIjtyLkxPRz0iTE9HIjtyLlFVQU5USUxFPSJRVUFOVElMRSI7ci5OT05fTlVNRVJJQz0iTk9OX05VTUVSSUMifSkoZz1kLlNjYWxlVHlwZXx8KGQuU2NhbGVUeXBlPXt9KSk7Y2xhc3MgbHtpc1Bhc3NpbmcoKXtyZXR1cm4hMH19Y2xhc3Mga3tjb25zdHJ1Y3RvcihyLHQsdixBKXt0aGlzLl9sb3dlcj1yO3RoaXMuX3VwcGVyPXQ7dGhpcy5fbG93ZXJPcGVuPXY7dGhpcy5fdXBwZXJPcGVuPUF9aXNQYXNzaW5nKHIpe3JldHVybiB0aGlzLl9iZWZvcmUodGhpcy5fbG93ZXIsciwhdGhpcy5fbG93ZXJPcGVuKSYmdGhpcy5fYmVmb3JlKHIsdGhpcy5fdXBwZXIsIXRoaXMuX3VwcGVyT3Blbil9X2JlZm9yZShyLHQsdil7cmV0dXJuIHY/cjw9dDpyPHR9fWNsYXNzIG17Y29uc3RydWN0b3Iocil7dGhpcy5fZG9tYWluU2V0PQpyfWlzUGFzc2luZyhyKXtyZXR1cm4tMSE9PXRoaXMuX2RvbWFpblNldC5maW5kSW5kZXgodD0+dD09PXIpfX1jbGFzcyBwe2NvbnN0cnVjdG9yKHIsdCx2LEEpe3RoaXMuX3N2Z1Byb3BzPXI7dGhpcy5fc2NoZW1hPXQ7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyPXY7dGhpcy5fY29sSW5kZXg9QTt0aGlzLl9pc0Rpc3BsYXllZD0hMTt0aGlzLl9zY2FsZVR5cGU9dGhpcy5feVNjYWxlPW51bGw7dGhpcy5zZXRCcnVzaFNlbGVjdGlvbihudWxsKX1jb2xJbmRleCgpe3JldHVybiB0aGlzLl9jb2xJbmRleH15U2NhbGUoKXtyZXR1cm4gdGhpcy5feVNjYWxlfXNjYWxlVHlwZSgpe3JldHVybiB0aGlzLl9zY2FsZVR5cGV9YnJ1c2hTZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnJ1c2hTZWxlY3Rpb259aXNEaXNwbGF5ZWQoKXtyZXR1cm4gdGhpcy5faXNEaXNwbGF5ZWR9c2V0QnJ1c2hTZWxlY3Rpb24ocil7dGhpcy5fYnJ1c2hTZWxlY3Rpb249cjt0aGlzLl9icnVzaEZpbHRlcj10aGlzLl9idWlsZEJydXNoRmlsdGVyKHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSwKdGhpcy5zY2FsZVR5cGUoKSx0aGlzLnlTY2FsZSgpKX1zZXREb21haW5BbmRTY2FsZShyLHQpe3RoaXMuX3NjYWxlVHlwZT10O3RoaXMuX3lTY2FsZT1hLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuY3JlYXRlQXhpc1NjYWxlKHIuc2xpY2UoKSx0aGlzLl9zdmdQcm9wcy5oZWlnaHQsdGhpcy5zY2FsZVR5cGUoKSk7dGhpcy5fYnJ1c2hGaWx0ZXI9dGhpcy5fYnVpbGRCcnVzaEZpbHRlcih0aGlzLmJydXNoU2VsZWN0aW9uKCksdGhpcy5zY2FsZVR5cGUoKSx0aGlzLnlTY2FsZSgpKX1icnVzaEZpbHRlcigpe3JldHVybiB0aGlzLl9icnVzaEZpbHRlcn11cGRhdGVET00ocil7dmFyIHQ9ZDMuYXhpc0xlZnQodGhpcy55U2NhbGUoKSk7dGhpcy5zY2FsZVR5cGUoKT09PWcuUVVBTlRJTEUmJih0PXQudGlja1ZhbHVlcyh0aGlzLnlTY2FsZSgpLnF1YW50aWxlcygpKS50aWNrRm9ybWF0KGQzLmZvcm1hdCgiLS42ZyIpKSk7dmFyIHY9ZDMuc2VsZWN0KHIpO3Yuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7CnYuYXBwZW5kKCJnIikuY2xhc3NlZCgiYXhpcyIsITApLmNhbGwodCkuYXBwZW5kKCJ0ZXh0IikuY2xhc3NlZCgiYXhpcy10aXRsZSIsITApLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieSIsLTkpLnRleHQoQT0+YS5ocGFyYW1zLnV0aWxzLnNjaGVtYUNvbHVtbk5hbWUodGhpcy5fc2NoZW1hLEEpKTt2LmNhbGwoZDMuZHJhZygpLm9uKCJzdGFydCIsKCk9PntyLnNldEF0dHJpYnV0ZSgiaXMtZHJhZ2dpbmciLCIiKTt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnU3RhcnQodGhpcy5jb2xJbmRleCgpKX0pLm9uKCJkcmFnIiwoKT0+dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZyhkMy5ldmVudC54KSkub24oImVuZCIsKCk9Pnt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnRW5kKCk7ci5yZW1vdmVBdHRyaWJ1dGUoImlzLWRyYWdnaW5nIil9KSk7dD1kMy5icnVzaFkoKS5leHRlbnQoW1stOCwwXSwKWzgsdGhpcy5fc3ZnUHJvcHMuaGVpZ2h0KzFdXSkub24oInN0YXJ0IiwoKT0+e2YoZDMuZXZlbnQpJiYoci5zZXRBdHRyaWJ1dGUoImlzLWJydXNoaW5nIiwiIiksdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSkpfSkub24oImJydXNoIiwoKT0+e2lmKGYoZDMuZXZlbnQpKXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCkpfSkub24oImVuZCIsKCk9PntmKGQzLmV2ZW50KSYmKHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCkpLHIucmVtb3ZlQXR0cmlidXRlKCJpcy1icnVzaGluZyIpKX0pO3Y9ZDMuc2VsZWN0KHIpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImJydXNoIiwhMCk7di5jYWxsKHQpO3QubW92ZSh2LHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSl9c2V0RGlzcGxheWVkKHIpe3RoaXMuX2lzRGlzcGxheWVkPXJ9X2J1aWxkQnJ1c2hGaWx0ZXIociwKdCx2KXtpZihudWxsPT09cilyZXR1cm4gbmV3IGw7aWYobnVsbD09PXQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlNjYWxlIHR5cGUgaXMgbnVsbCwgYnV0IGJydXNoU2VsZWN0aW9uIGlzbid0OiAiLHIpLG5ldyBsO3N3aXRjaCh0KXtjYXNlIGcuTElORUFSOmNhc2UgZy5MT0c6e2NvbnN0IFtBLHldPWEuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5jb250aW51b3VzU2NhbGVJbnZlcnNlSW1hZ2UodixyWzBdLHJbMV0pO3JldHVybiBuZXcgayhBLHksITEsITEpfWNhc2UgZy5RVUFOVElMRTp7Y29uc3QgW0EseV09YS5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LnF1YW50aWxlU2NhbGVJbnZlcnNlSW1hZ2UodixyWzBdLHJbMV0pO3JldHVybiBuZXcgayhBLHksITEsITApfWNhc2UgZy5OT05fTlVNRVJJQzpyZXR1cm4gbmV3IG0oYS5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LnBvaW50U2NhbGVJbnZlcnNlSW1hZ2UodixyWzBdLHJbMV0pKX1jb25zb2xlLmVycm9yKCJVbmtub3duIHNjYWxlIHR5cGU6ICIsCnQpO3JldHVybiBuZXcgbH19ZC5BeGlzPXA7Y2xhc3MgcXtjb25zdHJ1Y3RvcihyLHQsdil7dGhpcy5fc3ZnUHJvcHM9cjt0aGlzLl9zY2hlbWE9dDt0aGlzLl9heGVzPXRoaXMuX2NyZWF0ZUF4ZXModik7dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnM9ZDMuc2NhbGVQb2ludCgpLnJhbmdlKFsxLHRoaXMuX3N2Z1Byb3BzLndpZHRoLTFdKS5wYWRkaW5nKC41KTt0aGlzLl9kcmFnZ2VkQXhpcz1udWxsO3RoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCJnLmF4aXMtcGFyZW50IikucmVtb3ZlKCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiLmF4aXMtcGFyZW50Iil9dXBkYXRlQXhlcyhyLHQpe2NvbnNvbGUuYXNzZXJ0KCF0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO2NvbnN0IHY9bmV3IFNldDtyLmNvbHVtbnMuZm9yRWFjaCh5PT57Y29uc3QgeD15LmFic29sdXRlSW5kZXg7bGV0IEM9dGhpcy5fYXhlc1t4XTtDLnNldERpc3BsYXllZCghMCk7CmNvbnN0IEY9dC5tYXAoRD0+YS5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsRCx4KSk7Qy5zZXREb21haW5BbmRTY2FsZShGLHkuc2NhbGUpO3YuYWRkKHgpfSk7dGhpcy5fYXhlcy5mb3JFYWNoKHk9Pnt2Lmhhcyh5LmNvbEluZGV4KCkpfHx5LnNldERpc3BsYXllZCghMSl9KTt0aGlzLl91cGRhdGVTdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyh2KTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3BhcmVudHNTZWwuZGF0YShBcnJheS5mcm9tKHYpLHk9PnkpO3RoaXMuX3BhcmVudHNTZWwuZXhpdCgpLnJlbW92ZSgpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fcGFyZW50c1NlbC5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImF4aXMtcGFyZW50IiwhMCkubWVyZ2UodGhpcy5fcGFyZW50c1NlbCk7Y29uc3QgQT10aGlzO3RoaXMuX3BhcmVudHNTZWwuY2FsbCh5PT50aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00oeSkpLmVhY2goZnVuY3Rpb24oeSl7QS5fYXhlc1t5XS51cGRhdGVET00odGhpcyl9KX1tYXBWaXNpYmxlQXhlcyhyKXtyZXR1cm4gdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkubWFwKHQ9PgpyKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHQpLHRoaXMuX2F4ZXNbdF0pKX1hbGxWaXNpYmxlQXhlc1NhdGlzZnkocil7cmV0dXJuIHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpLmV2ZXJ5KHQ9PnIodGhpcy5nZXRBeGlzUG9zaXRpb24odCksdGhpcy5fYXhlc1t0XSkpfWdldEF4aXNGb3JDb2xJbmRleChyKXtyZXR1cm4gdGhpcy5fYXhlc1tyXX1kcmFnU3RhcnQocil7Y29uc29sZS5hc3NlcnQoIXRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7Y29uc29sZS5hc3NlcnQodGhpcy5fYXhlc1tyXS5pc0Rpc3BsYXllZCgpKTt0aGlzLl9kcmFnZ2VkQXhpcz10aGlzLl9heGVzW3JdO3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMocil9ZHJhZyhyKXt0aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uPXI9TWF0aC5taW4oTWF0aC5tYXgociwwKSx0aGlzLl9zdmdQcm9wcy53aWR0aCk7cj10aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKTsKci5zb3J0KCh0LHYpPT50aGlzLmdldEF4aXNQb3NpdGlvbih0KS10aGlzLmdldEF4aXNQb3NpdGlvbih2KSk7dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKHIpO3RoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0aGlzLl9wYXJlbnRzU2VsKX1kcmFnRW5kKCl7Y29uc29sZS5hc3NlcnQodGhpcy5pc0F4aXNEcmFnZ2luZygpKTt0aGlzLl9kcmFnZ2VkQXhpcz10aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uPW51bGw7dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKDUwMCkpfWlzQXhpc0RyYWdnaW5nKCl7cmV0dXJuIG51bGwhPT10aGlzLl9kcmFnZ2VkQXhpc31nZXRBeGlzUG9zaXRpb24ocil7cmV0dXJuIG51bGwhPT10aGlzLl9kcmFnZ2VkQXhpcyYmdGhpcy5fZHJhZ2dlZEF4aXMuY29sSW5kZXgoKT09PXI/dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbjp0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhyKX1fdXBkYXRlU3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMocil7dmFyIHQ9CnRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpLmZpbHRlcih2PT5yLmhhcyh2KSk7dD1BcnJheS5mcm9tKG5ldyBTZXQoWy4uLnQsLi4uQXJyYXkuZnJvbShyKV0pKTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4odCl9X3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTShyKXtyLmF0dHIoInRyYW5zZm9ybSIsdD0+YS5ocGFyYW1zLnV0aWxzLnRyYW5zbGF0ZVN0cih0aGlzLmdldEF4aXNQb3NpdGlvbih0KSkpfV9jcmVhdGVBeGVzKHIpe3JldHVybiBkMy5yYW5nZShhLmhwYXJhbXMudXRpbHMubnVtQ29sdW1ucyh0aGlzLl9zY2hlbWEpKS5tYXAodD0+bmV3IHAodGhpcy5fc3ZnUHJvcHMsdGhpcy5fc2NoZW1hLHIsdCkpfX1kLkF4ZXNDb2xsZWN0aW9uPXF9KShjLnBhcmFsbGVsX2Nvb3Jkc19wbG90fHwoYy5wYXJhbGxlbF9jb29yZHNfcGxvdD17fSkpfSkoYS5ocGFyYW1zfHwoYS5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7Cjwvc2NyaXB0PgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2xpbmVzLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2xldCBmOyhmdW5jdGlvbihrKXtrW2suRk9SRUdST1VORD0wXT0iRk9SRUdST1VORCI7a1trLkJBQ0tHUk9VTkQ9MV09IkJBQ0tHUk9VTkQifSkoZj1kLkxpbmVUeXBlfHwoZC5MaW5lVHlwZT17fSkpO2NsYXNzIGd7Y29uc3RydWN0b3Ioayl7dm9pZCAwPT09ayYmKGs9ZDMuc2VsZWN0QWxsKG51bGwpKTtjb25zb2xlLmFzc2VydCgxPj1rLnNpemUoKSk7dGhpcy5fc2Vzc2lvbkdyb3VwU2VsPWt9c2Vzc2lvbkdyb3VwKCl7cmV0dXJuIDE9PT10aGlzLl9zZXNzaW9uR3JvdXBTZWwuc2l6ZSgpP3RoaXMuX3Nlc3Npb25Hcm91cFNlbC5kYXR1bSgpOm51bGx9aXNOdWxsKCl7cmV0dXJuIG51bGw9PT10aGlzLnNlc3Npb25Hcm91cCgpfXNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9zZXNzaW9uR3JvdXBTZWx9ZXF1YWxzVG8oayl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/ay5pc051bGwoKTprLmlzTnVsbCgpPyExOmsuc2Vzc2lvbkdyb3VwKCkubmFtZT09CnRoaXMuc2Vzc2lvbkdyb3VwKCkubmFtZX19ZC5TZXNzaW9uR3JvdXBIYW5kbGU9ZztjbGFzcyBse2NvbnN0cnVjdG9yKGssbSxwKXt0aGlzLl9zdmdQcm9wcz1rO3RoaXMuX3NjaGVtYT1tO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPXA7dGhpcy5fc2Vzc2lvbkdyb3Vwcz1bXTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5iYWNrZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuZm9yZWdyb3VuZCIpLnJlbW92ZSgpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5hcHBlbmQoImciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kIiwhMCkuc2VsZWN0QWxsKCJwYXRoIik7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZvcmVncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZT0KbmV3IGc7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9bmV3IGc7dGhpcy5fZDNsaW5lPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUxpbmVhcil9Z2V0U2Vzc2lvbkdyb3VwSGFuZGxlKGspe3JldHVybiBudWxsPT09a3x8dm9pZCAwPT09az9uZXcgZzpuZXcgZyh0aGlzLl9mZ1BhdGhzU2VsLmZpbHRlcihtPT5tLm5hbWU9PT1rLm5hbWUpKX1oaWRlQmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9c2hvd0JhY2tncm91bmRMaW5lcygpe3RoaXMuX2JnUGF0aHNTZWwuYXR0cigidmlzaWJpbGl0eSIsbnVsbCl9cGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZX1zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZX1yZWNvbXB1dGVDb250cm9sUG9pbnRzKGssbT0wKXsoaz09PWYuRk9SRUdST1VORD8KdGhpcy5fZmdQYXRoc1NlbDp0aGlzLl9iZ1BhdGhzU2VsKS50cmFuc2l0aW9uKCkuZHVyYXRpb24obSkuYXR0cigiZCIscD0+dGhpcy5fcGF0aERBdHRyaWJ1dGUocCkpO2s9PT1mLkZPUkVHUk9VTkQmJndpbmRvdy5zZXRUaW1lb3V0KCgpPT57Y29uc3QgcD10aGlzO3RoaXMuX2ZnUGF0aHNTZWwuZWFjaChmdW5jdGlvbihxKXtwLl9zZXRDb250cm9sUG9pbnRzUHJvcGVydHkodGhpcyxxKX0pfSl9cmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpe3RoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgiaW52aXNpYmxlLXBhdGgiLGs9PiF0aGlzLl9heGVzQ29sbGVjdGlvbi5hbGxWaXNpYmxlQXhlc1NhdGlzZnkoKG0scCk9PnAuYnJ1c2hGaWx0ZXIoKS5pc1Bhc3NpbmcoYS5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsayxwLmNvbEluZGV4KCkpKSkpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl9c2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IoaywKbSxwKXtrPXRoaXMuX2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGssbSxwKTt0aGlzLl9mZ1BhdGhzU2VsLmF0dHIoInN0cm9rZSIsayl9cmVkcmF3KGssbSxwLHEpe2NvbnN0IHI9dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlc3Npb25Hcm91cCgpLHQ9dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCk7dGhpcy5fc2Vzc2lvbkdyb3Vwcz1rO3RoaXMuX2ZnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9mZ1BhdGhzU2VsKTt0aGlzLl9iZ1BhdGhzU2VsPXRoaXMuX3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24odGhpcy5fYmdQYXRoc1NlbCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHIpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHQpO3RoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhmLkZPUkVHUk9VTkQpOwp0aGlzLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5CQUNLR1JPVU5EKTt0aGlzLnJlY29tcHV0ZUZvcmVncm91bmRMaW5lc1Zpc2liaWxpdHkoKTt0aGlzLnNldEZvcmVncm91bmRMaW5lc0NvbG9yKG0scCxxKX11cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAoayl7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPWs7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMCl9Y2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKXt0aGlzLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChuZXcgZyl9dXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAoayl7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITEpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPQprO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCEwKX1maW5kQ2xvc2VzdFNlc3Npb25Hcm91cChrLG0pe2NvbnN0IHA9dGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMocT0+cSk7az1hLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuZmluZENsb3Nlc3RQYXRoKHRoaXMuX3Zpc2libGVGZ1BhdGhzU2VsLm5vZGVzKCkscCxbayxtXSk7cmV0dXJuIG51bGw9PT1rP25ldyBnOm5ldyBnKGQzLnNlbGVjdChrKSl9X2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGssbSxwKXtpZihudWxsPT09aylyZXR1cm4oKT0+InJlZCI7Y29uc3QgcT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihhLmhwYXJhbXMudXRpbHMubnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLl9zY2hlbWEsdGhpcy5fc2Vzc2lvbkdyb3VwcyxrKSkucmFuZ2UoW20scF0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlTGFiKTtyZXR1cm4gcj0+CnEoYS5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEscixrKSl9X3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24oayl7az1rLmRhdGEodGhpcy5fc2Vzc2lvbkdyb3VwcyxtPT5tLm5hbWUpO2suZXhpdCgpLnJlbW92ZSgpO3JldHVybiBrLmVudGVyKCkuYXBwZW5kKCJwYXRoIikubWVyZ2Uoayl9X3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eShrLG0pe2suY29udHJvbFBvaW50cz10aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhtKX1fY29tcHV0ZUNvbnRyb2xQb2ludHMoayl7cmV0dXJuIHRoaXMuX2F4ZXNDb2xsZWN0aW9uLm1hcFZpc2libGVBeGVzKChtLHApPT5bbSxwLnlTY2FsZSgpKGEuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLGsscC5jb2xJbmRleCgpKSldKX1fcGF0aERBdHRyaWJ1dGUoayl7cmV0dXJuIHRoaXMuX2QzbGluZSh0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhrKSl9X3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl7dGhpcy5fdmlzaWJsZUZnUGF0aHNTZWw9CnRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKCI6bm90KC5pbnZpc2libGUtcGF0aCkiKX19ZC5MaW5lc0NvbGxlY3Rpb249bH0pKGMucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChjLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShhLmhwYXJhbXN8fChhLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKPC9zY3JpcHQ+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvaW50ZXJhY3Rpb25fbWFuYWdlci5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtjbGFzcyBme2NvbnN0cnVjdG9yKGwsayl7dGhpcy5zdmc9ZDMuc2VsZWN0KGwpO2w9MTAwKmsrMjA7dGhpcy5zdmcuYXR0cigidmlld0JveCIsYDAgMCAke2x9ICR7MjQwfWApO3RoaXMuc3ZnLmF0dHIoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4td2lkdGgiLGwrInB4Iik7dGhpcy5zdmcuc3R5bGUoIm1pbi1oZWlnaHQiLCIyNDBweCIpO3RoaXMud2lkdGg9bC0xMC0xMDt0aGlzLmhlaWdodD0yMDA7dGhpcy5zdmdHPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYS5ocGFyYW1zLnV0aWxzLnRyYW5zbGF0ZVN0cigxMCwzMCkpfX1kLlNWR1Byb3BlcnRpZXM9ZjtjbGFzcyBne2NvbnN0cnVjdG9yKGwsayxtLHApe3RoaXMuX3N2Z1Byb3BzPWw7dGhpcy5fc2NoZW1hPWs7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPW07dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0I9CnA7dGhpcy5fYXhlc0NvbGxlY3Rpb249bmV3IGQuQXhlc0NvbGxlY3Rpb24obCxrLHRoaXMpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbj1uZXcgZC5MaW5lc0NvbGxlY3Rpb24obCxrLHRoaXMuX2F4ZXNDb2xsZWN0aW9uKTt0aGlzLl9zdmdQcm9wcy5zdmcub24oImNsaWNrIiwoKT0+dGhpcy5vbkNsaWNrKCkpLm9uKCJtb3VzZW1vdmUgbW91c2VlbnRlciIsKCk9Pntjb25zdCBbcSxyXT1kMy5tb3VzZSh0aGlzLl9zdmdQcm9wcy5zdmdHLm5vZGUoKSk7dGhpcy5vbk1vdXNlTW92ZWQocSxyKX0pLm9uKCJtb3VzZWxlYXZlIiwoKT0+dGhpcy5vbk1vdXNlTGVhdmUoKSl9b25EcmFnU3RhcnQobCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ1N0YXJ0KGwpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5oaWRlQmFja2dyb3VuZExpbmVzKCl9b25EcmFnKGwpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWcobCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZC5MaW5lVHlwZS5GT1JFR1JPVU5EKX1vbkRyYWdFbmQoKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnRW5kKCk7CnRoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGQuTGluZVR5cGUuRk9SRUdST1VORCw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KCgpPT57dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZC5MaW5lVHlwZS5CQUNLR1JPVU5EKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2hvd0JhY2tncm91bmRMaW5lcygpfSw1MDApfW9uQnJ1c2hDaGFuZ2VkKGwpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmdldEF4aXNGb3JDb2xJbmRleChsKS5zZXRCcnVzaFNlbGVjdGlvbihkMy5ldmVudC5zZWxlY3Rpb24pO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVGb3JlZ3JvdW5kTGluZXNWaXNpYmlsaXR5KCl9b25Nb3VzZU1vdmVkKGwsayl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24uZmluZENsb3Nlc3RTZXNzaW9uR3JvdXAobCxrKSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25Nb3VzZUxlYXZlKCl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpLmlzTnVsbCgpfHwKKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQihudWxsKSl9b25DbGljaygpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT09PXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpP3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChuZXcgZC5TZXNzaW9uR3JvdXBIYW5kbGUpOnRoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpKX1vbk9wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKGwsCmspe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLnVwZGF0ZUF4ZXMobCxrKTtjb25zdCBtPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSxwPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWRyYXcoayx2b2lkIDAhPT1sLmNvbG9yQnlDb2x1bW5JbmRleD9sLmNvbHVtbnNbbC5jb2xvckJ5Q29sdW1uSW5kZXhdLmFic29sdXRlSW5kZXg6bnVsbCxsLm1pbkNvbG9yLGwubWF4Q29sb3IpO20uZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKXx8dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSk7cC5lcXVhbHNUbyh0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fAp0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9c2NoZW1hKCl7cmV0dXJuIHRoaXMuX3NjaGVtYX19ZC5JbnRlcmFjdGlvbk1hbmFnZXI9Z30pKGMucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChjLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShhLmhwYXJhbXN8fChhLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKPC9zY3JpcHQ+CiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90Iixwcm9wZXJ0aWVzOntzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6T2JqZWN0LHNlbGVjdGVkU2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sY2xvc2VzdFNlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxyZWFkT25seTohMCxub3RpZnk6ITB9LHJlZHJhd0NvdW50Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfdmFsaWRTZXNzaW9uR3JvdXBzOkFycmF5LF9pbnRlcmFjdGlvbk1hbmFnZXI6T2JqZWN0fSxvYnNlcnZlcnM6WyJfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQob3B0aW9ucy4qLCBzZXNzaW9uR3JvdXBzLiopIl0sX29wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7aWYobnVsbCE9PXRoaXMub3B0aW9ucyl7dmFyIGE9dGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb247aWYodm9pZCAwPT09dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyfHwKIV8uaXNFcXVhbCh0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIuc2NoZW1hKCksYS5zY2hlbWEpKXtkMy5zZWxlY3QodGhpcy4kLnN2Zykuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7Y29uc3QgYz1uZXcgdGYuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5TVkdQcm9wZXJ0aWVzKHRoaXMuJC5zdmcsdGYuaHBhcmFtcy51dGlscy5udW1Db2x1bW5zKGEuc2NoZW1hKSk7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLnN2ZywhMCk7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyPW5ldyB0Zi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LkludGVyYWN0aW9uTWFuYWdlcihjLGEuc2NoZW1hLGQ9PnRoaXMuY2xvc2VzdFNlc3Npb25Hcm91cENoYW5nZWQoZCksZD0+dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQoZCkpfXRoaXMuX2NvbXB1dGVWYWxpZFNlc3Npb25Hcm91cHMoKTt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCh0aGlzLm9wdGlvbnMsCnRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcyk7dGhpcy5yZWRyYXdDb3VudCsrfX0sY2xvc2VzdFNlc3Npb25Hcm91cENoYW5nZWQoYSl7dGhpcy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChhKX0sc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkKGEpe3RoaXMuX3NldFNlbGVjdGVkU2Vzc2lvbkdyb3VwKGEpfSxfY29tcHV0ZVZhbGlkU2Vzc2lvbkdyb3Vwcygpe2NvbnN0IGE9dGYuaHBhcmFtcy51dGlscztpZih2b2lkIDA9PT10aGlzLnNlc3Npb25Hcm91cHMpdGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzPXZvaWQgMDtlbHNle3ZhciBjPXRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uLnNjaGVtYTt0aGlzLl92YWxpZFNlc3Npb25Hcm91cHM9dGhpcy5zZXNzaW9uR3JvdXBzLmZpbHRlcihkPT57Zm9yKGxldCBmPTA7ZjxhLm51bUNvbHVtbnMoYyk7KytmKWlmKHRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uLmNvbHVtbnNWaXNpYmlsaXR5W2ZdJiZ2b2lkIDA9PT1hLmNvbHVtblZhbHVlQnlJbmRleChjLApkLGYpKXJldHVybiExO3JldHVybiEwfSl9fX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICAKICAgIDxkaXYgY2xhc3M9InBhbmUiPgogICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAKICAgICAgICA8dGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMgaWQ9ImNvbnRyb2xzIiBjbGFzcz0ic2VjdGlvbiIgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgb3B0aW9ucz0ie3tfb3B0aW9uc319Ij4KICAgICAgICA8L3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzPgogICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgCiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdCBpZD0icGxvdCIgY2xhc3M9InNlY3Rpb24iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90PgogICAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzIGlkPSJ2YWx1ZXMiIGNsYXNzPSJzZWN0aW9uIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cD0iW1tfY2xvc2VzdE9yU2VsZWN0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nsb3Nlc3RHcm91cCwgX3NlbGVjdGVkR3JvdXApXV0iPgogICAgICAgICAgICA8L3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXM+CiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBpZD0iZGV0YWlscyIgY2xhc3M9InNlY3Rpb24iIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIC5wYW5lIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICAgIH0KICAgICAgI2NvbnRyb2xzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjcGxvdCB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KICAgICAgI3ZhbHVlcyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiA5NXB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgI2RldGFpbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgIHZhYWRpbi1zcGxpdC1sYXlvdXQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldy90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyxjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5fSxfY2xvc2VzdE9yU2VsZWN0ZWQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gbnVsbCE9PWE/YTpjfX0pOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY29udGFpbmVyIj4KICAgICAgPHN2ZyBpZD0ic3ZnIj48L3N2Zz4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAvKiBUaGUgY2xvc2VzdCBkYXRhIHBvaW50IG1hcmtlciB0byB0aGUgbW91c2UgcG9pbnRlci4gV2UgdXNlICFpbXBvcnRhbnQKICAgICAgICAgdG8gb3ZlcnJpZGUgdGhlIGlubGluZSBzdHlsZSB0aGF0IHNldHMgdGhlIHJlZ3VsYXIgc3R5bGUgb2YgYSBtYXJrZXIuCiAgICAgICovCiAgICAgIC5jbG9zZXN0LW1hcmtlciB7CiAgICAgICAgcjogNiAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAvKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGEgcG9pbnQgbWFya2VyLiBXZSB1c2UgIWltcG9ydGFudCB0bwogICAgICAgICBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4gKi8KICAgICAgLnNlbGVjdGVkLW1hcmtlciB7CiAgICAgICAgcjogNiAhaW1wb3J0YW50OwogICAgICAgIGZpbGw6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QvdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLHByb3BlcnRpZXM6e3Zpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2NvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3N2Zzp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sd2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2JydXNoZWRDZWxsSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9icnVzaFNlbGVjdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBzQ2hhbmdlZChzZXNzaW9uR3JvdXBzLiopIiwKIl92aXNpYmxlU2NoZW1hQ2hhbmdlZCh2aXNpYmxlU2NoZW1hLiopIiwiX3JlZHJhdyhvcHRpb25zLiopIl0scmVhZHkoKXt0aGlzLl9jb250YWluZXI9dGhpcy4kLmNvbnRhaW5lcjt0aGlzLl9zdmc9ZDMuc2VsZWN0KHRoaXMuJC5zdmcpO3RoaXMuX3JlZHJhdygpfSxfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmdGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAodGYuaHBhcmFtcy51dGlscy5zZXNzaW9uR3JvdXBXaXRoTmFtZSh0aGlzLnNlc3Npb25Hcm91cHMsdGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cC5uYW1lKXx8bnVsbCk7dGhpcy5fcmVkcmF3KCl9LF92aXNpYmxlU2NoZW1hQ2hhbmdlZCgpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXRoaXMuX2JydXNoZWRDZWxsSW5kZXg9bnVsbDt0aGlzLl9yZWRyYXcoKX0sX3JlZHJhdygpe3RoaXMuZGVib3VuY2UoIl9yZWRyYXciLCgpPT57Y29uc3QgYT10Zi5ocGFyYW1zLnV0aWxzOwp0aGlzLndpZHRoPU1hdGgubWF4KDE1MCphLm51bVZpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZVNjaGVtYSksMTIwMCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgoMTEyLjUqYS5udW1WaXNpYmxlTWV0cmljcyh0aGlzLnZpc2libGVTY2hlbWEpLDQ4MCk7dGhpcy5fY29udGFpbmVyLnN0eWxlLndpZHRoPXRoaXMud2lkdGgrInB4Ijt0aGlzLl9jb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCI7dGhpcy5fc3ZnLmF0dHIoIndpZHRoIix0aGlzLndpZHRoKS5hdHRyKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dGhpcy5fZHJhdygpfSwxMDApfSxfZHJhdygpe2Z1bmN0aW9uIGEobGEpe3JldHVybiJ4LWF4aXMtY2xpcC1wYXRoLSIrbGF9ZnVuY3Rpb24gYyhsYSl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIrbGF9ZnVuY3Rpb24gZChsYSl7cmV0dXJuInktYXhpcy1jbGlwLXBhdGgtIitsYX1mdW5jdGlvbiBmKGxhKXtyZXR1cm4ieS1sYWJlbC1jbGlwLXBhdGgtIisKbGF9ZnVuY3Rpb24gZyhsYSx3YSxDYSx4YSx6YSl7Q2E9TWF0aC5mbG9vcihDYS94YSk7eGE9d2Euc2NhbGUoKTtpZigiUVVBTlRJTEUiPT09emEpe2xldCBGYT14YS5xdWFudGlsZXMoKTtGYT1kMy5yYW5nZSgwLEZhLmxlbmd0aCxNYXRoLmNlaWwoRmEubGVuZ3RoL0NhKSkubWFwKFNhPT5GYVtTYV0pO3dhLnRpY2tWYWx1ZXMoRmEpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjJnIikpfSJMSU5FQVIiIT09emEmJiJMT0ciIT09emF8fHdhLnRpY2tzKENhKTtsYS5jYWxsKHdhKTtsYS5zZWxlY3RBbGwoIi5kb21haW4iKS5yZW1vdmUoKTtsYS5zZWxlY3RBbGwoIi50aWNrIGxpbmUiKS5hdHRyKCJzdHJva2UiLCIjZGRkIil9ZnVuY3Rpb24gbChsYSx3YSl7cmV0dXJuIExbd2FdKHguX2NvbFZhbHVlKGxhLHdhKSl9ZnVuY3Rpb24gayhsYSx3YSl7cmV0dXJuIEpbd2FdKHguX21ldHJpY1ZhbHVlKGxhLHdhKSl9ZnVuY3Rpb24gbShsYSx3YSl7Y29uc3QgQ2E9W107WVtsYV1bd2FdLmVhY2goZnVuY3Rpb24oKXtDYS5wdXNoKHRoaXMpfSk7CnJldHVybiBkMy5xdWFkdHJlZSgpLngoeGE9PmQzLnNlbGVjdCh4YSkuZGF0dW0oKS54KS55KHhhPT5kMy5zZWxlY3QoeGEpLmRhdHVtKCkueSkuYWRkQWxsKENhKX1mdW5jdGlvbiBwKCl7bGV0IGxhPW5ldyBTZXQoVC5ub2RlcygpKTt2KCl8fChsYT1xKHguX2JydXNoZWRDZWxsSW5kZXgseC5fYnJ1c2hTZWxlY3Rpb24pKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh5LmZpbHRlclNldChsYSx3YT0+IWNhLmhhcyh3YSkpKSkuYXR0cigiZmlsbCIsTik7ZDMuc2VsZWN0QWxsKEFycmF5LmZyb20oeS5maWx0ZXJTZXQoY2Esd2E9PiFsYS5oYXMod2EpKSkpLmF0dHIoImZpbGwiLCIjZGRkIik7Y2E9bGF9ZnVuY3Rpb24gcShsYSx3YSl7Y29uc29sZS5hc3NlcnQobnVsbCE9PWxhKTtjb25zb2xlLmFzc2VydChudWxsIT09d2EpO2NvbnN0IFtDYSx4YV09bGEsemE9bmV3IFNldDt5LnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3QoaGFbQ2FdW3hhXSx3YVswXVswXSx3YVswXVsxXSx3YVsxXVswXSwKd2FbMV1bMV0sRmE9PntkMy5zZWxlY3QoRmEpLmRhdHVtKCkuc2Vzc2lvbkdyb3VwTWFya2Vycy5mb3JFYWNoKFNhPT57emEuYWRkKFNhKX0pfSk7cmV0dXJuIHphfWZ1bmN0aW9uIHIobGEpe2NvbnN0IHdhPWQzLmJydXNoU2VsZWN0aW9uKGxhKTshdCgpJiZudWxsPT09d2F8fHQoKSYmbGE9PT1YLm5vZGUoKSYmXy5pc0VxdWFsKHdhLHguX2JydXNoU2VsZWN0aW9uKXx8KHguX2JydXNoU2VsZWN0aW9uPXdhLG51bGwhPT13YT8oWD1kMy5zZWxlY3QobGEpLHguX2JydXNoZWRDZWxsSW5kZXg9WC5kYXR1bSgpKTooWD1udWxsLHguX2JydXNoZWRDZWxsSW5kZXg9bnVsbCkscCgpKX1mdW5jdGlvbiB0KCl7cmV0dXJuIG51bGwhPT14Ll9icnVzaGVkQ2VsbEluZGV4JiZudWxsIT09eC5fYnJ1c2hTZWxlY3Rpb259ZnVuY3Rpb24gdigpe3JldHVybiF0KCl8fHguX2JydXNoU2VsZWN0aW9uWzBdWzBdPT09eC5fYnJ1c2hTZWxlY3Rpb25bMV1bMF18fHguX2JydXNoU2VsZWN0aW9uWzBdWzFdPT09CnguX2JydXNoU2VsZWN0aW9uWzFdWzFdfWZ1bmN0aW9uIEEobGEsd2EsQ2EseGEsemEpe2xldCBGYT1JbmZpbml0eSxTYT1udWxsO3kucXVhZFRyZWVWaXNpdFBvaW50c0luRGlzayhoYVtsYV1bd2FdLENhLHhhLHphLChFYSxHYSk9PntjYS5oYXMoRWEpJiZHYTxGYSYmKEVhPWQzLnNlbGVjdChFYSkuZGF0dW0oKSxGYT1HYSxTYT1FYS5zZXNzaW9uR3JvdXApfSk7cmV0dXJuIG51bGw9PT1TYT9udWxsOmQzLnNlbGVjdEFsbChhYS5nZXQoU2EpKX1jb25zdCB5PXRmLmhwYXJhbXMudXRpbHMseD10aGlzO2lmKHRoaXMuc2Vzc2lvbkdyb3VwcyYmMCE9dGhpcy5zZXNzaW9uR3JvdXBzLmxlbmd0aCYmdGhpcy52aXNpYmxlU2NoZW1hJiYwIT10aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoKXt2YXIgQz1kMy5yYW5nZSh5Lm51bVZpc2libGVDb2x1bW5zKHgudmlzaWJsZVNjaGVtYSkpLEY9ZDMucmFuZ2UoeS5udW1WaXNpYmxlTWV0cmljcyh4LnZpc2libGVTY2hlbWEpKSwKRD1kMy5zY2FsZUJhbmQoKS5kb21haW4oQykucmFuZ2UoWzg1LHRoaXMud2lkdGgtMS01XSkucGFkZGluZ0lubmVyKC4xKSxCPWQzLnNjYWxlQmFuZCgpLmRvbWFpbihGKS5yYW5nZShbdGhpcy5oZWlnaHQtMS01LTUwLDVdKS5wYWRkaW5nSW5uZXIoLjEpLEc9RC5iYW5kd2lkdGgoKSxLPUIuYmFuZHdpZHRoKCksTD1DLm1hcChsYT0+eC5fY2VsbFNjYWxlKGxhLFswLEctMV0pKSxKPUYubWFwKGxhPT54Ll9jZWxsU2NhbGUobGEreS5udW1WaXNpYmxlSFBhcmFtcyh4LnZpc2libGVTY2hlbWEpLFtLLTEsMF0pKSxQPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi54LWF4aXMiKS5kYXRhKEMpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIixsYT0+eS50cmFuc2xhdGVTdHIoRChsYSksMCkpO1AuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixhKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtNSkuYXR0cigieSIsMCkuYXR0cigid2lkdGgiLApHKzEwKS5hdHRyKCJoZWlnaHQiLHguaGVpZ2h0LTI1KTtQLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsYykuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsMCkuYXR0cigieSIseC5oZWlnaHQtMjUpLmF0dHIoIndpZHRoIixHKS5hdHRyKCJoZWlnaHQiLDI1KTtQLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsbGE9PiJ1cmwoIyIrYShsYSkrIikiKS5lYWNoKGZ1bmN0aW9uKGxhKXtkMy5zZWxlY3QodGhpcykuY2FsbChnLGQzLmF4aXNCb3R0b20oTFtsYV0pLnRpY2tTaXplKHguaGVpZ2h0LTUwKSxHLDQwLHgub3B0aW9ucy5jb2x1bW5zW2xhXS5zY2FsZSl9KTtQLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtYXhpcy1sYWJlbCIsITApLmF0dHIoImNsaXAtcGF0aCIsbGE9PiJ1cmwoIyIrYyhsYSkrIikiKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoIngiLEcvMikuYXR0cigieSIseC5oZWlnaHQtMS0xMi41KS50ZXh0KGxhPT55LnNjaGVtYVZpc2libGVDb2x1bW5OYW1lKHgudmlzaWJsZVNjaGVtYSwKbGEpKS5hcHBlbmQoInRpdGxlIikudGV4dChsYT0+eS5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZSh4LnZpc2libGVTY2hlbWEsbGEpKTtQPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi55LWF4aXMiKS5kYXRhKEYpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieS1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIixsYT0+eS50cmFuc2xhdGVTdHIoeC53aWR0aC0xLEIobGEpKSk7UC5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGQpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0oeC53aWR0aC00MC0xKSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIix4LndpZHRoLTQwKS5hdHRyKCJoZWlnaHQiLEsrMTApO1AuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixmKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtKHgud2lkdGgtMSkpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IixLKTtQLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsbGE9PiJ1cmwoIyIrCmQobGEpKyIpIikuZWFjaChmdW5jdGlvbihsYSl7ZDMuc2VsZWN0KHRoaXMpLmNhbGwoZyxkMy5heGlzTGVmdChKW2xhXSkudGlja1NpemUoeC53aWR0aC04MCksSywyMCx4Lm9wdGlvbnMuY29sdW1uc1tsYSt5Lm51bVZpc2libGVIUGFyYW1zKHgudmlzaWJsZVNjaGVtYSldLnNjYWxlKX0pO1AuYXBwZW5kKCJnIikuY2xhc3NlZCgieS1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIixsYT0+InVybCgjIitmKGxhKSsiKSIpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsLSh4LndpZHRoLTIwLTEpKS5hdHRyKCJ5IixLLzIpLmF0dHIoInRyYW5zZm9ybSIseS5yb3RhdGVTdHIoLSh4LndpZHRoLTIwLTEpLEsvMikpLnRleHQobGE9PnkubWV0cmljTmFtZSh4LnZpc2libGVTY2hlbWEubWV0cmljSW5mb3NbbGFdKSkuYXBwZW5kKCJ0aXRsZSIpLnRleHQobGE9PnkubWV0cmljTmFtZSh4LnZpc2libGVTY2hlbWEubWV0cmljSW5mb3NbbGFdKSk7ClA9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLmNlbGwiKS5kYXRhKGQzLmNyb3NzKEMsRikpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiY2VsbCIsITApLmF0dHIoInRyYW5zZm9ybSIsKFtsYSx3YV0pPT55LnRyYW5zbGF0ZVN0cihEKGxhKSxCKHdhKSkpO1AuYXBwZW5kKCJnIikuY2xhc3NlZCgiZnJhbWUiLCEwKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtNSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIixHKzEwKS5hdHRyKCJoZWlnaHQiLEsrMTApLmF0dHIoInN0cm9rZSIsIiMwMDAiKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsImNyaXNwRWRnZXMiKTt2YXIgUz1udWxsO3ZvaWQgMCE9PXgub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgmJihTPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKHRoaXMuX2NvbEV4dGVudCh0aGlzLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSkucmFuZ2UoW3RoaXMub3B0aW9ucy5taW5Db2xvcix0aGlzLm9wdGlvbnMubWF4Q29sb3JdKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUxhYikpOwp2YXIgTj12b2lkIDA9PT14Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4PygpPT4icmVkIjooe3Nlc3Npb25Hcm91cDpsYX0pPT5TKHRoaXMuX2NvbFZhbHVlKGxhLHgub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKSxbVCxZLGFhXT1mdW5jdGlvbihsYSx3YSl7Y29uc3QgQ2E9bGEuc2VsZWN0QWxsKCIuZGF0YS1tYXJrZXIiKS5kYXRhKChbemEsRmFdKT0+eC5zZXNzaW9uR3JvdXBzLmZpbHRlcihTYT0+dm9pZCAwIT09eC5fY29sVmFsdWUoU2EsemEpJiZ2b2lkIDAhPT14Ll9tZXRyaWNWYWx1ZShTYSxGYSkpLm1hcChTYT0+KHtjb2w6emEsbWV0cmljOkZhLHNlc3Npb25Hcm91cDpTYSx4OmwoU2EsemEpLHk6ayhTYSxGYSksc2Vzc2lvbkdyb3VwTWFya2VyczpudWxsfSkpKS5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgiZGF0YS1tYXJrZXIiLCEwKS5hdHRyKCJjeCIsKHt4OnphfSk9PnphKS5hdHRyKCJjeSIsKHt5OnphfSk9PnphKS5hdHRyKCJyIiwyKS5hdHRyKCJmaWxsIiwKd2EpLHhhPW5ldyBNYXA7eC5zZXNzaW9uR3JvdXBzLmZvckVhY2goemE9Pnt4YS5zZXQoemEsW10pfSk7Q2EuZWFjaChmdW5jdGlvbih6YSl7eGEuZ2V0KHphLnNlc3Npb25Hcm91cCkucHVzaCh0aGlzKX0pO0NhLmVhY2goemE9Pntjb25zdCBGYT14YS5nZXQoemEuc2Vzc2lvbkdyb3VwKTt6YS5zZXNzaW9uR3JvdXBNYXJrZXJzPW5ldyBTZXQoRmEpfSk7bGE9Qy5tYXAoemE9PkYubWFwKEZhPT5DYS5maWx0ZXIoU2E9PlNhLmNvbD09emEmJlNhLm1ldHJpYz09RmEpKSk7cmV0dXJuW0NhLGxhLHhhXX0oUC5hcHBlbmQoImciKSxOKSxoYT1DLm1hcChsYT0+Ri5tYXAod2E9Pm0obGEsd2EpKSksWD1udWxsO3QoKSYmKFg9UC5maWx0ZXIobGE9Pl8uaXNFcXVhbChsYSx4Ll9icnVzaGVkQ2VsbEluZGV4KSksY29uc29sZS5hc3NlcnQoMT09WC5zaXplKCksWCkpO3ZhciBjYT1uZXcgU2V0KFQubm9kZXMoKSk7cCgpO3ZhciBlYT1kMy5icnVzaCgpLmV4dGVudChbWy00LC00XSxbRy0xKzUtCjEsSy0xKzUtMV1dKS5vbigic3RhcnQiLGZ1bmN0aW9uKCl7dCgpJiZYLm5vZGUoKSE9dGhpcyYmZWEubW92ZShYLG51bGwpO3IodGhpcyl9KS5vbigiYnJ1c2giLGZ1bmN0aW9uKCl7cih0aGlzKX0pLm9uKCJlbmQiLGZ1bmN0aW9uKCl7cih0aGlzKX0pO1AuY2FsbChlYSk7dCgpJiZlYS5tb3ZlKFgseC5fYnJ1c2hTZWxlY3Rpb24pO3ZhciBrYT1udWxsLGJhPW51bGw7bnVsbCE9PXRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXAmJihiYT1kMy5zZWxlY3RBbGwoYWEuZ2V0KHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXApKS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSk7UC5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGxhPWthPT09YmE/bnVsbDprYTtsYSE9PWJhJiYobnVsbCE9PWJhJiZiYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCExKSxiYT1sYSxudWxsIT09YmEmJmJhLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApLGxhPW51bGw9PT1iYT9udWxsOmJhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwLAp4Ll9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChsYSkpfSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIixmdW5jdGlvbihbbGEsd2FdKXtjb25zdCBbQ2EseGFdPWQzLm1vdXNlKHRoaXMpO2xhPUEobGEsd2EsQ2EseGEsMjApO2thIT09bGEmJihudWxsIT09a2EmJmthLmNsYXNzZWQoImNsb3Nlc3QtbWFya2VyIiwhMSksa2E9bGEsbnVsbCE9PWthPyhrYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITApLHguX3NldENsb3Nlc3RTZXNzaW9uR3JvdXAoa2EuZGF0dW0oKS5zZXNzaW9uR3JvdXApKTp4Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKG51bGwpKX0pLm9uKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe251bGwhPT1rYSYmKGthLmNsYXNzZWQoImNsb3Nlc3QtbWFya2VyIiwhMSksa2E9bnVsbCx4Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKG51bGwpKX0pO3RoaXMuX3N2Zy5zZWxlY3RBbGwoIioiKS5jbGFzc2VkKCJ0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdCIsCiEwKX19LF9jZWxsU2NhbGUoYSxjKXt2YXIgZD10aGlzLl9jb2xFeHRlbnQoYSk7Y29uc3QgZj1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihkKS5yYW5nZShjKTtpZigiTElORUFSIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2FdLnNjYWxlKXJldHVybiBmO2lmKCJMT0ciPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYV0uc2NhbGUpcmV0dXJuIDA+PWRbMF0mJjA8PWRbMV0/ZjpkMy5zY2FsZUxvZygpLmRvbWFpbihkKS5yYW5nZShjKTtpZigiUVVBTlRJTEUiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYV0uc2NhbGUpe2NvbnN0IGc9KGNbMV0tY1swXSkvMTk7ZD1kMy5yYW5nZSgyMCkubWFwKGw9PmNbMF0rZypsKTtyZXR1cm4gZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihfLnVuaXEodGhpcy5zZXNzaW9uR3JvdXBzLm1hcChsPT50aGlzLl9jb2xWYWx1ZShsLGEpKSkpLnJhbmdlKGQpfWlmKCJOT05fTlVNRVJJQyI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1thXS5zY2FsZSlyZXR1cm4gZDMuc2NhbGVQb2ludCgpLmRvbWFpbihfLnVuaXEodGhpcy5zZXNzaW9uR3JvdXBzLm1hcChnPT4KdGhpcy5fY29sVmFsdWUoZyxhKSkuc29ydCgpKSkucmFuZ2UoYykucGFkZGluZyguMSk7dGhyb3ciVW5rbm93biBzY2FsZSBmb3IgY29sdW1uOiAiK2ErIi4gb3B0aW9uczogIit0aGlzLm9wdGlvbnM7fSxfY29sVmFsdWUoYSxjKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5VmlzaWJsZUluZGV4KHRoaXMudmlzaWJsZVNjaGVtYSxhLGMpfSxfbWV0cmljVmFsdWUoYSxjKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy5tZXRyaWNWYWx1ZUJ5VmlzaWJsZUluZGV4KHRoaXMudmlzaWJsZVNjaGVtYSxhLGMpfSxfY29sRXh0ZW50KGEpe3JldHVybiB0Zi5ocGFyYW1zLnV0aWxzLnZpc2libGVOdW1lcmljQ29sdW1uRXh0ZW50KHRoaXMudmlzaWJsZVNjaGVtYSx0aGlzLnNlc3Npb25Hcm91cHMsYSl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldy90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXl9LF9jbG9zZXN0T3JTZWxlY3RlZDpmdW5jdGlvbihhLGMpe3JldHVybiBudWxsIT09YT9hOmN9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiIGNsYXNzPSJ0YWItYmFyIj4KICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWJ9fSIgc2xvdD0idG9wIj4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJ0YWJsZS12aWV3Ij4KICAgICAgICAgICAgVEFCTEUgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbYnVnUmVwb3J0VXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0iYnVnLXJlcG9ydCIgcmFpc2VkIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiPgogICAgICAgICAgICAgICAgICBCdWcgUmVwb3J0IC8gRmVhdHVyZSBSZXF1ZXN0CiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWxwVXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2hlbHBVcmxdXSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIiB0aXRsZT0iVmlldyBkb2N1bWVudGF0aW9uIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci10YWJzPgogICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSJbW19zZWxlY3RlZFRhYl1dIiBjbGFzcz0iZml0IHRhYi12aWV3Ij4KICAgICAgICA8ZGl2IGlkPSIwIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBlbmFibGUtc2hvdy1tZXRyaWNzPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjIiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3PgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tcGFnZXM+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIC50YWItdmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC50YWItYmFyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgfQogICAgICAudGFiIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10YWJzLWNvbnRlbnQ6IHsKICAgICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICB0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgICNidWctcmVwb3J0IHsKICAgICAgICBib3JkZXI6IHNvbGlkIGJsYWNrOwogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmRzOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZS90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxoZWxwVXJsOlN0cmluZyxidWdSZXBvcnRVcmw6U3RyaW5nLGV4cGVyaW1lbnROYW1lOlN0cmluZyxjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LF9zZWxlY3RlZFRhYjp7dHlwZTpOdW1iZXIsdmFsdWU6MH19fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXIvdGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXIiLGhhbmRsZUV2ZW50OmZ1bmN0aW9uKCl7fX0pfSkoKTsKPC9zY3JpcHQ+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtbWFpbiI+CiAgPHRlbXBsYXRlPgogICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDx0Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUgaWQ9InF1ZXJ5LXBhbmUiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0ie3tfY29uZmlndXJhdGlvbn19IiBzZXNzaW9uLWdyb3Vwcz0ie3tfc2Vzc2lvbkdyb3Vwc319Ij4KICAgICAgICA8L3RmLWhwYXJhbXMtcXVlcnktcGFuZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIGlkPSJzZXNzaW9ucy1wYW5lIiBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgaGVscC11cmw9IltbaGVscFVybF1dIiBidWctcmVwb3J0LXVybD0iW1tidWdSZXBvcnRVcmxdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbX2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9IltbX3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmU+CiAgICAgIDwvZGl2PgogICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgPHRmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyIGlkPSJ0cmFja2VyIiB0cmFja2luZy1pZD0iW1t0cmFja2luZ0lkXV0iIG5hbWU9InRmX2hwYXJhbXMiPgogICAgPC90Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlcj4KCiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1zcGxpdC1sYXlvdXQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIG1pbi13aWR0aDogMTAlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd2lkdGg6IDgwJTsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLWhwYXJhbXMtbWFpbi90Zi1ocGFyYW1zLW1haW4uaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1tYWluIixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsdHJhY2tpbmdJZDpTdHJpbmcsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxfY29uZmlndXJhdGlvbjpPYmplY3QsX3Nlc3Npb25Hcm91cHM6QXJyYXksX3Rocm90dGxlZFNlbmRFdmVudFRvR0E6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pl8udGhyb3R0bGUoZnVuY3Rpb24oKXt0aGlzLl9oYW5kbGVHQUV2ZW50KHtkZXRhaWw6e2hpdFR5cGU6ImV2ZW50IixldmVudENhdGVnb3J5OiJVc2VySW50ZXJhY3Rpb24iLGV2ZW50TGFiZWw6IkV4cGVyaW1lbnQ6ICIrdGhpcy5leHBlcmltZW50TmFtZX19KX0sNkU0LHtsZWFkaW5nOiEwfSl9fSxsaXN0ZW5lcnM6e21vdXNlbW92ZToiX3NlbmRFdmVudFRvR0EiLHRhcDoiX3NlbmRFdmVudFRvR0EiLCJnb29nbGUtYW5hbHl0aWNzLXRyYWNraW5nIjoiX2hhbmRsZUdBRXZlbnQifSxhdHRhY2hlZCgpe3RoaXMuX2hhbmRsZUdBRXZlbnQoe2RldGFpbDp7aGl0VHlwZToicGFnZXZpZXcifX0pfSwKcmVsb2FkKCl7dGhpcy4kWyJxdWVyeS1wYW5lIl0ucmVsb2FkKCl9LF9zZW5kRXZlbnRUb0dBKCl7dGhpcy5fdGhyb3R0bGVkU2VuZEV2ZW50VG9HQSh0aGlzKX0sX2hhbmRsZUdBRXZlbnQoYSl7dGhpcy4kLnRyYWNrZXIuaGFuZGxlRXZlbnQoYSl9fSk7Cjwvc2NyaXB0Pgo8L2RvbS1tb2R1bGU+CgoKCjxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ocGFyYW1zLWJhY2tlbmQvdGYtaHBhcmFtcy1iYWNrZW5kLmh0bWwuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXtjbGFzcyBke2NvbnN0cnVjdG9yKGYsZyxsPSEwKXt0aGlzLl9hcGlVcmw9Zjt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1nO3RoaXMuX3VzZUh0dHBHZXQ9bH1nZXRFeHBlcmltZW50KGYpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgiZXhwZXJpbWVudCIsZil9bGlzdFNlc3Npb25Hcm91cHMoZil7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJzZXNzaW9uX2dyb3VwcyIsZil9bGlzdE1ldHJpY0V2YWxzKGYpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgibWV0cmljX2V2YWxzIixmKX1fc2VuZFJlcXVlc3QoZixnKXtpZih0aGlzLl91c2VIdHRwR2V0KXJldHVybiBnPWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShnKSksdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0aGlzLl9hcGlVcmwrIi8iK2YrIj9yZXF1ZXN0XHgzZCIrZyk7Y29uc3QgbD1uZXcgUGsuUmVxdWVzdE9wdGlvbnM7bC53aXRoQ3JlZGVudGlhbHM9ITA7CmwubWV0aG9kVHlwZT0iUE9TVCI7bC5jb250ZW50VHlwZT0idGV4dC9wbGFpbiI7bC5ib2R5PUpTT04uc3RyaW5naWZ5KGcpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0V2l0aE9wdGlvbnModGhpcy5fYXBpVXJsKyIvIitmLGwpfX1jLkJhY2tlbmQ9ZH0pKGEuaHBhcmFtc3x8KGEuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwo8L3NjcmlwdD4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0Zi1ocGFyYW1zLW1haW4gaWQ9ImhwYXJhbXMtbWFpbiIgYmFja2VuZD0iW1tfYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IiI+CiAgICA8L3RmLWhwYXJhbXMtbWFpbj4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1ocGFyYW1zLWRhc2hib2FyZC90Zi1ocGFyYW1zLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLWRhc2hib2FyZCIscHJvcGVydGllczp7X2JhY2tlbmQ6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdGYuaHBhcmFtcy5CYWNrZW5kKFBrLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJocGFyYW1zIiwiIiksbmV3IFBrLlJlcXVlc3RNYW5hZ2VyLCEhKHdpbmRvdy5URU5TT1JCT0FSRF9FTlZ8fHt9KS5JTl9DT0xBQil9fSxyZWxvYWQoKXt0aGlzLiRbImhwYXJhbXMtbWFpbiJdLnJlbG9hZCgpfX0pfSkoKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaW1wb3J0cy9hcnJheS1idWZmZXItZGF0YS1wcm92aWRlci5qcwp2YXIgc3E7CihmdW5jdGlvbihhKXthLkVycm9yQ29kZXM9e0NBTkNFTExFRDoxfTtjb25zdCBjPXtWRVJURVg6MSxGQUNFOjIsQ09MT1I6M30sZD17VkVSVEVYOiJmbG9hdDMyIixGQUNFOiJpbnQzMiIsQ09MT1I6InVpbnQ4In07Y2xhc3MgZntjb25zdHJ1Y3RvcihnKXt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1nO3RoaXMuX2NhbmNlbGxlcj1uZXcgUGsuQ2FuY2VsbGVyfXJlbG9hZChnLGwsayl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3JldHVybiB0aGlzLl9mZXRjaE1ldGFkYXRhKGcsbCxrKX1fZmV0Y2hEYXRhQnlTdGVwKGcsbCxrLG0scCxxKXtmdW5jdGlvbiByKHQpe2xldCB2PVtdO2ZvcihsZXQgQT0wO0E8dC5sZW5ndGgvMztBKyspe2xldCB5PVtdO2ZvcihsZXQgeD0wOzM+eDt4KyspeS5wdXNoKHRbMypBK3hdKTt2LnB1c2goeSl9cmV0dXJuIHZ9Zz1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9kYXRhIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6bCxydW46ZywKY29udGVudF90eXBlOmssc2FtcGxlOm0sc3RlcDpwfSkpO2w9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHQ9PntpZih0LmNhbmNlbGxlZClyZXR1cm4gUHJvbWlzZS5yZWplY3Qoe2NvZGU6YS5FcnJvckNvZGVzLkNBTkNFTExFRCxtZXNzYWdlOiJSZXNwb25zZSB3YXMgaW52YWxpZGF0ZWQuIn0pO3Q9dC52YWx1ZTtzd2l0Y2goayl7Y2FzZSAiVkVSVEVYIjpxLnZlcnRpY2VzPXIobmV3IEZsb2F0MzJBcnJheSh0KSk7YnJlYWs7Y2FzZSAiRkFDRSI6cS5mYWNlcz1yKG5ldyBJbnQzMkFycmF5KHQpKTticmVhaztjYXNlICJDT0xPUiI6cS5jb2xvcnM9cihuZXcgVWludDhBcnJheSh0KSl9cmV0dXJuIHF9KTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goZyxudWxsLCJhcnJheWJ1ZmZlciIsZFtrXSkudGhlbih0PT50LmFycmF5QnVmZmVyKCkpLnRoZW4obCl9ZmV0Y2hEYXRhKGcsbCxrLG0pe2xldCBwPVtdLHE9bmV3IE1hcDtPYmplY3Qua2V5cyhjKS5mb3JFYWNoKHI9Pgp7Zy5jb21wb25lbnRzJjE8PGNbcl0mJnAucHVzaCh0aGlzLl9mZXRjaERhdGFCeVN0ZXAobCxrLHIsbSxnLnN0ZXAscSkpfSk7cmV0dXJuIFByb21pc2UuYWxsKHApfV9mZXRjaE1ldGFkYXRhKGcsbCxrKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Zz1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9tZXNoZXMiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzpsLHJ1bjpnLHNhbXBsZTprfSkpO2w9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKG09Pm0uY2FuY2VsbGVkP1Byb21pc2UucmVqZWN0KHtjb2RlOmEuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTptLnZhbHVlKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goZykudGhlbihtPT5tLmpzb24oKSkudGhlbihsKS50aGVuKHRoaXMuX3Byb2Nlc3NNZXRhZGF0YS5iaW5kKHRoaXMpKX1fcHJvY2Vzc01ldGFkYXRhKGcpe2lmKGcpe3ZhciBsPQpuZXcgTWFwO2ZvcihsZXQgbT0wO208Zy5sZW5ndGg7bSsrKXtsZXQgcD1nW21dO2wuaGFzKHAuc3RlcCl8fGwuc2V0KHAuc3RlcCxbXSk7bC5nZXQocC5zdGVwKS5wdXNoKHApfXZhciBrPVtdO2wuZm9yRWFjaChtPT57bT10aGlzLl9jcmVhdGVTdGVwRGF0dW0obVswXSk7ay5wdXNoKG0pfSk7cmV0dXJuIGt9fV9jcmVhdGVTdGVwRGF0dW0oZyl7cmV0dXJue3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqZy53YWxsX3RpbWUpLHN0ZXA6Zy5zdGVwLGNvbmZpZzpnLmNvbmZpZyxjb250ZW50X3R5cGU6Zy5jb250ZW50X3R5cGUsY29tcG9uZW50czpnLmNvbXBvbmVudHN9fX1hLkFycmF5QnVmZmVyRGF0YVByb3ZpZGVyPWZ9KShzcXx8KHNxPXt9KSk7Cjwvc2NyaXB0Pgo8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtaW1wb3J0cy9tZXNoLXZpZXdlci5qcwooZnVuY3Rpb24oYSl7Y2xhc3MgYyBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlcntjb25zdHJ1Y3RvcihkKXtzdXBlcigpO3RoaXMuX2xhc3RNZXNoPW51bGw7dGhpcy5fY2xvY2s9bmV3IFRIUkVFLkNsb2NrO3RoaXMuX2NhbnZhc1NpemU9bnVsbDt0aGlzLl9ydW5Db2xvcj1kfV9pc09iamVjdChkKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGQmJm51bGwhPWQmJiFBcnJheS5pc0FycmF5KGQpfV9hcHBseURlZmF1bHRzKGQsZil7bGV0IGc9e307ZD1bZCxmXTtmb3IoZj0wO2Y8ZC5sZW5ndGg7ZisrKXtjb25zdCBsPWRbZl07Zm9yKGxldCBrIGluIGwpe2NvbnN0IG09ayBpbiBnO3RoaXMuX2lzT2JqZWN0KGxba10pP2dba109dGhpcy5fYXBwbHlEZWZhdWx0cyhnW2tdfHx7fSxsW2tdKTptfHwoZ1trXT1sW2tdKX19cmV0dXJuIGd9X2NyZWF0ZVdvcmxkKGQsZil7dGhpcy5pc1JlYWR5KCl8fCh0aGlzLl9zY2VuZT1uZXcgVEhSRUUuU2NlbmUsdGhpcy5fY2FtZXJhPWQ9bmV3IFRIUkVFW2QuY2FtZXJhLmNsc10oZC5jYW1lcmEuZm92LAp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0LGQuY2FtZXJhLm5lYXIsZC5jYW1lcmEuZmFyKSxmPW5ldyBUSFJFRS5PcmJpdENvbnRyb2xzKGQsZiksZi5sb29rU3BlZWQ9LjQsZi5tb3ZlbWVudFNwZWVkPTIwLGYubm9GbHk9ITAsZi5sb29rVmVydGljYWw9ITAsZi5jb25zdHJhaW5WZXJ0aWNhbD0hMCxmLnZlcnRpY2FsTWluPTEsZi52ZXJ0aWNhbE1heD0yLGYuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpLHRoaXMuX2NhbWVyYUNvbnRyb2xzPWYsdGhpcy5fcmVuZGVyZXI9bmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe2FudGlhbGlhczohMH0pLHRoaXMuX3JlbmRlcmVyLnNldFBpeGVsUmF0aW8oKSx0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpLHRoaXMuX3JlbmRlcmVyLnNldENsZWFyQ29sb3IoMTY3NzcyMTUsCjEpKX1fY2xlYXJTY2VuZSgpe2Zvcig7MDx0aGlzLl9zY2VuZS5jaGlsZHJlbi5sZW5ndGg7KXRoaXMuX3NjZW5lLnJlbW92ZSh0aGlzLl9zY2VuZS5jaGlsZHJlblswXSl9Z2V0UmVuZGVyZXIoKXtyZXR1cm4gdGhpcy5fcmVuZGVyZXJ9Z2V0Q2FtZXJhQ29udHJvbHMoKXtyZXR1cm4gdGhpcy5fY2FtZXJhQ29udHJvbHN9aXNSZWFkeSgpe3JldHVybiEhdGhpcy5fY2FtZXJhJiYhIXRoaXMuX2NhbWVyYUNvbnRyb2xzfWdldENhbWVyYVBvc2l0aW9uKCl7cmV0dXJue2Zhcjp0aGlzLl9jYW1lcmEuZmFyLHBvc2l0aW9uOnRoaXMuX2NhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLHRhcmdldDp0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQuY2xvbmUoKX19c2V0Q2FudmFzU2l6ZShkKXt0aGlzLl9jYW52YXNTaXplPWR9ZHJhdygpe3RoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgpO3RoaXMuX2NhbWVyYS5hc3BlY3Q9CnRoaXMuX2NhbnZhc1NpemUud2lkdGgvdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQ7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpO2NvbnN0IGQ9ZnVuY3Rpb24oKXt2YXIgZj10aGlzLl9jbG9jay5nZXREZWx0YSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZShmKTt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4PXJlcXVlc3RBbmltYXRpb25GcmFtZShkKTt0aGlzLl9yZW5kZXJlci5yZW5kZXIodGhpcy5fc2NlbmUsdGhpcy5fY2FtZXJhKX0uYmluZCh0aGlzKTtkKCl9dXBkYXRlU2NlbmUoZCxmKXtsZXQgZz17fTsiY29uZmlnImluIGQmJmQuY29uZmlnJiYoZz1KU09OLnBhcnNlKGQuY29uZmlnKSk7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJiZWZvcmVVcGRhdGVTY2VuZSJ9KTtnPXRoaXMuX2FwcGx5RGVmYXVsdHMoZyx7Y2FtZXJhOntjbHM6IlBlcnNwZWN0aXZlQ2FtZXJhIiwKZm92Ojc1LG5lYXI6LjEsZmFyOjFFM30sbGlnaHRzOlt7Y2xzOiJBbWJpZW50TGlnaHQiLGNvbG9yOiIjZmZmZmZmIixpbnRlbnNpdHk6Ljc1fSx7Y2xzOiJEaXJlY3Rpb25hbExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NSxwb3NpdGlvbjpbMCwtMSwyXX1dfSk7dGhpcy5fY3JlYXRlV29ybGQoZyxmKTt0aGlzLl9jbGVhclNjZW5lKCk7dGhpcy5fY3JlYXRlTGlnaHRzKHRoaXMuX3NjZW5lLGcpO3RoaXMuX2NyZWF0ZUdlb21ldHJ5KGQsZyk7dGhpcy5kcmF3KCl9cmVzZXRWaWV3KCl7aWYodGhpcy5pc1JlYWR5KCkpe3RoaXMuX2NhbWVyYUNvbnRyb2xzLnJlc2V0KCk7aWYoIWQmJnRoaXMuX2xhc3RNZXNoKXZhciBkPXRoaXMuX2xhc3RNZXNoO2QmJih0aGlzLl9maXRPYmplY3RUb1ZpZXdwb3J0KGQpLHRoaXMuX2xhc3RNZXNoPWQpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpfX1fY3JlYXRlR2VvbWV0cnkoZCxmKXtkPWQubWVzaDtkLnZlcnRpY2VzJiZkLmZhY2VzJiYKZC5mYWNlcy5sZW5ndGg/dGhpcy5fY3JlYXRlTWVzaChkLGYpOnRoaXMuX2NyZWF0ZVBvaW50Q2xvdWQoZCxmKX1fY3JlYXRlUG9pbnRDbG91ZChkLGYpe3ZhciBnPWQudmVydGljZXM7ZD1kLmNvbG9ycztsZXQgbD17bWF0ZXJpYWw6e2NsczoiUG9pbnRzTWF0ZXJpYWwiLHNpemU6LjAwNX19O2QmJmQubGVuZ3RoPT1nLmxlbmd0aD9sLm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnM6bC5tYXRlcmlhbC5jb2xvcj10aGlzLl9ydW5Db2xvcjtmPXRoaXMuX2FwcGx5RGVmYXVsdHMoZixsKTt2YXIgaz1uZXcgVEhSRUUuR2VvbWV0cnk7Zy5mb3JFYWNoKGZ1bmN0aW9uKG0pe3ZhciBwPW5ldyBUSFJFRS5WZWN0b3IzKG1bMF0sbVsxXSxtWzJdKTtwLng9MSptWzBdO3AueT0xKm1bMV07cC56PTEqbVsyXTtrLnZlcnRpY2VzLnB1c2gocCl9KTtkJiZkLmxlbmd0aD09Zy5sZW5ndGgmJmQuZm9yRWFjaChmdW5jdGlvbihtKXttPW5ldyBUSFJFRS5Db2xvcihtWzBdLzI1NSwKbVsxXS8yNTUsbVsyXS8yNTUpO2suY29sb3JzLnB1c2gobSl9KTtnPW5ldyBUSFJFRVtmLm1hdGVyaWFsLmNsc10oZi5tYXRlcmlhbCk7Zz1uZXcgVEhSRUUuUG9pbnRzKGssZyk7dGhpcy5fc2NlbmUuYWRkKGcpO3RoaXMuX2xhc3RNZXNoPWd9c2V0Q2FtZXJhVmlld3BvaW50KGQsZixnKXt0aGlzLl9zaWxlbnQ9ITA7dGhpcy5fY2FtZXJhLmZhcj1mO3RoaXMuX2NhbWVyYS5wb3NpdGlvbi5zZXQoZC54LGQueSxkLnopO3RoaXMuX2NhbWVyYS5sb29rQXQoZy5jbG9uZSgpKTt0aGlzLl9jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnRhcmdldD1nLmNsb25lKCk7dGhpcy5fY2FtZXJhQ29udHJvbHMudXBkYXRlKCk7dGhpcy5fc2lsZW50PSExfV9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlKGQpe3RoaXMuX3NpbGVudHx8dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsZXZlbnQ6ZH0pfV9maXRPYmplY3RUb1ZpZXdwb3J0KGQpe3ZhciBmPQpuZXcgVEhSRUUuQm94MztmLnNldEZyb21PYmplY3QoZCk7ZD1mLmNlbnRlcigpO3ZhciBnPWYuc2l6ZSgpO2c9MS4yNSpNYXRoLmFicyhNYXRoLm1heChnLngsZy55LGcueikvKDIqTWF0aC50YW4oTWF0aC5QSS8xODAqdGhpcy5fY2FtZXJhLmZvdi8yKSkpO2Y9Zi5taW4uejt0aGlzLnNldENhbWVyYVZpZXdwb2ludCh7eDpkLngseTpkLnksejpnfSwzKigwPmY/LWYrZzpnLWYpLGQpfV9jcmVhdGVNZXNoKGQsZil7dmFyIGc9ZC52ZXJ0aWNlcztjb25zdCBsPWQuZmFjZXMsaz1kLmNvbG9ycztkPXRoaXMuX2FwcGx5RGVmYXVsdHMoZix7bWF0ZXJpYWw6e2NsczoiTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLGNvbG9yOiIjYTBhMGEwIixyb3VnaG5lc3M6MSxtZXRhbG5lc3M6MH19KTtsZXQgbT1uZXcgVEhSRUUuR2VvbWV0cnk7Zy5mb3JFYWNoKGZ1bmN0aW9uKHApe2xldCBxPW5ldyBUSFJFRS5WZWN0b3IzKHBbMF0scFsxXSxwWzJdKTtxLng9MSpwWzBdO3EueT0xKnBbMV07cS56PTEqcFsyXTsKbS52ZXJ0aWNlcy5wdXNoKHEpfSk7bC5mb3JFYWNoKGZ1bmN0aW9uKHApe2xldCBxPW5ldyBUSFJFRS5GYWNlMyhwWzBdLHBbMV0scFsyXSk7aWYoayYmay5sZW5ndGgpe3A9W2tbcFswXV0sa1twWzFdXSxrW3BbMl1dXTtmb3IobGV0IHQ9MDt0PHAubGVuZ3RoO3QrKyl7dmFyIHI9cFt0XTtyPW5ldyBUSFJFRS5Db2xvcihyWzBdLzI1NSxyWzFdLzI1NSxyWzJdLzI1NSk7cS52ZXJ0ZXhDb2xvcnMucHVzaChyKX19bS5mYWNlcy5wdXNoKHEpfSk7ayYmay5sZW5ndGgmJihkLm1hdGVyaWFsPWQubWF0ZXJpYWx8fHt9LGQubWF0ZXJpYWwudmVydGV4Q29sb3JzPVRIUkVFLlZlcnRleENvbG9ycyk7bS5jZW50ZXIoKTttLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO20uY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtnPW5ldyBUSFJFRVtkLm1hdGVyaWFsLmNsc10oZC5tYXRlcmlhbCk7Zz1uZXcgVEhSRUUuTWVzaChtLGcpO2cuY2FzdFNoYWRvdz0hMDtnLnJlY2VpdmVTaGFkb3c9ITA7dGhpcy5fc2NlbmUuYWRkKGcpOwp0aGlzLl9sYXN0TWVzaD1nfV9jcmVhdGVMaWdodHMoZCxmKXtmb3IobGV0IGc9MDtnPGYubGlnaHRzLmxlbmd0aDtnKyspe2NvbnN0IGw9Zi5saWdodHNbZ107bGV0IGs9bmV3IFRIUkVFW2wuY2xzXShsLmNvbG9yLGwuaW50ZW5zaXR5KTtsLnBvc2l0aW9uJiZrLnBvc2l0aW9uLnNldChsLnBvc2l0aW9uWzBdLGwucG9zaXRpb25bMV0sbC5wb3NpdGlvblsyXSk7ZC5hZGQoayl9fX1hLk1lc2hWaWV3ZXI9Y30pKHNxfHwoc3E9e30pKTsKPC9zY3JpcHQ+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbWVzaC1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgY29sb3I9IltbX3J1bkNvbG9yXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1oZWFkZXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19nZXRTYW1wbGVUZXh0KHNhbXBsZSldXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPltbdG9Mb2NhbGVTdHJpbmdfKF9zdGVwVmFsdWUpXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudFdhbGxUaW1lXV0iPgogICAgICAgICAgICAgIFtbX2N1cnJlbnRXYWxsVGltZV1dCiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIHJpZ2h0Ij4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shX2lzTWVzaExvYWRpbmddXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBtYXgtbWFya2Vycz0iW1tfZ2V0TWF4U3RlcEluZGV4KF9zdGVwcyldXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7X3N0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHN0eWxlPgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxcHg7CiAgICAgIH0KICAgICAgLnRmLW1lc2gtbG9hZGVyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDVweDsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIDxzY3JpcHQ+Ly9+fldFQlBBVEh+fi90Zi1tZXNoLWRhc2hib2FyZC9tZXNoLWxvYWRlci5qcwooZnVuY3Rpb24oYSl7UG9seW1lcih7aXM6InRmLW1lc2gtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHNlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsdmFsdWU6ImFsbCJ9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21lc2hWaWV3ZXI6e3R5cGU6T2JqZWN0fSxfZGF0YVByb3ZpZGVyOnt0eXBlOk9iamVjdH0sX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PlpsLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfc3RlcHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLG5vdGlmeTohMH0sX3N0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxfY3VycmVudFN0ZXA6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwKF9zdGVwcywgX3N0ZXBJbmRleCkifSwKX21lc2hWaWV3ZXJBdHRhY2hlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc3RlcFZhbHVlOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVTdGVwVmFsdWUoX2N1cnJlbnRTdGVwKSJ9LF9jdXJyZW50V2FsbFRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShfY3VycmVudFN0ZXApIn0sX2lzTWVzaExvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZywgYWN0aXZlLCBfZGF0YVByb3ZpZGVyLCBfbWVzaFZpZXdlcikiLCJfdXBkYXRlU2NlbmUoX2N1cnJlbnRTdGVwLiosIF9tZXNoVmlld2VyKSIsIl9kZWJvdW5jZWRGZXRjaE1lc2goX2N1cnJlbnRTdGVwKSIsIl91cGRhdGVWaWV3KHNlbGVjdGVkVmlldykiXSxfY29tcHV0ZVJ1bkNvbG9yOmZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24oYyl9LAphdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RhdGFQcm92aWRlcj1uZXcgYS5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcih0aGlzLnJlcXVlc3RNYW5hZ2VyKTtjb25zdCBjPW5ldyBhLk1lc2hWaWV3ZXIodGhpcy5fcnVuQ29sb3IpO2MuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlVXBkYXRlU2NlbmUiLHRoaXMuX3VwZGF0ZUNhbnZhc1NpemUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTt0aGlzLl9tZXNoVmlld2VyPWN9LHJlbG9hZDpmdW5jdGlvbigpe3RoaXMuYWN0aXZlJiZ0aGlzLl9kYXRhUHJvdmlkZXImJih0aGlzLnNldCgiX2lzTWVzaExvYWRpbmciLCEwKSx0aGlzLl9kYXRhUHJvdmlkZXIucmVsb2FkKHRoaXMucnVuLHRoaXMudGFnLHRoaXMuc2FtcGxlKS50aGVuKGM9PntjJiYodGhpcy5zZXQoIl9zdGVwcyIsYyksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLApjLmxlbmd0aC0xKSl9KS5jYXRjaChjPT57aWYoIWN8fCFjLmNvZGV8fGMuY29kZSE9YS5FcnJvckNvZGVzLkNBTkNFTExFRCl0aHJvdyBFcnJvcihjfHwiUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuIik7fSkpfSxfdXBkYXRlU2NlbmU6ZnVuY3Rpb24oKXtjb25zdCBjPXRoaXMuX2N1cnJlbnRTdGVwO2MmJmMubWVzaCYmKHRoaXMuX21lc2hWaWV3ZXIudXBkYXRlU2NlbmUoYyx0aGlzKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkfHwodGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkPSEwKSx0aGlzLl9tZXNoVmlld2VyQXR0YWNoZWR8fCh0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5fbWVzaFZpZXdlci5nZXRSZW5kZXJlcigpLmRvbUVsZW1lbnQpLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZD0hMCkpfSxfZGVib3VuY2VkRmV0Y2hNZXNoKCl7dGhpcy5kZWJvdW5jZSgiZmV0Y2hNZXNoIiwoKT0+dGhpcy5fbWF5YmVGZXRjaE1lc2goKSwKMTAwKX0sX21heWJlRmV0Y2hNZXNoKCl7Y29uc3QgYz10aGlzO3JldHVybiBEYihmdW5jdGlvbiooKXtjb25zdCBkPWMuX2N1cnJlbnRTdGVwO2lmKGQmJiFkLm1lc2gmJiFkLm1lc2hGZXRjaGluZyl7ZC5tZXNoRmV0Y2hpbmc9ITA7Yy5faXNNZXNoTG9hZGluZz0hMDt0cnl7Y29uc3QgZj15aWVsZCBjLl9kYXRhUHJvdmlkZXIuZmV0Y2hEYXRhKGQsYy5ydW4sYy50YWcsYy5zYW1wbGUpO2QubWVzaD1mWzBdO2Mubm90aWZ5UGF0aCgiX2N1cnJlbnRTdGVwLm1lc2giKX1jYXRjaChmKXtpZighZnx8IWYuY29kZXx8Zi5jb2RlIT1hLkVycm9yQ29kZXMuQ0FOQ0VMTEVEKXRocm93IGY9Znx8IlJlc3BvbnNlIHByb2Nlc3NpbmcgZmFpbGVkLiIsRXJyb3IoZik7fWZpbmFsbHl7Yy5faXNNZXNoTG9hZGluZz0hMSxkLm1lc2hGZXRjaGluZz0hMX19fSl9LF9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWVzaFZpZXdlci5pc1JlYWR5KCkpe3ZhciBjPW5ldyBDdXN0b21FdmVudCgiY2FtZXJhLXBvc2l0aW9uLWNoYW5nZSIsCntkZXRhaWw6dGhpcy5fbWVzaFZpZXdlci5nZXRDYW1lcmFQb3NpdGlvbigpfSk7dGhpcy5kaXNwYXRjaEV2ZW50KGMpfX0sc2V0Q2FtZXJhVmlld3BvaW50OmZ1bmN0aW9uKGMsZCxmKXt0aGlzLl9tZXNoVmlld2VyLnNldENhbWVyYVZpZXdwb2ludChjLGQsZil9LF91cGRhdGVDYW52YXNTaXplOmZ1bmN0aW9uKCl7Y29uc3QgYz10aGlzLm9mZnNldFdpZHRoLGQ9dGhpcy4kJCgiLnRmLW1lc2gtbG9hZGVyLWhlYWRlciIpLm9mZnNldEhlaWdodDt0aGlzLl9tZXNoVmlld2VyLnNldENhbnZhc1NpemUoe3dpZHRoOmMsaGVpZ2h0OmMtZH0pfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDYW52YXNTaXplKCk7dGhpcy5pc0Nvbm5lY3RlZCYmdGhpcy5fbWVzaFZpZXdlci5kcmF3KCl9LF9oYXNBdExlYXN0T25lU3RlcDpmdW5jdGlvbihjKXtyZXR1cm4hIWMmJjA8Yy5sZW5ndGh9LF9oYXNNdWx0aXBsZVN0ZXBzOmZ1bmN0aW9uKGMpe3JldHVybiEhYyYmMTxjLmxlbmd0aH0sX2NvbXB1dGVDdXJyZW50U3RlcDpmdW5jdGlvbihjLApkKXtyZXR1cm4gY1tkXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWU6ZnVuY3Rpb24oYyl7cmV0dXJuIGM/Yy5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lOmZ1bmN0aW9uKGMpe3JldHVybiBjP2ZtLmZvcm1hdERhdGUoYy53YWxsX3RpbWUpOiIifSxfZ2V0TWF4U3RlcEluZGV4OmZ1bmN0aW9uKGMpe3JldHVybiBjLmxlbmd0aC0xfSxfZ2V0U2FtcGxlVGV4dDpmdW5jdGlvbihjKXtyZXR1cm4gU3RyaW5nKGMrMSl9LF9oYXNNdWx0aXBsZVNhbXBsZXM6ZnVuY3Rpb24oYyl7cmV0dXJuIDE8Y30sX3VwZGF0ZVZpZXc6ZnVuY3Rpb24oYyl7dGhpcy5fbWVzaFZpZXdlciYmImFsbCI9PWMmJnRoaXMuX21lc2hWaWV3ZXIucmVzZXRWaWV3KCl9LHRvTG9jYWxlU3RyaW5nXzpmdW5jdGlvbihjKXtyZXR1cm4gYy50b0xvY2FsZVN0cmluZygpfX0pfSkoc3F8fChzcT17fSkpOwo8L3NjcmlwdD4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0ibWVzaC1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IHNsb3Q9InNpZGViYXIiIGNsYXNzPSJhbGwtY29udHJvbHMiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiB2aWV3LWNvbnRyb2wiPgogICAgICAgICAgPGgzIGNsYXNzPSJ0aXRsZSI+UG9pbnQgb2YgdmlldzwvaDM+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgaWQ9InZpZXctcmFkaW8tZ3JvdXAiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFZpZXd9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0iYWxsLXJhZGlvLWJ1dHRvbiIgbmFtZT0iYWxsIj4KICAgICAgICAgICAgICAgIERpc3BsYXkgYWxsIHBvaW50cwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJhbGwtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICBab29tIGFuZCBjZW50ZXIgY2FtZXJhIHRvIGRpc3BsYXkgYWxsIHBvaW50cyBhdCBvbmNlLiBOb3RlLCB0aGF0CiAgICAgICAgICAgICAgICBzb21lIHBvaW50cyBjb3VsZCBiZSB0b28gZmFyIChpLmUuIHRvbyBzbWFsbCkgdG8gYmUgdmlzaWJsZS4KICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0idXNlci1yYWRpby1idXR0b24iIG5hbWU9InVzZXIiPgogICAgICAgICAgICAgICAgQ3VycmVudCB2aWV3CiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InVzZXItcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICBLZWVwIGN1cnJlbnQgY2FtZXJhIHBvc2l0aW9uIGFuZCB6b29tIGxldmVsLgogICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJzaGFyZS1yYWRpby1idXR0b24iIG5hbWU9InNoYXJlIj4KICAgICAgICAgICAgICAgIFNoYXJlIHZpZXdwb2ludAogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJzaGFyZS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgIFNoYXJlIHZpZXdwb2ludCBhbW9uZyBhbGwgY2FtZXJhcy4KICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gcG9pbnQgY2xvdWQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBwb2ludCBjbG91ZCBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1tZXNoLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHNlbGVjdGVkLXZpZXc9IltbX3NlbGVjdGVkVmlld11dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiBvZi1zYW1wbGVzPSJbW2l0ZW0ub2ZTYW1wbGVzXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWNvbnRhaW5lciIgb24tY2FtZXJhLXBvc2l0aW9uLWNoYW5nZT0iX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2VkIj4KICAgICAgICAgICAgICAgIDwvdGYtbWVzaC1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KICAgICAgLnNpZGViYXItc2VjdGlvbiBoMy50aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAucnVucy1zZWxlY3RvciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIGgzLnRpdGxlIHsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC52aWV3LWNvbnRyb2wgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQogICAgICAvKiBMYXlvdXQgbXVzdCBiZSBob3Jpem9udGFsLCBpLmUuIGl0ZW1zIGFycmFuZ2VkIGluIGEgcm93LiBJZiBpdGVtcyBjYW5ub3QgZml0IGluIGEgcm93LAogICAgICAgKiB0aGV5IHNob3VsZCBiZSBtb3ZlZCB0byBuZXh0IGxpbmUuIEFsbCBpdGVtcyBtdXN0IGJlIHNxdWFyZSBhdCBhbGwgdGltZXMuIE1pbmltdW0gc2l6ZSBvZgogICAgICAgKiB0aGUgaXRlbSBpcyA0ODBweC4gVGhpcyBtZWFucyB0aGF0IG1heGltdW0gc2l6ZSBvZiB0aGUgaXRlbSBtdXN0IGJlIDQ4MHB4ICsgNDc5cHggPSA5NTlweC4KICAgICAgICogKi8KICAgICAgLmhvcml6b250YWwgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgdGYtbWVzaC1sb2FkZXIgewogICAgICAgIHdpZHRoOiA0ODBweDsKICAgICAgICBmbGV4LWJhc2lzOiA0ODBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgPHNjcmlwdD4vL35+V0VCUEFUSH5+L3RmLW1lc2gtZGFzaGJvYXJkL3RmLW1lc2gtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Im1lc2gtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiLioifSxfc2VsZWN0ZWRWaWV3Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsdmFsdWU6ImFsbCJ9LF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlcikifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUGsuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCgpPT57dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCl9LCExKTt0aGlzLnJlbG9hZCgpfSxfZ2V0QWxsQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLW1lc2gtbG9hZGVyIil9LApfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQoYSl7InNoYXJlIj09dGhpcy5fc2VsZWN0ZWRWaWV3JiZ0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYz0+e2EudGFyZ2V0IT1jJiZjLnNldENhbWVyYVZpZXdwb2ludChhLmRldGFpbC5wb3NpdGlvbixhLmRldGFpbC5mYXIsYS5kZXRhaWwudGFyZ2V0KX0pfSxfc2hvdWxkT3BlbihhKXtyZXR1cm4gMj49YX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbih0aGlzLl9yZWxvYWRNZXNoZXMuYmluZCh0aGlzKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYT0+e2EucmVkcmF3KCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGE9UGsuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYz0+e2lmKCFfLmlzRXF1YWwoYyx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZD1fLm1hcFZhbHVlcyhjLApmPT5PYmplY3Qua2V5cyhmKSk7ZD1Qay5nZXRUYWdzKGQpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09ZC5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixjKX19KX0sX3JlbG9hZE1lc2hlcygpe3RoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaChhPT57YS5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYSxjLGQpe2Z1bmN0aW9uIGYobCl7Y29uc3Qgaz1hW2wucnVuXVtsLnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShrKS5tYXAobT0+T2JqZWN0LmFzc2lnbih7fSxsLHtzYW1wbGU6bSxvZlNhbXBsZXM6a30pKX1jb25zdCBnPV8ubWFwVmFsdWVzKGEsbD0+T2JqZWN0LmtleXMobCkpO3JldHVybiBRay5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGcsYyxkKS5tYXAobD0+T2JqZWN0LmFzc2lnbih7fSxsLHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sbC5pdGVtcy5tYXAoZikpfSkpfX0pfSkoKTsKPC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvcmJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIHdpdGgtYmFja2Ryb3AgaWQ9InNldHRpbmdzIj4KICAgICAgPGgyPlNldHRpbmdzPC9oMj4KICAgICAgPHBhcGVyLWNoZWNrYm94IGlkPSJhdXRvLXJlbG9hZC1jaGVja2JveCIgY2hlY2tlZD0ie3thdXRvUmVsb2FkRW5hYmxlZH19Ij4KICAgICAgICBSZWxvYWQgZGF0YSBldmVyeSA8c3Bhbj5bW2F1dG9SZWxvYWRJbnRlcnZhbFNlY3NdXTwvc3Bhbj5zLgogICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICA8cGFwZXItaW5wdXQgaWQ9InBhZ2luYXRpb25MaW1pdElucHV0IiBsYWJlbD0iUGFnaW5hdGlvbiBsaW1pdCIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiBvbi1jaGFuZ2U9Il9wYWdpbmF0aW9uTGltaXRDaGFuZ2VkIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcGFnaW5hdGlvbkxpbWl0VmFsaWRhdGUiPjwvcGFwZXItaW5wdXQ+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxwYXBlci1oZWFkZXItcGFuZWw+CiAgICAgIDxwYXBlci10b29sYmFyIGlkPSJ0b29sYmFyIiBzbG90PSJoZWFkZXIiIGNsYXNzPSJoZWFkZXIiPgogICAgICAgIDxkaXYgaWQ9InRvb2xiYXItY29udGVudCIgc2xvdD0idG9wIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzTm90TG9hZGVkXV0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idG9vbGJhci1tZXNzYWdlIj4KICAgICAgICAgICAgICBMb2FkaW5nIGFjdGl2ZSBkYXNoYm9hcmRz4oCmCiAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNMb2FkZWRdXSI+CiAgICAgICAgICAgIDxwYXBlci10YWJzIG5vaW5rIHNjcm9sbGFibGUgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkRGFzaGJvYXJkfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJkYXRhLWRhc2hib2FyZCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZGFzaGJvYXJkRGF0YV1dIiBhcz0iZGFzaGJvYXJkRGF0dW0iPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0Rhc2hib2FyZEFjdGl2ZShkaXNhYmxlZERhc2hib2FyZHMsIF9hY3RpdmVEYXNoYm9hcmRzLCBkYXNoYm9hcmREYXR1bSldXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10YWIgZGF0YS1kYXNoYm9hcmQkPSJbW2Rhc2hib2FyZERhdHVtLnBsdWdpbl1dIiB0aXRsZT0iW1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV0iPgogICAgICAgICAgICAgICAgICAgIFtbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdGFiPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaW5hY3RpdmVEYXNoYm9hcmRzRXhpc3QoX2Rhc2hib2FyZERhdGEsIGRpc2FibGVkRGFzaGJvYXJkcywgX2FjdGl2ZURhc2hib2FyZHMpXV0iPgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJJTkFDVElWRSIgbm8tbGFiZWwtZmxvYXQgbm9pbmsgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMnB4Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJpbmFjdGl2ZS1kYXNoYm9hcmRzLW1lbnUiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZERhc2hib2FyZH19IiBhdHRyLWZvci1zZWxlY3RlZD0iZGF0YS1kYXNoYm9hcmQiPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19kYXNoYm9hcmREYXRhXV0iIGFzPSJkYXNoYm9hcmREYXR1bSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0Rhc2hib2FyZEluYWN0aXZlKGRpc2FibGVkRGFzaGJvYXJkcywgX2FjdGl2ZURhc2hib2FyZHMsIGRhc2hib2FyZERhdHVtKV1dIiByZXN0YW1wPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gZGF0YS1kYXNoYm9hcmQkPSJbW2Rhc2hib2FyZERhdHVtLnBsdWdpbl1dIj5bW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJnbG9iYWwtYWN0aW9ucyI+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpZD0icmVsb2FkLWJ1dHRvbiIgY2xhc3MkPSJbW19nZXREYXRhUmVmcmVzaGluZ0NsYXNzKF9yZWZyZXNoaW5nKV1dIiBkaXNhYmxlZCQ9IltbX2lzUmVsb2FkRGlzYWJsZWRdXSIgaWNvbj0icmVmcmVzaCIgb24tdGFwPSJyZWxvYWQiIHRpdGxlJD0iTGFzdCB1cGRhdGVkOiBbW19sYXN0UmVsb2FkVGltZVNob3J0XV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncyIgb24tdGFwPSJvcGVuU2V0dGluZ3MiIGlkPSJzZXR0aW5ncy1idXR0b24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YWJpbmRleD0iLTEiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci10b29sYmFyPgoKICAgICAgPGRpdiBpZD0iY29udGVudC1wYW5lIiBjbGFzcz0iZml0Ij4KICAgICAgICA8c2xvdCBpZD0iaW5qZWN0ZWQtb3ZlcnZpZXciPjwvc2xvdD4KICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZy1tZXNzYWdlIj4KICAgICAgICAgICAgICA8aDM+RmFpbGVkIHRvIGxvYWQgdGhlIHNldCBvZiBhY3RpdmUgZGFzaGJvYXJkcy48L2gzPgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgVGhpcyBjYW4gb2NjdXIgaWYgdGhlIFRlbnNvckJvYXJkIGJhY2tlbmQgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcuCiAgICAgICAgICAgICAgICBQZXJoYXBzIHRoaXMgcGFnZSBpcyBjYWNoZWQ/CiAgICAgICAgICAgICAgCgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIHRoYXQgeW914oCZdmUgZml4ZWQgdGhlIHByb2JsZW0sIGNsaWNrIHRoZSByZWxvYWQKICAgICAgICAgICAgICAgIGJ1dHRvbiBpbiB0aGUgdG9wLXJpZ2h0LgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2F1dG9SZWxvYWRFbmFibGVkXV0iPgogICAgICAgICAgICAgICAgICBXZeKAmWxsIHRyeSB0byByZWxvYWQgZXZlcnkKICAgICAgICAgICAgICAgICAgW1thdXRvUmVsb2FkSW50ZXJ2YWxTZWNzXV0mbmJzcDtzZWNvbmRzIGFzIHdlbGwuCiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIAoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxpPkxhc3QgcmVsb2FkOiBbW19sYXN0UmVsb2FkVGltZV1dPC9pPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9jYXRpb25dXSI+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+TG9nIGRpcmVjdG9yeToKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvd05vRGFzaGJvYXJkc01lc3NhZ2VdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmctbWVzc2FnZSI+CiAgICAgICAgICAgICAgPGgzPk5vIGRhc2hib2FyZHMgYXJlIGFjdGl2ZSBmb3IgdGhlIGN1cnJlbnQgZGF0YSBzZXQuPC9oMz4KICAgICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgICAgCgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGk+TGFzdCByZWxvYWQ6IFtbX2xhc3RSZWxvYWRUaW1lXV08L2k+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFMb2NhdGlvbl1dIj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT48cD4KICAgICAgICAgICAgICAgICAgICA8aT5EYXRhIGxvY2F0aW9uOgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRhdGFfbG9jYXRpb24iPltbX2RhdGFMb2NhdGlvbl1dPC9zcGFuPjwvaT4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZy1tZXNzYWdlIj4KICAgICAgICAgICAgICA8aDM+CiAgICAgICAgICAgICAgICBUaGVyZeKAmXMgbm8gZGFzaGJvYXJkIGJ5IHRoZSBuYW1lIG9mCiAgICAgICAgICAgICAgICDigJw8dHQ+W1tfc2VsZWN0ZWREYXNoYm9hcmRdXTwvdHQ+LuKAnQogICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzTG9hZGVkXV0iPgogICAgICAgICAgICAgICAgPHA+WW91IGNhbiBzZWxlY3QgYSBkYXNoYm9hcmQgZnJvbSB0aGUgbGlzdCBhYm92ZS48L3RlbXBsYXRlPgoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxpPkxhc3QgcmVsb2FkOiBbW19sYXN0UmVsb2FkVGltZV1dPC9pPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9jYXRpb25dXSI+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaWQ9ImRhc2hib2FyZHMtdGVtcGxhdGUiIGl0ZW1zPSJbW19kYXNoYm9hcmREYXRhXV0iIGFzPSJkYXNoYm9hcmREYXR1bSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhc2hib2FyZC1jb250YWluZXIiIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSIgZGF0YS1zZWxlY3RlZCQ9IltbX3NlbGVjdGVkU3RhdHVzKF9zZWxlY3RlZERhc2hib2FyZCwgZGFzaGJvYXJkRGF0dW0ucGx1Z2luKV1dIj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItaGVhZGVyLXBhbmVsPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTEwMCk7CiAgICAgIH0KCiAgICAgICN0b29sYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGRpc3BsYXk6IHZhcigtLXRiLXRvb2xiYXItdGl0bGUtZGlzcGxheSwgYmxvY2spOwogICAgICB9CgogICAgICAudG9vbGJhci1tZXNzYWdlIHsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWljb246IHsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHBhcGVyLWl0ZW0gewogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH0KCiAgICAgICNpbmFjdGl2ZS1kYXNoYm9hcmRzLW1lbnUgewogICAgICAgIC0tcGFwZXItbGlzdGJveC1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmdsb2JhbC1hY3Rpb25zIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgI3Rvb2xiYXItY29udGVudCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgI2NvbnRlbnQtcGFuZSB7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0cmV0Y2g7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250ZW50IHsKICAgICAgICBmbGV4OiAxIDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmRhc2hib2FyZC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLyogSGlkZSB1bnNlbGVjdGVkIGRhc2hib2FyZHMuIFdlIHN0aWxsIGRpc3BsYXkgdGhlbSB3aXRoaW4gYSBjb250YWluZXIKICAgICAgICAgb2YgaGVpZ2h0IDAgc2luY2UgUGxvdHRhYmxlIHByb2R1Y2VzIGRlZ2VuZXJhdGUgY2hhcnRzIHdoZW4gY2hhcnRzIGFyZQogICAgICAgICByZWxvYWRlZCB3aGlsZSBub3QgZGlzcGxheWVkLiAqLwogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lcjpub3QoW2RhdGEtc2VsZWN0ZWRdKSB7CiAgICAgICAgbWF4LWhlaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAvKiogV2UgZnVydGhlciBtYWtlIGNvbnRhaW5lcnMgaW52aXNpYmxlLiBTb21lIGVsZW1lbnRzIG1heSBhbmNob3IgdG8KICAgICAgICAgICAgdGhlIHZpZXdwb3J0IGluc3RlYWQgb2YgdGhlIGNvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSBzZXR0aW5nIHRoZSBtYXgKICAgICAgICAgICAgaGVpZ2h0IGhlcmUgdG8gMCB3aWxsIG5vdCBoaWRlIHRoZW0uICovCiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciBpZnJhbWUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC53YXJuaW5nLW1lc3NhZ2UgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CgogICAgICBbZGlzYWJsZWRdIHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjcmVsb2FkLWJ1dHRvbi5yZWZyZXNoaW5nIHsKICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaWQ9ImNvbGFiTm90U3VwcG9ydGVkIiBwcmVzZXJ2ZS1jb250ZW50PgogICAgICA8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6IDU0MHB4OyBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87Ij4KICAgICAgICA8aDM+RHluYW1pYyBwbHVnaW4gaXNu4oCZdCBzdXBwb3J0ZWQgaW4gQ29sYWIgeWV0LjwvaDM+CiAgICAgICAgPHA+CiAgICAgICAgICBQbGVhc2Ugc2VlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkxMyIgcmVsPSJub29wZW5lciIgdGFyZ2V0PSJfYmxhbmsiPkdpdEh1YiBpc3N1ZSAjMTkxMzwvYT4KICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgIAogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtdGVuc29yYm9hcmQvYXV0b1JlbG9hZEJlaGF2aW9yLmpzCihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKCl7cmV0dXJuKG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkpLmhhcygiX0Rpc2FibGVBdXRvUmVsb2FkIil9YS5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVk9IlRGLlRlbnNvckJvYXJkLmF1dG9SZWxvYWRFbmFibGVkIjthLkF1dG9SZWxvYWRCZWhhdmlvcj17cHJvcGVydGllczp7YXV0b1JlbG9hZEVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2F1dG9SZWxvYWRPYnNlcnZlciIsdmFsdWU6KCk9Pnt2YXIgZD13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYS5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVkpO3JldHVybiJ0cnVlIj09PWR8fG51bGw9PWR9fSxfYXV0b1JlbG9hZElkOnt0eXBlOk51bWJlcn0sYXV0b1JlbG9hZEludGVydmFsU2Vjczp7dHlwZTpOdW1iZXIsdmFsdWU6MzB9fSxkZXRhY2hlZDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKX0sCl9hdXRvUmVsb2FkT2JzZXJ2ZXI6ZnVuY3Rpb24oZCl7d2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGEuQVVUT1JFTE9BRF9MT0NBTFNUT1JBR0VfS0VZLGQpO2QmJiFjKCk/dGhpcy5fYXV0b1JlbG9hZElkPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9kb0F1dG9SZWxvYWQoKSwxRTMqdGhpcy5hdXRvUmVsb2FkSW50ZXJ2YWxTZWNzKTp3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2F1dG9SZWxvYWRJZCl9LF9kb0F1dG9SZWxvYWQ6ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLnJlbG9hZCl0aHJvdyBFcnJvcigiQXV0b1JlbG9hZEJlaGF2aW9yIHJlcXVpcmVzIGEgcmVsb2FkIG1ldGhvZCIpO3RoaXMucmVsb2FkKCk7dGhpcy5fYXV0b1JlbG9hZElkPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9kb0F1dG9SZWxvYWQoKSwxRTMqdGhpcy5hdXRvUmVsb2FkSW50ZXJ2YWxTZWNzKX19fSkoJGx8fCgkbD17fSkpOwo8L3NjcmlwdD4KICA8c2NyaXB0Pi8vfn5XRUJQQVRIfn4vdGYtdGVuc29yYm9hcmQvdGYtdGVuc29yYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yYm9hcmQiLGJlaGF2aW9yczpbJGwuQXV0b1JlbG9hZEJlaGF2aW9yXSxwcm9wZXJ0aWVzOnticmFuZDp7dHlwZTpTdHJpbmcsdmFsdWU6IlRlbnNvckJvYXJkLVgifSx0aXRsZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il91cGRhdGVUaXRsZSJ9LHJvdXRlcjp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVSb3V0ZXIifSxkZW1vRGlyOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx1c2VIYXNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVkRGFzaGJvYXJkczp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9kYXNoYm9hcmREYXRhOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhc2hib2FyZERhdGEoX2Rhc2hib2FyZFJlZ2lzdHJ5KSJ9LF9kYXNoYm9hcmRSZWdpc3RyeTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkUmVnaXN0cnkoX3BsdWdpbnNMaXN0aW5nKSJ9LF9wbHVnaW5zTGlzdGluZzp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfYWN0aXZlRGFzaGJvYXJkczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmQoX2Rhc2hib2FyZERhdGEsIF9wbHVnaW5zTGlzdGluZykifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6JGwuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5OT1RfTE9BREVEfSxfYWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmRzTG9hZGVkKF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlKSJ9LF9hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSwKX3Nob3dOb0Rhc2hib2FyZHNNZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU2hvd05vRGFzaGJvYXJkc01lc3NhZ2UoX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQsIF9hY3RpdmVEYXNoYm9hcmRzLCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3Nob3dOb1N1Y2hEYXNoYm9hcmRNZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2UoX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQsIF9kYXNoYm9hcmRSZWdpc3RyeSwgX3NlbGVjdGVkRGFzaGJvYXJkKSJ9LF9zZWxlY3RlZERhc2hib2FyZDp7dHlwZTpTdHJpbmcsdmFsdWU6VmwuZ2V0U3RyaW5nKFZsLlRBQil8fG51bGwsb2JzZXJ2ZXI6Il9zZWxlY3RlZERhc2hib2FyZENoYW5nZWQifSxfZGFzaGJvYXJkVG9NYXliZVJlbW92ZTpTdHJpbmcsX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2lzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITF9LF9sYXN0UmVsb2FkVGltZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vdCB5ZXQgbG9hZGVkIn0sX2xhc3RSZWxvYWRUaW1lU2hvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJOb3QgeWV0IGxvYWRlZCJ9LF9kYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBQay5SZXF1ZXN0TWFuYWdlcn0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBQay5DYW5jZWxsZXJ9LF9yZWZyZXNoaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbkNvbGFiOnt0eXBlOkJvb2xlYW4sdmFsdWU6KCk9PiEhKHdpbmRvdy5URU5TT1JCT0FSRF9FTlZ8fHt9KS5JTl9DT0xBQixyZWFkT25seTohMH19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21BY3RpdmUoX3NlbGVjdGVkRGFzaGJvYXJkLCBfYWN0aXZlRGFzaGJvYXJkcykiLCJfZW5zdXJlU2VsZWN0ZWREYXNoYm9hcmRTdGFtcGVkKF9kYXNoYm9hcmRSZWdpc3RyeSwgX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkLCBfYWN0aXZlRGFzaGJvYXJkcywgX3NlbGVjdGVkRGFzaGJvYXJkKSJdLApfYWN0aXZlRGFzaGJvYXJkc1VwZGF0ZWQoKXt9LF9pc0Rhc2hib2FyZEFjdGl2ZShhLGMsZCl7cmV0dXJuIDA8PShhfHwiIikuc3BsaXQoIiwiKS5pbmRleE9mKGQucGx1Z2luKXx8IShjfHxbXSkuaW5jbHVkZXMoZC5wbHVnaW4pPyExOiEwfSxfaXNEYXNoYm9hcmRJbmFjdGl2ZShhLGMsZCl7cmV0dXJuIDA8PShhfHwiIikuc3BsaXQoIiwiKS5pbmRleE9mKGQucGx1Z2luKT8hMTooY3x8W10pLmluY2x1ZGVzKGQucGx1Z2luKT8hMTohMH0sX2luYWN0aXZlRGFzaGJvYXJkc0V4aXN0KGEsYyxkKXtpZighZClyZXR1cm4hMTtjb25zdCBmPW5ldyBTZXQ7YS5mb3JFYWNoKGc9PntmLmFkZChnLnBsdWdpbil9KTsoY3x8IiIpLnNwbGl0KCIsIikuZm9yRWFjaChnPT57Zi5kZWxldGUoZy5wbHVnaW4pfSk7ZC5mb3JFYWNoKGc9PntmLmRlbGV0ZShnKX0pO3JldHVybiAwPGYuc2l6ZX0sX2dldERhc2hib2FyZEZyb21JbmRleChhLGMpe3JldHVybiBhW2NdfSxfc2VsZWN0ZWRTdGF0dXMoYSwKYyl7cmV0dXJuIGE9PT1jfSxfc2VsZWN0ZWREYXNoYm9hcmRDaGFuZ2VkKGEpe2E9YXx8IiI7Vmwuc2V0U3RyaW5nKFZsLlRBQixhKTtnYSgic2V0IiwicGFnZSIsIi8iK2EpO2dhKCJzZW5kIiwicGFnZXZpZXciKX0sX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUFjdGl2ZShhLGMpe2MmJm51bGw9PWEmJihhPWNbMF18fG51bGwsbnVsbCE9YSYmKFZsLnNldFN0cmluZyhWbC5UQUIsYSx7dXNlTG9jYXRpb25SZXBsYWNlOiEwfSksdGhpcy5fc2VsZWN0ZWREYXNoYm9hcmQ9YSkpfSxfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tSGFzaCgpe2NvbnN0IGE9VmwuZ2V0U3RyaW5nKFZsLlRBQik7dGhpcy5zZXQoIl9zZWxlY3RlZERhc2hib2FyZCIsYXx8bnVsbCl9LF9lbnN1cmVTZWxlY3RlZERhc2hib2FyZFN0YW1wZWQoYSxjLGQsZil7aWYoZCYmZiYmY1tmXSYmKGM9dGhpcy5fZGFzaGJvYXJkVG9NYXliZVJlbW92ZSx0aGlzLl9kYXNoYm9hcmRUb01heWJlUmVtb3ZlPWYsYyYmCmMhPWYmJmFbY10ucmVtb3ZlRG9tJiYoYz10aGlzLiQkKGAuZGFzaGJvYXJkLWNvbnRhaW5lcltkYXRhLWRhc2hib2FyZD0ke2N9XWApLGMuZmlyc3RDaGlsZCYmYy5maXJzdENoaWxkLnJlbW92ZSgpKSxjPXRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7Zn1dYCkpKXthPWFbZl07aWYoMD09PWMuY2hpbGRyZW4ubGVuZ3RoKXN3aXRjaChkPWEubG9hZGluZ01lY2hhbmlzbSxkLnR5cGUpe2Nhc2UgIkNVU1RPTV9FTEVNRU5UIjpmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZC5lbGVtZW50TmFtZSk7Zi5pZD0iZGFzaGJvYXJkIjtjLmFwcGVuZENoaWxkKGYpO2JyZWFrO2Nhc2UgIklGUkFNRSI6dGhpcy5fcmVuZGVyUGx1Z2luSWZyYW1lKGMsZixkKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiSW52YXJpYW50IHZpb2xhdGlvbjoiLGQpfXRoaXMuc2V0KCJfaXNSZWxvYWREaXNhYmxlZCIsYS5kaXNhYmxlUmVsb2FkKX19LF9yZW5kZXJQbHVnaW5JZnJhbWUoYSwKYyxkKXtpZih0aGlzLl9pbkNvbGFiKWQ9ZG9jdW1lbnQuaW1wb3J0Tm9kZSh0aGlzLiQuY29sYWJOb3RTdXBwb3J0ZWQuY29udGVudCwhMCksZC5pZD0iZGFzaGJvYXJkIix0aGlzLnNjb3BlU3VidHJlZShkKSxhLmFwcGVuZENoaWxkKGQpO2Vsc2V7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5pZD0iZGFzaGJvYXJkIjt0aGlzLnNjb3BlU3VidHJlZShmKTthLmFwcGVuZENoaWxkKGYpO2E9Zi5jb250ZW50RG9jdW1lbnQ7Zj1Qay5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZShjLCIvIik7Yz1hLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Y9SlNPTi5zdHJpbmdpZnkobmV3IFVSTChmLHdpbmRvdy5sb2NhdGlvbi5ocmVmKSk7ZD1KU09OLnN0cmluZ2lmeShkLm1vZHVsZVBhdGgpO2MudGV4dENvbnRlbnQ9WydzZXRUaW1lb3V0KCgpIFx4M2RceDNlIHtcbiAgY29uc3QgYmFzZSBceDNkIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJhc2UiKTtcbicsYCAgYmFzZS5zZXRBdHRyaWJ1dGUoImhyZWYiLCAke2Z9KTtcbmAsCiIgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYmFzZSk7XG4iLGAgIGltcG9ydCgke2R9KS50aGVuKChtKSA9PiB2b2lkIG0ucmVuZGVyKCkpO1xuYCwifSwgMCk7XG4iXS5qb2luKCIiKTthLmJvZHkuYXBwZW5kQ2hpbGQoYyl9fSxfc2VsZWN0ZWREYXNoYm9hcmRDb21wb25lbnQoKXtyZXR1cm4gdGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHt0aGlzLl9zZWxlY3RlZERhc2hib2FyZH1dICNkYXNoYm9hcmRgKX0scmVhZHkoKXtSay5zZXRVc2VIYXNoKHRoaXMudXNlSGFzaCk7dGhpcy5fdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tSGFzaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKX0sITEpO1BrLmVudmlyb25tZW50U3RvcmUuYWRkTGlzdGVuZXIoKCk9Pnt0aGlzLl9kYXRhTG9jYXRpb249UGsuZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKTsKY29uc3QgYT1Qay5lbnZpcm9ubWVudFN0b3JlLmdldFdpbmRvd1RpdGxlKCk7YSYmKHdpbmRvdy5kb2N1bWVudC50aXRsZT1hKX0pO3RoaXMuJCQoIiNkYXNoYm9hcmRzLXRlbXBsYXRlIikuYWRkRXZlbnRMaXN0ZW5lcigiZG9tLWNoYW5nZSIsKCk9Pntjb25zdCBhPXt9O2Zvcihjb25zdCBjIG9mIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGFzaGJvYXJkLWNvbnRhaW5lciIpKWFbYy5kYXRhc2V0LmRhc2hib2FyZF09ITA7dGhpcy5fZGFzaGJvYXJkQ29udGFpbmVyc1N0YW1wZWQ9YX0sITEpO3RoaXMuX3JlbG9hZERhdGEoKTt0aGlzLl9sYXN0UmVsb2FkVGltZT0obmV3IERhdGUpLnRvU3RyaW5nKCl9LF9jb21wdXRlQWN0aXZlRGFzaGJvYXJkKCl7cmV0dXJuIHRoaXMuX2Rhc2hib2FyZERhdGE/dGhpcy5fZGFzaGJvYXJkRGF0YS5tYXAoYT0+YS5wbHVnaW4pLmZpbHRlcihhPT57YT10aGlzLl9wbHVnaW5zTGlzdGluZ1thXTtyZXR1cm4iYm9vbGVhbiI9PT10eXBlb2YgYT8KYTphJiZhLmVuYWJsZWR9KTpbXX0sX2NvbXB1dGVEYXNoYm9hcmRSZWdpc3RyeShhKXtjb25zdCBjPXt9O2Zvcihjb25zdCBbZixnXW9mIE9iamVjdC5lbnRyaWVzKCRsLmRhc2hib2FyZFJlZ2lzdHJ5KSljW2ZdPXtwbHVnaW46Zy5wbHVnaW4sbG9hZGluZ01lY2hhbmlzbTp7dHlwZToiQ1VTVE9NX0VMRU1FTlQiLGVsZW1lbnROYW1lOmcuZWxlbWVudE5hbWV9LHRhYk5hbWU6Zy50YWJOYW1lLnRvVXBwZXJDYXNlKCksZGlzYWJsZVJlbG9hZDpnLmlzUmVsb2FkRGlzYWJsZWR8fCExLHJlbW92ZURvbTpnLnJlbW92ZURvbXx8ITF9O2lmKG51bGwhPWEpZm9yKGNvbnN0IFtmLGddb2YgT2JqZWN0LmVudHJpZXMoYSkpaWYoImJvb2xlYW4iIT09dHlwZW9mIGcpe3N3aXRjaChnLmxvYWRpbmdfbWVjaGFuaXNtLnR5cGUpe2Nhc2UgIk5PTkUiOm51bGw9PWNbZl0mJmNvbnNvbGUud2FybigiUGx1Z2luIGhhcyBubyBsb2FkaW5nIG1lY2hhbmlzbSBhbmQgbm8gYmFrZWQtaW4gcmVnaXN0cnkgZW50cnk6ICVzIiwKZik7Y29udGludWU7Y2FzZSAiQ1VTVE9NX0VMRU1FTlQiOnZhciBkPXt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6Zy5sb2FkaW5nX21lY2hhbmlzbS5lbGVtZW50X25hbWV9O2JyZWFrO2Nhc2UgIklGUkFNRSI6ZD17dHlwZToiSUZSQU1FIixtb2R1bGVQYXRoOmcubG9hZGluZ19tZWNoYW5pc20ubW9kdWxlX3BhdGh9O2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJVbmtub3duIGxvYWRpbmcgbWVjaGFuaXNtIGZvciBwbHVnaW4gJXM6ICVzIixmLGcubG9hZGluZ19tZWNoYW5pc20pO2NvbnRpbnVlfW51bGw9PWQmJmNvbnNvbGUuZXJyb3IoIkludmFyaWFudCB2aW9sYXRpb246IGxvYWRpbmdNZWNoYW5pc20gaXMgJXMgZm9yICVzIixkLGYpO2NbZl09e3BsdWdpbjpmLGxvYWRpbmdNZWNoYW5pc206ZCx0YWJOYW1lOmcudGFiX25hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmcuZGlzYWJsZV9yZWxvYWQscmVtb3ZlRG9tOmcucmVtb3ZlX2RvbX19ZD17fTsKZm9yKGNvbnN0IGYgb2YgT2JqZWN0LmtleXMoYSkpY1tmXSYmKGRbZl09Y1tmXSk7T2JqZWN0LmFzc2lnbihkLGMpO3JldHVybiBkfSxfY29tcHV0ZURhc2hib2FyZERhdGEoYSl7cmV0dXJuIE9iamVjdC52YWx1ZXMoYSl9LF9mZXRjaFBsdWdpbnNMaXN0aW5nKCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2NvbnN0IGE9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGM9PntjLmNhbmNlbGxlZHx8KHRoaXMuX3BsdWdpbnNMaXN0aW5nPWMudmFsdWUsdGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT0kbC5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkxPQURFRCl9KTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChQay5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGEsKCk9Pnt0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPT09JGwuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5OT1RfTE9BREVEP3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9CiRsLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuRkFJTEVEOmNvbnNvbGUud2FybigiRmFpbGVkIHRvIHJlbG9hZCB0aGUgc2V0IG9mIGFjdGl2ZSBwbHVnaW5zOyB1c2luZyBvbGQgdmFsdWUuIil9KX0sX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmRzTm90TG9hZGVkKGEpe3JldHVybiBhPT09JGwuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5OT1RfTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNMb2FkZWQoYSl7cmV0dXJuIGE9PT0kbC5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkxPQURFRH0sX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkKGEpe3JldHVybiBhPT09JGwuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUR9LF9jb21wdXRlU2hvd05vRGFzaGJvYXJkc01lc3NhZ2UoYSxjLGQpe3JldHVybiBhJiYwPT09Yy5sZW5ndGgmJm51bGw9PWR9LF9jb21wdXRlU2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2UoYSxjLGQpe3JldHVybiBhJiYhIWQmJgpudWxsPT1jW2RdfSxfdXBkYXRlUm91dGVyKGEpe1BrLnNldFJvdXRlcihhKX0sX3VwZGF0ZVRpdGxlKGEpe2EmJnRoaXMuc2V0KCJicmFuZCIsYSl9LHJlbG9hZCgpe3RoaXMuX2lzUmVsb2FkRGlzYWJsZWR8fCh0aGlzLl9yZWxvYWREYXRhKCkudGhlbigoKT0+e2NvbnN0IGE9dGhpcy5fc2VsZWN0ZWREYXNoYm9hcmRDb21wb25lbnQoKTthJiZhLnJlbG9hZCYmYS5yZWxvYWQoKX0pLHRoaXMuX2xhc3RSZWxvYWRUaW1lPShuZXcgRGF0ZSkudG9TdHJpbmcoKSl9LF9yZWxvYWREYXRhKCl7dGhpcy5fcmVmcmVzaGluZz0hMDtyZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuX2ZldGNoUGx1Z2luc0xpc3RpbmcoKSxQay5lbnZpcm9ubWVudFN0b3JlLnJlZnJlc2goKSxQay5ydW5zU3RvcmUucmVmcmVzaCgpLFBrLmV4cGVyaW1lbnRzU3RvcmUucmVmcmVzaCgpXSkudGhlbigoKT0+e3RoaXMuX2xhc3RSZWxvYWRUaW1lU2hvcnQ9KG5ldyBEYXRlKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLAp7bW9udGg6ImxvbmciLGRheToibnVtZXJpYyIsaG91cjoibnVtZXJpYyIsbWludXRlOiJudW1lcmljIixzZWNvbmQ6Im51bWVyaWMifSl9KS5maW5hbGx5KCgpPT57dGhpcy5fcmVmcmVzaGluZz0hMX0pfSxfZ2V0RGF0YVJlZnJlc2hpbmdDbGFzcygpe3JldHVybiB0aGlzLl9yZWZyZXNoaW5nPyJyZWZyZXNoaW5nIjoiIn0sb3BlblNldHRpbmdzKCl7dGhpcy4kLnNldHRpbmdzLm9wZW4oKTt0aGlzLiQucGFnaW5hdGlvbkxpbWl0SW5wdXQudmFsdWU9WWwuZ2V0TGltaXQoKX0sX3BhZ2luYXRpb25MaW1pdFZhbGlkYXRlKGEpe2EudGFyZ2V0LnZhbGlkYXRlKCl9LF9wYWdpbmF0aW9uTGltaXRDaGFuZ2VkKGEpe2E9TnVtYmVyLnBhcnNlSW50KGEudGFyZ2V0LnZhbHVlLDEwKTthPT09K2EmJjA8YSYmWWwuc2V0TGltaXQoYSl9fSk7PC9zY3JpcHQ+CjwvZG9tLW1vZHVsZT4KCjxib2R5PgogIDx0Zi10ZW5zb3Jib2FyZCB1c2UtaGFzaCBicmFuZD0iVGVuc29yQm9hcmQiPjwvdGYtdGVuc29yYm9hcmQ+Cgo=", "ok": true, "headers": [ [ "content-type", "text/html; charset=utf-8" ] ], "status": 200, "status_text": "OK" }, "http://localhost:6006/data/plugins_listing": { "data": "eyJzY2FsYXJzIjogeyJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgInJlbW92ZV9kb20iOiBmYWxzZSwgImVuYWJsZWQiOiB0cnVlLCAiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7InRhYl9uYW1lIjogIkN1c3RvbSBTY2FsYXJzIiwgInJlbW92ZV9kb20iOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7InRhYl9uYW1lIjogImltYWdlcyIsICJyZW1vdmVfZG9tIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJ0YWJfbmFtZSI6ICJhdWRpbyIsICJyZW1vdmVfZG9tIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyIjogeyJ0YWJfbmFtZSI6ICJkZWJ1Z2dlciIsICJyZW1vdmVfZG9tIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRlYnVnZ2VyLWRhc2hib2FyZCJ9fSwgImdyYXBocyI6IHsidGFiX25hbWUiOiAiZ3JhcGhzIiwgInJlbW92ZV9kb20iOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgImRpc2FibGVfcmVsb2FkIjogdHJ1ZSwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ncmFwaC1kYXNoYm9hcmQifX0sICJkaXN0cmlidXRpb25zIjogeyJ0YWJfbmFtZSI6ICJkaXN0cmlidXRpb25zIiwgInJlbW92ZV9kb20iOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCJ9fSwgImhpc3RvZ3JhbXMiOiB7InRhYl9uYW1lIjogImhpc3RvZ3JhbXMiLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIn19LCAidGV4dCI6IHsidGFiX25hbWUiOiAidGV4dCIsICJyZW1vdmVfZG9tIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXRleHQtZGFzaGJvYXJkIn19LCAicHJfY3VydmVzIjogeyJ0YWJfbmFtZSI6ICJQUiBDdXJ2ZXMiLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQifX0sICJwcm9maWxlIjogeyJ0YWJfbmFtZSI6ICJwcm9maWxlIiwgInJlbW92ZV9kb20iOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgImRpc2FibGVfcmVsb2FkIjogdHJ1ZSwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wcm9maWxlLWRhc2hib2FyZCJ9fSwgImJlaG9sZGVyIjogeyJ0YWJfbmFtZSI6ICJiZWhvbGRlciIsICJyZW1vdmVfZG9tIjogdHJ1ZSwgImVuYWJsZWQiOiBmYWxzZSwgImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtYmVob2xkZXItZGFzaGJvYXJkIn19LCAid2hhdGlmIjogeyJ0YWJfbmFtZSI6ICJXaGF0LUlmIFRvb2wiLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkIn19LCAiaHBhcmFtcyI6IHsidGFiX25hbWUiOiAiaHBhcmFtcyIsICJyZW1vdmVfZG9tIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWhwYXJhbXMtZGFzaGJvYXJkIn19LCAibWVzaCI6IHsidGFiX25hbWUiOiAibWVzaCIsICJyZW1vdmVfZG9tIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogIm1lc2gtZGFzaGJvYXJkIn19LCAicHJvamVjdG9yIjogeyJ0YWJfbmFtZSI6ICJwcm9qZWN0b3IiLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAibG9hZGluZ19tZWNoYW5pc20iOiB7Im1vZHVsZV9wYXRoIjogIi9kYXRhL3BsdWdpbi9wcm9qZWN0b3IvaW5kZXguanMiLCAidHlwZSI6ICJJRlJBTUUifX19", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "OK" }, "http://localhost:6006/data/runs?experiment=": { "data": "WyIuIl0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "OK" }, "http://localhost:6006/data/environment": { "data": "eyJ3aW5kb3dfdGl0bGUiOiAiIiwgImRhdGFfbG9jYXRpb24iOiAiL2NvbnRlbnQvZW4teW8tYmFzZWxpbmUvbW9kZWxzL2VueW9fdHJhbnNmb3JtZXIvdGVuc29yYm9hcmQifQ==", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "OK" }, "http://localhost:6006/data/experiments": { "data": "W10=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "OK" }, "http://localhost:6006/data/plugin/scalars/tags?experiment=": { "data": "eyIuIjogeyJ0cmFpbi90cmFpbl9iYXRjaF9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJ0cmFpbi90cmFpbl9iYXRjaF9sb3NzIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidmFsaWQvdmFsaWRfbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidmFsaWQvdmFsaWRfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbGlkL3ZhbGlkX3Njb3JlIjogeyJkaXNwbGF5TmFtZSI6ICJ2YWxpZC92YWxpZF9zY29yZSIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbGlkL3ZhbGlkX3BwbCI6IHsiZGlzcGxheU5hbWUiOiAidmFsaWQvdmFsaWRfcHBsIiwgImRlc2NyaXB0aW9uIjogIiJ9fX0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "OK" }, "http://localhost:6006/data/plugin/scalars/scalars?tag=valid%2Fvalid_loss&run=.&experiment=": { "data": "W1sxNTc0Njg1MjU1LjU3NDI4MTUsIDEwMDAsIDk3NjU0LjIxODc1XSwgWzE1NzQ2ODU2NzguMjUwNTEzLCAyMDAwLCA4MzExNy43NTc4MTI1XSwgWzE1NzQ2ODYwOTkuODg3ODQxNywgMzAwMCwgNzU3NDMuODUxNTYyNV0sIFsxNTc0Njg2NTIyLjAwODc1NzQsIDQwMDAsIDcxMDk0LjI4MTI1XSwgWzE1NzQ2ODY5NDMuNjE0NTU4MiwgNTAwMCwgNjc2NjMuMTQ4NDM3NV0sIFsxNTc0Njg3MzY2Ljg2NDQ1MzYsIDYwMDAsIDY1MzMzLjAzMTI1XSwgWzE1NzQ2ODc3ODkuOTUxNTY3NCwgNzAwMCwgNjMwMzYuNDcyNjU2MjVdLCBbMTU3NDY4ODIxMC43ODQ2NDc1LCA4MDAwLCA2MTU1MC43MjI2NTYyNV0sIFsxNTc0Njg4NjMwLjkzMTM3NTUsIDkwMDAsIDYwMTY3LjMyMDMxMjVdLCBbMTU3NDY4OTA1My40NjQwNDA4LCAxMDAwMCwgNTg0MDQuMzIwMzEyNV0sIFsxNTc0Njg5NDc2LjI5MDY0NywgMTEwMDAsIDU3NjIzLjMwMDc4MTI1XSwgWzE1NzQ2ODk4OTguNTYzMzQ5NSwgMTIwMDAsIDU2Nzg1LjI4MTI1XSwgWzE1NzQ2OTAzMjIuMjEyNDI3NCwgMTMwMDAsIDU1NTczLjI5Njg3NV0sIFsxNTc0NjkwNzQzLjY5ODU5NDgsIDE0MDAwLCA1NDM4OS4zMzk4NDM3NV0sIFsxNTc0NjkxMTY2LjU4NTUyNzcsIDE1MDAwLCA1MzY3OS42NTIzNDM3NV0sIFsxNTc0NjkxNTg3Ljg2MzI1MjksIDE2MDAwLCA1MjgzOC43OTI5Njg3NV0sIFsxNTc0NjkyMDExLjUyMzY0OTcsIDE3MDAwLCA1MjE4OC45NDUzMTI1XSwgWzE1NzQ2OTI0MzQuMzY0OTY0MiwgMTgwMDAsIDUxODA3LjU4MjAzMTI1XSwgWzE1NzQ2OTI4NTcuMzYwMzE2MywgMTkwMDAsIDUxMTkwLjg2NzE4NzVdLCBbMTU3NDY5MzI4My45MzQzMTc2LCAyMDAwMCwgNTA2MTIuNTkzNzVdLCBbMTU3NDY5MzcwOS4xMzU5OTU0LCAyMTAwMCwgNTAyNTcuMjczNDM3NV0sIFsxNTc0Njk0MTM0LjY2NzE1MzgsIDIyMDAwLCA0OTgxNy4zMTY0MDYyNV0sIFsxNTc0Njk0NTU5Ljk0MTMwNTYsIDIzMDAwLCA0OTQ4MC41NTg1OTM3NV0sIFsxNTc0Njk0OTgzLjg4MzMyOCwgMjQwMDAsIDQ5MDUyLjA4OTg0Mzc1XSwgWzE1NzQ2OTU0MDguMDcyNDU2NiwgMjUwMDAsIDQ4OTA4LjY4MzU5Mzc1XSwgWzE1NzQ2OTU4MzAuNTY3OTMxMiwgMjYwMDAsIDQ4MzM4LjExNzE4NzVdLCBbMTU3NDY5NjI1Mi42NTQzMjgsIDI3MDAwLCA0ODIxMi4wMTk1MzEyNV0sIFsxNTc0Njk2Njc1LjczNTYzMiwgMjgwMDAsIDQ4MDExLjI5Njg3NV0sIFsxNTc0Njk3MDk5LjkyMzM0MzQsIDI5MDAwLCA0NzczNC43MTg3NV0sIFsxNTc0Njk3NTIyLjYwNzQ4MjQsIDMwMDAwLCA0NzUyNi42NTYyNV0sIFsxNTc0Njk3OTQ2Ljk4NDI4MzIsIDMxMDAwLCA0NzM1Ni41NzQyMTg3NV0sIFsxNTc0Njk4MzY4LjIxMTcxMTIsIDMyMDAwLCA0NzA4My40NTMxMjVdLCBbMTU3NDY5ODc4OS43MzMyNjczLCAzMzAwMCwgNDcwOTcuNzY1NjI1XSwgWzE1NzQ2OTkyMTEuMjQ2MzAyMSwgMzQwMDAsIDQ2NjQwLjIzODI4MTI1XSwgWzE1NzQ2OTk2MzIuMTM4NzIwMywgMzUwMDAsIDQ2NDgyLjgzOTg0Mzc1XSwgWzE1NzQ3MDAwNTUuNjA2NTgxNCwgMzYwMDAsIDQ2NDE2LjQ0NTMxMjVdLCBbMTU3NDcwMDQ3OC43NzE1NDQsIDM3MDAwLCA0NjA0MS45NzY1NjI1XSwgWzE1NzQ3MDA5MDEuNTY5NjkwNSwgMzgwMDAsIDQ1ODk1LjAzMTI1XSwgWzE1NzQ3MDEzMjQuNDk0NTEwMiwgMzkwMDAsIDQ1OTQ2Ljk3NjU2MjVdLCBbMTU3NDcwMTc0Ni40ODE3MDM4LCA0MDAwMCwgNDU3MzIuMzYzMjgxMjVdLCBbMTU3NDcwMjE2Ny44Mzk5MTg0LCA0MTAwMCwgNDU0NzcuODkwNjI1XSwgWzE1NzQ3MDI1ODkuMzgwNzA1OCwgNDIwMDAsIDQ1NDgxLjY5OTIxODc1XSwgWzE1NzQ3MDMwMTEuOTQ1ODgzMywgNDMwMDAsIDQ1MTQ1LjMwODU5Mzc1XSwgWzE1NzQ3MDM0MzQuMDIxNzg0NSwgNDQwMDAsIDQ1NTI3Ljc2MTcxODc1XSwgWzE1NzQ3MDM4NTYuMDk2MzkwMiwgNDUwMDAsIDQ1MzQwLjI5Mjk2ODc1XSwgWzE1NzQ3MDQyNzguMjQ2OTk0MywgNDYwMDAsIDQ0NzMzLjYyODkwNjI1XSwgWzE1NzQ3MDQ2OTguMzQ4MDM3LCA0NzAwMCwgNDQ4ODkuODgyODEyNV0sIFsxNTc0NzA1MTIwLjMwMzMyMywgNDgwMDAsIDQ0ODI5LjIzODI4MTI1XSwgWzE1NzQ3MDU1NDQuMDA0OTcwMywgNDkwMDAsIDQ0ODI3LjQ3MjY1NjI1XSwgWzE1NzQ3MDU5NjYuMzM2OTIyNiwgNTAwMDAsIDQ0NDU1LjU5Mzc1XSwgWzE1NzQ3MDYzODkuNjE1NjUzMywgNTEwMDAsIDQ0NTkxLjUxMTcxODc1XSwgWzE1NzQ3MDY4MDYuMDY0Mzk1MiwgNTIwMDAsIDQ0MTI1LjQ1NzAzMTI1XSwgWzE1NzQ3MDcyMjcuMDkxMDE2NSwgNTMwMDAsIDQ0MTgxLjgyODEyNV0sIFsxNTc0NzA3NjQ5LjAxMjE4MDMsIDU0MDAwLCA0NDEwNy44OTg0Mzc1XSwgWzE1NzQ3MDgwNzEuNjk1NTU1MiwgNTUwMDAsIDQ0MDY3LjQ2MDkzNzVdLCBbMTU3NDcwODQ5NC40MjQ0ODE5LCA1NjAwMCwgNDQxODkuNjY3OTY4NzVdLCBbMTU3NDcwODkxNy4zNzM3Mzc4LCA1NzAwMCwgNDM3MzQuMTI1XSwgWzE1NzQ3MDkzMzkuNjc0OTkxLCA1ODAwMCwgNDM5NDYuNTQ2ODc1XSwgWzE1NzQ3MDk3NjEuNDQyNTU5NywgNTkwMDAsIDQzODI0LjgzMjAzMTI1XSwgWzE1NzQ3MTAxODQuNTc1OTg5NSwgNjAwMDAsIDQzNzQ0LjE4NzVdLCBbMTU3NDcxMDYwNS40NzU4NjcsIDYxMDAwLCA0MzI0OS4zMjAzMTI1XSwgWzE1NzQ3MTEwMjkuMDg2ODI2MywgNjIwMDAsIDQzMzY5LjI2MTcxODc1XSwgWzE1NzQ3MTE0NTEuNTUzOTU0MSwgNjMwMDAsIDQzMzk5Ljg2NzE4NzVdLCBbMTU3NDcxMTg3My4yMjQyNzA2LCA2NDAwMCwgNDI5NjYuOTYwOTM3NV0sIFsxNTc0NzEyMjk2Ljg2MzEwODksIDY1MDAwLCA0MzMxNS4yNjE3MTg3NV0sIFsxNTc0NzEyNzE5LjEzODY4NSwgNjYwMDAsIDQzMjM5LjMwNDY4NzVdLCBbMTU3NDcxMzE0MC42MzE2NDksIDY3MDAwLCA0MzExNS44MjgxMjVdLCBbMTU3NDcxMzU2My40NzU3ODM4LCA2ODAwMCwgNDMzMDUuNjA1NDY4NzVdLCBbMTU3NDcxMzk4Ni41OTk5ODczLCA2OTAwMCwgNDI5MDEuMjM0Mzc1XSwgWzE1NzQ3MTQ0MDkuNTcwNzcxNywgNzAwMDAsIDQyODYzLjEwNTQ2ODc1XSwgWzE1NzQ3MTQ4MzIuMjExNTk1MywgNzEwMDAsIDQyNzc1LjY4NzVdLCBbMTU3NDcxNTI1Ni4wMDU1NzI4LCA3MjAwMCwgNDI3NTAuNzUzOTA2MjVdLCBbMTU3NDcxNTY3OS4wMDc4Njc4LCA3MzAwMCwgNDI1NTcuMzEyNV0sIFsxNTc0NzE2MTAwLjYwMzI3NDMsIDc0MDAwLCA0MjczNC4yNTM5MDYyNV0sIFsxNTc0NzE2NTIyLjQwOTE2MjMsIDc1MDAwLCA0MjY3OS4zMzIwMzEyNV0sIFsxNTc0NzE2OTQ2LjE2MDQ1NjQsIDc2MDAwLCA0MjcxNi43MjI2NTYyNV0sIFsxNTc0NzE3MzY4LjU2NjI5MjMsIDc3MDAwLCA0MjYyMC40ODgyODEyNV0sIFsxNTc0NzE3NzkwLjMwNTA0MDYsIDc4MDAwLCA0MjcxNi4yNTc4MTI1XSwgWzE1NzQ3MTgyMTIuNTYzMzYzLCA3OTAwMCwgNDI2NzguMjQ2MDkzNzVdLCBbMTU3NDcxODYzNC41OTAxMzQ2LCA4MDAwMCwgNDIwMjYuMjczNDM3NV0sIFsxNTc0NzE5MDU4Ljk3NjU5NDIsIDgxMDAwLCA0MjE0Ni4yMDMxMjVdLCBbMTU3NDcxOTQ4Mi4zNjM1NzY3LCA4MjAwMCwgNDIwODYuNTQyOTY4NzVdLCBbMTU3NDcxOTkwNC4wMzExODU2LCA4MzAwMCwgNDE5MzYuMDcwMzEyNV0sIFsxNTc0NzIwMzI3LjQzOTg2NiwgODQwMDAsIDQyMDUxLjQ2NDg0Mzc1XSwgWzE1NzQ3MjA3NTEuMjAwMDcwNCwgODUwMDAsIDQxODcyLjAyMzQzNzVdLCBbMTU3NDcyMTE3Ni44NjU5MiwgODYwMDAsIDQxNjk2LjExNzE4NzVdLCBbMTU3NDcyMTYwMS43MDQ4NDE0LCA4NzAwMCwgNDE4NTAuMTkxNDA2MjVdLCBbMTU3NDcyMjAyNi4yNDQ4ODQzLCA4ODAwMCwgNDE2NjEuNzgxMjVdLCBbMTU3NDcyMjQ1Mi4wMzc2MjQ0LCA4OTAwMCwgNDE2NDkuMzg2NzE4NzVdLCBbMTU3NDcyMjg3Ni4wNTU2NjIyLCA5MDAwMCwgNDE0ODUuMDAzOTA2MjVdLCBbMTU3NDcyMzI5OS44Mzk0MTQ0LCA5MTAwMCwgNDE0NTYuNzIyNjU2MjVdLCBbMTU3NDcyMzcyMy42ODIxMSwgOTIwMDAsIDQxNDQ5LjgzMjAzMTI1XV0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "OK" }, "http://localhost:6006/data/plugin/scalars/scalars?tag=valid%2Fvalid_ppl&run=.&experiment=": { "data": "W1sxNTc0Njg1MjU1LjU3NDc0MzcsIDEwMDAsIDQ2LjM2OTgxNTgyNjQxNjAxNl0sIFsxNTc0Njg1Njc4LjI1MDkzOTYsIDIwMDAsIDI2LjE5NDIyMzQwMzkzMDY2NF0sIFsxNTc0Njg2MDk5Ljg4ODMyODYsIDMwMDAsIDE5LjYwNTkyODQyMTAyMDUwOF0sIFsxNTc0Njg2NTIyLjAwOTI3MjYsIDQwMDAsIDE2LjMzMjUzNjY5NzM4NzY5NV0sIFsxNTc0Njg2OTQzLjYxNTExOTUsIDUwMDAsIDE0LjI3MjgxNDc1MDY3MTM4N10sIFsxNTc0Njg3MzY2Ljg2NDkwNjgsIDYwMDAsIDEzLjAyNDIyMTQyMDI4ODA4Nl0sIFsxNTc0Njg3Nzg5Ljk1MjE2MTYsIDcwMDAsIDExLjkwMDUzMzY3NjE0NzQ2MV0sIFsxNTc0Njg4MjEwLjc4NTExNywgODAwMCwgMTEuMjI1NzU4NTUyNTUxMjddLCBbMTU3NDY4ODYzMC45MzE4NDYsIDkwMDAsIDEwLjYzMTkwNzQ2MzA3MzczXSwgWzE1NzQ2ODkwNTMuNDY0NTU4NCwgMTAwMDAsIDkuOTIwNDE1ODc4Mjk1ODk4XSwgWzE1NzQ2ODk0NzYuMjkxMTY5LCAxMTAwMCwgOS42MjA2MzMxMjUzMDUxNzZdLCBbMTU3NDY4OTg5OC41NjM3ODQsIDEyMDAwLCA5LjMwOTAzOTExNTkwNTc2Ml0sIFsxNTc0NjkwMzIyLjIxMzAzMTUsIDEzMDAwLCA4Ljg3NjE2MzQ4MjY2NjAxNl0sIFsxNTc0NjkwNzQzLjY5OTEyNTgsIDE0MDAwLCA4LjQ3Mjc0MDE3MzMzOTg0NF0sIFsxNTc0NjkxMTY2LjU4NjEwNDIsIDE1MDAwLCA4LjIzOTc2MzI1OTg4NzY5NV0sIFsxNTc0NjkxNTg3Ljg2MzcxNzgsIDE2MDAwLCA3Ljk3MjAwMzQ1OTkzMDQyXSwgWzE1NzQ2OTIwMTEuNTI0MjAwNCwgMTcwMDAsIDcuNzcxMDQ0MjU0MzAyOTc4NV0sIFsxNTc0NjkyNDM0LjM2NTQ0MjUsIDE4MDAwLCA3LjY1NTQ3ODk1NDMxNTE4NTVdLCBbMTU3NDY5Mjg1Ny4zNjA3NiwgMTkwMDAsIDcuNDcyMjE5NDY3MTYzMDg2XSwgWzE1NzQ2OTMyODMuOTM0ODM1LCAyMDAwMCwgNy4zMDQzNjk0NDk2MTU0Nzg1XSwgWzE1NzQ2OTM3MDkuMTM2NTM0NywgMjEwMDAsIDcuMjAzMTA5NzQxMjEwOTM3NV0sIFsxNTc0Njk0MTM0LjY2NzYzMywgMjIwMDAsIDcuMDc5NjcyODEzNDE1NTI3XSwgWzE1NzQ2OTQ1NTkuOTQxNzQ4NiwgMjMwMDAsIDYuOTg2NjIxODU2Njg5NDUzXSwgWzE1NzQ2OTQ5ODMuODgzNzY0MywgMjQwMDAsIDYuODY5OTk2MDcwODYxODE2XSwgWzE1NzQ2OTU0MDguMDczMDEzLCAyNTAwMCwgNi44MzEzOTgwMTAyNTM5MDZdLCBbMTU3NDY5NTgzMC41Njg0NTk1LCAyNjAwMCwgNi42Nzk5NjU0OTYwNjMyMzJdLCBbMTU3NDY5NjI1Mi42NTQ3NTQyLCAyNzAwMCwgNi42NDY5NTQwNTk2MDA4M10sIFsxNTc0Njk2Njc1LjczNjA0OTIsIDI4MDAwLCA2LjU5NDc0MjI5ODEyNjIyMV0sIFsxNTc0Njk3MDk5LjkyMzc4MDcsIDI5MDAwLCA2LjUyMzQ3MDQwMTc2MzkxNl0sIFsxNTc0Njk3NTIyLjYwNzk1NSwgMzAwMDAsIDYuNDcwMzYyMTg2NDMxODg1XSwgWzE1NzQ2OTc5NDYuOTg0NzE2NywgMzEwMDAsIDYuNDI3MjcwNDEyNDQ1MDY4XSwgWzE1NzQ2OTgzNjguMjEyNTQ3MywgMzIwMDAsIDYuMzU4NjcxMTg4MzU0NDkyXSwgWzE1NzQ2OTg3ODkuNzMzODUxMiwgMzMwMDAsIDYuMzYyMjQ3NDY3MDQxMDE2XSwgWzE1NzQ2OTkyMTEuMjQ2ODExOSwgMzQwMDAsIDYuMjQ4OTA1NjU4NzIxOTI0XSwgWzE1NzQ2OTk2MzIuMTM5MjkxOCwgMzUwMDAsIDYuMjEwMzgyOTM4Mzg1MDFdLCBbMTU3NDcwMDA1NS42MDcwMzU0LCAzNjAwMCwgNi4xOTQyMDM4NTM2MDcxNzhdLCBbMTU3NDcwMDQ3OC43NzIwNzE2LCAzNzAwMCwgNi4xMDM3NDA2OTIxMzg2NzJdLCBbMTU3NDcwMDkwMS41NzAxMzE1LCAzODAwMCwgNi4wNjg2MDM5OTI0NjIxNThdLCBbMTU3NDcwMTMyNC40OTQ5Mzc0LCAzOTAwMCwgNi4wODEwMDE3NTg1NzU0Mzk1XSwgWzE1NzQ3MDE3NDYuNDgyMjcyOSwgNDAwMDAsIDYuMDI5OTQzOTQzMDIzNjgyXSwgWzE1NzQ3MDIxNjcuODQwNjE1NSwgNDEwMDAsIDUuOTY5OTU3ODI4NTIxNzI4NV0sIFsxNTc0NzAyNTg5LjM4MTI3MTYsIDQyMDAwLCA1Ljk3MDg1MTQyMTM1NjIwMV0sIFsxNTc0NzAzMDExLjk0NjM3MjUsIDQzMDAwLCA1Ljg5MjQ1OTM5MjU0NzYwN10sIFsxNTc0NzAzNDM0LjAyMjU2NzMsIDQ0MDAwLCA1Ljk4MTY2NzA0MTc3ODU2NDVdLCBbMTU3NDcwMzg1Ni4wOTY4NDEsIDQ1MDAwLCA1LjkzNzc3MjI3NDAxNzMzNF0sIFsxNTc0NzA0Mjc4LjI0NzU0NDUsIDQ2MDAwLCA1Ljc5NzkyMDcwMzg4NzkzOTVdLCBbMTU3NDcwNDY5OC4zNDg1OTkyLCA0NzAwMCwgNS44MzM2MjI5MzI0MzQwODJdLCBbMTU3NDcwNTEyMC4zMDM5MDAyLCA0ODAwMCwgNS44MTk3NDAyOTU0MTAxNTZdLCBbMTU3NDcwNTU0NC4wMDU0NzQzLCA0OTAwMCwgNS44MTkzMzY0MTQzMzcxNThdLCBbMTU3NDcwNTk2Ni4zMzc1MDIyLCA1MDAwMCwgNS43MzQ5MzE5NDU4MDA3ODFdLCBbMTU3NDcwNjM4OS42MTYxNjM1LCA1MTAwMCwgNS43NjU2MzgzNTE0NDA0M10sIFsxNTc0NzA2ODA2LjA2NDkzMSwgNTIwMDAsIDUuNjYxMDI2OTU0NjUwODc5XSwgWzE1NzQ3MDcyMjcuMDkxNDg2MiwgNTMwMDAsIDUuNjczNTc5MjE2MDAzNDE4XSwgWzE1NzQ3MDc2NDkuMDEyNjc4NiwgNTQwMDAsIDUuNjU3MTIzMDg4ODM2NjddLCBbMTU3NDcwODA3MS42OTYwOTUsIDU1MDAwLCA1LjY0ODE0MjgxNDYzNjIzMDVdLCBbMTU3NDcwODQ5NC40MjUwNTc2LCA1NjAwMCwgNS42NzUzMjY4MjQxODgyMzJdLCBbMTU3NDcwODkxNy4zNzQxOTQ2LCA1NzAwMCwgNS41NzQ2NTY0ODY1MTEyMzA1XSwgWzE1NzQ3MDkzMzkuNjc1Njc1NCwgNTgwMDAsIDUuNjIxMzc1MDgzOTIzMzRdLCBbMTU3NDcwOTc2MS40NDI5ODM5LCA1OTAwMCwgNS41OTQ1NTg3MTU4MjAzMTI1XSwgWzE1NzQ3MTAxODQuNTc2NjAzMiwgNjAwMDAsIDUuNTc2ODYwNDI3ODU2NDQ1XSwgWzE1NzQ3MTA2MDUuNDc2NDE4NywgNjEwMDAsIDUuNDY5NDgwOTkxMzYzNTI1XSwgWzE1NzQ3MTEwMjkuMDg3NDU2LCA2MjAwMCwgNS40OTUzMTUwNzQ5MjA2NTRdLCBbMTU3NDcxMTQ1MS41NTQ2MDUyLCA2MzAwMCwgNS41MDE5MjY4OTg5NTYyOTldLCBbMTU3NDcxMTg3My4yMjQ4NDE0LCA2NDAwMCwgNS40MDkxNDE1NDA1MjczNDRdLCBbMTU3NDcxMjI5Ni44NjM3MzU0LCA2NTAwMCwgNS40ODM2Njg4MDQxNjg3MDFdLCBbMTU3NDcxMjcxOS4xMzkyNTg2LCA2NjAwMCwgNS40NjczMjkwMjUyNjg1NTVdLCBbMTU3NDcxMzE0MC42MzIxNjksIDY3MDAwLCA1LjQ0MDg2OTgwODE5NzAyMTVdLCBbMTU3NDcxMzU2My40NzY0NzE3LCA2ODAwMCwgNS40ODE1ODg4NDA0ODQ2MTldLCBbMTU3NDcxMzk4Ni42MDA1NDIzLCA2OTAwMCwgNS4zOTUxOTExOTI2MjY5NTNdLCBbMTU3NDcxNDQwOS41NzE1MjA4LCA3MDAwMCwgNS4zODcxMTU0Nzg1MTU2MjVdLCBbMTU3NDcxNDgzMi4yMTIxMjgsIDcxMDAwLCA1LjM2ODY0NDcxNDM1NTQ2OV0sIFsxNTc0NzE1MjU2LjAwNjExNTcsIDcyMDAwLCA1LjM2MzM4ODUzODM2MDU5Nl0sIFsxNTc0NzE1Njc5LjAwODQxODYsIDczMDAwLCA1LjMyMjc4MTU2MjgwNTE3Nl0sIFsxNTc0NzE2MTAwLjYwMzc1LCA3NDAwMCwgNS4zNTk5MTI4NzIzMTQ0NTNdLCBbMTU3NDcxNjUyMi40MDk2MjM5LCA3NTAwMCwgNS4zNDgzNTkxMDc5NzExOTFdLCBbMTU3NDcxNjk0Ni4xNjEwNTM0LCA3NjAwMCwgNS4zNTYyMjIxNTI3MDk5NjFdLCBbMTU3NDcxNzM2OC41NjY3MzE3LCA3NzAwMCwgNS4zMzYwMDkwMjU1NzM3MzA1XSwgWzE1NzQ3MTc3OTAuMzA1NTI4LCA3ODAwMCwgNS4zNTYxMjQ0MDEwOTI1MjldLCBbMTU3NDcxODIxMi41NjM4OSwgNzkwMDAsIDUuMzQ4MTMxMTc5ODA5NTddLCBbMTU3NDcxODYzNC41OTA2ODE4LCA4MDAwMCwgNS4yMTI4Nzk2NTc3NDUzNjFdLCBbMTU3NDcxOTA1OC45NzcwOTc3LCA4MTAwMCwgNS4yMzc1MDAxOTA3MzQ4NjNdLCBbMTU3NDcxOTQ4Mi4zNjQyNTExLCA4MjAwMCwgNS4yMjUyMzc4NDYzNzQ1MTJdLCBbMTU3NDcxOTkwNC4wMzE3NzksIDgzMDAwLCA1LjE5NDQzODkzNDMyNjE3Ml0sIFsxNTc0NzIwMzI3LjQ0MDM4MzQsIDg0MDAwLCA1LjIxODA0MjM3MzY1NzIyN10sIFsxNTc0NzIwNzUxLjIwMDYzMDcsIDg1MDAwLCA1LjE4MTM4NDU2MzQ0NjA0NV0sIFsxNTc0NzIxMTc2Ljg2NjQ1OTQsIDg2MDAwLCA1LjE0NTY5OTAyNDIwMDQzOTVdLCBbMTU3NDcyMTYwMS43MDUzMDg3LCA4NzAwMCwgNS4xNzY5NDIzNDg0ODAyMjVdLCBbMTU3NDcyMjAyNi4yNDUzOTY5LCA4ODAwMCwgNS4xMzg3NjI0NzQwNjAwNTldLCBbMTU3NDcyMjQ1Mi4wMzgyMTYsIDg5MDAwLCA1LjEzNjI2MDUwOTQ5MDk2N10sIFsxNTc0NzIyODc2LjA1NjE4NTIsIDkwMDAwLCA1LjEwMzE5NjE0NDEwNDAwNF0sIFsxNTc0NzIzMjk5LjgzOTg1OTUsIDkxMDAwLCA1LjA5NzUyOTQxMTMxNTkxOF0sIFsxNTc0NzIzNzIzLjY4MjU5MzMsIDkyMDAwLCA1LjA5NjE0ODk2Nzc0MjkyXV0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "OK" }, "http://localhost:6006/data/plugin/scalars/scalars?tag=train%2Ftrain_batch_loss&run=.&experiment=": { "data": "W1sxNTc0Njg0ODQyLjkxODQ5ODgsIDI1LCA1Ljg1MTI4MDY4OTIzOTUwMl0sIFsxNTc0Njg0ODUzLjM2NzcwMjUsIDU3LCA1LjQ5NjgzMTQxNzA4Mzc0XSwgWzE1NzQ2ODQ4NTQuMzE3MzMxNiwgNjAsIDUuNTEzOTA4Mzg2MjMwNDY5XSwgWzE1NzQ2ODQ4OTAuNDAwNTkwMiwgMTcxLCA1LjE2OTU4NTcwNDgwMzQ2N10sIFsxNTc0Njg0OTA1LjQ4ODA3MjIsIDIxNiwgNS4yMzMwNzk5MTAyNzgzMl0sIFsxNTc0Njg0OTY2Ljg5MjQ5MTMsIDQwMywgNC45MzQ5NDg0NDQzNjY0NTVdLCBbMTU3NDY4NTAyNy43MDExOTgsIDU4OSwgNC41MTM0NzE2MDMzOTM1NTVdLCBbMTU3NDY4NTA3OS4zNTE4NDkzLCA3NDYsIDQuMzE1NjU0NzU0NjM4NjcyXSwgWzE1NzQ2ODUxMjQuNTY1MzMyNywgODg0LCA0LjIwMTk0NTc4MTcwNzc2NF0sIFsxNTc0Njg1MTMxLjQ4MTA2OSwgOTA1LCA0LjEwNTE5MjE4NDQ0ODI0Ml0sIFsxNTc0Njg1MjU4LjkwODYyNCwgMTAwOSwgNC4wODMzNDk3MDQ3NDI0MzJdLCBbMTU3NDY4NTI4NS45NDU1MzE0LCAxMDkxLCAzLjgxMzA2NzkxMzA1NTQyXSwgWzE1NzQ2ODUzMjUuNjQ4MTY4OCwgMTIxMSwgNC4wNjc2ODQ2NTA0MjExNDNdLCBbMTU3NDY4NTMyNy4yMjkxMDE0LCAxMjE2LCAzLjkyMjY0NjI4NDEwMzM5MzZdLCBbMTU3NDY4NTM0Ny44ODIzMDI4LCAxMjgwLCAzLjg4ODM2NjIyMjM4MTU5Ml0sIFsxNTc0Njg1MzU2LjkwODU1MDcsIDEzMDgsIDMuOTMwODA5NzM2MjUxODMxXSwgWzE1NzQ2ODU1MDAuMjk0OTQwNSwgMTc0MywgMy41NzAyNTUyNzk1NDEwMTU2XSwgWzE1NzQ2ODU1MTMuMzczNjU2MywgMTc4MywgMy40ODAzOTQzNjM0MDMzMjAzXSwgWzE1NzQ2ODU1MTQuMzk3NDU3OCwgMTc4NiwgMy40OTI2ODY3NDg1MDQ2Mzg3XSwgWzE1NzQ2ODU1MjQuMDA0MzU2NCwgMTgxNSwgMy44MDIyMzg5NDExOTI2MjddLCBbMTU3NDY4NTU0NC42NDA0NDUsIDE4NzcsIDMuNDQwMzE4NTg0NDQyMTM4N10sIFsxNTc0Njg1NTQ4LjM3NjA2MDIsIDE4ODgsIDMuODUwNTAxMDYwNDg1ODRdLCBbMTU3NDY4NTY4Ny4wNjY3OTc3LCAyMDI2LCAzLjE4ODAwNDczMjEzMTk1OF0sIFsxNTc0Njg1NzE1LjM2OTgyMywgMjExMiwgMy4zOTA1MDIyMTQ0MzE3NjI3XSwgWzE1NzQ2ODU3NzQuMzc3NjA3MywgMjI5MiwgMy4xNjc5ODExNDc3NjYxMTMzXSwgWzE1NzQ2ODU3ODEuMjk4OTQwNywgMjMxMywgMy4zNDEwMTc0ODQ2NjQ5MTddLCBbMTU3NDY4NTgwOS44MzA4MDU1LCAyNDAwLCAzLjQ5ODgwMDI3NzcwOTk2MV0sIFsxNTc0Njg1ODQ1LjI1MDAyNywgMjUwOCwgMy4zNDg4MDMyODE3ODQwNTc2XSwgWzE1NzQ2ODU4NTEuMTkwMjgzLCAyNTI2LCAzLjQxODk0NjI2NjE3NDMxNjRdLCBbMTU3NDY4NTg3My45NjA5NTE2LCAyNTk1LCAzLjI3MzYxNDQwNjU4NTY5MzRdLCBbMTU3NDY4NTkyMS4zNTI3MDg2LCAyNzQwLCAzLjEwNTY2Mzc3NjM5NzcwNV0sIFsxNTc0Njg1OTU0LjI0OTYwNCwgMjgzOSwgMy40NjYwMzcwMzQ5ODg0MDMzXSwgWzE1NzQ2ODU5NjIuODYwNTY2NCwgMjg2NiwgMy4zNjg4OTUwNTM4NjM1MjU0XSwgWzE1NzQ2ODU5NjYuNjE2MDA3LCAyODc3LCAzLjQ5NzU3NzY2NzIzNjMyOF0sIFsxNTc0Njg2MTExLjEyNzUwMiwgMzAzMywgMy4wODc3ODUyNDM5ODgwMzddLCBbMTU3NDY4NjE1Ny4zMDMzODYyLCAzMTczLCAzLjEzMDY2NTU0MDY5NTE5MDRdLCBbMTU3NDY4NjE5MC43Nzg5MDE4LCAzMjc1LCAzLjA3NTQzOTIxNDcwNjQyMV0sIFsxNTc0Njg2MjA1LjAzMjc2OTQsIDMzMTksIDMuMDUxOTgwMDE4NjE1NzIyN10sIFsxNTc0Njg2MjA1LjI3OTczNjUsIDMzMjAsIDIuOTkwMjM4OTA0OTUzMDAzXSwgWzE1NzQ2ODYyMjAuMDk5ODU1MiwgMzM2NSwgMy4zNDgwMDA1MjY0MjgyMjI3XSwgWzE1NzQ2ODYzMDMuNzU0MzQyNiwgMzYyMCwgMy40ODEzNDEzNjE5OTk1MTE3XSwgWzE1NzQ2ODYzNDQuNzEyODAwNywgMzc0NCwgMi43Nzg4ODE3ODgyNTM3ODRdLCBbMTU3NDY4NjM0NS4wNjQ2MDU1LCAzNzQ1LCAzLjI1NDYwMzg2Mjc2MjQ1MV0sIFsxNTc0Njg2MzQ3LjYyNzAwNDYsIDM3NTMsIDMuMTc4NzgxMDMyNTYyMjU2XSwgWzE1NzQ2ODYzNTIuOTAzNDk0MSwgMzc2OSwgMy4wOTYyNzc3MTM3NzU2MzQ4XSwgWzE1NzQ2ODYzNzkuMTA0MTcwOCwgMzg0OCwgMi45ODY0MTQ2NzA5NDQyMTRdLCBbMTU3NDY4NjQxOS41NjA4ODcsIDM5NzEsIDMuMTc5NzcyMzc3MDE0MTZdLCBbMTU3NDY4NjQyOS4xNTA0Nzg4LCA0MDAwLCAzLjM0MzU3NTQ3NzYwMDA5NzddLCBbMTU3NDY4NjUyOS4yODQ4NjEsIDQwMjEsIDIuOTA1NzcxMDE3MDc0NTg1XSwgWzE1NzQ2ODY1NTguODI2OTI5NiwgNDExMSwgMy42NDcwMDUwODExNzY3NThdLCBbMTU3NDY4NjYwMy4zNzE4MzYsIDQyNDYsIDIuNjQxOTQ3NzQ2Mjc2ODU1NV0sIFsxNTc0Njg2NjEzLjExNjExMjIsIDQyNzYsIDMuMDE4NTkyMzU3NjM1NDk4XSwgWzE1NzQ2ODY2NjguNzYxMzUzNywgNDQ0NywgMi44NDYyOTYzMTA0MjQ4MDQ3XSwgWzE1NzQ2ODY3MDkuMjM3OTkyOCwgNDU2OSwgMi43NzEzNjg5ODA0MDc3MTVdLCBbMTU3NDY4NjczMi42MDE0OTQ4LCA0NjQxLCAyLjk1NTM5Nzg0NDMxNDU3NV0sIFsxNTc0Njg2ODMyLjAzMjI2NzYsIDQ5NDMsIDIuOTA3Nzk4MDUxODM0MTA2NF0sIFsxNTc0Njg2OTYxLjc4NzE1OCwgNTA1NCwgMi42OTQzMDQyMjc4Mjg5Nzk1XSwgWzE1NzQ2ODY5NzYuNzM0NTMzOCwgNTA5OSwgMi45MjkwNzUyNDEwODg4NjddLCBbMTU3NDY4Njk5Mi4zMzUxMTE0LCA1MTQ3LCAyLjc5MjIzMDEyOTI0MTk0MzRdLCBbMTU3NDY4NzA1Ny45MjM5NjYsIDUzNDcsIDIuODI3ODg4NzI3MTg4MTEwNF0sIFsxNTc0Njg3MDk0Ljc0Nzk1OSwgNTQ1NiwgMi44NTIyODM3MTYyMDE3ODIyXSwgWzE1NzQ2ODcxMTcuNDcyODE2LCA1NTI0LCAzLjE3Nzg0NjkwODU2OTMzNl0sIFsxNTc0Njg3MTQxLjM5NDU0OTgsIDU1OTcsIDIuMzQyMjgxNTc5OTcxMzEzNV0sIFsxNTc0Njg3MTcwLjg1MzUzODUsIDU2ODcsIDIuNjY1ODM3NTI2MzIxNDExXSwgWzE1NzQ2ODcxOTkuMzUzODk1NywgNTc3NCwgMi41MDI3MTI3MjY1OTMwMTc2XSwgWzE1NzQ2ODczOTguOTkwNzk3LCA2MDk2LCAyLjgwMzg5NTcxMTg5ODgwMzddLCBbMTU3NDY4NzQzNS4yMzUwOTYsIDYyMDYsIDIuODE1NTE2MjMzNDQ0MjE0XSwgWzE1NzQ2ODc0NzcuNDgwNDY2OCwgNjMzNCwgMi4yNDY4NzMxNDAzMzUwODNdLCBbMTU3NDY4NzU0MS42NDA4ODQyLCA2NTI4LCAyLjU0MjA1Mjk4NDIzNzY3MV0sIFsxNTc0Njg3NjU2LjAyOTI1LCA2ODc2LCAyLjUzMjYzNDczNTEwNzQyMl0sIFsxNTc0Njg3NzkzLjYxNDI2MiwgNzAxMCwgMi43Nzg0NjU5ODYyNTE4MzFdLCBbMTU3NDY4NzgxMy4wNzI2NjE0LCA3MDY5LCAyLjY5OTAxNTg1NTc4OTE4NDZdLCBbMTU3NDY4Nzg1MC41ODM2NjM1LCA3MTg0LCAyLjQ4MTI3MDU1MTY4MTUxODZdLCBbMTU3NDY4Nzg2NC4xMzA4ODkyLCA3MjI2LCAyLjc3Mjk1Mjc5NTAyODY4NjVdLCBbMTU3NDY4Nzg2NS40NTM0MjI4LCA3MjMwLCAyLjY0NDM2MzQwMzMyMDMxMjVdLCBbMTU3NDY4NzkwMC45NDIxMDg5LCA3MzM4LCAyLjgyODQ4OTA2NTE3MDI4OF0sIFsxNTc0Njg3OTA0LjkwNDY3MDcsIDczNTAsIDIuNTI2Mzk5ODUwODQ1MzM3XSwgWzE1NzQ2ODc5NzkuMDUzNDQ4LCA3NTc2LCAyLjExMTE5NTU2NDI3MDAxOTVdLCBbMTU3NDY4Nzk4NS4wMTgwNjk3LCA3NTk0LCAyLjYyNjM0NjU4ODEzNDc2NTZdLCBbMTU3NDY4ODAyNi42MDg4NDg2LCA3NzIwLCAyLjAwNDc0MTQzMDI4MjU5MjhdLCBbMTU3NDY4ODA1OS41OTM4NDIzLCA3ODIxLCAyLjYxMDU0NDY4MTU0OTA3MjNdLCBbMTU3NDY4ODI2NS44MzY1NDA3LCA4MTY4LCAyLjU3OTYyMTc5MTgzOTU5OTZdLCBbMTU3NDY4ODI4Mi40OTIzNDk2LCA4MjE5LCAyLjY3MzAzMjk5OTAzODY5NjNdLCBbMTU3NDY4ODMwMi40ODc3NDI0LCA4MjgwLCAyLjQ0NjQwNzA3OTY5NjY1NTNdLCBbMTU3NDY4ODMyOC42NTg1NzY1LCA4MzU5LCAyLjczMzYzMTM3MjQ1MTc4MjJdLCBbMTU3NDY4ODMzOS4wNzk1MDUyLCA4MzkxLCAyLjgwNTczNDE1NzU2MjI1Nl0sIFsxNTc0Njg4MzQxLjM0MDA5MDMsIDgzOTgsIDIuNjQ4NDgxODQ1ODU1NzEzXSwgWzE1NzQ2ODgzNjkuNzIzMDc5NywgODQ4NiwgMi40ODEyOTEwNTU2NzkzMjEzXSwgWzE1NzQ2ODg0MTMuMzY4ODM0LCA4NjE5LCAyLjQ1OTAyMzk1MjQ4NDEzMV0sIFsxNTc0Njg4NTA4Ljk4MTMzMDIsIDg5MTEsIDIuNzU3NTA4Mjc3ODkzMDY2NF0sIFsxNTc0Njg4Njg1Ljk4NTE0MTMsIDkxNjYsIDIuNDk3NjM0MTcyNDM5NTc1XSwgWzE1NzQ2ODg3MDkuMzYxNzY0LCA5MjM2LCAyLjE0NzUzOTM3NzIxMjUyNDRdLCBbMTU3NDY4ODc1OC43MDc2MDczLCA5Mzg1LCAyLjIwMDkwNjI3NjcwMjg4MV0sIFsxNTc0Njg4NzU5Ljk5NzUwOTUsIDkzODksIDIuNTUxMDU2ODYxODc3NDQxNF0sIFsxNTc0Njg4ODA0LjM5NDYyMzUsIDk1MjQsIDIuNTg0MTUxMjY4MDA1MzcxXSwgWzE1NzQ2ODg4MTAuNjI1MzcyNCwgOTU0MywgMi42NjU0Nzc5OTExMDQxMjZdLCBbMTU3NDY4ODg0MC41MzY4NzM4LCA5NjM0LCAyLjU0MjczNzI0NTU1OTY5MjRdLCBbMTU3NDY4ODg0NS4zMjcwODUsIDk2NDgsIDIuNDMzOTM0NDUwMTQ5NTM2XSwgWzE1NzQ2ODg4ODIuMTU1NDc4LCA5NzYxLCAyLjUyOTA1MjQ5NTk1NjQyMV0sIFsxNTc0Njg4OTA2LjYxNjA4MSwgOTgzNiwgMi4xNTI3MTk5NzQ1MTc4MjIzXSwgWzE1NzQ2ODg5MDcuNTc5ODc2NCwgOTgzOSwgMi4xOTA1OTcwNTczNDI1MjkzXSwgWzE1NzQ2ODg5NDQuNzk1NDI3LCA5OTUyLCAyLjMzNjQ2MDExMzUyNTM5MDZdLCBbMTU3NDY4OTA3MC40NTg0MTA1LCAxMDA1MSwgMi41MjMwNzgyMDMyMDEyOTRdLCBbMTU3NDY4OTA3Ny43ODc5NzY1LCAxMDA3MywgMi41MTE3ODU3NDU2MjA3Mjc1XSwgWzE1NzQ2ODkwOTEuMjQ4NjA3MiwgMTAxMTQsIDIuNjIzNDAzNzg3NjEyOTE1XSwgWzE1NzQ2ODkxMjQuNDU5NDM5NSwgMTAyMTUsIDIuNDUwMzQ2MjMxNDYwNTcxM10sIFsxNTc0Njg5MTYyLjA3OTEwMSwgMTAzMjgsIDIuMzQ3NjczNDE2MTM3Njk1M10sIFsxNTc0Njg5MTY2LjMyNTE1NTUsIDEwMzQxLCAyLjQ4NjAyNTgxMDI0MTY5OV0sIFsxNTc0Njg5MTc4LjMyOTkxMSwgMTAzNzcsIDIuMDQ3NTQ3NTc4ODExNjQ1NV0sIFsxNTc0Njg5MTc5LjM1MDU3NywgMTAzODAsIDIuNjc2OTAwMTQ4MzkxNzIzNl0sIFsxNTc0Njg5MjM5LjM2MDQ5NCwgMTA1NjMsIDIuNDIxMDY2NTIyNTk4MjY2Nl0sIFsxNTc0Njg5MjQ5LjM1MDIwOTcsIDEwNTk0LCAyLjU0MDcwMTM4OTMxMjc0NF0sIFsxNTc0Njg5Mjc4LjczODY4NSwgMTA2ODMsIDIuNDA2NTMwMzgwMjQ5MDIzNF0sIFsxNTc0Njg5MzIwLjYwMzEzOSwgMTA4MDgsIDIuMzg3MjQ2MzcwMzE1NTUxOF0sIFsxNTc0Njg5MzMxLjM3MDkwOTIsIDEwODQxLCAyLjA1NzIyNTk0MjYxMTY5NDNdLCBbMTU3NDY4OTMzNS43MTQ3Njk2LCAxMDg1NCwgMi4xODM3MzM3MDE3MDU5MzI2XSwgWzE1NzQ2ODkzNDcuODY1MDA3MiwgMTA4OTEsIDIuMTM0OTc1OTEwMTg2NzY3Nl0sIFsxNTc0Njg5MzUxLjIwMzMyNTcsIDEwOTAxLCAyLjU1ODI3NjQxNDg3MTIxNl0sIFsxNTc0Njg5MzYyLjI1NDI5NzUsIDEwOTM1LCAyLjM1NzY5MTc2NDgzMTU0M10sIFsxNTc0Njg5Mzc4LjIxNTE1ODcsIDEwOTg0LCAyLjQ1OTAwMDU4NzQ2MzM3OV0sIFsxNTc0Njg5NDc3LjY0MTU3NjUsIDExMDAzLCAyLjQ3NjQyNjgzOTgyODQ5MV0sIFsxNTc0Njg5NDgzLjA0NzczNjIsIDExMDIwLCAyLjQzOTY4MDgxNDc0MzA0Ml0sIFsxNTc0Njg5NTAwLjAxOTUyOSwgMTEwNzIsIDIuNDQ5NjE5MjkzMjEyODkwNl0sIFsxNTc0Njg5NTQ4LjAxMDE3MjYsIDExMjE3LCAyLjMyNzk5MzYzMTM2MjkxNV0sIFsxNTc0Njg5NTU1LjkxMTg0MzgsIDExMjQxLCAyLjE0MTIyODQzNzQyMzcwNl0sIFsxNTc0Njg5NTU5LjI4NDgzMzIsIDExMjUxLCAyLjQwNDIzNTYwMTQyNTE3MV0sIFsxNTc0Njg5NTg5LjQ1MjI1NTIsIDExMzQzLCAyLjI4MzE3NTIzMDAyNjI0NV0sIFsxNTc0Njg5NjE1Ljc1MjgyMDMsIDExNDIzLCAyLjY1NTI2NDYxNjAxMjU3MzJdLCBbMTU3NDY4OTY0Mi43NTc3MTEyLCAxMTUwNSwgMi40MDcwODgyNzk3MjQxMjFdLCBbMTU3NDY4OTY3NC45MDA5NTE2LCAxMTYwMiwgMi41NTA1MTQ0NTk2MDk5ODU0XSwgWzE1NzQ2ODk3MTQuNDM4MzAyMywgMTE3MjIsIDIuMzQ4MDM2NzY2MDUyMjQ2XSwgWzE1NzQ2ODk3ODUuNjY2NjU3LCAxMTkzOSwgMi4yNDAxMDc1MzYzMTU5MThdLCBbMTU3NDY4OTkyOS4xODMyODg2LCAxMjA5MywgMi4wMTYwODMwMDIwOTA0NTRdLCBbMTU3NDY4OTkzMi4zMDMwNTYyLCAxMjEwMiwgMi4zMTYyMzMxNTgxMTE1NzIzXSwgWzE1NzQ2ODk5OTEuOTQwNDA5NCwgMTIyODMsIDIuMjAxMjM3OTE2OTQ2NDExXSwgWzE1NzQ2ODk5OTIuMjc3NTY3NiwgMTIyODQsIDIuMzk0MDY3NTI1ODYzNjQ3NV0sIFsxNTc0Njg5OTk5LjU3NTQwOSwgMTIzMDYsIDIuNDU1NTEzOTU0MTYyNTk3N10sIFsxNTc0NjkwMDM0LjMxNjI2NCwgMTI0MTEsIDIuMzM5MzAwODcwODk1Mzg1N10sIFsxNTc0NjkwMDY0LjAwNzQxODQsIDEyNTAwLCAyLjI5MTc4NTcxNzAxMDQ5OF0sIFsxNTc0NjkwMDY4LjI0NjMzODQsIDEyNTEzLCAyLjE5OTM1MjI2NDQwNDI5N10sIFsxNTc0NjkwMDk2LjY2MTE2MTQsIDEyNTk4LCAyLjIwOTAzMzQ4OTIyNzI5NV0sIFsxNTc0NjkwMTAxLjIzMzI3NTQsIDEyNjEyLCAyLjQ2NDk4OTkwMDU4ODk4OTNdLCBbMTU3NDY5MDEyOS4wNTI2NjQsIDEyNjk2LCAyLjQ2MjMwNzkyOTk5MjY3Nl0sIFsxNTc0NjkwMTU2Ljg4MzM2MzUsIDEyNzgxLCAyLjI5MTA2MDkyNDUzMDAyOTNdLCBbMTU3NDY5MDE3Ni45NDU3MTI4LCAxMjg0MSwgMi40NDk4Mjg4NjMxNDM5MjFdLCBbMTU3NDY5MDE5Ny43ODkzMTA1LCAxMjkwNCwgMi4yMzA5NTYwNzc1NzU2ODM2XSwgWzE1NzQ2OTAyMDAuODA2NzUyLCAxMjkxMywgMi4zMDczNDMyNDQ1NTI2MTIzXSwgWzE1NzQ2OTAyMjguNTU3OTI5LCAxMjk5OCwgMS43OTcxNTI2Mzg0MzUzNjM4XSwgWzE1NzQ2OTAzNTguNTA3MjAxLCAxMzEwOSwgMi4zNTEyMDAxMDM3NTk3NjU2XSwgWzE1NzQ2OTAzNzIuNjU5OTk1LCAxMzE1MywgMi41NDU3NDY1NjQ4NjUxMTIzXSwgWzE1NzQ2OTAzODEuMjI1MDYyMSwgMTMxNzksIDIuNTc1OTI4Njg4MDQ5MzE2NF0sIFsxNTc0NjkwNDIzLjYxNTk2ODIsIDEzMzA3LCAyLjE1NjQ0Nzg4NzQyMDY1NDNdLCBbMTU3NDY5MDQyNC4zMTgwMTI3LCAxMzMwOSwgMi4yODcyMzU5NzUyNjU1MDNdLCBbMTU3NDY5MDQyNy44MDcyOTI3LCAxMzMxOSwgMi4xMTY1NjU3MDQzNDU3MDNdLCBbMTU3NDY5MDQ1My4xMzc2MzgzLCAxMzM5NywgMi4xMTUwMjUyODE5MDYxMjhdLCBbMTU3NDY5MDQ3Ni45MTI3MzYsIDEzNDcwLCAyLjAzNTM2NjA1ODM0OTYwOTRdLCBbMTU3NDY5MDUzOS41MzE3ODI2LCAxMzY2MCwgMi4yMDkyODE2ODI5NjgxMzk2XSwgWzE1NzQ2OTA1NjQuMDQxOTc5MywgMTM3MzUsIDIuNzMxMTU5MjEwMjA1MDc4XSwgWzE1NzQ2OTA1NzEuNzMzNjMzOCwgMTM3NTgsIDIuMjY3MjQ0MzM4OTg5MjU4XSwgWzE1NzQ2OTA1ODAuNTkxMDQ5NCwgMTM3ODUsIDIuMjk5MzA5NDkyMTExMjA2XSwgWzE1NzQ2OTA2MjIuMzgxMjEwNiwgMTM5MTMsIDIuMDI1OTMzNzQyNTIzMTkzNF0sIFsxNTc0NjkwNzk0LjE0NTA4MDYsIDE0MTUyLCAyLjI4NDI0MjE1MzE2NzcyNDZdLCBbMTU3NDY5MDgzMC4wMjQ2OTEzLCAxNDI2MSwgMi4xOTg0ODk5MDQ0MDM2ODY1XSwgWzE1NzQ2OTA4NTMuNTk2NDM0NiwgMTQzMzMsIDIuNTQ5OTc1ODcyMDM5Nzk1XSwgWzE1NzQ2OTA4NzIuMTEzMzg2LCAxNDM4OSwgMi4yOTM3MjAyNDUzNjEzMjhdLCBbMTU3NDY5MDkwNC45NzI5NTAyLCAxNDQ4OSwgMi41NTAwMTIzNTAwODIzOTc1XSwgWzE1NzQ2OTA5MDcuMjYwMzczOCwgMTQ0OTYsIDIuMzQ2Nzg0ODMwMDkzMzg0XSwgWzE1NzQ2OTA5MTAuNTY3MDc3OSwgMTQ1MDYsIDIuMjY0MTgwNDIxODI5MjIzNl0sIFsxNTc0NjkwOTI0LjA2Nzg2ODcsIDE0NTQ3LCAyLjI4MDI4MDgyODQ3NTk1Ml0sIFsxNTc0NjkwOTUzLjQ2MTgxOTYsIDE0NjM2LCAyLjE1NDAxODg3ODkzNjc2NzZdLCBbMTU3NDY5MDk2Ni42MTU3MDA1LCAxNDY3NiwgMi40MDYxNzAxMjk3NzYwMDFdLCBbMTU3NDY5MDk4MS41NDQ4NjgsIDE0NzIxLCAyLjEzOTA2NTk4MDkxMTI1NV0sIFsxNTc0NjkwOTk3Ljk1MjAyNDIsIDE0NzcxLCAyLjE2MTU1NjcyMDczMzY0MjZdLCBbMTU3NDY5MTAwMS45MDI0MTE1LCAxNDc4MywgMi4zNDc1MTAwOTk0MTEwMTA3XSwgWzE1NzQ2OTEwMTcuNjcxMjU5OSwgMTQ4MzAsIDIuMjE1OTc1OTk5ODMyMTUzM10sIFsxNTc0NjkxMDUwLjYzNTczMDcsIDE0OTMwLCAyLjEzMDUxMjcxNDM4NTk4NjNdLCBbMTU3NDY5MTA1MS45MDI2OCwgMTQ5MzQsIDIuMTgxMDg5ODc4MDgyMjc1NF0sIFsxNTc0NjkxMTc2LjgxMDczMiwgMTUwMzAsIDIuMzYxOTA5NjI3OTE0NDI4N10sIFsxNTc0NjkxMjAxLjcwMTc1MTcsIDE1MTA1LCAyLjAyNDk2OTU3Nzc4OTMwNjZdLCBbMTU3NDY5MTIwNS45ODA0MDcsIDE1MTE4LCAxLjc3MDU0MDQ3NTg0NTMzN10sIFsxNTc0NjkxMjIwLjU5ODczOTYsIDE1MTYzLCAyLjMwOTEwMDYyNzg5OTE3XSwgWzE1NzQ2OTEyMjIuOTQ3NDY1NywgMTUxNzAsIDIuMzY2NzI2MTYwMDQ5NDM4NV0sIFsxNTc0NjkxMjI3LjMxMjM5OTksIDE1MTgzLCAyLjM3MTE1MDI1NTIwMzI0N10sIFsxNTc0NjkxMjQ5LjM2NTUwOSwgMTUyNTEsIDIuMTk0NjU1MTc5OTc3NDE3XSwgWzE1NzQ2OTEyNjcuMTAxMzg0OSwgMTUzMDUsIDIuMjc2OTE5MzY0OTI5MTk5XSwgWzE1NzQ2OTEyNjguMDgwNDE1NSwgMTUzMDgsIDIuMDk0OTY4MzE4OTM5MjA5XSwgWzE1NzQ2OTEzMjkuNTIwMTYzOCwgMTU0OTYsIDIuNTQ5ODMwMTk4Mjg3OTY0XSwgWzE1NzQ2OTEzMzEuNjg2NDYyNCwgMTU1MDMsIDEuODE1ODg1NTQzODIzMjQyMl0sIFsxNTc0NjkxMzQyLjY2MDM2MjcsIDE1NTM2LCAyLjMyOTU4NjUwNTg4OTg5MjZdLCBbMTU3NDY5MTM3NS42MjI2MTQ0LCAxNTYzNywgMi40MTUxNjM5OTM4MzU0NDldLCBbMTU3NDY5MTM4My45MTYzNzI1LCAxNTY2MiwgMi4yNjM4NDU2ODIxNDQxNjVdLCBbMTU3NDY5MTQzOS40MjU4MDg3LCAxNTgzMSwgMi4yMzE2MTMzOTc1OTgyNjY2XSwgWzE1NzQ2OTE0NTYuMTg4MjA1LCAxNTg4MiwgMi4wNjM4NDY4MjY1NTMzNDQ3XSwgWzE1NzQ2OTE2MjEuMDY5MTU1NywgMTYwOTgsIDIuMTEzNzk0ODAzNjE5Mzg0OF0sIFsxNTc0NjkxNjU1LjIwMjQ1ODEsIDE2MjAwLCAyLjI5NDE1MjI1OTgyNjY2XSwgWzE1NzQ2OTE2NTUuODI0NzIyMywgMTYyMDIsIDIuMjc5MDA2NDgxMTcwNjU0M10sIFsxNTc0NjkxNjYxLjA1MTI0OTcsIDE2MjE4LCAyLjQ5NzgyNTg2MDk3NzE3M10sIFsxNTc0NjkxNzA0Ljc0MTk2MTUsIDE2MzUwLCAyLjExNTkyMjIxMjYwMDcwOF0sIFsxNTc0NjkxNzcwLjAwMTE4MjgsIDE2NTQ4LCAyLjI0NTcwMjUwNTExMTY5NDNdLCBbMTU3NDY5MTc5OS45NDk5NTAyLCAxNjYzOSwgMS45NDMyMjY0NTY2NDIxNTA5XSwgWzE1NzQ2OTE4NTIuMjMxMzM4MywgMTY3OTcsIDIuNDczMzM2OTM1MDQzMzM1XSwgWzE1NzQ2OTE4NzMuMTg2NzQ2NiwgMTY4NjEsIDIuMjMwNTg3NzIwODcwOTcxN10sIFsxNTc0NjkyMTU2LjQyNzE4NiwgMTc0MzksIDIuMDM3NDE0MzEyMzYyNjcxXSwgWzE1NzQ2OTIxNjQuNjU1NTc1NSwgMTc0NjQsIDIuNDA1MTE1MzY1OTgyMDU1N10sIFsxNTc0NjkyMTk1LjM2MTEwNDUsIDE3NTU4LCAyLjExNTgyODAzNzI2MTk2M10sIFsxNTc0NjkyMTk3LjI5NjE2MjgsIDE3NTY0LCAyLjE4OTQ4Njc0MjAxOTY1MzNdLCBbMTU3NDY5MjIwMC4wMDI1OTIzLCAxNzU3MiwgMi4yNTAyNjk4ODk4MzE1NDNdLCBbMTU3NDY5MjIyNi4xNDY5MTQyLCAxNzY1MSwgMi4xODUyNTMxNDMzMTA1NDddLCBbMTU3NDY5MjIzOS40MDg2NDcsIDE3NjkxLCAyLjIyMTIyOTc5MTY0MTIzNTRdLCBbMTU3NDY5MjI2OC4zOTg4MzE0LCAxNzc3OSwgMi4yMDkyMTg3NDA0NjMyNTddLCBbMTU3NDY5MjQzOS44NTE4MTgzLCAxODAxNiwgMi40MDc3MTg0MjAwMjg2ODY1XSwgWzE1NzQ2OTI0NTkuMTAxMzI0NiwgMTgwNzUsIDIuMDk4ODUyMzk2MDExMzUyNV0sIFsxNTc0NjkyNTEwLjIxOTAyMjUsIDE4MjMyLCAxLjk5MTcwODYzNjI4Mzg3NDVdLCBbMTU3NDY5MjUzOC4zMDA1NzIsIDE4MzE4LCAyLjE4Mjg5MDY1MzYxMDIyOTVdLCBbMTU3NDY5MjYxNy43MDMwNDU0LCAxODU1OSwgMi4zOTE1MTc2MzkxNjAxNTYyXSwgWzE1NzQ2OTI2MjkuODUzMTczMywgMTg1OTYsIDIuMTU0NTI3OTAyNjAzMTQ5NF0sIFsxNTc0NjkyNjQ5LjU4NTMzMzgsIDE4NjU2LCAyLjA3NjM1MTE2NTc3MTQ4NDRdLCBbMTU3NDY5Mjg1OC4wNjg3NjE4LCAxOTAwMSwgMi41MDQ2MjQ4NDM1OTc0MTJdLCBbMTU3NDY5Mjk1NS4xNDY3MjcsIDE5Mjk0LCAyLjQ2MDg4MTQ3MTYzMzkxMV0sIFsxNTc0NjkyOTgzLjI5NTY3NDMsIDE5Mzc5LCAyLjExNDM4NDg4OTYwMjY2MV0sIFsxNTc0NjkzMDA4Ljk3NDU3OTYsIDE5NDU2LCAyLjExNzMyODE2Njk2MTY3XSwgWzE1NzQ2OTMwMjYuMDk4Njg5LCAxOTUwOCwgMS45NjE0OTMxMzQ0OTg1OTYyXSwgWzE1NzQ2OTMwMjYuNzg4NDYyLCAxOTUxMCwgMi4xNzI2NTQzOTAzMzUwODNdLCBbMTU3NDY5MzEwMS4xNzk5NTY0LCAxOTczNCwgMi4zMTc0Nzk2MTA0NDMxMTUyXSwgWzE1NzQ2OTMxMTYuMzkwOTU4NSwgMTk3ODAsIDIuMTI4NjQzNzUxMTQ0NDA5XSwgWzE1NzQ2OTMxMzIuMTQyNTc0MywgMTk4MjgsIDIuMjM5MTY1NzgyOTI4NDY3XSwgWzE1NzQ2OTMxNDkuOTMzMjc3OCwgMTk4ODEsIDIuMDk4MjU2ODI2NDAwNzU3XSwgWzE1NzQ2OTMxNTIuNjY3MDI3LCAxOTg4OSwgMi4xMzIyMTE5MjM1OTkyNDNdLCBbMTU3NDY5MzE1Ni4zMjUwMzU2LCAxOTkwMCwgMi4yMjU0OTM2Njk1MDk4ODc3XSwgWzE1NzQ2OTMyOTMuNTIxNDE3MSwgMjAwMjgsIDEuOTU4ODA4MDY0NDYwNzU0NF0sIFsxNTc0NjkzMzc2LjM3MTU4MDQsIDIwMjc5LCAyLjAyNzg4Njg2NzUyMzE5MzRdLCBbMTU3NDY5MzM4My4xMzY5NzU1LCAyMDMwMCwgMS45Nzc3MTcwNDE5NjkyOTkzXSwgWzE1NzQ2OTMzOTIuMDA4NzA0LCAyMDMyNywgMi4wNzA3ODM4NTM1MzA4ODRdLCBbMTU3NDY5MzQ0OS44OTQ1NDQ0LCAyMDUwMSwgMi4wNDk1MzQzMjA4MzEyOTldLCBbMTU3NDY5MzQ4MC4zNjA5ODY1LCAyMDU5MywgMS45MTQ3MDE5Mzg2MjkxNTA0XSwgWzE1NzQ2OTM1MDcuMDAwNzU0OCwgMjA2NzMsIDEuOTk5NzE5OTc3Mzc4ODQ1Ml0sIFsxNTc0NjkzNTQ0LjAxNzg0MTMsIDIwNzg2LCAyLjI5OTg4OTgwMjkzMjczOTNdLCBbMTU3NDY5MzcxMi40NDMxNTYsIDIxMDA5LCAyLjA3MTg0MDI4NjI1NDg4M10sIFsxNTc0NjkzNzIzLjg2MTMzMDcsIDIxMDQ0LCAyLjE5NjU4MDQxMDAwMzY2Ml0sIFsxNTc0NjkzNzQ5Ljc1NTQ2OTgsIDIxMTI0LCAyLjAwMjg0MDI4MDUzMjgzN10sIFsxNTc0NjkzNzUwLjA5Nzc2ODUsIDIxMTI1LCAyLjA1ODUyOTM3Njk4MzY0MjZdLCBbMTU3NDY5Mzc2Mi4zMDE1OTYsIDIxMTYxLCAyLjIyOTAwMjIzNzMxOTk0NjNdLCBbMTU3NDY5MzgwNS42MTg2NDQ1LCAyMTI5MywgMi4xOTU4NTU4NTU5NDE3NzI1XSwgWzE1NzQ2OTM4NjMuNDUyNTc2NCwgMjE0NjYsIDEuOTI5NTc2Mjc3NzMyODQ5MV0sIFsxNTc0NjkzOTI3LjEwNDE0OSwgMjE2NTksIDIuMzI4MDM1MzU0NjE0MjU4XSwgWzE1NzQ2OTQxNTMuMTA2NjQ2NSwgMjIwNTUsIDEuODMwNzc0MDY4ODMyMzk3NV0sIFsxNTc0Njk0MTYwLjk5NjkwMSwgMjIwNzksIDEuOTU1OTA1Njc1ODg4MDYxNV0sIFsxNTc0Njk0MjY4LjQ3MDYwODIsIDIyNDAzLCAyLjE4NjMxOTExMjc3NzcxXSwgWzE1NzQ2OTQyNzMuMzIyMzA0MiwgMjI0MTcsIDEuOTkxMTE0MDIwMzQ3NTk1Ml0sIFsxNTc0Njk0Mjc2LjUxNzkwNzQsIDIyNDI3LCAyLjAxMjUxNzIxMzgyMTQxMV0sIFsxNTc0Njk0MzA5Ljc5NjI5NDcsIDIyNTI4LCAyLjE2NjEwMzgzOTg3NDI2NzZdLCBbMTU3NDY5NDMxNS40MTIzOTg2LCAyMjU0NSwgMi4wMjE1NjA5MDczNjM4OTE2XSwgWzE1NzQ2OTQzMTguNDQwMDU0NCwgMjI1NTQsIDIuMDg0NDU2MjA1MzY4MDQyXSwgWzE1NzQ2OTQzMjIuNTIwMjAwNywgMjI1NjYsIDEuOTkwMzgzMDI4OTg0MDY5OF0sIFsxNTc0Njk0MzY3LjAyOTM3OTEsIDIyNzAxLCAyLjExMTAyODQzMjg0NjA2OTNdLCBbMTU3NDY5NDM3OS4wNDY1ODcsIDIyNzM3LCAyLjI0MzU1MTk2OTUyODE5ODJdLCBbMTU3NDY5NDM5MS4wOTM1OTAzLCAyMjc3MywgMi4xNzA5MDUzNTE2Mzg3OTRdLCBbMTU3NDY5NDQ0OC4zMjcwNTgzLCAyMjk0NiwgMS45MzczMTY4OTQ1MzEyNV0sIFsxNTc0Njk0NTgyLjEyMDQ0NDgsIDIzMDY2LCAxLjk3OTA4ODY2NDA1NDg3MDZdLCBbMTU3NDY5NDY0MC40NTY3NDM1LCAyMzI0MywgMi4xMjU1ODAzMTA4MjE1MzNdLCBbMTU3NDY5NDcwMS43Mzc0NjU2LCAyMzQzMCwgMi4wNjUwMTQxMjM5MTY2MjZdLCBbMTU3NDY5NDc0My45MTgyMzksIDIzNTU3LCAyLjAxNTU2MzQ4ODAwNjU5Ml0sIFsxNTc0Njk0NzgyLjMxMTY3MjIsIDIzNjczLCAyLjA4MDI4Mzg4MDIzMzc2NDZdLCBbMTU3NDY5NDg4MC4zODQ4MDQsIDIzOTcxLCAxLjk4MTM2NTc5OTkwMzg2OTZdLCBbMTU3NDY5NTAwMi42MTUzMDQ3LCAyNDA1NiwgMS43NDcyNTMxNzk1NTAxNzFdLCBbMTU3NDY5NTAwOC44Nzc2MDUsIDI0MDc1LCAyLjAzNzAyNzM1OTAwODc4OV0sIFsxNTc0Njk1MDQ1LjUxODkxMiwgMjQxODcsIDIuMTA5Njc5NDYwNTI1NTEyN10sIFsxNTc0Njk1MDQ4LjEzNTE1NDcsIDI0MTk1LCAxLjg5MjY5NTY2NTM1OTQ5N10sIFsxNTc0Njk1MDcxLjYyNTY0MzUsIDI0MjY2LCAyLjI3OTk0Mjc1MDkzMDc4Nl0sIFsxNTc0Njk1MTAyLjI2NzY0MjcsIDI0MzU4LCAyLjE5MDU3MjczODY0NzQ2MV0sIFsxNTc0Njk1MTYwLjc2MDc4NzIsIDI0NTM2LCAyLjA3Mzk4MTI4NTA5NTIxNV0sIFsxNTc0Njk1MTczLjMxMzE2LCAyNDU3NCwgMS44NjAxMzM4ODYzMzcyODAzXSwgWzE1NzQ2OTUxNzcuNTUxODk3NSwgMjQ1ODcsIDEuODk5MjI1OTUwMjQxMDg4OV0sIFsxNTc0Njk1MjE4Ljk4NjYzMTYsIDI0NzEyLCAyLjE4NDIwNTI5MzY1NTM5NTVdLCBbMTU3NDY5NTIyMy43MDgyNywgMjQ3MjcsIDEuOTk3Mjg3MDM0OTg4NDAzM10sIFsxNTc0Njk1MjYwLjExNjcxNywgMjQ4MzcsIDIuMDU1NzYyNzY3NzkxNzQ4XSwgWzE1NzQ2OTUyNzcuOTg4MDkyMiwgMjQ4OTIsIDIuMDY5MzAwODg5OTY4ODcyXSwgWzE1NzQ2OTUyODkuMzA3ODA1OCwgMjQ5MjYsIDIuMTE0OTg1NDY2MDAzNDE4XSwgWzE1NzQ2OTUzMDIuNjU5OTUxNCwgMjQ5NjYsIDIuMTY5NDg4NDMwMDIzMTkzNF0sIFsxNTc0Njk1NDMyLjk3NDczNzIsIDI1MDc1LCAyLjI1MDY1MTU5Nzk3NjY4NDZdLCBbMTU3NDY5NTU4MC4yNzkxMjc4LCAyNTUyMiwgMi4wOTcyMjA0MjA4Mzc0MDIzXSwgWzE1NzQ2OTU2MTMuNTUxNzAyMywgMjU2MjQsIDIuMDg4ODgxMDE1Nzc3NTg4XSwgWzE1NzQ2OTU2MTQuNTczOTI0MywgMjU2MjcsIDEuODgxNTk1MDE1NTI1ODE3OV0sIFsxNTc0Njk1NjQ5LjYwNjg4NTQsIDI1NzM0LCAyLjA1NTM4NzI1ODUyOTY2M10sIFsxNTc0Njk1Njg4LjEwMzM3NzMsIDI1ODUwLCAyLjAyNjA4ODIzNzc2MjQ1MV0sIFsxNTc0Njk1NzI1LjYyNjc5OCwgMjU5NjMsIDEuOTA4MzQwOTMwOTM4NzIwN10sIFsxNTc0Njk1ODQ5Ljg4NzQ5MjIsIDI2MDU3LCAxLjkyMDQ2NjQyMzAzNDY2OF0sIFsxNTc0Njk1ODUxLjg4MzYwNDMsIDI2MDYzLCAyLjE4MjU3NzYxMDAxNTg2OV0sIFsxNTc0Njk1ODk0LjQ4Mzk0ODUsIDI2MTkyLCAyLjA0NTYwNjYxMzE1OTE3OTddLCBbMTU3NDY5NTk0Ni42MTkyNTg5LCAyNjM1MiwgMS44OTExMzQxNDI4NzU2NzE0XSwgWzE1NzQ2OTU5ODEuMjQ3Mzg3NCwgMjY0NTcsIDIuMDE4MTgwODQ3MTY3OTY4OF0sIFsxNTc0Njk1OTgzLjE3MTczNzQsIDI2NDYzLCAyLjE0MzUzNzUyMTM2MjMwNDddLCBbMTU3NDY5NjEzNC40MTg1ODM2LCAyNjkyMiwgMi4wMTg4MTQwODY5MTQwNjI1XSwgWzE1NzQ2OTYyNjYuMTEwODc5NywgMjcwMzksIDEuODk2MzU1MzkwNTQ4NzA2XSwgWzE1NzQ2OTYyNzMuMzk3NDQxOSwgMjcwNjIsIDIuMDYxNDYwNzMzNDEzNjk2M10sIFsxNTc0Njk2MzA3LjYxNTMzMywgMjcxNjUsIDIuMDEwOTY3MDE2MjIwMDkyOF0sIFsxNTc0Njk2NDYzLjgxMTkzMTEsIDI3NjQxLCAxLjkwOTEyODQyNzUwNTQ5MzJdLCBbMTU3NDY5NjQ5MC42NzU1NTE0LCAyNzcyMiwgMS45MDUwOTg3OTU4OTA4MDhdLCBbMTU3NDY5NjUzNi42Njc4OTg3LCAyNzg2MSwgMi4wMDY1MTA0OTYxMzk1MjY0XSwgWzE1NzQ2OTY3MTYuNjcxNzYzNCwgMjgxMjQsIDIuMDc2NTI2NjQxODQ1NzAzXSwgWzE1NzQ2OTY3NTEuNzMzMzUxMiwgMjgyMjksIDIuMTgxODMyMDc1MTE5MDE4Nl0sIFsxNTc0Njk2Nzg5Ljk4NTU0NDIsIDI4MzQ0LCAxLjk3NzMzODY3MTY4NDI2NTFdLCBbMTU3NDY5NjgxNS4yOTgzMTk2LCAyODQyMSwgMS43MDEzMTI1NDE5NjE2N10sIFsxNTc0Njk2ODY2LjExMTk4NzQsIDI4NTc1LCAxLjg3NjY2NTIzNDU2NTczNDldLCBbMTU3NDY5Njk0Ny45MDg0MzQyLCAyODgyMywgMi4xODA2MzExNjA3MzYwODRdLCBbMTU3NDY5Njk5My43MzAxMDU2LCAyODk2MiwgMS44MzgzMzU2MzMyNzc4OTNdLCBbMTU3NDY5NzE3Ny42NzczNzM0LCAyOTIzNiwgMS45OTMyNDMwOTgyNTg5NzIyXSwgWzE1NzQ2OTcyMjkuMDc4NzgwMiwgMjkzOTIsIDEuOTM1NTU2MjkyNTMzODc0NV0sIFsxNTc0Njk3MjU1LjgyMjc5MjgsIDI5NDczLCAxLjkzODQ1ODY4MTEwNjU2NzRdLCBbMTU3NDY5NzI3OS40NDU5ODMsIDI5NTQ1LCAxLjg4NzE4NDUwMDY5NDI3NV0sIFsxNTc0Njk3Mjg4LjA3MzcxOTUsIDI5NTcxLCAxLjg2NTU5MDIxNDcyOTMwOV0sIFsxNTc0Njk3Mzc4LjkyOTYyOTMsIDI5ODQ2LCAxLjk0MTIyODk4NTc4NjQzOF0sIFsxNTc0Njk3NDE0LjU5ODk3MDcsIDI5OTU1LCAxLjgyMTM3MzEwNTA0OTEzMzNdLCBbMTU3NDY5NzQyOC40MDMzOTU3LCAyOTk5NywgMS45OTIwMDg2ODYwNjU2NzM4XSwgWzE1NzQ2OTc1MjUuMjk4ODM4OSwgMzAwMDcsIDEuOTY1ODY3NDAwMTY5MzcyNl0sIFsxNTc0Njk3NTc0Ljc5NjI2OTcsIDMwMTU3LCAyLjA2MzU0NTk0MjMwNjUxODZdLCBbMTU3NDY5NzU4MC4xMjAwNTE2LCAzMDE3MywgMS43Mzg5NTQ5MDE2OTUyNTE1XSwgWzE1NzQ2OTc2MDIuMTcxMzY5MywgMzAyNDEsIDIuMDY4OTM3Nzc4NDcyOTAwNF0sIFsxNTc0Njk3NjEzLjkyNDk3OSwgMzAyNzcsIDEuNzk5NjA5NzgwMzExNTg0NV0sIFsxNTc0Njk3NjI1Ljc5MDM3ODYsIDMwMzEzLCAxLjg2Njk0NTYyNDM1MTUwMTVdLCBbMTU3NDY5NzY3MC45NDkyOTMsIDMwNDUwLCAxLjcwNTkwNjM5MTE0Mzc5ODhdLCBbMTU3NDY5NzY3My45ODc0NTAxLCAzMDQ1OSwgMi4xNzQzOTg2NjA2NTk3OV0sIFsxNTc0Njk3NzIyLjI3OTEzMSwgMzA2MDQsIDIuMDY1NDczNzk0OTM3MTM0XSwgWzE1NzQ2OTc3MjguNjQ2NzA4NywgMzA2MjMsIDIuMDM5NTQzODY3MTExMjA2XSwgWzE1NzQ2OTc4MDcuMjYxNzI2NiwgMzA4NjEsIDIuMDUzNzQyODg1NTg5NTk5Nl0sIFsxNTc0Njk3OTU2LjM3NTkyLCAzMTAyOCwgMi4wNzA0OTUzNjcwNTAxNzFdLCBbMTU3NDY5Nzk5Ny43ODg2MDM1LCAzMTE1MywgMS45MDc2NDg5MjEwMTI4Nzg0XSwgWzE1NzQ2OTgwMTQuNjE1MjU1NCwgMzEyMDUsIDEuNjg0Nzc3NjE3NDU0NTI4OF0sIFsxNTc0Njk4MDIwLjkzNTI3MjUsIDMxMjI0LCAxLjkwNzc0NTM2MTMyODEyNV0sIFsxNTc0Njk4MDQ4LjU5ODU0OTQsIDMxMzA5LCAyLjAzNTYxNDk2NzM0NjE5MTRdLCBbMTU3NDY5ODA1NS4wMTAxNDIzLCAzMTMyOSwgMi4wMDY1MTQzMTA4MzY3OTJdLCBbMTU3NDY5ODE0MC40NTc1NDYsIDMxNTg5LCAyLjA0ODc1NTE2ODkxNDc5NV0sIFsxNTc0Njk4MTY3LjM5MTE3NDgsIDMxNjcxLCAyLjA2MzIxMTIwMjYyMTQ2XSwgWzE1NzQ2OTgyMTcuODc1OTM0MSwgMzE4MjUsIDEuOTk1MDA4OTQ1NDY1MDg4XSwgWzE1NzQ2OTgyMzkuMDE5NzUzNywgMzE4ODksIDEuODk1NzQ3MzAzOTYyNzA3NV0sIFsxNTc0Njk4MjYwLjgzMTYzNiwgMzE5NTYsIDIuMTMyMTQ1NjQzMjM0MjUzXSwgWzE1NzQ2OTgyNjcuMDY4OTgyNiwgMzE5NzUsIDEuOTcxNTUyODQ4ODE1OTE4XSwgWzE1NzQ2OTg0NjEuMjQwMTgxLCAzMjI4MSwgMS42NjU5MzI0MTY5MTU4OTM2XSwgWzE1NzQ2OTg0NzMuOTY2OTgyLCAzMjMyMCwgMS45MjE2MDczNzUxNDQ5NTg1XSwgWzE1NzQ2OTg0ODcuNjk3NzkzNywgMzIzNjIsIDIuMDMzMzA5MjIxMjY3N10sIFsxNTc0Njk4NTU3Ljc4Mjk2NDcsIDMyNTc1LCAxLjkyMzAwODY4MDM0MzYyOF0sIFsxNTc0Njk4NjAwLjQ5OTk3NDUsIDMyNzA2LCAxLjcwMTU4MzUwNDY3NjgxODhdLCBbMTU3NDY5ODY3NC42MDY0NzAzLCAzMjkzMiwgMS44NTcwMDUyMzg1MzMwMl0sIFsxNTc0Njk4Njk0LjA5NTc1OTYsIDMyOTkyLCAxLjcxNDA5NTU5MjQ5ODc3OTNdLCBbMTU3NDY5ODgwNC44NTc4MjIsIDMzMDQ1LCAxLjk2MTk5Nzg2NjYzMDU1NDJdLCBbMTU3NDY5ODgyMy44NDA1NjU0LCAzMzEwMiwgMS44NTAxNjgxMDg5NDAxMjQ1XSwgWzE1NzQ2OTg4MzIuNTQ4MzgzNywgMzMxMjgsIDEuOTA2MjQ1NDcwMDQ2OTk3XSwgWzE1NzQ2OTg4NDUuNjMxNDE1NCwgMzMxNjgsIDEuOTEwMzg0Nzc0MjA4MDY4OF0sIFsxNTc0Njk4ODg4Ljk0NzkyMjcsIDMzMzAwLCAxLjc0NDM5MDg0NTI5ODc2N10sIFsxNTc0Njk4ODk1Ljc4ODcyNiwgMzMzMjEsIDEuOTQ4NTA4NjIwMjYyMTQ2XSwgWzE1NzQ2OTg5MDIuNjg0NjY0MiwgMzMzNDIsIDEuODE4NDIzNjI4ODA3MDY3OV0sIFsxNTc0Njk4OTIwLjI2NTAxMzcsIDMzMzk3LCAyLjAxNjE2MjYzMzg5NTg3NF0sIFsxNTc0Njk4OTQwLjkyOTc0MzMsIDMzNDYwLCAxLjc5NDk4MTEyMjAxNjkwNjddLCBbMTU3NDY5ODk5OC43NTc3MTk4LCAzMzYzNiwgMS45NjgzNTY4NDc3NjMwNjE1XSwgWzE1NzQ2OTkwNjguOTk1NTAxOCwgMzM4NDksIDEuODU0ODY0MzU4OTAxOTc3NV0sIFsxNTc0Njk5MDg5Ljg0OTE1MjYsIDMzOTEzLCAxLjg2OTYxMzE3MDYyMzc3OTNdLCBbMTU3NDY5OTIxOS41MjE2NjYsIDM0MDI0LCAxLjk5MjQzMzMwOTU1NTA1MzddLCBbMTU3NDY5OTI4My45MTUzODE3LCAzNDIyMCwgMS44MjI3MzA4OTg4NTcxMTY3XSwgWzE1NzQ2OTkyOTEuODMzNTY5MywgMzQyNDQsIDEuODcxNTI5MTAyMzI1NDM5NV0sIFsxNTc0Njk5MzIwLjgxNTQ4MywgMzQzMzIsIDEuNzU0ODQ1MTQyMzY0NTAyXSwgWzE1NzQ2OTkzMjcuNDIwMzc0OSwgMzQzNTIsIDEuODMyNTU5NzA0NzgwNTc4Nl0sIFsxNTc0Njk5MzgxLjY2Njc3NywgMzQ1MTksIDEuNzUxMDA3NDM3NzA1OTkzN10sIFsxNTc0Njk5NDE5LjE2ODU2NTUsIDM0NjM0LCAxLjgxNjI3MDk0NzQ1NjM1OTldLCBbMTU3NDY5OTQ0Ni43MDg4NDEzLCAzNDcxOCwgMS43ODIwMTE4NjY1Njk1MTldLCBbMTU3NDY5OTUwMS43OTA0MSwgMzQ4ODUsIDEuNzkyNjE3MzIxMDE0NDA0M10sIFsxNTc0Njk5Njg2LjY2MTk3ODcsIDM1MTY0LCAxLjkzNjM0Nzg0MjIxNjQ5MTddLCBbMTU3NDY5OTcwMS4yMzQ1OTQ4LCAzNTIwOCwgMS44MzAzODAyMDEzMzk3MjE3XSwgWzE1NzQ2OTk3MjkuNzkyMTEyNiwgMzUyOTQsIDEuODA4NjEwMzIwMDkxMjQ3Nl0sIFsxNTc0Njk5NzM1LjI2MzM1MzYsIDM1MzExLCAyLjEwODU4MTMwNDU1MDE3MV0sIFsxNTc0Njk5NzQ5LjYwMDIxNjYsIDM1MzU0LCAxLjc0NzAzNDY2ODkyMjQyNDNdLCBbMTU3NDY5OTc1NC40MTM5MDI4LCAzNTM2OSwgMS45ODMwNzU3Mzc5NTMxODZdLCBbMTU3NDY5OTc3MC4wNTQ3MTkyLCAzNTQxNiwgMS43MjY4MTM1NTQ3NjM3OTRdLCBbMTU3NDY5OTgyMS4zNjY3OTg0LCAzNTU3MSwgMS44NTkwNDIxNjc2NjM1NzQyXSwgWzE1NzQ2OTk4NDAuODIwNzc4MSwgMzU2MzEsIDIuMDMyODU1NTEwNzExNjddLCBbMTU3NDY5OTg0OC44NTQ2Mjg2LCAzNTY1NSwgMS45NjU5NjAwMjU3ODczNTM1XSwgWzE1NzQ2OTk4NTMuNzQ2NzkyLCAzNTY3MCwgMS44MjU2NTc3MjUzMzQxNjc1XSwgWzE1NzQ2OTk5MzMuMTQ2NDEwNSwgMzU5MTAsIDEuOTQyODg4MjU5ODg3Njk1M10sIFsxNTc0Njk5OTM5LjA0NTQ5MywgMzU5MjgsIDIuMTY1OTg1ODIyNjc3NjEyM10sIFsxNTc0NzAwMTA2LjU5NDQ1NTIsIDM2MTUzLCAyLjA3MTI3ODU3MjA4MjUxOTVdLCBbMTU3NDcwMDEwOC42ODk4Njk0LCAzNjE2MCwgMS43NzU2MTA1NjYxMzkyMjEyXSwgWzE1NzQ3MDAxNzMuOTQ3NjA2NiwgMzYzNTgsIDEuNzkyNDAzMjIxMTMwMzcxXSwgWzE1NzQ3MDAxNzUuNTcwMDE0LCAzNjM2MywgMS44ODA2MjMzNDA2MDY2ODk1XSwgWzE1NzQ3MDAxODcuNTA1OTU5NSwgMzYzOTksIDEuOTI3MTQ3NTA3NjY3NTQxNV0sIFsxNTc0NzAwMjIxLjI5NTg1MzEsIDM2NTAyLCAyLjA0ODExODU5MTMwODU5MzhdLCBbMTU3NDcwMDIzNi4yNzU1MzQ2LCAzNjU0OCwgMS45MDUzNTI5NTAwOTYxMzA0XSwgWzE1NzQ3MDAyNzUuMzg1MDk1MSwgMzY2NjYsIDEuODc0NjM2ODg4NTA0MDI4M10sIFsxNTc0NzAwMzAyLjU1ODY1ODQsIDM2NzQ5LCAxLjg4ODMyMTI4MDQ3OTQzMTJdLCBbMTU3NDcwMDMxOC45OTUxMDIyLCAzNjc5OCwgMS45NzM4MjA4MDU1NDk2MjE2XSwgWzE1NzQ3MDAzNTQuOTczODE2LCAzNjkwNywgMS44NzM4OTg3NDQ1ODMxMjk5XSwgWzE1NzQ3MDAzNjQuODU0NTg3NiwgMzY5MzcsIDEuODYyMzgzMTI3MjEyNTI0NF0sIFsxNTc0NzAwNDgzLjMwNDg1MDMsIDM3MDEyLCAxLjk2NDA4NDg2MzY2MjcxOTddLCBbMTU3NDcwMDQ4NC4xNjgxODgsIDM3MDE1LCAyLjA2OTA5OTE4Nzg1MDk1Ml0sIFsxNTc0NzAwNTM4LjI0MTE1OSwgMzcxODAsIDEuOTMwNDU0MzczMzU5NjgwMl0sIFsxNTc0NzAwNTUwLjczNjYzMTQsIDM3MjE5LCAxLjc2NDg0NjMyNDkyMDY1NDNdLCBbMTU3NDcwMDU1MS4zNzc1NDE1LCAzNzIyMSwgMS45NDg1OTU0MDQ2MjQ5MzldLCBbMTU3NDcwMDU4Ni45OTg5MjMzLCAzNzMzMCwgMS42ODY0MzMzMTUyNzcwOTk2XSwgWzE1NzQ3MDA2MjcuOTk3NzIyNCwgMzc0NTUsIDEuNjgxNTU5NjgxODkyMzk1XSwgWzE1NzQ3MDA2NTAuNTc1NjczLCAzNzUyNCwgMS44NDU0NTc0MzQ2NTQyMzU4XSwgWzE1NzQ3MDA2NTkuNzYyNjc1MywgMzc1NTIsIDEuOTg1OTgyNDE4MDYwMzAyN10sIFsxNTc0NzAwNzM2Ljc5NjY0NzMsIDM3NzgyLCAxLjkxMzI0MjQ1OTI5NzE4MDJdLCBbMTU3NDcwMDc1Ni41MTk2OTE3LCAzNzg0MiwgMi4wMzAwNTcxOTE4NDg3NTVdLCBbMTU3NDcwMDkyNi43MDIzMDYsIDM4MDc0LCAxLjg0MDczMDY2NzExNDI1NzhdLCBbMTU3NDcwMDkyNy40MDE1NDI0LCAzODA3NiwgMS43OTYyNjEwNzIxNTg4MTM1XSwgWzE1NzQ3MDA5NDMuOTgzNjkyNiwgMzgxMjYsIDIuMDU1MjkyNjA2MzUzNzU5OF0sIFsxNTc0NzAwOTg0LjkwMzUwNDQsIDM4MjQ5LCAxLjkwNDczOTYxODMwMTM5MTZdLCBbMTU3NDcwMTAwNS41NzcxODY2LCAzODMxMiwgMS43Nzk1MjE5NDIxMzg2NzE5XSwgWzE1NzQ3MDEwMDguMzAyNzExNywgMzgzMjAsIDEuNzcxMjMwNjk3NjMxODM2XSwgWzE1NzQ3MDEwMzMuMTkzMDksIDM4Mzk2LCAxLjgzMjI1MzA5ODQ4Nzg1NF0sIFsxNTc0NzAxMDQ0Ljk3NTEyMjUsIDM4NDMyLCAxLjgyMjM3Mzk4NjI0NDIwMTddLCBbMTU3NDcwMTA4OC40OTA2NzUsIDM4NTYzLCAxLjczMzY3MTE4ODM1NDQ5MjJdLCBbMTU3NDcwMTA5Ny40NzQwNzQ2LCAzODU5MCwgMS44NTQzMDQ5MDk3MDYxMTU3XSwgWzE1NzQ3MDExMDUuNDE0NjU2LCAzODYxNCwgMS44MzM2ODE0NjQxOTUyNTE1XSwgWzE1NzQ3MDExMDkuMDY2NTg5LCAzODYyNSwgMS45NjMzODEyOTA0MzU3OTFdLCBbMTU3NDcwMTEyNi41MDk2MTg4LCAzODY3OSwgMS43Nzg2ODYxNjU4MDk2MzEzXSwgWzE1NzQ3MDExNTYuNjkzNTA0OCwgMzg3NzEsIDEuODkwMTc5NjM0MDk0MjM4M10sIFsxNTc0NzAxMTc5LjIxNzgyODgsIDM4ODM5LCAxLjg0NzY0NzQyODUxMjU3MzJdLCBbMTU3NDcwMTQyMC42OTg0NDQ2LCAzOTI5MSwgMS44MzAwMzE5OTEwMDQ5NDM4XSwgWzE1NzQ3MDE0MzEuNzk3NDUyNywgMzkzMjUsIDEuODUyNTk0MDE3OTgyNDgzXSwgWzE1NzQ3MDE0NDguMjk5MDU3MiwgMzkzNzQsIDEuOTAzMjg4MjQ1MjAxMTEwOF0sIFsxNTc0NzAxNDc1LjUyMDIxNiwgMzk0NTcsIDIuMTA0NTU3NTE0MTkwNjc0XSwgWzE1NzQ3MDE0ODEuNTExMzI0MiwgMzk0NzUsIDEuODg5NjkyNjY0MTQ2NDIzM10sIFsxNTc0NzAxNTA0LjY4ODI1MzIsIDM5NTQ2LCAxLjkxODExNjY4ODcyODMzMjVdLCBbMTU3NDcwMTUzMS4yNTI4MjA3LCAzOTYyNywgMS43NjczODI2MjE3NjUxMzY3XSwgWzE1NzQ3MDE1ODUuOTIyMTAxNywgMzk3OTIsIDEuNzY3OTIxNTY2OTYzMTk1OF0sIFsxNTc0NzAxNTg2Ljk2MDgwNTcsIDM5Nzk1LCAxLjc4OTMwODY2NzE4MjkyMjRdLCBbMTU3NDcwMTYxNy42ODcwMTY1LCAzOTg4OSwgMS44MTI0OTg2ODg2OTc4MTVdLCBbMTU3NDcwMTYxOC4wMTM5MjM0LCAzOTg5MCwgMS45MTI2MDAyNzg4NTQzNzAxXSwgWzE1NzQ3MDE2NDEuODUxNjAxMSwgMzk5NjQsIDEuOTM4MjQzMTUwNzExMDU5Nl0sIFsxNTc0NzAxNzg2LjY5NjM0MTMsIDQwMTIxLCAxLjgzMzAzNjQyMjcyOTQ5MjJdLCBbMTU3NDcwMTgwNi41Mjk4OTgsIDQwMTgyLCAxLjc5OTEzOTYxODg3MzU5NjJdLCBbMTU3NDcwMTg0Ni43ODc0NDYsIDQwMzA2LCAxLjkxMzgxMTgwMjg2NDA3NDddLCBbMTU3NDcwMTg1Mi4yMTY0MzI2LCA0MDMyMywgMS45OTI4MDUxMjMzMjkxNjI2XSwgWzE1NzQ3MDE4NTUuMjE2ODM0OCwgNDAzMzIsIDEuNTU0MzIxNjQ2NjkwMzY4N10sIFsxNTc0NzAxOTU4LjIwNDcwOSwgNDA2NDUsIDEuNzc5NTk3NjQwMDM3NTM2Nl0sIFsxNTc0NzAyMDEzLjkyMDc0NjYsIDQwODE0LCAxLjgwNzQ5MzMyOTA0ODE1NjddLCBbMTU3NDcwMjAyMy44OTUxNzY0LCA0MDg0NCwgMi4wMzkzODQxMjY2NjMyMDhdLCBbMTU3NDcwMjA0MC44MjI1MjI0LCA0MDg5NiwgMi4xMTczMjQzNTIyNjQ0MDQzXSwgWzE1NzQ3MDIwNzQuNDgwOTAyNywgNDA5OTgsIDEuOTk1NTIzNDUyNzU4Nzg5XSwgWzE1NzQ3MDIxNjkuMjI5NzQ1NiwgNDEwMDMsIDIuMDA1MzY3NTE3NDcxMzEzNV0sIFsxNTc0NzAyMTgyLjk0NjQwMzUsIDQxMDQ1LCAxLjc2NDQyMjc3NDMxNDg4MDRdLCBbMTU3NDcwMjI3MC4zMTgzOTQ0LCA0MTMxMCwgMS45NTU5NDk3ODMzMjUxOTUzXSwgWzE1NzQ3MDIzMDAuNTk0NzMxNiwgNDE0MDIsIDEuODk2Njg2MTk2MzI3MjA5NV0sIFsxNTc0NzAyMzM5LjY1MzY5OTIsIDQxNTIxLCAxLjkxNjY3NDM3NTUzNDA1NzZdLCBbMTU3NDcwMjM2Ny4yNzQ4MjMsIDQxNjA2LCAxLjc3OTc1NjU0NjAyMDUwNzhdLCBbMTU3NDcwMjYwNS44MzYyNjcsIDQyMDUxLCAxLjgyNDYxMzA5NDMyOTgzNF0sIFsxNTc0NzAyNjk2LjQ1MDA2MjgsIDQyMzI4LCAxLjcxMzk2MTI0MzYyOTQ1NTZdLCBbMTU3NDcwMjcxNy42MTc2NjIyLCA0MjM5MiwgMS42OTkxMTE4MTkyNjcyNzNdLCBbMTU3NDcwMjc0Mi40Nzk0ODAzLCA0MjQ2NywgMi4wMzQ2MzY5NzQzMzQ3MTddLCBbMTU3NDcwMjc1MS4yMTU0OTQ5LCA0MjQ5NCwgMS44NDczNDYxODY2Mzc4Nzg0XSwgWzE1NzQ3MDI3NjQuMDUwOTk0NiwgNDI1MzMsIDEuODM5MDQ5OTM1MzQwODgxM10sIFsxNTc0NzAyNzkwLjQ4ODczNiwgNDI2MTQsIDEuNzU5MTg2NjI1NDgwNjUxOV0sIFsxNTc0NzAyODAxLjI5MDM5NywgNDI2NDcsIDEuODU2MTk5NzQxMzYzNTI1NF0sIFsxNTc0NzAyODQxLjQ1NTE5MzUsIDQyNzY5LCAyLjA0Nzc5MjkxMTUyOTU0MV0sIFsxNTc0NzAyOTAwLjUzNDE5MjgsIDQyOTQ1LCAxLjc4NTU3NjQ2Mjc0NTY2NjVdLCBbMTU3NDcwMzAxNC4wMjg2OTYsIDQzMDA1LCAxLjg2Njk3ODQwNjkwNjEyOF0sIFsxNTc0NzAzMDQ5Ljc0MDg1ODMsIDQzMTEzLCAxLjc0ODM2Mjc3OTYxNzMwOTZdLCBbMTU3NDcwMzA1Mi44NjA0NCwgNDMxMjMsIDEuODczMzkxNzQ3NDc0NjcwNF0sIFsxNTc0NzAzMDY5LjA2NTUxODEsIDQzMTcyLCAxLjk4NjA5ODI4OTQ4OTc0Nl0sIFsxNTc0NzAzMDc2Ljk5NzA5NTgsIDQzMTk2LCAyLjAwMTMyOTY2MDQxNTY0OTRdLCBbMTU3NDcwMzA4NC45NTc1NzY4LCA0MzIyMCwgMS45OTExOTExNDg3NTc5MzQ2XSwgWzE1NzQ3MDMxMTcuODQyMjgyNSwgNDMzMjAsIDEuNzg3NDEzMTIwMjY5Nzc1NF0sIFsxNTc0NzAzMTcxLjI2NjY1MiwgNDM0ODIsIDEuNzcyOTEwODMzMzU4NzY0Nl0sIFsxNTc0NzAzMTc0LjU2NjMwMSwgNDM0OTIsIDEuODg5OTkwMjEwNTMzMTQyXSwgWzE1NzQ3MDMxOTEuODQ4OTU4LCA0MzU0NSwgMS43MzU0OTQ5NzEyNzUzMjk2XSwgWzE1NzQ3MDMyMDguNzc1MjU2NiwgNDM1OTYsIDEuNzkzMDUwODg1MjAwNTAwNV0sIFsxNTc0NzAzMjE2LjU2Njk1MzQsIDQzNjIwLCAxLjg0NzU3NDk0OTI2NDUyNjRdLCBbMTU3NDcwMzIyMC44NDUxNzkzLCA0MzYzMywgMS41MTIyOTIyNjU4OTIwMjg4XSwgWzE1NzQ3MDMyMzguMDYyNzUzNCwgNDM2ODUsIDEuODMzNjk2NDg0NTY1NzM0OV0sIFsxNTc0NzAzMjYzLjM2Mjg2MywgNDM3NjIsIDEuODc1MTAyNTE5OTg5MDEzN10sIFsxNTc0NzAzMjc0LjcwNDk5MjMsIDQzNzk3LCAxLjgwODE5NDg3NTcxNzE2M10sIFsxNTc0NzAzMjc3LjYyMTk2OSwgNDM4MDYsIDEuOTYyMzU4MTE3MTAzNTc2N10sIFsxNTc0NzAzMjgwLjUyMjU0MzIsIDQzODE1LCAxLjk1MTc0NDc5NDg0NTU4MV0sIFsxNTc0NzAzMjkxLjUxMDY2MTgsIDQzODQ5LCAxLjYxNDEyODIzMjAwMjI1ODNdLCBbMTU3NDcwMzMxMy41ODE5MjE2LCA0MzkxNiwgMS41NDU4MDQxNDI5NTE5NjUzXSwgWzE1NzQ3MDMzMzMuNzkzMzU3MSwgNDM5NzgsIDEuODg3NzI1OTQ5Mjg3NDE0Nl0sIFsxNTc0NzAzNDQwLjYyNDAxNzUsIDQ0MDIwLCAxLjc5NzIwMjk0NDc1NTU1NDJdLCBbMTU3NDcwMzQ0Ni4yMDkzMjM0LCA0NDAzNywgMS43OTkwNzA1OTY2OTQ5NDYzXSwgWzE1NzQ3MDM0NzguMjc5NzQzLCA0NDEzNCwgMS42NjAzMjgyNjkwMDQ4MjE4XSwgWzE1NzQ3MDM0OTMuMTY2MzM1NiwgNDQxNzksIDEuOTY4MTQ4MjMxNTA2MzQ3N10sIFsxNTc0NzAzNDk0LjE5MDM3OTksIDQ0MTgyLCAxLjg1NTE5NTI4Mzg4OTc3MDVdLCBbMTU3NDcwMzU2My42MDg1MDg4LCA0NDM5MiwgMS43NzE0NTg1MDY1ODQxNjc1XSwgWzE1NzQ3MDM1NjcuNzQyNTc4LCA0NDQwNSwgMS45MTA5NDk0Njg2MTI2NzFdLCBbMTU3NDcwMzYyMi4wMzkwNDA4LCA0NDU3MSwgMS43NTExMTc3MDYyOTg4MjgxXSwgWzE1NzQ3MDM2MjMuMDEwMzExMSwgNDQ1NzQsIDEuNzA0NDc4NTAyMjczNTU5Nl0sIFsxNTc0NzAzNjYxLjgyNTY5OTMsIDQ0NjkzLCAxLjcyODU0NjM4MDk5NjcwNF0sIFsxNTc0NzAzNjkwLjA2OTYzNTYsIDQ0Nzc4LCAxLjc4MjcwMzk5NTcwNDY1MDldLCBbMTU3NDcwMzY5MC40MDcxNDQ1LCA0NDc3OSwgMS44MzUxNTc5OTA0NTU2Mjc0XSwgWzE1NzQ3MDM4NjUuNDY5MTI1LCA0NTAyOCwgMS44MzQxMTcyOTMzNTc4NDkxXSwgWzE1NzQ3MDM4ODQuNTk2NzY2NSwgNDUwODYsIDEuNzM0OTcyMjM4NTQwNjQ5NF0sIFsxNTc0NzAzOTQ4LjMxOTM1MDIsIDQ1MjgwLCAxLjk5MzAxNzA3NzQ0NTk4MzldLCBbMTU3NDcwMzk2NC4xMjkzNzU3LCA0NTMyOCwgMS45ODQ3ODQ5NjA3NDY3NjUxXSwgWzE1NzQ3MDM5OTYuOTI0NDIxLCA0NTQyOSwgMS44OTM3MDUzNjgwNDE5OTIyXSwgWzE1NzQ3MDM5OTcuMjczODkyNiwgNDU0MzAsIDEuODU4NzYyMTQ1MDQyNDE5NF0sIFsxNTc0NzA0MDEzLjc3NzM2MzUsIDQ1NDgwLCAxLjkyMjQ0ODYzNTEwMTMxODRdLCBbMTU3NDcwNDA1Ni4xODkyODM0LCA0NTYwOSwgMS43MjgwOTQ4MTYyMDc4ODU3XSwgWzE1NzQ3MDQwNzcuMTA2NjM2NSwgNDU2NzMsIDEuOTU3OTg5ODExODk3Mjc3OF0sIFsxNTc0NzA0MDc3LjQ1NzAwMzQsIDQ1Njc0LCAxLjgzMDQ5NDc2MTQ2Njk4XSwgWzE1NzQ3MDQwODguMzQ3NDMxNywgNDU3MDcsIDEuOTA0OTQ5NDI2NjUxMDAxXSwgWzE1NzQ3MDQwOTQuOTUyMTE2MywgNDU3MjcsIDEuOTA2NDc5MjM5NDYzODA2Ml0sIFsxNTc0NzA0MTAyLjY0MzM4OTUsIDQ1NzUwLCAxLjk1MzEzMzgyMTQ4NzQyNjhdLCBbMTU3NDcwNDM0Ny45Nzc4OTksIDQ2MjEyLCAxLjk1ODEyOTQwNTk3NTM0MThdLCBbMTU3NDcwNDM3MS41Mjk5OSwgNDYyODQsIDEuNzg2OTE3OTI0ODgwOTgxNF0sIFsxNTc0NzA0Mzc0LjExNTQyNDIsIDQ2MjkyLCAxLjkxNDgzNjE2ODI4OTE4NDZdLCBbMTU3NDcwNDM3Ni4zNzg5OTIzLCA0NjI5OSwgMS41NDE4NTQ5Nzc2MDc3MjddLCBbMTU3NDcwNDQwNS42ODY5MTQ0LCA0NjM4OSwgMS43OTAzNzQ1MTc0NDA3OTZdLCBbMTU3NDcwNDQwOC4wMjU0NjQzLCA0NjM5NiwgMS44MDEwODg1NzE1NDg0NjJdLCBbMTU3NDcwNDQyNS41MTE4ODk3LCA0NjQ0OSwgMS45NjM3MTk5NjQwMjc0MDQ4XSwgWzE1NzQ3MDQ0MzAuMDQ5NzIzLCA0NjQ2MywgMS43NjY0MDcxMzIxNDg3NDI3XSwgWzE1NzQ3MDQ0MzcuMDE1MjQwNCwgNDY0ODQsIDEuNzE4OTQ4NDgzNDY3MTAyXSwgWzE1NzQ3MDQ0NzAuODMxNDkxMiwgNDY1ODgsIDEuOTIwMTQxOTM1MzQ4NTEwN10sIFsxNTc0NzA0NDg1LjUzMTE2MzIsIDQ2NjMyLCAxLjcwODY0MDA5ODU3MTc3NzNdLCBbMTU3NDcwNDU5MC45NTY5MzYsIDQ2OTU1LCAxLjcwNDU5ODE4ODQwMDI2ODZdLCBbMTU3NDcwNDczOS4yMjg2OTYsIDQ3MTI0LCAxLjcxMDg0NDc1NTE3MjcyOTVdLCBbMTU3NDcwNDc0NS40NDAwNzY0LCA0NzE0MywgMS44OTU4NjM0MTM4MTA3M10sIFsxNTc0NzA0NzY1LjMwNjEyNDQsIDQ3MjAzLCAxLjc4MjgyNTU4OTE3OTk5MjddLCBbMTU3NDcwNDc3Ny4zOTAzNTA2LCA0NzI0MCwgMS45NDcxNjM1ODE4NDgxNDQ1XSwgWzE1NzQ3MDQ4NTIuNjgxOTIzNiwgNDc0NjgsIDEuNzYwODc3NDkwMDQzNjQwMV0sIFsxNTc0NzA0OTA0LjcyNTQ1MzEsIDQ3NjI3LCAxLjc4Mzg0MjQ0NDQxOTg2MDhdLCBbMTU3NDcwNTE2NS40MDQ1MjE1LCA0ODEzOCwgMS45MDU5NzYxNzYyNjE5MDE5XSwgWzE1NzQ3MDUyNjAuMjAzMzgyNywgNDg0MjMsIDEuNjk0NTkyNzE0MzA5NjkyNF0sIFsxNTc0NzA1MjY3LjE1NTk2MDgsIDQ4NDQ0LCAxLjczODYyODc0NTA3OTA0MDVdLCBbMTU3NDcwNTMyNC44NDMxMTQ2LCA0ODYxNywgMS44Mjc2NjkxNDM2NzY3NTc4XSwgWzE1NzQ3MDUzMzguODE2MTU0NywgNDg2NTksIDEuNjU1ODY5ODQxNTc1NjIyNl0sIFsxNTc0NzA1MzQ2LjQ2NDQ0OCwgNDg2ODIsIDEuNzQ5NDk4ODQ0MTQ2NzI4NV0sIFsxNTc0NzA1MzUyLjAwNDgyMDYsIDQ4Njk5LCAxLjk0ODQ5MzgzODMxMDI0MTddLCBbMTU3NDcwNTM5MS4zNzQ4OTA4LCA0ODgxOCwgMS45MDY3NTYyODE4NTI3MjIyXSwgWzE1NzQ3MDU1NjguMjE5OTg2MiwgNDkwNzMsIDEuNzgxNDEyNDgyMjYxNjU3N10sIFsxNTc0NzA1NTg2LjA4NDE1MzIsIDQ5MTI4LCAxLjc4OTA3Nzc1ODc4OTA2MjVdLCBbMTU3NDcwNTU5Ni4zMjU5MzA2LCA0OTE2MCwgMS44ODYzNTA4NzAxMzI0NDYzXSwgWzE1NzQ3MDU2MzEuNjE3NjQwNywgNDkyNjcsIDEuNjM2NzIzNTE4MzcxNTgyXSwgWzE1NzQ3MDU2MzcuMDczNDk2OCwgNDkyODQsIDEuODM2ODE2NjY4NTEwNDM3XSwgWzE1NzQ3MDU2NjEuNDcwMjAzOSwgNDkzNTgsIDEuOTQyNDE4NDU2MDc3NTc1N10sIFsxNTc0NzA1NjkxLjQ2MTk2MjcsIDQ5NDUwLCAxLjcxNTUyMjE3MDA2NjgzMzVdLCBbMTU3NDcwNTcxMS42MDk0ODE2LCA0OTUxMSwgMS44MDk2MDMyMTQyNjM5MTZdLCBbMTU3NDcwNTcyOC45MTk2NDE1LCA0OTU2NCwgMS42MzAyOTE0NjE5NDQ1OF0sIFsxNTc0NzA1NzkwLjA0MjE4MTcsIDQ5NzQ5LCAxLjg3Mjk4NjA3ODI2MjMyOV0sIFsxNTc0NzA1ODExLjAzNTcyNDQsIDQ5ODEyLCAyLjAxMTQxNTI0MzE0ODgwMzddLCBbMTU3NDcwNTgzOC42NzIwMTI4LCA0OTg5NSwgMS42MjQxNTc1NDc5NTA3NDQ2XSwgWzE1NzQ3MDU4NDIuOTAxMDE4MSwgNDk5MDgsIDEuODE0Mzk3NTczNDcxMDY5M10sIFsxNTc0NzA1ODU3LjE2OTY0NTUsIDQ5OTUxLCAxLjg0ODk2MTExNDg4MzQyMjldLCBbMTU3NDcwNTk3Ni45NTQzMzg4LCA1MDAzMSwgMS43Njk0MzMwMjE1NDU0MTAyXSwgWzE1NzQ3MDU5OTIuMzIyMjk3OCwgNTAwNzcsIDEuNzE3MzQ3NTAyNzA4NDM1XSwgWzE1NzQ3MDU5OTguMjQxNjA4OSwgNTAwOTUsIDEuNjA4ODI2NzU2NDc3MzU2XSwgWzE1NzQ3MDYwMTMuMDI4MjY2LCA1MDEzOSwgMS45Njc3NTIzMzc0NTU3NDk1XSwgWzE1NzQ3MDYwMTMuMzY5MDEzLCA1MDE0MCwgMS43NTYyNzc5MTg4MTU2MTI4XSwgWzE1NzQ3MDYwMjAuNDU0NzY3NSwgNTAxNjEsIDEuOTIwNzI2NDE4NDk1MTc4Ml0sIFsxNTc0NzA2MDI5LjQ4NjAyNDksIDUwMTg4LCAxLjY3Mzk0MjMyNzQ5OTM4OTZdLCBbMTU3NDcwNjA0NS4wOTMwMzksIDUwMjM1LCAxLjgxNzgyNzM0Mzk0MDczNDldLCBbMTU3NDcwNjA5Ni4zMTg2MjUyLCA1MDM5MCwgMS43OTM1OTY1MDYxMTg3NzQ0XSwgWzE1NzQ3MDYxMTQuODAwMjgwMywgNTA0NDYsIDEuNzQzMzA2NTE3NjAxMDEzMl0sIFsxNTc0NzA2MTI1LjI0ODU5MTcsIDUwNDc3LCAxLjY0MTk5NDExODY5MDQ5MDddLCBbMTU3NDcwNjE1MS44NzEwNjMyLCA1MDU1OCwgMS43MjU2MDc4NzIwMDkyNzczXSwgWzE1NzQ3MDYxNTMuNTc0NjI2MiwgNTA1NjMsIDEuNzMyMDg5NDAwMjkxNDQyOV0sIFsxNTc0NzA2MTg4LjM1MzgyMzIsIDUwNjY3LCAxLjg1OTcwNDYxMzY4NTYwOF0sIFsxNTc0NzA2MjA0LjQyNzI4ODUsIDUwNzE2LCAxLjk4MzI3NjI0Nzk3ODIxMDRdLCBbMTU3NDcwNjIyMS42OTg3NDc0LCA1MDc2OSwgMS45NDQ3NTI4MTIzODU1NTldLCBbMTU3NDcwNjI5My45NjExNDIzLCA1MDk5MSwgMS45MTcxNDQ3NzUzOTA2MjVdLCBbMTU3NDcwNjQwNy4zNTI4ODE0LCA1MTA1NSwgMS42MDA2OTY2ODI5Mjk5OTI3XSwgWzE1NzQ3MDY0MTEuMTIwNjI2NCwgNTEwNjYsIDEuNzY2NjI5MzM4MjY0NDY1M10sIFsxNTc0NzA2NDI1LjgxNzA5NywgNTExMTEsIDEuODcxMTAxNjE3ODEzMTEwNF0sIFsxNTc0NzA2NDQxLjkyNTUyMzUsIDUxMTYxLCAxLjgzNzAxNTUwOTYwNTQwNzddLCBbMTU3NDcwNjQ4NS43NTYyMTA4LCA1MTI5NywgMS44MjY1Njc1MzA2MzIwMTldLCBbMTU3NDcwNjQ5OC4wNjg4MDE2LCA1MTMzNiwgMS45MDY1Njg0MDgwMTIzOTAxXSwgWzE1NzQ3MDY1MDYuMTI0ODA5MywgNTEzNjEsIDEuNjUxNDg5ODUzODU4OTQ3OF0sIFsxNTc0NzA2NTkzLjQyODM0NjIsIDUxNjI4LCAxLjg1NzQyNjE2NjUzNDQyMzhdLCBbMTU3NDcwNjYyMi42NzIyODQ2LCA1MTcxOSwgMS43MjUzMDUwODA0MTM4MTg0XSwgWzE1NzQ3MDY2MzIuNTAwMDM1LCA1MTc1MCwgMS43NzM3ODg5Mjg5ODU1OTU3XSwgWzE1NzQ3MDY2NjYuNzQ0MDQ3LCA1MTg1NiwgMS44NDQyNzE2NTk4NTEwNzQyXSwgWzE1NzQ3MDY2ODQuNzkzNTczMSwgNTE5MTIsIDEuNjgzMTA0Mjc2NjU3MTA0NV0sIFsxNTc0NzA2OTYxLjgyMTg2MjIsIDUyNDc2LCAxLjcyNzM3OTc5ODg4OTE2MDJdLCBbMTU3NDcwNjk3Ni4zMTQyODU1LCA1MjUyMSwgMS43MTE4MzA4NTQ0MTU4OTM2XSwgWzE1NzQ3MDY5NzcuNjE3OTMxOCwgNTI1MjUsIDEuNTE3Mzg2Njc0ODgwOTgxNF0sIFsxNTc0NzA3MDAzLjEwNzMwOTgsIDUyNjAyLCAxLjc2NjU5NzUwOTM4NDE1NTNdLCBbMTU3NDcwNzA4OS45MDU1MzEsIDUyODY1LCAxLjQ0MDE2NzE4ODY0NDQwOTJdLCBbMTU3NDcwNzIzMS42OTgwMDExLCA1MzAxNCwgMS43MDkwOTgxMDA2NjIyMzE0XSwgWzE1NzQ3MDcyNTAuNjExOTIyNSwgNTMwNzEsIDEuNjQ0MjU5MDk1MTkxOTU1Nl0sIFsxNTc0NzA3MzI2LjM0MjQwNzUsIDUzMzAyLCAxLjg4ODAzODk5Mjg4MTc3NV0sIFsxNTc0NzA3MzQ4LjU0ODMxODQsIDUzMzY5LCAxLjg3ODQ1OTkzMDQxOTkyMTldLCBbMTU3NDcwNzM2Ny41MTA1MzEyLCA1MzQyOCwgMS44NTcwOTgyMjE3Nzg4Njk2XSwgWzE1NzQ3MDczNzIuMTk1MTk2LCA1MzQ0MiwgMS43NzIxMDk5ODUzNTE1NjI1XSwgWzE1NzQ3MDc0MDEuMTA2MTI3LCA1MzUzMCwgMS43NDQyNzU2ODkxMjUwNjFdLCBbMTU3NDcwNzQwOC4wMjgxMjUzLCA1MzU1MSwgMS42ODIzNjIwNzk2MjAzNjEzXSwgWzE1NzQ3MDc0MTcuNDY1ODU3MywgNTM1ODAsIDEuNzM0ODEzOTI4NjA0MTI2XSwgWzE1NzQ3MDc0NDAuOTQxMDE1NSwgNTM2NTIsIDEuODA3ODc0MDgzNTE4OTgyXSwgWzE1NzQ3MDc0NTAuNDQ0OTIzOSwgNTM2NzksIDIuMDI0Mjg2MjcwMTQxNjAxNl0sIFsxNTc0NzA3NDU1LjgwNTUzNCwgNTM2OTYsIDEuNzU4MTA1NjM1NjQzMDA1NF0sIFsxNTc0NzA3NDU3LjQ4ODExNTMsIDUzNzAxLCAxLjc0NzgyMjY0MjMyNjM1NV0sIFsxNTc0NzA3NDg3LjcyOTY3OCwgNTM3OTMsIDEuNzMzMDgzMjQ4MTM4NDI3N10sIFsxNTc0NzA3NDg5LjcxNDE3MTQsIDUzNzk5LCAxLjY3NDM2MTcwNTc4MDAyOTNdLCBbMTU3NDcwNzQ5My4zMDA4NDY4LCA1MzgxMCwgMS41ODgxMjAzNDEzMDA5NjQ0XSwgWzE1NzQ3MDc1MjEuMjc4OTM3OCwgNTM4OTUsIDEuOTgyMDc1NTcyMDEzODU1XSwgWzE1NzQ3MDc1NTEuODEzNjM1MywgNTM5ODcsIDEuNzcyNzc1NjUwMDI0NDE0XSwgWzE1NzQ3MDc2NjMuODY2NDYyNSwgNTQwNDQsIDEuODQyNDI4MzI2NjA2NzUwNV0sIFsxNTc0NzA3NzA0LjEwMTU4NCwgNTQxNjYsIDEuOTE3MTI3MTMyNDE1NzcxNV0sIFsxNTc0NzA3NzU1LjU1NjA5NzMsIDU0MzIxLCAxLjc4Nzc0NzE0NDY5OTA5NjddLCBbMTU3NDcwNzc5My4zOTg0MTU4LCA1NDQzNywgMS43MjY2NjE5MjA1NDc0ODU0XSwgWzE1NzQ3MDc3OTcuNzY2ODcsIDU0NDUwLCAxLjY0Mzk5NTI4NTAzNDE3OTddLCBbMTU3NDcwNzgxNy4zOTE4MTQ3LCA1NDUwOSwgMi4wMDQ4NjA0MDExNTM1NjQ1XSwgWzE1NzQ3MDc4MzQuMjEyNzE4MiwgNTQ1NjAsIDEuODQyMDY2NzY0ODMxNTQzXSwgWzE1NzQ3MDc5MDkuNzI2OTQxNiwgNTQ3ODksIDEuNjE4NjA4NDc0NzMxNDQ1M10sIFsxNTc0NzA3OTEzLjcxMjE4NTYsIDU0ODAxLCAxLjc5NTI0NDkzMjE3NDY4MjZdLCBbMTU3NDcwNzk0Ni42NDQ0Mjk3LCA1NDkwMiwgMS40NzA0ODg2Njc0ODgwOTgxXSwgWzE1NzQ3MDc5NTIuODcxOTksIDU0OTIxLCAxLjY2MDA5NTA5NTYzNDQ2MDRdLCBbMTU3NDcwNzk1OC41MDQ2ODIzLCA1NDkzOCwgMS45MDY0OTA1NjQzNDYzMTM1XSwgWzE1NzQ3MDc5NjQuMzgzODQ3NywgNTQ5NTYsIDEuNzY4NTc2MDI1OTYyODI5Nl0sIFsxNTc0NzA4MDgzLjIxMDIwOTYsIDU1MDM0LCAxLjMxMzExOTQxMTQ2ODUwNTldLCBbMTU3NDcwODE0OS41NTU2MDQyLCA1NTIzNiwgMS45MTcwOTY5NzI0NjU1MTUxXSwgWzE1NzQ3MDgxODUuNzAwNjQ0LCA1NTM0NSwgMS43MTA3MzAwNzU4MzYxODE2XSwgWzE1NzQ3MDgyMDYuMDYyMjU4NSwgNTU0MDcsIDEuODAzMTU4NjQwODYxNTExMl0sIFsxNTc0NzA4MjA4LjA1NzkxNiwgNTU0MTMsIDEuNTcyMjQ2Nzg5OTMyMjUxXSwgWzE1NzQ3MDgyMzQuNTM0OTA0LCA1NTQ5MywgMS42Njg1MTI3MDE5ODgyMjAyXSwgWzE1NzQ3MDgyNjQuMzEyNjc1MiwgNTU1ODQsIDEuMzgyMjgwMzQ5NzMxNDQ1M10sIFsxNTc0NzA4MzI5LjM1NzIwMSwgNTU3ODAsIDEuNjg5MzY4MjQ3OTg1ODM5OF0sIFsxNTc0NzA4MzkzLjYzNDQ1MDQsIDU1OTc1LCAyLjA2NzQ0Mzg0NzY1NjI1XSwgWzE1NzQ3MDg1MTguMzQ2MzQ2MSwgNTYwNzMsIDEuNjE5ODc1MDczNDMyOTIyNF0sIFsxNTc0NzA4NTM0LjY0ODA5MzIsIDU2MTIyLCAxLjQzNDA5MjE2NDAzOTYxMThdLCBbMTU3NDcwODU1MS4zNDExNzM2LCA1NjE3MywgMS43NTcyNzQ3NDY4OTQ4MzY0XSwgWzE1NzQ3MDg1NTYuNTk1ODU5NSwgNTYxODksIDEuNjQ2NTM0NTYyMTEwOTAwOV0sIFsxNTc0NzA4NTk1LjcwOTg2NzUsIDU2MzA2LCAxLjQ0OTE1MjExMjAwNzE0MTFdLCBbMTU3NDcwODYwMS44MDgxMDY0LCA1NjMyNCwgMS43ODIzNzE3NTk0MTQ2NzI5XSwgWzE1NzQ3MDg3MTcuNjgyNTQyOCwgNTY2NzUsIDEuNzQzMDczNDYzNDM5OTQxNF0sIFsxNTc0NzA4NzIxLjUxODA4OTUsIDU2Njg3LCAxLjY3MjY4NDE5MjY1NzQ3MDddLCBbMTU3NDcwODcyNC4xNzI2MDcsIDU2Njk1LCAxLjY4NzEyMTc0ODkyNDI1NTRdLCBbMTU3NDcwODc1OS4yOTg3ODgzLCA1NjgwMSwgMS43NjEyNDg5NDYxODk4ODA0XSwgWzE1NzQ3MDg3NjguMjMxMDQwNSwgNTY4MjgsIDEuNTg2NTY1NjEzNzQ2NjQzXSwgWzE1NzQ3MDg3ODUuMDIxNDI1LCA1Njg3OCwgMS43MTcxMDMxMjM2NjQ4NTZdLCBbMTU3NDcwODc5OS45MzkzOTg4LCA1NjkyNCwgMS43NTg0MTQwMzAwNzUwNzMyXSwgWzE1NzQ3MDg5MTkuNzgyODc4OSwgNTcwMDcsIDEuNjM5MTc3MDgzOTY5MTE2Ml0sIFsxNTc0NzA4OTY2Ljg0MDQzMTIsIDU3MTUxLCAxLjc2MzMxMzA1NTAzODQ1MjFdLCBbMTU3NDcwODk3MC4xMzMzMDIyLCA1NzE2MSwgMS45OTY3NjM0Njc3ODg2OTYzXSwgWzE1NzQ3MDkwMDAuODQ2NDM3NywgNTcyNTQsIDEuNjg4NTAzMjY1MzgwODU5NF0sIFsxNTc0NzA5MDQ4LjY4ODY1MTYsIDU3Mzk4LCAxLjkxODAyNzQwMDk3MDQ1OV0sIFsxNTc0NzA5MDkxLjgyNDE0NywgNTc1MjksIDEuNzMzODc4NDkzMzA5MDIxXSwgWzE1NzQ3MDkxNTMuNTM5MzkyNywgNTc3MTYsIDIuMDQwMzU1NjgyMzczMDQ3XSwgWzE1NzQ3MDkxNjQuNDY4NTc1NywgNTc3NDksIDEuNjY0OTUzNzA4NjQ4NjgxNl0sIFsxNTc0NzA5MTgyLjI0NjE1MiwgNTc4MDMsIDEuOTA1Nzg1MjAyOTgwMDQxNV0sIFsxNTc0NzA5MjA3LjM2ODQ3OTMsIDU3ODgwLCAxLjcxNjU1MDM1MDE4OTIwOV0sIFsxNTc0NzA5MjEyLjM5Nzc2MjMsIDU3ODk1LCAxLjY3NDcxNTA0MjExNDI1NzhdLCBbMTU3NDcwOTIyNS4wNzYzMTg3LCA1NzkzNCwgMS42MzQ5NDc4OTYwMDM3MjMxXSwgWzE1NzQ3MDkzNDcuOTYxMzg0MywgNTgwMjUsIDEuMzMyODQyMTExNTg3NTI0NF0sIFsxNTc0NzA5MzYyLjgyMDA1NDgsIDU4MDcwLCAxLjg3NDU2NjY3NDIzMjQ4M10sIFsxNTc0NzA5NDAyLjAyODA5MTIsIDU4MTg5LCAxLjc0NzcyNzk5MDE1MDQ1MTddLCBbMTU3NDcwOTQyOC44NzYzODA0LCA1ODI3MSwgMS43NzM3NzU2OTY3NTQ0NTU2XSwgWzE1NzQ3MDk0MjkuNTQ0MTc1LCA1ODI3MywgMS44MTcwNTI2MDI3Njc5NDQzXSwgWzE1NzQ3MDk0MzQuMDMyOTgwNywgNTgyODcsIDEuOTUzMTU1OTk0NDE1MjgzMl0sIFsxNTc0NzA5NDQxLjEzNjg0MTUsIDU4MzA4LCAxLjg1Mjc0ODk5MDA1ODg5OV0sIFsxNTc0NzA5NTM0LjQ1MDExNjQsIDU4NTkzLCAxLjgzMDg4ODYyODk1OTY1NThdLCBbMTU3NDcwOTU5NS4wMDM3MTM2LCA1ODc3NywgMi4yMDMzMjQwNzk1MTM1NV0sIFsxNTc0NzA5NjEzLjAxNTA1MjYsIDU4ODMxLCAxLjc3NzA4NDcwODIxMzgwNjJdLCBbMTU3NDcwOTYzMC45ODY0MTk3LCA1ODg4NiwgMS43NzM5MjIzMjQxODA2MDNdLCBbMTU3NDcwOTYzNy41NDE5MDg1LCA1ODkwNiwgMS44NTg4MTU3ODkyMjI3MTczXSwgWzE1NzQ3MDk3ODAuOTUxOTU3MiwgNTkwNTcsIDEuNzMxNzAxMDE2NDI2MDg2NF0sIFsxNTc0NzA5Nzg0LjUzNjkyOTgsIDU5MDY4LCAxLjYxODYxMDk3ODEyNjUyNTldLCBbMTU3NDcwOTgyMS4xMDQ2MDY5LCA1OTE4MCwgMS42NjAwMzMxMDY4MDM4OTRdLCBbMTU3NDcwOTgyNy42MzE0NTc2LCA1OTIwMCwgMS44MTQwMTE2OTMwMDA3OTM1XSwgWzE1NzQ3MDk4NjAuODg1MTE2OCwgNTkzMDEsIDEuOTE1Nzk3MjMzNTgxNTQzXSwgWzE1NzQ3MDk4OTUuMzczNDYyMiwgNTk0MDYsIDEuNzk4NzY5MjM1NjEwOTYyXSwgWzE1NzQ3MDk5MjIuNjY0NTU4NCwgNTk0ODksIDEuNDEyMDI4Nzg5NTIwMjYzN10sIFsxNTc0NzA5OTM2LjkzMjM5ODYsIDU5NTMyLCAxLjgxOTM0NTExNjYxNTI5NTRdLCBbMTU3NDcwOTk2MS43MjYzMTQzLCA1OTYwNywgMS44MjMyMTk4OTUzNjI4NTRdLCBbMTU3NDcxMDAzOS4xNTEzMTc2LCA1OTg0MSwgMS43MDcyMzA0NDg3MjI4Mzk0XSwgWzE1NzQ3MTAwNjAuNTMxMTI5NCwgNTk5MDYsIDEuNzY2NjkxMzI3MDk1MDMxN10sIFsxNTc0NzEwMDY5LjgwNTcxMzQsIDU5OTM0LCAxLjczNDY1OTQzMzM2NDg2ODJdLCBbMTU3NDcxMDIyNy42MDUyNDUsIDYwMTMxLCAxLjc4ODAxMTA3NDA2NjE2Ml0sIFsxNTc0NzEwMjQyLjIzNzE1MDIsIDYwMTc2LCAxLjU3NjYwMjgxNjU4MTcyNl0sIFsxNTc0NzEwMjc3LjAxNTQ4MjIsIDYwMjgyLCAxLjQyOTM2OTU2ODgyNDc2OF0sIFsxNTc0NzEwMzA2LjM5MTY5NjcsIDYwMzcxLCAxLjczNzE4MjE0MDM1MDM0MThdLCBbMTU3NDcxMDMxOC4zOTY5Njg0LCA2MDQwNywgMS43MDQyNDQwMTc2MDEwMTMyXSwgWzE1NzQ3MTAzNTUuMzI3ODU0NCwgNjA1MjAsIDEuNTY2MjA2MjE2ODEyMTMzOF0sIFsxNTc0NzEwMzY1Ljg5MjA3NywgNjA1NTIsIDEuOTA2Njg2OTAyMDQ2MjAzNl0sIFsxNTc0NzEwMzc5LjAxNzM3MDUsIDYwNTkyLCAxLjc0NDAxNDk3ODQwODgxMzVdLCBbMTU3NDcxMDYwOS41MjUwMTE1LCA2MTAxMSwgMS43MTQzMDQzMjc5NjQ3ODI3XSwgWzE1NzQ3MTA2MTguNDgyMDcwMiwgNjEwMzgsIDEuNzM2MzE2ODAwMTE3NDkyN10sIFsxNTc0NzEwNjI5LjAyNjQwNjMsIDYxMDcwLCAxLjczMTQwMDg0NzQzNDk5NzZdLCBbMTU3NDcxMDYzOS4wMjg2NCwgNjExMDAsIDEuNjIzNzYxNTM0NjkwODU3XSwgWzE1NzQ3MTA2NTUuMTUzMjQ1NCwgNjExNDksIDEuNzE0OTIwMDQzOTQ1MzEyNV0sIFsxNTc0NzEwNzEwLjY3OTc2MTIsIDYxMzE3LCAxLjg2NDUxOTU5NjA5OTg1MzVdLCBbMTU3NDcxMDg3Ni4wMTQxNTA2LCA2MTgxNiwgMS42NzczMzgzNjE3NDAxMTIzXSwgWzE1NzQ3MTA4NzcuOTU2OTUxNiwgNjE4MjIsIDEuNjk5MDE2MDk0MjA3NzYzN10sIFsxNTc0NzEwODg3LjMxNDIxNDcsIDYxODUxLCAxLjcxNzYwNzYxNzM3ODIzNDldLCBbMTU3NDcxMDkwNC4xNTc1MzY1LCA2MTkwMiwgMS41MzQ0ODUzNDAxMTg0MDgyXSwgWzE1NzQ3MTA5MTcuOTY3OTM1MywgNjE5NDQsIDEuNzM0NjQ2Nzk3MTgwMTc1OF0sIFsxNTc0NzEwOTI5LjM2NDU4NTQsIDYxOTc5LCAxLjgwNzcxNzU2MTcyMTgwMThdLCBbMTU3NDcxMTA2MS4zNDI3MzU4LCA2MjA5OCwgMS42MDQzMzk1OTk2MDkzNzVdLCBbMTU3NDcxMTA4NC44NjI0NDQsIDYyMTcwLCAxLjg3MTU1OTk3NzUzMTQzM10sIFsxNTc0NzExMTEyLjQ4NjI2NTIsIDYyMjUzLCAxLjg0OTk1MzY1MTQyODIyMjddLCBbMTU3NDcxMTExOS44NDgwMDk2LCA2MjI3NSwgMS45MDMxNDUwNzQ4NDQzNjA0XSwgWzE1NzQ3MTExMzAuNjU1ODY2LCA2MjMwNywgMS43MjI5MjQyMzI0ODI5MTAyXSwgWzE1NzQ3MTExNzkuMzM2Njg0LCA2MjQ1NSwgMS42NTAzNDM4OTQ5NTg0OTZdLCBbMTU3NDcxMTE4OC4xNjE5MjA1LCA2MjQ4MSwgMS43NTUzMDI5MDYwMzYzNzddLCBbMTU3NDcxMTIxOS4yMzM2Nzg4LCA2MjU3NiwgMS43NDUyMzgxODQ5Mjg4OTRdLCBbMTU3NDcxMTI2OC43OTM2NTA2LCA2MjcyNiwgMS41OTI5MTIxOTcxMTMwMzddLCBbMTU3NDcxMTI3OS4zMzY2NCwgNjI3NTgsIDEuODMwODE1NDM0NDU1ODcxNl0sIFsxNTc0NzExMzM4LjYxNDI5LCA2MjkzOCwgMS43NjM2OTUwMDE2MDIxNzI5XSwgWzE1NzQ3MTE0NjguODU3MzU1NiwgNjMwNTMsIDEuODY1MjU1ODMyNjcyMTE5MV0sIFsxNTc0NzExNDgwLjYwNzU5ODgsIDYzMDg5LCAxLjY2NjE5NzI5OTk1NzI3NTRdLCBbMTU3NDcxMTQ5NS43MTQ0OTA3LCA2MzEzNSwgMS4zODg4Njg0NTExMTg0NjkyXSwgWzE1NzQ3MTE0OTkuNTAyOTk3MiwgNjMxNDYsIDEuOTU5OTU2MTY5MTI4NDE4XSwgWzE1NzQ3MTE1MTYuNjE3MjA1OSwgNjMxOTgsIDEuNjQzNzgxNjYxOTg3MzA0N10sIFsxNTc0NzExNTI0LjI0NjUzNDgsIDYzMjIxLCAxLjY3OTg4NjIyMTg4NTY4MTJdLCBbMTU3NDcxMTU1NS44OTI1MDIzLCA2MzMxOCwgMS44MTg3NjA4NzE4ODcyMDddLCBbMTU3NDcxMTU3MS45MDA3OTksIDYzMzY3LCAxLjgyNDA3MjI0MTc4MzE0Ml0sIFsxNTc0NzExNjIzLjkxNzY4ODgsIDYzNTI1LCAxLjgxMTkwODg0MTEzMzExNzddLCBbMTU3NDcxMTc0NC4xMzU3MTgzLCA2Mzg5MCwgMS42NTY3NTczNTQ3MzYzMjgxXSwgWzE1NzQ3MTE3NjYuODA0NTA2MywgNjM5NTksIDEuNjc5NzM1NTQxMzQzNjg5XSwgWzE1NzQ3MTE4NzcuNjk4MjU1OCwgNjQwMTMsIDEuNjgxOTIzMTUxMDE2MjM1NF0sIFsxNTc0NzExODg3LjA0NjA2MDMsIDY0MDQxLCAxLjY0OTM5NjE4MTEwNjU2NzRdLCBbMTU3NDcxMTg4OS4wOTc0MSwgNjQwNDcsIDEuNzA2MTUzNTEyMDAxMDM3Nl0sIFsxNTc0NzEyMDIyLjYyMDUyMTgsIDY0NDUxLCAxLjY2MzA0MjQyNjEwOTMxNF0sIFsxNTc0NzEyMDkyLjk5NTc3MTIsIDY0NjY1LCAxLjU4NTMyMjQ5OTI3NTIwNzVdLCBbMTU3NDcxMjExMy44ODY3MzUsIDY0NzI4LCAxLjcxNTY3ODMzNDIzNjE0NV0sIFsxNTc0NzEyMTE3LjY0OTk3ODksIDY0NzM5LCAxLjYyNjAwNDY5NTg5MjMzNF0sIFsxNTc0NzEyMTgwLjY5OTI3MDUsIDY0OTI5LCAxLjcwODIxNjkwNTU5Mzg3Ml0sIFsxNTc0NzEyMTgzLjEyODU4MzIsIDY0OTM2LCAxLjYxNTU4Nzk0OTc1MjgwNzZdLCBbMTU3NDcxMjE4My43OTEwNjM4LCA2NDkzOCwgMS42ODM1MjUzMjM4Njc3OTc5XSwgWzE1NzQ3MTIzMzguMzkwMTk0LCA2NTEyNiwgMS42MDUyMjg2NjI0OTA4NDQ3XSwgWzE1NzQ3MTIzNDQuNDc4NjIzMiwgNjUxNDUsIDEuODExODU0MjQzMjc4NTAzNF0sIFsxNTc0NzEyMzQ1LjE2NjA3OTUsIDY1MTQ3LCAxLjgzMjA2NTIyNDY0NzUyMl0sIFsxNTc0NzEyMzc1LjczNTY0MDUsIDY1MjM5LCAxLjc4NzIzMDM3MjQyODg5NF0sIFsxNTc0NzEyNDA3LjU5MTM1OTEsIDY1MzM1LCAxLjc0NTAwMjAzMTMyNjI5NF0sIFsxNTc0NzEyNDEyLjgzMzk2OTQsIDY1MzUxLCAxLjc4NDM2OTM0OTQ3OTY3NTNdLCBbMTU3NDcxMjQyNS4yNzY3MjEsIDY1Mzg5LCAxLjc0NTI1OTQwNDE4MjQzNF0sIFsxNTc0NzEyNDQ3Ljg5ODM5MSwgNjU0NTcsIDEuNjg5MDUwNzkzNjQ3NzY2MV0sIFsxNTc0NzEyNDkzLjA2NTE1LCA2NTU5NSwgMS41NjY1MTA2NzczMzc2NDY1XSwgWzE1NzQ3MTI1MDYuOTQ0NDY3NSwgNjU2MzcsIDEuNjgxNTU5NTYyNjgzMTA1NV0sIFsxNTc0NzEyNTE4LjM1NTkzODIsIDY1NjcyLCAxLjg0NDE4MTI5OTIwOTU5NDddLCBbMTU3NDcxMjcyMS40NjQzNjQsIDY2MDA3LCAxLjIwMTQ3MzM1NTI5MzI3NF0sIFsxNTc0NzEyNzM2LjI1NTUyNSwgNjYwNTEsIDEuNzgxNDgxMDI3NjAzMTQ5NF0sIFsxNTc0NzEyODE0Ljg0MjM2MjQsIDY2Mjg5LCAxLjU2NjgxMzU4ODE0MjM5NV0sIFsxNTc0NzEyODM2LjE4OTczOTcsIDY2MzU0LCAxLjY2OTUzNTE2MDA2NDY5NzNdLCBbMTU3NDcxMjg2Ni40MjAyMDU0LCA2NjQ0NiwgMS42MzQ0NzUzNTAzNzk5NDM4XSwgWzE1NzQ3MTI4NzAuMzAyMDk0LCA2NjQ1OCwgMS42MzQwNTYyMTA1MTc4ODMzXSwgWzE1NzQ3MTI4OTUuMDgyMjQ5LCA2NjUzNCwgMS44NTI3MDk1MzE3ODQwNTc2XSwgWzE1NzQ3MTI5MDQuOTkzMzc4NCwgNjY1NjQsIDEuNzIxMzA5NjYxODY1MjM0NF0sIFsxNTc0NzEyOTA4LjI2NDU5NDMsIDY2NTc0LCAxLjQ2ODU1NjA0NjQ4NTkwMDldLCBbMTU3NDcxMjkxOC41MTM2MDYzLCA2NjYwNSwgMS42MjEzMTMzMzM1MTEzNTI1XSwgWzE1NzQ3MTI5NzQuNTkxNDMwMiwgNjY3NzYsIDEuNzc1NjQ4ODMyMzIxMTY3XSwgWzE1NzQ3MTI5OTQuOTA1MjQ1NSwgNjY4MzgsIDEuODUyMjY5NDExMDg3MDM2MV0sIFsxNTc0NzEzMDI5Ljc5NDgxMiwgNjY5NDUsIDEuNTk0OTI5ODE0MzM4Njg0XSwgWzE1NzQ3MTMxNjguMzYyODUzNSwgNjcwODMsIDEuNzMyNjU1MDQ4MzcwMzYxM10sIFsxNTc0NzEzMjEzLjU2NDQ2MSwgNjcyMjEsIDEuODA0MDQ3MzQ2MTE1MTEyM10sIFsxNTc0NzEzMjM0Ljg0NjYzODcsIDY3Mjg1LCAxLjY5MzQ5ODAxNTQwMzc0NzZdLCBbMTU3NDcxMzI5Mi44MjI2NzQzLCA2NzQ2MSwgMS42ODQ2MzM5NzAyNjA2MjAxXSwgWzE1NzQ3MTMzMjIuNTA2MDc2NiwgNjc1NTEsIDEuNTIwOTQ4MjkwODI0ODkwMV0sIFsxNTc0NzEzMzM0LjU2NzAxODUsIDY3NTg4LCAxLjUzMzUxMTc1Nzg1MDY0N10sIFsxNTc0NzEzMzc5LjE1ODMzMTIsIDY3NzIzLCAxLjU0MTI0MjM2MTA2ODcyNTZdLCBbMTU3NDcxMzM5Ny43NDYzNDIyLCA2Nzc4MCwgMS43NzY1MTA3MTU0ODQ2MTkxXSwgWzE1NzQ3MTM0NjkuNTQ3OTI1LCA2Nzk5NiwgMS42NTk2NTExNjAyNDAxNzMzXSwgWzE1NzQ3MTM0NzAuNTE3OTYyLCA2Nzk5OSwgMS43NTExMzU5NDUzMjAxMjk0XSwgWzE1NzQ3MTM1OTYuNTA1NzE0NywgNjgxMDAsIDEuNTY5Njg4NTU4NTc4NDkxMl0sIFsxNTc0NzEzNjE3LjQ0NTYwNDgsIDY4MTY0LCAxLjY4MzQ1OTI4MTkyMTM4NjddLCBbMTU3NDcxMzcwOC4xNjg1MjQzLCA2ODQzNywgMS43NjYyMDc2OTUwMDczMjQyXSwgWzE1NzQ3MTM3MTIuODUxODM2LCA2ODQ1MSwgMS42NzU5NjAzMDIzNTI5MDUzXSwgWzE1NzQ3MTM3MjMuOTU4OTEyLCA2ODQ4NiwgMS44Mzk0MjMyOTg4MzU3NTQ0XSwgWzE1NzQ3MTM3MzkuNDcyMzg2NCwgNjg1MzMsIDEuNzA4MDAzMjgyNTQ2OTk3XSwgWzE1NzQ3MTM3NDYuMTkxNDczLCA2ODU1MywgMS42Mjk2OTYyNDk5NjE4NTNdLCBbMTU3NDcxMzgyOS45MTU0NzEsIDY4ODA3LCAxLjc1OTMzMzAxNDQ4ODIyMDJdLCBbMTU3NDcxMzg0NC40ODk0NjMsIDY4ODUxLCAxLjY4Nzg2NzY0MTQ0ODk3NDZdLCBbMTU3NDcxMzg4OC44NDc5MzUsIDY4OTg1LCAxLjc1MDE2MTA1MTc1MDE4M10sIFsxNTc0NzEzOTkwLjkxNDM0NywgNjkwMTIsIDEuNTg5Njk5NjI1OTY4OTMzXSwgWzE1NzQ3MTM5OTEuMjU4Mzk1NywgNjkwMTMsIDEuODQ1NDgzNzc5OTA3MjI2Nl0sIFsxNTc0NzE0MDIxLjg5NzcyMDgsIDY5MTA2LCAxLjczNDY1NjIxNDcxNDA1MDNdLCBbMTU3NDcxNDEyMi40OTM0ODc0LCA2OTQxMiwgMS43OTQzMjIwMTM4NTQ5ODA1XSwgWzE1NzQ3MTQxMjguMDQ4MTU2MywgNjk0MjksIDEuNjUyMDI3NzI2MTczNDAwOV0sIFsxNTc0NzE0MTk2LjgwNjI0NjUsIDY5NjM5LCAxLjc0NjA4NTI4NjE0MDQ0Ml0sIFsxNTc0NzE0MjA3LjgyODM1MDgsIDY5NjczLCAxLjc2NTQxNDcxNDgxMzIzMjRdLCBbMTU3NDcxNDIyMS42NjcxNDEsIDY5NzE1LCAxLjY4MTkyOTcwNzUyNzE2MDZdLCBbMTU3NDcxNDIzMC44OTk0ODgyLCA2OTc0MywgMS44NjUxNDYyNzkzMzUwMjJdLCBbMTU3NDcxNDI5MC4zNzg3OTIzLCA2OTkyMSwgMS42MzM5MzUyMTMwODg5ODkzXSwgWzE1NzQ3MTQyOTcuNjQ3NTk3NiwgNjk5NDMsIDEuNzMwNjUwOTAxNzk0NDMzNl0sIFsxNTc0NzE0MzEzLjcxODgyMiwgNjk5OTEsIDEuODczOTI0MTM2MTYxODA0Ml0sIFsxNTc0NzE0NDExLjg2MTEzNzksIDcwMDA2LCAxLjczNjI1ODI2ODM1NjMyMzJdLCBbMTU3NDcxNDQxMy41ODU5Nzk1LCA3MDAxMSwgMS42NjMwNDY3MTc2NDM3Mzc4XSwgWzE1NzQ3MTQ0NzEuMzk2NzQ5LCA3MDE4NywgMS43ODY1MDQxNDk0MzY5NTA3XSwgWzE1NzQ3MTQ0ODUuMTcyNzM5NSwgNzAyMjksIDEuMzgwMDAzMDk0NjczMTU2N10sIFsxNTc0NzE0NTI1LjYyMzI3NjUsIDcwMzUwLCAxLjYyODc5MTQ1MTQ1NDE2MjZdLCBbMTU3NDcxNDY0NS4xNjczODAzLCA3MDcxMywgMS42MTMzNTQyMDYwODUyMDVdLCBbMTU3NDcxNDY1My4yMzQyNTI1LCA3MDczOCwgMS43NTkzMzk4MDk0MTc3MjQ2XSwgWzE1NzQ3MTQ2NjQuNjEzMDU0LCA3MDc3MiwgMS44MTI3MjExMzMyMzIxMTY3XSwgWzE1NzQ3MTQ2NjYuMzI3ODk1NCwgNzA3NzcsIDEuNzA2MjY3MzU2ODcyNTU4Nl0sIFsxNTc0NzE0ODM3LjY4MTM4OTMsIDcxMDE2LCAxLjc2NzM3ODY4Nzg1ODU4MTVdLCBbMTU3NDcxNDg0Ny44OTQ1NjI3LCA3MTA0NiwgMS42NzcxMTUzMjExNTkzNjI4XSwgWzE1NzQ3MTQ4ODUuOTg5NTI5MSwgNzExNjEsIDEuNzc4OTIzOTg4MzQyMjg1Ml0sIFsxNTc0NzE0ODkzLjc1ODcyMzcsIDcxMTg1LCAxLjU1NzA0NjI5NDIxMjM0MTNdLCBbMTU3NDcxNDkwOS4xMTQwNjU0LCA3MTIzMiwgMS44ODAyMTA4NzY0NjQ4NDM4XSwgWzE1NzQ3MTQ5NDEuODIwNDIwNSwgNzEzMzAsIDEuOTM2OTQwNzg5MjIyNzE3M10sIFsxNTc0NzE0OTUwLjc5MzE4NTUsIDcxMzU3LCAxLjc5ODk4OTA1NzU0MDg5MzZdLCBbMTU3NDcxNTAzOS4xNTEzMzgzLCA3MTYyNSwgMS43NDgxMTUzMDExMzIyMDIxXSwgWzE1NzQ3MTUwNDYuMzE1MzU2NywgNzE2NDcsIDEuOTEyNjI3Njk2OTkwOTY2OF0sIFsxNTc0NzE1MDg5LjU4NTg2MTIsIDcxNzc4LCAxLjcwMzMyMTU3NjExODQ2OTJdLCBbMTU3NDcxNTEwNy42MDg0MjcsIDcxODMyLCAxLjg3MzY2OTc0MzUzNzkwMjhdLCBbMTU3NDcxNTEyMC4zMTQ4MjY1LCA3MTg3MCwgMS42ODI2MDUyNjY1NzEwNDVdLCBbMTU3NDcxNTE1Mi41Njg3NDU0LCA3MTk2OCwgMS43NzAxMTEyMDMxOTM2NjQ2XSwgWzE1NzQ3MTUxNTMuMjY4MjYzNiwgNzE5NzAsIDEuNjk2MDM2ODE1NjQzMzEwNV0sIFsxNTc0NzE1MzEzLjYxNzM0MzIsIDcyMTc2LCAxLjkwMjE4ODg5NzEzMjg3MzVdLCBbMTU3NDcxNTMyMy4yOTM0NywgNzIyMDUsIDEuNjI1OTI4MDQ0MzE5MTUyOF0sIFsxNTc0NzE1MzMxLjk5MjUxMTcsIDcyMjMxLCAxLjgxNDM0NDc2Mzc1NTc5ODNdLCBbMTU3NDcxNTMzNS44NDE1NTk0LCA3MjI0MywgMS41MDc1NDM0NDQ2MzM0ODM5XSwgWzE1NzQ3MTUzNzkuMTEwNTUyLCA3MjM3MywgMS43ODQ1NDMxNTY2MjM4NDAzXSwgWzE1NzQ3MTUzOTMuMzMyNDExMywgNzI0MTYsIDEuNjI2Njc1MTI4OTM2NzY3Nl0sIFsxNTc0NzE1NDA3LjgwODkzNDUsIDcyNDYwLCAxLjI1MDQzMTc3NjA0Njc1M10sIFsxNTc0NzE1NDIyLjUyNjU2NywgNzI1MDQsIDEuNjUxNTc5MDIyNDA3NTMxN10sIFsxNTc0NzE1NTIxLjMwNjk1NDEsIDcyODA0LCAxLjYzMTM3NDIzOTkyMTU2OThdLCBbMTU3NDcxNTczNC4xOTIwNDI4LCA3MzE2NywgMS42NDI2MjgwNzM2OTIzMjE4XSwgWzE1NzQ3MTU3MzQuNTAxNTQ0NSwgNzMxNjgsIDEuNTc3MTc0MzA1OTE1ODMyNV0sIFsxNTc0NzE1NzM2LjExNjU0OTcsIDczMTczLCAxLjcyMDE4NTI3OTg0NjE5MTRdLCBbMTU3NDcxNTc5Mi40MzQ3MzcyLCA3MzM0NCwgMS44ODQ0Njg5MTMwNzgzMDhdLCBbMTU3NDcxNTg0My43Nzg0ODQsIDczNTAwLCAxLjcwNzAwODM2MTgxNjQwNjJdLCBbMTU3NDcxNTkzNi40NjA2NjY0LCA3Mzc4MywgMS42OTU4MTM4OTQyNzE4NTA2XSwgWzE1NzQ3MTU5NTguODkzMzkxNCwgNzM4NTEsIDEuNjgwOTY1MzA0Mzc0Njk0OF0sIFsxNTc0NzE1OTc2LjgyMTU0NTgsIDczOTA1LCAxLjgwMjQ1MjkyMTg2NzM3MDZdLCBbMTU3NDcxNjEwMy4yOTIzMTU3LCA3NDAwOCwgMS42OTQ2MzM3MjIzMDUyOTc5XSwgWzE1NzQ3MTYxMDUuODQ2NzY3NywgNzQwMTYsIDEuNjMyODgyMzU2NjQzNjc2OF0sIFsxNTc0NzE2MTIzLjEzOTQ3MzQsIDc0MDY4LCAxLjY2NzA3OTIxMDI4MTM3Ml0sIFsxNTc0NzE2MTYzLjk4Njg0ODYsIDc0MTkzLCAxLjcxOTcwMzc5MzUyNTY5NThdLCBbMTU3NDcxNjE3Mi4wOTk0NTQ5LCA3NDIxOCwgMS42NjA4NTU3NzAxMTEwODRdLCBbMTU3NDcxNjE3Mi40NDgxMjMsIDc0MjE5LCAxLjgwODc0NzE3MjM1NTY1MTldLCBbMTU3NDcxNjIxMS4zMjM3ODg0LCA3NDMzNywgMS42MDkyNzI3MTg0Mjk1NjU0XSwgWzE1NzQ3MTYyNzAuNzAzODQ4MSwgNzQ1MTcsIDEuNjg5OTY5NjU4ODUxNjIzNV0sIFsxNTc0NzE2MzIxLjczMDg4MzgsIDc0NjcyLCAxLjc5NTY2NTAyNTcxMTA1OTZdLCBbMTU3NDcxNjM3MS40NDQ4Mjk1LCA3NDgyMywgMS41NTAxODQyNDk4Nzc5Mjk3XSwgWzE1NzQ3MTY0MDEuMDgwNzA3MywgNzQ5MTMsIDEuNjYyNTQ2MTU3ODM2OTE0XSwgWzE1NzQ3MTY1MzguMDQzODM1NiwgNzUwNDcsIDEuNjA5NDQ4MTk0NTAzNzg0Ml0sIFsxNTc0NzE2NjA1LjAzMTAzNTIsIDc1MjUwLCAxLjcwMTQ4NTk5MTQ3Nzk2NjNdLCBbMTU3NDcxNjYxOS40ODgxMTcsIDc1MjkzLCAxLjY0OTkzNjkxNDQ0Mzk2OTddLCBbMTU3NDcxNjYyNS41NTY1OTcyLCA3NTMxMSwgMS43MDc3NDI2OTEwNDAwMzldLCBbMTU3NDcxNjc5OC45MDU2NDIzLCA3NTgzNiwgMS42Mjk5OTY1MzgxNjIyMzE0XSwgWzE1NzQ3MTY4MTguMTk1NzU4NiwgNzU4OTQsIDEuNTU1MjYyNDQ2NDAzNTAzNF0sIFsxNTc0NzE2OTUwLjYzMTQ2MTYsIDc2MDE0LCAxLjcyNTgxMzg2NTY2MTYyMV0sIFsxNTc0NzE3MDAzLjc0MDcwNTMsIDc2MTc2LCAxLjYyMjY0MDk2NzM2OTA3OTZdLCBbMTU3NDcxNzAwNC45OTE2NjI3LCA3NjE4MCwgMS42ODAwODA3NzE0NDYyMjhdLCBbMTU3NDcxNzAwNS43NzQ5NDc2LCA3NjE4MywgMS41NjQ0NDQxODQzMDMyODM3XSwgWzE1NzQ3MTcwMDguMDYxOTY0OCwgNzYxOTAsIDEuNjM1NjY4NzU0NTc3NjM2N10sIFsxNTc0NzE3MDE3Ljg1MDQ3MjcsIDc2MjIwLCAxLjYyNzYxNjI4NjI3Nzc3MV0sIFsxNTc0NzE3MDU5LjczOTA2OTUsIDc2MzQ3LCAxLjczMzkzNzk3ODc0NDUwNjhdLCBbMTU3NDcxNzA5NC43Mzc2Mjg1LCA3NjQ1MywgMS41MDg3NTcyMzM2MTk2OV0sIFsxNTc0NzE3MTI5Ljc2MDAwNzQsIDc2NTU5LCAxLjU4MTU2ODEyMTkxMDA5NTJdLCBbMTU3NDcxNzEzMi43ODIwNzY0LCA3NjU2OCwgMS43MzkxODY0MDYxMzU1NTldLCBbMTU3NDcxNzE1Ni44NTM2NDcsIDc2NjQxLCAxLjYxMDQ4OTI0OTIyOTQzMTJdLCBbMTU3NDcxNzE3My43OTkxNTEsIDc2NjkyLCAxLjYxMDUwOTk5MTY0NTgxM10sIFsxNTc0NzE3MTg4LjE0NzgxODgsIDc2NzM1LCAxLjcyMDA2NTU5MzcxOTQ4MjRdLCBbMTU3NDcxNzI2MS40ODU1MDk2LCA3Njk1NiwgMS42MzI5NTMwNDc3NTIzODA0XSwgWzE1NzQ3MTc0MDEuMTMyNjA2NSwgNzcwOTksIDEuNjkyODk5MzQ2MzUxNjIzNV0sIFsxNTc0NzE3NDA2LjUxNzU0OCwgNzcxMTYsIDEuNzQ1MjkzNjE3MjQ4NTM1Ml0sIFsxNTc0NzE3NDQ2Ljg5NzkwMDMsIDc3MjQwLCAxLjc5NDQxMDk0Mzk4NDk4NTRdLCBbMTU3NDcxNzQ5Mi4yNDk5NDU0LCA3NzM3NiwgMS41OTk1ODc1NTk3MDAwMTIyXSwgWzE1NzQ3MTc1MDMuNjU2MTQ4NCwgNzc0MTEsIDEuNTExMTgwOTk2ODk0ODM2NF0sIFsxNTc0NzE3NTYzLjAxOTY0MzMsIDc3NTkzLCAyLjAwMDI4MTMzMzkyMzM0XSwgWzE1NzQ3MTc2MDYuNzk4MzA2NywgNzc3MjYsIDEuNDE1MzU5MDIwMjMzMTU0M10sIFsxNTc0NzE3NjczLjk2ODI4OTEsIDc3OTMwLCAxLjcwMTQ3Mzk1MTMzOTcyMTddLCBbMTU3NDcxNzc5My4zMTQxMzM0LCA3ODAwOSwgMS42ODkzMzYwNjE0Nzc2NjExXSwgWzE1NzQ3MTc4MjQuMzMwMjQ1LCA3ODEwMywgMS43MjI3MzA2MzY1OTY2Nzk3XSwgWzE1NzQ3MTc4NDEuMDIzOTI5NCwgNzgxNTQsIDEuNTEwODg5NDEwOTcyNTk1Ml0sIFsxNTc0NzE3ODk2LjE3NzE3ODEsIDc4MzIyLCAxLjU3NTc0MjAwNjMwMTg3OTldLCBbMTU3NDcxNzkwNy43Mjc4MjU5LCA3ODM1NywgMS45MjA5MjU5NzQ4NDU4ODYyXSwgWzE1NzQ3MTc5MTQuNTY4NTg4MywgNzgzNzgsIDEuODQ0NjU1OTkwNjAwNTg2XSwgWzE1NzQ3MTc5NTAuNjUyNDEwNSwgNzg0ODksIDEuOTExNTQ3MDY0NzgxMTg5XSwgWzE1NzQ3MTgwMjYuNTY1NDM4LCA3ODcxOSwgMS40MzU2NTYwNzA3MDkyMjg1XSwgWzE1NzQ3MTgwNDQuMzY5NjY1OSwgNzg3NzIsIDEuNzEwMjAxOTc4NjgzNDcxN10sIFsxNTc0NzE4MDczLjcyNzA4OSwgNzg4NjEsIDEuNzE4NzkzODY5MDE4NTU0N10sIFsxNTc0NzE4MDc3LjUwOTg0MjksIDc4ODcyLCAxLjk0MjQ2MjA4NjY3NzU1MTNdLCBbMTU3NDcxODExMC41MzExODU0LCA3ODk3MiwgMS44Nzk5NTQwOTk2NTUxNTE0XSwgWzE1NzQ3MTgxMTYuNzEyOTM4OCwgNzg5OTEsIDEuNjU1MDM4OTUyODI3NDUzNl0sIFsxNTc0NzE4MjEzLjI1NjcxODYsIDc5MDAyLCAxLjczNzQyNjI4MDk3NTM0MThdLCBbMTU3NDcxODI1OS45MzI3NTg4LCA3OTE0NCwgMS41MjU1MjY2NDI3OTkzNzc0XSwgWzE1NzQ3MTgyODguNzQ4NjUxNywgNzkyMzEsIDEuNzI2MzQ4OTk2MTYyNDE0Nl0sIFsxNTc0NzE4MzQ2Ljg1NzE2MiwgNzk0MDksIDEuNjMzMjMyOTUxMTY0MjQ1Nl0sIFsxNTc0NzE4NDc3LjEwMTgxMywgNzk4MDQsIDEuODAwMzU2NjI2NTEwNjIwMV0sIFsxNTc0NzE4NDgzLjEwMzkxMTIsIDc5ODIyLCAxLjcyOTA1MDE1OTQ1NDM0NTddLCBbMTU3NDcxODUyMS45Nzk0OTgxLCA3OTk0MCwgMS41MjU0ODk2ODc5MTk2MTY3XSwgWzE1NzQ3MTg2MzUuOTU0MzAxNiwgODAwMDMsIDEuNjE0ODIwODM3OTc0NTQ4M10sIFsxNTc0NzE4NjUzLjQwMjkyMDIsIDgwMDU2LCAxLjQ4NDA2MTU5ODc3Nzc3MV0sIFsxNTc0NzE4NjgyLjE4NzkyNzUsIDgwMTQ0LCAxLjYyMzc1MjgzMjQxMjcxOTddLCBbMTU3NDcxODczMy4wOTM5MTI2LCA4MDI5OCwgMS42OTUxMDM4ODM3NDMyODYxXSwgWzE1NzQ3MTg3NjAuOTU0MTUwMiwgODAzODIsIDEuNTc4NzQ0NTMwNjc3Nzk1NF0sIFsxNTc0NzE4Nzg2LjE1MjE0OTQsIDgwNDU4LCAxLjcwMzM4NTExNDY2OTc5OThdLCBbMTU3NDcxODg4OS43ODQ5NjM4LCA4MDc3MCwgMS43NzY2MTI0MDEwMDg2MDZdLCBbMTU3NDcxODg5NS40Njg3Njg2LCA4MDc4NywgMS41ODc1NTkxMDM5NjU3NTkzXSwgWzE1NzQ3MTg5MDkuMTQxOTc5LCA4MDgyOCwgMS4yNzg1MTcyNDYyNDYzMzhdLCBbMTU3NDcxODkzMi45MDU3ODQsIDgwODk5LCAxLjUxMjg1NjAwNjYyMjMxNDVdLCBbMTU3NDcxOTA3NC40NjI1OTY3LCA4MTA0NiwgMS42NDk2NDIxMDk4NzA5MTA2XSwgWzE1NzQ3MTkwOTkuMjUwNzM0LCA4MTEyMSwgMS45MzMyMjE5MzYyMjU4OTExXSwgWzE1NzQ3MTkxNzguNzgxMTYyMywgODEzNjIsIDEuNzc4NTczNzUxNDQ5NTg1XSwgWzE1NzQ3MTkxODAuMDg0NTE4NywgODEzNjYsIDEuODMwODkyMDg2MDI5MDUyN10sIFsxNTc0NzE5MjExLjU3Mzc0OTMsIDgxNDYxLCAxLjcxNjMxMzgzODk1ODc0MDJdLCBbMTU3NDcxOTIyNy43ODU4OTA2LCA4MTUxMCwgMS40MTAyNTc5MzU1MjM5ODY4XSwgWzE1NzQ3MTkyNzEuODI2NjAyNywgODE2NDQsIDEuNzc4MTkyNjM5MzUwODkxMV0sIFsxNTc0NzE5Mjg4LjU4OTIxMSwgODE2OTUsIDEuNjY4MDU5MjI5ODUwNzY5XSwgWzE1NzQ3MTkzNDAuNzM4OTg4NCwgODE4NTIsIDEuNDI2OTM4NjUyOTkyMjQ4NV0sIFsxNTc0NzE5MzU5LjI4MTEyMiwgODE5MDgsIDEuNzkxMTQxMjcxNTkxMTg2NV0sIFsxNTc0NzE5NjA3LjgxMDM5MjEsIDgyMzgxLCAxLjgwNTU2NTIzNzk5ODk2MjRdLCBbMTU3NDcxOTYzNy44MDI5MDIsIDgyNDcyLCAxLjUwNDM4Mjk2Nzk0ODkxMzZdLCBbMTU3NDcxOTY0My45NDg4Njk3LCA4MjQ5MSwgMS42ODI1NjA5MjA3MTUzMzJdLCBbMTU3NDcxOTY4OS45MTQ4MzM1LCA4MjYzMCwgMS41MDUyODM0NzQ5MjIxODAyXSwgWzE1NzQ3MTk2OTkuNzYxMTE1LCA4MjY2MCwgMS42ODg5OTEwNjk3OTM3MDEyXSwgWzE1NzQ3MTk3MTIuOTEwNjg5NiwgODI3MDAsIDEuNTAwMTEyNjUyNzc4NjI1NV0sIFsxNTc0NzE5NzY2LjA5MjYyNjYsIDgyODYyLCAxLjYxNjIxNTgyNTA4MDg3MTZdLCBbMTU3NDcxOTc2Ny40MjE0NTMyLCA4Mjg2NiwgMS42Mjc2NDI4Njk5NDkzNDA4XSwgWzE1NzQ3MTk5MDQuNjM2MTg3MywgODMwMDEsIDEuMzIxNDEwNjU1OTc1MzQxOF0sIFsxNTc0NzIwMDE5LjkzMzU0NywgODMzNTEsIDEuNTc4NDEwNjI1NDU3NzYzN10sIFsxNTc0NzIwMDMxLjczODgzOTYsIDgzMzg4LCAxLjUwMTEyMDY4NjUzMTA2N10sIFsxNTc0NzIwMDYzLjY4NDU3LCA4MzQ4NSwgMS40NjAwMDYyMzcwMzAwMjkzXSwgWzE1NzQ3MjAwODEuMTgxNTYyLCA4MzUzOSwgMS42MzIzNjEyOTI4MzkwNTAzXSwgWzE1NzQ3MjAwOTQuOTA1OTY5OSwgODM1ODEsIDEuNjU5MzYzNTA4MjI0NDg3M10sIFsxNTc0NzIwMDk3LjU4OTg0NTcsIDgzNTg5LCAxLjU1Njg5OTMwOTE1ODMyNTJdLCBbMTU3NDcyMDA5OS41OTA5OTk4LCA4MzU5NSwgMS40Mzk0OTgxODYxMTE0NTAyXSwgWzE1NzQ3MjAxMTEuNTU4MTExLCA4MzYzMSwgMS42Nzc5NTE4MTI3NDQxNDA2XSwgWzE1NzQ3MjAxMTIuODc4ODU2MiwgODM2MzUsIDEuNzI5MTM5OTI0MDQ5Mzc3NF0sIFsxNTc0NzIwMTIxLjE5NTQxOSwgODM2NjAsIDEuNTU3ODY1MTQyODIyMjY1Nl0sIFsxNTc0NzIwMTM1LjkzODUzNzEsIDgzNzA1LCAxLjY1NjI2NzY0Mjk3NDg1MzVdLCBbMTU3NDcyMDEzOC43MjEzNTM4LCA4MzcxMywgMS44MTIyMTAyMDIyMTcxMDJdLCBbMTU3NDcyMDE2Mi4wODM0OTE4LCA4Mzc4NCwgMS42MTA2ODU1ODY5MjkzMjEzXSwgWzE1NzQ3MjAxNjYuMTY1NjAxNywgODM3OTYsIDEuNDU5OTY5MDQzNzMxNjg5NV0sIFsxNTc0NzIwMTczLjI1NTg0NSwgODM4MTcsIDEuNjU4NzA4OTMwMDE1NTY0XSwgWzE1NzQ3MjAzNDYuNDY4MTkwMiwgODQwNTgsIDEuNTgxMDA4NDM0Mjk1NjU0M10sIFsxNTc0NzIwMzQ3LjA4MDI4MzksIDg0MDYwLCAxLjM1MjU3NTU0MDU0MjYwMjVdLCBbMTU3NDcyMDM4MS42OTA3NTgsIDg0MTY1LCAxLjU0OTE4OTIwOTkzODA0OTNdLCBbMTU3NDcyMDQxMC45MjM5NjE5LCA4NDI1NCwgMS43NDY3MTg1MjU4ODY1MzU2XSwgWzE1NzQ3MjA0MTYuMzEzNjgyOCwgODQyNzAsIDEuNzA3MDMzOTkxODEzNjU5N10sIFsxNTc0NzIwNDQ0LjYxMDc3MTIsIDg0MzU1LCAxLjU3MDAxOTk2MDQwMzQ0MjRdLCBbMTU3NDcyMDU5NS4xNzI1OTk2LCA4NDgxMSwgMS42NDM0MTMxODYwNzMzMDMyXSwgWzE1NzQ3MjA2MDEuNDAxNDY3MywgODQ4MzAsIDEuNDg5ODMzNzEyNTc3ODE5OF0sIFsxNTc0NzIwNzcxLjcyNzY4MjgsIDg1MDYxLCAxLjY4MDQzNzA4ODAxMjY5NTNdLCBbMTU3NDcyMDc4OS44Mzg2NjYsIDg1MTE2LCAxLjY4ODEwMjcyMjE2Nzk2ODhdLCBbMTU3NDcyMDkyNi4wNDM4NTA0LCA4NTUyOSwgMS42NDA2MDA0NDI4ODYzNTI1XSwgWzE1NzQ3MjEwMzcuODgzNDUwNSwgODU4NjQsIDEuNzQxOTcxMjU0MzQ4NzU0OV0sIFsxNTc0NzIxMDYyLjk5NDkxMywgODU5NDAsIDEuNjE1MjU1NTk0MjUzNTRdLCBbMTU3NDcyMTE4MS44ODA1MTUsIDg2MDE0LCAxLjUwNDQxMjQxMjY0MzQzMjZdLCBbMTU3NDcyMTE5NC41MjM1MzQ1LCA4NjA1MiwgMS42NTI1MDE5NDA3MjcyMzM5XSwgWzE1NzQ3MjEyMDcuMTc2OTk0LCA4NjA5MCwgMS43MjYzNDE2MDUxODY0NjI0XSwgWzE1NzQ3MjEyMTEuOTQwNjIxOSwgODYxMDUsIDEuNjc5NjU5MTI4MTg5MDg3XSwgWzE1NzQ3MjEyMTkuNjMwNjU4NCwgODYxMjgsIDEuNzQ4MDM0NTk2NDQzMTc2M10sIFsxNTc0NzIxMjIyLjg2MjE2MjYsIDg2MTM4LCAxLjYwNDU4OTgxOTkwODE0Ml0sIFsxNTc0NzIxMjM5Ljc0MjY5MDgsIDg2MTg5LCAxLjc2MzczNjg0NDA2MjgwNTJdLCBbMTU3NDcyMTMwMy41NjUzODIsIDg2MzgyLCAxLjU0NDQyODU4Njk1OTgzODldLCBbMTU3NDcyMTMwOS45Mjc0OTY0LCA4NjQwMSwgMS43NjgxODUwMTk0OTMxMDNdLCBbMTU3NDcyMTM4NS4yMDgxNTQ0LCA4NjYyOSwgMS42MTE0MTU5ODIyNDYzOTldLCBbMTU3NDcyMTM5NC44ODkzMTA4LCA4NjY1OSwgMS41OTgxMDIwOTI3NDI5Ml0sIFsxNTc0NzIxNDM1Ljg2NDU2NTgsIDg2NzgzLCAxLjQzMDk4OTE0NjIzMjYwNV0sIFsxNTc0NzIxNDM4LjU4NTU4NDQsIDg2NzkxLCAxLjgwMTQ1ODgzNTYwMTgwNjZdLCBbMTU3NDcyMTQ2MC4zMDY5MjI3LCA4Njg1NywgMS4zNDY3MzExODU5MTMwODZdLCBbMTU3NDcyMTYwOS40NjM0NTAyLCA4NzAyMywgMS42OTY3MDE4ODQyNjk3MTQ0XSwgWzE1NzQ3MjE2MzkuNTUwNDE5LCA4NzExNCwgMS41NDk1Njk3MjU5OTAyOTU0XSwgWzE1NzQ3MjE2NjEuMTA2OTIyMSwgODcxNzksIDEuNTU5MjQ3NDkzNzQzODk2NV0sIFsxNTc0NzIxNjcxLjE5MjM0MjMsIDg3MjA5LCAxLjcxMjIxMDI5NzU4NDUzMzddLCBbMTU3NDcyMTY5Mi45NTQzNzMsIDg3Mjc1LCAxLjU4OTUyODIwMzAxMDU1OV0sIFsxNTc0NzIxNzIyLjgzOTY4MjYsIDg3MzY1LCAxLjU4NzM1NTg1MjEyNzA3NTJdLCBbMTU3NDcyMTgwNy43MTcwMTQ2LCA4NzYyMiwgMS41ODMyNDIwNTg3NTM5NjczXSwgWzE1NzQ3MjE4MTcuMDg2ODQwMiwgODc2NTEsIDEuOTQ0ODQ3ODIyMTg5MzMxXSwgWzE1NzQ3MjE4OTkuNzgwODUxLCA4NzkwMCwgMS4zNTA1MTMzMzkwNDI2NjM2XSwgWzE1NzQ3MjE5MDguMjcxMjkwOCwgODc5MjYsIDEuNjcyMjU1NjM1MjYxNTM1Nl0sIFsxNTc0NzIxOTA4Ljk0MDY1NTcsIDg3OTI4LCAxLjU4OTE0MzE1NzAwNTMxXSwgWzE1NzQ3MjE5MTguMTc5NDEzOCwgODc5NTYsIDEuNTU1NzIzNDI4NzI2MTk2M10sIFsxNTc0NzIyMDUwLjc3MTUyMDEsIDg4MDczLCAxLjU0MTcxNDU0OTA2NDYzNjJdLCBbMTU3NDcyMjExOC45ODMzMjM2LCA4ODI3OSwgMS42NTMxNzYwNjkyNTk2NDM2XSwgWzE1NzQ3MjIxOTAuMDUxMzc4NSwgODg0OTQsIDEuNjQ2MjU4MzU0MTg3MDExN10sIFsxNTc0NzIyMjk3LjEzOTQ2MzQsIDg4ODE3LCAxLjU3MTMwMjg5MDc3NzU4OF0sIFsxNTc0NzIyMzE3Ljk4NTY0ODksIDg4ODgwLCAxLjg0ODUxNzQxNzkwNzcxNDhdLCBbMTU3NDcyMjMyMy4yMjE1MDA2LCA4ODg5NiwgMS43MzMzODYzOTczNjE3NTU0XSwgWzE1NzQ3MjIzMzEuOTU5MDYxOSwgODg5MjIsIDEuODI1NTYzMzExNTc2ODQzM10sIFsxNTc0NzIyNDkwLjM1MzU1MSwgODkxMTUsIDEuODMxNTYyMDQyMjM2MzI4MV0sIFsxNTc0NzIyNDk2LjkxMDMyMzQsIDg5MTM1LCAxLjUxMTY1NDg1MzgyMDgwMDhdLCBbMTU3NDcyMjUxOS42MDYwMTM1LCA4OTIwMywgMS41NDAzMzUyOTc1ODQ1MzM3XSwgWzE1NzQ3MjI1NzMuMDUyMDkzLCA4OTM2NSwgMS42Nzg4NDYzNTkyNTI5Mjk3XSwgWzE1NzQ3MjI1ODIuMjMzNDIxOCwgODkzOTMsIDEuNjg2ODcwMzM2NTMyNTkyOF0sIFsxNTc0NzIyNTkwLjczNDcxNzgsIDg5NDE5LCAxLjU4Mzk1ODM4NzM3NDg3OF0sIFsxNTc0NzIyNTk0LjU1NDMxOTQsIDg5NDMxLCAxLjU4MTgxMTc4NTY5NzkzN10sIFsxNTc0NzIyNjA4LjU2NjQ0MjcsIDg5NDczLCAxLjc0NjUxMTY5Nzc2OTE2NV0sIFsxNTc0NzIyNjEzLjE1OTI4NTMsIDg5NDg3LCAxLjY4MDEzMjE1MDY1MDAyNDRdLCBbMTU3NDcyMjYxMy44MTg3MzM1LCA4OTQ4OSwgMS42ODY0MjQ2MTI5OTg5NjI0XSwgWzE1NzQ3MjI3MjAuNTI0MTY4NSwgODk4MTEsIDEuNTQ5NDkzOTA4ODgyMTQxMV0sIFsxNTc0NzIyODg3Ljc3OTU5MzUsIDkwMDM1LCAxLjUwOTIxMjAxNzA1OTMyNjJdLCBbMTU3NDcyMzAyNC41MTQ5NTg2LCA5MDQ1MCwgMS4zMDI1MTkzMjE0NDE2NTA0XSwgWzE1NzQ3MjMwMzUuMjIxMTMxLCA5MDQ4MywgMS41OTY4MTcwMTY2MDE1NjI1XSwgWzE1NzQ3MjMwOTAuODUyMTc4LCA5MDY1MSwgMS43MDAyNTk4MDQ3MjU2NDddLCBbMTU3NDcyMzEwNi4xODMxNjIsIDkwNjk4LCAxLjU3Mzc3MTM1NzUzNjMxNl0sIFsxNTc0NzIzMTIzLjY5Nzc4MDQsIDkwNzUxLCAxLjcwMDg4NzIwMzIxNjU1MjddLCBbMTU3NDcyMzE5NS40NDU0ODQ5LCA5MDk2NywgMS42Mjk3MTMwNTg0NzE2Nzk3XSwgWzE1NzQ3MjMyMDAuMzQ4NDY1MiwgOTA5ODIsIDEuNjQxMzcxMDExNzM0MDA4OF0sIFsxNTc0NzIzMjA1LjcwOTI3LCA5MDk5OCwgMS42NDcwMDQ4NDI3NTgxNzg3XSwgWzE1NzQ3MjMzMTIuMjEwMDk2OCwgOTEwMzYsIDEuNTYxMTk0MTgxNDQyMjYwN10sIFsxNTc0NzIzMzQwLjA2MDEzOCwgOTExMjEsIDEuNTg3OTcxOTI1NzM1NDczNl0sIFsxNTc0NzIzNDYwLjYyNDU4NCwgOTE0ODMsIDEuNjc5NzcyNDk2MjIzNDQ5N10sIFsxNTc0NzIzNDk0LjQ2NjY5NzcsIDkxNTg2LCAxLjc5MTM4MTU5NzUxODkyMV0sIFsxNTc0NzIzNTE2Ljc4OTkwMzQsIDkxNjU0LCAxLjY4NDc2NDM4NTIyMzM4ODddLCBbMTU3NDcyMzU1Ni4xODM5NzgsIDkxNzczLCAxLjUxMTI5NTA4MDE4NDkzNjVdLCBbMTU3NDcyMzU2Mi4yMDcxNTkzLCA5MTc5MSwgMS41NDcyNzUzMDQ3OTQzMTE1XSwgWzE1NzQ3MjM2MjIuNDk0OTYwMywgOTE5NzYsIDEuNTQ5MTU1MzU0NDk5ODE3XSwgWzE1NzQ3MjM2MjkuNDQ4OTA2LCA5MTk5NywgMS44Mjg4MTg2Nzg4NTU4OTZdLCBbMTU3NDcyMzczMS45ODcyMDM4LCA5MjAyNCwgMS41NjA1MTM3MzQ4MTc1MDQ5XSwgWzE1NzQ3MjM3ODIuMTYzMDY0NSwgOTIxNzYsIDEuNTcwMzk5NzYxMTk5OTUxMl0sIFsxNTc0NzIzODEyLjU5MzQ4MzcsIDkyMjY5LCAxLjY2ODU0MjUwNDMxMDYwOF0sIFsxNTc0NzIzODI0LjYwNTI5OSwgOTIzMDYsIDEuNTA5OTExMTc5NTQyNTQxNV0sIFsxNTc0NzIzODI5LjIxNjcxMjIsIDkyMzIwLCAxLjU3NjE5NjY3MDUzMjIyNjZdLCBbMTU3NDcyMzg4OS4wMzA0NTY4LCA5MjUwMiwgMS42OTM5NzM0MjIwNTA0NzZdLCBbMTU3NDcyMzkwMS4yMTQ3MjE3LCA5MjUzOSwgMS42Nzg5Nzg5MTk5ODI5MTAyXSwgWzE1NzQ3MjM5MTguOTIxNjc2OSwgOTI1OTIsIDEuNjkzNTY1NzI2MjgwMjEyNF0sIFsxNTc0NzIzOTcyLjc1NzEzMjUsIDkyNzU1LCAxLjMyMzY4MjQyNzQwNjMxMV0sIFsxNTc0NzI0MDIwLjM4MTM0MiwgOTI4OTgsIDEuNTE0MDkwNDE4ODE1NjEyOF0sIFsxNTc0NzI0MDUzLjk4MTM1NjksIDkzMDAwLCAxLjYwMTkxNDA0ODE5NDg4NTNdXQ==", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "OK" }, "http://localhost:6006/data/plugin/scalars/scalars?tag=valid%2Fvalid_score&run=.&experiment=": { "data": "W1sxNTc0Njg1MjU1LjU3NDQxNiwgMTAwMCwgMS4yMzc2OTAzMjk1NTE2OTY4XSwgWzE1NzQ2ODU2NzguMjUwNjQzLCAyMDAwLCAyLjgyMTI1ODMwNjUwMzI5Nl0sIFsxNTc0Njg2MDk5Ljg4Nzk4NTcsIDMwMDAsIDMuNjc4MjQ3MjEzMzYzNjQ3NV0sIFsxNTc0Njg2NTIyLjAwODkxLCA0MDAwLCA1LjI1ODM5OTk2MzM3ODkwNl0sIFsxNTc0Njg2OTQzLjYxNDcyOSwgNTAwMCwgNy4wNTIxMTAxOTUxNTk5MTJdLCBbMTU3NDY4NzM2Ni44NjQ2MDEsIDYwMDAsIDcuNzIzNTcwODIzNjY5NDM0XSwgWzE1NzQ2ODc3ODkuOTUxNzQ4NiwgNzAwMCwgOC4zMDM5Nzk4NzM2NTcyMjddLCBbMTU3NDY4ODIxMC43ODQ3OTEsIDgwMDAsIDguNjM2NzMyMTAxNDQwNDNdLCBbMTU3NDY4ODYzMC45MzE0OTc2LCA5MDAwLCA5LjQzMDUzNTMxNjQ2NzI4NV0sIFsxNTc0Njg5MDUzLjQ2NDE3NjIsIDEwMDAwLCAxMC4wNjgyMDI5NzI0MTIxMV0sIFsxNTc0Njg5NDc2LjI5MDc4NjUsIDExMDAwLCAxMC42NzgwNTg2MjQyNjc1NzhdLCBbMTU3NDY4OTg5OC41NjM0ODM1LCAxMjAwMCwgMTEuMjk5OTk4MjgzMzg2MjNdLCBbMTU3NDY5MDMyMi4yMTI2NDA4LCAxMzAwMCwgMTEuMTU0MzYzNjMyMjAyMTQ4XSwgWzE1NzQ2OTA3NDMuNjk4NzQxNCwgMTQwMDAsIDExLjUwMjk2MDIwNTA3ODEyNV0sIFsxNTc0NjkxMTY2LjU4NTY5MDcsIDE1MDAwLCAxMi4xMDk2MjI5NTUzMjIyNjZdLCBbMTU3NDY5MTU4Ny44NjM0MTk1LCAxNjAwMCwgMTIuODM5NjcwMTgxMjc0NDE0XSwgWzE1NzQ2OTIwMTEuNTIzNzk0MiwgMTcwMDAsIDEyLjgzMzEwNjk5NDYyODkwNl0sIFsxNTc0NjkyNDM0LjM2NTA5MjUsIDE4MDAwLCAxMy40ODQ1NDY2NjEzNzY5NTNdLCBbMTU3NDY5Mjg1Ny4zNjA0NDcyLCAxOTAwMCwgMTMuMzYxOTMxODAwODQyMjg1XSwgWzE1NzQ2OTMyODMuOTM0NDY2NCwgMjAwMDAsIDEzLjU3NzYzNTc2NTA3NTY4NF0sIFsxNTc0NjkzNzA5LjEzNjE1NzgsIDIxMDAwLCAxMy43NzgwNjQ3Mjc3ODMyMDNdLCBbMTU3NDY5NDEzNC42NjczMTE0LCAyMjAwMCwgMTQuNjI1MDg2Nzg0MzYyNzkzXSwgWzE1NzQ2OTQ1NTkuOTQxNDM4LCAyMzAwMCwgMTQuNjgxMDM1OTk1NDgzMzk4XSwgWzE1NzQ2OTQ5ODMuODgzNDU3MiwgMjQwMDAsIDE1LjIwMTIzNjcyNDg1MzUxNl0sIFsxNTc0Njk1NDA4LjA3MjYxNjgsIDI1MDAwLCAxNC43MTYxNTYwMDU4NTkzNzVdLCBbMTU3NDY5NTgzMC41NjgwNjQyLCAyNjAwMCwgMTUuMzkwMjU2ODgxNzEzODY3XSwgWzE1NzQ2OTYyNTIuNjU0NDYwMiwgMjcwMDAsIDE1LjMzNzU0ODI1NTkyMDQxXSwgWzE1NzQ2OTY2NzUuNzM1NzUzNSwgMjgwMDAsIDE1LjU3NTQwMDM1MjQ3ODAyN10sIFsxNTc0Njk3MDk5LjkyMzQ4LCAyOTAwMCwgMTUuNDQ2Mjc5NTI1NzU2ODM2XSwgWzE1NzQ2OTc1MjIuNjA3NjM1NSwgMzAwMDAsIDE1LjQyNjA3NDk4MTY4OTQ1M10sIFsxNTc0Njk3OTQ2Ljk4NDQyMSwgMzEwMDAsIDE1LjU4NzcwMDg0MzgxMTAzNV0sIFsxNTc0Njk4MzY4LjIxMTg3NDIsIDMyMDAwLCAxNS44NTY1MjYzNzQ4MTY4OTVdLCBbMTU3NDY5ODc4OS43MzM0MDczLCAzMzAwMCwgMTYuNTM4NDk5ODMyMTUzMzJdLCBbMTU3NDY5OTIxMS4yNDY0MzU0LCAzNDAwMCwgMTYuMzI5MTA3Mjg0NTQ1OV0sIFsxNTc0Njk5NjMyLjEzODg3MjksIDM1MDAwLCAxNi45MDk2NzU1OTgxNDQ1M10sIFsxNTc0NzAwMDU1LjYwNjcwOTcsIDM2MDAwLCAxNi42MzEwOTk3MDA5Mjc3MzRdLCBbMTU3NDcwMDQ3OC43NzE2OTg1LCAzNzAwMCwgMTYuMDEyMzI1Mjg2ODY1MjM0XSwgWzE1NzQ3MDA5MDEuNTY5ODIzMywgMzgwMDAsIDE3LjA3NzA0MzUzMzMyNTE5NV0sIFsxNTc0NzAxMzI0LjQ5NDY0MDQsIDM5MDAwLCAxNi43NjU3Nzc1ODc4OTA2MjVdLCBbMTU3NDcwMTc0Ni40ODE4NDc4LCA0MDAwMCwgMTYuOTMzOTc1MjE5NzI2NTYyXSwgWzE1NzQ3MDIxNjcuODQwMDY0MywgNDEwMDAsIDE2Ljc3MDQ2MjAzNjEzMjgxMl0sIFsxNTc0NzAyNTg5LjM4MDg1ODQsIDQyMDAwLCAxNi45MzE2OTAyMTYwNjQ0NTNdLCBbMTU3NDcwMzAxMS45NDYwMjE4LCA0MzAwMCwgMTcuMjgyNDAwMTMxMjI1NTg2XSwgWzE1NzQ3MDM0MzQuMDIxOTcwNSwgNDQwMDAsIDE3LjE2NTY2NjU4MDIwMDE5NV0sIFsxNTc0NzAzODU2LjA5NjUzNjQsIDQ1MDAwLCAxNy4yNzA5NDg0MTAwMzQxOF0sIFsxNTc0NzA0Mjc4LjI0NzEzNzMsIDQ2MDAwLCAxNy4xODU3NzE5NDIxMzg2NzJdLCBbMTU3NDcwNDY5OC4zNDgyMDE1LCA0NzAwMCwgMTcuMjU5Nzg0Njk4NDg2MzI4XSwgWzE1NzQ3MDUxMjAuMzAzNDY4NywgNDgwMDAsIDE3LjUzNzYxNDgyMjM4NzY5NV0sIFsxNTc0NzA1NTQ0LjAwNTExMDMsIDQ5MDAwLCAxNy41NzMwNTkwODIwMzEyNV0sIFsxNTc0NzA1OTY2LjMzNzA4MTQsIDUwMDAwLCAxNy41ODM1NDM3Nzc0NjU4Ml0sIFsxNTc0NzA2Mzg5LjYxNTc5NTEsIDUxMDAwLCAxNy42OTYzMTAwNDMzMzQ5Nl0sIFsxNTc0NzA2ODA2LjA2NDU2MTgsIDUyMDAwLCAxNy40NTI0NTM2MTMyODEyNV0sIFsxNTc0NzA3MjI3LjA5MTE0OTMsIDUzMDAwLCAxNy42MTIzNTIzNzEyMTU4Ml0sIFsxNTc0NzA3NjQ5LjAxMjMyMTUsIDU0MDAwLCAxNy41MjMyNjU4Mzg2MjMwNDddLCBbMTU3NDcwODA3MS42OTU3MTQ3LCA1NTAwMCwgMTcuNTc4ODg2MDMyMTA0NDkyXSwgWzE1NzQ3MDg0OTQuNDI0NjUwNywgNTYwMDAsIDE3LjY5MDE4NTU0Njg3NV0sIFsxNTc0NzA4OTE3LjM3Mzg3MTYsIDU3MDAwLCAxNy45ODc4NjU0NDc5OTgwNDddLCBbMTU3NDcwOTMzOS42NzUxNTg1LCA1ODAwMCwgMTcuNDcxMjM1Mjc1MjY4NTU1XSwgWzE1NzQ3MDk3NjEuNDQyNjg3MywgNTkwMDAsIDE3LjkyOTUxMjAyMzkyNTc4XSwgWzE1NzQ3MTAxODQuNTc2MTkxLCA2MDAwMCwgMTcuODk5NjQ2NzU5MDMzMjAzXSwgWzE1NzQ3MTA2MDUuNDc2MDE1OCwgNjEwMDAsIDE4LjE4ODUxMjgwMjEyNDAyM10sIFsxNTc0NzExMDI5LjA4Njk3NjgsIDYyMDAwLCAxOC4zNzQ1MzA3OTIyMzYzMjhdLCBbMTU3NDcxMTQ1MS41NTQxMzE3LCA2MzAwMCwgMTguMjg1ODczNDEzMDg1OTM4XSwgWzE1NzQ3MTE4NzMuMjI0NDQzNywgNjQwMDAsIDE4LjIzMTMyODk2NDIzMzRdLCBbMTU3NDcxMjI5Ni44NjMzMjM3LCA2NTAwMCwgMTguMDE0MjY4ODc1MTIyMDddLCBbMTU3NDcxMjcxOS4xMzg4MjkyLCA2NjAwMCwgMTcuOTgzMjAxOTgwNTkwODJdLCBbMTU3NDcxMzE0MC42MzE4MDksIDY3MDAwLCAxOC4xMzE2Njk5OTgxNjg5NDVdLCBbMTU3NDcxMzU2My40NzU5NDQsIDY4MDAwLCAxOC4yNTQ3MjY0MDk5MTIxMV0sIFsxNTc0NzEzOTg2LjYwMDExMDUsIDY5MDAwLCAxOC4zNzUyOTU2MzkwMzgwODZdLCBbMTU3NDcxNDQwOS41NzA5NzIsIDcwMDAwLCAxOC40NDYzMTk1ODAwNzgxMjVdLCBbMTU3NDcxNDgzMi4yMTE3NzY3LCA3MTAwMCwgMTguNzE1MjA4MDUzNTg4ODY3XSwgWzE1NzQ3MTUyNTYuMDA1NzIwOSwgNzIwMDAsIDE4LjM3MDc4MDk0NDgyNDIyXSwgWzE1NzQ3MTU2NzkuMDA4MDI5MiwgNzMwMDAsIDE4LjI4MDUzMjgzNjkxNDA2Ml0sIFsxNTc0NzE2MTAwLjYwMzQwNDMsIDc0MDAwLCAxOC4yMDEyMTc2NTEzNjcxODhdLCBbMTU3NDcxNjUyMi40MDkzMDk0LCA3NTAwMCwgMTguMDQzOTM5NTkwNDU0MV0sIFsxNTc0NzE2OTQ2LjE2MDYxODUsIDc2MDAwLCAxOC40ODAwMTI4OTM2NzY3NThdLCBbMTU3NDcxNzM2OC41NjY0NDIzLCA3NzAwMCwgMTguNTM3MTA5Mzc1XSwgWzE1NzQ3MTc3OTAuMzA1MTcyMiwgNzgwMDAsIDE4LjU3MTEzODM4MTk1ODAwOF0sIFsxNTc0NzE4MjEyLjU2MzUwNzgsIDc5MDAwLCAxOC41OTA3MzI1NzQ0NjI4OV0sIFsxNTc0NzE4NjM0LjU5MDMwNTYsIDgwMDAwLCAxOC44MDY4NzE0MTQxODQ1N10sIFsxNTc0NzE5MDU4Ljk3NjcxOTYsIDgxMDAwLCAxOC43MjAzODI2OTA0Mjk2ODhdLCBbMTU3NDcxOTQ4Mi4zNjM3NjM2LCA4MjAwMCwgMTguOTgyMzg3NTQyNzI0NjFdLCBbMTU3NDcxOTkwNC4wMzEzODQ1LCA4MzAwMCwgMTkuMDYzMjA5NTMzNjkxNDA2XSwgWzE1NzQ3MjAzMjcuNDQwMDA4NiwgODQwMDAsIDE4Ljg3MzA5NDU1ODcxNTgyXSwgWzE1NzQ3MjA3NTEuMjAwMjEyLCA4NTAwMCwgMTguNjA3OTk1OTg2OTM4NDc3XSwgWzE1NzQ3MjExNzYuODY2MDY0NSwgODYwMDAsIDE4Ljg3MjY3NDk0MjAxNjZdLCBbMTU3NDcyMTYwMS43MDQ5NzEsIDg3MDAwLCAxOS4xNjA1MzM5MDUwMjkyOTddLCBbMTU3NDcyMjAyNi4yNDUwMzYsIDg4MDAwLCAxOC45OTkxNzIyMTA2OTMzNl0sIFsxNTc0NzIyNDUyLjAzNzc1MzMsIDg5MDAwLCAxOS4wNDY2NDgwMjU1MTI2OTVdLCBbMTU3NDcyMjg3Ni4wNTU4Mjc5LCA5MDAwMCwgMTguOTY1NDY5MzYwMzUxNTYyXSwgWzE1NzQ3MjMyOTkuODM5NTQ3LCA5MTAwMCwgMTkuMzgxMDExOTYyODkwNjI1XSwgWzE1NzQ3MjM3MjMuNjgyMjg4LCA5MjAwMCwgMTguODI3MzQxMDc5NzExOTE0XV0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "OK" } }, "base_uri": "https://localhost:8080/", "height": 800 } }, "source": [ "%tensorboard --logdir /content/en-yo-baseline/models/enyo_transformer/tensorboard" ], "execution_count": 9, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", "
\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "-siqoiGUCSb3", "colab_type": "text" }, "source": [ "# Plot Perplexity and Bleu" ] } ] }